From ca620e40741dc8bfd5b352cb75af779d0579f7bc Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Tue, 10 May 2016 10:30:56 -0300 Subject: [PATCH] Move Ingress godeps to vendor/ --- Godeps/Godeps.json | 694 +- Godeps/_workspace/.gitignore | 2 - .../ww/goautoneg/autoneg_test.go | 33 - .../beorn7/perks/quantile/bench_test.go | 63 - .../beorn7/perks/quantile/example_test.go | 121 - .../beorn7/perks/quantile/stream_test.go | 188 - .../github.com/blang/semver/examples/main.go | 83 - .../src/github.com/blang/semver/json_test.go | 45 - .../github.com/blang/semver/semver_test.go | 417 -- .../src/github.com/blang/semver/sort_test.go | 30 - .../src/github.com/blang/semver/sql_test.go | 38 - .../davecgh/go-spew/spew/common_test.go | 298 - .../davecgh/go-spew/spew/dump_test.go | 1042 --- .../davecgh/go-spew/spew/dumpcgo_test.go | 98 - .../davecgh/go-spew/spew/dumpnocgo_test.go | 26 - .../davecgh/go-spew/spew/example_test.go | 226 - .../davecgh/go-spew/spew/format_test.go | 1558 ----- .../davecgh/go-spew/spew/internal_test.go | 87 - .../go-spew/spew/internalunsafe_test.go | 101 - .../davecgh/go-spew/spew/spew_test.go | 309 - .../davecgh/go-spew/spew/testdata/dumpcgo.go | 82 - .../docker/distribution/digest/digest_test.go | 82 - .../digest/digester_resumable_test.go | 21 - .../docker/distribution/digest/set_test.go | 368 -- .../distribution/digest/verifiers_test.go | 49 - .../distribution/reference/reference_test.go | 535 -- .../distribution/reference/regexp_test.go | 489 -- .../docker/docker/pkg/mount/mount_test.go | 137 - .../docker/pkg/mount/mountinfo_linux_test.go | 477 -- .../pkg/mount/sharedsubtree_linux_test.go | 331 - .../docker/engine-api/types/events/events.go | 38 - .../engine-api/types/filters/parse_test.go | 394 -- .../types/reference/image_reference.go | 32 - .../types/strslice/strslice_test.go | 86 - .../docker/engine-api/types/time/timestamp.go | 124 - .../engine-api/types/time/timestamp_test.go | 93 - .../engine-api/types/versions/compare_test.go | 26 - .../engine-api/types/versions/v1p19/types.go | 35 - .../engine-api/types/versions/v1p20/types.go | 40 - .../docker/go-connections/nat/nat_test.go | 525 -- .../docker/go-connections/nat/parse_test.go | 54 - .../docker/go-connections/nat/sort_test.go | 85 - .../docker/go-units/duration_test.go | 81 - .../github.com/docker/go-units/size_test.go | 160 - .../github.com/docker/go-units/ulimit_test.go | 74 - .../emicklei/go-restful/bench_curly_test.go | 51 - .../emicklei/go-restful/bench_test.go | 43 - .../emicklei/go-restful/compress_test.go | 127 - .../emicklei/go-restful/container_test.go | 61 - .../emicklei/go-restful/cors_filter_test.go | 125 - .../emicklei/go-restful/curly_test.go | 231 - .../emicklei/go-restful/doc_examples_test.go | 41 - .../go-restful/entity_accessors_test.go | 69 - .../emicklei/go-restful/examples/.goconvey | 1 - .../examples/google_app_engine/.goconvey | 1 - .../examples/google_app_engine/app.yaml | 20 - .../google_app_engine/datastore/.goconvey | 1 - .../google_app_engine/datastore/app.yaml | 18 - .../google_app_engine/datastore/main.go | 266 - .../restful-appstats-integration.go | 13 - .../google_app_engine/restful-user-service.go | 161 - .../emicklei/go-restful/examples/home.html | 7 - .../examples/restful-CORS-filter.go | 68 - .../examples/restful-NCSA-logging.go | 54 - .../examples/restful-basic-authentication.go | 35 - .../examples/restful-cpuprofiler-service.go | 65 - .../examples/restful-curly-router.go | 107 - .../examples/restful-curly-router_test.go | 149 - .../examples/restful-encoding-filter.go | 61 - .../go-restful/examples/restful-filters.go | 114 - .../examples/restful-form-handling.go | 62 - .../examples/restful-hello-world.go | 22 - .../examples/restful-html-template.go | 35 - .../examples/restful-multi-containers.go | 43 - .../examples/restful-no-cache-filter.go | 31 - .../examples/restful-options-filter.go | 51 - .../go-restful/examples/restful-path-tail.go | 26 - .../examples/restful-pre-post-filters.go | 98 - .../examples/restful-resource-functions.go | 63 - .../go-restful/examples/restful-route_test.go | 39 - .../examples/restful-routefunction_test.go | 29 - .../examples/restful-serve-static.go | 47 - .../go-restful/examples/restful-swagger.go | 61 - .../examples/restful-user-resource.go | 152 - .../examples/restful-user-service.go | 137 - .../emicklei/go-restful/filter_test.go | 141 - .../emicklei/go-restful/jsr311_test.go | 212 - .../emicklei/go-restful/mime_test.go | 17 - .../go-restful/options_filter_test.go | 34 - .../go-restful/path_expression_test.go | 37 - .../emicklei/go-restful/request_test.go | 204 - .../emicklei/go-restful/response_test.go | 213 - .../emicklei/go-restful/route_builder_test.go | 58 - .../emicklei/go-restful/route_test.go | 127 - .../go-restful/swagger/model_builder_test.go | 1138 ---- .../go-restful/swagger/model_list_test.go | 48 - .../swagger/model_property_ext_test.go | 60 - .../swagger/model_property_list_test.go | 47 - .../swagger/ordered_route_map_test.go | 29 - .../swagger/postbuild_model_test.go | 42 - .../go-restful/swagger/swagger_test.go | 284 - .../go-restful/swagger/test_package/struct.go | 5 - .../emicklei/go-restful/swagger/utils_test.go | 78 - .../emicklei/go-restful/tracer_test.go | 18 - .../emicklei/go-restful/web_service_test.go | 297 - .../evanphx/json-patch/merge_test.go | 322 - .../evanphx/json-patch/patch_test.go | 234 - .../github.com/fatih/structs/field_test.go | 383 -- .../fatih/structs/structs_example_test.go | 351 - .../github.com/fatih/structs/structs_test.go | 898 --- .../src/github.com/fatih/structs/tags_test.go | 46 - .../src/github.com/ghodss/yaml/yaml_test.go | 271 - .../gogo/protobuf/proto/all_test.go | 2169 ------- .../gogo/protobuf/proto/clone_test.go | 267 - .../gogo/protobuf/proto/equal_test.go | 209 - .../gogo/protobuf/proto/extensions_test.go | 292 - .../gogo/protobuf/proto/message_set_test.go | 66 - .../protobuf/proto/proto3_proto/proto3.pb.go | 129 - .../protobuf/proto/proto3_proto/proto3.proto | 68 - .../gogo/protobuf/proto/proto3_test.go | 125 - .../gogo/protobuf/proto/size2_test.go | 63 - .../gogo/protobuf/proto/size_test.go | 147 - .../gogo/protobuf/proto/testdata/Makefile | 37 - .../protobuf/proto/testdata/golden_test.go | 86 - .../gogo/protobuf/proto/testdata/test.pb.go | 2985 --------- .../protobuf/proto/testdata/test.pb.go.golden | 1737 ----- .../gogo/protobuf/proto/testdata/test.proto | 494 -- .../gogo/protobuf/proto/text_parser_test.go | 532 -- .../gogo/protobuf/proto/text_test.go | 474 -- .../src/github.com/golang/glog/glog_test.go | 415 -- .../golang/groupcache/lru/lru_test.go | 73 - .../golang/protobuf/proto/all_test.go | 2169 ------- .../golang/protobuf/proto/clone_test.go | 267 - .../golang/protobuf/proto/equal_test.go | 212 - .../golang/protobuf/proto/extensions_test.go | 430 -- .../golang/protobuf/proto/message_set_test.go | 66 - .../protobuf/proto/proto3_proto/proto3.pb.go | 122 - .../protobuf/proto/proto3_proto/proto3.proto | 68 - .../golang/protobuf/proto/proto3_test.go | 125 - .../golang/protobuf/proto/size2_test.go | 63 - .../golang/protobuf/proto/size_test.go | 164 - .../golang/protobuf/proto/testdata/Makefile | 50 - .../protobuf/proto/testdata/golden_test.go | 86 - .../golang/protobuf/proto/testdata/test.pb.go | 3926 ----------- .../golang/protobuf/proto/testdata/test.proto | 535 -- .../golang/protobuf/proto/text_parser_test.go | 557 -- .../golang/protobuf/proto/text_test.go | 474 -- .../google/cadvisor/info/v1/container_test.go | 79 - .../google/cadvisor/info/v1/test/datagen.go | 81 - .../github.com/google/gofuzz/example_test.go | 225 - .../src/github.com/google/gofuzz/fuzz_test.go | 384 -- .../github.com/imdario/mergo/mergo_test.go | 288 - .../imdario/mergo/testdata/license.yml | 3 - .../imdario/mergo/testdata/thing.yml | 5 - .../juju/ratelimit/ratelimit_test.go | 389 -- .../pbutil/all_test.go | 320 - .../pbutil/fixtures_test.go | 103 - .../mapstructure/decode_hooks_test.go | 191 - .../mapstructure_benchmark_test.go | 243 - .../mapstructure/mapstructure_bugs_test.go | 47 - .../mapstructure_examples_test.go | 169 - .../mapstructure/mapstructure_test.go | 828 --- .../runc/libcontainer/cgroups/cgroups_test.go | 18 - .../libcontainer/cgroups/fs/blkio_test.go | 636 -- .../runc/libcontainer/cgroups/fs/cpu_test.go | 163 - .../libcontainer/cgroups/fs/cpuset_test.go | 65 - .../libcontainer/cgroups/fs/devices_test.go | 84 - .../libcontainer/cgroups/fs/freezer_test.go | 47 - .../libcontainer/cgroups/fs/hugetlb_test.go | 154 - .../libcontainer/cgroups/fs/memory_test.go | 294 - .../libcontainer/cgroups/fs/net_cls_test.go | 38 - .../libcontainer/cgroups/fs/net_prio_test.go | 38 - .../runc/libcontainer/cgroups/fs/pids_test.go | 83 - .../cgroups/fs/stats_util_test.go | 113 - .../runc/libcontainer/cgroups/fs/util_test.go | 67 - .../libcontainer/cgroups/fs/utils_test.go | 97 - .../cgroups/systemd/apply_nosystemd.go | 55 - .../cgroups/systemd/apply_systemd.go | 596 -- .../libcontainer/configs/config_unix_test.go | 156 - .../configs/config_windows_test.go | 3 - .../libcontainer/configs/validate/config.go | 93 - .../src/github.com/pborman/uuid/json_test.go | 32 - .../src/github.com/pborman/uuid/seq_test.go | 66 - .../src/github.com/pborman/uuid/uuid_test.go | 390 -- .../prometheus/benchmark_test.go | 159 - .../client_golang/prometheus/counter_test.go | 58 - .../prometheus/example_clustermanager_test.go | 130 - .../prometheus/example_memstats_test.go | 87 - .../prometheus/example_selfcollector_test.go | 69 - .../client_golang/prometheus/examples_test.go | 649 -- .../client_golang/prometheus/expvar_test.go | 97 - .../client_golang/prometheus/gauge_test.go | 182 - .../prometheus/go_collector_test.go | 123 - .../prometheus/histogram_test.go | 326 - .../client_golang/prometheus/http_test.go | 121 - .../client_golang/prometheus/metric_test.go | 35 - .../prometheus/process_collector_test.go | 54 - .../client_golang/prometheus/registry_test.go | 535 -- .../client_golang/prometheus/summary_test.go | 347 - .../client_golang/prometheus/vec_test.go | 91 - .../prometheus/common/expfmt/bench_test.go | 171 - .../prometheus/common/expfmt/decode_test.go | 373 -- .../expfmt/fuzz/corpus/from_test_parse_0 | 2 - .../expfmt/fuzz/corpus/from_test_parse_1 | 6 - .../expfmt/fuzz/corpus/from_test_parse_2 | 12 - .../expfmt/fuzz/corpus/from_test_parse_3 | 22 - .../expfmt/fuzz/corpus/from_test_parse_4 | 10 - .../fuzz/corpus/from_test_parse_error_0 | 1 - .../fuzz/corpus/from_test_parse_error_1 | 1 - .../fuzz/corpus/from_test_parse_error_10 | 1 - .../fuzz/corpus/from_test_parse_error_11 | 1 - .../fuzz/corpus/from_test_parse_error_12 | 3 - .../fuzz/corpus/from_test_parse_error_13 | 3 - .../fuzz/corpus/from_test_parse_error_14 | 3 - .../fuzz/corpus/from_test_parse_error_15 | 2 - .../fuzz/corpus/from_test_parse_error_16 | 2 - .../fuzz/corpus/from_test_parse_error_17 | 1 - .../fuzz/corpus/from_test_parse_error_18 | 1 - .../fuzz/corpus/from_test_parse_error_19 | 3 - .../fuzz/corpus/from_test_parse_error_2 | 3 - .../fuzz/corpus/from_test_parse_error_3 | 1 - .../fuzz/corpus/from_test_parse_error_4 | 1 - .../fuzz/corpus/from_test_parse_error_5 | 1 - .../fuzz/corpus/from_test_parse_error_6 | 1 - .../fuzz/corpus/from_test_parse_error_7 | 3 - .../fuzz/corpus/from_test_parse_error_8 | 1 - .../fuzz/corpus/from_test_parse_error_9 | 1 - .../common/expfmt/fuzz/corpus/minimal | 1 - .../common/expfmt/json_decode_test.go | 124 - .../prometheus/common/expfmt/testdata/json2 | 46 - .../common/expfmt/testdata/protobuf | 516 -- .../common/expfmt/testdata/protobuf.gz | 129 - .../prometheus/common/expfmt/testdata/test.gz | 163 - .../prometheus/common/expfmt/testdata/text | 322 - .../common/expfmt/text_create_test.go | 443 -- .../common/expfmt/text_parse_test.go | 586 -- .../prometheus/common/model/labels_test.go | 91 - .../prometheus/common/model/metric_test.go | 83 - .../prometheus/common/model/signature_test.go | 304 - .../prometheus/common/model/time_test.go | 86 - .../prometheus/common/model/value_test.go | 362 -- .../prometheus/procfs/fixtures/26231/cmdline | Bin 16 -> 0 bytes .../prometheus/procfs/fixtures/26231/fd/0 | 0 .../prometheus/procfs/fixtures/26231/fd/1 | 0 .../prometheus/procfs/fixtures/26231/fd/2 | 0 .../prometheus/procfs/fixtures/26231/fd/3 | 0 .../prometheus/procfs/fixtures/26231/fd/4 | 0 .../prometheus/procfs/fixtures/26231/limits | 17 - .../prometheus/procfs/fixtures/26231/stat | 1 - .../prometheus/procfs/fixtures/584/stat | 2 - .../prometheus/procfs/fixtures/stat | 16 - .../github.com/prometheus/procfs/fs_test.go | 13 - .../prometheus/procfs/proc_limits_test.go | 36 - .../prometheus/procfs/proc_stat_test.go | 112 - .../github.com/prometheus/procfs/proc_test.go | 123 - .../github.com/prometheus/procfs/stat_test.go | 19 - .../spf13/cobra/bash_completions_test.go | 140 - .../github.com/spf13/cobra/cobra/cmd/add.go | 128 - .../spf13/cobra/cobra/cmd/helpers.go | 347 - .../spf13/cobra/cobra/cmd/helpers_test.go | 40 - .../github.com/spf13/cobra/cobra/cmd/init.go | 226 - .../spf13/cobra/cobra/cmd/licenses.go | 1133 ---- .../github.com/spf13/cobra/cobra/cmd/root.go | 84 - .../src/github.com/spf13/cobra/cobra/main.go | 20 - .../src/github.com/spf13/cobra/cobra_test.go | 1188 ---- .../github.com/spf13/cobra/command_test.go | 114 - .../github.com/spf13/cobra/doc/cmd_test.go | 145 - .../github.com/spf13/cobra/doc/man_docs.go | 218 - .../github.com/spf13/cobra/doc/man_docs.md | 26 - .../spf13/cobra/doc/man_docs_test.go | 161 - .../spf13/cobra/doc/man_examples_test.go | 35 - .../src/github.com/spf13/cobra/doc/md_docs.go | 175 - .../src/github.com/spf13/cobra/doc/md_docs.md | 104 - .../spf13/cobra/doc/md_docs_test.go | 88 - .../src/github.com/spf13/cobra/doc/util.go | 38 - .../src/github.com/spf13/pflag/bool_test.go | 180 - .../src/github.com/spf13/pflag/count_test.go | 55 - .../github.com/spf13/pflag/example_test.go | 77 - .../src/github.com/spf13/pflag/export_test.go | 29 - .../src/github.com/spf13/pflag/flag_test.go | 874 --- .../github.com/spf13/pflag/golangflag_test.go | 39 - .../github.com/spf13/pflag/int_slice_test.go | 162 - .../src/github.com/spf13/pflag/ip_test.go | 63 - .../src/github.com/spf13/pflag/ipnet_test.go | 70 - .../spf13/pflag/string_slice_test.go | 161 - .../src/github.com/spf13/pflag/verify/all.sh | 69 - .../github.com/spf13/pflag/verify/gofmt.sh | 19 - .../github.com/spf13/pflag/verify/golint.sh | 15 - .../github.com/ugorji/go/codec/cbor_test.go | 205 - .../github.com/ugorji/go/codec/codec_test.go | 1459 ----- .../ugorji/go/codec/codecgen/README.md | 36 - .../ugorji/go/codec/codecgen/gen.go | 273 - .../github.com/ugorji/go/codec/codecgen/z.go | 3 - .../ugorji/go/codec/codecgen_test.go | 24 - .../github.com/ugorji/go/codec/helper_test.go | 242 - .../src/github.com/ugorji/go/codec/py_test.go | 30 - .../github.com/ugorji/go/codec/values_test.go | 203 - .../golang.org/x/net/context/context_test.go | 575 -- .../x/net/context/ctxhttp/ctxhttp_test.go | 72 - .../x/net/context/withtimeout_test.go | 26 - .../clientcredentials/clientcredentials.go | 112 - .../clientcredentials_test.go | 96 - .../src/golang.org/x/oauth2/example_test.go | 45 - .../golang.org/x/oauth2/facebook/facebook.go | 16 - .../src/golang.org/x/oauth2/github/github.go | 16 - .../x/oauth2/google/example_test.go | 150 - .../golang.org/x/oauth2/google/google_test.go | 67 - .../golang.org/x/oauth2/google/sdk_test.go | 46 - .../oauth2/google/testdata/gcloud/credentials | 122 - .../oauth2/google/testdata/gcloud/properties | 2 - .../x/oauth2/internal/oauth2_test.go | 62 - .../x/oauth2/internal/token_test.go | 28 - .../golang.org/x/oauth2/jwt/example_test.go | 31 - .../src/golang.org/x/oauth2/jwt/jwt_test.go | 134 - .../golang.org/x/oauth2/linkedin/linkedin.go | 16 - .../src/golang.org/x/oauth2/oauth2_test.go | 422 -- .../x/oauth2/odnoklassniki/odnoklassniki.go | 16 - .../src/golang.org/x/oauth2/paypal/paypal.go | 22 - .../src/golang.org/x/oauth2/token_test.go | 50 - .../src/golang.org/x/oauth2/transport_test.go | 86 - .../src/golang.org/x/oauth2/vk/vk.go | 16 - .../api/gensupport/json_test.go | 367 -- .../api/gensupport/media_test.go | 113 - .../api/googleapi/googleapi_test.go | 599 -- .../api/googleapi/transport/apikey.go | 38 - .../api/googleapi/types_test.go | 44 - .../internal/datastore/datastore_v1.pb.go | 1633 ----- .../internal/datastore/datastore_v1.proto | 606 -- .../cloud/internal/opts/option.go | 25 - .../cloud/internal/testutil/context.go | 60 - .../cloud/internal/transport/cancelreq.go | 29 - .../internal/transport/cancelreq_legacy.go | 31 - .../cloud/internal/transport/dial.go | 135 - .../cloud/internal/transport/proto.go | 80 - .../src/gopkg.in/gcfg.v1/example_test.go | 132 - .../src/gopkg.in/gcfg.v1/issues_test.go | 63 - .../src/gopkg.in/gcfg.v1/read_test.go | 338 - .../gopkg.in/gcfg.v1/scanner/example_test.go | 46 - .../gopkg.in/gcfg.v1/scanner/scanner_test.go | 417 -- .../gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg | 3 - .../gcfg.v1/testdata/gcfg_unicode_test.gcfg | 3 - .../gopkg.in/gcfg.v1/token/position_test.go | 181 - .../gopkg.in/gcfg.v1/token/serialize_test.go | 111 - .../src/gopkg.in/gcfg.v1/types/enum_test.go | 29 - .../src/gopkg.in/gcfg.v1/types/int_test.go | 67 - .../src/gopkg.in/gcfg.v1/types/scan_test.go | 36 - .../src/gopkg.in/yaml.v2/decode_test.go | 988 --- .../src/gopkg.in/yaml.v2/encode_test.go | 501 -- .../src/gopkg.in/yaml.v2/suite_test.go | 12 - .../apis/federation/install/install_test.go | 118 - .../apis/federation/validation/validation.go | 56 - .../federation/validation/validation_test.go | 206 - .../k8s.io/kubernetes/pkg/api/context_test.go | 68 - .../kubernetes/pkg/api/conversion_test.go | 120 - .../k8s.io/kubernetes/pkg/api/copy_test.go | 68 - .../kubernetes/pkg/api/deep_copy_test.go | 95 - .../kubernetes/pkg/api/endpoints/util_test.go | 444 -- .../kubernetes/pkg/api/errors/errors_test.go | 189 - .../kubernetes/pkg/api/errors/storage/doc.go | 18 - .../pkg/api/errors/storage/storage.go | 108 - .../kubernetes/pkg/api/generate_test.go | 79 - .../k8s.io/kubernetes/pkg/api/helpers_test.go | 299 - .../pkg/api/install/install_test.go | 129 - .../kubernetes/pkg/api/meta/help_test.go | 253 - .../kubernetes/pkg/api/meta/meta_test.go | 778 --- .../pkg/api/meta/multirestmapper_test.go | 298 - .../kubernetes/pkg/api/meta/priority_test.go | 206 - .../pkg/api/meta/restmapper_test.go | 550 -- .../k8s.io/kubernetes/pkg/api/meta_test.go | 51 - .../kubernetes/pkg/api/pod/util_test.go | 110 - .../src/k8s.io/kubernetes/pkg/api/ref_test.go | 136 - .../pkg/api/resource/quantity_example_test.go | 59 - .../pkg/api/resource/quantity_test.go | 930 --- .../pkg/api/resource/scale_int_test.go | 85 - .../pkg/api/resource_helpers_test.go | 63 - .../pkg/api/rest/resttest/resttest.go | 1064 --- .../pkg/api/serialization_proto_test.go | 182 - .../kubernetes/pkg/api/serialization_test.go | 532 -- .../kubernetes/pkg/api/service/util_test.go | 92 - .../pkg/api/testapi/testapi_test.go | 137 - .../testing/compat/compatibility_tester.go | 144 - .../kubernetes/pkg/api/testing/conversion.go | 72 - .../kubernetes/pkg/api/testing/fuzzer.go | 424 -- .../kubernetes/pkg/api/testing/pod_specs.go | 32 - .../pkg/api/unversioned/duration_test.go | 153 - .../pkg/api/unversioned/group_version_test.go | 78 - .../pkg/api/unversioned/helpers_test.go | 83 - .../pkg/api/unversioned/time_test.go | 147 - .../unversioned/validation/validation_test.go | 85 - .../pkg/api/util/group_version_test.go | 63 - .../pkg/api/v1/backward_compatibility_test.go | 229 - .../kubernetes/pkg/api/v1/conversion_test.go | 217 - .../kubernetes/pkg/api/v1/defaults_test.go | 645 -- .../pkg/api/validation/events_test.go | 60 - .../pkg/api/validation/name_test.go | 149 - .../pkg/api/validation/schema_test.go | 200 - .../validation/testdata/v1/invalidPod.yaml | 11 - .../validation/testdata/v1/invalidPod1.json | 19 - .../validation/testdata/v1/invalidPod2.json | 35 - .../validation/testdata/v1/invalidPod3.json | 35 - .../api/validation/testdata/v1/validPod.yaml | 16 - .../pkg/api/validation/validation_test.go | 5781 ----------------- .../registered/registered_test.go | 68 - .../pkg/apis/apps/validation/validation.go | 129 - .../apis/apps/validation/validation_test.go | 379 -- .../authorization/validation/validation.go | 64 - .../validation/validation_test.go | 135 - .../apis/autoscaling/validation/validation.go | 34 - .../autoscaling/validation/validation_test.go | 89 - .../pkg/apis/batch/validation/validation.go | 157 - .../apis/batch/validation/validation_test.go | 297 - .../pkg/apis/componentconfig/helpers_test.go | 71 - .../componentconfig/install/install_test.go | 89 - .../apis/extensions/install/install_test.go | 119 - .../extensions/v1beta1/conversion_test.go | 83 - .../apis/extensions/v1beta1/defaults_test.go | 731 --- .../extensions/validation/validation_test.go | 1845 ------ .../pkg/apis/policy/validation/validation.go | 34 - .../apis/policy/validation/validation_test.go | 62 - .../pkg/client/cache/delta_fifo_test.go | 385 -- .../pkg/client/cache/expiration_cache_test.go | 189 - .../kubernetes/pkg/client/cache/fifo_test.go | 235 - .../kubernetes/pkg/client/cache/index_test.go | 135 - .../pkg/client/cache/listers_test.go | 722 -- .../pkg/client/cache/listwatch_test.go | 172 - .../pkg/client/cache/reflector_test.go | 404 -- .../kubernetes/pkg/client/cache/store_test.go | 156 - .../pkg/client/cache/undelta_store_test.go | 131 - .../fake/clientset_generated.go | 79 - .../internalclientset/fake/doc.go | 20 - .../typed/batch/unversioned/fake/doc.go | 20 - .../unversioned/fake/fake_batch_client.go | 37 - .../typed/batch/unversioned/fake/fake_job.go | 116 - .../typed/core/unversioned/fake/doc.go | 20 - .../unversioned/fake/fake_componentstatus.go | 98 - .../core/unversioned/fake/fake_configmap.go | 105 - .../core/unversioned/fake/fake_core_client.go | 97 - .../core/unversioned/fake/fake_endpoints.go | 105 - .../typed/core/unversioned/fake/fake_event.go | 105 - .../unversioned/fake/fake_event_expansion.go | 88 - .../core/unversioned/fake/fake_limitrange.go | 105 - .../core/unversioned/fake/fake_namespace.go | 107 - .../fake/fake_namespace_expansion.go | 37 - .../typed/core/unversioned/fake/fake_node.go | 107 - .../unversioned/fake/fake_persistentvolume.go | 107 - .../fake/fake_persistentvolumeclaim.go | 115 - .../typed/core/unversioned/fake/fake_pod.go | 115 - .../unversioned/fake/fake_pod_expansion.go | 46 - .../core/unversioned/fake/fake_podtemplate.go | 105 - .../fake/fake_replicationcontroller.go | 115 - .../unversioned/fake/fake_resourcequota.go | 115 - .../core/unversioned/fake/fake_secret.go | 105 - .../core/unversioned/fake/fake_service.go | 115 - .../fake/fake_service_expansion.go | 26 - .../unversioned/fake/fake_serviceaccount.go | 105 - .../typed/extensions/unversioned/fake/doc.go | 20 - .../unversioned/fake/fake_daemonset.go | 116 - .../unversioned/fake/fake_deployment.go | 116 - .../fake/fake_deployment_expansion.go | 33 - .../fake/fake_extensions_client.go | 61 - .../fake/fake_horizontalpodautoscaler.go | 116 - .../unversioned/fake/fake_ingress.go | 116 - .../unversioned/fake/fake_replicaset.go | 116 - .../extensions/unversioned/fake/fake_scale.go | 23 - .../unversioned/fake/fake_scale_expansion.go | 47 - .../fake/fake_thirdpartyresource.go | 99 - .../pkg/client/record/event_test.go | 926 --- .../pkg/client/record/events_cache_test.go | 254 - .../pkg/client/restclient/client_test.go | 193 - .../pkg/client/restclient/config_test.go | 99 - .../pkg/client/restclient/plugin_test.go | 311 - .../pkg/client/restclient/request_test.go | 1343 ---- .../pkg/client/restclient/url_utils_test.go | 61 - .../pkg/client/restclient/urlbackoff_test.go | 79 - .../pkg/client/transport/cache_test.go | 114 - .../client/transport/round_trippers_test.go | 101 - .../pkg/client/transport/transport_test.go | 204 - .../pkg/client/typed/discovery/client_test.go | 303 - .../client/typed/discovery/fake/discovery.go | 74 - .../release_1_2/clientset_adaption.go | 50 - .../release_1_3/clientset_adaption.go | 50 - .../unversioned/auth/clientauth_test.go | 69 - .../unversioned/clientcmd/api/helpers_test.go | 301 - .../unversioned/clientcmd/api/types_test.go | 135 - .../clientcmd/client_config_test.go | 290 - .../unversioned/clientcmd/loader_test.go | 562 -- .../unversioned/clientcmd/validation_test.go | 432 -- .../pkg/client/unversioned/conditions_test.go | 71 - .../client/unversioned/containerinfo_test.go | 198 - .../client/unversioned/daemon_sets_test.go | 198 - .../pkg/client/unversioned/deployment_test.go | 236 - .../pkg/client/unversioned/endpoints_test.go | 71 - .../pkg/client/unversioned/events_test.go | 205 - .../pkg/client/unversioned/fake/fake.go | 95 - .../pkg/client/unversioned/flags_test.go | 79 - .../unversioned/helper_blackbox_test.go | 126 - .../pkg/client/unversioned/helper_test.go | 179 - .../horizontalpodautoscaler_test.go | 222 - .../pkg/client/unversioned/ingress_test.go | 236 - .../pkg/client/unversioned/jobs_test.go | 269 - .../client/unversioned/limit_ranges_test.go | 185 - .../pkg/client/unversioned/namespaces_test.go | 185 - .../pkg/client/unversioned/nodes_test.go | 173 - .../unversioned/persistentvolume_test.go | 191 - .../unversioned/persistentvolumeclaim_test.go | 208 - .../pkg/client/unversioned/pet_sets_test.go | 165 - .../client/unversioned/pod_templates_test.go | 147 - .../pkg/client/unversioned/pods_test.go | 226 - .../unversioned/podsecuritypolicy_test.go | 137 - .../pkg/client/unversioned/portforward/doc.go | 19 - .../unversioned/portforward/portforward.go | 338 - .../portforward/portforward_test.go | 394 -- .../client/unversioned/remotecommand/doc.go | 20 - .../remotecommand/remotecommand.go | 168 - .../remotecommand/remotecommand_test.go | 357 - .../client/unversioned/remotecommand/v1.go | 156 - .../client/unversioned/remotecommand/v2.go | 166 - .../client/unversioned/replica_sets_test.go | 193 - .../replication_controllers_test.go | 200 - .../unversioned/resource_quotas_test.go | 204 - .../pkg/client/unversioned/services_test.go | 238 - .../client/unversioned/testclient/actions.go | 446 -- .../testclient/fake_componentstatuses.go | 44 - .../unversioned/testclient/fake_configmaps.go | 78 - .../testclient/fake_daemon_sets.go | 83 - .../testclient/fake_deployments.go | 105 - .../unversioned/testclient/fake_endpoints.go | 74 - .../unversioned/testclient/fake_events.go | 151 - .../fake_horizontal_pod_autoscalers.go | 164 - .../unversioned/testclient/fake_ingress.go | 84 - .../unversioned/testclient/fake_jobs.go | 147 - .../testclient/fake_limit_ranges.go | 74 - .../unversioned/testclient/fake_namespaces.go | 103 - .../unversioned/testclient/fake_nodes.go | 88 - .../fake_persistent_volume_claims.go | 81 - .../testclient/fake_persistent_volumes.go | 86 - .../testclient/fake_pod_templates.go | 74 - .../unversioned/testclient/fake_pods.go | 117 - .../testclient/fake_podsecuritypolicy.go | 73 - .../testclient/fake_replica_sets.go | 83 - .../fake_replication_controllers.go | 82 - .../testclient/fake_resource_quotas.go | 83 - .../unversioned/testclient/fake_scales.go | 52 - .../unversioned/testclient/fake_secrets.go | 74 - .../testclient/fake_service_accounts.go | 74 - .../unversioned/testclient/fake_services.go | 88 - .../unversioned/testclient/fake_test.go | 39 - .../testclient/fake_thirdpartyresources.go | 82 - .../client/unversioned/testclient/fixture.go | 313 - .../testclient/simple/simple_testclient.go | 244 - .../unversioned/testclient/testclient.go | 419 -- .../unversioned/testclient/testclient_test.go | 75 - .../unversioned/thirdpartyresources_test.go | 177 - .../pkg/cloudprovider/providers/aws/OWNERS | 2 - .../pkg/cloudprovider/providers/aws/aws.go | 2725 -------- .../providers/aws/aws_instancegroups.go | 90 - .../providers/aws/aws_loadbalancer.go | 310 - .../cloudprovider/providers/aws/aws_routes.go | 188 - .../cloudprovider/providers/aws/aws_test.go | 1201 ---- .../cloudprovider/providers/aws/aws_utils.go | 51 - .../providers/aws/log_handler.go | 34 - .../providers/aws/retry_handler.go | 161 - .../providers/aws/retry_handler_test.go | 135 - .../providers/aws/sets_ippermissions.go | 146 - .../pkg/cloudprovider/providers/fake/doc.go | 19 - .../pkg/cloudprovider/providers/fake/fake.go | 267 - .../cloudprovider/providers/gce/gce_test.go | 150 - .../cloudprovider/providers/mesos/client.go | 376 -- .../providers/mesos/client_test.go | 269 - .../cloudprovider/providers/mesos/config.go | 79 - .../providers/mesos/config_test.go | 75 - .../cloudprovider/providers/mesos/mesos.go | 283 - .../providers/mesos/mesos_test.go | 279 - .../cloudprovider/providers/mesos/plugins.go | 21 - .../providers/openstack/MAINTAINERS.md | 6 - .../providers/openstack/openstack.go | 1125 ---- .../providers/openstack/openstack_test.go | 293 - .../cloudprovider/providers/ovirt/ovirt.go | 291 - .../providers/ovirt/ovirt_test.go | 126 - .../pkg/cloudprovider/providers/providers.go | 27 - .../providers/rackspace/MAINTAINERS.md | 6 - .../providers/rackspace/rackspace.go | 614 -- .../providers/rackspace/rackspace_test.go | 196 - .../pkg/controller/controller_utils_test.go | 372 -- .../pkg/controller/daemon/controller.go | 742 --- .../pkg/controller/daemon/controller_test.go | 551 -- .../kubernetes/pkg/controller/daemon/doc.go | 19 - .../deployment/deployment_controller.go | 1296 ---- .../deployment/deployment_controller_test.go | 820 --- .../kubernetes/pkg/controller/endpoint/doc.go | 19 - .../endpoint/endpoints_controller.go | 500 -- .../endpoint/endpoints_controller_test.go | 566 -- .../controller/framework/controller_test.go | 408 -- .../framework/fake_controller_source_test.go | 94 - .../controller/framework/informers/factory.go | 66 - .../kubernetes/pkg/controller/gc/doc.go | 24 - .../pkg/controller/gc/gc_controller.go | 133 - .../pkg/controller/gc/gc_controller_test.go | 104 - .../pkg/controller/job/controller.go | 582 -- .../pkg/controller/job/controller_test.go | 711 -- .../kubernetes/pkg/controller/job/doc.go | 18 - .../pkg/controller/namespace/doc.go | 18 - .../namespace/namespace_controller.go | 180 - .../namespace/namespace_controller_test.go | 282 - .../namespace/namespace_controller_utils.go | 484 -- .../kubernetes/pkg/controller/node/doc.go | 19 - .../pkg/controller/node/nodecontroller.go | 949 --- .../controller/node/nodecontroller_test.go | 1189 ---- .../pkg/controller/node/rate_limited_queue.go | 201 - .../node/rate_limited_queue_test.go | 263 - .../pkg/controller/persistentvolume/OWNERS | 3 - .../persistentvolume/options/options.go | 87 - ...ersistentvolume_claim_binder_controller.go | 530 -- ...tentvolume_claim_binder_controller_test.go | 732 --- .../persistentvolume_index_test.go | 549 -- ...persistentvolume_provisioner_controller.go | 536 -- ...stentvolume_provisioner_controller_test.go | 295 - .../persistentvolume_recycler_controller.go | 415 -- ...rsistentvolume_recycler_controller_test.go | 265 - .../pkg/controller/persistentvolume/types.go | 267 - .../kubernetes/pkg/controller/petset/fakes.go | 324 - .../pkg/controller/petset/identity_mappers.go | 247 - .../petset/identity_mappers_test.go | 179 - .../pkg/controller/petset/iterator.go | 163 - .../pkg/controller/petset/iterator_test.go | 149 - .../kubernetes/pkg/controller/petset/pet.go | 310 - .../pkg/controller/petset/pet_set.go | 356 - .../pkg/controller/petset/pet_set_test.go | 264 - .../pkg/controller/petset/pet_set_utils.go | 168 - .../podautoscaler/horizontal_test.go | 749 --- .../metrics/metrics_client_test.go | 455 -- .../pkg/controller/replicaset/doc.go | 19 - .../controller/replicaset/options/options.go | 35 - .../pkg/controller/replicaset/replica_set.go | 577 -- .../controller/replicaset/replica_set_test.go | 1036 --- .../replicaset/replica_set_utils.go | 77 - .../pkg/controller/replication/doc.go | 19 - .../replication/replication_controller.go | 582 -- .../replication_controller_test.go | 1102 ---- .../replication_controller_utils.go | 77 - .../pkg/controller/resourcequota/doc.go | 18 - .../resourcequota/replenishment_controller.go | 231 - .../replenishment_controller_test.go | 121 - .../resource_quota_controller.go | 321 - .../resource_quota_controller_test.go | 302 - .../kubernetes/pkg/controller/route/doc.go | 19 - .../pkg/controller/route/routecontroller.go | 148 - .../controller/route/routecontroller_test.go | 219 - .../pkg/controller/service/controller-test/ct | Bin 13780296 -> 0 bytes .../kubernetes/pkg/controller/service/doc.go | 19 - .../controller/service/servicecontroller.go | 769 --- .../service/servicecontroller_test.go | 329 - .../pkg/controller/serviceaccount/doc.go | 19 - .../serviceaccounts_controller.go | 259 - .../serviceaccounts_controller_test.go | 197 - .../controller/serviceaccount/tokengetter.go | 77 - .../serviceaccount/tokens_controller.go | 525 -- .../serviceaccount/tokens_controller_test.go | 562 -- .../pkg/conversion/converter_test.go | 847 --- .../pkg/conversion/deep_copy_test.go | 161 - .../kubernetes/pkg/conversion/helper_test.go | 38 - .../conversion/queryparams/convert_test.go | 211 - .../credentialprovider/aws/aws_credentials.go | 168 - .../aws/aws_credentials_test.go | 108 - .../pkg/credentialprovider/config_test.go | 225 - .../pkg/credentialprovider/gcp/doc.go | 19 - .../pkg/credentialprovider/gcp/jwt.go | 116 - .../pkg/credentialprovider/gcp/jwt_test.go | 126 - .../pkg/credentialprovider/gcp/metadata.go | 217 - .../credentialprovider/gcp/metadata_test.go | 342 - .../pkg/credentialprovider/keyring_test.go | 501 -- .../pkg/credentialprovider/provider_test.go | 62 - .../pkg/fieldpath/fieldpath_test.go | 117 - .../kubernetes/pkg/fields/fields_test.go | 57 - .../kubernetes/pkg/fields/selector_test.go | 208 - .../kubernetes/pkg/healthz/healthz_test.go | 82 - .../kubernetes/pkg/kubectl/cmd/annotate.go | 378 -- .../pkg/kubectl/cmd/annotate_test.go | 571 -- .../kubernetes/pkg/kubectl/cmd/apiversions.go | 65 - .../kubernetes/pkg/kubectl/cmd/apply.go | 217 - .../kubernetes/pkg/kubectl/cmd/apply_test.go | 317 - .../kubernetes/pkg/kubectl/cmd/attach.go | 245 - .../kubernetes/pkg/kubectl/cmd/attach_test.go | 279 - .../kubernetes/pkg/kubectl/cmd/autoscale.go | 204 - .../kubernetes/pkg/kubectl/cmd/clusterinfo.go | 118 - .../k8s.io/kubernetes/pkg/kubectl/cmd/cmd.go | 253 - .../kubernetes/pkg/kubectl/cmd/cmd_test.go | 799 --- .../pkg/kubectl/cmd/config/config.go | 75 - .../pkg/kubectl/cmd/config/config_test.go | 851 --- .../pkg/kubectl/cmd/config/create_authinfo.go | 237 - .../pkg/kubectl/cmd/config/create_cluster.go | 182 - .../pkg/kubectl/cmd/config/create_context.go | 133 - .../pkg/kubectl/cmd/config/current_context.go | 69 - .../cmd/config/current_context_test.go | 90 - .../cmd/config/navigation_step_parser.go | 152 - .../cmd/config/navigation_step_parser_test.go | 96 - .../kubernetes/pkg/kubectl/cmd/config/set.go | 246 - .../pkg/kubectl/cmd/config/unset.go | 106 - .../pkg/kubectl/cmd/config/use_context.go | 102 - .../kubernetes/pkg/kubectl/cmd/config/view.go | 162 - .../kubernetes/pkg/kubectl/cmd/convert.go | 185 - .../kubernetes/pkg/kubectl/cmd/create.go | 262 - .../pkg/kubectl/cmd/create_configmap.go | 96 - .../pkg/kubectl/cmd/create_configmap_test.go | 54 - .../pkg/kubectl/cmd/create_namespace.go | 77 - .../pkg/kubectl/cmd/create_namespace_test.go | 53 - .../pkg/kubectl/cmd/create_secret.go | 194 - .../pkg/kubectl/cmd/create_secret_test.go | 85 - .../pkg/kubectl/cmd/create_serviceaccount.go | 77 - .../kubectl/cmd/create_serviceaccount_test.go | 54 - .../kubernetes/pkg/kubectl/cmd/create_test.go | 230 - .../kubernetes/pkg/kubectl/cmd/delete.go | 227 - .../kubernetes/pkg/kubectl/cmd/delete_test.go | 449 -- .../kubernetes/pkg/kubectl/cmd/describe.go | 189 - .../pkg/kubectl/cmd/describe_test.go | 142 - .../kubernetes/pkg/kubectl/cmd/drain.go | 385 -- .../kubernetes/pkg/kubectl/cmd/drain_test.go | 537 -- .../k8s.io/kubernetes/pkg/kubectl/cmd/edit.go | 496 -- .../k8s.io/kubernetes/pkg/kubectl/cmd/exec.go | 241 - .../kubernetes/pkg/kubectl/cmd/exec_test.go | 258 - .../kubernetes/pkg/kubectl/cmd/explain.go | 111 - .../kubernetes/pkg/kubectl/cmd/expose.go | 271 - .../kubernetes/pkg/kubectl/cmd/expose_test.go | 351 - .../k8s.io/kubernetes/pkg/kubectl/cmd/get.go | 325 - .../kubernetes/pkg/kubectl/cmd/get_test.go | 869 --- .../kubernetes/pkg/kubectl/cmd/label.go | 312 - .../kubernetes/pkg/kubectl/cmd/label_test.go | 418 -- .../k8s.io/kubernetes/pkg/kubectl/cmd/logs.go | 208 - .../kubernetes/pkg/kubectl/cmd/logs_test.go | 140 - .../kubernetes/pkg/kubectl/cmd/namespace.go | 41 - .../kubernetes/pkg/kubectl/cmd/patch.go | 177 - .../kubernetes/pkg/kubectl/cmd/patch_test.go | 90 - .../kubernetes/pkg/kubectl/cmd/portforward.go | 147 - .../pkg/kubectl/cmd/portforward_test.go | 176 - .../kubernetes/pkg/kubectl/cmd/proxy.go | 137 - .../kubernetes/pkg/kubectl/cmd/replace.go | 258 - .../pkg/kubectl/cmd/replace_test.go | 193 - .../pkg/kubectl/cmd/rollingupdate.go | 410 -- .../pkg/kubectl/cmd/rollingupdate_test.go | 90 - .../pkg/kubectl/cmd/rollout/rollout.go | 53 - .../kubectl/cmd/rollout/rollout_history.go | 126 - .../pkg/kubectl/cmd/rollout/rollout_pause.go | 120 - .../pkg/kubectl/cmd/rollout/rollout_resume.go | 118 - .../pkg/kubectl/cmd/rollout/rollout_undo.go | 117 - .../k8s.io/kubernetes/pkg/kubectl/cmd/run.go | 500 -- .../kubernetes/pkg/kubectl/cmd/run_test.go | 332 - .../kubernetes/pkg/kubectl/cmd/scale.go | 188 - .../k8s.io/kubernetes/pkg/kubectl/cmd/stop.go | 105 - .../pkg/kubectl/cmd/util/editor/editor.go | 192 - .../kubectl/cmd/util/editor/editor_test.go | 63 - .../pkg/kubectl/cmd/util/factory_test.go | 577 -- .../pkg/kubectl/cmd/util/helpers_test.go | 304 - .../kubectl/cmd/util/jsonmerge/jsonmerge.go | 193 - .../kubernetes/pkg/kubectl/cmd/version.go | 55 - .../kubernetes/pkg/kubectl/configmap_test.go | 123 - .../pkg/kubectl/custom_column_printer_test.go | 276 - .../kubernetes/pkg/kubectl/describe_test.go | 636 -- .../kubernetes/pkg/kubectl/generate_test.go | 140 - .../kubernetes/pkg/kubectl/kubectl.test | Bin 12585712 -> 0 bytes .../kubernetes/pkg/kubectl/kubectl_test.go | 200 - .../kubernetes/pkg/kubectl/namespace_test.go | 61 - .../pkg/kubectl/proxy_server_test.go | 333 - .../pkg/kubectl/resource/builder_test.go | 1243 ---- .../pkg/kubectl/resource/helper_test.go | 498 -- .../pkg/kubectl/resource_printer_test.go | 1450 ----- .../pkg/kubectl/rolling_updater_test.go | 1660 ----- .../k8s.io/kubernetes/pkg/kubectl/run_test.go | 885 --- .../kubernetes/pkg/kubectl/scale_test.go | 729 --- .../secret_for_docker_registry_test.go | 81 - .../kubernetes/pkg/kubectl/secret_test.go | 124 - .../kubernetes/pkg/kubectl/service_test.go | 417 -- .../pkg/kubectl/serviceaccount_test.go | 60 - .../pkg/kubectl/sorted_event_list_test.go | 92 - .../pkg/kubectl/sorting_printer_test.go | 236 - .../kubernetes/pkg/kubectl/stop_test.go | 717 -- .../pkg/kubectl/testing/types.generated.go | 555 -- .../kubernetes/pkg/kubectl/testing/types.go | 33 - .../pkg/kubelet/qos/memory_policy_test.go | 187 - .../pkg/kubelet/qos/util/qos_test.go | 104 - .../kubernetes/pkg/labels/labels_test.go | 60 - .../kubernetes/pkg/labels/selector_test.go | 574 -- .../pkg/registry/generic/matcher_test.go | 130 - .../pkg/registry/generic/registry/doc.go | 19 - .../generic/registry/storage_factory.go | 37 - .../pkg/registry/generic/registry/store.go | 679 -- .../registry/generic/registry/store_test.go | 717 -- .../pkg/registry/generic/rest/doc.go | 19 - .../pkg/registry/generic/rest/proxy.go | 242 - .../pkg/registry/generic/rest/proxy_test.go | 725 --- .../registry/generic/rest/response_checker.go | 71 - .../generic/rest/response_checker_test.go | 95 - .../pkg/registry/generic/rest/streamer.go | 79 - .../registry/generic/rest/streamer_test.go | 148 - .../thirdpartyresourcedata/codec_test.go | 181 - .../thirdpartyresourcedata/etcd/etcd.go | 78 - .../thirdpartyresourcedata/etcd/etcd_test.go | 121 - .../thirdpartyresourcedata/strategy_test.go | 35 - .../thirdpartyresourcedata/util_test.go | 66 - .../kubernetes/pkg/runtime/conversion_test.go | 135 - .../kubernetes/pkg/runtime/embedded_test.go | 290 - .../kubernetes/pkg/runtime/extension_test.go | 39 - .../kubernetes/pkg/runtime/helper_test.go | 51 - .../kubernetes/pkg/runtime/scheme_test.go | 675 -- .../pkg/runtime/serializer/codec_test.go | 400 -- .../pkg/runtime/serializer/json/json_test.go | 271 - .../pkg/runtime/serializer/json/meta_test.go | 45 - .../serializer/protobuf/protobuf_test.go | 351 - .../serializer/recognizer/recognizer_test.go | 57 - .../serializer/streaming/streaming_test.go | 84 - .../serializer/versioning/versioning_test.go | 300 - .../pkg/runtime/serializer/yaml/yaml.go | 46 - .../pkg/runtime/swagger_doc_generator_test.go | 43 - .../pkg/runtime/unstructured_test.go | 356 - .../pkg/runtime/unversioned_test.go | 92 - .../kubernetes/pkg/storage/cacher_test.go | 396 -- .../pkg/storage/etcd/api_object_versioner.go | 74 - .../storage/etcd/api_object_versioner_test.go | 41 - .../pkg/storage/etcd/etcd_helper.go | 638 -- .../pkg/storage/etcd/etcd_helper_test.go | 562 -- .../pkg/storage/etcd/etcd_watcher.go | 494 -- .../pkg/storage/etcd/etcd_watcher_test.go | 512 -- .../pkg/storage/etcd/etcdtest/doc.go | 17 - .../pkg/storage/etcd/etcdtest/etcdtest.go | 39 - .../pkg/storage/etcd/metrics/metrics.go | 113 - .../pkg/storage/etcd/testing/certificates.go | 113 - .../pkg/storage/etcd/testing/utils.go | 250 - .../kubernetes/pkg/storage/etcd/util/doc.go | 19 - .../pkg/storage/etcd/util/etcd_util.go | 99 - .../pkg/storage/etcd/util/etcd_util_test.go | 120 - .../kubernetes/pkg/storage/etcd3/compact.go | 104 - .../pkg/storage/etcd3/compact_test.go | 48 - .../kubernetes/pkg/storage/etcd3/event.go | 50 - .../kubernetes/pkg/storage/etcd3/store.go | 474 -- .../pkg/storage/etcd3/store_test.go | 554 -- .../kubernetes/pkg/storage/etcd3/watcher.go | 340 - .../pkg/storage/etcd3/watcher_test.go | 235 - .../pkg/storage/storagebackend/config.go | 68 - .../pkg/storage/storagebackend/etcd3.go | 42 - .../pkg/storage/storagebackend/etdc2.go | 78 - .../pkg/storage/testing/types.generated.go | 365 -- .../kubernetes/pkg/storage/testing/types.go | 30 - .../kubernetes/pkg/storage/testing/utils.go | 61 - .../kubernetes/pkg/storage/util_test.go | 53 - .../pkg/storage/watch_cache_test.go | 334 - .../kubernetes/pkg/util/atomic/value.go | 42 - .../kubernetes/pkg/util/atomic/value_test.go | 52 - .../kubernetes/pkg/util/bandwidth/doc.go | 18 - .../pkg/util/bandwidth/fake_shaper.go | 49 - .../pkg/util/bandwidth/interfaces.go | 38 - .../kubernetes/pkg/util/bandwidth/linux.go | 322 - .../pkg/util/bandwidth/linux_test.go | 634 -- .../pkg/util/bandwidth/unsupported.go | 52 - .../kubernetes/pkg/util/bandwidth/utils.go | 58 - .../k8s.io/kubernetes/pkg/util/cache/cache.go | 83 - .../kubernetes/pkg/util/cache/cache_test.go | 90 - .../k8s.io/kubernetes/pkg/util/chmod/chmod.go | 39 - .../k8s.io/kubernetes/pkg/util/chmod/doc.go | 19 - .../k8s.io/kubernetes/pkg/util/chown/chown.go | 39 - .../k8s.io/kubernetes/pkg/util/chown/doc.go | 18 - .../k8s.io/kubernetes/pkg/util/clock_test.go | 184 - .../pkg/util/codeinspector/codeinspector.go | 80 - .../kubernetes/pkg/util/config/config.go | 140 - .../kubernetes/pkg/util/config/config_test.go | 120 - .../pkg/util/config/configuration_map.go | 53 - .../k8s.io/kubernetes/pkg/util/config/doc.go | 20 - .../kubernetes/pkg/util/configz/configz.go | 86 - .../pkg/util/configz/configz_test.go | 77 - .../k8s.io/kubernetes/pkg/util/crlf/crlf.go | 57 - .../k8s.io/kubernetes/pkg/util/dbus/dbus.go | 133 - .../kubernetes/pkg/util/dbus/dbus_test.go | 249 - .../k8s.io/kubernetes/pkg/util/dbus/doc.go | 18 - .../kubernetes/pkg/util/dbus/fake_dbus.go | 135 - .../pkg/util/deployment/deployment_test.go | 409 -- .../k8s.io/kubernetes/pkg/util/diff/diff.go | 121 - .../src/k8s.io/kubernetes/pkg/util/env/env.go | 51 - .../kubernetes/pkg/util/env/env_test.go | 68 - .../kubernetes/pkg/util/errors/errors_test.go | 286 - .../k8s.io/kubernetes/pkg/util/exec/doc.go | 18 - .../k8s.io/kubernetes/pkg/util/exec/exec.go | 129 - .../kubernetes/pkg/util/exec/exec_test.go | 103 - .../kubernetes/pkg/util/exec/fake_exec.go | 101 - .../kubernetes/pkg/util/flock/flock_other.go | 24 - .../kubernetes/pkg/util/flock/flock_unix.go | 51 - .../pkg/util/flowcontrol/backoff_test.go | 194 - .../pkg/util/flowcontrol/throttle_test.go | 127 - .../kubernetes/pkg/util/flushwriter/doc.go | 19 - .../kubernetes/pkg/util/flushwriter/writer.go | 53 - .../pkg/util/flushwriter/writer_test.go | 86 - .../kubernetes/pkg/util/framer/framer_test.go | 176 - .../kubernetes/pkg/util/hash/hash_test.go | 147 - .../kubernetes/pkg/util/httpstream/doc.go | 19 - .../pkg/util/httpstream/httpstream.go | 149 - .../pkg/util/httpstream/httpstream_test.go | 127 - .../pkg/util/httpstream/spdy/connection.go | 145 - .../util/httpstream/spdy/connection_test.go | 163 - .../pkg/util/httpstream/spdy/roundtripper.go | 258 - .../util/httpstream/spdy/roundtripper_test.go | 423 -- .../pkg/util/httpstream/spdy/upgrade.go | 78 - .../pkg/util/httpstream/spdy/upgrade_test.go | 93 - .../pkg/util/integer/integer_test.go | 143 - .../pkg/util/interrupt/interrupt.go | 104 - .../kubernetes/pkg/util/intstr/intstr_test.go | 176 - .../src/k8s.io/kubernetes/pkg/util/io/io.go | 61 - .../k8s.io/kubernetes/pkg/util/io/io_test.go | 56 - .../k8s.io/kubernetes/pkg/util/io/writer.go | 80 - .../kubernetes/pkg/util/iptables/doc.go | 18 - .../kubernetes/pkg/util/iptables/iptables.go | 595 -- .../pkg/util/iptables/iptables_test.go | 768 --- .../pkg/util/iptables/testing/fake.go | 75 - .../kubernetes/pkg/util/json/json_test.go | 317 - .../pkg/util/jsonpath/jsonpath_test.go | 264 - .../pkg/util/jsonpath/parser_test.go | 136 - .../kubernetes/pkg/util/keymutex/keymutex.go | 82 - .../pkg/util/keymutex/keymutex_test.go | 111 - .../kubernetes/pkg/util/labels/labels_test.go | 60 - .../kubernetes/pkg/util/limitwriter/doc.go | 19 - .../pkg/util/limitwriter/limitwriter.go | 53 - .../pkg/util/line_delimiter_test.go | 40 - .../kubernetes/pkg/util/metrics/util.go | 71 - .../k8s.io/kubernetes/pkg/util/mount/doc.go | 18 - .../k8s.io/kubernetes/pkg/util/mount/fake.go | 126 - .../k8s.io/kubernetes/pkg/util/mount/mount.go | 147 - .../kubernetes/pkg/util/mount/mount_linux.go | 311 - .../pkg/util/mount/mount_linux_test.go | 182 - .../pkg/util/mount/mount_unsupported.go | 45 - .../pkg/util/mount/nsenter_mount.go | 207 - .../util/mount/nsenter_mount_unsupported.go | 43 - .../util/mount/safe_format_and_mount_test.go | 224 - .../kubernetes/pkg/util/net/http_test.go | 168 - .../kubernetes/pkg/util/net/interface_test.go | 300 - .../pkg/util/net/port_range_test.go | 66 - .../pkg/util/net/port_split_test.go | 111 - .../pkg/util/net/sets/ipnet_test.go | 155 - .../k8s.io/kubernetes/pkg/util/node/node.go | 61 - .../src/k8s.io/kubernetes/pkg/util/oom/doc.go | 18 - .../src/k8s.io/kubernetes/pkg/util/oom/oom.go | 26 - .../kubernetes/pkg/util/oom/oom_fake.go | 35 - .../kubernetes/pkg/util/oom/oom_linux.go | 130 - .../kubernetes/pkg/util/oom/oom_linux_test.go | 104 - .../pkg/util/oom/oom_unsupported.go | 40 - .../pkg/util/parsers/parsers_test.go | 51 - .../k8s.io/kubernetes/pkg/util/procfs/doc.go | 18 - .../pkg/util/procfs/example_proc_cgroup | 10 - .../kubernetes/pkg/util/procfs/procfs.go | 58 - .../kubernetes/pkg/util/procfs/procfs_fake.go | 30 - .../pkg/util/procfs/procfs_interface.go | 22 - .../kubernetes/pkg/util/procfs/procfs_test.go | 58 - .../k8s.io/kubernetes/pkg/util/proxy/dial.go | 106 - .../k8s.io/kubernetes/pkg/util/proxy/doc.go | 18 - .../kubernetes/pkg/util/proxy/transport.go | 241 - .../pkg/util/proxy/transport_test.go | 261 - .../kubernetes/pkg/util/rand/rand_test.go | 73 - .../pkg/util/replicaset/replicaset.go | 93 - .../k8s.io/kubernetes/pkg/util/runner_test.go | 55 - .../pkg/util/runtime/runtime_test.go | 69 - .../k8s.io/kubernetes/pkg/util/selinux/doc.go | 18 - .../kubernetes/pkg/util/selinux/selinux.go | 27 - .../pkg/util/selinux/selinux_linux.go | 34 - .../pkg/util/selinux/selinux_unsupported.go | 26 - .../kubernetes/pkg/util/sets/set_test.go | 270 - .../kubernetes/pkg/util/sets/types/types.go | 30 - .../k8s.io/kubernetes/pkg/util/slice/slice.go | 50 - .../kubernetes/pkg/util/slice/slice_test.go | 70 - .../pkg/util/strategicpatch/patch_test.go | 2110 ------ .../kubernetes/pkg/util/strings/escape.go | 49 - .../kubernetes/pkg/util/strings/strings.go | 47 - .../pkg/util/strings/strings_test.go | 54 - .../kubernetes/pkg/util/sysctl/sysctl.go | 56 - .../pkg/util/system/system_utils.go | 28 - .../kubernetes/pkg/util/template_test.go | 61 - .../k8s.io/kubernetes/pkg/util/term/term.go | 100 - .../pkg/util/testing/fake_handler.go | 120 - .../pkg/util/testing/fake_handler_test.go | 180 - .../kubernetes/pkg/util/testing/tmpdir.go | 44 - .../pkg/util/threading/deadlock-detector.go | 120 - .../util/threading/deadlock-detector_test.go | 127 - .../k8s.io/kubernetes/pkg/util/util_test.go | 101 - .../pkg/util/validation/field/errors_test.go | 134 - .../pkg/util/validation/field/path_test.go | 123 - .../pkg/util/validation/validation_test.go | 340 - .../kubernetes/pkg/util/wait/wait_test.go | 414 -- .../pkg/util/workqueue/delaying_queue_test.go | 177 - .../pkg/util/workqueue/queue_test.go | 131 - .../kubernetes/pkg/util/wsstream/conn.go | 318 - .../kubernetes/pkg/util/wsstream/conn_test.go | 169 - .../kubernetes/pkg/util/wsstream/doc.go | 21 - .../kubernetes/pkg/util/wsstream/stream.go | 124 - .../pkg/util/wsstream/stream_test.go | 235 - .../kubernetes/pkg/util/yaml/decoder_test.go | 217 - .../kubernetes/pkg/version/semver_test.go | 47 - .../kubernetes/pkg/version/verflag/verflag.go | 101 - .../kubernetes/pkg/watch/filter_test.go | 82 - .../k8s.io/kubernetes/pkg/watch/json/doc.go | 19 - .../k8s.io/kubernetes/pkg/watch/json/types.go | 53 - .../k8s.io/kubernetes/pkg/watch/mux_test.go | 167 - .../pkg/watch/streamwatcher_test.go | 67 - .../k8s.io/kubernetes/pkg/watch/until_test.go | 120 - .../pkg/watch/versioned/decoder_test.go | 113 - .../pkg/watch/versioned/encoder_test.go | 78 - .../k8s.io/kubernetes/pkg/watch/watch_test.go | 87 - .../forked/reflect/deep_equal_test.go | 137 - .../go/exp/math/dec/inf/benchmark_test.go | 210 - .../go/exp/math/dec/inf/dec_go1_2_test.go | 33 - .../go/exp/math/dec/inf/dec_internal_test.go | 40 - .../go/exp/math/dec/inf/dec_test.go | 379 -- .../go/exp/math/dec/inf/example_test.go | 62 - .../exp/math/dec/inf/rounder_example_test.go | 72 - .../go/exp/math/dec/inf/rounder_test.go | 109 - .../bitbucket.org/ww/goautoneg/Makefile | 0 .../bitbucket.org/ww/goautoneg/README.txt | 0 .../bitbucket.org/ww/goautoneg/autoneg.go | 0 .../beorn7/perks/quantile/exampledata.txt | 0 .../beorn7/perks/quantile/stream.go | 0 .../github.com/blang/semver/LICENSE | 0 .../github.com/blang/semver/README.md | 0 .../github.com/blang/semver/json.go | 0 .../github.com/blang/semver/semver.go | 0 .../github.com/blang/semver/sort.go | 0 .../github.com/blang/semver/sql.go | 0 vendor/github.com/davecgh/go-spew/LICENSE | 13 + .../github.com/davecgh/go-spew/spew/bypass.go | 0 .../davecgh/go-spew/spew/bypasssafe.go | 0 .../github.com/davecgh/go-spew/spew/common.go | 0 .../github.com/davecgh/go-spew/spew/config.go | 0 .../github.com/davecgh/go-spew/spew/doc.go | 0 .../github.com/davecgh/go-spew/spew/dump.go | 0 .../github.com/davecgh/go-spew/spew/format.go | 0 .../github.com/davecgh/go-spew/spew/spew.go | 0 vendor/github.com/docker/distribution/LICENSE | 202 + .../docker/distribution/digest/digest.go | 0 .../docker/distribution/digest/digester.go | 0 .../docker/distribution/digest/doc.go | 0 .../docker/distribution/digest/set.go | 0 .../docker/distribution/digest/verifiers.go | 0 .../distribution/reference/reference.go | 0 .../docker/distribution/reference/regexp.go | 0 vendor/github.com/docker/docker/LICENSE | 191 + vendor/github.com/docker/docker/NOTICE | 19 + .../docker/docker/pkg/mount/flags.go | 0 .../docker/docker/pkg/mount/flags_freebsd.go | 0 .../docker/docker/pkg/mount/flags_linux.go | 0 .../docker/pkg/mount/flags_unsupported.go | 0 .../docker/docker/pkg/mount/mount.go | 0 .../docker/pkg/mount/mounter_freebsd.go | 0 .../docker/docker/pkg/mount/mounter_linux.go | 0 .../docker/pkg/mount/mounter_unsupported.go | 0 .../docker/docker/pkg/mount/mountinfo.go | 0 .../docker/pkg/mount/mountinfo_freebsd.go | 0 .../docker/pkg/mount/mountinfo_linux.go | 0 .../docker/pkg/mount/mountinfo_unsupported.go | 0 .../docker/pkg/mount/sharedsubtree_linux.go | 0 vendor/github.com/docker/engine-api/LICENSE | 191 + .../docker/engine-api/types/auth.go | 0 .../docker/engine-api/types/blkiodev/blkio.go | 0 .../docker/engine-api/types/client.go | 0 .../docker/engine-api/types/configs.go | 0 .../engine-api/types/container/config.go | 0 .../engine-api/types/container/host_config.go | 0 .../types/container/hostconfig_unix.go | 0 .../types/container/hostconfig_windows.go | 0 .../docker/engine-api/types/filters/parse.go | 0 .../engine-api/types/network/network.go | 0 .../engine-api/types/registry/registry.go | 0 .../docker/engine-api/types/seccomp.go | 0 .../docker/engine-api/types/stats.go | 0 .../engine-api/types/strslice/strslice.go | 0 .../docker/engine-api/types/types.go | 0 .../engine-api/types/versions/README.md | 0 .../engine-api/types/versions/compare.go | 0 .../github.com/docker/go-connections/LICENSE | 0 .../docker/go-connections/nat/nat.go | 0 .../docker/go-connections/nat/parse.go | 0 .../docker/go-connections/nat/sort.go | 0 .../docker/go-units/CONTRIBUTING.md | 0 .../github.com/docker/go-units/LICENSE.code | 191 + .../github.com/docker/go-units/LICENSE.docs | 0 .../github.com/docker/go-units/MAINTAINERS | 0 .../github.com/docker/go-units/README.md | 0 .../github.com/docker/go-units/circle.yml | 0 .../github.com/docker/go-units/duration.go | 0 .../github.com/docker/go-units/size.go | 0 .../github.com/docker/go-units/ulimit.go | 0 .../github.com/emicklei/go-restful/.gitignore | 0 .../github.com/emicklei/go-restful/CHANGES.md | 0 .../github.com/emicklei/go-restful/LICENSE | 0 .../github.com/emicklei/go-restful/README.md | 0 .../github.com/emicklei/go-restful/Srcfile | 0 .../emicklei/go-restful/bench_test.sh | 0 .../emicklei/go-restful/compress.go | 0 .../emicklei/go-restful/compressor_cache.go | 0 .../emicklei/go-restful/compressor_pools.go | 0 .../emicklei/go-restful/compressors.go | 0 .../emicklei/go-restful/constants.go | 0 .../emicklei/go-restful/container.go | 0 .../emicklei/go-restful/cors_filter.go | 0 .../emicklei/go-restful/coverage.sh | 0 .../github.com/emicklei/go-restful/curly.go | 0 .../emicklei/go-restful/curly_route.go | 0 .../github.com/emicklei/go-restful/doc.go | 0 .../emicklei/go-restful/entity_accessors.go | 0 .../github.com/emicklei/go-restful/filter.go | 0 .../github.com/emicklei/go-restful/install.sh | 0 .../github.com/emicklei/go-restful/jsr311.go | 0 .../github.com/emicklei/go-restful/log/log.go | 0 .../github.com/emicklei/go-restful/logger.go | 0 .../github.com/emicklei/go-restful/mime.go | 0 .../emicklei/go-restful/options_filter.go | 0 .../emicklei/go-restful/parameter.go | 0 .../emicklei/go-restful/path_expression.go | 0 .../github.com/emicklei/go-restful/request.go | 0 .../emicklei/go-restful/response.go | 0 .../github.com/emicklei/go-restful/route.go | 0 .../emicklei/go-restful/route_builder.go | 0 .../github.com/emicklei/go-restful/router.go | 0 .../emicklei/go-restful/service_error.go | 0 .../emicklei/go-restful/swagger/CHANGES.md | 0 .../emicklei/go-restful/swagger/README.md | 0 .../swagger/api_declaration_list.go | 0 .../emicklei/go-restful/swagger/config.go | 0 .../go-restful/swagger/model_builder.go | 0 .../emicklei/go-restful/swagger/model_list.go | 0 .../go-restful/swagger/model_property_ext.go | 0 .../go-restful/swagger/model_property_list.go | 0 .../go-restful/swagger/ordered_route_map.go | 0 .../emicklei/go-restful/swagger/swagger.go | 0 .../go-restful/swagger/swagger_builder.go | 0 .../go-restful/swagger/swagger_webservice.go | 0 .../emicklei/go-restful/web_service.go | 0 .../go-restful/web_service_container.go | 0 .../github.com/evanphx/json-patch/.travis.yml | 0 .../github.com/evanphx/json-patch/LICENSE | 0 .../github.com/evanphx/json-patch/README.md | 0 .../github.com/evanphx/json-patch/merge.go | 0 .../github.com/evanphx/json-patch/patch.go | 0 .../github.com/fatih/structs/.gitignore | 0 .../github.com/fatih/structs/.travis.yml | 0 .../github.com/fatih/structs/LICENSE | 0 .../github.com/fatih/structs/README.md | 0 .../github.com/fatih/structs/field.go | 0 .../github.com/fatih/structs/structs.go | 0 .../github.com/fatih/structs/tags.go | 0 .../github.com/ghodss/yaml/.gitignore | 0 .../github.com/ghodss/yaml/.travis.yml | 0 .../github.com/ghodss/yaml/LICENSE | 0 .../github.com/ghodss/yaml/README.md | 0 .../github.com/ghodss/yaml/fields.go | 0 .../github.com/ghodss/yaml/yaml.go | 0 vendor/github.com/gogo/protobuf/LICENSE | 36 + .../github.com/gogo/protobuf/proto/Makefile | 0 .../github.com/gogo/protobuf/proto/clone.go | 0 .../github.com/gogo/protobuf/proto/decode.go | 0 .../gogo/protobuf/proto/decode_gogo.go | 0 .../github.com/gogo/protobuf/proto/encode.go | 0 .../gogo/protobuf/proto/encode_gogo.go | 0 .../github.com/gogo/protobuf/proto/equal.go | 0 .../gogo/protobuf/proto/extensions.go | 0 .../gogo/protobuf/proto/extensions_gogo.go | 0 .../github.com/gogo/protobuf/proto/lib.go | 0 .../gogo/protobuf/proto/lib_gogo.go | 0 .../gogo/protobuf/proto/message_set.go | 0 .../gogo/protobuf/proto/pointer_reflect.go | 0 .../gogo/protobuf/proto/pointer_unsafe.go | 0 .../protobuf/proto/pointer_unsafe_gogo.go | 0 .../gogo/protobuf/proto/properties.go | 0 .../gogo/protobuf/proto/properties_gogo.go | 0 .../gogo/protobuf/proto/skip_gogo.go | 0 .../github.com/gogo/protobuf/proto/text.go | 0 .../gogo/protobuf/proto/text_gogo.go | 0 .../gogo/protobuf/proto/text_parser.go | 0 .../github.com/golang/glog/LICENSE | 0 .../github.com/golang/glog/README | 0 .../github.com/golang/glog/glog.go | 0 .../github.com/golang/glog/glog_file.go | 0 vendor/github.com/golang/groupcache/LICENSE | 191 + .../github.com/golang/groupcache/lru/lru.go | 0 vendor/github.com/golang/protobuf/LICENSE | 31 + .../github.com/golang/protobuf/proto/Makefile | 0 .../github.com/golang/protobuf/proto/clone.go | 0 .../golang/protobuf/proto/decode.go | 0 .../golang/protobuf/proto/encode.go | 0 .../github.com/golang/protobuf/proto/equal.go | 0 .../golang/protobuf/proto/extensions.go | 0 .../github.com/golang/protobuf/proto/lib.go | 0 .../golang/protobuf/proto/message_set.go | 0 .../golang/protobuf/proto/pointer_reflect.go | 0 .../golang/protobuf/proto/pointer_unsafe.go | 0 .../golang/protobuf/proto/properties.go | 0 .../github.com/golang/protobuf/proto/text.go | 0 .../golang/protobuf/proto/text_parser.go | 0 vendor/github.com/google/cadvisor/LICENSE | 190 + .../google/cadvisor/info/v1/container.go | 0 .../google/cadvisor/info/v1/machine.go | 0 .../google/cadvisor/info/v1/metric.go | 0 .../github.com/google/gofuzz/.travis.yml | 0 .../github.com/google/gofuzz/CONTRIBUTING.md | 0 .../github.com/google/gofuzz/LICENSE | 0 .../github.com/google/gofuzz/README.md | 0 .../github.com/google/gofuzz/doc.go | 0 .../github.com/google/gofuzz/fuzz.go | 0 .../github.com/imdario/mergo/.travis.yml | 0 .../github.com/imdario/mergo/LICENSE | 0 .../github.com/imdario/mergo/README.md | 0 .../github.com/imdario/mergo/doc.go | 0 .../github.com/imdario/mergo/map.go | 0 .../github.com/imdario/mergo/merge.go | 0 .../github.com/imdario/mergo/mergo.go | 0 .../inconshreveable/mousetrap/LICENSE | 8 +- .../inconshreveable/mousetrap/README.md | 23 + .../inconshreveable/mousetrap/trap_others.go | 15 + .../inconshreveable/mousetrap/trap_windows.go | 98 + .../mousetrap/trap_windows_1.4.go | 46 + .../github.com/juju/ratelimit/LICENSE | 0 .../github.com/juju/ratelimit/README.md | 0 .../github.com/juju/ratelimit/ratelimit.go | 0 .../github.com/juju/ratelimit/reader.go | 0 .../golang_protobuf_extensions/LICENSE | 201 + .../pbutil/decode.go | 0 .../golang_protobuf_extensions/pbutil/doc.go | 0 .../pbutil/encode.go | 0 .../github.com/mitchellh/mapstructure/LICENSE | 0 .../mitchellh/mapstructure/README.md | 0 .../mitchellh/mapstructure/decode_hooks.go | 0 .../mitchellh/mapstructure/error.go | 0 .../mitchellh/mapstructure/mapstructure.go | 0 vendor/github.com/opencontainers/runc/LICENSE | 191 + vendor/github.com/opencontainers/runc/NOTICE | 17 + .../runc/libcontainer/cgroups/cgroups.go | 0 .../cgroups/cgroups_unsupported.go | 0 .../runc/libcontainer/cgroups/fs/apply_raw.go | 0 .../runc/libcontainer/cgroups/fs/blkio.go | 0 .../runc/libcontainer/cgroups/fs/cpu.go | 0 .../runc/libcontainer/cgroups/fs/cpuacct.go | 0 .../runc/libcontainer/cgroups/fs/cpuset.go | 0 .../runc/libcontainer/cgroups/fs/devices.go | 0 .../runc/libcontainer/cgroups/fs/freezer.go | 0 .../libcontainer/cgroups/fs/fs_unsupported.go | 0 .../runc/libcontainer/cgroups/fs/hugetlb.go | 0 .../runc/libcontainer/cgroups/fs/memory.go | 0 .../runc/libcontainer/cgroups/fs/name.go | 0 .../runc/libcontainer/cgroups/fs/net_cls.go | 0 .../runc/libcontainer/cgroups/fs/net_prio.go | 0 .../libcontainer/cgroups/fs/perf_event.go | 0 .../runc/libcontainer/cgroups/fs/pids.go | 0 .../runc/libcontainer/cgroups/fs/utils.go | 0 .../runc/libcontainer/cgroups/stats.go | 0 .../runc/libcontainer/cgroups/utils.go | 0 .../runc/libcontainer/configs/blkio_device.go | 0 .../runc/libcontainer/configs/cgroup_unix.go | 0 .../configs/cgroup_unsupported.go | 0 .../libcontainer/configs/cgroup_windows.go | 0 .../runc/libcontainer/configs/config.go | 0 .../runc/libcontainer/configs/config_unix.go | 0 .../runc/libcontainer/configs/device.go | 0 .../libcontainer/configs/device_defaults.go | 0 .../libcontainer/configs/hugepage_limit.go | 0 .../configs/interface_priority_map.go | 0 .../runc/libcontainer/configs/mount.go | 0 .../runc/libcontainer/configs/namespaces.go | 0 .../configs/namespaces_syscall.go | 0 .../configs/namespaces_syscall_unsupported.go | 0 .../libcontainer/configs/namespaces_unix.go | 0 .../configs/namespaces_unsupported.go | 0 .../runc/libcontainer/configs/network.go | 0 .../runc/libcontainer/system/linux.go | 0 .../runc/libcontainer/system/proc.go | 0 .../runc/libcontainer/system/setns_linux.go | 0 .../libcontainer/system/syscall_linux_386.go | 0 .../libcontainer/system/syscall_linux_64.go | 0 .../libcontainer/system/syscall_linux_arm.go | 0 .../runc/libcontainer/system/sysconfig.go | 0 .../libcontainer/system/sysconfig_notcgo.go | 0 .../runc/libcontainer/system/xattrs_linux.go | 0 .../github.com/pborman/uuid/CONTRIBUTORS | 0 .../github.com/pborman/uuid/LICENSE | 0 .../github.com/pborman/uuid/dce.go | 0 .../github.com/pborman/uuid/doc.go | 0 .../github.com/pborman/uuid/hash.go | 0 .../github.com/pborman/uuid/json.go | 0 .../github.com/pborman/uuid/node.go | 0 .../github.com/pborman/uuid/time.go | 0 .../github.com/pborman/uuid/util.go | 0 .../github.com/pborman/uuid/uuid.go | 0 .../github.com/pborman/uuid/version1.go | 0 .../github.com/pborman/uuid/version4.go | 0 .../prometheus/client_golang}/LICENSE | 0 .../prometheus/client_golang/NOTICE | 28 + .../client_golang/prometheus/.gitignore | 0 .../client_golang/prometheus/README.md | 0 .../client_golang/prometheus/collector.go | 0 .../client_golang/prometheus/counter.go | 0 .../client_golang/prometheus/desc.go | 0 .../client_golang/prometheus/doc.go | 0 .../client_golang/prometheus/expvar.go | 0 .../client_golang/prometheus/gauge.go | 0 .../client_golang/prometheus/go_collector.go | 0 .../client_golang/prometheus/histogram.go | 0 .../client_golang/prometheus/http.go | 0 .../client_golang/prometheus/metric.go | 0 .../prometheus/process_collector.go | 0 .../client_golang/prometheus/push.go | 0 .../client_golang/prometheus/registry.go | 0 .../client_golang/prometheus/summary.go | 0 .../client_golang/prometheus/untyped.go | 0 .../client_golang/prometheus/value.go | 0 .../client_golang/prometheus/vec.go | 0 .../prometheus/client_model/LICENSE | 201 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 0 .../prometheus/common/expfmt/decode.go | 0 .../prometheus/common/expfmt/encode.go | 0 .../prometheus/common/expfmt/expfmt.go | 0 .../prometheus/common/expfmt/fuzz.go | 0 .../prometheus/common/expfmt/json_decode.go | 0 .../prometheus/common/expfmt/text_create.go | 0 .../prometheus/common/expfmt/text_parse.go | 0 .../prometheus/common/model/fingerprinting.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/time.go | 0 .../prometheus/common/model/value.go | 0 .../github.com/prometheus/procfs/.travis.yml | 0 .../github.com/prometheus/procfs/AUTHORS.md | 0 .../prometheus/procfs/CONTRIBUTING.md | 0 vendor/github.com/prometheus/procfs/LICENSE | 201 + .../github.com/prometheus/procfs/NOTICE | 0 .../github.com/prometheus/procfs/README.md | 0 .../github.com/prometheus/procfs/doc.go | 0 .../github.com/prometheus/procfs/fs.go | 0 .../github.com/prometheus/procfs/proc.go | 0 .../prometheus/procfs/proc_limits.go | 0 .../github.com/prometheus/procfs/proc_stat.go | 0 .../github.com/prometheus/procfs/stat.go | 0 .../github.com/spf13/cobra/.gitignore | 0 .../github.com/spf13/cobra/.mailmap | 0 .../github.com/spf13/cobra/.travis.yml | 0 .../github.com/spf13/cobra/LICENSE.txt | 0 .../github.com/spf13/cobra/README.md | 0 .../spf13/cobra/bash_completions.go | 0 .../spf13/cobra/bash_completions.md | 0 .../github.com/spf13/cobra/cobra.go | 0 .../github.com/spf13/cobra/command.go | 0 .../github.com/spf13/cobra/command_notwin.go | 0 .../github.com/spf13/cobra/command_win.go | 0 .../github.com/spf13/pflag/.travis.yml | 0 .../github.com/spf13/pflag/LICENSE | 0 .../github.com/spf13/pflag/README.md | 0 .../github.com/spf13/pflag/bool.go | 0 .../github.com/spf13/pflag/count.go | 0 .../github.com/spf13/pflag/duration.go | 0 .../github.com/spf13/pflag/flag.go | 0 .../github.com/spf13/pflag/float32.go | 0 .../github.com/spf13/pflag/float64.go | 0 .../github.com/spf13/pflag/golangflag.go | 0 .../github.com/spf13/pflag/int.go | 0 .../github.com/spf13/pflag/int32.go | 0 .../github.com/spf13/pflag/int64.go | 0 .../github.com/spf13/pflag/int8.go | 0 .../github.com/spf13/pflag/int_slice.go | 0 .../github.com/spf13/pflag/ip.go | 0 .../github.com/spf13/pflag/ipmask.go | 0 .../github.com/spf13/pflag/ipnet.go | 0 .../github.com/spf13/pflag/string.go | 0 .../github.com/spf13/pflag/string_slice.go | 0 .../github.com/spf13/pflag/uint.go | 0 .../github.com/spf13/pflag/uint16.go | 0 .../github.com/spf13/pflag/uint32.go | 0 .../github.com/spf13/pflag/uint64.go | 0 .../github.com/spf13/pflag/uint8.go | 0 vendor/github.com/ugorji/go/LICENSE | 22 + .../github.com/ugorji/go/codec/0doc.go | 0 .../github.com/ugorji/go/codec/README.md | 0 .../github.com/ugorji/go/codec/binc.go | 0 .../github.com/ugorji/go/codec/cbor.go | 0 .../github.com/ugorji/go/codec/decode.go | 0 .../github.com/ugorji/go/codec/encode.go | 0 .../ugorji/go/codec/fast-path.generated.go | 0 .../ugorji/go/codec/fast-path.go.tmpl | 0 .../ugorji/go/codec/fast-path.not.go | 0 .../ugorji/go/codec/gen-dec-array.go.tmpl | 0 .../ugorji/go/codec/gen-dec-map.go.tmpl | 0 .../ugorji/go/codec/gen-helper.generated.go | 0 .../ugorji/go/codec/gen-helper.go.tmpl | 0 .../ugorji/go/codec/gen.generated.go | 0 .../github.com/ugorji/go/codec/gen.go | 0 .../github.com/ugorji/go/codec/helper.go | 0 .../ugorji/go/codec/helper_internal.go | 0 .../ugorji/go/codec/helper_not_unsafe.go | 0 .../ugorji/go/codec/helper_unsafe.go | 0 .../github.com/ugorji/go/codec/json.go | 0 .../github.com/ugorji/go/codec/msgpack.go | 0 .../github.com/ugorji/go/codec/noop.go | 0 .../github.com/ugorji/go/codec/prebuild.go | 0 .../github.com/ugorji/go/codec/prebuild.sh | 0 .../github.com/ugorji/go/codec/rpc.go | 0 .../github.com/ugorji/go/codec/simple.go | 0 .../ugorji/go/codec/test-cbor-goldens.json | 0 .../github.com/ugorji/go/codec/test.py | 0 .../github.com/ugorji/go/codec/tests.sh | 0 .../github.com/ugorji/go/codec/time.go | 0 vendor/golang.org/x/net/LICENSE | 27 + vendor/golang.org/x/net/PATENTS | 22 + .../golang.org/x/net/context/context.go | 0 .../x/net/context/ctxhttp/cancelreq.go | 0 .../x/net/context/ctxhttp/cancelreq_go14.go | 0 .../x/net/context/ctxhttp/ctxhttp.go | 0 .../golang.org/x/oauth2/.travis.yml | 0 .../golang.org/x/oauth2/AUTHORS | 0 .../golang.org/x/oauth2/CONTRIBUTING.md | 0 .../golang.org/x/oauth2/CONTRIBUTORS | 0 .../golang.org/x/oauth2/LICENSE | 0 .../golang.org/x/oauth2/README.md | 0 .../golang.org/x/oauth2/client_appengine.go | 0 .../golang.org/x/oauth2/google/appengine.go | 0 .../x/oauth2/google/appengine_hook.go | 0 .../golang.org/x/oauth2/google/default.go | 0 .../golang.org/x/oauth2/google/google.go | 0 .../golang.org/x/oauth2/google/sdk.go | 0 .../golang.org/x/oauth2/internal/oauth2.go | 0 .../golang.org/x/oauth2/internal/token.go | 0 .../golang.org/x/oauth2/internal/transport.go | 0 .../golang.org/x/oauth2/jws/jws.go | 0 .../golang.org/x/oauth2/jwt/jwt.go | 0 .../golang.org/x/oauth2/oauth2.go | 0 .../golang.org/x/oauth2/token.go | 0 .../golang.org/x/oauth2/transport.go | 0 vendor/google.golang.org/api/LICENSE | 27 + .../api/compute/v1/compute-api.json | 0 .../api/compute/v1/compute-gen.go | 0 .../api/container/v1/container-api.json | 0 .../api/container/v1/container-gen.go | 0 .../google.golang.org/api/gensupport/doc.go | 0 .../google.golang.org/api/gensupport/json.go | 0 .../google.golang.org/api/gensupport/media.go | 0 .../api/gensupport/params.go | 0 .../api/googleapi/googleapi.go | 0 .../googleapi/internal/uritemplates/LICENSE | 0 .../internal/uritemplates/uritemplates.go | 0 .../googleapi/internal/uritemplates/utils.go | 0 .../google.golang.org/api/googleapi/types.go | 0 vendor/google.golang.org/cloud/LICENSE | 202 + .../cloud/compute/metadata/metadata.go | 0 .../google.golang.org/cloud/internal/cloud.go | 0 .../src => vendor}/gopkg.in/gcfg.v1/LICENSE | 0 .../src => vendor}/gopkg.in/gcfg.v1/README | 0 .../src => vendor}/gopkg.in/gcfg.v1/doc.go | 0 .../src => vendor}/gopkg.in/gcfg.v1/go1_0.go | 0 .../src => vendor}/gopkg.in/gcfg.v1/go1_2.go | 0 .../src => vendor}/gopkg.in/gcfg.v1/read.go | 0 .../gopkg.in/gcfg.v1/scanner/errors.go | 0 .../gopkg.in/gcfg.v1/scanner/scanner.go | 0 .../src => vendor}/gopkg.in/gcfg.v1/set.go | 0 .../gopkg.in/gcfg.v1/token/position.go | 0 .../gopkg.in/gcfg.v1/token/serialize.go | 0 .../gopkg.in/gcfg.v1/token/token.go | 0 .../gopkg.in/gcfg.v1/types/bool.go | 0 .../gopkg.in/gcfg.v1/types/doc.go | 0 .../gopkg.in/gcfg.v1/types/enum.go | 0 .../gopkg.in/gcfg.v1/types/int.go | 0 .../gopkg.in/gcfg.v1/types/scan.go | 0 .../gopkg.in/yaml.v2/.travis.yml | 0 .../src => vendor}/gopkg.in/yaml.v2/LICENSE | 0 .../gopkg.in/yaml.v2/LICENSE.libyaml | 0 .../src => vendor}/gopkg.in/yaml.v2/README.md | 0 .../src => vendor}/gopkg.in/yaml.v2/apic.go | 0 .../src => vendor}/gopkg.in/yaml.v2/decode.go | 0 .../gopkg.in/yaml.v2/emitterc.go | 0 .../src => vendor}/gopkg.in/yaml.v2/encode.go | 0 .../gopkg.in/yaml.v2/parserc.go | 0 .../gopkg.in/yaml.v2/readerc.go | 0 .../gopkg.in/yaml.v2/resolve.go | 0 .../gopkg.in/yaml.v2/scannerc.go | 0 .../src => vendor}/gopkg.in/yaml.v2/sorter.go | 0 .../gopkg.in/yaml.v2/writerc.go | 0 .../src => vendor}/gopkg.in/yaml.v2/yaml.go | 0 .../src => vendor}/gopkg.in/yaml.v2/yamlh.go | 0 .../gopkg.in/yaml.v2/yamlprivateh.go | 0 vendor/k8s.io/heapster/LICENSE | 201 + .../metrics/api/v1/types/model_types.go | 0 .../heapster/metrics/api/v1/types/types.go | 0 vendor/k8s.io/kubernetes/LICENSE | 202 + .../apis/federation/deep_copy_generated.go | 0 .../apis/federation/install/install.go | 0 .../federation/apis/federation/register.go | 0 .../apis/federation/types.generated.go | 0 .../federation/apis/federation/types.go | 0 .../apis/federation/v1alpha1/conversion.go | 0 .../v1alpha1/conversion_generated.go | 0 .../v1alpha1/deep_copy_generated.go | 0 .../apis/federation/v1alpha1/defaults.go | 0 .../apis/federation/v1alpha1/doc.go | 0 .../apis/federation/v1alpha1/generated.pb.go | 0 .../apis/federation/v1alpha1/generated.proto | 0 .../apis/federation/v1alpha1/register.go | 0 .../federation/v1alpha1/types.generated.go | 0 .../apis/federation/v1alpha1/types.go | 0 .../k8s.io/kubernetes/pkg/api/OWNERS | 0 .../k8s.io/kubernetes/pkg/api/context.go | 0 .../k8s.io/kubernetes/pkg/api/conversion.go | 0 .../kubernetes/pkg/api/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/api/doc.go | 0 .../kubernetes/pkg/api/endpoints/util.go | 0 .../k8s.io/kubernetes/pkg/api/errors/doc.go | 0 .../kubernetes/pkg/api/errors/errors.go | 0 .../kubernetes/pkg/api/field_constants.go | 0 .../k8s.io/kubernetes/pkg/api/generate.go | 0 .../k8s.io/kubernetes/pkg/api/helpers.go | 0 .../kubernetes/pkg/api/install/install.go | 0 .../k8s.io/kubernetes/pkg/api/mapper.go | 0 .../k8s.io/kubernetes/pkg/api/meta.go | 0 .../pkg/api/meta/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/api/meta/doc.go | 0 .../k8s.io/kubernetes/pkg/api/meta/errors.go | 0 .../k8s.io/kubernetes/pkg/api/meta/help.go | 0 .../kubernetes/pkg/api/meta/interfaces.go | 0 .../k8s.io/kubernetes/pkg/api/meta/meta.go | 0 .../pkg/api/meta/multirestmapper.go | 0 .../kubernetes/pkg/api/meta/priority.go | 0 .../kubernetes/pkg/api/meta/restmapper.go | 0 .../kubernetes/pkg/api/node_example.json | 0 .../k8s.io/kubernetes/pkg/api/pod/util.go | 0 .../kubernetes/pkg/api/pod_example.json | 0 .../k8s.io/kubernetes/pkg/api/ref.go | 0 .../k8s.io/kubernetes/pkg/api/register.go | 0 .../api/replication_controller_example.json | 0 .../kubernetes/pkg/api/requestcontext.go | 0 .../pkg/api/resource/deep_copy_generated.go | 0 .../pkg/api/resource/generated.pb.go | 0 .../pkg/api/resource/generated.proto | 0 .../kubernetes/pkg/api/resource/quantity.go | 0 .../pkg/api/resource/quantity_proto.go | 0 .../kubernetes/pkg/api/resource/scale_int.go | 0 .../kubernetes/pkg/api/resource/suffix.go | 0 .../kubernetes/pkg/api/resource_helpers.go | 0 .../k8s.io/kubernetes/pkg/api/rest/create.go | 0 .../k8s.io/kubernetes/pkg/api/rest/delete.go | 0 .../k8s.io/kubernetes/pkg/api/rest/doc.go | 0 .../k8s.io/kubernetes/pkg/api/rest/export.go | 0 .../k8s.io/kubernetes/pkg/api/rest/rest.go | 0 .../k8s.io/kubernetes/pkg/api/rest/types.go | 0 .../k8s.io/kubernetes/pkg/api/rest/update.go | 0 .../kubernetes/pkg/api/service/annotations.go | 0 .../k8s.io/kubernetes/pkg/api/service/util.go | 0 .../kubernetes/pkg/api/testapi/testapi.go | 0 .../kubernetes/pkg/api/types.generated.go | 0 .../k8s.io/kubernetes/pkg/api/types.go | 0 .../api/unversioned/deep_copy_generated.go | 0 .../pkg/api/unversioned/duration.go | 0 .../pkg/api/unversioned/generated.pb.go | 0 .../pkg/api/unversioned/generated.proto | 0 .../pkg/api/unversioned/group_version.go | 0 .../kubernetes/pkg/api/unversioned/helpers.go | 0 .../pkg/api/unversioned/register.go | 0 .../kubernetes/pkg/api/unversioned/time.go | 0 .../pkg/api/unversioned/time_proto.go | 0 .../kubernetes/pkg/api/unversioned/types.go | 0 .../types_swagger_doc_generated.go | 0 .../api/unversioned/validation/validation.go | 0 .../pkg/api/unversioned/well_known_labels.go | 0 .../kubernetes/pkg/api/util/group_version.go | 0 .../kubernetes/pkg/api/v1/conversion.go | 0 .../pkg/api/v1/conversion_generated.go | 0 .../pkg/api/v1/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/api/v1/defaults.go | 0 .../k8s.io/kubernetes/pkg/api/v1/doc.go | 0 .../kubernetes/pkg/api/v1/generated.pb.go | 0 .../kubernetes/pkg/api/v1/generated.proto | 0 .../k8s.io/kubernetes/pkg/api/v1/register.go | 0 .../kubernetes/pkg/api/v1/types.generated.go | 0 .../k8s.io/kubernetes/pkg/api/v1/types.go | 0 .../pkg/api/v1/types_swagger_doc_generated.go | 0 .../kubernetes/pkg/api/validation/doc.go | 0 .../kubernetes/pkg/api/validation/events.go | 0 .../kubernetes/pkg/api/validation/name.go | 0 .../kubernetes/pkg/api/validation/schema.go | 0 .../pkg/api/validation/validation.go | 0 .../k8s.io/kubernetes/pkg/apimachinery/doc.go | 0 .../pkg/apimachinery/registered/registered.go | 9 + .../kubernetes/pkg/apimachinery/types.go | 0 .../pkg/apis/apps/deep_copy_generated.go | 0 .../pkg/apis/apps/install/install.go | 0 .../kubernetes/pkg/apis/apps/register.go | 0 .../pkg/apis/apps/types.generated.go | 0 .../k8s.io/kubernetes/pkg/apis/apps/types.go | 0 .../pkg/apis/apps/v1alpha1/conversion.go | 0 .../apps/v1alpha1/conversion_generated.go | 0 .../apis/apps/v1alpha1/deep_copy_generated.go | 0 .../pkg/apis/apps/v1alpha1/defaults.go | 0 .../kubernetes/pkg/apis/apps/v1alpha1/doc.go | 0 .../pkg/apis/apps/v1alpha1/generated.pb.go | 0 .../pkg/apis/apps/v1alpha1/generated.proto | 0 .../pkg/apis/apps/v1alpha1/register.go | 0 .../pkg/apis/apps/v1alpha1/types.generated.go | 0 .../pkg/apis/apps/v1alpha1/types.go | 0 .../v1alpha1/types_swagger_doc_generated.go | 0 .../apis/authorization/deep_copy_generated.go | 0 .../pkg/apis/authorization/install/install.go | 0 .../pkg/apis/authorization/register.go | 0 .../pkg/apis/authorization/types.generated.go | 0 .../pkg/apis/authorization/types.go | 0 .../apis/authorization/v1beta1/conversion.go | 0 .../v1beta1/conversion_generated.go | 0 .../v1beta1/deep_copy_generated.go | 0 .../apis/authorization/v1beta1/defaults.go | 0 .../pkg/apis/authorization/v1beta1/doc.go | 0 .../apis/authorization/v1beta1/register.go | 0 .../authorization/v1beta1/types.generated.go | 0 .../pkg/apis/authorization/v1beta1/types.go | 0 .../v1beta1/types_swagger_doc_generated.go | 0 .../apis/autoscaling/deep_copy_generated.go | 0 .../pkg/apis/autoscaling/install/install.go | 0 .../pkg/apis/autoscaling/register.go | 0 .../pkg/apis/autoscaling/types.generated.go | 0 .../kubernetes/pkg/apis/autoscaling/types.go | 0 .../pkg/apis/autoscaling/v1/conversion.go | 0 .../autoscaling/v1/conversion_generated.go | 0 .../autoscaling/v1/deep_copy_generated.go | 0 .../pkg/apis/autoscaling/v1/defaults.go | 0 .../kubernetes/pkg/apis/autoscaling/v1/doc.go | 0 .../pkg/apis/autoscaling/v1/generated.pb.go | 0 .../pkg/apis/autoscaling/v1/generated.proto | 0 .../pkg/apis/autoscaling/v1/register.go | 0 .../apis/autoscaling/v1/types.generated.go | 0 .../pkg/apis/autoscaling/v1/types.go | 0 .../v1/types_swagger_doc_generated.go | 0 .../pkg/apis/batch/deep_copy_generated.go | 0 .../pkg/apis/batch/install/install.go | 0 .../kubernetes/pkg/apis/batch/register.go | 0 .../pkg/apis/batch/types.generated.go | 0 .../k8s.io/kubernetes/pkg/apis/batch/types.go | 0 .../pkg/apis/batch/v1/conversion.go | 0 .../pkg/apis/batch/v1/conversion_generated.go | 0 .../pkg/apis/batch/v1/deep_copy_generated.go | 0 .../kubernetes/pkg/apis/batch/v1/defaults.go | 0 .../kubernetes/pkg/apis/batch/v1/doc.go | 0 .../pkg/apis/batch/v1/generated.pb.go | 0 .../pkg/apis/batch/v1/generated.proto | 0 .../kubernetes/pkg/apis/batch/v1/register.go | 0 .../pkg/apis/batch/v1/types.generated.go | 0 .../kubernetes/pkg/apis/batch/v1/types.go | 0 .../batch/v1/types_swagger_doc_generated.go | 0 .../componentconfig/deep_copy_generated.go | 0 .../pkg/apis/componentconfig/helpers.go | 0 .../apis/componentconfig/install/install.go | 0 .../pkg/apis/componentconfig/register.go | 0 .../apis/componentconfig/types.generated.go | 0 .../pkg/apis/componentconfig/types.go | 0 .../v1alpha1/conversion_generated.go | 0 .../v1alpha1/deep_copy_generated.go | 0 .../apis/componentconfig/v1alpha1/defaults.go | 0 .../pkg/apis/componentconfig/v1alpha1/doc.go | 0 .../apis/componentconfig/v1alpha1/register.go | 0 .../apis/componentconfig/v1alpha1/types.go | 0 .../apis/extensions/deep_copy_generated.go | 0 .../pkg/apis/extensions/install/install.go | 0 .../pkg/apis/extensions/register.go | 0 .../pkg/apis/extensions/types.generated.go | 0 .../kubernetes/pkg/apis/extensions/types.go | 0 .../pkg/apis/extensions/v1beta1/conversion.go | 0 .../v1beta1/conversion_generated.go | 0 .../extensions/v1beta1/deep_copy_generated.go | 0 .../pkg/apis/extensions/v1beta1/defaults.go | 0 .../pkg/apis/extensions/v1beta1/doc.go | 0 .../apis/extensions/v1beta1/generated.pb.go | 0 .../apis/extensions/v1beta1/generated.proto | 0 .../pkg/apis/extensions/v1beta1/register.go | 0 .../extensions/v1beta1/types.generated.go | 0 .../pkg/apis/extensions/v1beta1/types.go | 0 .../v1beta1/types_swagger_doc_generated.go | 0 .../apis/extensions/validation/validation.go | 0 .../pkg/apis/metrics/deep_copy_generated.go | 0 .../pkg/apis/metrics/install/install.go | 0 .../kubernetes/pkg/apis/metrics/register.go | 0 .../pkg/apis/metrics/types.generated.go | 0 .../kubernetes/pkg/apis/metrics/types.go | 0 .../metrics/v1alpha1/conversion_generated.go | 0 .../metrics/v1alpha1/deep_copy_generated.go | 0 .../pkg/apis/metrics/v1alpha1/doc.go | 0 .../pkg/apis/metrics/v1alpha1/register.go | 0 .../apis/metrics/v1alpha1/types.generated.go | 0 .../pkg/apis/metrics/v1alpha1/types.go | 0 .../pkg/apis/policy/deep_copy_generated.go | 0 .../pkg/apis/policy/install/install.go | 0 .../kubernetes/pkg/apis/policy/register.go | 0 .../kubernetes/pkg/apis/policy/types.go | 0 .../policy/v1alpha1/conversion_generated.go | 0 .../policy/v1alpha1/deep_copy_generated.go | 0 .../pkg/apis/policy/v1alpha1/doc.go | 0 .../pkg/apis/policy/v1alpha1/generated.pb.go | 0 .../pkg/apis/policy/v1alpha1/generated.proto | 0 .../pkg/apis/policy/v1alpha1/register.go | 0 .../pkg/apis/policy/v1alpha1/types.go | 0 .../k8s.io/kubernetes/pkg/auth/user/doc.go | 0 .../k8s.io/kubernetes/pkg/auth/user/user.go | 0 .../pkg/capabilities/capabilities.go | 0 .../k8s.io/kubernetes/pkg/capabilities/doc.go | 0 .../kubernetes/pkg/client/cache/delta_fifo.go | 0 .../k8s.io/kubernetes/pkg/client/cache/doc.go | 0 .../pkg/client/cache/expiration_cache.go | 0 .../client/cache/expiration_cache_fakes.go | 0 .../kubernetes/pkg/client/cache/fifo.go | 0 .../kubernetes/pkg/client/cache/index.go | 0 .../kubernetes/pkg/client/cache/listers.go | 0 .../kubernetes/pkg/client/cache/listwatch.go | 0 .../kubernetes/pkg/client/cache/reflector.go | 0 .../kubernetes/pkg/client/cache/store.go | 0 .../pkg/client/cache/thread_safe_store.go | 0 .../pkg/client/cache/undelta_store.go | 0 .../internalclientset/clientset.go | 0 .../internalclientset/doc.go | 0 .../import_known_versions.go | 0 .../typed/batch/unversioned/batch_client.go | 0 .../typed/batch/unversioned/doc.go | 0 .../batch/unversioned/generated_expansion.go | 0 .../typed/batch/unversioned/job.go | 0 .../typed/core/unversioned/componentstatus.go | 0 .../typed/core/unversioned/configmap.go | 0 .../typed/core/unversioned/core_client.go | 0 .../typed/core/unversioned/doc.go | 0 .../typed/core/unversioned/endpoints.go | 0 .../typed/core/unversioned/event.go | 0 .../typed/core/unversioned/event_expansion.go | 0 .../core/unversioned/generated_expansion.go | 0 .../typed/core/unversioned/limitrange.go | 0 .../typed/core/unversioned/namespace.go | 0 .../core/unversioned/namespace_expansion.go | 0 .../typed/core/unversioned/node.go | 0 .../core/unversioned/persistentvolume.go | 0 .../core/unversioned/persistentvolumeclaim.go | 0 .../typed/core/unversioned/pod.go | 0 .../typed/core/unversioned/pod_expansion.go | 0 .../typed/core/unversioned/podtemplate.go | 0 .../core/unversioned/replicationcontroller.go | 0 .../typed/core/unversioned/resourcequota.go | 0 .../typed/core/unversioned/secret.go | 0 .../typed/core/unversioned/service.go | 0 .../core/unversioned/service_expansion.go | 0 .../typed/core/unversioned/serviceaccount.go | 0 .../typed/extensions/unversioned/daemonset.go | 0 .../extensions/unversioned/deployment.go | 0 .../unversioned/deployment_expansion.go | 0 .../typed/extensions/unversioned/doc.go | 0 .../unversioned/extensions_client.go | 0 .../unversioned/generated_expansion.go | 0 .../unversioned/horizontalpodautoscaler.go | 0 .../typed/extensions/unversioned/ingress.go | 0 .../typed/extensions/unversioned/job.go | 0 .../extensions/unversioned/replicaset.go | 0 .../typed/extensions/unversioned/scale.go | 0 .../extensions/unversioned/scale_expansion.go | 0 .../unversioned/thirdpartyresource.go | 0 .../kubernetes/pkg/client/metrics/metrics.go | 0 .../kubernetes/pkg/client/record/doc.go | 0 .../kubernetes/pkg/client/record/event.go | 0 .../pkg/client/record/events_cache.go | 0 .../kubernetes/pkg/client/record/fake.go | 0 .../pkg/client/restclient/client.go | 0 .../pkg/client/restclient/config.go | 0 .../pkg/client/restclient/plugin.go | 0 .../pkg/client/restclient/request.go | 2 + .../pkg/client/restclient/transport.go | 0 .../pkg/client/restclient/url_utils.go | 0 .../pkg/client/restclient/urlbackoff.go | 0 .../pkg/client/restclient/versions.go | 0 .../kubernetes/pkg/client/transport/cache.go | 0 .../kubernetes/pkg/client/transport/config.go | 0 .../pkg/client/transport/round_trippers.go | 0 .../pkg/client/transport/transport.go | 0 .../typed/discovery/discovery_client.go | 0 .../internalclientset/clientset_adaption.go | 0 .../kubernetes/pkg/client/unversioned/apps.go | 0 .../pkg/client/unversioned/auth/clientauth.go | 0 .../pkg/client/unversioned/autoscaling.go | 0 .../pkg/client/unversioned/batch.go | 0 .../pkg/client/unversioned/client.go | 0 .../unversioned/clientcmd/api/helpers.go | 0 .../clientcmd/api/latest/latest.go | 0 .../unversioned/clientcmd/api/register.go | 0 .../client/unversioned/clientcmd/api/types.go | 0 .../clientcmd/api/v1/conversion.go | 0 .../unversioned/clientcmd/api/v1/register.go | 0 .../unversioned/clientcmd/api/v1/types.go | 0 .../unversioned/clientcmd/auth_loaders.go | 0 .../unversioned/clientcmd/client_config.go | 0 .../client/unversioned/clientcmd/config.go | 0 .../pkg/client/unversioned/clientcmd/doc.go | 0 .../client/unversioned/clientcmd/loader.go | 0 .../clientcmd/merged_client_builder.go | 0 .../client/unversioned/clientcmd/overrides.go | 0 .../unversioned/clientcmd/validation.go | 0 .../client/unversioned/componentstatuses.go | 0 .../pkg/client/unversioned/conditions.go | 0 .../pkg/client/unversioned/configmap.go | 0 .../pkg/client/unversioned/containerinfo.go | 0 .../pkg/client/unversioned/daemon_sets.go | 0 .../pkg/client/unversioned/deployment.go | 0 .../kubernetes/pkg/client/unversioned/doc.go | 0 .../pkg/client/unversioned/endpoints.go | 0 .../pkg/client/unversioned/events.go | 0 .../pkg/client/unversioned/extensions.go | 0 .../pkg/client/unversioned/flags.go | 0 .../pkg/client/unversioned/helper.go | 0 .../unversioned/horizontalpodautoscaler.go | 0 .../unversioned/import_known_versions.go | 0 .../pkg/client/unversioned/ingress.go | 0 .../kubernetes/pkg/client/unversioned/jobs.go | 0 .../pkg/client/unversioned/limit_ranges.go | 0 .../pkg/client/unversioned/namespaces.go | 0 .../pkg/client/unversioned/nodes.go | 0 .../unversioned/persistentvolumeclaim.go | 0 .../client/unversioned/persistentvolumes.go | 0 .../pkg/client/unversioned/pet_sets.go | 0 .../pkg/client/unversioned/pod_templates.go | 0 .../kubernetes/pkg/client/unversioned/pods.go | 0 .../client/unversioned/podsecuritypolicy.go | 0 .../pkg/client/unversioned/replica_sets.go | 0 .../unversioned/replication_controllers.go | 0 .../pkg/client/unversioned/resource_quotas.go | 0 .../pkg/client/unversioned/scale.go | 0 .../pkg/client/unversioned/secrets.go | 0 .../client/unversioned/service_accounts.go | 0 .../pkg/client/unversioned/services.go | 0 .../client/unversioned/thirdpartyresources.go | 0 .../kubernetes/pkg/cloudprovider/OWNERS | 0 .../kubernetes/pkg/cloudprovider/cloud.go | 0 .../kubernetes/pkg/cloudprovider/doc.go | 0 .../kubernetes/pkg/cloudprovider/plugins.go | 0 .../pkg/cloudprovider/providers/gce/doc.go | 0 .../pkg/cloudprovider/providers/gce/gce.go | 96 +- .../providers/gce/token_source.go | 0 .../k8s.io/kubernetes/pkg/controller/OWNERS | 0 .../pkg/controller/controller_utils.go | 0 .../k8s.io/kubernetes/pkg/controller/doc.go | 0 .../pkg/controller/framework/controller.go | 0 .../pkg/controller/framework/doc.go | 0 .../framework/fake_controller_source.go | 0 .../controller/framework/shared_informer.go | 0 .../kubernetes/pkg/controller/lookup_cache.go | 0 .../pkg/controller/podautoscaler/doc.go | 0 .../controller/podautoscaler/horizontal.go | 0 .../podautoscaler/metrics/metrics_client.go | 0 .../k8s.io/kubernetes/pkg/conversion/OWNERS | 0 .../kubernetes/pkg/conversion/cloner.go | 0 .../kubernetes/pkg/conversion/converter.go | 0 .../pkg/conversion/deep_copy_generated.go | 0 .../kubernetes/pkg/conversion/deep_equal.go | 0 .../k8s.io/kubernetes/pkg/conversion/doc.go | 0 .../kubernetes/pkg/conversion/helper.go | 0 .../pkg/conversion/queryparams/convert.go | 0 .../pkg/conversion/queryparams/doc.go | 0 .../kubernetes/pkg/credentialprovider/OWNERS | 0 .../pkg/credentialprovider/config.go | 0 .../kubernetes/pkg/credentialprovider/doc.go | 0 .../pkg/credentialprovider/keyring.go | 0 .../pkg/credentialprovider/plugins.go | 0 .../pkg/credentialprovider/provider.go | 0 .../k8s.io/kubernetes/pkg/fieldpath/doc.go | 0 .../kubernetes/pkg/fieldpath/fieldpath.go | 0 .../k8s.io/kubernetes/pkg/fields/doc.go | 0 .../k8s.io/kubernetes/pkg/fields/fields.go | 0 .../k8s.io/kubernetes/pkg/fields/selector.go | 0 .../k8s.io/kubernetes/pkg/healthz/doc.go | 0 .../k8s.io/kubernetes/pkg/healthz/healthz.go | 0 .../k8s.io/kubernetes/pkg/kubectl/OWNERS | 0 .../k8s.io/kubernetes/pkg/kubectl/apply.go | 0 .../kubernetes/pkg/kubectl/autoscale.go | 0 .../kubernetes/pkg/kubectl/bash_comp_utils.go | 0 .../pkg/kubectl/cmd/util/clientcache.go | 0 .../pkg/kubectl/cmd/util/factory.go | 0 .../pkg/kubectl/cmd/util/helpers.go | 0 .../pkg/kubectl/cmd/util/printing.go | 0 .../kubernetes/pkg/kubectl/configmap.go | 0 .../pkg/kubectl/custom_column_printer.go | 0 .../k8s.io/kubernetes/pkg/kubectl/describe.go | 0 .../k8s.io/kubernetes/pkg/kubectl/doc.go | 0 .../k8s.io/kubernetes/pkg/kubectl/explain.go | 0 .../k8s.io/kubernetes/pkg/kubectl/generate.go | 0 .../k8s.io/kubernetes/pkg/kubectl/history.go | 0 .../kubernetes/pkg/kubectl/interfaces.go | 0 .../k8s.io/kubernetes/pkg/kubectl/kubectl.go | 0 .../kubernetes/pkg/kubectl/namespace.go | 0 .../kubernetes/pkg/kubectl/proxy_server.go | 0 .../pkg/kubectl/resource/builder.go | 0 .../kubernetes/pkg/kubectl/resource/doc.go | 0 .../kubernetes/pkg/kubectl/resource/helper.go | 0 .../pkg/kubectl/resource/interfaces.go | 0 .../kubernetes/pkg/kubectl/resource/mapper.go | 0 .../kubernetes/pkg/kubectl/resource/result.go | 0 .../pkg/kubectl/resource/selector.go | 0 .../pkg/kubectl/resource/visitor.go | 0 .../pkg/kubectl/resource_printer.go | 5 +- .../k8s.io/kubernetes/pkg/kubectl/rollback.go | 0 .../kubernetes/pkg/kubectl/rolling_updater.go | 0 .../k8s.io/kubernetes/pkg/kubectl/run.go | 0 .../k8s.io/kubernetes/pkg/kubectl/scale.go | 0 .../k8s.io/kubernetes/pkg/kubectl/secret.go | 0 .../pkg/kubectl/secret_for_docker_registry.go | 0 .../k8s.io/kubernetes/pkg/kubectl/service.go | 0 .../kubernetes/pkg/kubectl/serviceaccount.go | 0 .../pkg/kubectl/sorted_event_list.go | 0 .../pkg/kubectl/sorted_resource_name_list.go | 0 .../kubernetes/pkg/kubectl/sorting_printer.go | 0 .../k8s.io/kubernetes/pkg/kubectl/stop.go | 0 .../k8s.io/kubernetes/pkg/kubectl/version.go | 0 .../kubernetes/pkg/kubectl/watchloop.go | 0 .../k8s.io/kubernetes/pkg/kubelet/qos/doc.go | 0 .../pkg/kubelet/qos/memory_policy.go | 0 .../kubernetes/pkg/kubelet/qos/util/qos.go | 0 .../pkg/labels/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/labels/doc.go | 0 .../k8s.io/kubernetes/pkg/labels/labels.go | 0 .../k8s.io/kubernetes/pkg/labels/selector.go | 0 .../k8s.io/kubernetes/pkg/master/ports/doc.go | 0 .../kubernetes/pkg/master/ports/ports.go | 0 .../kubernetes/pkg/registry/generic/doc.go | 0 .../pkg/registry/generic/matcher.go | 0 .../pkg/registry/generic/options.go | 0 .../pkg/registry/generic/storage_decorator.go | 0 .../registry/thirdpartyresourcedata/codec.go | 0 .../registry/thirdpartyresourcedata/doc.go | 0 .../thirdpartyresourcedata/registry.go | 0 .../thirdpartyresourcedata/strategy.go | 0 .../registry/thirdpartyresourcedata/util.go | 0 .../k8s.io/kubernetes/pkg/runtime/OWNERS | 0 .../k8s.io/kubernetes/pkg/runtime/codec.go | 0 .../kubernetes/pkg/runtime/codec_check.go | 0 .../kubernetes/pkg/runtime/conversion.go | 0 .../pkg/runtime/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/runtime/doc.go | 0 .../k8s.io/kubernetes/pkg/runtime/embedded.go | 0 .../k8s.io/kubernetes/pkg/runtime/error.go | 0 .../kubernetes/pkg/runtime/extension.go | 0 .../kubernetes/pkg/runtime/generated.pb.go | 0 .../kubernetes/pkg/runtime/generated.proto | 0 .../k8s.io/kubernetes/pkg/runtime/helper.go | 0 .../kubernetes/pkg/runtime/interfaces.go | 0 .../k8s.io/kubernetes/pkg/runtime/register.go | 0 .../k8s.io/kubernetes/pkg/runtime/scheme.go | 0 .../pkg/runtime/serializer/codec_factory.go | 0 .../runtime/serializer/deep_copy_generated.go | 0 .../pkg/runtime/serializer/json/json.go | 0 .../pkg/runtime/serializer/json/meta.go | 0 .../runtime/serializer/negotiated_codec.go | 0 .../pkg/runtime/serializer/protobuf/doc.go | 0 .../runtime/serializer/protobuf/protobuf.go | 0 .../runtime/serializer/protobuf_extension.go | 0 .../serializer/recognizer/recognizer.go | 0 .../runtime/serializer/streaming/streaming.go | 0 .../serializer/versioning/versioning.go | 0 .../pkg/runtime/swagger_doc_generator.go | 0 .../k8s.io/kubernetes/pkg/runtime/types.go | 0 .../kubernetes/pkg/runtime/types_proto.go | 0 .../kubernetes/pkg/runtime/unstructured.go | 0 .../k8s.io/kubernetes/pkg/storage/cacher.go | 0 .../k8s.io/kubernetes/pkg/storage/doc.go | 0 .../k8s.io/kubernetes/pkg/storage/errors.go | 0 .../kubernetes/pkg/storage/interfaces.go | 0 .../k8s.io/kubernetes/pkg/storage/util.go | 0 .../kubernetes/pkg/storage/watch_cache.go | 0 .../k8s.io/kubernetes/pkg/types/doc.go | 0 .../kubernetes/pkg/types/namespacedname.go | 0 .../k8s.io/kubernetes/pkg/types/uid.go | 0 .../kubernetes/pkg/types/unix_user_id.go | 0 .../k8s.io/kubernetes/pkg/util/clock.go | 0 .../kubernetes/pkg/util/crypto/crypto.go | 0 .../pkg/util/deployment/deployment.go | 0 .../k8s.io/kubernetes/pkg/util/doc.go | 0 .../k8s.io/kubernetes/pkg/util/errors/doc.go | 0 .../kubernetes/pkg/util/errors/errors.go | 0 .../k8s.io/kubernetes/pkg/util/flag/flags.go | 0 .../kubernetes/pkg/util/flag/tristate.go | 0 .../pkg/util/flowcontrol/backoff.go | 0 .../pkg/util/flowcontrol/throttle.go | 0 .../kubernetes/pkg/util/framer/framer.go | 0 .../k8s.io/kubernetes/pkg/util/hash/hash.go | 0 .../kubernetes/pkg/util/homedir/homedir.go | 0 .../kubernetes/pkg/util/integer/integer.go | 0 .../pkg/util/intstr/deep_copy_generated.go | 0 .../pkg/util/intstr/generated.pb.go | 0 .../pkg/util/intstr/generated.proto | 0 .../kubernetes/pkg/util/intstr/intstr.go | 0 .../k8s.io/kubernetes/pkg/util/json/json.go | 0 .../kubernetes/pkg/util/jsonpath/doc.go | 0 .../kubernetes/pkg/util/jsonpath/jsonpath.go | 0 .../kubernetes/pkg/util/jsonpath/node.go | 0 .../kubernetes/pkg/util/jsonpath/parser.go | 0 .../k8s.io/kubernetes/pkg/util/labels/doc.go | 0 .../kubernetes/pkg/util/labels/labels.go | 0 .../kubernetes/pkg/util/line_delimiter.go | 0 .../k8s.io/kubernetes/pkg/util/logs.go | 0 .../k8s.io/kubernetes/pkg/util/net/http.go | 0 .../kubernetes/pkg/util/net/interface.go | 0 .../kubernetes/pkg/util/net/port_range.go | 0 .../kubernetes/pkg/util/net/port_split.go | 0 .../kubernetes/pkg/util/net/sets/README.md | 0 .../kubernetes/pkg/util/net/sets/ipnet.go | 0 .../kubernetes/pkg/util/parsers/parsers.go | 0 .../k8s.io/kubernetes/pkg/util/pod/doc.go | 0 .../k8s.io/kubernetes/pkg/util/pod/pod.go | 0 .../k8s.io/kubernetes/pkg/util/rand/rand.go | 16 + .../pkg/util/resource_container_linux.go | 0 .../util/resource_container_unsupported.go | 0 .../k8s.io/kubernetes/pkg/util/runner.go | 0 .../kubernetes/pkg/util/runtime/runtime.go | 0 .../k8s.io/kubernetes/pkg/util/sets/byte.go | 0 .../pkg/util/sets/deep_copy_generated.go | 0 .../k8s.io/kubernetes/pkg/util/sets/doc.go | 0 .../k8s.io/kubernetes/pkg/util/sets/empty.go | 0 .../k8s.io/kubernetes/pkg/util/sets/int.go | 0 .../k8s.io/kubernetes/pkg/util/sets/int64.go | 0 .../k8s.io/kubernetes/pkg/util/sets/string.go | 0 .../pkg/util/strategicpatch/patch.go | 0 .../k8s.io/kubernetes/pkg/util/string_flag.go | 0 .../k8s.io/kubernetes/pkg/util/template.go | 0 .../k8s.io/kubernetes/pkg/util/trace.go | 0 .../k8s.io/kubernetes/pkg/util/umask.go | 0 .../kubernetes/pkg/util/umask_windows.go | 0 .../k8s.io/kubernetes/pkg/util/util.go | 0 .../k8s.io/kubernetes/pkg/util/uuid.go | 0 .../pkg/util/validation/field/errors.go | 0 .../pkg/util/validation/field/path.go | 0 .../pkg/util/validation/validation.go | 0 .../k8s.io/kubernetes/pkg/util/wait/doc.go | 0 .../k8s.io/kubernetes/pkg/util/wait/wait.go | 0 .../pkg/util/workqueue/delaying_queue.go | 0 .../kubernetes/pkg/util/workqueue/doc.go | 0 .../pkg/util/workqueue/parallelizer.go | 0 .../kubernetes/pkg/util/workqueue/queue.go | 0 .../kubernetes/pkg/util/yaml/decoder.go | 18 +- .../kubernetes/pkg/version/.gitattributes | 0 .../k8s.io/kubernetes/pkg/version/base.go | 0 .../k8s.io/kubernetes/pkg/version/doc.go | 0 .../k8s.io/kubernetes/pkg/version/semver.go | 0 .../k8s.io/kubernetes/pkg/version/version.go | 0 .../k8s.io/kubernetes/pkg/watch/doc.go | 0 .../k8s.io/kubernetes/pkg/watch/filter.go | 0 .../k8s.io/kubernetes/pkg/watch/mux.go | 0 .../kubernetes/pkg/watch/streamwatcher.go | 0 .../k8s.io/kubernetes/pkg/watch/until.go | 0 .../kubernetes/pkg/watch/versioned/decoder.go | 0 .../kubernetes/pkg/watch/versioned/encoder.go | 0 .../pkg/watch/versioned/generated.pb.go | 0 .../pkg/watch/versioned/generated.proto | 0 .../pkg/watch/versioned/register.go | 0 .../kubernetes/pkg/watch/versioned/types.go | 0 .../k8s.io/kubernetes/pkg/watch/watch.go | 0 .../plugin/pkg/client/auth/gcp/gcp.go | 0 .../plugin/pkg/client/auth/plugins.go | 0 .../third_party/forked/json/LICENSE | 0 .../third_party/forked/json/fields.go | 0 .../third_party/forked/reflect/LICENSE | 0 .../third_party/forked/reflect/deep_equal.go | 0 .../third_party/golang/template/exec.go | 0 .../third_party/golang/template/funcs.go | 0 .../speter.net/go/exp/math/dec/inf/LICENSE | 0 .../speter.net/go/exp/math/dec/inf/dec.go | 0 .../speter.net/go/exp/math/dec/inf/rounder.go | 0 2059 files changed, 3706 insertions(+), 213845 deletions(-) delete mode 100644 Godeps/_workspace/.gitignore delete mode 100644 Godeps/_workspace/src/bitbucket.org/ww/goautoneg/autoneg_test.go delete mode 100644 Godeps/_workspace/src/github.com/beorn7/perks/quantile/bench_test.go delete mode 100644 Godeps/_workspace/src/github.com/beorn7/perks/quantile/example_test.go delete mode 100644 Godeps/_workspace/src/github.com/beorn7/perks/quantile/stream_test.go delete mode 100644 Godeps/_workspace/src/github.com/blang/semver/examples/main.go delete mode 100644 Godeps/_workspace/src/github.com/blang/semver/json_test.go delete mode 100644 Godeps/_workspace/src/github.com/blang/semver/semver_test.go delete mode 100644 Godeps/_workspace/src/github.com/blang/semver/sort_test.go delete mode 100644 Godeps/_workspace/src/github.com/blang/semver/sql_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/common_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dump_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpcgo_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpnocgo_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/example_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/format_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internal_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internalunsafe_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/spew_test.go delete mode 100644 Godeps/_workspace/src/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/digest/digest_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/digest/digester_resumable_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/digest/set_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/digest/verifiers_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/reference/reference_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/distribution/reference/regexp_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mount_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/events/events.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/filters/parse_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/reference/image_reference.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/strslice/strslice_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/versions/compare_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p19/types.go delete mode 100644 Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p20/types.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-connections/nat/nat_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-connections/nat/parse_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-connections/nat/sort_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-units/duration_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-units/size_test.go delete mode 100644 Godeps/_workspace/src/github.com/docker/go-units/ulimit_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/container_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/entity_accessors_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-swagger.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/mime_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_list_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_ext_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_list_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/ordered_route_map_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/postbuild_model_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/test_package/struct.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/tracer_test.go delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go delete mode 100644 Godeps/_workspace/src/github.com/evanphx/json-patch/merge_test.go delete mode 100644 Godeps/_workspace/src/github.com/evanphx/json-patch/patch_test.go delete mode 100644 Godeps/_workspace/src/github.com/fatih/structs/field_test.go delete mode 100644 Godeps/_workspace/src/github.com/fatih/structs/structs_example_test.go delete mode 100644 Godeps/_workspace/src/github.com/fatih/structs/structs_test.go delete mode 100644 Godeps/_workspace/src/github.com/fatih/structs/tags_test.go delete mode 100644 Godeps/_workspace/src/github.com/ghodss/yaml/yaml_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go delete mode 100644 Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/glog/glog_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/groupcache/lru/lru_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/all_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/clone_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/equal_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/extensions_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/message_set_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/size2_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/size_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/Makefile delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/golden_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.pb.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.proto delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/text_parser_test.go delete mode 100644 Godeps/_workspace/src/github.com/golang/protobuf/proto/text_test.go delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/info/v1/container_test.go delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/info/v1/test/datagen.go delete mode 100644 Godeps/_workspace/src/github.com/google/gofuzz/example_test.go delete mode 100644 Godeps/_workspace/src/github.com/google/gofuzz/fuzz_test.go delete mode 100644 Godeps/_workspace/src/github.com/imdario/mergo/mergo_test.go delete mode 100644 Godeps/_workspace/src/github.com/imdario/mergo/testdata/license.yml delete mode 100644 Godeps/_workspace/src/github.com/imdario/mergo/testdata/thing.yml delete mode 100644 Godeps/_workspace/src/github.com/juju/ratelimit/ratelimit_test.go delete mode 100644 Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go delete mode 100644 Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go delete mode 100644 Godeps/_workspace/src/github.com/mitchellh/mapstructure/decode_hooks_test.go delete mode 100644 Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go delete mode 100644 Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go delete mode 100644 Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_examples_test.go delete mode 100644 Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/cgroups_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_cls_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_prio_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/pids_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/stats_util_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/util_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/utils_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_nosystemd.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_systemd.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_unix_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_windows_test.go delete mode 100644 Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/validate/config.go delete mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/json_test.go delete mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go delete mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/benchmark_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/counter_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_memstats_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_selfcollector_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/examples_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/expvar_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/gauge_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/go_collector_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/histogram_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/http_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/metric_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/process_collector_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/registry_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/summary_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/vec_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/bench_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/decode_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/minimal delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/json_decode_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/json2 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf.gz delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/test.gz delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/text delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_create_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_parse_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/model/labels_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/model/metric_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/model/signature_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/model/time_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/common/model/value_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/cmdline delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/0 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/1 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/2 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/3 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/4 delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/limits delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/stat delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/584/stat delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/stat delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/fs_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/proc_limits_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/proc_stat_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/proc_test.go delete mode 100644 Godeps/_workspace/src/github.com/prometheus/procfs/stat_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/bash_completions_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/cobra_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/command_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/cmd_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.md delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/man_examples_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.md delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/cobra/doc/util.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/bool_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/count_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/example_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/export_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/flag_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/golangflag_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/int_slice_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/ip_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/ipnet_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/string_slice_test.go delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/verify/all.sh delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/verify/gofmt.sh delete mode 100644 Godeps/_workspace/src/github.com/spf13/pflag/verify/golint.sh delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/cbor_test.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/codec_test.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/README.md delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/gen.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/z.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen_test.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/helper_test.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/py_test.go delete mode 100644 Godeps/_workspace/src/github.com/ugorji/go/codec/values_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/context_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/ctxhttp/ctxhttp_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/example_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/facebook/facebook.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/github/github.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/google/example_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/google/google_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/google/sdk_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/credentials delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/properties delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/internal/oauth2_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/internal/token_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/jwt/example_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/jwt/jwt_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/linkedin/linkedin.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/oauth2_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/paypal/paypal.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/token_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/transport_test.go delete mode 100644 Godeps/_workspace/src/golang.org/x/oauth2/vk/vk.go delete mode 100644 Godeps/_workspace/src/google.golang.org/api/gensupport/json_test.go delete mode 100644 Godeps/_workspace/src/google.golang.org/api/gensupport/media_test.go delete mode 100644 Godeps/_workspace/src/google.golang.org/api/googleapi/googleapi_test.go delete mode 100644 Godeps/_workspace/src/google.golang.org/api/googleapi/transport/apikey.go delete mode 100644 Godeps/_workspace/src/google.golang.org/api/googleapi/types_test.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.pb.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.proto delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/opts/option.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/testutil/context.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq_legacy.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/transport/dial.go delete mode 100644 Godeps/_workspace/src/google.golang.org/cloud/internal/transport/proto.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/example_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/issues_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/read_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/example_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/scanner_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/token/position_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/token/serialize_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/types/enum_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/types/int_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/gcfg.v1/types/scan_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/yaml.v2/decode_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/yaml.v2/encode_test.go delete mode 100644 Godeps/_workspace/src/gopkg.in/yaml.v2/suite_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/install/install_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/context_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/conversion_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/copy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/deep_copy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/endpoints/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/errors_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/storage.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/generate_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/install/install_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/help_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/meta_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/multirestmapper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/priority_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/restmapper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/pod/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/ref_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_example_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/scale_int_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource_helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/rest/resttest/resttest.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_proto_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/service/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testapi/testapi_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/compat/compatibility_tester.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/conversion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/fuzzer.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/pod_specs.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/duration_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/group_version_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/time_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/util/group_version_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/conversion_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/defaults_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/events_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/name_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/schema_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod.yaml delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod1.json delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod2.json delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod3.json delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/validPod.yaml delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apimachinery/registered/registered_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/install/install_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/install/install_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/delta_fifo_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/expiration_cache_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/fifo_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/index_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listwatch_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/reflector_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/store_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/undelta_store_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_batch_client.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_job.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_componentstatus.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_configmap.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_core_client.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_endpoints.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_limitrange.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_node.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolume.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolumeclaim.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_podtemplate.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_replicationcontroller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_resourcequota.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_secret.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_serviceaccount.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_daemonset.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_extensions_client.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_horizontalpodautoscaler.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_ingress.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_replicaset.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale_expansion.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_thirdpartyresource.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/event_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/events_cache_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/client_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/plugin_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/request_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/url_utils_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/urlbackoff_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/cache_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/round_trippers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/transport_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/client_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/fake/discovery.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_2/clientset_adaption.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_3/clientset_adaption.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/conditions_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/containerinfo_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/deployment_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/endpoints_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/events_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/fake/fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/flags_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_blackbox_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/ingress_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/jobs_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/namespaces_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/nodes_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolume_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pet_sets_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pod_templates_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pods_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v1.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v2.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replica_sets_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/services_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/actions.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_componentstatuses.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_configmaps.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_daemon_sets.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_deployments.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_endpoints.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_events.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_horizontal_pod_autoscalers.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_ingress.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_jobs.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_limit_ranges.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_namespaces.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_nodes.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volume_claims.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volumes.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pod_templates.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pods.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_podsecuritypolicy.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replica_sets.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replication_controllers.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_resource_quotas.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_scales.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_secrets.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_service_accounts.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_services.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_thirdpartyresources.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fixture.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/simple/simple_testclient.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/OWNERS delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_instancegroups.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_loadbalancer.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_routes.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/log_handler.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/sets_ippermissions.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/plugins.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/MAINTAINERS.md delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/providers.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/MAINTAINERS.md delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/controller_utils_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/fake_controller_source_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/informers/factory.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/OWNERS delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/options/options.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_index_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/types.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/fakes.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/options/options.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/controller-test/ct delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokengetter.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/converter_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/deep_copy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/helper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/queryparams/convert_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/keyring_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/provider_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/fieldpath/fieldpath_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/fields_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/selector_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/healthz/healthz_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apiversions.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/autoscale.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/clusterinfo.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_authinfo.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_cluster.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_context.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/set.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/unset.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/use_context.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/view.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/convert.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/edit.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/explain.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/namespace.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/proxy.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_history.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_pause.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_resume.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_undo.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/scale.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/stop.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/helpers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/version.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/configmap_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/custom_column_printer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/describe_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/generate_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl.test delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/namespace_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/proxy_server_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/builder_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/helper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource_printer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/rolling_updater_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/run_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/scale_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_for_docker_registry_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/service_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/serviceaccount_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorted_event_list_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorting_printer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/stop_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.generated.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/memory_policy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/util/qos_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/labels_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/selector_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/matcher_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/storage_factory.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/codec_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/conversion_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/embedded_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/extension_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/helper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/scheme_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/codec_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/json_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/meta_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/protobuf_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/recognizer/recognizer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/streaming/streaming_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/versioning/versioning_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/yaml/yaml.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/swagger_doc_generator_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unstructured_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unversioned_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/cacher_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/etcdtest.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/metrics/metrics.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/certificates.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/event.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/config.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etcd3.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etdc2.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.generated.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/watch_cache_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/fake_shaper.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/interfaces.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/unsupported.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/chmod.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/chown.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/clock_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/codeinspector/codeinspector.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/configuration_map.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/crlf/crlf.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/fake_dbus.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/deployment/deployment_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/diff/diff.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/errors/errors_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/fake_exec.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_other.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_unix.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/backoff_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/throttle_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/framer/framer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/hash/hash_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/integer/integer_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/interrupt/interrupt.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/intstr/intstr_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/writer.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/testing/fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/json/json_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/jsonpath_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/parser_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/labels/labels_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/limitwriter.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/line_delimiter_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/metrics/util.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/safe_format_and_mount_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/http_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/interface_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_range_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_split_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/sets/ipnet_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/node/node.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_unsupported.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/parsers/parsers_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/example_proc_cgroup delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_fake.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_interface.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/dial.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/rand/rand_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/replicaset/replicaset.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/runner_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/runtime/runtime_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/selinux/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/selinux/selinux.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/selinux/selinux_linux.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/selinux/selinux_unsupported.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/sets/set_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/sets/types/types.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/slice/slice.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/slice/slice_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/strategicpatch/patch_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/strings/escape.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/strings/strings.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/strings/strings_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/sysctl/sysctl.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/system/system_utils.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/template_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/term/term.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/testing/fake_handler.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/testing/fake_handler_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/testing/tmpdir.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/threading/deadlock-detector.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/threading/deadlock-detector_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/util_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/validation/field/errors_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/validation/field/path_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/validation/validation_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wait/wait_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/workqueue/delaying_queue_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/workqueue/queue_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wsstream/conn.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wsstream/conn_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wsstream/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wsstream/stream.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/wsstream/stream_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/yaml/decoder_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/version/semver_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/version/verflag/verflag.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/filter_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/json/doc.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/json/types.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/mux_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/streamwatcher_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/until_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/versioned/decoder_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/versioned/encoder_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/pkg/watch/watch_test.go delete mode 100644 Godeps/_workspace/src/k8s.io/kubernetes/third_party/forked/reflect/deep_equal_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/benchmark_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/dec_go1_2_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/dec_internal_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/dec_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/example_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/rounder_example_test.go delete mode 100644 Godeps/_workspace/src/speter.net/go/exp/math/dec/inf/rounder_test.go rename {Godeps/_workspace/src => vendor}/bitbucket.org/ww/goautoneg/Makefile (100%) rename {Godeps/_workspace/src => vendor}/bitbucket.org/ww/goautoneg/README.txt (100%) rename {Godeps/_workspace/src => vendor}/bitbucket.org/ww/goautoneg/autoneg.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/beorn7/perks/quantile/exampledata.txt (100%) rename {Godeps/_workspace/src => vendor}/github.com/beorn7/perks/quantile/stream.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/json.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/semver.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/sort.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/blang/semver/sql.go (100%) create mode 100644 vendor/github.com/davecgh/go-spew/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/bypass.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/bypasssafe.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/common.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/config.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/dump.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/format.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/davecgh/go-spew/spew/spew.go (100%) create mode 100644 vendor/github.com/docker/distribution/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/digest/digest.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/digest/digester.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/digest/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/digest/set.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/digest/verifiers.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/reference/reference.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/distribution/reference/regexp.go (100%) create mode 100644 vendor/github.com/docker/docker/LICENSE create mode 100644 vendor/github.com/docker/docker/NOTICE rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/flags.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/flags_freebsd.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/flags_linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/flags_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mount.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mounter_freebsd.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mounter_linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mounter_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mountinfo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mountinfo_linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go (100%) create mode 100644 vendor/github.com/docker/engine-api/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/auth.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/blkiodev/blkio.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/client.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/configs.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/container/config.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/container/host_config.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/container/hostconfig_unix.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/container/hostconfig_windows.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/filters/parse.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/network/network.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/registry/registry.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/seccomp.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/stats.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/strslice/strslice.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/types.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/versions/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/engine-api/types/versions/compare.go (100%) rename Godeps/_workspace/src/github.com/docker/go-units/LICENSE.code => vendor/github.com/docker/go-connections/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-connections/nat/nat.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-connections/nat/parse.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-connections/nat/sort.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/CONTRIBUTING.md (100%) create mode 100644 vendor/github.com/docker/go-units/LICENSE.code rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/LICENSE.docs (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/MAINTAINERS (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/circle.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/duration.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/size.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/docker/go-units/ulimit.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/.gitignore (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/CHANGES.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/Srcfile (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/bench_test.sh (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/compress.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/compressor_cache.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/compressor_pools.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/compressors.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/constants.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/container.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/cors_filter.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/coverage.sh (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/curly.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/curly_route.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/entity_accessors.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/filter.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/install.sh (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/jsr311.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/log/log.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/logger.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/mime.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/options_filter.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/parameter.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/path_expression.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/request.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/response.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/route.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/route_builder.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/router.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/service_error.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/CHANGES.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/api_declaration_list.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/config.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/model_builder.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/model_list.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/model_property_ext.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/model_property_list.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/ordered_route_map.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/swagger.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/swagger_builder.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/swagger/swagger_webservice.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/web_service.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/emicklei/go-restful/web_service_container.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/evanphx/json-patch/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/evanphx/json-patch/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/evanphx/json-patch/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/evanphx/json-patch/merge.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/evanphx/json-patch/patch.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/.gitignore (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/field.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/structs.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/fatih/structs/tags.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/.gitignore (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/fields.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ghodss/yaml/yaml.go (100%) create mode 100644 vendor/github.com/gogo/protobuf/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/Makefile (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/clone.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/decode_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/encode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/encode_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/equal.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/extensions.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/extensions_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/lib.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/lib_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/message_set.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/pointer_reflect.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/pointer_unsafe.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/properties.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/properties_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/skip_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/text.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/text_gogo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/gogo/protobuf/proto/text_parser.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/glog/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/glog/README (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/glog/glog.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/glog/glog_file.go (100%) create mode 100644 vendor/github.com/golang/groupcache/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/golang/groupcache/lru/lru.go (100%) create mode 100644 vendor/github.com/golang/protobuf/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/Makefile (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/clone.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/encode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/equal.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/extensions.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/lib.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/message_set.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/pointer_reflect.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/pointer_unsafe.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/properties.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/text.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/golang/protobuf/proto/text_parser.go (100%) create mode 100644 vendor/github.com/google/cadvisor/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/google/cadvisor/info/v1/container.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/cadvisor/info/v1/machine.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/cadvisor/info/v1/metric.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/CONTRIBUTING.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/google/gofuzz/fuzz.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/map.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/merge.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/imdario/mergo/mergo.go (100%) rename Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/doc.go => vendor/github.com/inconshreveable/mousetrap/LICENSE (79%) create mode 100644 vendor/github.com/inconshreveable/mousetrap/README.md create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_others.go create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows.go create mode 100644 vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go rename {Godeps/_workspace/src => vendor}/github.com/juju/ratelimit/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/juju/ratelimit/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/juju/ratelimit/ratelimit.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/juju/ratelimit/reader.go (100%) create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/mitchellh/mapstructure/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/mitchellh/mapstructure/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/mitchellh/mapstructure/decode_hooks.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/mitchellh/mapstructure/error.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/mitchellh/mapstructure/mapstructure.go (100%) create mode 100644 vendor/github.com/opencontainers/runc/LICENSE create mode 100644 vendor/github.com/opencontainers/runc/NOTICE rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/cgroups.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/cgroups_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuacct.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/fs_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/name.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_cls.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_prio.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/perf_event.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/pids.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/fs/utils.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/stats.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/cgroups/utils.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/blkio_device.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/cgroup_unix.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/cgroup_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/cgroup_windows.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/config.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/config_unix.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/device.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/hugepage_limit.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/interface_priority_map.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/mount.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/namespaces.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/namespaces_syscall.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/namespaces_syscall_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/namespaces_unix.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/namespaces_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/configs/network.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/proc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/setns_linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/syscall_linux_arm.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/sysconfig.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/sysconfig_notcgo.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/opencontainers/runc/libcontainer/system/xattrs_linux.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/CONTRIBUTORS (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/dce.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/hash.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/json.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/node.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/time.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/util.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/uuid.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/version1.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/pborman/uuid/version4.go (100%) rename {Godeps/_workspace/src/github.com/prometheus/procfs => vendor/github.com/prometheus/client_golang}/LICENSE (100%) create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/.gitignore (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/collector.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/counter.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/desc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/expvar.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/gauge.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/go_collector.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/histogram.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/http.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/metric.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/process_collector.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/push.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/registry.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/summary.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/untyped.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/value.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_golang/prometheus/vec.go (100%) create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE rename {Godeps/_workspace/src => vendor}/github.com/prometheus/client_model/go/metrics.pb.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/encode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/expfmt.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/fuzz.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/json_decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/text_create.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/expfmt/text_parse.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/fingerprinting.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/labels.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/labelset.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/metric.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/model.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/signature.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/time.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/common/model/value.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/AUTHORS.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/CONTRIBUTING.md (100%) create mode 100644 vendor/github.com/prometheus/procfs/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/NOTICE (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/fs.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/proc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/proc_limits.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/proc_stat.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/prometheus/procfs/stat.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/.gitignore (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/.mailmap (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/LICENSE.txt (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/bash_completions.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/bash_completions.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/cobra.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/command.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/command_notwin.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/cobra/command_win.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/bool.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/count.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/duration.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/flag.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/float32.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/float64.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/golangflag.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/int.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/int32.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/int64.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/int8.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/int_slice.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/ip.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/ipmask.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/ipnet.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/string.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/string_slice.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/uint.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/uint16.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/uint32.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/uint64.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/spf13/pflag/uint8.go (100%) create mode 100644 vendor/github.com/ugorji/go/LICENSE rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/0doc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/README.md (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/binc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/cbor.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/decode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/encode.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/fast-path.generated.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/fast-path.go.tmpl (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/fast-path.not.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen-dec-array.go.tmpl (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen-dec-map.go.tmpl (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen-helper.generated.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen-helper.go.tmpl (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen.generated.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/gen.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/helper.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/helper_internal.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/helper_not_unsafe.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/helper_unsafe.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/json.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/msgpack.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/noop.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/prebuild.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/prebuild.sh (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/rpc.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/simple.go (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/test-cbor-goldens.json (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/test.py (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/tests.sh (100%) rename {Godeps/_workspace/src => vendor}/github.com/ugorji/go/codec/time.go (100%) create mode 100644 vendor/golang.org/x/net/LICENSE create mode 100644 vendor/golang.org/x/net/PATENTS rename {Godeps/_workspace/src => vendor}/golang.org/x/net/context/context.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/net/context/ctxhttp/cancelreq.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/net/context/ctxhttp/cancelreq_go14.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/net/context/ctxhttp/ctxhttp.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/AUTHORS (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/CONTRIBUTING.md (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/CONTRIBUTORS (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/README.md (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/client_appengine.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/google/appengine.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/google/appengine_hook.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/google/default.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/google/google.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/google/sdk.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/internal/oauth2.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/internal/token.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/internal/transport.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/jws/jws.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/jwt/jwt.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/oauth2.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/token.go (100%) rename {Godeps/_workspace/src => vendor}/golang.org/x/oauth2/transport.go (100%) create mode 100644 vendor/google.golang.org/api/LICENSE rename {Godeps/_workspace/src => vendor}/google.golang.org/api/compute/v1/compute-api.json (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/compute/v1/compute-gen.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/container/v1/container-api.json (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/container/v1/container-gen.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/gensupport/doc.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/gensupport/json.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/gensupport/media.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/gensupport/params.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/googleapi/googleapi.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/googleapi/internal/uritemplates/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/googleapi/internal/uritemplates/uritemplates.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/googleapi/internal/uritemplates/utils.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/api/googleapi/types.go (100%) create mode 100644 vendor/google.golang.org/cloud/LICENSE rename {Godeps/_workspace/src => vendor}/google.golang.org/cloud/compute/metadata/metadata.go (100%) rename {Godeps/_workspace/src => vendor}/google.golang.org/cloud/internal/cloud.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/README (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/go1_0.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/go1_2.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/read.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/scanner/errors.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/scanner/scanner.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/set.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/token/position.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/token/serialize.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/token/token.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/types/bool.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/types/doc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/types/enum.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/types/int.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/gcfg.v1/types/scan.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/.travis.yml (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/LICENSE.libyaml (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/README.md (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/apic.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/decode.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/emitterc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/encode.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/parserc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/readerc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/resolve.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/scannerc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/sorter.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/writerc.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/yaml.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/yamlh.go (100%) rename {Godeps/_workspace/src => vendor}/gopkg.in/yaml.v2/yamlprivateh.go (100%) create mode 100644 vendor/k8s.io/heapster/LICENSE rename {Godeps/_workspace/src => vendor}/k8s.io/heapster/metrics/api/v1/types/model_types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/heapster/metrics/api/v1/types/types.go (100%) create mode 100644 vendor/k8s.io/kubernetes/LICENSE rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/federation/apis/federation/v1alpha1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/context.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/endpoints/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/errors/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/errors/errors.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/field_constants.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/generate.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/mapper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/errors.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/help.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/interfaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/meta.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/multirestmapper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/priority.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/meta/restmapper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/node_example.json (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/pod/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/pod_example.json (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/ref.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/replication_controller_example.json (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/requestcontext.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/quantity.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/quantity_proto.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/scale_int.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource/suffix.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/resource_helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/create.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/delete.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/export.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/rest.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/rest/update.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/service/annotations.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/service/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/testapi/testapi.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/duration.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/group_version.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/time.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/time_proto.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/validation/validation.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/unversioned/well_known_labels.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/util/group_version.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/v1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/validation/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/validation/events.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/validation/name.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/validation/schema.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/api/validation/validation.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apimachinery/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apimachinery/registered/registered.go (97%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apimachinery/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/apps/v1alpha1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/authorization/v1beta1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/autoscaling/v1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/batch/v1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/extensions/validation/validation.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/types.generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/metrics/v1alpha1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/install/install.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/conversion_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/apis/policy/v1alpha1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/auth/user/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/auth/user/user.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/capabilities/capabilities.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/capabilities/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/delta_fifo.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/expiration_cache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/expiration_cache_fakes.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/fifo.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/index.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/listers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/listwatch.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/reflector.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/store.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/thread_safe_store.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/cache/undelta_store.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/clientset.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/import_known_versions.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/batch_client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/generated_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/job.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/componentstatus.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/configmap.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/core_client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/endpoints.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/event.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/event_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/generated_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/limitrange.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/namespace.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/namespace_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/node.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/persistentvolume.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/persistentvolumeclaim.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/pod.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/pod_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/podtemplate.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/replicationcontroller.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/resourcequota.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/secret.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/service.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/service_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/serviceaccount.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/daemonset.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/deployment.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/deployment_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/extensions_client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/generated_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/horizontalpodautoscaler.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/ingress.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/job.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/replicaset.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/scale.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/scale_expansion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/thirdpartyresource.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/metrics/metrics.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/record/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/record/event.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/record/events_cache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/record/fake.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/config.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/plugin.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/request.go (99%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/transport.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/url_utils.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/urlbackoff.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/restclient/versions.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/transport/cache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/transport/config.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/transport/round_trippers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/transport/transport.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/typed/discovery/discovery_client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset/clientset_adaption.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/apps.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/autoscaling.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/batch.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest/latest.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/auth_loaders.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/config.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/merged_client_builder.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/overrides.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/componentstatuses.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/conditions.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/configmap.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/containerinfo.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/deployment.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/endpoints.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/events.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/extensions.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/flags.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/helper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/import_known_versions.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/ingress.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/jobs.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/namespaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/nodes.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumes.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/pet_sets.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/pod_templates.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/pods.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/replica_sets.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/scale.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/secrets.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/service_accounts.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/services.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/cloud.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/plugins.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce.go (97%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/token_source.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/controller_utils.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/framework/controller.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/framework/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/framework/fake_controller_source.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/framework/shared_informer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/lookup_cache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/podautoscaler/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/cloner.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/converter.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/deep_equal.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/helper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/queryparams/convert.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/conversion/queryparams/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/config.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/keyring.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/plugins.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/credentialprovider/provider.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/fieldpath/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/fieldpath/fieldpath.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/fields/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/fields/fields.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/fields/selector.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/healthz/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/healthz/healthz.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/apply.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/autoscale.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/bash_comp_utils.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/cmd/util/clientcache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/cmd/util/helpers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/cmd/util/printing.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/configmap.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/custom_column_printer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/describe.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/explain.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/generate.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/history.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/interfaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/kubectl.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/namespace.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/proxy_server.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/builder.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/helper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/interfaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/mapper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/result.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/selector.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource/visitor.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/resource_printer.go (99%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/rollback.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/rolling_updater.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/run.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/scale.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/secret.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/secret_for_docker_registry.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/service.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/serviceaccount.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/sorted_event_list.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/sorted_resource_name_list.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/sorting_printer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/stop.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/version.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubectl/watchloop.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubelet/qos/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubelet/qos/memory_policy.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/kubelet/qos/util/qos.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/labels/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/labels/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/labels/labels.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/labels/selector.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/master/ports/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/master/ports/ports.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/generic/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/generic/matcher.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/generic/options.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/generic/storage_decorator.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/codec.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/registry.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/OWNERS (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/codec.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/codec_check.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/conversion.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/embedded.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/error.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/extension.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/helper.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/interfaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/scheme.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/codec_factory.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/json/json.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/json/meta.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/negotiated_codec.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/protobuf.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/protobuf_extension.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/recognizer/recognizer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/streaming/streaming.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/serializer/versioning/versioning.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/swagger_doc_generator.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/types_proto.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/runtime/unstructured.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/cacher.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/errors.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/interfaces.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/storage/watch_cache.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/types/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/types/namespacedname.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/types/uid.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/types/unix_user_id.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/clock.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/crypto/crypto.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/deployment/deployment.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/errors/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/errors/errors.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/flag/flags.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/flag/tristate.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/flowcontrol/backoff.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/flowcontrol/throttle.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/framer/framer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/hash/hash.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/homedir/homedir.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/integer/integer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/intstr/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/intstr/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/intstr/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/intstr/intstr.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/json/json.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/jsonpath/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/jsonpath/jsonpath.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/jsonpath/node.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/jsonpath/parser.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/labels/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/labels/labels.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/line_delimiter.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/logs.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/http.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/interface.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/port_range.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/port_split.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/sets/README.md (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/net/sets/ipnet.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/parsers/parsers.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/pod/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/pod/pod.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/rand/rand.go (83%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/resource_container_linux.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/resource_container_unsupported.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/runner.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/runtime/runtime.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/byte.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/deep_copy_generated.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/empty.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/int.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/int64.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/sets/string.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/strategicpatch/patch.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/string_flag.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/template.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/trace.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/umask.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/umask_windows.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/util.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/uuid.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/validation/field/errors.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/validation/field/path.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/validation/validation.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/wait/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/wait/wait.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/workqueue/delaying_queue.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/workqueue/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/workqueue/parallelizer.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/workqueue/queue.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/util/yaml/decoder.go (92%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/version/.gitattributes (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/version/base.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/version/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/version/semver.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/version/version.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/doc.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/filter.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/mux.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/streamwatcher.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/until.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/decoder.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/encoder.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/generated.pb.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/generated.proto (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/register.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/versioned/types.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/pkg/watch/watch.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/plugin/pkg/client/auth/gcp/gcp.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/plugin/pkg/client/auth/plugins.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/forked/json/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/forked/json/fields.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/forked/reflect/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/forked/reflect/deep_equal.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/golang/template/exec.go (100%) rename {Godeps/_workspace/src => vendor}/k8s.io/kubernetes/third_party/golang/template/funcs.go (100%) rename {Godeps/_workspace/src => vendor}/speter.net/go/exp/math/dec/inf/LICENSE (100%) rename {Godeps/_workspace/src => vendor}/speter.net/go/exp/math/dec/inf/dec.go (100%) rename {Godeps/_workspace/src => vendor}/speter.net/go/exp/math/dec/inf/rounder.go (100%) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 70c78a2bf..f89d5c711 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1,6 +1,7 @@ { "ImportPath": "k8s.io/contrib/ingress", - "GoVersion": "go1.6", + "GoVersion": "go1.5", + "GodepVersion": "v65", "Packages": [ "./..." ], @@ -43,6 +44,41 @@ "Comment": "v0.3.1-62-g3d72d39", "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" }, + { + "ImportPath": "github.com/docker/engine-api/types/blkiodev", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/container", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/filters", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/network", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/registry", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/strslice", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, + { + "ImportPath": "github.com/docker/engine-api/types/versions", + "Comment": "v0.3.1-62-g3d72d39", + "Rev": "3d72d392d07bece8d7d7b2a3b6b2e57c2df376a2" + }, { "ImportPath": "github.com/docker/go-connections/nat", "Comment": "v0.2.0-2-gf549a93", @@ -58,6 +94,16 @@ "Comment": "v1.2-34-g496d495", "Rev": "496d495156da218b9912f03dfa7df7f80fbd8cc3" }, + { + "ImportPath": "github.com/emicklei/go-restful/log", + "Comment": "v1.2-34-g496d495", + "Rev": "496d495156da218b9912f03dfa7df7f80fbd8cc3" + }, + { + "ImportPath": "github.com/emicklei/go-restful/swagger", + "Comment": "v1.2-34-g496d495", + "Rev": "496d495156da218b9912f03dfa7df7f80fbd8cc3" + }, { "ImportPath": "github.com/evanphx/json-patch", "Rev": "7dd4489c2eb6073e5a9d7746c3274c5b5f0387df" @@ -101,6 +147,10 @@ "Comment": "0.1.3-8-g6633656", "Rev": "6633656539c1639d9d78127b7d47c622b5d7b6dc" }, + { + "ImportPath": "github.com/inconshreveable/mousetrap", + "Rev": "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + }, { "ImportPath": "github.com/juju/ratelimit", "Rev": "77ed1c8a01217656d2080ad51981f6e99adaa177" @@ -118,6 +168,11 @@ "Comment": "v0.0.7", "Rev": "7ca2aa4873aea7cb4265b1726acb24b90d8726c6" }, + { + "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/fs", + "Comment": "v0.0.7", + "Rev": "7ca2aa4873aea7cb4265b1726acb24b90d8726c6" + }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs", "Comment": "v0.0.7", @@ -170,10 +225,30 @@ "ImportPath": "golang.org/x/net/context", "Rev": "c2528b2dd8352441850638a8bb678c2ad056fd3e" }, + { + "ImportPath": "golang.org/x/net/context/ctxhttp", + "Rev": "c2528b2dd8352441850638a8bb678c2ad056fd3e" + }, { "ImportPath": "golang.org/x/oauth2", "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" }, + { + "ImportPath": "golang.org/x/oauth2/google", + "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + }, + { + "ImportPath": "golang.org/x/oauth2/internal", + "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + }, + { + "ImportPath": "golang.org/x/oauth2/jws", + "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + }, + { + "ImportPath": "golang.org/x/oauth2/jwt", + "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + }, { "ImportPath": "google.golang.org/api/compute/v1", "Rev": "77e7d383beb96054547729f49c372b3d01e196ff" @@ -190,6 +265,10 @@ "ImportPath": "google.golang.org/api/googleapi", "Rev": "77e7d383beb96054547729f49c372b3d01e196ff" }, + { + "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", + "Rev": "77e7d383beb96054547729f49c372b3d01e196ff" + }, { "ImportPath": "google.golang.org/cloud/compute/metadata", "Rev": "eb47ba841d53d93506cfbfbc03927daf9cc48f88" @@ -202,6 +281,18 @@ "ImportPath": "gopkg.in/gcfg.v1", "Rev": "083575c3955c85df16fe9590cceab64d03f5eb6e" }, + { + "ImportPath": "gopkg.in/gcfg.v1/scanner", + "Rev": "083575c3955c85df16fe9590cceab64d03f5eb6e" + }, + { + "ImportPath": "gopkg.in/gcfg.v1/token", + "Rev": "083575c3955c85df16fe9590cceab64d03f5eb6e" + }, + { + "ImportPath": "gopkg.in/gcfg.v1/types", + "Rev": "083575c3955c85df16fe9590cceab64d03f5eb6e" + }, { "ImportPath": "gopkg.in/yaml.v2", "Rev": "a83829b6f1293c91addabc89d0571c246397bbf4" @@ -213,223 +304,648 @@ }, { "ImportPath": "k8s.io/kubernetes/federation/apis/federation", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/federation/apis/federation/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/federation/apis/federation/v1alpha1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/api", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/endpoints", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/errors", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/meta", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/pod", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/resource", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/rest", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/service", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/testapi", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/unversioned", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/unversioned/validation", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/util", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/v1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/api/validation", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apimachinery", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apimachinery/registered", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1alpha1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/validation", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/metrics", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/metrics/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/metrics/v1alpha1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/install", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/v1alpha1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/user", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/capabilities", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/cache", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/metrics", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/record", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/restclient", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/transport", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/typed/discovery", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/auth", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/controller/framework", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/conversion", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/conversion/queryparams", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/fieldpath", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/fields", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/healthz", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/kubectl/cmd/util", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/kubectl/resource", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos/util", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/labels", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/master/ports", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/generic", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/json", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/protobuf", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/recognizer", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/streaming", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/versioning", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/types", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/util", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/crypto", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/deployment", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/errors", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/flag", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/flowcontrol", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/framer", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/hash", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/homedir", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/integer", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/intstr", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/json", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/jsonpath", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/labels", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/net", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/net/sets", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/parsers", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/pod", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/rand", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/runtime", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/sets", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/strategicpatch", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/validation", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/validation/field", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/wait", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/workqueue", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/util/yaml", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/version", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/pkg/watch", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/pkg/watch/versioned", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/client/auth", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" + }, + { + "ImportPath": "k8s.io/kubernetes/plugin/pkg/client/auth/gcp", + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/json", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/reflect", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "k8s.io/kubernetes/third_party/golang/template", - "Comment": "v1.3.0-alpha.3-473-g41b7b04", - "Rev": "41b7b04fafecd22127a96fc51a87b2ea34418ffc" + "Comment": "v1.3.0-alpha.3-574-gdee2433", + "Rev": "dee24333ffe6942519476bb1db4c7d6eadf65cdb" }, { "ImportPath": "speter.net/go/exp/math/dec/inf", diff --git a/Godeps/_workspace/.gitignore b/Godeps/_workspace/.gitignore deleted file mode 100644 index f037d684e..000000000 --- a/Godeps/_workspace/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/pkg -/bin diff --git a/Godeps/_workspace/src/bitbucket.org/ww/goautoneg/autoneg_test.go b/Godeps/_workspace/src/bitbucket.org/ww/goautoneg/autoneg_test.go deleted file mode 100644 index 41d328f1d..000000000 --- a/Godeps/_workspace/src/bitbucket.org/ww/goautoneg/autoneg_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package goautoneg - -import ( - "testing" -) - -var chrome = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" - -func TestParseAccept(t *testing.T) { - alternatives := []string{"text/html", "image/png"} - content_type := Negotiate(chrome, alternatives) - if content_type != "image/png" { - t.Errorf("got %s expected image/png", content_type) - } - - alternatives = []string{"text/html", "text/plain", "text/n3"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/html" { - t.Errorf("got %s expected text/html", content_type) - } - - alternatives = []string{"text/n3", "text/plain"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/plain" { - t.Errorf("got %s expected text/plain", content_type) - } - - alternatives = []string{"text/n3", "application/rdf+xml"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/n3" { - t.Errorf("got %s expected text/n3", content_type) - } -} diff --git a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/bench_test.go b/Godeps/_workspace/src/github.com/beorn7/perks/quantile/bench_test.go deleted file mode 100644 index 0bd0e4e77..000000000 --- a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/bench_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package quantile - -import ( - "testing" -) - -func BenchmarkInsertTargeted(b *testing.B) { - b.ReportAllocs() - - s := NewTargeted(Targets) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertTargetedSmallEpsilon(b *testing.B) { - s := NewTargeted(TargetsSmallEpsilon) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertBiased(b *testing.B) { - s := NewLowBiased(0.01) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertBiasedSmallEpsilon(b *testing.B) { - s := NewLowBiased(0.0001) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkQuery(b *testing.B) { - s := NewTargeted(Targets) - for i := float64(0); i < 1e6; i++ { - s.Insert(i) - } - b.ResetTimer() - n := float64(b.N) - for i := float64(0); i < n; i++ { - s.Query(i / n) - } -} - -func BenchmarkQuerySmallEpsilon(b *testing.B) { - s := NewTargeted(TargetsSmallEpsilon) - for i := float64(0); i < 1e6; i++ { - s.Insert(i) - } - b.ResetTimer() - n := float64(b.N) - for i := float64(0); i < n; i++ { - s.Query(i / n) - } -} diff --git a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/example_test.go b/Godeps/_workspace/src/github.com/beorn7/perks/quantile/example_test.go deleted file mode 100644 index ab3293aaf..000000000 --- a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/example_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build go1.1 - -package quantile_test - -import ( - "bufio" - "fmt" - "log" - "os" - "strconv" - "time" - - "github.com/beorn7/perks/quantile" -) - -func Example_simple() { - ch := make(chan float64) - go sendFloats(ch) - - // Compute the 50th, 90th, and 99th percentile. - q := quantile.NewTargeted(map[float64]float64{ - 0.50: 0.005, - 0.90: 0.001, - 0.99: 0.0001, - }) - for v := range ch { - q.Insert(v) - } - - fmt.Println("perc50:", q.Query(0.50)) - fmt.Println("perc90:", q.Query(0.90)) - fmt.Println("perc99:", q.Query(0.99)) - fmt.Println("count:", q.Count()) - // Output: - // perc50: 5 - // perc90: 16 - // perc99: 223 - // count: 2388 -} - -func Example_mergeMultipleStreams() { - // Scenario: - // We have multiple database shards. On each shard, there is a process - // collecting query response times from the database logs and inserting - // them into a Stream (created via NewTargeted(0.90)), much like the - // Simple example. These processes expose a network interface for us to - // ask them to serialize and send us the results of their - // Stream.Samples so we may Merge and Query them. - // - // NOTES: - // * These sample sets are small, allowing us to get them - // across the network much faster than sending the entire list of data - // points. - // - // * For this to work correctly, we must supply the same quantiles - // a priori the process collecting the samples supplied to NewTargeted, - // even if we do not plan to query them all here. - ch := make(chan quantile.Samples) - getDBQuerySamples(ch) - q := quantile.NewTargeted(map[float64]float64{0.90: 0.001}) - for samples := range ch { - q.Merge(samples) - } - fmt.Println("perc90:", q.Query(0.90)) -} - -func Example_window() { - // Scenario: We want the 90th, 95th, and 99th percentiles for each - // minute. - - ch := make(chan float64) - go sendStreamValues(ch) - - tick := time.NewTicker(1 * time.Minute) - q := quantile.NewTargeted(map[float64]float64{ - 0.90: 0.001, - 0.95: 0.0005, - 0.99: 0.0001, - }) - for { - select { - case t := <-tick.C: - flushToDB(t, q.Samples()) - q.Reset() - case v := <-ch: - q.Insert(v) - } - } -} - -func sendStreamValues(ch chan float64) { - // Use your imagination -} - -func flushToDB(t time.Time, samples quantile.Samples) { - // Use your imagination -} - -// This is a stub for the above example. In reality this would hit the remote -// servers via http or something like it. -func getDBQuerySamples(ch chan quantile.Samples) {} - -func sendFloats(ch chan<- float64) { - f, err := os.Open("exampledata.txt") - if err != nil { - log.Fatal(err) - } - sc := bufio.NewScanner(f) - for sc.Scan() { - b := sc.Bytes() - v, err := strconv.ParseFloat(string(b), 64) - if err != nil { - log.Fatal(err) - } - ch <- v - } - if sc.Err() != nil { - log.Fatal(sc.Err()) - } - close(ch) -} diff --git a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/stream_test.go b/Godeps/_workspace/src/github.com/beorn7/perks/quantile/stream_test.go deleted file mode 100644 index 4dba05449..000000000 --- a/Godeps/_workspace/src/github.com/beorn7/perks/quantile/stream_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package quantile - -import ( - "math" - "math/rand" - "sort" - "testing" -) - -var ( - Targets = map[float64]float64{ - 0.01: 0.001, - 0.10: 0.01, - 0.50: 0.05, - 0.90: 0.01, - 0.99: 0.001, - } - TargetsSmallEpsilon = map[float64]float64{ - 0.01: 0.0001, - 0.10: 0.001, - 0.50: 0.005, - 0.90: 0.001, - 0.99: 0.0001, - } - LowQuantiles = []float64{0.01, 0.1, 0.5} - HighQuantiles = []float64{0.99, 0.9, 0.5} -) - -const RelativeEpsilon = 0.01 - -func verifyPercsWithAbsoluteEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for quantile, epsilon := range Targets { - n := float64(len(a)) - k := int(quantile * n) - lower := int((quantile - epsilon) * n) - if lower < 1 { - lower = 1 - } - upper := int(math.Ceil((quantile + epsilon) * n)) - if upper > len(a) { - upper = len(a) - } - w, min, max := a[k-1], a[lower-1], a[upper-1] - if g := s.Query(quantile); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", quantile, w, min, max, g) - } - } -} - -func verifyLowPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for _, qu := range LowQuantiles { - n := float64(len(a)) - k := int(qu * n) - - lowerRank := int((1 - RelativeEpsilon) * qu * n) - upperRank := int(math.Ceil((1 + RelativeEpsilon) * qu * n)) - w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] - if g := s.Query(qu); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) - } - } -} - -func verifyHighPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for _, qu := range HighQuantiles { - n := float64(len(a)) - k := int(qu * n) - - lowerRank := int((1 - (1+RelativeEpsilon)*(1-qu)) * n) - upperRank := int(math.Ceil((1 - (1-RelativeEpsilon)*(1-qu)) * n)) - w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] - if g := s.Query(qu); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) - } - } -} - -func populateStream(s *Stream) []float64 { - a := make([]float64, 0, 1e5+100) - for i := 0; i < cap(a); i++ { - v := rand.NormFloat64() - // Add 5% asymmetric outliers. - if i%20 == 0 { - v = v*v + 1 - } - s.Insert(v) - a = append(a, v) - } - return a -} - -func TestTargetedQuery(t *testing.T) { - rand.Seed(42) - s := NewTargeted(Targets) - a := populateStream(s) - verifyPercsWithAbsoluteEpsilon(t, a, s) -} - -func TestLowBiasedQuery(t *testing.T) { - rand.Seed(42) - s := NewLowBiased(RelativeEpsilon) - a := populateStream(s) - verifyLowPercsWithRelativeEpsilon(t, a, s) -} - -func TestHighBiasedQuery(t *testing.T) { - rand.Seed(42) - s := NewHighBiased(RelativeEpsilon) - a := populateStream(s) - verifyHighPercsWithRelativeEpsilon(t, a, s) -} - -// BrokenTestTargetedMerge is broken, see Merge doc comment. -func BrokenTestTargetedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewTargeted(Targets) - s2 := NewTargeted(Targets) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyPercsWithAbsoluteEpsilon(t, a, s1) -} - -// BrokenTestLowBiasedMerge is broken, see Merge doc comment. -func BrokenTestLowBiasedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewLowBiased(RelativeEpsilon) - s2 := NewLowBiased(RelativeEpsilon) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyLowPercsWithRelativeEpsilon(t, a, s2) -} - -// BrokenTestHighBiasedMerge is broken, see Merge doc comment. -func BrokenTestHighBiasedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewHighBiased(RelativeEpsilon) - s2 := NewHighBiased(RelativeEpsilon) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyHighPercsWithRelativeEpsilon(t, a, s2) -} - -func TestUncompressed(t *testing.T) { - q := NewTargeted(Targets) - for i := 100; i > 0; i-- { - q.Insert(float64(i)) - } - if g := q.Count(); g != 100 { - t.Errorf("want count 100, got %d", g) - } - // Before compression, Query should have 100% accuracy. - for quantile := range Targets { - w := quantile * 100 - if g := q.Query(quantile); g != w { - t.Errorf("want %f, got %f", w, g) - } - } -} - -func TestUncompressedSamples(t *testing.T) { - q := NewTargeted(map[float64]float64{0.99: 0.001}) - for i := 1; i <= 100; i++ { - q.Insert(float64(i)) - } - if g := q.Samples().Len(); g != 100 { - t.Errorf("want count 100, got %d", g) - } -} - -func TestUncompressedOne(t *testing.T) { - q := NewTargeted(map[float64]float64{0.99: 0.01}) - q.Insert(3.14) - if g := q.Query(0.90); g != 3.14 { - t.Error("want PI, got", g) - } -} - -func TestDefaults(t *testing.T) { - if g := NewTargeted(map[float64]float64{0.99: 0.001}).Query(0.99); g != 0 { - t.Errorf("want 0, got %f", g) - } -} diff --git a/Godeps/_workspace/src/github.com/blang/semver/examples/main.go b/Godeps/_workspace/src/github.com/blang/semver/examples/main.go deleted file mode 100644 index f36c983d9..000000000 --- a/Godeps/_workspace/src/github.com/blang/semver/examples/main.go +++ /dev/null @@ -1,83 +0,0 @@ -package main - -import ( - "fmt" - "github.com/blang/semver" -) - -func main() { - v, err := semver.Parse("0.0.1-alpha.preview.222+123.github") - if err != nil { - fmt.Printf("Error while parsing (not valid): %q", err) - } - fmt.Printf("Version to string: %q\n", v) - - fmt.Printf("Major: %d\n", v.Major) - fmt.Printf("Minor: %d\n", v.Minor) - fmt.Printf("Patch: %d\n", v.Patch) - - // Prerelease versions - if len(v.Pre) > 0 { - fmt.Println("Prerelease versions:") - for i, pre := range v.Pre { - fmt.Printf("%d: %q\n", i, pre) - } - } - - // Build meta data - if len(v.Build) > 0 { - fmt.Println("Build meta data:") - for i, build := range v.Build { - fmt.Printf("%d: %q\n", i, build) - } - } - - // Make == Parse (Value), New for Pointer - v001, err := semver.Make("0.0.1") - - fmt.Println("\nUse Version.Compare for comparisons (-1, 0, 1):") - fmt.Printf("%q is greater than %q: Compare == %d\n", v001, v, v001.Compare(v)) - fmt.Printf("%q is less than %q: Compare == %d\n", v, v001, v.Compare(v001)) - fmt.Printf("%q is equal to %q: Compare == %d\n", v, v, v.Compare(v)) - - fmt.Println("\nUse comparison helpers returning booleans:") - fmt.Printf("%q is greater than %q: %t\n", v001, v, v001.GT(v)) - fmt.Printf("%q is greater than equal %q: %t\n", v001, v, v001.GTE(v)) - fmt.Printf("%q is greater than equal %q: %t\n", v, v, v.GTE(v)) - fmt.Printf("%q is less than %q: %t\n", v, v001, v.LT(v001)) - fmt.Printf("%q is less than equal %q: %t\n", v, v001, v.LTE(v001)) - fmt.Printf("%q is less than equal %q: %t\n", v, v, v.LTE(v)) - - fmt.Println("\nManipulate Version in place:") - v.Pre[0], err = semver.NewPRVersion("beta") - if err != nil { - fmt.Printf("Error parsing pre release version: %q", err) - } - fmt.Printf("Version to string: %q\n", v) - - fmt.Println("\nCompare Prerelease versions:") - pre1, _ := semver.NewPRVersion("123") - pre2, _ := semver.NewPRVersion("alpha") - pre3, _ := semver.NewPRVersion("124") - fmt.Printf("%q is less than %q: Compare == %d\n", pre1, pre2, pre1.Compare(pre2)) - fmt.Printf("%q is greater than %q: Compare == %d\n", pre3, pre1, pre3.Compare(pre1)) - fmt.Printf("%q is equal to %q: Compare == %d\n", pre1, pre1, pre1.Compare(pre1)) - - fmt.Println("\nValidate versions:") - v.Build[0] = "?" - - err = v.Validate() - if err != nil { - fmt.Printf("Validation failed: %s\n", err) - } - - fmt.Println("Create valid build meta data:") - b1, _ := semver.NewBuildVersion("build123") - v.Build[0] = b1 - fmt.Printf("Version with new build version %q\n", v) - - _, err = semver.NewBuildVersion("build?123") - if err != nil { - fmt.Printf("Create build version failed: %s\n", err) - } -} diff --git a/Godeps/_workspace/src/github.com/blang/semver/json_test.go b/Godeps/_workspace/src/github.com/blang/semver/json_test.go deleted file mode 100644 index 039117da9..000000000 --- a/Godeps/_workspace/src/github.com/blang/semver/json_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package semver - -import ( - "encoding/json" - "strconv" - "testing" -) - -func TestJSONMarshal(t *testing.T) { - versionString := "3.1.4-alpha.1.5.9+build.2.6.5" - v, err := Parse(versionString) - if err != nil { - t.Fatal(err) - } - - versionJSON, err := json.Marshal(v) - if err != nil { - t.Fatal(err) - } - - quotedVersionString := strconv.Quote(versionString) - - if string(versionJSON) != quotedVersionString { - t.Fatalf("JSON marshaled semantic version not equal: expected %q, got %q", quotedVersionString, string(versionJSON)) - } -} - -func TestJSONUnmarshal(t *testing.T) { - versionString := "3.1.4-alpha.1.5.9+build.2.6.5" - quotedVersionString := strconv.Quote(versionString) - - var v Version - if err := json.Unmarshal([]byte(quotedVersionString), &v); err != nil { - t.Fatal(err) - } - - if v.String() != versionString { - t.Fatalf("JSON unmarshaled semantic version not equal: expected %q, got %q", versionString, v.String()) - } - - badVersionString := strconv.Quote("3.1.4.1.5.9.2.6.5-other-digits-of-pi") - if err := json.Unmarshal([]byte(badVersionString), &v); err == nil { - t.Fatal("expected JSON unmarshal error, got nil") - } -} diff --git a/Godeps/_workspace/src/github.com/blang/semver/semver_test.go b/Godeps/_workspace/src/github.com/blang/semver/semver_test.go deleted file mode 100644 index e56ebce05..000000000 --- a/Godeps/_workspace/src/github.com/blang/semver/semver_test.go +++ /dev/null @@ -1,417 +0,0 @@ -package semver - -import ( - "testing" -) - -func prstr(s string) PRVersion { - return PRVersion{s, 0, false} -} - -func prnum(i uint64) PRVersion { - return PRVersion{"", i, true} -} - -type formatTest struct { - v Version - result string -} - -var formatTests = []formatTest{ - {Version{1, 2, 3, nil, nil}, "1.2.3"}, - {Version{0, 0, 1, nil, nil}, "0.0.1"}, - {Version{0, 0, 1, []PRVersion{prstr("alpha"), prstr("preview")}, []string{"123", "456"}}, "0.0.1-alpha.preview+123.456"}, - {Version{1, 2, 3, []PRVersion{prstr("alpha"), prnum(1)}, []string{"123", "456"}}, "1.2.3-alpha.1+123.456"}, - {Version{1, 2, 3, []PRVersion{prstr("alpha"), prnum(1)}, nil}, "1.2.3-alpha.1"}, - {Version{1, 2, 3, nil, []string{"123", "456"}}, "1.2.3+123.456"}, - // Prereleases and build metadata hyphens - {Version{1, 2, 3, []PRVersion{prstr("alpha"), prstr("b-eta")}, []string{"123", "b-uild"}}, "1.2.3-alpha.b-eta+123.b-uild"}, - {Version{1, 2, 3, nil, []string{"123", "b-uild"}}, "1.2.3+123.b-uild"}, - {Version{1, 2, 3, []PRVersion{prstr("alpha"), prstr("b-eta")}, nil}, "1.2.3-alpha.b-eta"}, -} - -func TestStringer(t *testing.T) { - for _, test := range formatTests { - if res := test.v.String(); res != test.result { - t.Errorf("Stringer, expected %q but got %q", test.result, res) - } - } -} - -func TestParse(t *testing.T) { - for _, test := range formatTests { - if v, err := Parse(test.result); err != nil { - t.Errorf("Error parsing %q: %q", test.result, err) - } else if comp := v.Compare(test.v); comp != 0 { - t.Errorf("Parsing, expected %q but got %q, comp: %d ", test.v, v, comp) - } else if err := v.Validate(); err != nil { - t.Errorf("Error validating parsed version %q: %q", test.v, err) - } - } -} - -func TestMustParse(t *testing.T) { - _ = MustParse("32.2.1-alpha") -} - -func TestMustParse_panic(t *testing.T) { - defer func() { - if recover() == nil { - t.Errorf("Should have panicked") - } - }() - _ = MustParse("invalid version") -} - -func TestValidate(t *testing.T) { - for _, test := range formatTests { - if err := test.v.Validate(); err != nil { - t.Errorf("Error validating %q: %q", test.v, err) - } - } -} - -type compareTest struct { - v1 Version - v2 Version - result int -} - -var compareTests = []compareTest{ - {Version{1, 0, 0, nil, nil}, Version{1, 0, 0, nil, nil}, 0}, - {Version{2, 0, 0, nil, nil}, Version{1, 0, 0, nil, nil}, 1}, - {Version{0, 1, 0, nil, nil}, Version{0, 1, 0, nil, nil}, 0}, - {Version{0, 2, 0, nil, nil}, Version{0, 1, 0, nil, nil}, 1}, - {Version{0, 0, 1, nil, nil}, Version{0, 0, 1, nil, nil}, 0}, - {Version{0, 0, 2, nil, nil}, Version{0, 0, 1, nil, nil}, 1}, - {Version{1, 2, 3, nil, nil}, Version{1, 2, 3, nil, nil}, 0}, - {Version{2, 2, 4, nil, nil}, Version{1, 2, 4, nil, nil}, 1}, - {Version{1, 3, 3, nil, nil}, Version{1, 2, 3, nil, nil}, 1}, - {Version{1, 2, 4, nil, nil}, Version{1, 2, 3, nil, nil}, 1}, - - // Spec Examples #11 - {Version{1, 0, 0, nil, nil}, Version{2, 0, 0, nil, nil}, -1}, - {Version{2, 0, 0, nil, nil}, Version{2, 1, 0, nil, nil}, -1}, - {Version{2, 1, 0, nil, nil}, Version{2, 1, 1, nil, nil}, -1}, - - // Spec Examples #9 - {Version{1, 0, 0, nil, nil}, Version{1, 0, 0, []PRVersion{prstr("alpha")}, nil}, 1}, - {Version{1, 0, 0, []PRVersion{prstr("alpha")}, nil}, Version{1, 0, 0, []PRVersion{prstr("alpha"), prnum(1)}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("alpha"), prnum(1)}, nil}, Version{1, 0, 0, []PRVersion{prstr("alpha"), prstr("beta")}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("alpha"), prstr("beta")}, nil}, Version{1, 0, 0, []PRVersion{prstr("beta")}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("beta")}, nil}, Version{1, 0, 0, []PRVersion{prstr("beta"), prnum(2)}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("beta"), prnum(2)}, nil}, Version{1, 0, 0, []PRVersion{prstr("beta"), prnum(11)}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("beta"), prnum(11)}, nil}, Version{1, 0, 0, []PRVersion{prstr("rc"), prnum(1)}, nil}, -1}, - {Version{1, 0, 0, []PRVersion{prstr("rc"), prnum(1)}, nil}, Version{1, 0, 0, nil, nil}, -1}, - - // Ignore Build metadata - {Version{1, 0, 0, nil, []string{"1", "2", "3"}}, Version{1, 0, 0, nil, nil}, 0}, -} - -func TestCompare(t *testing.T) { - for _, test := range compareTests { - if res := test.v1.Compare(test.v2); res != test.result { - t.Errorf("Comparing %q : %q, expected %d but got %d", test.v1, test.v2, test.result, res) - } - //Test counterpart - if res := test.v2.Compare(test.v1); res != -test.result { - t.Errorf("Comparing %q : %q, expected %d but got %d", test.v2, test.v1, -test.result, res) - } - } -} - -type wrongformatTest struct { - v *Version - str string -} - -var wrongformatTests = []wrongformatTest{ - {nil, ""}, - {nil, "."}, - {nil, "1."}, - {nil, ".1"}, - {nil, "a.b.c"}, - {nil, "1.a.b"}, - {nil, "1.1.a"}, - {nil, "1.a.1"}, - {nil, "a.1.1"}, - {nil, ".."}, - {nil, "1.."}, - {nil, "1.1."}, - {nil, "1..1"}, - {nil, "1.1.+123"}, - {nil, "1.1.-beta"}, - {nil, "-1.1.1"}, - {nil, "1.-1.1"}, - {nil, "1.1.-1"}, - // giant numbers - {nil, "20000000000000000000.1.1"}, - {nil, "1.20000000000000000000.1"}, - {nil, "1.1.20000000000000000000"}, - {nil, "1.1.1-20000000000000000000"}, - // Leading zeroes - {nil, "01.1.1"}, - {nil, "001.1.1"}, - {nil, "1.01.1"}, - {nil, "1.001.1"}, - {nil, "1.1.01"}, - {nil, "1.1.001"}, - {nil, "1.1.1-01"}, - {nil, "1.1.1-001"}, - {nil, "1.1.1-beta.01"}, - {nil, "1.1.1-beta.001"}, - {&Version{0, 0, 0, []PRVersion{prstr("!")}, nil}, "0.0.0-!"}, - {&Version{0, 0, 0, nil, []string{"!"}}, "0.0.0+!"}, - // empty prversion - {&Version{0, 0, 0, []PRVersion{prstr(""), prstr("alpha")}, nil}, "0.0.0-.alpha"}, - // empty build meta data - {&Version{0, 0, 0, []PRVersion{prstr("alpha")}, []string{""}}, "0.0.0-alpha+"}, - {&Version{0, 0, 0, []PRVersion{prstr("alpha")}, []string{"test", ""}}, "0.0.0-alpha+test."}, -} - -func TestWrongFormat(t *testing.T) { - for _, test := range wrongformatTests { - - if res, err := Parse(test.str); err == nil { - t.Errorf("Parsing wrong format version %q, expected error but got %q", test.str, res) - } - - if test.v != nil { - if err := test.v.Validate(); err == nil { - t.Errorf("Validating wrong format version %q (%q), expected error", test.v, test.str) - } - } - } -} - -func TestCompareHelper(t *testing.T) { - v := Version{1, 0, 0, []PRVersion{prstr("alpha")}, nil} - v1 := Version{1, 0, 0, nil, nil} - if !v.EQ(v) { - t.Errorf("%q should be equal to %q", v, v) - } - if !v.Equals(v) { - t.Errorf("%q should be equal to %q", v, v) - } - if !v1.NE(v) { - t.Errorf("%q should not be equal to %q", v1, v) - } - if !v.GTE(v) { - t.Errorf("%q should be greater than or equal to %q", v, v) - } - if !v.LTE(v) { - t.Errorf("%q should be less than or equal to %q", v, v) - } - if !v.LT(v1) { - t.Errorf("%q should be less than %q", v, v1) - } - if !v.LTE(v1) { - t.Errorf("%q should be less than or equal %q", v, v1) - } - if !v.LE(v1) { - t.Errorf("%q should be less than or equal %q", v, v1) - } - if !v1.GT(v) { - t.Errorf("%q should be greater than %q", v1, v) - } - if !v1.GTE(v) { - t.Errorf("%q should be greater than or equal %q", v1, v) - } - if !v1.GE(v) { - t.Errorf("%q should be greater than or equal %q", v1, v) - } -} - -func TestPreReleaseVersions(t *testing.T) { - p1, err := NewPRVersion("123") - if !p1.IsNumeric() { - t.Errorf("Expected numeric prversion, got %q", p1) - } - if p1.VersionNum != 123 { - t.Error("Wrong prversion number") - } - if err != nil { - t.Errorf("Not expected error %q", err) - } - p2, err := NewPRVersion("alpha") - if p2.IsNumeric() { - t.Errorf("Expected non-numeric prversion, got %q", p2) - } - if p2.VersionStr != "alpha" { - t.Error("Wrong prversion string") - } - if err != nil { - t.Errorf("Not expected error %q", err) - } -} - -func TestBuildMetaDataVersions(t *testing.T) { - _, err := NewBuildVersion("123") - if err != nil { - t.Errorf("Unexpected error %q", err) - } - - _, err = NewBuildVersion("build") - if err != nil { - t.Errorf("Unexpected error %q", err) - } - - _, err = NewBuildVersion("test?") - if err == nil { - t.Error("Expected error, got none") - } - - _, err = NewBuildVersion("") - if err == nil { - t.Error("Expected error, got none") - } -} - -func TestNewHelper(t *testing.T) { - v, err := New("1.2.3") - if err != nil { - t.Fatalf("Unexpected error %q", err) - } - - // New returns pointer - if v == nil { - t.Fatal("Version is nil") - } - if v.Compare(Version{1, 2, 3, nil, nil}) != 0 { - t.Fatal("Unexpected comparison problem") - } -} - -func TestMakeHelper(t *testing.T) { - v, err := Make("1.2.3") - if err != nil { - t.Fatalf("Unexpected error %q", err) - } - if v.Compare(Version{1, 2, 3, nil, nil}) != 0 { - t.Fatal("Unexpected comparison problem") - } -} - -func BenchmarkParseSimple(b *testing.B) { - const VERSION = "0.0.1" - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - Parse(VERSION) - } -} - -func BenchmarkParseComplex(b *testing.B) { - const VERSION = "0.0.1-alpha.preview+123.456" - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - Parse(VERSION) - } -} - -func BenchmarkParseAverage(b *testing.B) { - l := len(formatTests) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - Parse(formatTests[n%l].result) - } -} - -func BenchmarkStringSimple(b *testing.B) { - const VERSION = "0.0.1" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.String() - } -} - -func BenchmarkStringLarger(b *testing.B) { - const VERSION = "11.15.2012" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.String() - } -} - -func BenchmarkStringComplex(b *testing.B) { - const VERSION = "0.0.1-alpha.preview+123.456" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.String() - } -} - -func BenchmarkStringAverage(b *testing.B) { - l := len(formatTests) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - formatTests[n%l].v.String() - } -} - -func BenchmarkValidateSimple(b *testing.B) { - const VERSION = "0.0.1" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.Validate() - } -} - -func BenchmarkValidateComplex(b *testing.B) { - const VERSION = "0.0.1-alpha.preview+123.456" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.Validate() - } -} - -func BenchmarkValidateAverage(b *testing.B) { - l := len(formatTests) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - formatTests[n%l].v.Validate() - } -} - -func BenchmarkCompareSimple(b *testing.B) { - const VERSION = "0.0.1" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.Compare(v) - } -} - -func BenchmarkCompareComplex(b *testing.B) { - const VERSION = "0.0.1-alpha.preview+123.456" - v, _ := Parse(VERSION) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - v.Compare(v) - } -} - -func BenchmarkCompareAverage(b *testing.B) { - l := len(compareTests) - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - compareTests[n%l].v1.Compare((compareTests[n%l].v2)) - } -} diff --git a/Godeps/_workspace/src/github.com/blang/semver/sort_test.go b/Godeps/_workspace/src/github.com/blang/semver/sort_test.go deleted file mode 100644 index 68893972a..000000000 --- a/Godeps/_workspace/src/github.com/blang/semver/sort_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package semver - -import ( - "reflect" - "testing" -) - -func TestSort(t *testing.T) { - v100, _ := Parse("1.0.0") - v010, _ := Parse("0.1.0") - v001, _ := Parse("0.0.1") - versions := []Version{v010, v100, v001} - Sort(versions) - - correct := []Version{v001, v010, v100} - if !reflect.DeepEqual(versions, correct) { - t.Fatalf("Sort returned wrong order: %s", versions) - } -} - -func BenchmarkSort(b *testing.B) { - v100, _ := Parse("1.0.0") - v010, _ := Parse("0.1.0") - v001, _ := Parse("0.0.1") - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - Sort([]Version{v010, v100, v001}) - } -} diff --git a/Godeps/_workspace/src/github.com/blang/semver/sql_test.go b/Godeps/_workspace/src/github.com/blang/semver/sql_test.go deleted file mode 100644 index ebf48b584..000000000 --- a/Godeps/_workspace/src/github.com/blang/semver/sql_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package semver - -import ( - "testing" -) - -type scanTest struct { - val interface{} - shouldError bool - expected string -} - -var scanTests = []scanTest{ - {"1.2.3", false, "1.2.3"}, - {[]byte("1.2.3"), false, "1.2.3"}, - {7, true, ""}, - {7e4, true, ""}, - {true, true, ""}, -} - -func TestScanString(t *testing.T) { - for _, tc := range scanTests { - s := &Version{} - err := s.Scan(tc.val) - if tc.shouldError { - if err == nil { - t.Fatalf("Scan did not return an error on %v (%T)", tc.val, tc.val) - } - } else { - if err != nil { - t.Fatalf("Scan returned an unexpected error: %s (%T) on %v (%T)", tc.val, tc.val, tc.val, tc.val) - } - if val, _ := s.Value(); val != tc.expected { - t.Errorf("Wrong Value returned, expected %q, got %q", tc.expected, val) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/common_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/common_test.go deleted file mode 100644 index 39b7525b3..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/common_test.go +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (c) 2013 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "fmt" - "reflect" - "testing" - - "github.com/davecgh/go-spew/spew" -) - -// custom type to test Stinger interface on non-pointer receiver. -type stringer string - -// String implements the Stringer interface for testing invocation of custom -// stringers on types with non-pointer receivers. -func (s stringer) String() string { - return "stringer " + string(s) -} - -// custom type to test Stinger interface on pointer receiver. -type pstringer string - -// String implements the Stringer interface for testing invocation of custom -// stringers on types with only pointer receivers. -func (s *pstringer) String() string { - return "stringer " + string(*s) -} - -// xref1 and xref2 are cross referencing structs for testing circular reference -// detection. -type xref1 struct { - ps2 *xref2 -} -type xref2 struct { - ps1 *xref1 -} - -// indirCir1, indirCir2, and indirCir3 are used to generate an indirect circular -// reference for testing detection. -type indirCir1 struct { - ps2 *indirCir2 -} -type indirCir2 struct { - ps3 *indirCir3 -} -type indirCir3 struct { - ps1 *indirCir1 -} - -// embed is used to test embedded structures. -type embed struct { - a string -} - -// embedwrap is used to test embedded structures. -type embedwrap struct { - *embed - e *embed -} - -// panicer is used to intentionally cause a panic for testing spew properly -// handles them -type panicer int - -func (p panicer) String() string { - panic("test panic") -} - -// customError is used to test custom error interface invocation. -type customError int - -func (e customError) Error() string { - return fmt.Sprintf("error: %d", int(e)) -} - -// stringizeWants converts a slice of wanted test output into a format suitable -// for a test error message. -func stringizeWants(wants []string) string { - s := "" - for i, want := range wants { - if i > 0 { - s += fmt.Sprintf("want%d: %s", i+1, want) - } else { - s += "want: " + want - } - } - return s -} - -// testFailed returns whether or not a test failed by checking if the result -// of the test is in the slice of wanted strings. -func testFailed(result string, wants []string) bool { - for _, want := range wants { - if result == want { - return false - } - } - return true -} - -type sortableStruct struct { - x int -} - -func (ss sortableStruct) String() string { - return fmt.Sprintf("ss.%d", ss.x) -} - -type unsortableStruct struct { - x int -} - -type sortTestCase struct { - input []reflect.Value - expected []reflect.Value -} - -func helpTestSortValues(tests []sortTestCase, cs *spew.ConfigState, t *testing.T) { - getInterfaces := func(values []reflect.Value) []interface{} { - interfaces := []interface{}{} - for _, v := range values { - interfaces = append(interfaces, v.Interface()) - } - return interfaces - } - - for _, test := range tests { - spew.SortValues(test.input, cs) - // reflect.DeepEqual cannot really make sense of reflect.Value, - // probably because of all the pointer tricks. For instance, - // v(2.0) != v(2.0) on a 32-bits system. Turn them into interface{} - // instead. - input := getInterfaces(test.input) - expected := getInterfaces(test.expected) - if !reflect.DeepEqual(input, expected) { - t.Errorf("Sort mismatch:\n %v != %v", input, expected) - } - } -} - -// TestSortValues ensures the sort functionality for relect.Value based sorting -// works as intended. -func TestSortValues(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - embedA := v(embed{"a"}) - embedB := v(embed{"b"}) - embedC := v(embed{"c"}) - tests := []sortTestCase{ - // No values. - { - []reflect.Value{}, - []reflect.Value{}, - }, - // Bools. - { - []reflect.Value{v(false), v(true), v(false)}, - []reflect.Value{v(false), v(false), v(true)}, - }, - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Uints. - { - []reflect.Value{v(uint8(2)), v(uint8(1)), v(uint8(3))}, - []reflect.Value{v(uint8(1)), v(uint8(2)), v(uint8(3))}, - }, - // Floats. - { - []reflect.Value{v(2.0), v(1.0), v(3.0)}, - []reflect.Value{v(1.0), v(2.0), v(3.0)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // Array - { - []reflect.Value{v([3]int{3, 2, 1}), v([3]int{1, 3, 2}), v([3]int{1, 2, 3})}, - []reflect.Value{v([3]int{1, 2, 3}), v([3]int{1, 3, 2}), v([3]int{3, 2, 1})}, - }, - // Uintptrs. - { - []reflect.Value{v(uintptr(2)), v(uintptr(1)), v(uintptr(3))}, - []reflect.Value{v(uintptr(1)), v(uintptr(2)), v(uintptr(3))}, - }, - // SortableStructs. - { - // Note: not sorted - DisableMethods is set. - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - // Note: not sorted - SpewKeys is false. - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - }, - // Invalid. - { - []reflect.Value{embedB, embedA, embedC}, - []reflect.Value{embedB, embedA, embedC}, - }, - } - cs := spew.ConfigState{DisableMethods: true, SpewKeys: false} - helpTestSortValues(tests, &cs, t) -} - -// TestSortValuesWithMethods ensures the sort functionality for relect.Value -// based sorting works as intended when using string methods. -func TestSortValuesWithMethods(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - tests := []sortTestCase{ - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // SortableStructs. - { - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - // Note: not sorted - SpewKeys is false. - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - }, - } - cs := spew.ConfigState{DisableMethods: false, SpewKeys: false} - helpTestSortValues(tests, &cs, t) -} - -// TestSortValuesWithSpew ensures the sort functionality for relect.Value -// based sorting works as intended when using spew to stringify keys. -func TestSortValuesWithSpew(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - tests := []sortTestCase{ - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // SortableStructs. - { - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{1}), v(unsortableStruct{2}), v(unsortableStruct{3})}, - }, - } - cs := spew.ConfigState{DisableMethods: true, SpewKeys: true} - helpTestSortValues(tests, &cs, t) -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dump_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dump_test.go deleted file mode 100644 index 2b320401d..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dump_test.go +++ /dev/null @@ -1,1042 +0,0 @@ -/* - * Copyright (c) 2013 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -Test Summary: -NOTE: For each test, a nil pointer, a single pointer and double pointer to the -base test element are also tested to ensure proper indirection across all types. - -- Max int8, int16, int32, int64, int -- Max uint8, uint16, uint32, uint64, uint -- Boolean true and false -- Standard complex64 and complex128 -- Array containing standard ints -- Array containing type with custom formatter on pointer receiver only -- Array containing interfaces -- Array containing bytes -- Slice containing standard float32 values -- Slice containing type with custom formatter on pointer receiver only -- Slice containing interfaces -- Slice containing bytes -- Nil slice -- Standard string -- Nil interface -- Sub-interface -- Map with string keys and int vals -- Map with custom formatter type on pointer receiver only keys and vals -- Map with interface keys and values -- Map with nil interface value -- Struct with primitives -- Struct that contains another struct -- Struct that contains custom type with Stringer pointer interface via both - exported and unexported fields -- Struct that contains embedded struct and field to same struct -- Uintptr to 0 (null pointer) -- Uintptr address of real variable -- Unsafe.Pointer to 0 (null pointer) -- Unsafe.Pointer to address of real variable -- Nil channel -- Standard int channel -- Function with no params and no returns -- Function with param and no returns -- Function with multiple params and multiple returns -- Struct that is circular through self referencing -- Structs that are circular through cross referencing -- Structs that are indirectly circular -- Type that panics in its Stringer interface -*/ - -package spew_test - -import ( - "bytes" - "fmt" - "testing" - "unsafe" - - "github.com/davecgh/go-spew/spew" -) - -// dumpTest is used to describe a test to be perfomed against the Dump method. -type dumpTest struct { - in interface{} - wants []string -} - -// dumpTests houses all of the tests to be performed against the Dump method. -var dumpTests = make([]dumpTest, 0) - -// addDumpTest is a helper method to append the passed input and desired result -// to dumpTests -func addDumpTest(in interface{}, wants ...string) { - test := dumpTest{in, wants} - dumpTests = append(dumpTests, test) -} - -func addIntDumpTests() { - // Max int8. - v := int8(127) - nv := (*int8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int8" - vs := "127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Max int16. - v2 := int16(32767) - nv2 := (*int16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "int16" - v2s := "32767" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Max int32. - v3 := int32(2147483647) - nv3 := (*int32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "int32" - v3s := "2147483647" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Max int64. - v4 := int64(9223372036854775807) - nv4 := (*int64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "int64" - v4s := "9223372036854775807" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Max int. - v5 := int(2147483647) - nv5 := (*int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "int" - v5s := "2147483647" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addUintDumpTests() { - // Max uint8. - v := uint8(255) - nv := (*uint8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uint8" - vs := "255" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Max uint16. - v2 := uint16(65535) - nv2 := (*uint16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Max uint32. - v3 := uint32(4294967295) - nv3 := (*uint32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "uint32" - v3s := "4294967295" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Max uint64. - v4 := uint64(18446744073709551615) - nv4 := (*uint64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "uint64" - v4s := "18446744073709551615" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Max uint. - v5 := uint(4294967295) - nv5 := (*uint)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "uint" - v5s := "4294967295" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addBoolDumpTests() { - // Boolean true. - v := bool(true) - nv := (*bool)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "bool" - vs := "true" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Boolean false. - v2 := bool(false) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "bool" - v2s := "false" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addFloatDumpTests() { - // Standard float32. - v := float32(3.1415) - nv := (*float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "3.1415" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Standard float64. - v2 := float64(3.1415926) - nv2 := (*float64)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "float64" - v2s := "3.1415926" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addComplexDumpTests() { - // Standard complex64. - v := complex(float32(6), -2) - nv := (*complex64)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "complex64" - vs := "(6-2i)" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Standard complex128. - v2 := complex(float64(-6), 2) - nv2 := (*complex128)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "complex128" - v2s := "(-6+2i)" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addArrayDumpTests() { - // Array containing standard ints. - v := [3]int{1, 2, 3} - vLen := fmt.Sprintf("%d", len(v)) - vCap := fmt.Sprintf("%d", cap(v)) - nv := (*[3]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int" - vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 1,\n (" + - vt + ") 2,\n (" + vt + ") 3\n}" - addDumpTest(v, "([3]"+vt+") "+vs+"\n") - addDumpTest(pv, "(*[3]"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**[3]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*[3]"+vt+")()\n") - - // Array containing type with custom formatter on pointer receiver only. - v2i0 := pstringer("1") - v2i1 := pstringer("2") - v2i2 := pstringer("3") - v2 := [3]pstringer{v2i0, v2i1, v2i2} - v2i0Len := fmt.Sprintf("%d", len(v2i0)) - v2i1Len := fmt.Sprintf("%d", len(v2i1)) - v2i2Len := fmt.Sprintf("%d", len(v2i2)) - v2Len := fmt.Sprintf("%d", len(v2)) - v2Cap := fmt.Sprintf("%d", cap(v2)) - nv2 := (*[3]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.pstringer" - v2sp := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + - ") (len=" + v2i0Len + ") stringer 1,\n (" + v2t + - ") (len=" + v2i1Len + ") stringer 2,\n (" + v2t + - ") (len=" + v2i2Len + ") " + "stringer 3\n}" - v2s := v2sp - if spew.UnsafeDisabled { - v2s = "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + - ") (len=" + v2i0Len + ") \"1\",\n (" + v2t + ") (len=" + - v2i1Len + ") \"2\",\n (" + v2t + ") (len=" + v2i2Len + - ") " + "\"3\"\n}" - } - addDumpTest(v2, "([3]"+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*[3]"+v2t+")("+v2Addr+")("+v2sp+")\n") - addDumpTest(&pv2, "(**[3]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2sp+")\n") - addDumpTest(nv2, "(*[3]"+v2t+")()\n") - - // Array containing interfaces. - v3i0 := "one" - v3 := [3]interface{}{v3i0, int(2), uint(3)} - v3i0Len := fmt.Sprintf("%d", len(v3i0)) - v3Len := fmt.Sprintf("%d", len(v3)) - v3Cap := fmt.Sprintf("%d", cap(v3)) - nv3 := (*[3]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[3]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + - "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + - v3t4 + ") 3\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Array containing bytes. - v4 := [34]byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - v4Len := fmt.Sprintf("%d", len(v4)) - v4Cap := fmt.Sprintf("%d", cap(v4)) - nv4 := (*[34]byte)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[34]uint8" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + - " |............... |\n" + - " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + - " |!\"#$%&'()*+,-./0|\n" + - " 00000020 31 32 " + - " |12|\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") -} - -func addSliceDumpTests() { - // Slice containing standard float32 values. - v := []float32{3.14, 6.28, 12.56} - vLen := fmt.Sprintf("%d", len(v)) - vCap := fmt.Sprintf("%d", cap(v)) - nv := (*[]float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 3.14,\n (" + - vt + ") 6.28,\n (" + vt + ") 12.56\n}" - addDumpTest(v, "([]"+vt+") "+vs+"\n") - addDumpTest(pv, "(*[]"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**[]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*[]"+vt+")()\n") - - // Slice containing type with custom formatter on pointer receiver only. - v2i0 := pstringer("1") - v2i1 := pstringer("2") - v2i2 := pstringer("3") - v2 := []pstringer{v2i0, v2i1, v2i2} - v2i0Len := fmt.Sprintf("%d", len(v2i0)) - v2i1Len := fmt.Sprintf("%d", len(v2i1)) - v2i2Len := fmt.Sprintf("%d", len(v2i2)) - v2Len := fmt.Sprintf("%d", len(v2)) - v2Cap := fmt.Sprintf("%d", cap(v2)) - nv2 := (*[]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.pstringer" - v2s := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + ") (len=" + - v2i0Len + ") stringer 1,\n (" + v2t + ") (len=" + v2i1Len + - ") stringer 2,\n (" + v2t + ") (len=" + v2i2Len + ") " + - "stringer 3\n}" - addDumpTest(v2, "([]"+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*[]"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**[]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*[]"+v2t+")()\n") - - // Slice containing interfaces. - v3i0 := "one" - v3 := []interface{}{v3i0, int(2), uint(3), nil} - v3i0Len := fmt.Sprintf("%d", len(v3i0)) - v3Len := fmt.Sprintf("%d", len(v3)) - v3Cap := fmt.Sprintf("%d", cap(v3)) - nv3 := (*[]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3t5 := "interface {}" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + - "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + - v3t4 + ") 3,\n (" + v3t5 + ") \n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Slice containing bytes. - v4 := []byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - v4Len := fmt.Sprintf("%d", len(v4)) - v4Cap := fmt.Sprintf("%d", cap(v4)) - nv4 := (*[]byte)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[]uint8" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + - " |............... |\n" + - " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + - " |!\"#$%&'()*+,-./0|\n" + - " 00000020 31 32 " + - " |12|\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Nil slice. - v5 := []int(nil) - nv5 := (*[]int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "[]int" - v5s := "" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addStringDumpTests() { - // Standard string. - v := "test" - vLen := fmt.Sprintf("%d", len(v)) - nv := (*string)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "string" - vs := "(len=" + vLen + ") \"test\"" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addInterfaceDumpTests() { - // Nil interface. - var v interface{} - nv := (*interface{})(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "interface {}" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Sub-interface. - v2 := interface{}(uint16(65535)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addMapDumpTests() { - // Map with string keys and int vals. - k := "one" - kk := "two" - m := map[string]int{k: 1, kk: 2} - klen := fmt.Sprintf("%d", len(k)) // not kLen to shut golint up - kkLen := fmt.Sprintf("%d", len(kk)) - mLen := fmt.Sprintf("%d", len(m)) - nilMap := map[string]int(nil) - nm := (*map[string]int)(nil) - pm := &m - mAddr := fmt.Sprintf("%p", pm) - pmAddr := fmt.Sprintf("%p", &pm) - mt := "map[string]int" - mt1 := "string" - mt2 := "int" - ms := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + klen + ") " + - "\"one\": (" + mt2 + ") 1,\n (" + mt1 + ") (len=" + kkLen + - ") \"two\": (" + mt2 + ") 2\n}" - ms2 := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + kkLen + ") " + - "\"two\": (" + mt2 + ") 2,\n (" + mt1 + ") (len=" + klen + - ") \"one\": (" + mt2 + ") 1\n}" - addDumpTest(m, "("+mt+") "+ms+"\n", "("+mt+") "+ms2+"\n") - addDumpTest(pm, "(*"+mt+")("+mAddr+")("+ms+")\n", - "(*"+mt+")("+mAddr+")("+ms2+")\n") - addDumpTest(&pm, "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms+")\n", - "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms2+")\n") - addDumpTest(nm, "(*"+mt+")()\n") - addDumpTest(nilMap, "("+mt+") \n") - - // Map with custom formatter type on pointer receiver only keys and vals. - k2 := pstringer("one") - v2 := pstringer("1") - m2 := map[pstringer]pstringer{k2: v2} - k2Len := fmt.Sprintf("%d", len(k2)) - v2Len := fmt.Sprintf("%d", len(v2)) - m2Len := fmt.Sprintf("%d", len(m2)) - nilMap2 := map[pstringer]pstringer(nil) - nm2 := (*map[pstringer]pstringer)(nil) - pm2 := &m2 - m2Addr := fmt.Sprintf("%p", pm2) - pm2Addr := fmt.Sprintf("%p", &pm2) - m2t := "map[spew_test.pstringer]spew_test.pstringer" - m2t1 := "spew_test.pstringer" - m2t2 := "spew_test.pstringer" - m2s := "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + ") " + - "stringer one: (" + m2t2 + ") (len=" + v2Len + ") stringer 1\n}" - if spew.UnsafeDisabled { - m2s = "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + - ") " + "\"one\": (" + m2t2 + ") (len=" + v2Len + - ") \"1\"\n}" - } - addDumpTest(m2, "("+m2t+") "+m2s+"\n") - addDumpTest(pm2, "(*"+m2t+")("+m2Addr+")("+m2s+")\n") - addDumpTest(&pm2, "(**"+m2t+")("+pm2Addr+"->"+m2Addr+")("+m2s+")\n") - addDumpTest(nm2, "(*"+m2t+")()\n") - addDumpTest(nilMap2, "("+m2t+") \n") - - // Map with interface keys and values. - k3 := "one" - k3Len := fmt.Sprintf("%d", len(k3)) - m3 := map[interface{}]interface{}{k3: 1} - m3Len := fmt.Sprintf("%d", len(m3)) - nilMap3 := map[interface{}]interface{}(nil) - nm3 := (*map[interface{}]interface{})(nil) - pm3 := &m3 - m3Addr := fmt.Sprintf("%p", pm3) - pm3Addr := fmt.Sprintf("%p", &pm3) - m3t := "map[interface {}]interface {}" - m3t1 := "string" - m3t2 := "int" - m3s := "(len=" + m3Len + ") {\n (" + m3t1 + ") (len=" + k3Len + ") " + - "\"one\": (" + m3t2 + ") 1\n}" - addDumpTest(m3, "("+m3t+") "+m3s+"\n") - addDumpTest(pm3, "(*"+m3t+")("+m3Addr+")("+m3s+")\n") - addDumpTest(&pm3, "(**"+m3t+")("+pm3Addr+"->"+m3Addr+")("+m3s+")\n") - addDumpTest(nm3, "(*"+m3t+")()\n") - addDumpTest(nilMap3, "("+m3t+") \n") - - // Map with nil interface value. - k4 := "nil" - k4Len := fmt.Sprintf("%d", len(k4)) - m4 := map[string]interface{}{k4: nil} - m4Len := fmt.Sprintf("%d", len(m4)) - nilMap4 := map[string]interface{}(nil) - nm4 := (*map[string]interface{})(nil) - pm4 := &m4 - m4Addr := fmt.Sprintf("%p", pm4) - pm4Addr := fmt.Sprintf("%p", &pm4) - m4t := "map[string]interface {}" - m4t1 := "string" - m4t2 := "interface {}" - m4s := "(len=" + m4Len + ") {\n (" + m4t1 + ") (len=" + k4Len + ")" + - " \"nil\": (" + m4t2 + ") \n}" - addDumpTest(m4, "("+m4t+") "+m4s+"\n") - addDumpTest(pm4, "(*"+m4t+")("+m4Addr+")("+m4s+")\n") - addDumpTest(&pm4, "(**"+m4t+")("+pm4Addr+"->"+m4Addr+")("+m4s+")\n") - addDumpTest(nm4, "(*"+m4t+")()\n") - addDumpTest(nilMap4, "("+m4t+") \n") -} - -func addStructDumpTests() { - // Struct with primitives. - type s1 struct { - a int8 - b uint8 - } - v := s1{127, 255} - nv := (*s1)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.s1" - vt2 := "int8" - vt3 := "uint8" - vs := "{\n a: (" + vt2 + ") 127,\n b: (" + vt3 + ") 255\n}" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Struct that contains another struct. - type s2 struct { - s1 s1 - b bool - } - v2 := s2{s1{127, 255}, true} - nv2 := (*s2)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.s2" - v2t2 := "spew_test.s1" - v2t3 := "int8" - v2t4 := "uint8" - v2t5 := "bool" - v2s := "{\n s1: (" + v2t2 + ") {\n a: (" + v2t3 + ") 127,\n b: (" + - v2t4 + ") 255\n },\n b: (" + v2t5 + ") true\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Struct that contains custom type with Stringer pointer interface via both - // exported and unexported fields. - type s3 struct { - s pstringer - S pstringer - } - v3 := s3{"test", "test2"} - nv3 := (*s3)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.s3" - v3t2 := "spew_test.pstringer" - v3s := "{\n s: (" + v3t2 + ") (len=4) stringer test,\n S: (" + v3t2 + - ") (len=5) stringer test2\n}" - v3sp := v3s - if spew.UnsafeDisabled { - v3s = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + - v3t2 + ") (len=5) \"test2\"\n}" - v3sp = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + - v3t2 + ") (len=5) stringer test2\n}" - } - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3sp+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3sp+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Struct that contains embedded struct and field to same struct. - e := embed{"embedstr"} - eLen := fmt.Sprintf("%d", len("embedstr")) - v4 := embedwrap{embed: &e, e: &e} - nv4 := (*embedwrap)(nil) - pv4 := &v4 - eAddr := fmt.Sprintf("%p", &e) - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "spew_test.embedwrap" - v4t2 := "spew_test.embed" - v4t3 := "string" - v4s := "{\n embed: (*" + v4t2 + ")(" + eAddr + ")({\n a: (" + v4t3 + - ") (len=" + eLen + ") \"embedstr\"\n }),\n e: (*" + v4t2 + - ")(" + eAddr + ")({\n a: (" + v4t3 + ") (len=" + eLen + ")" + - " \"embedstr\"\n })\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") -} - -func addUintptrDumpTests() { - // Null pointer. - v := uintptr(0) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uintptr" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - - // Address of real variable. - i := 1 - v2 := uintptr(unsafe.Pointer(&i)) - nv2 := (*uintptr)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uintptr" - v2s := fmt.Sprintf("%p", &i) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addUnsafePointerDumpTests() { - // Null pointer. - v := unsafe.Pointer(uintptr(0)) - nv := (*unsafe.Pointer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "unsafe.Pointer" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Address of real variable. - i := 1 - v2 := unsafe.Pointer(&i) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "unsafe.Pointer" - v2s := fmt.Sprintf("%p", &i) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addChanDumpTests() { - // Nil channel. - var v chan int - pv := &v - nv := (*chan int)(nil) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "chan int" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Real channel. - v2 := make(chan int) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "chan int" - v2s := fmt.Sprintf("%p", v2) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addFuncDumpTests() { - // Function with no params and no returns. - v := addIntDumpTests - nv := (*func())(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "func()" - vs := fmt.Sprintf("%p", v) - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Function with param and no returns. - v2 := TestDump - nv2 := (*func(*testing.T))(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "func(*testing.T)" - v2s := fmt.Sprintf("%p", v2) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Function with multiple params and multiple returns. - var v3 = func(i int, s string) (b bool, err error) { - return true, nil - } - nv3 := (*func(int, string) (bool, error))(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "func(int, string) (bool, error)" - v3s := fmt.Sprintf("%p", v3) - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") -} - -func addCircularDumpTests() { - // Struct that is circular through self referencing. - type circular struct { - c *circular - } - v := circular{nil} - v.c = &v - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.circular" - vs := "{\n c: (*" + vt + ")(" + vAddr + ")({\n c: (*" + vt + ")(" + - vAddr + ")()\n })\n}" - vs2 := "{\n c: (*" + vt + ")(" + vAddr + ")()\n}" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs2+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs2+")\n") - - // Structs that are circular through cross referencing. - v2 := xref1{nil} - ts2 := xref2{&v2} - v2.ps2 = &ts2 - pv2 := &v2 - ts2Addr := fmt.Sprintf("%p", &ts2) - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.xref1" - v2t2 := "spew_test.xref2" - v2s := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + - ")(" + v2Addr + ")({\n ps2: (*" + v2t2 + ")(" + ts2Addr + - ")()\n })\n })\n}" - v2s2 := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + - ")(" + v2Addr + ")()\n })\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s2+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s2+")\n") - - // Structs that are indirectly circular. - v3 := indirCir1{nil} - tic2 := indirCir2{nil} - tic3 := indirCir3{&v3} - tic2.ps3 = &tic3 - v3.ps2 = &tic2 - pv3 := &v3 - tic2Addr := fmt.Sprintf("%p", &tic2) - tic3Addr := fmt.Sprintf("%p", &tic3) - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.indirCir1" - v3t2 := "spew_test.indirCir2" - v3t3 := "spew_test.indirCir3" - v3s := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + - ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + - ")({\n ps2: (*" + v3t2 + ")(" + tic2Addr + - ")()\n })\n })\n })\n}" - v3s2 := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + - ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + - ")()\n })\n })\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s2+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s2+")\n") -} - -func addPanicDumpTests() { - // Type that panics in its Stringer interface. - v := panicer(127) - nv := (*panicer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.panicer" - vs := "(PANIC=test panic)127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addErrorDumpTests() { - // Type that has a custom Error interface. - v := customError(127) - nv := (*customError)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.customError" - vs := "error: 127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -// TestDump executes all of the tests described by dumpTests. -func TestDump(t *testing.T) { - // Setup tests. - addIntDumpTests() - addUintDumpTests() - addBoolDumpTests() - addFloatDumpTests() - addComplexDumpTests() - addArrayDumpTests() - addSliceDumpTests() - addStringDumpTests() - addInterfaceDumpTests() - addMapDumpTests() - addStructDumpTests() - addUintptrDumpTests() - addUnsafePointerDumpTests() - addChanDumpTests() - addFuncDumpTests() - addCircularDumpTests() - addPanicDumpTests() - addErrorDumpTests() - addCgoDumpTests() - - t.Logf("Running %d tests", len(dumpTests)) - for i, test := range dumpTests { - buf := new(bytes.Buffer) - spew.Fdump(buf, test.in) - s := buf.String() - if testFailed(s, test.wants) { - t.Errorf("Dump #%d\n got: %s %s", i, s, stringizeWants(test.wants)) - continue - } - } -} - -func TestDumpSortedKeys(t *testing.T) { - cfg := spew.ConfigState{SortKeys: true} - s := cfg.Sdump(map[int]string{1: "1", 3: "3", 2: "2"}) - expected := "(map[int]string) (len=3) {\n(int) 1: (string) (len=1) " + - "\"1\",\n(int) 2: (string) (len=1) \"2\",\n(int) 3: (string) " + - "(len=1) \"3\"\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[stringer]int{"1": 1, "3": 3, "2": 2}) - expected = "(map[spew_test.stringer]int) (len=3) {\n" + - "(spew_test.stringer) (len=1) stringer 1: (int) 1,\n" + - "(spew_test.stringer) (len=1) stringer 2: (int) 2,\n" + - "(spew_test.stringer) (len=1) stringer 3: (int) 3\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) - expected = "(map[spew_test.pstringer]int) (len=3) {\n" + - "(spew_test.pstringer) (len=1) stringer 1: (int) 1,\n" + - "(spew_test.pstringer) (len=1) stringer 2: (int) 2,\n" + - "(spew_test.pstringer) (len=1) stringer 3: (int) 3\n" + - "}\n" - if spew.UnsafeDisabled { - expected = "(map[spew_test.pstringer]int) (len=3) {\n" + - "(spew_test.pstringer) (len=1) \"1\": (int) 1,\n" + - "(spew_test.pstringer) (len=1) \"2\": (int) 2,\n" + - "(spew_test.pstringer) (len=1) \"3\": (int) 3\n" + - "}\n" - } - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) - expected = "(map[spew_test.customError]int) (len=3) {\n" + - "(spew_test.customError) error: 1: (int) 1,\n" + - "(spew_test.customError) error: 2: (int) 2,\n" + - "(spew_test.customError) error: 3: (int) 3\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpcgo_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpcgo_test.go deleted file mode 100644 index 18a38358e..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpcgo_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2013 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when both cgo is supported and "-tags testcgo" is added to the go test -// command line. This means the cgo tests are only added (and hence run) when -// specifially requested. This configuration is used because spew itself -// does not require cgo to run even though it does handle certain cgo types -// specially. Rather than forcing all clients to require cgo and an external -// C compiler just to run the tests, this scheme makes them optional. -// +build cgo,testcgo - -package spew_test - -import ( - "fmt" - - "github.com/davecgh/go-spew/spew/testdata" -) - -func addCgoDumpTests() { - // C char pointer. - v := testdata.GetCgoCharPointer() - nv := testdata.GetCgoNullCharPointer() - pv := &v - vcAddr := fmt.Sprintf("%p", v) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "*testdata._Ctype_char" - vs := "116" - addDumpTest(v, "("+vt+")("+vcAddr+")("+vs+")\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+"->"+vcAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+"->"+vcAddr+")("+vs+")\n") - addDumpTest(nv, "("+vt+")()\n") - - // C char array. - v2, v2l, v2c := testdata.GetCgoCharArray() - v2Len := fmt.Sprintf("%d", v2l) - v2Cap := fmt.Sprintf("%d", v2c) - v2t := "[6]testdata._Ctype_char" - v2s := "(len=" + v2Len + " cap=" + v2Cap + ") " + - "{\n 00000000 74 65 73 74 32 00 " + - " |test2.|\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - - // C unsigned char array. - v3, v3l, v3c := testdata.GetCgoUnsignedCharArray() - v3Len := fmt.Sprintf("%d", v3l) - v3Cap := fmt.Sprintf("%d", v3c) - v3t := "[6]testdata._Ctype_unsignedchar" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") " + - "{\n 00000000 74 65 73 74 33 00 " + - " |test3.|\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - - // C signed char array. - v4, v4l, v4c := testdata.GetCgoSignedCharArray() - v4Len := fmt.Sprintf("%d", v4l) - v4Cap := fmt.Sprintf("%d", v4c) - v4t := "[6]testdata._Ctype_schar" - v4t2 := "testdata._Ctype_schar" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 101,\n (" + v4t2 + - ") 115,\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 52,\n (" + v4t2 + - ") 0\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - - // C uint8_t array. - v5, v5l, v5c := testdata.GetCgoUint8tArray() - v5Len := fmt.Sprintf("%d", v5l) - v5Cap := fmt.Sprintf("%d", v5c) - v5t := "[6]testdata._Ctype_uint8_t" - v5s := "(len=" + v5Len + " cap=" + v5Cap + ") " + - "{\n 00000000 74 65 73 74 35 00 " + - " |test5.|\n}" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - - // C typedefed unsigned char array. - v6, v6l, v6c := testdata.GetCgoTypdefedUnsignedCharArray() - v6Len := fmt.Sprintf("%d", v6l) - v6Cap := fmt.Sprintf("%d", v6c) - v6t := "[6]testdata._Ctype_custom_uchar_t" - v6s := "(len=" + v6Len + " cap=" + v6Cap + ") " + - "{\n 00000000 74 65 73 74 36 00 " + - " |test6.|\n}" - addDumpTest(v6, "("+v6t+") "+v6s+"\n") -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpnocgo_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpnocgo_test.go deleted file mode 100644 index 52a0971fb..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/dumpnocgo_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2013 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when either cgo is not supported or "-tags testcgo" is not added to the go -// test command line. This file intentionally does not setup any cgo tests in -// this scenario. -// +build !cgo !testcgo - -package spew_test - -func addCgoDumpTests() { - // Don't add any tests for cgo since this file is only compiled when - // there should not be any cgo tests. -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/example_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/example_test.go deleted file mode 100644 index de6c4e309..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/example_test.go +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2013 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "fmt" - - "github.com/davecgh/go-spew/spew" -) - -type Flag int - -const ( - flagOne Flag = iota - flagTwo -) - -var flagStrings = map[Flag]string{ - flagOne: "flagOne", - flagTwo: "flagTwo", -} - -func (f Flag) String() string { - if s, ok := flagStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown flag (%d)", int(f)) -} - -type Bar struct { - data uintptr -} - -type Foo struct { - unexportedField Bar - ExportedField map[interface{}]interface{} -} - -// This example demonstrates how to use Dump to dump variables to stdout. -func ExampleDump() { - // The following package level declarations are assumed for this example: - /* - type Flag int - - const ( - flagOne Flag = iota - flagTwo - ) - - var flagStrings = map[Flag]string{ - flagOne: "flagOne", - flagTwo: "flagTwo", - } - - func (f Flag) String() string { - if s, ok := flagStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown flag (%d)", int(f)) - } - - type Bar struct { - data uintptr - } - - type Foo struct { - unexportedField Bar - ExportedField map[interface{}]interface{} - } - */ - - // Setup some sample data structures for the example. - bar := Bar{uintptr(0)} - s1 := Foo{bar, map[interface{}]interface{}{"one": true}} - f := Flag(5) - b := []byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - - // Dump! - spew.Dump(s1, f, b) - - // Output: - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // (spew_test.Flag) Unknown flag (5) - // ([]uint8) (len=34 cap=34) { - // 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | - // 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| - // 00000020 31 32 |12| - // } - // -} - -// This example demonstrates how to use Printf to display a variable with a -// format string and inline formatting. -func ExamplePrintf() { - // Create a double pointer to a uint 8. - ui8 := uint8(5) - pui8 := &ui8 - ppui8 := &pui8 - - // Create a circular data type. - type circular struct { - ui8 uint8 - c *circular - } - c := circular{ui8: 1} - c.c = &c - - // Print! - spew.Printf("ppui8: %v\n", ppui8) - spew.Printf("circular: %v\n", c) - - // Output: - // ppui8: <**>5 - // circular: {1 <*>{1 <*>}} -} - -// This example demonstrates how to use a ConfigState. -func ExampleConfigState() { - // Modify the indent level of the ConfigState only. The global - // configuration is not modified. - scs := spew.ConfigState{Indent: "\t"} - - // Output using the ConfigState instance. - v := map[string]int{"one": 1} - scs.Printf("v: %v\n", v) - scs.Dump(v) - - // Output: - // v: map[one:1] - // (map[string]int) (len=1) { - // (string) (len=3) "one": (int) 1 - // } -} - -// This example demonstrates how to use ConfigState.Dump to dump variables to -// stdout -func ExampleConfigState_Dump() { - // See the top-level Dump example for details on the types used in this - // example. - - // Create two ConfigState instances with different indentation. - scs := spew.ConfigState{Indent: "\t"} - scs2 := spew.ConfigState{Indent: " "} - - // Setup some sample data structures for the example. - bar := Bar{uintptr(0)} - s1 := Foo{bar, map[interface{}]interface{}{"one": true}} - - // Dump using the ConfigState instances. - scs.Dump(s1) - scs2.Dump(s1) - - // Output: - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // -} - -// This example demonstrates how to use ConfigState.Printf to display a variable -// with a format string and inline formatting. -func ExampleConfigState_Printf() { - // See the top-level Dump example for details on the types used in this - // example. - - // Create two ConfigState instances and modify the method handling of the - // first ConfigState only. - scs := spew.NewDefaultConfig() - scs2 := spew.NewDefaultConfig() - scs.DisableMethods = true - - // Alternatively - // scs := spew.ConfigState{Indent: " ", DisableMethods: true} - // scs2 := spew.ConfigState{Indent: " "} - - // This is of type Flag which implements a Stringer and has raw value 1. - f := flagTwo - - // Dump using the ConfigState instances. - scs.Printf("f: %v\n", f) - scs2.Printf("f: %v\n", f) - - // Output: - // f: 1 - // f: flagTwo -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/format_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/format_test.go deleted file mode 100644 index b664b3f13..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/format_test.go +++ /dev/null @@ -1,1558 +0,0 @@ -/* - * Copyright (c) 2013 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -Test Summary: -NOTE: For each test, a nil pointer, a single pointer and double pointer to the -base test element are also tested to ensure proper indirection across all types. - -- Max int8, int16, int32, int64, int -- Max uint8, uint16, uint32, uint64, uint -- Boolean true and false -- Standard complex64 and complex128 -- Array containing standard ints -- Array containing type with custom formatter on pointer receiver only -- Array containing interfaces -- Slice containing standard float32 values -- Slice containing type with custom formatter on pointer receiver only -- Slice containing interfaces -- Nil slice -- Standard string -- Nil interface -- Sub-interface -- Map with string keys and int vals -- Map with custom formatter type on pointer receiver only keys and vals -- Map with interface keys and values -- Map with nil interface value -- Struct with primitives -- Struct that contains another struct -- Struct that contains custom type with Stringer pointer interface via both - exported and unexported fields -- Struct that contains embedded struct and field to same struct -- Uintptr to 0 (null pointer) -- Uintptr address of real variable -- Unsafe.Pointer to 0 (null pointer) -- Unsafe.Pointer to address of real variable -- Nil channel -- Standard int channel -- Function with no params and no returns -- Function with param and no returns -- Function with multiple params and multiple returns -- Struct that is circular through self referencing -- Structs that are circular through cross referencing -- Structs that are indirectly circular -- Type that panics in its Stringer interface -- Type that has a custom Error interface -- %x passthrough with uint -- %#x passthrough with uint -- %f passthrough with precision -- %f passthrough with width and precision -- %d passthrough with width -- %q passthrough with string -*/ - -package spew_test - -import ( - "bytes" - "fmt" - "testing" - "unsafe" - - "github.com/davecgh/go-spew/spew" -) - -// formatterTest is used to describe a test to be perfomed against NewFormatter. -type formatterTest struct { - format string - in interface{} - wants []string -} - -// formatterTests houses all of the tests to be performed against NewFormatter. -var formatterTests = make([]formatterTest, 0) - -// addFormatterTest is a helper method to append the passed input and desired -// result to formatterTests. -func addFormatterTest(format string, in interface{}, wants ...string) { - test := formatterTest{format, in, wants} - formatterTests = append(formatterTests, test) -} - -func addIntFormatterTests() { - // Max int8. - v := int8(127) - nv := (*int8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int8" - vs := "127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Max int16. - v2 := int16(32767) - nv2 := (*int16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "int16" - v2s := "32767" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Max int32. - v3 := int32(2147483647) - nv3 := (*int32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "int32" - v3s := "2147483647" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - - // Max int64. - v4 := int64(9223372036854775807) - nv4 := (*int64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "int64" - v4s := "9223372036854775807" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") - - // Max int. - v5 := int(2147483647) - nv5 := (*int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "int" - v5s := "2147483647" - addFormatterTest("%v", v5, v5s) - addFormatterTest("%v", pv5, "<*>"+v5s) - addFormatterTest("%v", &pv5, "<**>"+v5s) - addFormatterTest("%v", nv5, "") - addFormatterTest("%+v", v5, v5s) - addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) - addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%+v", nv5, "") - addFormatterTest("%#v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) - addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") - addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) - addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"") -} - -func addUintFormatterTests() { - // Max uint8. - v := uint8(255) - nv := (*uint8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uint8" - vs := "255" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Max uint16. - v2 := uint16(65535) - nv2 := (*uint16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Max uint32. - v3 := uint32(4294967295) - nv3 := (*uint32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "uint32" - v3s := "4294967295" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - - // Max uint64. - v4 := uint64(18446744073709551615) - nv4 := (*uint64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "uint64" - v4s := "18446744073709551615" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") - - // Max uint. - v5 := uint(4294967295) - nv5 := (*uint)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "uint" - v5s := "4294967295" - addFormatterTest("%v", v5, v5s) - addFormatterTest("%v", pv5, "<*>"+v5s) - addFormatterTest("%v", &pv5, "<**>"+v5s) - addFormatterTest("%v", nv5, "") - addFormatterTest("%+v", v5, v5s) - addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) - addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%+v", nv5, "") - addFormatterTest("%#v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) - addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") - addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) - addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") -} - -func addBoolFormatterTests() { - // Boolean true. - v := bool(true) - nv := (*bool)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "bool" - vs := "true" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Boolean false. - v2 := bool(false) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "bool" - v2s := "false" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addFloatFormatterTests() { - // Standard float32. - v := float32(3.1415) - nv := (*float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "3.1415" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Standard float64. - v2 := float64(3.1415926) - nv2 := (*float64)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "float64" - v2s := "3.1415926" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") -} - -func addComplexFormatterTests() { - // Standard complex64. - v := complex(float32(6), -2) - nv := (*complex64)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "complex64" - vs := "(6-2i)" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Standard complex128. - v2 := complex(float64(-6), 2) - nv2 := (*complex128)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "complex128" - v2s := "(-6+2i)" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") -} - -func addArrayFormatterTests() { - // Array containing standard ints. - v := [3]int{1, 2, 3} - nv := (*[3]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "[3]int" - vs := "[1 2 3]" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Array containing type with custom formatter on pointer receiver only. - v2 := [3]pstringer{"1", "2", "3"} - nv2 := (*[3]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "[3]spew_test.pstringer" - v2sp := "[stringer 1 stringer 2 stringer 3]" - v2s := v2sp - if spew.UnsafeDisabled { - v2s = "[1 2 3]" - } - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2sp) - addFormatterTest("%v", &pv2, "<**>"+v2sp) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2sp) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2sp) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2sp) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2sp) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2sp) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2sp) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Array containing interfaces. - v3 := [3]interface{}{"one", int(2), uint(3)} - nv3 := (*[3]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[3]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3s := "[one 2 3]" - v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") -} - -func addSliceFormatterTests() { - // Slice containing standard float32 values. - v := []float32{3.14, 6.28, 12.56} - nv := (*[]float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "[]float32" - vs := "[3.14 6.28 12.56]" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Slice containing type with custom formatter on pointer receiver only. - v2 := []pstringer{"1", "2", "3"} - nv2 := (*[]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "[]spew_test.pstringer" - v2s := "[stringer 1 stringer 2 stringer 3]" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Slice containing interfaces. - v3 := []interface{}{"one", int(2), uint(3), nil} - nv3 := (*[]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3t5 := "interface {}" - v3s := "[one 2 3 ]" - v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3 (" + v3t5 + - ")]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Nil slice. - var v4 []int - nv4 := (*[]int)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[]int" - v4s := "" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addStringFormatterTests() { - // Standard string. - v := "test" - nv := (*string)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "string" - vs := "test" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addInterfaceFormatterTests() { - // Nil interface. - var v interface{} - nv := (*interface{})(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "interface {}" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Sub-interface. - v2 := interface{}(uint16(65535)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addMapFormatterTests() { - // Map with string keys and int vals. - v := map[string]int{"one": 1, "two": 2} - nilMap := map[string]int(nil) - nv := (*map[string]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "map[string]int" - vs := "map[one:1 two:2]" - vs2 := "map[two:2 one:1]" - addFormatterTest("%v", v, vs, vs2) - addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2) - addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2) - addFormatterTest("%+v", nilMap, "") - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs, vs2) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs, - "<**>("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%+v", nilMap, "") - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2) - addFormatterTest("%#v", nilMap, "("+vt+")"+"") - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs, - "(*"+vt+")("+vAddr+")"+vs2) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs, - "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%#+v", nilMap, "("+vt+")"+"") - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Map with custom formatter type on pointer receiver only keys and vals. - v2 := map[pstringer]pstringer{"one": "1"} - nv2 := (*map[pstringer]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "map[spew_test.pstringer]spew_test.pstringer" - v2s := "map[stringer one:stringer 1]" - if spew.UnsafeDisabled { - v2s = "map[one:1]" - } - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Map with interface keys and values. - v3 := map[interface{}]interface{}{"one": 1} - nv3 := (*map[interface{}]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "map[interface {}]interface {}" - v3t1 := "string" - v3t2 := "int" - v3s := "map[one:1]" - v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Map with nil interface value - v4 := map[string]interface{}{"nil": nil} - nv4 := (*map[string]interface{})(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "map[string]interface {}" - v4t1 := "interface {}" - v4s := "map[nil:]" - v4s2 := "map[nil:(" + v4t1 + ")]" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s2) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s2) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s2) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s2) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s2) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s2) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addStructFormatterTests() { - // Struct with primitives. - type s1 struct { - a int8 - b uint8 - } - v := s1{127, 255} - nv := (*s1)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.s1" - vt2 := "int8" - vt3 := "uint8" - vs := "{127 255}" - vs2 := "{a:127 b:255}" - vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs2) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs3) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs3) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs3) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Struct that contains another struct. - type s2 struct { - s1 s1 - b bool - } - v2 := s2{s1{127, 255}, true} - nv2 := (*s2)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.s2" - v2t2 := "spew_test.s1" - v2t3 := "int8" - v2t4 := "uint8" - v2t5 := "bool" - v2s := "{{127 255} true}" - v2s2 := "{s1:{a:127 b:255} b:true}" - v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" + - v2t5 + ")true}" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s2) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s3) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Struct that contains custom type with Stringer pointer interface via both - // exported and unexported fields. - type s3 struct { - s pstringer - S pstringer - } - v3 := s3{"test", "test2"} - nv3 := (*s3)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.s3" - v3t2 := "spew_test.pstringer" - v3s := "{stringer test stringer test2}" - v3sp := v3s - v3s2 := "{s:stringer test S:stringer test2}" - v3s2p := v3s2 - v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}" - v3s3p := v3s3 - if spew.UnsafeDisabled { - v3s = "{test test2}" - v3sp = "{test stringer test2}" - v3s2 = "{s:test S:test2}" - v3s2p = "{s:test S:stringer test2}" - v3s3 = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")test2}" - v3s3p = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")stringer test2}" - } - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3sp) - addFormatterTest("%v", &pv3, "<**>"+v3sp) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s2) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2p) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2p) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s3) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3p) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3p) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3p) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3p) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Struct that contains embedded struct and field to same struct. - e := embed{"embedstr"} - v4 := embedwrap{embed: &e, e: &e} - nv4 := (*embedwrap)(nil) - pv4 := &v4 - eAddr := fmt.Sprintf("%p", &e) - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "spew_test.embedwrap" - v4t2 := "spew_test.embed" - v4t3 := "string" - v4s := "{<*>{embedstr} <*>{embedstr}}" - v4s2 := "{embed:<*>(" + eAddr + "){a:embedstr} e:<*>(" + eAddr + - "){a:embedstr}}" - v4s3 := "{embed:(*" + v4t2 + "){a:(" + v4t3 + ")embedstr} e:(*" + v4t2 + - "){a:(" + v4t3 + ")embedstr}}" - v4s4 := "{embed:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + - ")embedstr} e:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + ")embedstr}}" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s2) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s2) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s2) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s3) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s3) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s3) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s4) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s4) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s4) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addUintptrFormatterTests() { - // Null pointer. - v := uintptr(0) - nv := (*uintptr)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uintptr" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Address of real variable. - i := 1 - v2 := uintptr(unsafe.Pointer(&i)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uintptr" - v2s := fmt.Sprintf("%p", &i) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addUnsafePointerFormatterTests() { - // Null pointer. - v := unsafe.Pointer(uintptr(0)) - nv := (*unsafe.Pointer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "unsafe.Pointer" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Address of real variable. - i := 1 - v2 := unsafe.Pointer(&i) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "unsafe.Pointer" - v2s := fmt.Sprintf("%p", &i) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addChanFormatterTests() { - // Nil channel. - var v chan int - pv := &v - nv := (*chan int)(nil) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "chan int" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Real channel. - v2 := make(chan int) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "chan int" - v2s := fmt.Sprintf("%p", v2) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addFuncFormatterTests() { - // Function with no params and no returns. - v := addIntFormatterTests - nv := (*func())(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "func()" - vs := fmt.Sprintf("%p", v) - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Function with param and no returns. - v2 := TestFormatter - nv2 := (*func(*testing.T))(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "func(*testing.T)" - v2s := fmt.Sprintf("%p", v2) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Function with multiple params and multiple returns. - var v3 = func(i int, s string) (b bool, err error) { - return true, nil - } - nv3 := (*func(int, string) (bool, error))(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "func(int, string) (bool, error)" - v3s := fmt.Sprintf("%p", v3) - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") -} - -func addCircularFormatterTests() { - // Struct that is circular through self referencing. - type circular struct { - c *circular - } - v := circular{nil} - v.c = &v - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.circular" - vs := "{<*>{<*>}}" - vs2 := "{<*>}" - vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")}}" - vs4 := "{c:<*>(" + vAddr + ")}" - vs5 := "{c:(*" + vt + "){c:(*" + vt + ")}}" - vs6 := "{c:(*" + vt + ")}" - vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr + - ")}}" - vs8 := "{c:(*" + vt + ")(" + vAddr + ")}" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs2) - addFormatterTest("%v", &pv, "<**>"+vs2) - addFormatterTest("%+v", v, vs3) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4) - addFormatterTest("%#v", v, "("+vt+")"+vs5) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs6) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6) - addFormatterTest("%#+v", v, "("+vt+")"+vs7) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8) - - // Structs that are circular through cross referencing. - v2 := xref1{nil} - ts2 := xref2{&v2} - v2.ps2 = &ts2 - pv2 := &v2 - ts2Addr := fmt.Sprintf("%p", &ts2) - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.xref1" - v2t2 := "spew_test.xref2" - v2s := "{<*>{<*>{<*>}}}" - v2s2 := "{<*>{<*>}}" - v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" + - ts2Addr + ")}}}" - v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")}}" - v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 + - ")}}}" - v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")}}" - v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + - ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr + - ")}}}" - v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + - ")(" + v2Addr + ")}}" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s2) - addFormatterTest("%v", &pv2, "<**>"+v2s2) - addFormatterTest("%+v", v2, v2s3) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s5) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8) - - // Structs that are indirectly circular. - v3 := indirCir1{nil} - tic2 := indirCir2{nil} - tic3 := indirCir3{&v3} - tic2.ps3 = &tic3 - v3.ps2 = &tic2 - pv3 := &v3 - tic2Addr := fmt.Sprintf("%p", &tic2) - tic3Addr := fmt.Sprintf("%p", &tic3) - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.indirCir1" - v3t2 := "spew_test.indirCir2" - v3t3 := "spew_test.indirCir3" - v3s := "{<*>{<*>{<*>{<*>}}}}" - v3s2 := "{<*>{<*>{<*>}}}" - v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + - v3Addr + "){ps2:<*>(" + tic2Addr + ")}}}}" - v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + - v3Addr + ")}}}" - v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + - "){ps2:(*" + v3t2 + ")}}}}" - v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + - ")}}}" - v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + - tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 + - ")(" + tic2Addr + ")}}}}" - v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + - tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")}}}" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s2) - addFormatterTest("%v", &pv3, "<**>"+v3s2) - addFormatterTest("%+v", v3, v3s3) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4) - addFormatterTest("%#v", v3, "("+v3t+")"+v3s5) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6) - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8) -} - -func addPanicFormatterTests() { - // Type that panics in its Stringer interface. - v := panicer(127) - nv := (*panicer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.panicer" - vs := "(PANIC=test panic)127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addErrorFormatterTests() { - // Type that has a custom Error interface. - v := customError(127) - nv := (*customError)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.customError" - vs := "error: 127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addPassthroughFormatterTests() { - // %x passthrough with uint. - v := uint(4294967295) - pv := &v - vAddr := fmt.Sprintf("%x", pv) - pvAddr := fmt.Sprintf("%x", &pv) - vs := "ffffffff" - addFormatterTest("%x", v, vs) - addFormatterTest("%x", pv, vAddr) - addFormatterTest("%x", &pv, pvAddr) - - // %#x passthrough with uint. - v2 := int(2147483647) - pv2 := &v2 - v2Addr := fmt.Sprintf("%#x", pv2) - pv2Addr := fmt.Sprintf("%#x", &pv2) - v2s := "0x7fffffff" - addFormatterTest("%#x", v2, v2s) - addFormatterTest("%#x", pv2, v2Addr) - addFormatterTest("%#x", &pv2, pv2Addr) - - // %f passthrough with precision. - addFormatterTest("%.2f", 3.1415, "3.14") - addFormatterTest("%.3f", 3.1415, "3.142") - addFormatterTest("%.4f", 3.1415, "3.1415") - - // %f passthrough with width and precision. - addFormatterTest("%5.2f", 3.1415, " 3.14") - addFormatterTest("%6.3f", 3.1415, " 3.142") - addFormatterTest("%7.4f", 3.1415, " 3.1415") - - // %d passthrough with width. - addFormatterTest("%3d", 127, "127") - addFormatterTest("%4d", 127, " 127") - addFormatterTest("%5d", 127, " 127") - - // %q passthrough with string. - addFormatterTest("%q", "test", "\"test\"") -} - -// TestFormatter executes all of the tests described by formatterTests. -func TestFormatter(t *testing.T) { - // Setup tests. - addIntFormatterTests() - addUintFormatterTests() - addBoolFormatterTests() - addFloatFormatterTests() - addComplexFormatterTests() - addArrayFormatterTests() - addSliceFormatterTests() - addStringFormatterTests() - addInterfaceFormatterTests() - addMapFormatterTests() - addStructFormatterTests() - addUintptrFormatterTests() - addUnsafePointerFormatterTests() - addChanFormatterTests() - addFuncFormatterTests() - addCircularFormatterTests() - addPanicFormatterTests() - addErrorFormatterTests() - addPassthroughFormatterTests() - - t.Logf("Running %d tests", len(formatterTests)) - for i, test := range formatterTests { - buf := new(bytes.Buffer) - spew.Fprintf(buf, test.format, test.in) - s := buf.String() - if testFailed(s, test.wants) { - t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s, - stringizeWants(test.wants)) - continue - } - } -} - -type testStruct struct { - x int -} - -func (ts testStruct) String() string { - return fmt.Sprintf("ts.%d", ts.x) -} - -type testStructP struct { - x int -} - -func (ts *testStructP) String() string { - return fmt.Sprintf("ts.%d", ts.x) -} - -func TestPrintSortedKeys(t *testing.T) { - cfg := spew.ConfigState{SortKeys: true} - s := cfg.Sprint(map[int]string{1: "1", 3: "3", 2: "2"}) - expected := "map[1:1 2:2 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 1:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[stringer]int{"1": 1, "3": 3, "2": 2}) - expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 2:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) - expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" - if spew.UnsafeDisabled { - expected = "map[1:1 2:2 3:3]" - } - if s != expected { - t.Errorf("Sorted keys mismatch 3:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[testStruct]int{testStruct{1}: 1, testStruct{3}: 3, testStruct{2}: 2}) - expected = "map[ts.1:1 ts.2:2 ts.3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 4:\n %v %v", s, expected) - } - - if !spew.UnsafeDisabled { - s = cfg.Sprint(map[testStructP]int{testStructP{1}: 1, testStructP{3}: 3, testStructP{2}: 2}) - expected = "map[ts.1:1 ts.2:2 ts.3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 5:\n %v %v", s, expected) - } - } - - s = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) - expected = "map[error: 1:1 error: 2:2 error: 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 6:\n %v %v", s, expected) - } -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internal_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internal_test.go deleted file mode 100644 index 1069ee21c..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internal_test.go +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2013 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -This test file is part of the spew package rather than than the spew_test -package because it needs access to internals to properly test certain cases -which are not possible via the public interface since they should never happen. -*/ - -package spew - -import ( - "bytes" - "reflect" - "testing" -) - -// dummyFmtState implements a fake fmt.State to use for testing invalid -// reflect.Value handling. This is necessary because the fmt package catches -// invalid values before invoking the formatter on them. -type dummyFmtState struct { - bytes.Buffer -} - -func (dfs *dummyFmtState) Flag(f int) bool { - if f == int('+') { - return true - } - return false -} - -func (dfs *dummyFmtState) Precision() (int, bool) { - return 0, false -} - -func (dfs *dummyFmtState) Width() (int, bool) { - return 0, false -} - -// TestInvalidReflectValue ensures the dump and formatter code handles an -// invalid reflect value properly. This needs access to internal state since it -// should never happen in real code and therefore can't be tested via the public -// API. -func TestInvalidReflectValue(t *testing.T) { - i := 1 - - // Dump invalid reflect value. - v := new(reflect.Value) - buf := new(bytes.Buffer) - d := dumpState{w: buf, cs: &Config} - d.dump(*v) - s := buf.String() - want := "" - if s != want { - t.Errorf("InvalidReflectValue #%d\n got: %s want: %s", i, s, want) - } - i++ - - // Formatter invalid reflect value. - buf2 := new(dummyFmtState) - f := formatState{value: *v, cs: &Config, fs: buf2} - f.format(*v) - s = buf2.String() - want = "" - if s != want { - t.Errorf("InvalidReflectValue #%d got: %s want: %s", i, s, want) - } -} - -// SortValues makes the internal sortValues function available to the test -// package. -func SortValues(values []reflect.Value, cs *ConfigState) { - sortValues(values, cs) -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internalunsafe_test.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internalunsafe_test.go deleted file mode 100644 index 83e070e9a..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/internalunsafe_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2013-2015 Dave Collins - -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. - -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when the code is not running on Google App Engine and "-tags disableunsafe" -// is not added to the go build command line. -// +build !appengine,!disableunsafe - -/* -This test file is part of the spew package rather than than the spew_test -package because it needs access to internals to properly test certain cases -which are not possible via the public interface since they should never happen. -*/ - -package spew - -import ( - "bytes" - "reflect" - "testing" - "unsafe" -) - -// changeKind uses unsafe to intentionally change the kind of a reflect.Value to -// the maximum kind value which does not exist. This is needed to test the -// fallback code which punts to the standard fmt library for new types that -// might get added to the language. -func changeKind(v *reflect.Value, readOnly bool) { - rvf := (*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + offsetFlag)) - *rvf = *rvf | ((1< - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "testing" - - "github.com/davecgh/go-spew/spew" -) - -// spewFunc is used to identify which public function of the spew package or -// ConfigState a test applies to. -type spewFunc int - -const ( - fCSFdump spewFunc = iota - fCSFprint - fCSFprintf - fCSFprintln - fCSPrint - fCSPrintln - fCSSdump - fCSSprint - fCSSprintf - fCSSprintln - fCSErrorf - fCSNewFormatter - fErrorf - fFprint - fFprintln - fPrint - fPrintln - fSdump - fSprint - fSprintf - fSprintln -) - -// Map of spewFunc values to names for pretty printing. -var spewFuncStrings = map[spewFunc]string{ - fCSFdump: "ConfigState.Fdump", - fCSFprint: "ConfigState.Fprint", - fCSFprintf: "ConfigState.Fprintf", - fCSFprintln: "ConfigState.Fprintln", - fCSSdump: "ConfigState.Sdump", - fCSPrint: "ConfigState.Print", - fCSPrintln: "ConfigState.Println", - fCSSprint: "ConfigState.Sprint", - fCSSprintf: "ConfigState.Sprintf", - fCSSprintln: "ConfigState.Sprintln", - fCSErrorf: "ConfigState.Errorf", - fCSNewFormatter: "ConfigState.NewFormatter", - fErrorf: "spew.Errorf", - fFprint: "spew.Fprint", - fFprintln: "spew.Fprintln", - fPrint: "spew.Print", - fPrintln: "spew.Println", - fSdump: "spew.Sdump", - fSprint: "spew.Sprint", - fSprintf: "spew.Sprintf", - fSprintln: "spew.Sprintln", -} - -func (f spewFunc) String() string { - if s, ok := spewFuncStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown spewFunc (%d)", int(f)) -} - -// spewTest is used to describe a test to be performed against the public -// functions of the spew package or ConfigState. -type spewTest struct { - cs *spew.ConfigState - f spewFunc - format string - in interface{} - want string -} - -// spewTests houses the tests to be performed against the public functions of -// the spew package and ConfigState. -// -// These tests are only intended to ensure the public functions are exercised -// and are intentionally not exhaustive of types. The exhaustive type -// tests are handled in the dump and format tests. -var spewTests []spewTest - -// redirStdout is a helper function to return the standard output from f as a -// byte slice. -func redirStdout(f func()) ([]byte, error) { - tempFile, err := ioutil.TempFile("", "ss-test") - if err != nil { - return nil, err - } - fileName := tempFile.Name() - defer os.Remove(fileName) // Ignore error - - origStdout := os.Stdout - os.Stdout = tempFile - f() - os.Stdout = origStdout - tempFile.Close() - - return ioutil.ReadFile(fileName) -} - -func initSpewTests() { - // Config states with various settings. - scsDefault := spew.NewDefaultConfig() - scsNoMethods := &spew.ConfigState{Indent: " ", DisableMethods: true} - scsNoPmethods := &spew.ConfigState{Indent: " ", DisablePointerMethods: true} - scsMaxDepth := &spew.ConfigState{Indent: " ", MaxDepth: 1} - scsContinue := &spew.ConfigState{Indent: " ", ContinueOnMethod: true} - - // Variables for tests on types which implement Stringer interface with and - // without a pointer receiver. - ts := stringer("test") - tps := pstringer("test") - - // depthTester is used to test max depth handling for structs, array, slices - // and maps. - type depthTester struct { - ic indirCir1 - arr [1]string - slice []string - m map[string]int - } - dt := depthTester{indirCir1{nil}, [1]string{"arr"}, []string{"slice"}, - map[string]int{"one": 1}} - - // Variable for tests on types which implement error interface. - te := customError(10) - - spewTests = []spewTest{ - {scsDefault, fCSFdump, "", int8(127), "(int8) 127\n"}, - {scsDefault, fCSFprint, "", int16(32767), "32767"}, - {scsDefault, fCSFprintf, "%v", int32(2147483647), "2147483647"}, - {scsDefault, fCSFprintln, "", int(2147483647), "2147483647\n"}, - {scsDefault, fCSPrint, "", int64(9223372036854775807), "9223372036854775807"}, - {scsDefault, fCSPrintln, "", uint8(255), "255\n"}, - {scsDefault, fCSSdump, "", uint8(64), "(uint8) 64\n"}, - {scsDefault, fCSSprint, "", complex(1, 2), "(1+2i)"}, - {scsDefault, fCSSprintf, "%v", complex(float32(3), 4), "(3+4i)"}, - {scsDefault, fCSSprintln, "", complex(float64(5), 6), "(5+6i)\n"}, - {scsDefault, fCSErrorf, "%#v", uint16(65535), "(uint16)65535"}, - {scsDefault, fCSNewFormatter, "%v", uint32(4294967295), "4294967295"}, - {scsDefault, fErrorf, "%v", uint64(18446744073709551615), "18446744073709551615"}, - {scsDefault, fFprint, "", float32(3.14), "3.14"}, - {scsDefault, fFprintln, "", float64(6.28), "6.28\n"}, - {scsDefault, fPrint, "", true, "true"}, - {scsDefault, fPrintln, "", false, "false\n"}, - {scsDefault, fSdump, "", complex(-10, -20), "(complex128) (-10-20i)\n"}, - {scsDefault, fSprint, "", complex(-1, -2), "(-1-2i)"}, - {scsDefault, fSprintf, "%v", complex(float32(-3), -4), "(-3-4i)"}, - {scsDefault, fSprintln, "", complex(float64(-5), -6), "(-5-6i)\n"}, - {scsNoMethods, fCSFprint, "", ts, "test"}, - {scsNoMethods, fCSFprint, "", &ts, "<*>test"}, - {scsNoMethods, fCSFprint, "", tps, "test"}, - {scsNoMethods, fCSFprint, "", &tps, "<*>test"}, - {scsNoPmethods, fCSFprint, "", ts, "stringer test"}, - {scsNoPmethods, fCSFprint, "", &ts, "<*>stringer test"}, - {scsNoPmethods, fCSFprint, "", tps, "test"}, - {scsNoPmethods, fCSFprint, "", &tps, "<*>stringer test"}, - {scsMaxDepth, fCSFprint, "", dt, "{{} [] [] map[]}"}, - {scsMaxDepth, fCSFdump, "", dt, "(spew_test.depthTester) {\n" + - " ic: (spew_test.indirCir1) {\n \n },\n" + - " arr: ([1]string) (len=1 cap=1) {\n \n },\n" + - " slice: ([]string) (len=1 cap=1) {\n \n },\n" + - " m: (map[string]int) (len=1) {\n \n }\n}\n"}, - {scsContinue, fCSFprint, "", ts, "(stringer test) test"}, - {scsContinue, fCSFdump, "", ts, "(spew_test.stringer) " + - "(len=4) (stringer test) \"test\"\n"}, - {scsContinue, fCSFprint, "", te, "(error: 10) 10"}, - {scsContinue, fCSFdump, "", te, "(spew_test.customError) " + - "(error: 10) 10\n"}, - } -} - -// TestSpew executes all of the tests described by spewTests. -func TestSpew(t *testing.T) { - initSpewTests() - - t.Logf("Running %d tests", len(spewTests)) - for i, test := range spewTests { - buf := new(bytes.Buffer) - switch test.f { - case fCSFdump: - test.cs.Fdump(buf, test.in) - - case fCSFprint: - test.cs.Fprint(buf, test.in) - - case fCSFprintf: - test.cs.Fprintf(buf, test.format, test.in) - - case fCSFprintln: - test.cs.Fprintln(buf, test.in) - - case fCSPrint: - b, err := redirStdout(func() { test.cs.Print(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fCSPrintln: - b, err := redirStdout(func() { test.cs.Println(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fCSSdump: - str := test.cs.Sdump(test.in) - buf.WriteString(str) - - case fCSSprint: - str := test.cs.Sprint(test.in) - buf.WriteString(str) - - case fCSSprintf: - str := test.cs.Sprintf(test.format, test.in) - buf.WriteString(str) - - case fCSSprintln: - str := test.cs.Sprintln(test.in) - buf.WriteString(str) - - case fCSErrorf: - err := test.cs.Errorf(test.format, test.in) - buf.WriteString(err.Error()) - - case fCSNewFormatter: - fmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in)) - - case fErrorf: - err := spew.Errorf(test.format, test.in) - buf.WriteString(err.Error()) - - case fFprint: - spew.Fprint(buf, test.in) - - case fFprintln: - spew.Fprintln(buf, test.in) - - case fPrint: - b, err := redirStdout(func() { spew.Print(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fPrintln: - b, err := redirStdout(func() { spew.Println(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fSdump: - str := spew.Sdump(test.in) - buf.WriteString(str) - - case fSprint: - str := spew.Sprint(test.in) - buf.WriteString(str) - - case fSprintf: - str := spew.Sprintf(test.format, test.in) - buf.WriteString(str) - - case fSprintln: - str := spew.Sprintln(test.in) - buf.WriteString(str) - - default: - t.Errorf("%v #%d unrecognized function", test.f, i) - continue - } - s := buf.String() - if test.want != s { - t.Errorf("ConfigState #%d\n got: %s want: %s", i, s, test.want) - continue - } - } -} diff --git a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go b/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go deleted file mode 100644 index 5c87dd456..000000000 --- a/Godeps/_workspace/src/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2013 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when both cgo is supported and "-tags testcgo" is added to the go test -// command line. This code should really only be in the dumpcgo_test.go file, -// but unfortunately Go will not allow cgo in test files, so this is a -// workaround to allow cgo types to be tested. This configuration is used -// because spew itself does not require cgo to run even though it does handle -// certain cgo types specially. Rather than forcing all clients to require cgo -// and an external C compiler just to run the tests, this scheme makes them -// optional. -// +build cgo,testcgo - -package testdata - -/* -#include -typedef unsigned char custom_uchar_t; - -char *ncp = 0; -char *cp = "test"; -char ca[6] = {'t', 'e', 's', 't', '2', '\0'}; -unsigned char uca[6] = {'t', 'e', 's', 't', '3', '\0'}; -signed char sca[6] = {'t', 'e', 's', 't', '4', '\0'}; -uint8_t ui8ta[6] = {'t', 'e', 's', 't', '5', '\0'}; -custom_uchar_t tuca[6] = {'t', 'e', 's', 't', '6', '\0'}; -*/ -import "C" - -// GetCgoNullCharPointer returns a null char pointer via cgo. This is only -// used for tests. -func GetCgoNullCharPointer() interface{} { - return C.ncp -} - -// GetCgoCharPointer returns a char pointer via cgo. This is only used for -// tests. -func GetCgoCharPointer() interface{} { - return C.cp -} - -// GetCgoCharArray returns a char array via cgo and the array's len and cap. -// This is only used for tests. -func GetCgoCharArray() (interface{}, int, int) { - return C.ca, len(C.ca), cap(C.ca) -} - -// GetCgoUnsignedCharArray returns an unsigned char array via cgo and the -// array's len and cap. This is only used for tests. -func GetCgoUnsignedCharArray() (interface{}, int, int) { - return C.uca, len(C.uca), cap(C.uca) -} - -// GetCgoSignedCharArray returns a signed char array via cgo and the array's len -// and cap. This is only used for tests. -func GetCgoSignedCharArray() (interface{}, int, int) { - return C.sca, len(C.sca), cap(C.sca) -} - -// GetCgoUint8tArray returns a uint8_t array via cgo and the array's len and -// cap. This is only used for tests. -func GetCgoUint8tArray() (interface{}, int, int) { - return C.ui8ta, len(C.ui8ta), cap(C.ui8ta) -} - -// GetCgoTypdefedUnsignedCharArray returns a typedefed unsigned char array via -// cgo and the array's len and cap. This is only used for tests. -func GetCgoTypdefedUnsignedCharArray() (interface{}, int, int) { - return C.tuca, len(C.tuca), cap(C.tuca) -} diff --git a/Godeps/_workspace/src/github.com/docker/distribution/digest/digest_test.go b/Godeps/_workspace/src/github.com/docker/distribution/digest/digest_test.go deleted file mode 100644 index afb4ebf63..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/digest/digest_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package digest - -import ( - "testing" -) - -func TestParseDigest(t *testing.T) { - for _, testcase := range []struct { - input string - err error - algorithm Algorithm - hex string - }{ - { - input: "sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b", - algorithm: "sha256", - hex: "e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b", - }, - { - input: "sha384:d3fc7881460b7e22e3d172954463dddd7866d17597e7248453c48b3e9d26d9596bf9c4a9cf8072c9d5bad76e19af801d", - algorithm: "sha384", - hex: "d3fc7881460b7e22e3d172954463dddd7866d17597e7248453c48b3e9d26d9596bf9c4a9cf8072c9d5bad76e19af801d", - }, - { - // empty hex - input: "sha256:", - err: ErrDigestInvalidFormat, - }, - { - // just hex - input: "d41d8cd98f00b204e9800998ecf8427e", - err: ErrDigestInvalidFormat, - }, - { - // not hex - input: "sha256:d41d8cd98f00b204e9800m98ecf8427e", - err: ErrDigestInvalidFormat, - }, - { - // too short - input: "sha256:abcdef0123456789", - err: ErrDigestInvalidLength, - }, - { - // too short (from different algorithm) - input: "sha512:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - err: ErrDigestInvalidLength, - }, - { - input: "foo:d41d8cd98f00b204e9800998ecf8427e", - err: ErrDigestUnsupported, - }, - } { - digest, err := ParseDigest(testcase.input) - if err != testcase.err { - t.Fatalf("error differed from expected while parsing %q: %v != %v", testcase.input, err, testcase.err) - } - - if testcase.err != nil { - continue - } - - if digest.Algorithm() != testcase.algorithm { - t.Fatalf("incorrect algorithm for parsed digest: %q != %q", digest.Algorithm(), testcase.algorithm) - } - - if digest.Hex() != testcase.hex { - t.Fatalf("incorrect hex for parsed digest: %q != %q", digest.Hex(), testcase.hex) - } - - // Parse string return value and check equality - newParsed, err := ParseDigest(digest.String()) - - if err != nil { - t.Fatalf("unexpected error parsing input %q: %v", testcase.input, err) - } - - if newParsed != digest { - t.Fatalf("expected equal: %q != %q", newParsed, digest) - } - } -} diff --git a/Godeps/_workspace/src/github.com/docker/distribution/digest/digester_resumable_test.go b/Godeps/_workspace/src/github.com/docker/distribution/digest/digester_resumable_test.go deleted file mode 100644 index 6ba21c801..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/digest/digester_resumable_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !noresumabledigest - -package digest - -import ( - "testing" - - "github.com/stevvooe/resumable" - _ "github.com/stevvooe/resumable/sha256" -) - -// TestResumableDetection just ensures that the resumable capability of a hash -// is exposed through the digester type, which is just a hash plus a Digest -// method. -func TestResumableDetection(t *testing.T) { - d := Canonical.New() - - if _, ok := d.Hash().(resumable.Hash); !ok { - t.Fatalf("expected digester to implement resumable.Hash: %#v, %v", d, d.Hash()) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/distribution/digest/set_test.go b/Godeps/_workspace/src/github.com/docker/distribution/digest/set_test.go deleted file mode 100644 index e9dab8795..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/digest/set_test.go +++ /dev/null @@ -1,368 +0,0 @@ -package digest - -import ( - "crypto/sha256" - "encoding/binary" - "math/rand" - "testing" -) - -func assertEqualDigests(t *testing.T, d1, d2 Digest) { - if d1 != d2 { - t.Fatalf("Digests do not match:\n\tActual: %s\n\tExpected: %s", d1, d2) - } -} - -func TestLookup(t *testing.T) { - digests := []Digest{ - "sha256:1234511111111111111111111111111111111111111111111111111111111111", - "sha256:1234111111111111111111111111111111111111111111111111111111111111", - "sha256:1234611111111111111111111111111111111111111111111111111111111111", - "sha256:5432111111111111111111111111111111111111111111111111111111111111", - "sha256:6543111111111111111111111111111111111111111111111111111111111111", - "sha256:6432111111111111111111111111111111111111111111111111111111111111", - "sha256:6542111111111111111111111111111111111111111111111111111111111111", - "sha256:6532111111111111111111111111111111111111111111111111111111111111", - } - - dset := NewSet() - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - t.Fatal(err) - } - } - - dgst, err := dset.Lookup("54") - if err != nil { - t.Fatal(err) - } - assertEqualDigests(t, dgst, digests[3]) - - dgst, err = dset.Lookup("1234") - if err == nil { - t.Fatal("Expected ambiguous error looking up: 1234") - } - if err != ErrDigestAmbiguous { - t.Fatal(err) - } - - dgst, err = dset.Lookup("9876") - if err == nil { - t.Fatal("Expected ambiguous error looking up: 9876") - } - if err != ErrDigestNotFound { - t.Fatal(err) - } - - dgst, err = dset.Lookup("sha256:1234") - if err == nil { - t.Fatal("Expected ambiguous error looking up: sha256:1234") - } - if err != ErrDigestAmbiguous { - t.Fatal(err) - } - - dgst, err = dset.Lookup("sha256:12345") - if err != nil { - t.Fatal(err) - } - assertEqualDigests(t, dgst, digests[0]) - - dgst, err = dset.Lookup("sha256:12346") - if err != nil { - t.Fatal(err) - } - assertEqualDigests(t, dgst, digests[2]) - - dgst, err = dset.Lookup("12346") - if err != nil { - t.Fatal(err) - } - assertEqualDigests(t, dgst, digests[2]) - - dgst, err = dset.Lookup("12345") - if err != nil { - t.Fatal(err) - } - assertEqualDigests(t, dgst, digests[0]) -} - -func TestAddDuplication(t *testing.T) { - digests := []Digest{ - "sha256:1234111111111111111111111111111111111111111111111111111111111111", - "sha256:1234511111111111111111111111111111111111111111111111111111111111", - "sha256:1234611111111111111111111111111111111111111111111111111111111111", - "sha256:5432111111111111111111111111111111111111111111111111111111111111", - "sha256:6543111111111111111111111111111111111111111111111111111111111111", - "sha512:65431111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - "sha512:65421111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - "sha512:65321111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - } - - dset := NewSet() - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - t.Fatal(err) - } - } - - if len(dset.entries) != 8 { - t.Fatal("Invalid dset size") - } - - if err := dset.Add(Digest("sha256:1234511111111111111111111111111111111111111111111111111111111111")); err != nil { - t.Fatal(err) - } - - if len(dset.entries) != 8 { - t.Fatal("Duplicate digest insert allowed") - } - - if err := dset.Add(Digest("sha384:123451111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")); err != nil { - t.Fatal(err) - } - - if len(dset.entries) != 9 { - t.Fatal("Insert with different algorithm not allowed") - } -} - -func TestRemove(t *testing.T) { - digests, err := createDigests(10) - if err != nil { - t.Fatal(err) - } - - dset := NewSet() - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - t.Fatal(err) - } - } - - dgst, err := dset.Lookup(digests[0].String()) - if err != nil { - t.Fatal(err) - } - if dgst != digests[0] { - t.Fatalf("Unexpected digest value:\n\tExpected: %s\n\tActual: %s", digests[0], dgst) - } - - if err := dset.Remove(digests[0]); err != nil { - t.Fatal(err) - } - - if _, err := dset.Lookup(digests[0].String()); err != ErrDigestNotFound { - t.Fatalf("Expected error %v when looking up removed digest, got %v", ErrDigestNotFound, err) - } -} - -func TestAll(t *testing.T) { - digests, err := createDigests(100) - if err != nil { - t.Fatal(err) - } - - dset := NewSet() - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - t.Fatal(err) - } - } - - all := map[Digest]struct{}{} - for _, dgst := range dset.All() { - all[dgst] = struct{}{} - } - - if len(all) != len(digests) { - t.Fatalf("Unexpected number of unique digests found:\n\tExpected: %d\n\tActual: %d", len(digests), len(all)) - } - - for i, dgst := range digests { - if _, ok := all[dgst]; !ok { - t.Fatalf("Missing element at position %d: %s", i, dgst) - } - } - -} - -func assertEqualShort(t *testing.T, actual, expected string) { - if actual != expected { - t.Fatalf("Unexpected short value:\n\tExpected: %s\n\tActual: %s", expected, actual) - } -} - -func TestShortCodeTable(t *testing.T) { - digests := []Digest{ - "sha256:1234111111111111111111111111111111111111111111111111111111111111", - "sha256:1234511111111111111111111111111111111111111111111111111111111111", - "sha256:1234611111111111111111111111111111111111111111111111111111111111", - "sha256:5432111111111111111111111111111111111111111111111111111111111111", - "sha256:6543111111111111111111111111111111111111111111111111111111111111", - "sha256:6432111111111111111111111111111111111111111111111111111111111111", - "sha256:6542111111111111111111111111111111111111111111111111111111111111", - "sha256:6532111111111111111111111111111111111111111111111111111111111111", - } - - dset := NewSet() - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - t.Fatal(err) - } - } - - dump := ShortCodeTable(dset, 2) - - if len(dump) < len(digests) { - t.Fatalf("Error unexpected size: %d, expecting %d", len(dump), len(digests)) - } - assertEqualShort(t, dump[digests[0]], "12341") - assertEqualShort(t, dump[digests[1]], "12345") - assertEqualShort(t, dump[digests[2]], "12346") - assertEqualShort(t, dump[digests[3]], "54") - assertEqualShort(t, dump[digests[4]], "6543") - assertEqualShort(t, dump[digests[5]], "64") - assertEqualShort(t, dump[digests[6]], "6542") - assertEqualShort(t, dump[digests[7]], "653") -} - -func createDigests(count int) ([]Digest, error) { - r := rand.New(rand.NewSource(25823)) - digests := make([]Digest, count) - for i := range digests { - h := sha256.New() - if err := binary.Write(h, binary.BigEndian, r.Int63()); err != nil { - return nil, err - } - digests[i] = NewDigest("sha256", h) - } - return digests, nil -} - -func benchAddNTable(b *testing.B, n int) { - digests, err := createDigests(n) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - dset := &Set{entries: digestEntries(make([]*digestEntry, 0, n))} - for j := range digests { - if err = dset.Add(digests[j]); err != nil { - b.Fatal(err) - } - } - } -} - -func benchLookupNTable(b *testing.B, n int, shortLen int) { - digests, err := createDigests(n) - if err != nil { - b.Fatal(err) - } - dset := &Set{entries: digestEntries(make([]*digestEntry, 0, n))} - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - b.Fatal(err) - } - } - shorts := make([]string, 0, n) - for _, short := range ShortCodeTable(dset, shortLen) { - shorts = append(shorts, short) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err = dset.Lookup(shorts[i%n]); err != nil { - b.Fatal(err) - } - } -} - -func benchRemoveNTable(b *testing.B, n int) { - digests, err := createDigests(n) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - dset := &Set{entries: digestEntries(make([]*digestEntry, 0, n))} - b.StopTimer() - for j := range digests { - if err = dset.Add(digests[j]); err != nil { - b.Fatal(err) - } - } - b.StartTimer() - for j := range digests { - if err = dset.Remove(digests[j]); err != nil { - b.Fatal(err) - } - } - } -} - -func benchShortCodeNTable(b *testing.B, n int, shortLen int) { - digests, err := createDigests(n) - if err != nil { - b.Fatal(err) - } - dset := &Set{entries: digestEntries(make([]*digestEntry, 0, n))} - for i := range digests { - if err := dset.Add(digests[i]); err != nil { - b.Fatal(err) - } - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - ShortCodeTable(dset, shortLen) - } -} - -func BenchmarkAdd10(b *testing.B) { - benchAddNTable(b, 10) -} - -func BenchmarkAdd100(b *testing.B) { - benchAddNTable(b, 100) -} - -func BenchmarkAdd1000(b *testing.B) { - benchAddNTable(b, 1000) -} - -func BenchmarkRemove10(b *testing.B) { - benchRemoveNTable(b, 10) -} - -func BenchmarkRemove100(b *testing.B) { - benchRemoveNTable(b, 100) -} - -func BenchmarkRemove1000(b *testing.B) { - benchRemoveNTable(b, 1000) -} - -func BenchmarkLookup10(b *testing.B) { - benchLookupNTable(b, 10, 12) -} - -func BenchmarkLookup100(b *testing.B) { - benchLookupNTable(b, 100, 12) -} - -func BenchmarkLookup1000(b *testing.B) { - benchLookupNTable(b, 1000, 12) -} - -func BenchmarkShortCode10(b *testing.B) { - benchShortCodeNTable(b, 10, 12) -} -func BenchmarkShortCode100(b *testing.B) { - benchShortCodeNTable(b, 100, 12) -} -func BenchmarkShortCode1000(b *testing.B) { - benchShortCodeNTable(b, 1000, 12) -} diff --git a/Godeps/_workspace/src/github.com/docker/distribution/digest/verifiers_test.go b/Godeps/_workspace/src/github.com/docker/distribution/digest/verifiers_test.go deleted file mode 100644 index c342d6e7c..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/digest/verifiers_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package digest - -import ( - "bytes" - "crypto/rand" - "io" - "testing" -) - -func TestDigestVerifier(t *testing.T) { - p := make([]byte, 1<<20) - rand.Read(p) - digest := FromBytes(p) - - verifier, err := NewDigestVerifier(digest) - if err != nil { - t.Fatalf("unexpected error getting digest verifier: %s", err) - } - - io.Copy(verifier, bytes.NewReader(p)) - - if !verifier.Verified() { - t.Fatalf("bytes not verified") - } -} - -// TestVerifierUnsupportedDigest ensures that unsupported digest validation is -// flowing through verifier creation. -func TestVerifierUnsupportedDigest(t *testing.T) { - unsupported := Digest("bean:0123456789abcdef") - - _, err := NewDigestVerifier(unsupported) - if err == nil { - t.Fatalf("expected error when creating verifier") - } - - if err != ErrDigestUnsupported { - t.Fatalf("incorrect error for unsupported digest: %v", err) - } -} - -// TODO(stevvooe): Add benchmarks to measure bytes/second throughput for -// DigestVerifier. -// -// The relevant benchmark for comparison can be run with the following -// commands: -// -// go test -bench . crypto/sha1 -// diff --git a/Godeps/_workspace/src/github.com/docker/distribution/reference/reference_test.go b/Godeps/_workspace/src/github.com/docker/distribution/reference/reference_test.go deleted file mode 100644 index cde1a7a2e..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/reference/reference_test.go +++ /dev/null @@ -1,535 +0,0 @@ -package reference - -import ( - "encoding/json" - "strconv" - "strings" - "testing" - - "github.com/docker/distribution/digest" -) - -func TestReferenceParse(t *testing.T) { - // referenceTestcases is a unified set of testcases for - // testing the parsing of references - referenceTestcases := []struct { - // input is the repository name or name component testcase - input string - // err is the error expected from Parse, or nil - err error - // repository is the string representation for the reference - repository string - // hostname is the hostname expected in the reference - hostname string - // tag is the tag for the reference - tag string - // digest is the digest for the reference (enforces digest reference) - digest string - }{ - { - input: "test_com", - repository: "test_com", - }, - { - input: "test.com:tag", - repository: "test.com", - tag: "tag", - }, - { - input: "test.com:5000", - repository: "test.com", - tag: "5000", - }, - { - input: "test.com/repo:tag", - hostname: "test.com", - repository: "test.com/repo", - tag: "tag", - }, - { - input: "test:5000/repo", - hostname: "test:5000", - repository: "test:5000/repo", - }, - { - input: "test:5000/repo:tag", - hostname: "test:5000", - repository: "test:5000/repo", - tag: "tag", - }, - { - input: "test:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - hostname: "test:5000", - repository: "test:5000/repo", - digest: "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - }, - { - input: "test:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - hostname: "test:5000", - repository: "test:5000/repo", - tag: "tag", - digest: "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - }, - { - input: "test:5000/repo", - hostname: "test:5000", - repository: "test:5000/repo", - }, - { - input: "", - err: ErrNameEmpty, - }, - { - input: ":justtag", - err: ErrReferenceInvalidFormat, - }, - { - input: "@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - err: ErrReferenceInvalidFormat, - }, - { - input: "repo@sha256:ffffffffffffffffffffffffffffffffff", - err: digest.ErrDigestInvalidLength, - }, - { - input: "validname@invaliddigest:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - err: digest.ErrDigestUnsupported, - }, - { - input: strings.Repeat("a/", 128) + "a:tag", - err: ErrNameTooLong, - }, - { - input: strings.Repeat("a/", 127) + "a:tag-puts-this-over-max", - hostname: "a", - repository: strings.Repeat("a/", 127) + "a", - tag: "tag-puts-this-over-max", - }, - { - input: "aa/asdf$$^/aa", - err: ErrReferenceInvalidFormat, - }, - { - input: "sub-dom1.foo.com/bar/baz/quux", - hostname: "sub-dom1.foo.com", - repository: "sub-dom1.foo.com/bar/baz/quux", - }, - { - input: "sub-dom1.foo.com/bar/baz/quux:some-long-tag", - hostname: "sub-dom1.foo.com", - repository: "sub-dom1.foo.com/bar/baz/quux", - tag: "some-long-tag", - }, - { - input: "b.gcr.io/test.example.com/my-app:test.example.com", - hostname: "b.gcr.io", - repository: "b.gcr.io/test.example.com/my-app", - tag: "test.example.com", - }, - { - input: "xn--n3h.com/myimage:xn--n3h.com", // ☃.com in punycode - hostname: "xn--n3h.com", - repository: "xn--n3h.com/myimage", - tag: "xn--n3h.com", - }, - { - input: "xn--7o8h.com/myimage:xn--7o8h.com@sha512:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // 🐳.com in punycode - hostname: "xn--7o8h.com", - repository: "xn--7o8h.com/myimage", - tag: "xn--7o8h.com", - digest: "sha512:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - }, - { - input: "foo_bar.com:8080", - repository: "foo_bar.com", - tag: "8080", - }, - { - input: "foo/foo_bar.com:8080", - hostname: "foo", - repository: "foo/foo_bar.com", - tag: "8080", - }, - } - for _, testcase := range referenceTestcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.input)+": "+format, v...) - t.Fail() - } - - repo, err := Parse(testcase.input) - if testcase.err != nil { - if err == nil { - failf("missing expected error: %v", testcase.err) - } else if testcase.err != err { - failf("mismatched error: got %v, expected %v", err, testcase.err) - } - continue - } else if err != nil { - failf("unexpected parse error: %v", err) - continue - } - if repo.String() != testcase.input { - failf("mismatched repo: got %q, expected %q", repo.String(), testcase.input) - } - - if named, ok := repo.(Named); ok { - if named.Name() != testcase.repository { - failf("unexpected repository: got %q, expected %q", named.Name(), testcase.repository) - } - hostname, _ := SplitHostname(named) - if hostname != testcase.hostname { - failf("unexpected hostname: got %q, expected %q", hostname, testcase.hostname) - } - } else if testcase.repository != "" || testcase.hostname != "" { - failf("expected named type, got %T", repo) - } - - tagged, ok := repo.(Tagged) - if testcase.tag != "" { - if ok { - if tagged.Tag() != testcase.tag { - failf("unexpected tag: got %q, expected %q", tagged.Tag(), testcase.tag) - } - } else { - failf("expected tagged type, got %T", repo) - } - } else if ok { - failf("unexpected tagged type") - } - - digested, ok := repo.(Digested) - if testcase.digest != "" { - if ok { - if digested.Digest().String() != testcase.digest { - failf("unexpected digest: got %q, expected %q", digested.Digest().String(), testcase.digest) - } - } else { - failf("expected digested type, got %T", repo) - } - } else if ok { - failf("unexpected digested type") - } - - } -} - -// TestWithNameFailure tests cases where WithName should fail. Cases where it -// should succeed are covered by TestSplitHostname, below. -func TestWithNameFailure(t *testing.T) { - testcases := []struct { - input string - err error - }{ - { - input: "", - err: ErrNameEmpty, - }, - { - input: ":justtag", - err: ErrReferenceInvalidFormat, - }, - { - input: "@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - err: ErrReferenceInvalidFormat, - }, - { - input: "validname@invaliddigest:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - err: ErrReferenceInvalidFormat, - }, - { - input: strings.Repeat("a/", 128) + "a:tag", - err: ErrNameTooLong, - }, - { - input: "aa/asdf$$^/aa", - err: ErrReferenceInvalidFormat, - }, - } - for _, testcase := range testcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.input)+": "+format, v...) - t.Fail() - } - - _, err := WithName(testcase.input) - if err == nil { - failf("no error parsing name. expected: %s", testcase.err) - } - } -} - -func TestSplitHostname(t *testing.T) { - testcases := []struct { - input string - hostname string - name string - }{ - { - input: "test.com/foo", - hostname: "test.com", - name: "foo", - }, - { - input: "test_com/foo", - hostname: "", - name: "test_com/foo", - }, - { - input: "test:8080/foo", - hostname: "test:8080", - name: "foo", - }, - { - input: "test.com:8080/foo", - hostname: "test.com:8080", - name: "foo", - }, - { - input: "test-com:8080/foo", - hostname: "test-com:8080", - name: "foo", - }, - { - input: "xn--n3h.com:18080/foo", - hostname: "xn--n3h.com:18080", - name: "foo", - }, - } - for _, testcase := range testcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.input)+": "+format, v...) - t.Fail() - } - - named, err := WithName(testcase.input) - if err != nil { - failf("error parsing name: %s", err) - } - hostname, name := SplitHostname(named) - if hostname != testcase.hostname { - failf("unexpected hostname: got %q, expected %q", hostname, testcase.hostname) - } - if name != testcase.name { - failf("unexpected name: got %q, expected %q", name, testcase.name) - } - } -} - -type serializationType struct { - Description string - Field Field -} - -func TestSerialization(t *testing.T) { - testcases := []struct { - description string - input string - name string - tag string - digest string - err error - }{ - { - description: "empty value", - err: ErrNameEmpty, - }, - { - description: "just a name", - input: "example.com:8000/named", - name: "example.com:8000/named", - }, - { - description: "name with a tag", - input: "example.com:8000/named:tagged", - name: "example.com:8000/named", - tag: "tagged", - }, - { - description: "name with digest", - input: "other.com/named@sha256:1234567890098765432112345667890098765432112345667890098765432112", - name: "other.com/named", - digest: "sha256:1234567890098765432112345667890098765432112345667890098765432112", - }, - } - for _, testcase := range testcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.input)+": "+format, v...) - t.Fail() - } - - m := map[string]string{ - "Description": testcase.description, - "Field": testcase.input, - } - b, err := json.Marshal(m) - if err != nil { - failf("error marshalling: %v", err) - } - t := serializationType{} - - if err := json.Unmarshal(b, &t); err != nil { - if testcase.err == nil { - failf("error unmarshalling: %v", err) - } - if err != testcase.err { - failf("wrong error, expected %v, got %v", testcase.err, err) - } - - continue - } else if testcase.err != nil { - failf("expected error unmarshalling: %v", testcase.err) - } - - if t.Description != testcase.description { - failf("wrong description, expected %q, got %q", testcase.description, t.Description) - } - - ref := t.Field.Reference() - - if named, ok := ref.(Named); ok { - if named.Name() != testcase.name { - failf("unexpected repository: got %q, expected %q", named.Name(), testcase.name) - } - } else if testcase.name != "" { - failf("expected named type, got %T", ref) - } - - tagged, ok := ref.(Tagged) - if testcase.tag != "" { - if ok { - if tagged.Tag() != testcase.tag { - failf("unexpected tag: got %q, expected %q", tagged.Tag(), testcase.tag) - } - } else { - failf("expected tagged type, got %T", ref) - } - } else if ok { - failf("unexpected tagged type") - } - - digested, ok := ref.(Digested) - if testcase.digest != "" { - if ok { - if digested.Digest().String() != testcase.digest { - failf("unexpected digest: got %q, expected %q", digested.Digest().String(), testcase.digest) - } - } else { - failf("expected digested type, got %T", ref) - } - } else if ok { - failf("unexpected digested type") - } - - t = serializationType{ - Description: testcase.description, - Field: AsField(ref), - } - - b2, err := json.Marshal(t) - if err != nil { - failf("error marshing serialization type: %v", err) - } - - if string(b) != string(b2) { - failf("unexpected serialized value: expected %q, got %q", string(b), string(b2)) - } - - // Ensure t.Field is not implementing "Reference" directly, getting - // around the Reference type system - var fieldInterface interface{} = t.Field - if _, ok := fieldInterface.(Reference); ok { - failf("field should not implement Reference interface") - } - - } -} - -func TestWithTag(t *testing.T) { - testcases := []struct { - name string - tag string - combined string - }{ - { - name: "test.com/foo", - tag: "tag", - combined: "test.com/foo:tag", - }, - { - name: "foo", - tag: "tag2", - combined: "foo:tag2", - }, - { - name: "test.com:8000/foo", - tag: "tag4", - combined: "test.com:8000/foo:tag4", - }, - { - name: "test.com:8000/foo", - tag: "TAG5", - combined: "test.com:8000/foo:TAG5", - }, - } - for _, testcase := range testcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.name)+": "+format, v...) - t.Fail() - } - - named, err := WithName(testcase.name) - if err != nil { - failf("error parsing name: %s", err) - } - tagged, err := WithTag(named, testcase.tag) - if err != nil { - failf("WithTag failed: %s", err) - } - if tagged.String() != testcase.combined { - failf("unexpected: got %q, expected %q", tagged.String(), testcase.combined) - } - } -} - -func TestWithDigest(t *testing.T) { - testcases := []struct { - name string - digest digest.Digest - combined string - }{ - { - name: "test.com/foo", - digest: "sha256:1234567890098765432112345667890098765", - combined: "test.com/foo@sha256:1234567890098765432112345667890098765", - }, - { - name: "foo", - digest: "sha256:1234567890098765432112345667890098765", - combined: "foo@sha256:1234567890098765432112345667890098765", - }, - { - name: "test.com:8000/foo", - digest: "sha256:1234567890098765432112345667890098765", - combined: "test.com:8000/foo@sha256:1234567890098765432112345667890098765", - }, - } - for _, testcase := range testcases { - failf := func(format string, v ...interface{}) { - t.Logf(strconv.Quote(testcase.name)+": "+format, v...) - t.Fail() - } - - named, err := WithName(testcase.name) - if err != nil { - failf("error parsing name: %s", err) - } - digested, err := WithDigest(named, testcase.digest) - if err != nil { - failf("WithDigest failed: %s", err) - } - if digested.String() != testcase.combined { - failf("unexpected: got %q, expected %q", digested.String(), testcase.combined) - } - } -} diff --git a/Godeps/_workspace/src/github.com/docker/distribution/reference/regexp_test.go b/Godeps/_workspace/src/github.com/docker/distribution/reference/regexp_test.go deleted file mode 100644 index 2ec39377a..000000000 --- a/Godeps/_workspace/src/github.com/docker/distribution/reference/regexp_test.go +++ /dev/null @@ -1,489 +0,0 @@ -package reference - -import ( - "regexp" - "strings" - "testing" -) - -type regexpMatch struct { - input string - match bool - subs []string -} - -func checkRegexp(t *testing.T, r *regexp.Regexp, m regexpMatch) { - matches := r.FindStringSubmatch(m.input) - if m.match && matches != nil { - if len(matches) != (r.NumSubexp()+1) || matches[0] != m.input { - t.Fatalf("Bad match result %#v for %q", matches, m.input) - } - if len(matches) < (len(m.subs) + 1) { - t.Errorf("Expected %d sub matches, only have %d for %q", len(m.subs), len(matches)-1, m.input) - } - for i := range m.subs { - if m.subs[i] != matches[i+1] { - t.Errorf("Unexpected submatch %d: %q, expected %q for %q", i+1, matches[i+1], m.subs[i], m.input) - } - } - } else if m.match { - t.Errorf("Expected match for %q", m.input) - } else if matches != nil { - t.Errorf("Unexpected match for %q", m.input) - } -} - -func TestHostRegexp(t *testing.T) { - hostcases := []regexpMatch{ - { - input: "test.com", - match: true, - }, - { - input: "test.com:10304", - match: true, - }, - { - input: "test.com:http", - match: false, - }, - { - input: "localhost", - match: true, - }, - { - input: "localhost:8080", - match: true, - }, - { - input: "a", - match: true, - }, - { - input: "a.b", - match: true, - }, - { - input: "ab.cd.com", - match: true, - }, - { - input: "a-b.com", - match: true, - }, - { - input: "-ab.com", - match: false, - }, - { - input: "ab-.com", - match: false, - }, - { - input: "ab.c-om", - match: true, - }, - { - input: "ab.-com", - match: false, - }, - { - input: "ab.com-", - match: false, - }, - { - input: "0101.com", - match: true, // TODO(dmcgowan): valid if this should be allowed - }, - { - input: "001a.com", - match: true, - }, - { - input: "b.gbc.io:443", - match: true, - }, - { - input: "b.gbc.io", - match: true, - }, - { - input: "xn--n3h.com", // ☃.com in punycode - match: true, - }, - { - input: "Asdf.com", // uppercase character - match: true, - }, - } - r := regexp.MustCompile(`^` + hostnameRegexp.String() + `$`) - for i := range hostcases { - checkRegexp(t, r, hostcases[i]) - } -} - -func TestFullNameRegexp(t *testing.T) { - if anchoredNameRegexp.NumSubexp() != 2 { - t.Fatalf("anchored name regexp should have two submatches: %v, %v != 2", - anchoredNameRegexp, anchoredNameRegexp.NumSubexp()) - } - - testcases := []regexpMatch{ - { - input: "", - match: false, - }, - { - input: "short", - match: true, - subs: []string{"", "short"}, - }, - { - input: "simple/name", - match: true, - subs: []string{"simple", "name"}, - }, - { - input: "library/ubuntu", - match: true, - subs: []string{"library", "ubuntu"}, - }, - { - input: "docker/stevvooe/app", - match: true, - subs: []string{"docker", "stevvooe/app"}, - }, - { - input: "aa/aa/aa/aa/aa/aa/aa/aa/aa/bb/bb/bb/bb/bb/bb", - match: true, - subs: []string{"aa", "aa/aa/aa/aa/aa/aa/aa/aa/bb/bb/bb/bb/bb/bb"}, - }, - { - input: "aa/aa/bb/bb/bb", - match: true, - subs: []string{"aa", "aa/bb/bb/bb"}, - }, - { - input: "a/a/a/a", - match: true, - subs: []string{"a", "a/a/a"}, - }, - { - input: "a/a/a/a/", - match: false, - }, - { - input: "a//a/a", - match: false, - }, - { - input: "a", - match: true, - subs: []string{"", "a"}, - }, - { - input: "a/aa", - match: true, - subs: []string{"a", "aa"}, - }, - { - input: "a/aa/a", - match: true, - subs: []string{"a", "aa/a"}, - }, - { - input: "foo.com", - match: true, - subs: []string{"", "foo.com"}, - }, - { - input: "foo.com/", - match: false, - }, - { - input: "foo.com:8080/bar", - match: true, - subs: []string{"foo.com:8080", "bar"}, - }, - { - input: "foo.com:http/bar", - match: false, - }, - { - input: "foo.com/bar", - match: true, - subs: []string{"foo.com", "bar"}, - }, - { - input: "foo.com/bar/baz", - match: true, - subs: []string{"foo.com", "bar/baz"}, - }, - { - input: "localhost:8080/bar", - match: true, - subs: []string{"localhost:8080", "bar"}, - }, - { - input: "sub-dom1.foo.com/bar/baz/quux", - match: true, - subs: []string{"sub-dom1.foo.com", "bar/baz/quux"}, - }, - { - input: "blog.foo.com/bar/baz", - match: true, - subs: []string{"blog.foo.com", "bar/baz"}, - }, - { - input: "a^a", - match: false, - }, - { - input: "aa/asdf$$^/aa", - match: false, - }, - { - input: "asdf$$^/aa", - match: false, - }, - { - input: "aa-a/a", - match: true, - subs: []string{"aa-a", "a"}, - }, - { - input: strings.Repeat("a/", 128) + "a", - match: true, - subs: []string{"a", strings.Repeat("a/", 127) + "a"}, - }, - { - input: "a-/a/a/a", - match: false, - }, - { - input: "foo.com/a-/a/a", - match: false, - }, - { - input: "-foo/bar", - match: false, - }, - { - input: "foo/bar-", - match: false, - }, - { - input: "foo-/bar", - match: false, - }, - { - input: "foo/-bar", - match: false, - }, - { - input: "_foo/bar", - match: false, - }, - { - input: "foo_bar", - match: true, - subs: []string{"", "foo_bar"}, - }, - { - input: "foo_bar.com", - match: true, - subs: []string{"", "foo_bar.com"}, - }, - { - input: "foo_bar.com:8080", - match: false, - }, - { - input: "foo_bar.com:8080/app", - match: false, - }, - { - input: "foo.com/foo_bar", - match: true, - subs: []string{"foo.com", "foo_bar"}, - }, - { - input: "____/____", - match: false, - }, - { - input: "_docker/_docker", - match: false, - }, - { - input: "docker_/docker_", - match: false, - }, - { - input: "b.gcr.io/test.example.com/my-app", - match: true, - subs: []string{"b.gcr.io", "test.example.com/my-app"}, - }, - { - input: "xn--n3h.com/myimage", // ☃.com in punycode - match: true, - subs: []string{"xn--n3h.com", "myimage"}, - }, - { - input: "xn--7o8h.com/myimage", // 🐳.com in punycode - match: true, - subs: []string{"xn--7o8h.com", "myimage"}, - }, - { - input: "example.com/xn--7o8h.com/myimage", // 🐳.com in punycode - match: true, - subs: []string{"example.com", "xn--7o8h.com/myimage"}, - }, - { - input: "example.com/some_separator__underscore/myimage", - match: true, - subs: []string{"example.com", "some_separator__underscore/myimage"}, - }, - { - input: "example.com/__underscore/myimage", - match: false, - }, - { - input: "example.com/..dots/myimage", - match: false, - }, - { - input: "example.com/.dots/myimage", - match: false, - }, - { - input: "example.com/nodouble..dots/myimage", - match: false, - }, - { - input: "example.com/nodouble..dots/myimage", - match: false, - }, - { - input: "docker./docker", - match: false, - }, - { - input: ".docker/docker", - match: false, - }, - { - input: "docker-/docker", - match: false, - }, - { - input: "-docker/docker", - match: false, - }, - { - input: "do..cker/docker", - match: false, - }, - { - input: "do__cker:8080/docker", - match: false, - }, - { - input: "do__cker/docker", - match: true, - subs: []string{"", "do__cker/docker"}, - }, - { - input: "b.gcr.io/test.example.com/my-app", - match: true, - subs: []string{"b.gcr.io", "test.example.com/my-app"}, - }, - { - input: "registry.io/foo/project--id.module--name.ver---sion--name", - match: true, - subs: []string{"registry.io", "foo/project--id.module--name.ver---sion--name"}, - }, - { - input: "Asdf.com/foo/bar", // uppercase character in hostname - match: true, - }, - { - input: "Foo/FarB", // uppercase characters in remote name - match: false, - }, - } - for i := range testcases { - checkRegexp(t, anchoredNameRegexp, testcases[i]) - } -} - -func TestReferenceRegexp(t *testing.T) { - if ReferenceRegexp.NumSubexp() != 3 { - t.Fatalf("anchored name regexp should have three submatches: %v, %v != 3", - ReferenceRegexp, ReferenceRegexp.NumSubexp()) - } - - testcases := []regexpMatch{ - { - input: "registry.com:8080/myapp:tag", - match: true, - subs: []string{"registry.com:8080/myapp", "tag", ""}, - }, - { - input: "registry.com:8080/myapp@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: true, - subs: []string{"registry.com:8080/myapp", "", "sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912"}, - }, - { - input: "registry.com:8080/myapp:tag2@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: true, - subs: []string{"registry.com:8080/myapp", "tag2", "sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912"}, - }, - { - input: "registry.com:8080/myapp@sha256:badbadbadbad", - match: false, - }, - { - input: "registry.com:8080/myapp:invalid~tag", - match: false, - }, - { - input: "bad_hostname.com:8080/myapp:tag", - match: false, - }, - { - input:// localhost treated as name, missing tag with 8080 as tag - "localhost:8080@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: true, - subs: []string{"localhost", "8080", "sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912"}, - }, - { - input: "localhost:8080/name@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: true, - subs: []string{"localhost:8080/name", "", "sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912"}, - }, - { - input: "localhost:http/name@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: false, - }, - { - // localhost will be treated as an image name without a host - input: "localhost@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", - match: true, - subs: []string{"localhost", "", "sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912"}, - }, - { - input: "registry.com:8080/myapp@bad", - match: false, - }, - { - input: "registry.com:8080/myapp@2bad", - match: false, // TODO(dmcgowan): Support this as valid - }, - } - - for i := range testcases { - checkRegexp(t, ReferenceRegexp, testcases[i]) - } - -} diff --git a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mount_test.go b/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mount_test.go deleted file mode 100644 index 5c7f1b86a..000000000 --- a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mount_test.go +++ /dev/null @@ -1,137 +0,0 @@ -package mount - -import ( - "os" - "path" - "testing" -) - -func TestMountOptionsParsing(t *testing.T) { - options := "noatime,ro,size=10k" - - flag, data := parseOptions(options) - - if data != "size=10k" { - t.Fatalf("Expected size=10 got %s", data) - } - - expectedFlag := NOATIME | RDONLY - - if flag != expectedFlag { - t.Fatalf("Expected %d got %d", expectedFlag, flag) - } -} - -func TestMounted(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - sourcePath = path.Join(sourceDir, "file.txt") - targetPath = path.Join(targetDir, "file.txt") - ) - - os.Mkdir(sourceDir, 0777) - os.Mkdir(targetDir, 0777) - - f, err := os.Create(sourcePath) - if err != nil { - t.Fatal(err) - } - f.WriteString("hello") - f.Close() - - f, err = os.Create(targetPath) - if err != nil { - t.Fatal(err) - } - f.Close() - - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - mounted, err := Mounted(targetDir) - if err != nil { - t.Fatal(err) - } - if !mounted { - t.Fatalf("Expected %s to be mounted", targetDir) - } - if _, err := os.Stat(targetDir); err != nil { - t.Fatal(err) - } -} - -func TestMountReadonly(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - sourcePath = path.Join(sourceDir, "file.txt") - targetPath = path.Join(targetDir, "file.txt") - ) - - os.Mkdir(sourceDir, 0777) - os.Mkdir(targetDir, 0777) - - f, err := os.Create(sourcePath) - if err != nil { - t.Fatal(err) - } - f.WriteString("hello") - f.Close() - - f, err = os.Create(targetPath) - if err != nil { - t.Fatal(err) - } - f.Close() - - if err := Mount(sourceDir, targetDir, "none", "bind,ro"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - f, err = os.OpenFile(targetPath, os.O_RDWR, 0777) - if err == nil { - t.Fatal("Should not be able to open a ro file as rw") - } -} - -func TestGetMounts(t *testing.T) { - mounts, err := GetMounts() - if err != nil { - t.Fatal(err) - } - - root := false - for _, entry := range mounts { - if entry.Mountpoint == "/" { - root = true - } - } - - if !root { - t.Fatal("/ should be mounted at least") - } -} diff --git a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go b/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go deleted file mode 100644 index 812d12e82..000000000 --- a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go +++ /dev/null @@ -1,477 +0,0 @@ -// +build linux - -package mount - -import ( - "bytes" - "testing" -) - -const ( - fedoraMountinfo = `15 35 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw - 16 35 0:14 / /sys rw,nosuid,nodev,noexec,relatime shared:6 - sysfs sysfs rw,seclabel - 17 35 0:5 / /dev rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=8056484k,nr_inodes=2014121,mode=755 - 18 16 0:15 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:7 - securityfs securityfs rw - 19 16 0:13 / /sys/fs/selinux rw,relatime shared:8 - selinuxfs selinuxfs rw - 20 17 0:16 / /dev/shm rw,nosuid,nodev shared:3 - tmpfs tmpfs rw,seclabel - 21 17 0:10 / /dev/pts rw,nosuid,noexec,relatime shared:4 - devpts devpts rw,seclabel,gid=5,mode=620,ptmxmode=000 - 22 35 0:17 / /run rw,nosuid,nodev shared:21 - tmpfs tmpfs rw,seclabel,mode=755 - 23 16 0:18 / /sys/fs/cgroup rw,nosuid,nodev,noexec shared:9 - tmpfs tmpfs rw,seclabel,mode=755 - 24 23 0:19 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd - 25 16 0:20 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:20 - pstore pstore rw - 26 23 0:21 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,cpuset,clone_children - 27 23 0:22 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,cpuacct,cpu,clone_children - 28 23 0:23 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,memory,clone_children - 29 23 0:24 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,devices,clone_children - 30 23 0:25 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,freezer,clone_children - 31 23 0:26 / /sys/fs/cgroup/net_cls rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,net_cls,clone_children - 32 23 0:27 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,blkio,clone_children - 33 23 0:28 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,perf_event,clone_children - 34 23 0:29 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,hugetlb,clone_children - 35 1 253:2 / / rw,relatime shared:1 - ext4 /dev/mapper/ssd-root--f20 rw,seclabel,data=ordered - 36 15 0:30 / /proc/sys/fs/binfmt_misc rw,relatime shared:22 - autofs systemd-1 rw,fd=38,pgrp=1,timeout=300,minproto=5,maxproto=5,direct - 37 17 0:12 / /dev/mqueue rw,relatime shared:23 - mqueue mqueue rw,seclabel - 38 35 0:31 / /tmp rw shared:24 - tmpfs tmpfs rw,seclabel - 39 17 0:32 / /dev/hugepages rw,relatime shared:25 - hugetlbfs hugetlbfs rw,seclabel - 40 16 0:7 / /sys/kernel/debug rw,relatime shared:26 - debugfs debugfs rw - 41 16 0:33 / /sys/kernel/config rw,relatime shared:27 - configfs configfs rw - 42 35 0:34 / /var/lib/nfs/rpc_pipefs rw,relatime shared:28 - rpc_pipefs sunrpc rw - 43 15 0:35 / /proc/fs/nfsd rw,relatime shared:29 - nfsd sunrpc rw - 45 35 8:17 / /boot rw,relatime shared:30 - ext4 /dev/sdb1 rw,seclabel,data=ordered - 46 35 253:4 / /home rw,relatime shared:31 - ext4 /dev/mapper/ssd-home rw,seclabel,data=ordered - 47 35 253:5 / /var/lib/libvirt/images rw,noatime,nodiratime shared:32 - ext4 /dev/mapper/ssd-virt rw,seclabel,discard,data=ordered - 48 35 253:12 / /mnt/old rw,relatime shared:33 - ext4 /dev/mapper/HelpDeskRHEL6-FedoraRoot rw,seclabel,data=ordered - 121 22 0:36 / /run/user/1000/gvfs rw,nosuid,nodev,relatime shared:104 - fuse.gvfsd-fuse gvfsd-fuse rw,user_id=1000,group_id=1000 - 124 16 0:37 / /sys/fs/fuse/connections rw,relatime shared:107 - fusectl fusectl rw - 165 38 253:3 / /tmp/mnt rw,relatime shared:147 - ext4 /dev/mapper/ssd-root rw,seclabel,data=ordered - 167 35 253:15 / /var/lib/docker/devicemapper/mnt/aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,relatime shared:149 - ext4 /dev/mapper/docker-253:2-425882-aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,seclabel,discard,stripe=16,data=ordered - 171 35 253:16 / /var/lib/docker/devicemapper/mnt/c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,relatime shared:153 - ext4 /dev/mapper/docker-253:2-425882-c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,seclabel,discard,stripe=16,data=ordered - 175 35 253:17 / /var/lib/docker/devicemapper/mnt/1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,relatime shared:157 - ext4 /dev/mapper/docker-253:2-425882-1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,seclabel,discard,stripe=16,data=ordered - 179 35 253:18 / /var/lib/docker/devicemapper/mnt/d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,relatime shared:161 - ext4 /dev/mapper/docker-253:2-425882-d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,seclabel,discard,stripe=16,data=ordered - 183 35 253:19 / /var/lib/docker/devicemapper/mnt/6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,relatime shared:165 - ext4 /dev/mapper/docker-253:2-425882-6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,seclabel,discard,stripe=16,data=ordered - 187 35 253:20 / /var/lib/docker/devicemapper/mnt/8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,relatime shared:169 - ext4 /dev/mapper/docker-253:2-425882-8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,seclabel,discard,stripe=16,data=ordered - 191 35 253:21 / /var/lib/docker/devicemapper/mnt/c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,relatime shared:173 - ext4 /dev/mapper/docker-253:2-425882-c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,seclabel,discard,stripe=16,data=ordered - 195 35 253:22 / /var/lib/docker/devicemapper/mnt/2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,relatime shared:177 - ext4 /dev/mapper/docker-253:2-425882-2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,seclabel,discard,stripe=16,data=ordered - 199 35 253:23 / /var/lib/docker/devicemapper/mnt/37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,relatime shared:181 - ext4 /dev/mapper/docker-253:2-425882-37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,seclabel,discard,stripe=16,data=ordered - 203 35 253:24 / /var/lib/docker/devicemapper/mnt/aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,relatime shared:185 - ext4 /dev/mapper/docker-253:2-425882-aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,seclabel,discard,stripe=16,data=ordered - 207 35 253:25 / /var/lib/docker/devicemapper/mnt/928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,relatime shared:189 - ext4 /dev/mapper/docker-253:2-425882-928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,seclabel,discard,stripe=16,data=ordered - 211 35 253:26 / /var/lib/docker/devicemapper/mnt/0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,relatime shared:193 - ext4 /dev/mapper/docker-253:2-425882-0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,seclabel,discard,stripe=16,data=ordered - 215 35 253:27 / /var/lib/docker/devicemapper/mnt/d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,relatime shared:197 - ext4 /dev/mapper/docker-253:2-425882-d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,seclabel,discard,stripe=16,data=ordered - 219 35 253:28 / /var/lib/docker/devicemapper/mnt/bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,relatime shared:201 - ext4 /dev/mapper/docker-253:2-425882-bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,seclabel,discard,stripe=16,data=ordered - 223 35 253:29 / /var/lib/docker/devicemapper/mnt/7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,relatime shared:205 - ext4 /dev/mapper/docker-253:2-425882-7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,seclabel,discard,stripe=16,data=ordered - 227 35 253:30 / /var/lib/docker/devicemapper/mnt/c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,relatime shared:209 - ext4 /dev/mapper/docker-253:2-425882-c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,seclabel,discard,stripe=16,data=ordered - 231 35 253:31 / /var/lib/docker/devicemapper/mnt/8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,relatime shared:213 - ext4 /dev/mapper/docker-253:2-425882-8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,seclabel,discard,stripe=16,data=ordered - 235 35 253:32 / /var/lib/docker/devicemapper/mnt/1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,relatime shared:217 - ext4 /dev/mapper/docker-253:2-425882-1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,seclabel,discard,stripe=16,data=ordered - 239 35 253:33 / /var/lib/docker/devicemapper/mnt/e9aa60c60128cad1 rw,relatime shared:221 - ext4 /dev/mapper/docker-253:2-425882-e9aa60c60128cad1 rw,seclabel,discard,stripe=16,data=ordered - 243 35 253:34 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,relatime shared:225 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,seclabel,discard,stripe=16,data=ordered - 247 35 253:35 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,relatime shared:229 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,seclabel,discard,stripe=16,data=ordered - 31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1` - - ubuntuMountInfo = `15 20 0:14 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw -16 20 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw -17 20 0:5 / /dev rw,relatime - devtmpfs udev rw,size=1015140k,nr_inodes=253785,mode=755 -18 17 0:11 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000 -19 20 0:15 / /run rw,nosuid,noexec,relatime - tmpfs tmpfs rw,size=205044k,mode=755 -20 1 253:0 / / rw,relatime - ext4 /dev/disk/by-label/DOROOT rw,errors=remount-ro,data=ordered -21 15 0:16 / /sys/fs/cgroup rw,relatime - tmpfs none rw,size=4k,mode=755 -22 15 0:17 / /sys/fs/fuse/connections rw,relatime - fusectl none rw -23 15 0:6 / /sys/kernel/debug rw,relatime - debugfs none rw -24 15 0:10 / /sys/kernel/security rw,relatime - securityfs none rw -25 19 0:18 / /run/lock rw,nosuid,nodev,noexec,relatime - tmpfs none rw,size=5120k -26 21 0:19 / /sys/fs/cgroup/cpuset rw,relatime - cgroup cgroup rw,cpuset,clone_children -27 19 0:20 / /run/shm rw,nosuid,nodev,relatime - tmpfs none rw -28 21 0:21 / /sys/fs/cgroup/cpu rw,relatime - cgroup cgroup rw,cpu -29 19 0:22 / /run/user rw,nosuid,nodev,noexec,relatime - tmpfs none rw,size=102400k,mode=755 -30 15 0:23 / /sys/fs/pstore rw,relatime - pstore none rw -31 21 0:24 / /sys/fs/cgroup/cpuacct rw,relatime - cgroup cgroup rw,cpuacct -32 21 0:25 / /sys/fs/cgroup/memory rw,relatime - cgroup cgroup rw,memory -33 21 0:26 / /sys/fs/cgroup/devices rw,relatime - cgroup cgroup rw,devices -34 21 0:27 / /sys/fs/cgroup/freezer rw,relatime - cgroup cgroup rw,freezer -35 21 0:28 / /sys/fs/cgroup/blkio rw,relatime - cgroup cgroup rw,blkio -36 21 0:29 / /sys/fs/cgroup/perf_event rw,relatime - cgroup cgroup rw,perf_event -37 21 0:30 / /sys/fs/cgroup/hugetlb rw,relatime - cgroup cgroup rw,hugetlb -38 21 0:31 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup systemd rw,name=systemd -39 20 0:32 / /var/lib/docker/aufs/mnt/b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc rw,relatime - aufs none rw,si=caafa54fdc06525 -40 20 0:33 / /var/lib/docker/aufs/mnt/2eed44ac7ce7c75af04f088ed6cb4ce9d164801e91d78c6db65d7ef6d572bba8-init rw,relatime - aufs none rw,si=caafa54f882b525 -41 20 0:34 / /var/lib/docker/aufs/mnt/2eed44ac7ce7c75af04f088ed6cb4ce9d164801e91d78c6db65d7ef6d572bba8 rw,relatime - aufs none rw,si=caafa54f8829525 -42 20 0:35 / /var/lib/docker/aufs/mnt/16f4d7e96dd612903f425bfe856762f291ff2e36a8ecd55a2209b7d7cd81c30b rw,relatime - aufs none rw,si=caafa54f882d525 -43 20 0:36 / /var/lib/docker/aufs/mnt/63ca08b75d7438a9469a5954e003f48ffede73541f6286ce1cb4d7dd4811da7e-init rw,relatime - aufs none rw,si=caafa54f882f525 -44 20 0:37 / /var/lib/docker/aufs/mnt/63ca08b75d7438a9469a5954e003f48ffede73541f6286ce1cb4d7dd4811da7e rw,relatime - aufs none rw,si=caafa54f88ba525 -45 20 0:38 / /var/lib/docker/aufs/mnt/283f35a910233c756409313be71ecd8fcfef0df57108b8d740b61b3e88860452 rw,relatime - aufs none rw,si=caafa54f88b8525 -46 20 0:39 / /var/lib/docker/aufs/mnt/2c6c7253d4090faa3886871fb21bd660609daeb0206588c0602007f7d0f254b1-init rw,relatime - aufs none rw,si=caafa54f88be525 -47 20 0:40 / /var/lib/docker/aufs/mnt/2c6c7253d4090faa3886871fb21bd660609daeb0206588c0602007f7d0f254b1 rw,relatime - aufs none rw,si=caafa54f882c525 -48 20 0:41 / /var/lib/docker/aufs/mnt/de2b538c97d6366cc80e8658547c923ea1d042f85580df379846f36a4df7049d rw,relatime - aufs none rw,si=caafa54f85bb525 -49 20 0:42 / /var/lib/docker/aufs/mnt/94a3d8ed7c27e5b0aa71eba46c736bfb2742afda038e74f2dd6035fb28415b49-init rw,relatime - aufs none rw,si=caafa54fdc00525 -50 20 0:43 / /var/lib/docker/aufs/mnt/94a3d8ed7c27e5b0aa71eba46c736bfb2742afda038e74f2dd6035fb28415b49 rw,relatime - aufs none rw,si=caafa54fbaec525 -51 20 0:44 / /var/lib/docker/aufs/mnt/6ac1cace985c9fc9bea32234de8b36dba49bdd5e29a2972b327ff939d78a6274 rw,relatime - aufs none rw,si=caafa54f8e1a525 -52 20 0:45 / /var/lib/docker/aufs/mnt/dff147033e3a0ef061e1de1ad34256b523d4a8c1fa6bba71a0ab538e8628ff0b-init rw,relatime - aufs none rw,si=caafa54f8e1d525 -53 20 0:46 / /var/lib/docker/aufs/mnt/dff147033e3a0ef061e1de1ad34256b523d4a8c1fa6bba71a0ab538e8628ff0b rw,relatime - aufs none rw,si=caafa54f8e1b525 -54 20 0:47 / /var/lib/docker/aufs/mnt/cabb117d997f0f93519185aea58389a9762770b7496ed0b74a3e4a083fa45902 rw,relatime - aufs none rw,si=caafa54f810a525 -55 20 0:48 / /var/lib/docker/aufs/mnt/e1c8a94ffaa9d532bbbdc6ef771ce8a6c2c06757806ecaf8b68e9108fec65f33-init rw,relatime - aufs none rw,si=caafa54f8529525 -56 20 0:49 / /var/lib/docker/aufs/mnt/e1c8a94ffaa9d532bbbdc6ef771ce8a6c2c06757806ecaf8b68e9108fec65f33 rw,relatime - aufs none rw,si=caafa54f852f525 -57 20 0:50 / /var/lib/docker/aufs/mnt/16a1526fa445b84ce84f89506d219e87fa488a814063baf045d88b02f21166b3 rw,relatime - aufs none rw,si=caafa54f9e1d525 -58 20 0:51 / /var/lib/docker/aufs/mnt/57b9c92e1e368fa7dbe5079f7462e917777829caae732828b003c355fe49da9f-init rw,relatime - aufs none rw,si=caafa54f854d525 -59 20 0:52 / /var/lib/docker/aufs/mnt/57b9c92e1e368fa7dbe5079f7462e917777829caae732828b003c355fe49da9f rw,relatime - aufs none rw,si=caafa54f854e525 -60 20 0:53 / /var/lib/docker/aufs/mnt/e370c3e286bea027917baa0e4d251262681a472a87056e880dfd0513516dffd9 rw,relatime - aufs none rw,si=caafa54f840a525 -61 20 0:54 / /var/lib/docker/aufs/mnt/6b00d3b4f32b41997ec07412b5e18204f82fbe643e7122251cdeb3582abd424e-init rw,relatime - aufs none rw,si=caafa54f8408525 -62 20 0:55 / /var/lib/docker/aufs/mnt/6b00d3b4f32b41997ec07412b5e18204f82fbe643e7122251cdeb3582abd424e rw,relatime - aufs none rw,si=caafa54f8409525 -63 20 0:56 / /var/lib/docker/aufs/mnt/abd0b5ea5d355a67f911475e271924a5388ee60c27185fcd60d095afc4a09dc7 rw,relatime - aufs none rw,si=caafa54f9eb1525 -64 20 0:57 / /var/lib/docker/aufs/mnt/336222effc3f7b89867bb39ff7792ae5412c35c749f127c29159d046b6feedd2-init rw,relatime - aufs none rw,si=caafa54f85bf525 -65 20 0:58 / /var/lib/docker/aufs/mnt/336222effc3f7b89867bb39ff7792ae5412c35c749f127c29159d046b6feedd2 rw,relatime - aufs none rw,si=caafa54f85b8525 -66 20 0:59 / /var/lib/docker/aufs/mnt/912e1bf28b80a09644503924a8a1a4fb8ed10b808ca847bda27a369919aa52fa rw,relatime - aufs none rw,si=caafa54fbaea525 -67 20 0:60 / /var/lib/docker/aufs/mnt/386f722875013b4a875118367abc783fc6617a3cb7cf08b2b4dcf550b4b9c576-init rw,relatime - aufs none rw,si=caafa54f8472525 -68 20 0:61 / /var/lib/docker/aufs/mnt/386f722875013b4a875118367abc783fc6617a3cb7cf08b2b4dcf550b4b9c576 rw,relatime - aufs none rw,si=caafa54f8474525 -69 20 0:62 / /var/lib/docker/aufs/mnt/5aaebb79ef3097dfca377889aeb61a0c9d5e3795117d2b08d0751473c671dfb2 rw,relatime - aufs none rw,si=caafa54f8c5e525 -70 20 0:63 / /var/lib/docker/aufs/mnt/5ba3e493279d01277d583600b81c7c079e691b73c3a2bdea8e4b12a35a418be2-init rw,relatime - aufs none rw,si=caafa54f8c3b525 -71 20 0:64 / /var/lib/docker/aufs/mnt/5ba3e493279d01277d583600b81c7c079e691b73c3a2bdea8e4b12a35a418be2 rw,relatime - aufs none rw,si=caafa54f8c3d525 -72 20 0:65 / /var/lib/docker/aufs/mnt/2777f0763da4de93f8bebbe1595cc77f739806a158657b033eca06f827b6028a rw,relatime - aufs none rw,si=caafa54f8c3e525 -73 20 0:66 / /var/lib/docker/aufs/mnt/5d7445562acf73c6f0ae34c3dd0921d7457de1ba92a587d9e06a44fa209eeb3e-init rw,relatime - aufs none rw,si=caafa54f8c39525 -74 20 0:67 / /var/lib/docker/aufs/mnt/5d7445562acf73c6f0ae34c3dd0921d7457de1ba92a587d9e06a44fa209eeb3e rw,relatime - aufs none rw,si=caafa54f854f525 -75 20 0:68 / /var/lib/docker/aufs/mnt/06400b526ec18b66639c96efc41a84f4ae0b117cb28dafd56be420651b4084a0 rw,relatime - aufs none rw,si=caafa54f840b525 -76 20 0:69 / /var/lib/docker/aufs/mnt/e051d45ec42d8e3e1cc57bb39871a40de486dc123522e9c067fbf2ca6a357785-init rw,relatime - aufs none rw,si=caafa54fdddf525 -77 20 0:70 / /var/lib/docker/aufs/mnt/e051d45ec42d8e3e1cc57bb39871a40de486dc123522e9c067fbf2ca6a357785 rw,relatime - aufs none rw,si=caafa54f854b525 -78 20 0:71 / /var/lib/docker/aufs/mnt/1ff414fa93fd61ec81b0ab7b365a841ff6545accae03cceac702833aaeaf718f rw,relatime - aufs none rw,si=caafa54f8d85525 -79 20 0:72 / /var/lib/docker/aufs/mnt/c661b2f871dd5360e46a2aebf8f970f6d39a2ff64e06979aa0361227c88128b8-init rw,relatime - aufs none rw,si=caafa54f8da3525 -80 20 0:73 / /var/lib/docker/aufs/mnt/c661b2f871dd5360e46a2aebf8f970f6d39a2ff64e06979aa0361227c88128b8 rw,relatime - aufs none rw,si=caafa54f8da2525 -81 20 0:74 / /var/lib/docker/aufs/mnt/b68b1d4fe4d30016c552398e78b379a39f651661d8e1fa5f2460c24a5e723420 rw,relatime - aufs none rw,si=caafa54f8d81525 -82 20 0:75 / /var/lib/docker/aufs/mnt/c5c5979c936cd0153a4c626fa9d69ce4fce7d924cc74fa68b025d2f585031739-init rw,relatime - aufs none rw,si=caafa54f8da1525 -83 20 0:76 / /var/lib/docker/aufs/mnt/c5c5979c936cd0153a4c626fa9d69ce4fce7d924cc74fa68b025d2f585031739 rw,relatime - aufs none rw,si=caafa54f8da0525 -84 20 0:77 / /var/lib/docker/aufs/mnt/53e10b0329afc0e0d3322d31efaed4064139dc7027fe6ae445cffd7104bcc94f rw,relatime - aufs none rw,si=caafa54f8c35525 -85 20 0:78 / /var/lib/docker/aufs/mnt/3bfafd09ff2603e2165efacc2215c1f51afabba6c42d04a68cc2df0e8cc31494-init rw,relatime - aufs none rw,si=caafa54f8db8525 -86 20 0:79 / /var/lib/docker/aufs/mnt/3bfafd09ff2603e2165efacc2215c1f51afabba6c42d04a68cc2df0e8cc31494 rw,relatime - aufs none rw,si=caafa54f8dba525 -87 20 0:80 / /var/lib/docker/aufs/mnt/90fdd2c03eeaf65311f88f4200e18aef6d2772482712d9aea01cd793c64781b5 rw,relatime - aufs none rw,si=caafa54f8315525 -88 20 0:81 / /var/lib/docker/aufs/mnt/7bdf2591c06c154ceb23f5e74b1d03b18fbf6fe96e35fbf539b82d446922442f-init rw,relatime - aufs none rw,si=caafa54f8fc6525 -89 20 0:82 / /var/lib/docker/aufs/mnt/7bdf2591c06c154ceb23f5e74b1d03b18fbf6fe96e35fbf539b82d446922442f rw,relatime - aufs none rw,si=caafa54f8468525 -90 20 0:83 / /var/lib/docker/aufs/mnt/8cf9a993f50f3305abad3da268c0fc44ff78a1e7bba595ef9de963497496c3f9 rw,relatime - aufs none rw,si=caafa54f8c59525 -91 20 0:84 / /var/lib/docker/aufs/mnt/ecc896fd74b21840a8d35e8316b92a08b1b9c83d722a12acff847e9f0ff17173-init rw,relatime - aufs none rw,si=caafa54f846a525 -92 20 0:85 / /var/lib/docker/aufs/mnt/ecc896fd74b21840a8d35e8316b92a08b1b9c83d722a12acff847e9f0ff17173 rw,relatime - aufs none rw,si=caafa54f846b525 -93 20 0:86 / /var/lib/docker/aufs/mnt/d8c8288ec920439a48b5796bab5883ee47a019240da65e8d8f33400c31bac5df rw,relatime - aufs none rw,si=caafa54f8dbf525 -94 20 0:87 / /var/lib/docker/aufs/mnt/ecba66710bcd03199b9398e46c005cd6b68d0266ec81dc8b722a29cc417997c6-init rw,relatime - aufs none rw,si=caafa54f810f525 -95 20 0:88 / /var/lib/docker/aufs/mnt/ecba66710bcd03199b9398e46c005cd6b68d0266ec81dc8b722a29cc417997c6 rw,relatime - aufs none rw,si=caafa54fbae9525 -96 20 0:89 / /var/lib/docker/aufs/mnt/befc1c67600df449dddbe796c0d06da7caff1d2bbff64cde1f0ba82d224996b5 rw,relatime - aufs none rw,si=caafa54f8dab525 -97 20 0:90 / /var/lib/docker/aufs/mnt/c9f470e73d2742629cdc4084a1b2c1a8302914f2aa0d0ec4542371df9a050562-init rw,relatime - aufs none rw,si=caafa54fdc02525 -98 20 0:91 / /var/lib/docker/aufs/mnt/c9f470e73d2742629cdc4084a1b2c1a8302914f2aa0d0ec4542371df9a050562 rw,relatime - aufs none rw,si=caafa54f9eb0525 -99 20 0:92 / /var/lib/docker/aufs/mnt/2a31f10029f04ff9d4381167a9b739609853d7220d55a56cb654779a700ee246 rw,relatime - aufs none rw,si=caafa54f8c37525 -100 20 0:93 / /var/lib/docker/aufs/mnt/8c4261b8e3e4b21ebba60389bd64b6261217e7e6b9fd09e201d5a7f6760f6927-init rw,relatime - aufs none rw,si=caafa54fd173525 -101 20 0:94 / /var/lib/docker/aufs/mnt/8c4261b8e3e4b21ebba60389bd64b6261217e7e6b9fd09e201d5a7f6760f6927 rw,relatime - aufs none rw,si=caafa54f8108525 -102 20 0:95 / /var/lib/docker/aufs/mnt/eaa0f57403a3dc685268f91df3fbcd7a8423cee50e1a9ee5c3e1688d9d676bb4 rw,relatime - aufs none rw,si=caafa54f852d525 -103 20 0:96 / /var/lib/docker/aufs/mnt/9cfe69a2cbffd9bfc7f396d4754f6fe5cc457ef417b277797be3762dfe955a6b-init rw,relatime - aufs none rw,si=caafa54f8d80525 -104 20 0:97 / /var/lib/docker/aufs/mnt/9cfe69a2cbffd9bfc7f396d4754f6fe5cc457ef417b277797be3762dfe955a6b rw,relatime - aufs none rw,si=caafa54f8fc3525 -105 20 0:98 / /var/lib/docker/aufs/mnt/d1b322ae17613c6adee84e709641a9244ac56675244a89a64dc0075075fcbb83 rw,relatime - aufs none rw,si=caafa54f8c58525 -106 20 0:99 / /var/lib/docker/aufs/mnt/d46c2a8e9da7e91ab34fd9c192851c246a4e770a46720bda09e55c7554b9dbbd-init rw,relatime - aufs none rw,si=caafa54f8c63525 -107 20 0:100 / /var/lib/docker/aufs/mnt/d46c2a8e9da7e91ab34fd9c192851c246a4e770a46720bda09e55c7554b9dbbd rw,relatime - aufs none rw,si=caafa54f8c67525 -108 20 0:101 / /var/lib/docker/aufs/mnt/bc9d2a264158f83a617a069bf17cbbf2a2ba453db7d3951d9dc63cc1558b1c2b rw,relatime - aufs none rw,si=caafa54f8dbe525 -109 20 0:102 / /var/lib/docker/aufs/mnt/9e6abb8d72bbeb4d5cf24b96018528015ba830ce42b4859965bd482cbd034e99-init rw,relatime - aufs none rw,si=caafa54f9e0d525 -110 20 0:103 / /var/lib/docker/aufs/mnt/9e6abb8d72bbeb4d5cf24b96018528015ba830ce42b4859965bd482cbd034e99 rw,relatime - aufs none rw,si=caafa54f9e1b525 -111 20 0:104 / /var/lib/docker/aufs/mnt/d4dca7b02569c732e740071e1c654d4ad282de5c41edb619af1f0aafa618be26 rw,relatime - aufs none rw,si=caafa54f8dae525 -112 20 0:105 / /var/lib/docker/aufs/mnt/fea63da40fa1c5ffbad430dde0bc64a8fc2edab09a051fff55b673c40a08f6b7-init rw,relatime - aufs none rw,si=caafa54f8c5c525 -113 20 0:106 / /var/lib/docker/aufs/mnt/fea63da40fa1c5ffbad430dde0bc64a8fc2edab09a051fff55b673c40a08f6b7 rw,relatime - aufs none rw,si=caafa54fd172525 -114 20 0:107 / /var/lib/docker/aufs/mnt/e60c57499c0b198a6734f77f660cdbbd950a5b78aa23f470ca4f0cfcc376abef rw,relatime - aufs none rw,si=caafa54909c4525 -115 20 0:108 / /var/lib/docker/aufs/mnt/099c78e7ccd9c8717471bb1bbfff838c0a9913321ba2f214fbeaf92c678e5b35-init rw,relatime - aufs none rw,si=caafa54909c3525 -116 20 0:109 / /var/lib/docker/aufs/mnt/099c78e7ccd9c8717471bb1bbfff838c0a9913321ba2f214fbeaf92c678e5b35 rw,relatime - aufs none rw,si=caafa54909c7525 -117 20 0:110 / /var/lib/docker/aufs/mnt/2997be666d58b9e71469759bcb8bd9608dad0e533a1a7570a896919ba3388825 rw,relatime - aufs none rw,si=caafa54f8557525 -118 20 0:111 / /var/lib/docker/aufs/mnt/730694eff438ef20569df38dfb38a920969d7ff2170cc9aa7cb32a7ed8147a93-init rw,relatime - aufs none rw,si=caafa54c6e88525 -119 20 0:112 / /var/lib/docker/aufs/mnt/730694eff438ef20569df38dfb38a920969d7ff2170cc9aa7cb32a7ed8147a93 rw,relatime - aufs none rw,si=caafa54c6e8e525 -120 20 0:113 / /var/lib/docker/aufs/mnt/a672a1e2f2f051f6e19ed1dfbe80860a2d774174c49f7c476695f5dd1d5b2f67 rw,relatime - aufs none rw,si=caafa54c6e15525 -121 20 0:114 / /var/lib/docker/aufs/mnt/aba3570e17859f76cf29d282d0d150659c6bd80780fdc52a465ba05245c2a420-init rw,relatime - aufs none rw,si=caafa54f8dad525 -122 20 0:115 / /var/lib/docker/aufs/mnt/aba3570e17859f76cf29d282d0d150659c6bd80780fdc52a465ba05245c2a420 rw,relatime - aufs none rw,si=caafa54f8d84525 -123 20 0:116 / /var/lib/docker/aufs/mnt/2abc86007aca46fb4a817a033e2a05ccacae40b78ea4b03f8ea616b9ada40e2e rw,relatime - aufs none rw,si=caafa54c6e8b525 -124 20 0:117 / /var/lib/docker/aufs/mnt/36352f27f7878e648367a135bd1ec3ed497adcb8ac13577ee892a0bd921d2374-init rw,relatime - aufs none rw,si=caafa54c6e8d525 -125 20 0:118 / /var/lib/docker/aufs/mnt/36352f27f7878e648367a135bd1ec3ed497adcb8ac13577ee892a0bd921d2374 rw,relatime - aufs none rw,si=caafa54f8c34525 -126 20 0:119 / /var/lib/docker/aufs/mnt/2f95ca1a629cea8363b829faa727dd52896d5561f2c96ddee4f697ea2fc872c2 rw,relatime - aufs none rw,si=caafa54c6e8a525 -127 20 0:120 / /var/lib/docker/aufs/mnt/f108c8291654f179ef143a3e07de2b5a34adbc0b28194a0ab17742b6db9a7fb2-init rw,relatime - aufs none rw,si=caafa54f8e19525 -128 20 0:121 / /var/lib/docker/aufs/mnt/f108c8291654f179ef143a3e07de2b5a34adbc0b28194a0ab17742b6db9a7fb2 rw,relatime - aufs none rw,si=caafa54fa8c6525 -129 20 0:122 / /var/lib/docker/aufs/mnt/c1d04dfdf8cccb3676d5a91e84e9b0781ce40623d127d038bcfbe4c761b27401 rw,relatime - aufs none rw,si=caafa54f8c30525 -130 20 0:123 / /var/lib/docker/aufs/mnt/3f4898ffd0e1239aeebf1d1412590cdb7254207fa3883663e2c40cf772e5f05a-init rw,relatime - aufs none rw,si=caafa54c6e1a525 -131 20 0:124 / /var/lib/docker/aufs/mnt/3f4898ffd0e1239aeebf1d1412590cdb7254207fa3883663e2c40cf772e5f05a rw,relatime - aufs none rw,si=caafa54c6e1c525 -132 20 0:125 / /var/lib/docker/aufs/mnt/5ae3b6fccb1539fc02d420e86f3e9637bef5b711fed2ca31a2f426c8f5deddbf rw,relatime - aufs none rw,si=caafa54c4fea525 -133 20 0:126 / /var/lib/docker/aufs/mnt/310bfaf80d57020f2e73b06aeffb0b9b0ca2f54895f88bf5e4d1529ccac58fe0-init rw,relatime - aufs none rw,si=caafa54c6e1e525 -134 20 0:127 / /var/lib/docker/aufs/mnt/310bfaf80d57020f2e73b06aeffb0b9b0ca2f54895f88bf5e4d1529ccac58fe0 rw,relatime - aufs none rw,si=caafa54fa8c0525 -135 20 0:128 / /var/lib/docker/aufs/mnt/f382bd5aaccaf2d04a59089ac7cb12ec87efd769fd0c14d623358fbfd2a3f896 rw,relatime - aufs none rw,si=caafa54c4fec525 -136 20 0:129 / /var/lib/docker/aufs/mnt/50d45e9bb2d779bc6362824085564c7578c231af5ae3b3da116acf7e17d00735-init rw,relatime - aufs none rw,si=caafa54c4fef525 -137 20 0:130 / /var/lib/docker/aufs/mnt/50d45e9bb2d779bc6362824085564c7578c231af5ae3b3da116acf7e17d00735 rw,relatime - aufs none rw,si=caafa54c4feb525 -138 20 0:131 / /var/lib/docker/aufs/mnt/a9c5ee0854dc083b6bf62b7eb1e5291aefbb10702289a446471ce73aba0d5d7d rw,relatime - aufs none rw,si=caafa54909c6525 -139 20 0:134 / /var/lib/docker/aufs/mnt/03a613e7bd5078819d1fd92df4e671c0127559a5e0b5a885cc8d5616875162f0-init rw,relatime - aufs none rw,si=caafa54804fe525 -140 20 0:135 / /var/lib/docker/aufs/mnt/03a613e7bd5078819d1fd92df4e671c0127559a5e0b5a885cc8d5616875162f0 rw,relatime - aufs none rw,si=caafa54804fa525 -141 20 0:136 / /var/lib/docker/aufs/mnt/7ec3277e5c04c907051caf9c9c35889f5fcd6463e5485971b25404566830bb70 rw,relatime - aufs none rw,si=caafa54804f9525 -142 20 0:139 / /var/lib/docker/aufs/mnt/26b5b5d71d79a5b2bfcf8bc4b2280ee829f261eb886745dd90997ed410f7e8b8-init rw,relatime - aufs none rw,si=caafa54c6ef6525 -143 20 0:140 / /var/lib/docker/aufs/mnt/26b5b5d71d79a5b2bfcf8bc4b2280ee829f261eb886745dd90997ed410f7e8b8 rw,relatime - aufs none rw,si=caafa54c6ef5525 -144 20 0:356 / /var/lib/docker/aufs/mnt/e6ecde9e2c18cd3c75f424c67b6d89685cfee0fc67abf2cb6bdc0867eb998026 rw,relatime - aufs none rw,si=caafa548068e525` - - gentooMountinfo = `15 1 8:6 / / rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -16 15 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw -17 15 0:14 / /run rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=3292172k,mode=755 -18 15 0:5 / /dev rw,nosuid,relatime - devtmpfs udev rw,size=10240k,nr_inodes=4106451,mode=755 -19 18 0:12 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw -20 18 0:10 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000 -21 18 0:15 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw -22 15 0:16 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw -23 22 0:7 / /sys/kernel/debug rw,nosuid,nodev,noexec,relatime - debugfs debugfs rw -24 22 0:17 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs cgroup_root rw,size=10240k,mode=755 -25 24 0:18 / /sys/fs/cgroup/openrc rw,nosuid,nodev,noexec,relatime - cgroup openrc rw,release_agent=/lib64/rc/sh/cgroup-release-agent.sh,name=openrc -26 24 0:19 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime - cgroup cpuset rw,cpuset,clone_children -27 24 0:20 / /sys/fs/cgroup/cpu rw,nosuid,nodev,noexec,relatime - cgroup cpu rw,cpu,clone_children -28 24 0:21 / /sys/fs/cgroup/cpuacct rw,nosuid,nodev,noexec,relatime - cgroup cpuacct rw,cpuacct,clone_children -29 24 0:22 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime - cgroup memory rw,memory,clone_children -30 24 0:23 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime - cgroup devices rw,devices,clone_children -31 24 0:24 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime - cgroup freezer rw,freezer,clone_children -32 24 0:25 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime - cgroup blkio rw,blkio,clone_children -33 15 8:1 / /boot rw,noatime,nodiratime - vfat /dev/sda1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro -34 15 8:18 / /mnt/xfs rw,noatime,nodiratime - xfs /dev/sdb2 rw,attr2,inode64,noquota -35 15 0:26 / /tmp rw,relatime - tmpfs tmpfs rw -36 16 0:27 / /proc/sys/fs/binfmt_misc rw,nosuid,nodev,noexec,relatime - binfmt_misc binfmt_misc rw -42 15 0:33 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs rpc_pipefs rw -43 16 0:34 / /proc/fs/nfsd rw,nosuid,nodev,noexec,relatime - nfsd nfsd rw -44 15 0:35 / /home/tianon/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=1000,group_id=1000 -68 15 0:3336 / /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd rw,relatime - aufs none rw,si=9b4a7640128db39c -85 68 8:6 /var/lib/docker/init/dockerinit-0.7.2-dev//deleted /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/.dockerinit rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -86 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/config.env /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/.dockerenv rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -87 68 8:6 /etc/resolv.conf /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/resolv.conf rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -88 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/hostname /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/hostname rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -89 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/hosts /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/hosts rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -38 15 0:3384 / /var/lib/docker/aufs/mnt/0292005a9292401bb5197657f2b682d97d8edcb3b72b5e390d2a680139985b55 rw,relatime - aufs none rw,si=9b4a7642b584939c -39 15 0:3385 / /var/lib/docker/aufs/mnt/59db98c889de5f71b70cfb82c40cbe47b64332f0f56042a2987a9e5df6e5e3aa rw,relatime - aufs none rw,si=9b4a7642b584e39c -40 15 0:3386 / /var/lib/docker/aufs/mnt/0545f0f2b6548eb9601d08f35a08f5a0a385407d36027a28f58e06e9f61e0278 rw,relatime - aufs none rw,si=9b4a7642b584b39c -41 15 0:3387 / /var/lib/docker/aufs/mnt/d882cfa16d1aa8fe0331a36e79be3d80b151e49f24fc39a39c3fed1735d5feb5 rw,relatime - aufs none rw,si=9b4a76453040039c -45 15 0:3388 / /var/lib/docker/aufs/mnt/055ca3befcb1626e74f5344b3398724ff05c0de0e20021683d04305c9e70a3f6 rw,relatime - aufs none rw,si=9b4a76453040739c -46 15 0:3389 / /var/lib/docker/aufs/mnt/b899e4567a351745d4285e7f1c18fdece75d877deb3041981cd290be348b7aa6 rw,relatime - aufs none rw,si=9b4a7647def4039c -47 15 0:3390 / /var/lib/docker/aufs/mnt/067ca040292c58954c5129f953219accfae0d40faca26b4d05e76ca76a998f16 rw,relatime - aufs none rw,si=9b4a7647def4239c -48 15 0:3391 / /var/lib/docker/aufs/mnt/8c995e7cb6e5082742daeea720e340b021d288d25d92e0412c03d200df308a11 rw,relatime - aufs none rw,si=9b4a764479c1639c -49 15 0:3392 / /var/lib/docker/aufs/mnt/07cc54dfae5b45300efdacdd53cc72c01b9044956a86ce7bff42d087e426096d rw,relatime - aufs none rw,si=9b4a764479c1739c -50 15 0:3393 / /var/lib/docker/aufs/mnt/0a9c95cf4c589c05b06baa79150b0cc1d8e7102759fe3ce4afaabb8247ca4f85 rw,relatime - aufs none rw,si=9b4a7644059c839c -51 15 0:3394 / /var/lib/docker/aufs/mnt/468fa98cececcf4e226e8370f18f4f848d63faf287fb8321a07f73086441a3a0 rw,relatime - aufs none rw,si=9b4a7644059ca39c -52 15 0:3395 / /var/lib/docker/aufs/mnt/0b826192231c5ce066fffb5beff4397337b5fc19a377aa7c6282c7c0ce7f111f rw,relatime - aufs none rw,si=9b4a764479c1339c -53 15 0:3396 / /var/lib/docker/aufs/mnt/93b8ba1b772fbe79709b909c43ea4b2c30d712e53548f467db1ffdc7a384f196 rw,relatime - aufs none rw,si=9b4a7640798a739c -54 15 0:3397 / /var/lib/docker/aufs/mnt/0c0d0acfb506859b12ef18cdfef9ebed0b43a611482403564224bde9149d373c rw,relatime - aufs none rw,si=9b4a7640798a039c -55 15 0:3398 / /var/lib/docker/aufs/mnt/33648c39ab6c7c74af0243d6d6a81b052e9e25ad1e04b19892eb2dde013e358b rw,relatime - aufs none rw,si=9b4a7644b439b39c -56 15 0:3399 / /var/lib/docker/aufs/mnt/0c12bea97a1c958a3c739fb148536c1c89351d48e885ecda8f0499b5cc44407e rw,relatime - aufs none rw,si=9b4a7640798a239c -57 15 0:3400 / /var/lib/docker/aufs/mnt/ed443988ce125f172d7512e84a4de2627405990fd767a16adefa8ce700c19ce8 rw,relatime - aufs none rw,si=9b4a7644c8ed339c -59 15 0:3402 / /var/lib/docker/aufs/mnt/f61612c324ff3c924d3f7a82fb00a0f8d8f73c248c41897061949e9f5ab7e3b1 rw,relatime - aufs none rw,si=9b4a76442810c39c -60 15 0:3403 / /var/lib/docker/aufs/mnt/0f1ee55c6c4e25027b80de8e64b8b6fb542b3b41aa0caab9261da75752e22bfd rw,relatime - aufs none rw,si=9b4a76442810e39c -61 15 0:3404 / /var/lib/docker/aufs/mnt/956f6cc4af5785cb3ee6963dcbca668219437d9b28f513290b1453ac64a34f97 rw,relatime - aufs none rw,si=9b4a7644303ec39c -62 15 0:3405 / /var/lib/docker/aufs/mnt/1099769158c4b4773e2569e38024e8717e400f87a002c41d8cf47cb81b051ba6 rw,relatime - aufs none rw,si=9b4a7644303ee39c -63 15 0:3406 / /var/lib/docker/aufs/mnt/11890ceb98d4442595b676085cd7b21550ab85c5df841e0fba997ff54e3d522d rw,relatime - aufs none rw,si=9b4a7644303ed39c -64 15 0:3407 / /var/lib/docker/aufs/mnt/acdb90dc378e8ed2420b43a6d291f1c789a081cd1904018780cc038fcd7aae53 rw,relatime - aufs none rw,si=9b4a76434be2139c -65 15 0:3408 / /var/lib/docker/aufs/mnt/120e716f19d4714fbe63cc1ed246204f2c1106eefebc6537ba2587d7e7711959 rw,relatime - aufs none rw,si=9b4a76434be2339c -66 15 0:3409 / /var/lib/docker/aufs/mnt/b197b7fffb61d89e0ba1c40de9a9fc0d912e778b3c1bd828cf981ff37c1963bc rw,relatime - aufs none rw,si=9b4a76434be2039c -70 15 0:3412 / /var/lib/docker/aufs/mnt/1434b69d2e1bb18a9f0b96b9cdac30132b2688f5d1379f68a39a5e120c2f93eb rw,relatime - aufs none rw,si=9b4a76434be2639c -71 15 0:3413 / /var/lib/docker/aufs/mnt/16006e83caf33ab5eb0cd6afc92ea2ee8edeff897496b0bb3ec3a75b767374b3 rw,relatime - aufs none rw,si=9b4a7644d790439c -72 15 0:3414 / /var/lib/docker/aufs/mnt/55bfa5f44e94d27f91f79ba901b118b15098449165c87abf1b53ffff147ff164 rw,relatime - aufs none rw,si=9b4a7644d790239c -73 15 0:3415 / /var/lib/docker/aufs/mnt/1912b97a07ab21ccd98a2a27bc779bf3cf364a3138afa3c3e6f7f169a3c3eab5 rw,relatime - aufs none rw,si=9b4a76441822739c -76 15 0:3418 / /var/lib/docker/aufs/mnt/1a7c3292e8879bd91ffd9282e954f643b1db5683093574c248ff14a9609f2f56 rw,relatime - aufs none rw,si=9b4a76438cb7239c -77 15 0:3419 / /var/lib/docker/aufs/mnt/bb1faaf0d076ddba82c2318305a85f490dafa4e8a8640a8db8ed657c439120cc rw,relatime - aufs none rw,si=9b4a76438cb7339c -78 15 0:3420 / /var/lib/docker/aufs/mnt/1ab869f21d2241a73ac840c7f988490313f909ac642eba71d092204fec66dd7c rw,relatime - aufs none rw,si=9b4a76438cb7639c -79 15 0:3421 / /var/lib/docker/aufs/mnt/fd7245b2cfe3890fa5f5b452260e4edf9e7fb7746532ed9d83f7a0d7dbaa610e rw,relatime - aufs none rw,si=9b4a7644bdc0139c -80 15 0:3422 / /var/lib/docker/aufs/mnt/1e5686c5301f26b9b3cd24e322c608913465cc6c5d0dcd7c5e498d1314747d61 rw,relatime - aufs none rw,si=9b4a7644bdc0639c -81 15 0:3423 / /var/lib/docker/aufs/mnt/52edf6ee6e40bfec1e9301a4d4a92ab83d144e2ae4ce5099e99df6138cb844bf rw,relatime - aufs none rw,si=9b4a7644bdc0239c -82 15 0:3424 / /var/lib/docker/aufs/mnt/1ea10fb7085d28cda4904657dff0454e52598d28e1d77e4f2965bbc3666e808f rw,relatime - aufs none rw,si=9b4a76438cb7139c -83 15 0:3425 / /var/lib/docker/aufs/mnt/9c03e98c3593946dbd4087f8d83f9ca262f4a2efdc952ce60690838b9ba6c526 rw,relatime - aufs none rw,si=9b4a76443020639c -84 15 0:3426 / /var/lib/docker/aufs/mnt/220a2344d67437602c6d2cee9a98c46be13f82c2a8063919dd2fad52bf2fb7dd rw,relatime - aufs none rw,si=9b4a76434bff339c -94 15 0:3427 / /var/lib/docker/aufs/mnt/3b32876c5b200312c50baa476ff342248e88c8ea96e6a1032cd53a88738a1cf2 rw,relatime - aufs none rw,si=9b4a76434bff139c -95 15 0:3428 / /var/lib/docker/aufs/mnt/23ee2b8b0d4ae8db6f6d1e168e2c6f79f8a18f953b09f65e0d22cc1e67a3a6fa rw,relatime - aufs none rw,si=9b4a7646c305c39c -96 15 0:3429 / /var/lib/docker/aufs/mnt/e86e6daa70b61b57945fa178222615f3c3d6bcef12c9f28e9f8623d44dc2d429 rw,relatime - aufs none rw,si=9b4a7646c305f39c -97 15 0:3430 / /var/lib/docker/aufs/mnt/2413d07623e80860bb2e9e306fbdee699afd07525785c025c591231e864aa162 rw,relatime - aufs none rw,si=9b4a76434bff039c -98 15 0:3431 / /var/lib/docker/aufs/mnt/adfd622eb22340fc80b429e5564b125668e260bf9068096c46dd59f1386a4b7d rw,relatime - aufs none rw,si=9b4a7646a7a1039c -102 15 0:3435 / /var/lib/docker/aufs/mnt/27cd92e7a91d02e2d6b44d16679a00fb6d169b19b88822891084e7fd1a84882d rw,relatime - aufs none rw,si=9b4a7646f25ec39c -103 15 0:3436 / /var/lib/docker/aufs/mnt/27dfdaf94cfbf45055c748293c37dd68d9140240bff4c646cb09216015914a88 rw,relatime - aufs none rw,si=9b4a7646732f939c -104 15 0:3437 / /var/lib/docker/aufs/mnt/5ed7524aff68dfbf0fc601cbaeac01bab14391850a973dabf3653282a627920f rw,relatime - aufs none rw,si=9b4a7646732f839c -105 15 0:3438 / /var/lib/docker/aufs/mnt/2a0d4767e536beb5785b60e071e3ac8e5e812613ab143a9627bee77d0c9ab062 rw,relatime - aufs none rw,si=9b4a7646732fe39c -106 15 0:3439 / /var/lib/docker/aufs/mnt/dea3fc045d9f4ae51ba952450b948a822cf85c39411489ca5224f6d9a8d02bad rw,relatime - aufs none rw,si=9b4a764012ad839c -107 15 0:3440 / /var/lib/docker/aufs/mnt/2d140a787160798da60cb67c21b1210054ad4dafecdcf832f015995b9aa99cfd rw,relatime - aufs none rw,si=9b4a764012add39c -108 15 0:3441 / /var/lib/docker/aufs/mnt/cb190b2a8e984475914430fbad2382e0d20b9b659f8ef83ae8d170cc672e519c rw,relatime - aufs none rw,si=9b4a76454d9c239c -109 15 0:3442 / /var/lib/docker/aufs/mnt/2f4a012d5a7ffd90256a6e9aa479054b3dddbc3c6a343f26dafbf3196890223b rw,relatime - aufs none rw,si=9b4a76454d9c439c -110 15 0:3443 / /var/lib/docker/aufs/mnt/63cc77904b80c4ffbf49cb974c5d8733dc52ad7640d3ae87554b325d7312d87f rw,relatime - aufs none rw,si=9b4a76454d9c339c -111 15 0:3444 / /var/lib/docker/aufs/mnt/30333e872c451482ea2d235ff2192e875bd234006b238ae2bdde3b91a86d7522 rw,relatime - aufs none rw,si=9b4a76422cebf39c -112 15 0:3445 / /var/lib/docker/aufs/mnt/6c54fc1125da3925cae65b5c9a98f3be55b0a2c2666082e5094a4ba71beb5bff rw,relatime - aufs none rw,si=9b4a7646dd5a439c -113 15 0:3446 / /var/lib/docker/aufs/mnt/3087d48cb01cda9d0a83a9ca301e6ea40e8593d18c4921be4794c91a420ab9a3 rw,relatime - aufs none rw,si=9b4a7646dd5a739c -114 15 0:3447 / /var/lib/docker/aufs/mnt/cc2607462a8f55b179a749b144c3fdbb50678e1a4f3065ea04e283e9b1f1d8e2 rw,relatime - aufs none rw,si=9b4a7646dd5a239c -117 15 0:3450 / /var/lib/docker/aufs/mnt/310c5e8392b29e8658a22e08d96d63936633b7e2c38e8d220047928b00a03d24 rw,relatime - aufs none rw,si=9b4a7647932d739c -118 15 0:3451 / /var/lib/docker/aufs/mnt/38a1f0029406ba9c3b6058f2f406d8a1d23c855046cf355c91d87d446fcc1460 rw,relatime - aufs none rw,si=9b4a76445abc939c -119 15 0:3452 / /var/lib/docker/aufs/mnt/42e109ab7914ae997a11ccd860fd18e4d488c50c044c3240423ce15774b8b62e rw,relatime - aufs none rw,si=9b4a76445abca39c -120 15 0:3453 / /var/lib/docker/aufs/mnt/365d832af0402d052b389c1e9c0d353b48487533d20cd4351df8e24ec4e4f9d8 rw,relatime - aufs none rw,si=9b4a7644066aa39c -121 15 0:3454 / /var/lib/docker/aufs/mnt/d3fa8a24d695b6cda9b64f96188f701963d28bef0473343f8b212df1a2cf1d2b rw,relatime - aufs none rw,si=9b4a7644066af39c -122 15 0:3455 / /var/lib/docker/aufs/mnt/37d4f491919abc49a15d0c7a7cc8383f087573525d7d288accd14f0b4af9eae0 rw,relatime - aufs none rw,si=9b4a7644066ad39c -123 15 0:3456 / /var/lib/docker/aufs/mnt/93902707fe12cbdd0068ce73f2baad4b3a299189b1b19cb5f8a2025e106ae3f5 rw,relatime - aufs none rw,si=9b4a76444445f39c -126 15 0:3459 / /var/lib/docker/aufs/mnt/3b49291670a625b9bbb329ffba99bf7fa7abff80cefef040f8b89e2b3aad4f9f rw,relatime - aufs none rw,si=9b4a7640798a339c -127 15 0:3460 / /var/lib/docker/aufs/mnt/8d9c7b943cc8f854f4d0d4ec19f7c16c13b0cc4f67a41472a072648610cecb59 rw,relatime - aufs none rw,si=9b4a76427383039c -128 15 0:3461 / /var/lib/docker/aufs/mnt/3b6c90036526c376307df71d49c9f5fce334c01b926faa6a78186842de74beac rw,relatime - aufs none rw,si=9b4a7644badd439c -130 15 0:3463 / /var/lib/docker/aufs/mnt/7b24158eeddfb5d31b7e932e406ea4899fd728344335ff8e0765e89ddeb351dd rw,relatime - aufs none rw,si=9b4a7644badd539c -131 15 0:3464 / /var/lib/docker/aufs/mnt/3ead6dd5773765c74850cf6c769f21fe65c29d622ffa712664f9f5b80364ce27 rw,relatime - aufs none rw,si=9b4a7642f469939c -132 15 0:3465 / /var/lib/docker/aufs/mnt/3f825573b29547744a37b65597a9d6d15a8350be4429b7038d126a4c9a8e178f rw,relatime - aufs none rw,si=9b4a7642f469c39c -133 15 0:3466 / /var/lib/docker/aufs/mnt/f67aaaeb3681e5dcb99a41f847087370bd1c206680cb8c7b6a9819fd6c97a331 rw,relatime - aufs none rw,si=9b4a7647cc25939c -134 15 0:3467 / /var/lib/docker/aufs/mnt/41afe6cfb3c1fc2280b869db07699da88552786e28793f0bc048a265c01bd942 rw,relatime - aufs none rw,si=9b4a7647cc25c39c -135 15 0:3468 / /var/lib/docker/aufs/mnt/b8092ea59da34a40b120e8718c3ae9fa8436996edc4fc50e4b99c72dfd81e1af rw,relatime - aufs none rw,si=9b4a76445abc439c -136 15 0:3469 / /var/lib/docker/aufs/mnt/42c69d2cc179e2684458bb8596a9da6dad182c08eae9b74d5f0e615b399f75a5 rw,relatime - aufs none rw,si=9b4a76455ddbe39c -137 15 0:3470 / /var/lib/docker/aufs/mnt/ea0871954acd2d62a211ac60e05969622044d4c74597870c4f818fbb0c56b09b rw,relatime - aufs none rw,si=9b4a76455ddbf39c -138 15 0:3471 / /var/lib/docker/aufs/mnt/4307906b275ab3fc971786b3841ae3217ac85b6756ddeb7ad4ba09cd044c2597 rw,relatime - aufs none rw,si=9b4a76455ddb839c -139 15 0:3472 / /var/lib/docker/aufs/mnt/4390b872928c53500a5035634f3421622ed6299dc1472b631fc45de9f56dc180 rw,relatime - aufs none rw,si=9b4a76402f2fd39c -140 15 0:3473 / /var/lib/docker/aufs/mnt/6bb41e78863b85e4aa7da89455314855c8c3bda64e52a583bab15dc1fa2e80c2 rw,relatime - aufs none rw,si=9b4a76402f2fa39c -141 15 0:3474 / /var/lib/docker/aufs/mnt/4444f583c2a79c66608f4673a32c9c812154f027045fbd558c2d69920c53f835 rw,relatime - aufs none rw,si=9b4a764479dbd39c -142 15 0:3475 / /var/lib/docker/aufs/mnt/6f11883af4a05ea362e0c54df89058da4859f977efd07b6f539e1f55c1d2a668 rw,relatime - aufs none rw,si=9b4a76402f30b39c -143 15 0:3476 / /var/lib/docker/aufs/mnt/453490dd32e7c2e9ef906f995d8fb3c2753923d1a5e0ba3fd3296e2e4dc238e7 rw,relatime - aufs none rw,si=9b4a76402f30c39c -144 15 0:3477 / /var/lib/docker/aufs/mnt/45e5945735ee102b5e891c91650c57ec4b52bb53017d68f02d50ea8a6e230610 rw,relatime - aufs none rw,si=9b4a76423260739c -147 15 0:3480 / /var/lib/docker/aufs/mnt/4727a64a5553a1125f315b96bed10d3073d6988225a292cce732617c925b56ab rw,relatime - aufs none rw,si=9b4a76443030339c -150 15 0:3483 / /var/lib/docker/aufs/mnt/4e348b5187b9a567059306afc72d42e0ec5c893b0d4abd547526d5f9b6fb4590 rw,relatime - aufs none rw,si=9b4a7644f5d8c39c -151 15 0:3484 / /var/lib/docker/aufs/mnt/4efc616bfbc3f906718b052da22e4335f8e9f91ee9b15866ed3a8029645189ef rw,relatime - aufs none rw,si=9b4a7644f5d8939c -152 15 0:3485 / /var/lib/docker/aufs/mnt/83e730ae9754d5adb853b64735472d98dfa17136b8812ac9cfcd1eba7f4e7d2d rw,relatime - aufs none rw,si=9b4a76469aa7139c -153 15 0:3486 / /var/lib/docker/aufs/mnt/4fc5ba8a5b333be2b7eefacccb626772eeec0ae8a6975112b56c9fb36c0d342f rw,relatime - aufs none rw,si=9b4a7640128dc39c -154 15 0:3487 / /var/lib/docker/aufs/mnt/50200d5edff5dfe8d1ef3c78b0bbd709793ac6e936aa16d74ff66f7ea577b6f9 rw,relatime - aufs none rw,si=9b4a7640128da39c -155 15 0:3488 / /var/lib/docker/aufs/mnt/51e5e51604361448f0b9777f38329f414bc5ba9cf238f26d465ff479bd574b61 rw,relatime - aufs none rw,si=9b4a76444f68939c -156 15 0:3489 / /var/lib/docker/aufs/mnt/52a142149aa98bba83df8766bbb1c629a97b9799944ead90dd206c4bdf0b8385 rw,relatime - aufs none rw,si=9b4a76444f68b39c -157 15 0:3490 / /var/lib/docker/aufs/mnt/52dd21a94a00f58a1ed489312fcfffb91578089c76c5650364476f1d5de031bc rw,relatime - aufs none rw,si=9b4a76444f68f39c -158 15 0:3491 / /var/lib/docker/aufs/mnt/ee562415ddaad353ed22c88d0ca768a0c74bfba6333b6e25c46849ee22d990da rw,relatime - aufs none rw,si=9b4a7640128d839c -159 15 0:3492 / /var/lib/docker/aufs/mnt/db47a9e87173f7554f550c8a01891de79cf12acdd32e01f95c1a527a08bdfb2c rw,relatime - aufs none rw,si=9b4a764405a1d39c -160 15 0:3493 / /var/lib/docker/aufs/mnt/55e827bf6d44d930ec0b827c98356eb8b68c3301e2d60d1429aa72e05b4c17df rw,relatime - aufs none rw,si=9b4a764405a1a39c -162 15 0:3495 / /var/lib/docker/aufs/mnt/578dc4e0a87fc37ec081ca098430499a59639c09f6f12a8f48de29828a091aa6 rw,relatime - aufs none rw,si=9b4a76406d7d439c -163 15 0:3496 / /var/lib/docker/aufs/mnt/728cc1cb04fa4bc6f7bf7a90980beda6d8fc0beb71630874c0747b994efb0798 rw,relatime - aufs none rw,si=9b4a76444f20e39c -164 15 0:3497 / /var/lib/docker/aufs/mnt/5850cc4bd9b55aea46c7ad598f1785117607974084ea643580f58ce3222e683a rw,relatime - aufs none rw,si=9b4a7644a824239c -165 15 0:3498 / /var/lib/docker/aufs/mnt/89443b3f766d5a37bc8b84e29da8b84e6a3ea8486d3cf154e2aae1816516e4a8 rw,relatime - aufs none rw,si=9b4a7644a824139c -166 15 0:3499 / /var/lib/docker/aufs/mnt/f5ae8fd5a41a337907d16515bc3162525154b59c32314c695ecd092c3b47943d rw,relatime - aufs none rw,si=9b4a7644a824439c -167 15 0:3500 / /var/lib/docker/aufs/mnt/5a430854f2a03a9e5f7cbc9f3fb46a8ebca526a5b3f435236d8295e5998798f5 rw,relatime - aufs none rw,si=9b4a7647fc82439c -168 15 0:3501 / /var/lib/docker/aufs/mnt/eda16901ae4cead35070c39845cbf1e10bd6b8cb0ffa7879ae2d8a186e460f91 rw,relatime - aufs none rw,si=9b4a76441e0df39c -169 15 0:3502 / /var/lib/docker/aufs/mnt/5a593721430c2a51b119ff86a7e06ea2b37e3b4131f8f1344d402b61b0c8d868 rw,relatime - aufs none rw,si=9b4a764248bad39c -170 15 0:3503 / /var/lib/docker/aufs/mnt/d662ad0a30fbfa902e0962108685b9330597e1ee2abb16dc9462eb5a67fdd23f rw,relatime - aufs none rw,si=9b4a764248bae39c -171 15 0:3504 / /var/lib/docker/aufs/mnt/5bc9de5c79812843fb36eee96bef1ddba812407861f572e33242f4ee10da2c15 rw,relatime - aufs none rw,si=9b4a764248ba839c -172 15 0:3505 / /var/lib/docker/aufs/mnt/5e763de8e9b0f7d58d2e12a341e029ab4efb3b99788b175090d8209e971156c1 rw,relatime - aufs none rw,si=9b4a764248baa39c -173 15 0:3506 / /var/lib/docker/aufs/mnt/b4431dc2739936f1df6387e337f5a0c99cf051900c896bd7fd46a870ce61c873 rw,relatime - aufs none rw,si=9b4a76401263539c -174 15 0:3507 / /var/lib/docker/aufs/mnt/5f37830e5a02561ab8c67ea3113137ba69f67a60e41c05cb0e7a0edaa1925b24 rw,relatime - aufs none rw,si=9b4a76401263639c -184 15 0:3508 / /var/lib/docker/aufs/mnt/62ea10b957e6533538a4633a1e1d678502f50ddcdd354b2ca275c54dd7a7793a rw,relatime - aufs none rw,si=9b4a76401263039c -187 15 0:3509 / /var/lib/docker/aufs/mnt/d56ee9d44195fe390e042fda75ec15af5132adb6d5c69468fa8792f4e54a6953 rw,relatime - aufs none rw,si=9b4a76401263239c -188 15 0:3510 / /var/lib/docker/aufs/mnt/6a300930673174549c2b62f36c933f0332a20735978c007c805a301f897146c5 rw,relatime - aufs none rw,si=9b4a76455d4c539c -189 15 0:3511 / /var/lib/docker/aufs/mnt/64496c45c84d348c24d410015456d101601c30cab4d1998c395591caf7e57a70 rw,relatime - aufs none rw,si=9b4a76455d4c639c -190 15 0:3512 / /var/lib/docker/aufs/mnt/65a6a645883fe97a7422cd5e71ebe0bc17c8e6302a5361edf52e89747387e908 rw,relatime - aufs none rw,si=9b4a76455d4c039c -191 15 0:3513 / /var/lib/docker/aufs/mnt/672be40695f7b6e13b0a3ed9fc996c73727dede3481f58155950fcfad57ed616 rw,relatime - aufs none rw,si=9b4a76455d4c239c -192 15 0:3514 / /var/lib/docker/aufs/mnt/d42438acb2bfb2169e1c0d8e917fc824f7c85d336dadb0b0af36dfe0f001b3ba rw,relatime - aufs none rw,si=9b4a7642bfded39c -193 15 0:3515 / /var/lib/docker/aufs/mnt/b48a54abf26d01cb2ddd908b1ed6034d17397c1341bf0eb2b251a3e5b79be854 rw,relatime - aufs none rw,si=9b4a7642bfdee39c -194 15 0:3516 / /var/lib/docker/aufs/mnt/76f27134491f052bfb87f59092126e53ef875d6851990e59195a9da16a9412f8 rw,relatime - aufs none rw,si=9b4a7642bfde839c -195 15 0:3517 / /var/lib/docker/aufs/mnt/6bd626a5462b4f8a8e1cc7d10351326dca97a59b2758e5ea549a4f6350ce8a90 rw,relatime - aufs none rw,si=9b4a7642bfdea39c -196 15 0:3518 / /var/lib/docker/aufs/mnt/f1fe3549dbd6f5ca615e9139d9b53f0c83a3b825565df37628eacc13e70cbd6d rw,relatime - aufs none rw,si=9b4a7642bfdf539c -197 15 0:3519 / /var/lib/docker/aufs/mnt/6d0458c8426a9e93d58d0625737e6122e725c9408488ed9e3e649a9984e15c34 rw,relatime - aufs none rw,si=9b4a7642bfdf639c -198 15 0:3520 / /var/lib/docker/aufs/mnt/6e4c97db83aa82145c9cf2bafc20d500c0b5389643b689e3ae84188c270a48c5 rw,relatime - aufs none rw,si=9b4a7642bfdf039c -199 15 0:3521 / /var/lib/docker/aufs/mnt/eb94d6498f2c5969eaa9fa11ac2934f1ab90ef88e2d002258dca08e5ba74ea27 rw,relatime - aufs none rw,si=9b4a7642bfdf239c -200 15 0:3522 / /var/lib/docker/aufs/mnt/fe3f88f0c511608a2eec5f13a98703aa16e55dbf930309723d8a37101f539fe1 rw,relatime - aufs none rw,si=9b4a7642bfc3539c -201 15 0:3523 / /var/lib/docker/aufs/mnt/6f40c229fb9cad85fabf4b64a2640a5403ec03fe5ac1a57d0609fb8b606b9c83 rw,relatime - aufs none rw,si=9b4a7642bfc3639c -202 15 0:3524 / /var/lib/docker/aufs/mnt/7513e9131f7a8acf58ff15248237feb767c78732ca46e159f4d791e6ef031dbc rw,relatime - aufs none rw,si=9b4a7642bfc3039c -203 15 0:3525 / /var/lib/docker/aufs/mnt/79f48b00aa713cdf809c6bb7c7cb911b66e9a8076c81d6c9d2504139984ea2da rw,relatime - aufs none rw,si=9b4a7642bfc3239c -204 15 0:3526 / /var/lib/docker/aufs/mnt/c3680418350d11358f0a96c676bc5aa74fa00a7c89e629ef5909d3557b060300 rw,relatime - aufs none rw,si=9b4a7642f47cd39c -205 15 0:3527 / /var/lib/docker/aufs/mnt/7a1744dd350d7fcc0cccb6f1757ca4cbe5453f203a5888b0f1014d96ad5a5ef9 rw,relatime - aufs none rw,si=9b4a7642f47ce39c -206 15 0:3528 / /var/lib/docker/aufs/mnt/7fa99662db046be9f03c33c35251afda9ccdc0085636bbba1d90592cec3ff68d rw,relatime - aufs none rw,si=9b4a7642f47c839c -207 15 0:3529 / /var/lib/docker/aufs/mnt/f815021ef20da9c9b056bd1d52d8aaf6e2c0c19f11122fc793eb2b04eb995e35 rw,relatime - aufs none rw,si=9b4a7642f47ca39c -208 15 0:3530 / /var/lib/docker/aufs/mnt/801086ae3110192d601dfcebdba2db92e86ce6b6a9dba6678ea04488e4513669 rw,relatime - aufs none rw,si=9b4a7642dc6dd39c -209 15 0:3531 / /var/lib/docker/aufs/mnt/822ba7db69f21daddda87c01cfbfbf73013fc03a879daf96d16cdde6f9b1fbd6 rw,relatime - aufs none rw,si=9b4a7642dc6de39c -210 15 0:3532 / /var/lib/docker/aufs/mnt/834227c1a950fef8cae3827489129d0dd220541e60c6b731caaa765bf2e6a199 rw,relatime - aufs none rw,si=9b4a7642dc6d839c -211 15 0:3533 / /var/lib/docker/aufs/mnt/83dccbc385299bd1c7cf19326e791b33a544eea7b4cdfb6db70ea94eed4389fb rw,relatime - aufs none rw,si=9b4a7642dc6da39c -212 15 0:3534 / /var/lib/docker/aufs/mnt/f1b8e6f0e7c8928b5dcdab944db89306ebcae3e0b32f9ff40d2daa8329f21600 rw,relatime - aufs none rw,si=9b4a7645a126039c -213 15 0:3535 / /var/lib/docker/aufs/mnt/970efb262c7a020c2404cbcc5b3259efba0d110a786079faeef05bc2952abf3a rw,relatime - aufs none rw,si=9b4a7644c8ed139c -214 15 0:3536 / /var/lib/docker/aufs/mnt/84b6d73af7450f3117a77e15a5ca1255871fea6182cd8e8a7be6bc744be18c2c rw,relatime - aufs none rw,si=9b4a76406559139c -215 15 0:3537 / /var/lib/docker/aufs/mnt/88be2716e026bc681b5e63fe7942068773efbd0b6e901ca7ba441412006a96b6 rw,relatime - aufs none rw,si=9b4a76406559339c -216 15 0:3538 / /var/lib/docker/aufs/mnt/c81939aa166ce50cd8bca5cfbbcc420a78e0318dd5cd7c755209b9166a00a752 rw,relatime - aufs none rw,si=9b4a76406559239c -217 15 0:3539 / /var/lib/docker/aufs/mnt/e0f241645d64b7dc5ff6a8414087cca226be08fb54ce987d1d1f6350c57083aa rw,relatime - aufs none rw,si=9b4a7647cfc0f39c -218 15 0:3540 / /var/lib/docker/aufs/mnt/e10e2bf75234ed51d8a6a4bb39e465404fecbe318e54400d3879cdb2b0679c78 rw,relatime - aufs none rw,si=9b4a7647cfc0939c -219 15 0:3541 / /var/lib/docker/aufs/mnt/8f71d74c8cfc3228b82564aa9f09b2e576cff0083ddfb6aa5cb350346063f080 rw,relatime - aufs none rw,si=9b4a7647cfc0a39c -220 15 0:3542 / /var/lib/docker/aufs/mnt/9159f1eba2aef7f5205cc18d015cda7f5933cd29bba3b1b8aed5ccb5824c69ee rw,relatime - aufs none rw,si=9b4a76468cedd39c -221 15 0:3543 / /var/lib/docker/aufs/mnt/932cad71e652e048e500d9fbb5b8ea4fc9a269d42a3134ce527ceef42a2be56b rw,relatime - aufs none rw,si=9b4a76468cede39c -222 15 0:3544 / /var/lib/docker/aufs/mnt/bf1e1b5f529e8943cc0144ee86dbaaa37885c1ddffcef29537e0078ee7dd316a rw,relatime - aufs none rw,si=9b4a76468ced839c -223 15 0:3545 / /var/lib/docker/aufs/mnt/949d93ecf3322e09f858ce81d5f4b434068ec44ff84c375de03104f7b45ee955 rw,relatime - aufs none rw,si=9b4a76468ceda39c -224 15 0:3546 / /var/lib/docker/aufs/mnt/d65c6087f92dc2a3841b5251d2fe9ca07d4c6e5b021597692479740816e4e2a1 rw,relatime - aufs none rw,si=9b4a7645a126239c -225 15 0:3547 / /var/lib/docker/aufs/mnt/98a0153119d0651c193d053d254f6e16a68345a141baa80c87ae487e9d33f290 rw,relatime - aufs none rw,si=9b4a7640787cf39c -226 15 0:3548 / /var/lib/docker/aufs/mnt/99daf7fe5847c017392f6e59aa9706b3dfdd9e6d1ba11dae0f7fffde0a60b5e5 rw,relatime - aufs none rw,si=9b4a7640787c839c -227 15 0:3549 / /var/lib/docker/aufs/mnt/9ad1f2fe8a5599d4e10c5a6effa7f03d932d4e92ee13149031a372087a359079 rw,relatime - aufs none rw,si=9b4a7640787ca39c -228 15 0:3550 / /var/lib/docker/aufs/mnt/c26d64494da782ddac26f8370d86ac93e7c1666d88a7b99110fc86b35ea6a85d rw,relatime - aufs none rw,si=9b4a7642fc6b539c -229 15 0:3551 / /var/lib/docker/aufs/mnt/a49e4a8275133c230ec640997f35f172312eb0ea5bd2bbe10abf34aae98f30eb rw,relatime - aufs none rw,si=9b4a7642fc6b639c -230 15 0:3552 / /var/lib/docker/aufs/mnt/b5e2740c867ed843025f49d84e8d769de9e8e6039b3c8cb0735b5bf358994bc7 rw,relatime - aufs none rw,si=9b4a7642fc6b039c -231 15 0:3553 / /var/lib/docker/aufs/mnt/a826fdcf3a7039b30570054579b65763db605a314275d7aef31b872c13311b4b rw,relatime - aufs none rw,si=9b4a7642fc6b239c -232 15 0:3554 / /var/lib/docker/aufs/mnt/addf3025babf5e43b5a3f4a0da7ad863dda3c01fb8365c58fd8d28bb61dc11bc rw,relatime - aufs none rw,si=9b4a76407871d39c -233 15 0:3555 / /var/lib/docker/aufs/mnt/c5b6c6813ab3e5ebdc6d22cb2a3d3106a62095f2c298be52b07a3b0fa20ff690 rw,relatime - aufs none rw,si=9b4a76407871e39c -234 15 0:3556 / /var/lib/docker/aufs/mnt/af0609eaaf64e2392060cb46f5a9f3d681a219bb4c651d4f015bf573fbe6c4cf rw,relatime - aufs none rw,si=9b4a76407871839c -235 15 0:3557 / /var/lib/docker/aufs/mnt/e7f20e3c37ecad39cd90a97cd3549466d0d106ce4f0a930b8495442634fa4a1f rw,relatime - aufs none rw,si=9b4a76407871a39c -237 15 0:3559 / /var/lib/docker/aufs/mnt/b57a53d440ffd0c1295804fa68cdde35d2fed5409484627e71b9c37e4249fd5c rw,relatime - aufs none rw,si=9b4a76444445a39c -238 15 0:3560 / /var/lib/docker/aufs/mnt/b5e7d7b8f35e47efbba3d80c5d722f5e7bd43e54c824e54b4a4b351714d36d42 rw,relatime - aufs none rw,si=9b4a7647932d439c -239 15 0:3561 / /var/lib/docker/aufs/mnt/f1b136def157e9465640658f277f3347de593c6ae76412a2e79f7002f091cae2 rw,relatime - aufs none rw,si=9b4a76445abcd39c -240 15 0:3562 / /var/lib/docker/aufs/mnt/b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc rw,relatime - aufs none rw,si=9b4a7644403b339c -241 15 0:3563 / /var/lib/docker/aufs/mnt/b89b140cdbc95063761864e0a23346207fa27ee4c5c63a1ae85c9069a9d9cf1d rw,relatime - aufs none rw,si=9b4a7644aa19739c -242 15 0:3564 / /var/lib/docker/aufs/mnt/bc6a69ed51c07f5228f6b4f161c892e6a949c0e7e86a9c3432049d4c0e5cd298 rw,relatime - aufs none rw,si=9b4a7644aa19139c -243 15 0:3565 / /var/lib/docker/aufs/mnt/be4e2ba3f136933e239f7cf3d136f484fb9004f1fbdfee24a62a2c7b0ab30670 rw,relatime - aufs none rw,si=9b4a7644aa19339c -244 15 0:3566 / /var/lib/docker/aufs/mnt/e04ca1a4a5171e30d20f0c92f90a50b8b6f8600af5459c4b4fb25e42e864dfe1 rw,relatime - aufs none rw,si=9b4a7647932d139c -245 15 0:3567 / /var/lib/docker/aufs/mnt/be61576b31db893129aaffcd3dcb5ce35e49c4b71b30c392a78609a45c7323d8 rw,relatime - aufs none rw,si=9b4a7642d85f739c -246 15 0:3568 / /var/lib/docker/aufs/mnt/dda42c191e56becf672327658ab84fcb563322db3764b91c2fefe4aaef04c624 rw,relatime - aufs none rw,si=9b4a7642d85f139c -247 15 0:3569 / /var/lib/docker/aufs/mnt/c0a7995053330f3d88969247a2e72b07e2dd692133f5668a4a35ea3905561072 rw,relatime - aufs none rw,si=9b4a7642d85f339c -249 15 0:3571 / /var/lib/docker/aufs/mnt/c3594b2e5f08c59ff5ed338a1ba1eceeeb1f7fc5d180068338110c00b1eb8502 rw,relatime - aufs none rw,si=9b4a7642738c739c -250 15 0:3572 / /var/lib/docker/aufs/mnt/c58dce03a0ab0a7588393880379dc3bce9f96ec08ed3f99cf1555260ff0031e8 rw,relatime - aufs none rw,si=9b4a7642738c139c -251 15 0:3573 / /var/lib/docker/aufs/mnt/c73e9f1d109c9d14cb36e1c7489df85649be3911116d76c2fd3648ec8fd94e23 rw,relatime - aufs none rw,si=9b4a7642738c339c -252 15 0:3574 / /var/lib/docker/aufs/mnt/c9eef28c344877cd68aa09e543c0710ab2b305a0ff96dbb859bfa7808c3e8d01 rw,relatime - aufs none rw,si=9b4a7642d85f439c -253 15 0:3575 / /var/lib/docker/aufs/mnt/feb67148f548d70cb7484f2aaad2a86051cd6867a561741a2f13b552457d666e rw,relatime - aufs none rw,si=9b4a76468c55739c -254 15 0:3576 / /var/lib/docker/aufs/mnt/cdf1f96c36d35a96041a896bf398ec0f7dc3b0fb0643612a0f4b6ff96e04e1bb rw,relatime - aufs none rw,si=9b4a76468c55139c -255 15 0:3577 / /var/lib/docker/aufs/mnt/ec6e505872353268451ac4bc034c1df00f3bae4a3ea2261c6e48f7bd5417c1b3 rw,relatime - aufs none rw,si=9b4a76468c55339c -256 15 0:3578 / /var/lib/docker/aufs/mnt/d6dc8aca64efd90e0bc10274001882d0efb310d42ccbf5712b99b169053b8b1a rw,relatime - aufs none rw,si=9b4a7642738c439c -257 15 0:3579 / /var/lib/docker/aufs/mnt/d712594e2ff6eaeb895bfd150d694bd1305fb927e7a186b2dab7df2ea95f8f81 rw,relatime - aufs none rw,si=9b4a76401268f39c -259 15 0:3581 / /var/lib/docker/aufs/mnt/dbfa1174cd78cde2d7410eae442af0b416c4a0e6f87ed4ff1e9f169a0029abc0 rw,relatime - aufs none rw,si=9b4a76401268b39c -260 15 0:3582 / /var/lib/docker/aufs/mnt/e883f5a82316d7856fbe93ee8c0af5a920b7079619dd95c4ffd88bbd309d28dd rw,relatime - aufs none rw,si=9b4a76468c55439c -261 15 0:3583 / /var/lib/docker/aufs/mnt/fdec3eff581c4fc2b09f87befa2fa021f3f2d373bea636a87f1fb5b367d6347a rw,relatime - aufs none rw,si=9b4a7644aa1af39c -262 15 0:3584 / /var/lib/docker/aufs/mnt/ef764e26712184653067ecf7afea18a80854c41331ca0f0ef03e1bacf90a6ffc rw,relatime - aufs none rw,si=9b4a7644aa1a939c -263 15 0:3585 / /var/lib/docker/aufs/mnt/f3176b40c41fce8ce6942936359a2001a6f1b5c1bb40ee224186db0789ec2f76 rw,relatime - aufs none rw,si=9b4a7644aa1ab39c -264 15 0:3586 / /var/lib/docker/aufs/mnt/f5daf06785d3565c6dd18ea7d953d9a8b9606107781e63270fe0514508736e6a rw,relatime - aufs none rw,si=9b4a76401268c39c -58 15 0:3587 / /var/lib/docker/aufs/mnt/cde8c40f6524b7361af4f5ad05bb857dc9ee247c20852ba666195c0739e3a2b8-init rw,relatime - aufs none rw,si=9b4a76444445839c -67 15 0:3588 / /var/lib/docker/aufs/mnt/cde8c40f6524b7361af4f5ad05bb857dc9ee247c20852ba666195c0739e3a2b8 rw,relatime - aufs none rw,si=9b4a7644badd339c -265 15 0:3610 / /var/lib/docker/aufs/mnt/e812472cd2c8c4748d1ef71fac4e77e50d661b9349abe66ce3e23511ed44f414 rw,relatime - aufs none rw,si=9b4a76427937d39c -270 15 0:3615 / /var/lib/docker/aufs/mnt/997636e7c5c9d0d1376a217e295c14c205350b62bc12052804fb5f90abe6f183 rw,relatime - aufs none rw,si=9b4a76406540739c -273 15 0:3618 / /var/lib/docker/aufs/mnt/d5794d080417b6e52e69227c3873e0e4c1ff0d5a845ebe3860ec2f89a47a2a1e rw,relatime - aufs none rw,si=9b4a76454814039c -278 15 0:3623 / /var/lib/docker/aufs/mnt/586bdd48baced671bb19bc4d294ec325f26c55545ae267db426424f157d59c48 rw,relatime - aufs none rw,si=9b4a7644b439f39c -281 15 0:3626 / /var/lib/docker/aufs/mnt/69739d022f89f8586908bbd5edbbdd95ea5256356f177f9ffcc6ef9c0ea752d2 rw,relatime - aufs none rw,si=9b4a7644a0f1b39c -286 15 0:3631 / /var/lib/docker/aufs/mnt/ff28c27d5f894363993622de26d5dd352dba072f219e4691d6498c19bbbc15a9 rw,relatime - aufs none rw,si=9b4a7642265b339c -289 15 0:3634 / /var/lib/docker/aufs/mnt/aa128fe0e64fdede333aa48fd9de39530c91a9244a0f0649a3c411c61e372daa rw,relatime - aufs none rw,si=9b4a764012ada39c -99 15 8:33 / /media/REMOVE\040ME rw,nosuid,nodev,relatime - fuseblk /dev/sdc1 rw,user_id=0,group_id=0,allow_other,blksize=4096` -) - -func TestParseFedoraMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(fedoraMountinfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseUbuntuMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(ubuntuMountInfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseGentooMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(gentooMountinfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseFedoraMountinfoFields(t *testing.T) { - r := bytes.NewBuffer([]byte(fedoraMountinfo)) - infos, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } - expectedLength := 58 - if len(infos) != expectedLength { - t.Fatalf("Expected %d entries, got %d", expectedLength, len(infos)) - } - mi := Info{ - ID: 15, - Parent: 35, - Major: 0, - Minor: 3, - Root: "/", - Mountpoint: "/proc", - Opts: "rw,nosuid,nodev,noexec,relatime", - Optional: "shared:5", - Fstype: "proc", - Source: "proc", - VfsOpts: "rw", - } - - if *infos[0] != mi { - t.Fatalf("expected %#v, got %#v", mi, infos[0]) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go b/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go deleted file mode 100644 index 4a8d22f02..000000000 --- a/Godeps/_workspace/src/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go +++ /dev/null @@ -1,331 +0,0 @@ -// +build linux - -package mount - -import ( - "os" - "path" - "syscall" - "testing" -) - -// nothing is propagated in or out -func TestSubtreePrivate(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outside1Dir = path.Join(tmp, "outside1") - outside2Dir = path.Join(tmp, "outside2") - - outside1Path = path.Join(outside1Dir, "file.txt") - outside2Path = path.Join(outside2Dir, "file.txt") - outside1CheckPath = path.Join(targetDir, "a", "file.txt") - outside2CheckPath = path.Join(sourceDir, "b", "file.txt") - ) - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(path.Join(sourceDir, "b"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside1Dir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside2Dir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outside1Path); err != nil { - t.Fatal(err) - } - if err := createFile(outside2Path); err != nil { - t.Fatal(err) - } - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // next, make the target private - if err := MakePrivate(targetDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the _source_ - if err := Mount(outside1Dir, path.Join(sourceDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(sourceDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _target_ - if _, err := os.Stat(outside1CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside1CheckPath) - } - - // next mount outside2Dir into the _target_ - if err := Mount(outside2Dir, path.Join(targetDir, "b"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "b")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _source_ - if _, err := os.Stat(outside2CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside2CheckPath) - } -} - -// Testing that when a target is a shared mount, -// then child mounts propagate to the source -func TestSubtreeShared(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outsideDir = path.Join(tmp, "outside") - - outsidePath = path.Join(outsideDir, "file.txt") - sourceCheckPath = path.Join(sourceDir, "a", "file.txt") - ) - - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outsideDir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outsidePath); err != nil { - t.Fatal(err) - } - - // mount the source as shared - if err := MakeShared(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the target - if err := Mount(outsideDir, path.Join(targetDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // NOW, check that the file from the outside directory is avaible in the source directory - if _, err := os.Stat(sourceCheckPath); err != nil { - t.Fatal(err) - } -} - -// testing that mounts to a shared source show up in the slave target, -// and that mounts into a slave target do _not_ show up in the shared source -func TestSubtreeSharedSlave(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outside1Dir = path.Join(tmp, "outside1") - outside2Dir = path.Join(tmp, "outside2") - - outside1Path = path.Join(outside1Dir, "file.txt") - outside2Path = path.Join(outside2Dir, "file.txt") - outside1CheckPath = path.Join(targetDir, "a", "file.txt") - outside2CheckPath = path.Join(sourceDir, "b", "file.txt") - ) - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(path.Join(sourceDir, "b"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside1Dir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside2Dir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outside1Path); err != nil { - t.Fatal(err) - } - if err := createFile(outside2Path); err != nil { - t.Fatal(err) - } - - // mount the source as shared - if err := MakeShared(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // next, make the target slave - if err := MakeSlave(targetDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the _source_ - if err := Mount(outside1Dir, path.Join(sourceDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(sourceDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_ show in the _target_ - if _, err := os.Stat(outside1CheckPath); err != nil { - t.Fatal(err) - } - - // next mount outside2Dir into the _target_ - if err := Mount(outside2Dir, path.Join(targetDir, "b"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "b")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _source_ - if _, err := os.Stat(outside2CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside2CheckPath) - } -} - -func TestSubtreeUnbindable(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - ) - if err := os.MkdirAll(sourceDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(targetDir, 0777); err != nil { - t.Fatal(err) - } - - // next, make the source unbindable - if err := MakeUnbindable(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // then attempt to mount it to target. It should fail - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil && err != syscall.EINVAL { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not have been bindable", sourceDir) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() -} - -func createFile(path string) error { - f, err := os.Create(path) - if err != nil { - return err - } - f.WriteString("hello world!") - return f.Close() -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/events/events.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/events/events.go deleted file mode 100644 index c5987aaf1..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/events/events.go +++ /dev/null @@ -1,38 +0,0 @@ -package events - -const ( - // ContainerEventType is the event type that containers generate - ContainerEventType = "container" - // ImageEventType is the event type that images generate - ImageEventType = "image" - // VolumeEventType is the event type that volumes generate - VolumeEventType = "volume" - // NetworkEventType is the event type that networks generate - NetworkEventType = "network" -) - -// Actor describes something that generates events, -// like a container, or a network, or a volume. -// It has a defined name and a set or attributes. -// The container attributes are its labels, other actors -// can generate these attributes from other properties. -type Actor struct { - ID string - Attributes map[string]string -} - -// Message represents the information an event contains -type Message struct { - // Deprecated information from JSONMessage. - // With data only in container events. - Status string `json:"status,omitempty"` - ID string `json:"id,omitempty"` - From string `json:"from,omitempty"` - - Type string - Action string - Actor Actor - - Time int64 `json:"time,omitempty"` - TimeNano int64 `json:"timeNano,omitempty"` -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/filters/parse_test.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/filters/parse_test.go deleted file mode 100644 index 037783b91..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/filters/parse_test.go +++ /dev/null @@ -1,394 +0,0 @@ -package filters - -import ( - "fmt" - "testing" -) - -func TestParseArgs(t *testing.T) { - // equivalent of `docker ps -f 'created=today' -f 'image.name=ubuntu*' -f 'image.name=*untu'` - flagArgs := []string{ - "created=today", - "image.name=ubuntu*", - "image.name=*untu", - } - var ( - args = NewArgs() - err error - ) - for i := range flagArgs { - args, err = ParseFlag(flagArgs[i], args) - if err != nil { - t.Errorf("failed to parse %s: %s", flagArgs[i], err) - } - } - if len(args.Get("created")) != 1 { - t.Errorf("failed to set this arg") - } - if len(args.Get("image.name")) != 2 { - t.Errorf("the args should have collapsed") - } -} - -func TestParseArgsEdgeCase(t *testing.T) { - var filters Args - args, err := ParseFlag("", filters) - if err != nil { - t.Fatal(err) - } - if args.Len() != 0 { - t.Fatalf("Expected an empty Args (map), got %v", args) - } - if args, err = ParseFlag("anything", args); err == nil || err != ErrBadFormat { - t.Fatalf("Expected ErrBadFormat, got %v", err) - } -} - -func TestToParam(t *testing.T) { - fields := map[string]map[string]bool{ - "created": {"today": true}, - "image.name": {"ubuntu*": true, "*untu": true}, - } - a := Args{fields: fields} - - _, err := ToParam(a) - if err != nil { - t.Errorf("failed to marshal the filters: %s", err) - } -} - -func TestToParamWithVersion(t *testing.T) { - fields := map[string]map[string]bool{ - "created": {"today": true}, - "image.name": {"ubuntu*": true, "*untu": true}, - } - a := Args{fields: fields} - - str1, err := ToParamWithVersion("1.21", a) - if err != nil { - t.Errorf("failed to marshal the filters with version < 1.22: %s", err) - } - str2, err := ToParamWithVersion("1.22", a) - if err != nil { - t.Errorf("failed to marshal the filters with version >= 1.22: %s", err) - } - if str1 != `{"created":["today"],"image.name":["*untu","ubuntu*"]}` && - str1 != `{"created":["today"],"image.name":["ubuntu*","*untu"]}` { - t.Errorf("incorrectly marshaled the filters: %s", str1) - } - if str2 != `{"created":{"today":true},"image.name":{"*untu":true,"ubuntu*":true}}` && - str2 != `{"created":{"today":true},"image.name":{"ubuntu*":true,"*untu":true}}` { - t.Errorf("incorrectly marshaled the filters: %s", str2) - } -} - -func TestFromParam(t *testing.T) { - invalids := []string{ - "anything", - "['a','list']", - "{'key': 'value'}", - `{"key": "value"}`, - } - valid := map[*Args][]string{ - &Args{fields: map[string]map[string]bool{"key": {"value": true}}}: { - `{"key": ["value"]}`, - `{"key": {"value": true}}`, - }, - &Args{fields: map[string]map[string]bool{"key": {"value1": true, "value2": true}}}: { - `{"key": ["value1", "value2"]}`, - `{"key": {"value1": true, "value2": true}}`, - }, - &Args{fields: map[string]map[string]bool{"key1": {"value1": true}, "key2": {"value2": true}}}: { - `{"key1": ["value1"], "key2": ["value2"]}`, - `{"key1": {"value1": true}, "key2": {"value2": true}}`, - }, - } - - for _, invalid := range invalids { - if _, err := FromParam(invalid); err == nil { - t.Fatalf("Expected an error with %v, got nothing", invalid) - } - } - - for expectedArgs, matchers := range valid { - for _, json := range matchers { - args, err := FromParam(json) - if err != nil { - t.Fatal(err) - } - if args.Len() != expectedArgs.Len() { - t.Fatalf("Expected %v, go %v", expectedArgs, args) - } - for key, expectedValues := range expectedArgs.fields { - values := args.Get(key) - - if len(values) != len(expectedValues) { - t.Fatalf("Expected %v, go %v", expectedArgs, args) - } - - for _, v := range values { - if !expectedValues[v] { - t.Fatalf("Expected %v, go %v", expectedArgs, args) - } - } - } - } - } -} - -func TestEmpty(t *testing.T) { - a := Args{} - v, err := ToParam(a) - if err != nil { - t.Errorf("failed to marshal the filters: %s", err) - } - v1, err := FromParam(v) - if err != nil { - t.Errorf("%s", err) - } - if a.Len() != v1.Len() { - t.Errorf("these should both be empty sets") - } -} - -func TestArgsMatchKVListEmptySources(t *testing.T) { - args := NewArgs() - if !args.MatchKVList("created", map[string]string{}) { - t.Fatalf("Expected true for (%v,created), got true", args) - } - - args = Args{map[string]map[string]bool{"created": {"today": true}}} - if args.MatchKVList("created", map[string]string{}) { - t.Fatalf("Expected false for (%v,created), got true", args) - } -} - -func TestArgsMatchKVList(t *testing.T) { - // Not empty sources - sources := map[string]string{ - "key1": "value1", - "key2": "value2", - "key3": "value3", - } - - matches := map[*Args]string{ - &Args{}: "field", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}, - "labels": map[string]bool{"key1": true}}, - }: "labels", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}, - "labels": map[string]bool{"key1=value1": true}}, - }: "labels", - } - - for args, field := range matches { - if args.MatchKVList(field, sources) != true { - t.Fatalf("Expected true for %v on %v, got false", sources, args) - } - } - - differs := map[*Args]string{ - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}, - "labels": map[string]bool{"key4": true}}, - }: "labels", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}, - "labels": map[string]bool{"key1=value3": true}}, - }: "labels", - } - - for args, field := range differs { - if args.MatchKVList(field, sources) != false { - t.Fatalf("Expected false for %v on %v, got true", sources, args) - } - } -} - -func TestArgsMatch(t *testing.T) { - source := "today" - - matches := map[*Args]string{ - &Args{}: "field", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today": true}}, - }: "today", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"to*": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"to(.*)": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"tod": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"anyting": true, "to*": true}}, - }: "created", - } - - for args, field := range matches { - if args.Match(field, source) != true { - t.Fatalf("Expected true for %v on %v, got false", source, args) - } - } - - differs := map[*Args]string{ - &Args{map[string]map[string]bool{ - "created": map[string]bool{"tomorrow": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"to(day": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"tom(.*)": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"tom": true}}, - }: "created", - &Args{map[string]map[string]bool{ - "created": map[string]bool{"today1": true}, - "labels": map[string]bool{"today": true}}, - }: "created", - } - - for args, field := range differs { - if args.Match(field, source) != false { - t.Fatalf("Expected false for %v on %v, got true", source, args) - } - } -} - -func TestAdd(t *testing.T) { - f := NewArgs() - f.Add("status", "running") - v := f.fields["status"] - if len(v) != 1 || !v["running"] { - t.Fatalf("Expected to include a running status, got %v", v) - } - - f.Add("status", "paused") - if len(v) != 2 || !v["paused"] { - t.Fatalf("Expected to include a paused status, got %v", v) - } -} - -func TestDel(t *testing.T) { - f := NewArgs() - f.Add("status", "running") - f.Del("status", "running") - v := f.fields["status"] - if v["running"] { - t.Fatalf("Expected to not include a running status filter, got true") - } -} - -func TestLen(t *testing.T) { - f := NewArgs() - if f.Len() != 0 { - t.Fatalf("Expected to not include any field") - } - f.Add("status", "running") - if f.Len() != 1 { - t.Fatalf("Expected to include one field") - } -} - -func TestExactMatch(t *testing.T) { - f := NewArgs() - - if !f.ExactMatch("status", "running") { - t.Fatalf("Expected to match `running` when there are no filters, got false") - } - - f.Add("status", "running") - f.Add("status", "pause*") - - if !f.ExactMatch("status", "running") { - t.Fatalf("Expected to match `running` with one of the filters, got false") - } - - if f.ExactMatch("status", "paused") { - t.Fatalf("Expected to not match `paused` with one of the filters, got true") - } -} - -func TestInclude(t *testing.T) { - f := NewArgs() - if f.Include("status") { - t.Fatalf("Expected to not include a status key, got true") - } - f.Add("status", "running") - if !f.Include("status") { - t.Fatalf("Expected to include a status key, got false") - } -} - -func TestValidate(t *testing.T) { - f := NewArgs() - f.Add("status", "running") - - valid := map[string]bool{ - "status": true, - "dangling": true, - } - - if err := f.Validate(valid); err != nil { - t.Fatal(err) - } - - f.Add("bogus", "running") - if err := f.Validate(valid); err == nil { - t.Fatalf("Expected to return an error, got nil") - } -} - -func TestWalkValues(t *testing.T) { - f := NewArgs() - f.Add("status", "running") - f.Add("status", "paused") - - f.WalkValues("status", func(value string) error { - if value != "running" && value != "paused" { - t.Fatalf("Unexpected value %s", value) - } - return nil - }) - - err := f.WalkValues("status", func(value string) error { - return fmt.Errorf("return") - }) - if err == nil { - t.Fatalf("Expected to get an error, got nil") - } - - err = f.WalkValues("foo", func(value string) error { - return fmt.Errorf("return") - }) - if err != nil { - t.Fatalf("Expected to not iterate when the field doesn't exist, got %v", err) - } -} - -func TestFuzzyMatch(t *testing.T) { - f := NewArgs() - f.Add("container", "foo") - - cases := map[string]bool{ - "foo": true, - "foobar": true, - "barfoo": false, - "bar": false, - } - for source, match := range cases { - got := f.FuzzyMatch("container", source) - if got != match { - t.Fatalf("Expected %v, got %v: %s", match, got, source) - } - } -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/reference/image_reference.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/reference/image_reference.go deleted file mode 100644 index 742015820..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/reference/image_reference.go +++ /dev/null @@ -1,32 +0,0 @@ -package reference - -import ( - distreference "github.com/docker/distribution/reference" -) - -// Parse parses the given references and returns the repository and -// tag (if present) from it. If there is an error during parsing, it will -// return an error. -func Parse(ref string) (string, string, error) { - distributionRef, err := distreference.ParseNamed(ref) - if err != nil { - return "", "", err - } - - tag := GetTagFromNamedRef(distributionRef) - return distributionRef.Name(), tag, nil -} - -// GetTagFromNamedRef returns a tag from the specified reference. -// This function is necessary as long as the docker "server" api makes the distinction between repository -// and tags. -func GetTagFromNamedRef(ref distreference.Named) string { - var tag string - switch x := ref.(type) { - case distreference.Digested: - tag = x.Digest().String() - case distreference.NamedTagged: - tag = x.Tag() - } - return tag -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/strslice/strslice_test.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/strslice/strslice_test.go deleted file mode 100644 index 1163b3652..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/strslice/strslice_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package strslice - -import ( - "encoding/json" - "reflect" - "testing" -) - -func TestStrSliceMarshalJSON(t *testing.T) { - for _, testcase := range []struct { - input StrSlice - expected string - }{ - // MADNESS(stevvooe): No clue why nil would be "" but empty would be - // "null". Had to make a change here that may affect compatibility. - {input: nil, expected: "null"}, - {StrSlice{}, "[]"}, - {StrSlice{"/bin/sh", "-c", "echo"}, `["/bin/sh","-c","echo"]`}, - } { - data, err := json.Marshal(testcase.input) - if err != nil { - t.Fatal(err) - } - if string(data) != testcase.expected { - t.Fatalf("%#v: expected %v, got %v", testcase.input, testcase.expected, string(data)) - } - } -} - -func TestStrSliceUnmarshalJSON(t *testing.T) { - parts := map[string][]string{ - "": {"default", "values"}, - "[]": {}, - `["/bin/sh","-c","echo"]`: {"/bin/sh", "-c", "echo"}, - } - for json, expectedParts := range parts { - strs := StrSlice{"default", "values"} - if err := strs.UnmarshalJSON([]byte(json)); err != nil { - t.Fatal(err) - } - - actualParts := []string(strs) - if !reflect.DeepEqual(actualParts, expectedParts) { - t.Fatalf("%#v: expected %v, got %v", json, expectedParts, actualParts) - } - - } -} - -func TestStrSliceUnmarshalString(t *testing.T) { - var e StrSlice - echo, err := json.Marshal("echo") - if err != nil { - t.Fatal(err) - } - if err := json.Unmarshal(echo, &e); err != nil { - t.Fatal(err) - } - - if len(e) != 1 { - t.Fatalf("expected 1 element after unmarshal: %q", e) - } - - if e[0] != "echo" { - t.Fatalf("expected `echo`, got: %q", e[0]) - } -} - -func TestStrSliceUnmarshalSlice(t *testing.T) { - var e StrSlice - echo, err := json.Marshal([]string{"echo"}) - if err != nil { - t.Fatal(err) - } - if err := json.Unmarshal(echo, &e); err != nil { - t.Fatal(err) - } - - if len(e) != 1 { - t.Fatalf("expected 1 element after unmarshal: %q", e) - } - - if e[0] != "echo" { - t.Fatalf("expected `echo`, got: %q", e[0]) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp.go deleted file mode 100644 index d3695ba72..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp.go +++ /dev/null @@ -1,124 +0,0 @@ -package time - -import ( - "fmt" - "math" - "strconv" - "strings" - "time" -) - -// These are additional predefined layouts for use in Time.Format and Time.Parse -// with --since and --until parameters for `docker logs` and `docker events` -const ( - rFC3339Local = "2006-01-02T15:04:05" // RFC3339 with local timezone - rFC3339NanoLocal = "2006-01-02T15:04:05.999999999" // RFC3339Nano with local timezone - dateWithZone = "2006-01-02Z07:00" // RFC3339 with time at 00:00:00 - dateLocal = "2006-01-02" // RFC3339 with local timezone and time at 00:00:00 -) - -// GetTimestamp tries to parse given string as golang duration, -// then RFC3339 time and finally as a Unix timestamp. If -// any of these were successful, it returns a Unix timestamp -// as string otherwise returns the given value back. -// In case of duration input, the returned timestamp is computed -// as the given reference time minus the amount of the duration. -func GetTimestamp(value string, reference time.Time) (string, error) { - if d, err := time.ParseDuration(value); value != "0" && err == nil { - return strconv.FormatInt(reference.Add(-d).Unix(), 10), nil - } - - var format string - var parseInLocation bool - - // if the string has a Z or a + or three dashes use parse otherwise use parseinlocation - parseInLocation = !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) - - if strings.Contains(value, ".") { - if parseInLocation { - format = rFC3339NanoLocal - } else { - format = time.RFC3339Nano - } - } else if strings.Contains(value, "T") { - // we want the number of colons in the T portion of the timestamp - tcolons := strings.Count(value, ":") - // if parseInLocation is off and we have a +/- zone offset (not Z) then - // there will be an extra colon in the input for the tz offset subtract that - // colon from the tcolons count - if !parseInLocation && !strings.ContainsAny(value, "zZ") && tcolons > 0 { - tcolons-- - } - if parseInLocation { - switch tcolons { - case 0: - format = "2006-01-02T15" - case 1: - format = "2006-01-02T15:04" - default: - format = rFC3339Local - } - } else { - switch tcolons { - case 0: - format = "2006-01-02T15Z07:00" - case 1: - format = "2006-01-02T15:04Z07:00" - default: - format = time.RFC3339 - } - } - } else if parseInLocation { - format = dateLocal - } else { - format = dateWithZone - } - - var t time.Time - var err error - - if parseInLocation { - t, err = time.ParseInLocation(format, value, time.FixedZone(reference.Zone())) - } else { - t, err = time.Parse(format, value) - } - - if err != nil { - // if there is a `-` then its an RFC3339 like timestamp otherwise assume unixtimestamp - if strings.Contains(value, "-") { - return "", err // was probably an RFC3339 like timestamp but the parser failed with an error - } - return value, nil // unixtimestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server) - } - - return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil -} - -// ParseTimestamps returns seconds and nanoseconds from a timestamp that has the -// format "%d.%09d", time.Unix(), int64(time.Nanosecond())) -// if the incoming nanosecond portion is longer or shorter than 9 digits it is -// converted to nanoseconds. The expectation is that the seconds and -// seconds will be used to create a time variable. For example: -// seconds, nanoseconds, err := ParseTimestamp("1136073600.000000001",0) -// if err == nil since := time.Unix(seconds, nanoseconds) -// returns seconds as def(aultSeconds) if value == "" -func ParseTimestamps(value string, def int64) (int64, int64, error) { - if value == "" { - return def, 0, nil - } - sa := strings.SplitN(value, ".", 2) - s, err := strconv.ParseInt(sa[0], 10, 64) - if err != nil { - return s, 0, err - } - if len(sa) != 2 { - return s, 0, nil - } - n, err := strconv.ParseInt(sa[1], 10, 64) - if err != nil { - return s, n, err - } - // should already be in nanoseconds but just in case convert n to nanoseonds - n = int64(float64(n) * math.Pow(float64(10), float64(9-len(sa[1])))) - return s, n, nil -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp_test.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp_test.go deleted file mode 100644 index a1651309d..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/time/timestamp_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package time - -import ( - "fmt" - "testing" - "time" -) - -func TestGetTimestamp(t *testing.T) { - now := time.Now().In(time.UTC) - cases := []struct { - in, expected string - expectedErr bool - }{ - // Partial RFC3339 strings get parsed with second precision - {"2006-01-02T15:04:05.999999999+07:00", "1136189045.999999999", false}, - {"2006-01-02T15:04:05.999999999Z", "1136214245.999999999", false}, - {"2006-01-02T15:04:05.999999999", "1136214245.999999999", false}, - {"2006-01-02T15:04:05Z", "1136214245.000000000", false}, - {"2006-01-02T15:04:05", "1136214245.000000000", false}, - {"2006-01-02T15:04:0Z", "", true}, - {"2006-01-02T15:04:0", "", true}, - {"2006-01-02T15:04Z", "1136214240.000000000", false}, - {"2006-01-02T15:04+00:00", "1136214240.000000000", false}, - {"2006-01-02T15:04-00:00", "1136214240.000000000", false}, - {"2006-01-02T15:04", "1136214240.000000000", false}, - {"2006-01-02T15:0Z", "", true}, - {"2006-01-02T15:0", "", true}, - {"2006-01-02T15Z", "1136214000.000000000", false}, - {"2006-01-02T15+00:00", "1136214000.000000000", false}, - {"2006-01-02T15-00:00", "1136214000.000000000", false}, - {"2006-01-02T15", "1136214000.000000000", false}, - {"2006-01-02T1Z", "1136163600.000000000", false}, - {"2006-01-02T1", "1136163600.000000000", false}, - {"2006-01-02TZ", "", true}, - {"2006-01-02T", "", true}, - {"2006-01-02+00:00", "1136160000.000000000", false}, - {"2006-01-02-00:00", "1136160000.000000000", false}, - {"2006-01-02-00:01", "1136160060.000000000", false}, - {"2006-01-02Z", "1136160000.000000000", false}, - {"2006-01-02", "1136160000.000000000", false}, - {"2015-05-13T20:39:09Z", "1431549549.000000000", false}, - - // unix timestamps returned as is - {"1136073600", "1136073600", false}, - {"1136073600.000000001", "1136073600.000000001", false}, - // Durations - {"1m", fmt.Sprintf("%d", now.Add(-1*time.Minute).Unix()), false}, - {"1.5h", fmt.Sprintf("%d", now.Add(-90*time.Minute).Unix()), false}, - {"1h30m", fmt.Sprintf("%d", now.Add(-90*time.Minute).Unix()), false}, - - // String fallback - {"invalid", "invalid", false}, - } - - for _, c := range cases { - o, err := GetTimestamp(c.in, now) - if o != c.expected || - (err == nil && c.expectedErr) || - (err != nil && !c.expectedErr) { - t.Errorf("wrong value for '%s'. expected:'%s' got:'%s' with error: `%s`", c.in, c.expected, o, err) - t.Fail() - } - } -} - -func TestParseTimestamps(t *testing.T) { - cases := []struct { - in string - def, expectedS, expectedN int64 - expectedErr bool - }{ - // unix timestamps - {"1136073600", 0, 1136073600, 0, false}, - {"1136073600.000000001", 0, 1136073600, 1, false}, - {"1136073600.0000000010", 0, 1136073600, 1, false}, - {"1136073600.00000001", 0, 1136073600, 10, false}, - {"foo.bar", 0, 0, 0, true}, - {"1136073600.bar", 0, 1136073600, 0, true}, - {"", -1, -1, 0, false}, - } - - for _, c := range cases { - s, n, err := ParseTimestamps(c.in, c.def) - if s != c.expectedS || - n != c.expectedN || - (err == nil && c.expectedErr) || - (err != nil && !c.expectedErr) { - t.Errorf("wrong values for input `%s` with default `%d` expected:'%d'seconds and `%d`nanosecond got:'%d'seconds and `%d`nanoseconds with error: `%s`", c.in, c.def, c.expectedS, c.expectedN, s, n, err) - t.Fail() - } - } -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/compare_test.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/compare_test.go deleted file mode 100644 index c2b96869f..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/compare_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package versions - -import ( - "testing" -) - -func assertVersion(t *testing.T, a, b string, result int) { - if r := compare(a, b); r != result { - t.Fatalf("Unexpected version comparison result. Found %d, expected %d", r, result) - } -} - -func TestCompareVersion(t *testing.T) { - assertVersion(t, "1.12", "1.12", 0) - assertVersion(t, "1.0.0", "1", 0) - assertVersion(t, "1", "1.0.0", 0) - assertVersion(t, "1.05.00.0156", "1.0.221.9289", 1) - assertVersion(t, "1", "1.0.1", -1) - assertVersion(t, "1.0.1", "1", 1) - assertVersion(t, "1.0.1", "1.0.2", -1) - assertVersion(t, "1.0.2", "1.0.3", -1) - assertVersion(t, "1.0.3", "1.1", -1) - assertVersion(t, "1.1", "1.1.1", -1) - assertVersion(t, "1.1.1", "1.1.2", -1) - assertVersion(t, "1.1.2", "1.2", -1) -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p19/types.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p19/types.go deleted file mode 100644 index 4ed433588..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p19/types.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package v1p19 provides specific API types for the API version 1, patch 19. -package v1p19 - -import ( - "github.com/docker/engine-api/types" - "github.com/docker/engine-api/types/container" - "github.com/docker/engine-api/types/versions/v1p20" - "github.com/docker/go-connections/nat" -) - -// ContainerJSON is a backcompatibility struct for APIs prior to 1.20. -// Note this is not used by the Windows daemon. -type ContainerJSON struct { - *types.ContainerJSONBase - Volumes map[string]string - VolumesRW map[string]bool - Config *ContainerConfig - NetworkSettings *v1p20.NetworkSettings -} - -// ContainerConfig is a backcompatibility struct for APIs prior to 1.20. -type ContainerConfig struct { - *container.Config - - MacAddress string - NetworkDisabled bool - ExposedPorts map[nat.Port]struct{} - - // backward compatibility, they now live in HostConfig - VolumeDriver string - Memory int64 - MemorySwap int64 - CPUShares int64 `json:"CpuShares"` - CPUSet string `json:"Cpuset"` -} diff --git a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p20/types.go b/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p20/types.go deleted file mode 100644 index 5736efad0..000000000 --- a/Godeps/_workspace/src/github.com/docker/engine-api/types/versions/v1p20/types.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package v1p20 provides specific API types for the API version 1, patch 20. -package v1p20 - -import ( - "github.com/docker/engine-api/types" - "github.com/docker/engine-api/types/container" - "github.com/docker/go-connections/nat" -) - -// ContainerJSON is a backcompatibility struct for the API 1.20 -type ContainerJSON struct { - *types.ContainerJSONBase - Mounts []types.MountPoint - Config *ContainerConfig - NetworkSettings *NetworkSettings -} - -// ContainerConfig is a backcompatibility struct used in ContainerJSON for the API 1.20 -type ContainerConfig struct { - *container.Config - - MacAddress string - NetworkDisabled bool - ExposedPorts map[nat.Port]struct{} - - // backward compatibility, they now live in HostConfig - VolumeDriver string -} - -// StatsJSON is a backcompatibility struct used in Stats for APIs prior to 1.21 -type StatsJSON struct { - types.Stats - Network types.NetworkStats `json:"network,omitempty"` -} - -// NetworkSettings is a backward compatible struct for APIs prior to 1.21 -type NetworkSettings struct { - types.NetworkSettingsBase - types.DefaultNetworkSettings -} diff --git a/Godeps/_workspace/src/github.com/docker/go-connections/nat/nat_test.go b/Godeps/_workspace/src/github.com/docker/go-connections/nat/nat_test.go deleted file mode 100644 index 651dcd307..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-connections/nat/nat_test.go +++ /dev/null @@ -1,525 +0,0 @@ -package nat - -import ( - "testing" -) - -func TestParsePort(t *testing.T) { - var ( - p int - err error - ) - - p, err = ParsePort("1234") - - if err != nil || p != 1234 { - t.Fatal("Parsing '1234' did not succeed") - } - - // FIXME currently this is a valid port. I don't think it should be. - // I'm leaving this test commented out until we make a decision. - // - erikh - - /* - p, err = ParsePort("0123") - - if err != nil { - t.Fatal("Successfully parsed port '0123' to '123'") - } - */ - - p, err = ParsePort("asdf") - - if err == nil || p != 0 { - t.Fatal("Parsing port 'asdf' succeeded") - } - - p, err = ParsePort("1asdf") - - if err == nil || p != 0 { - t.Fatal("Parsing port '1asdf' succeeded") - } -} - -func TestParsePortRangeToInt(t *testing.T) { - var ( - begin int - end int - err error - ) - - type TestRange struct { - Range string - Begin int - End int - } - validRanges := []TestRange{ - {"1234", 1234, 1234}, - {"1234-1234", 1234, 1234}, - {"1234-1235", 1234, 1235}, - {"8000-9000", 8000, 9000}, - {"0", 0, 0}, - {"0-0", 0, 0}, - } - - for _, r := range validRanges { - begin, end, err = ParsePortRangeToInt(r.Range) - - if err != nil || begin != r.Begin { - t.Fatalf("Parsing port range '%s' did not succeed. Expected begin %d, got %d", r.Range, r.Begin, begin) - } - if err != nil || end != r.End { - t.Fatalf("Parsing port range '%s' did not succeed. Expected end %d, got %d", r.Range, r.End, end) - } - } - - invalidRanges := []string{ - "asdf", - "1asdf", - "9000-8000", - "9000-", - "-8000", - "-8000-", - } - - for _, r := range invalidRanges { - begin, end, err = ParsePortRangeToInt(r) - - if err == nil || begin != 0 || end != 0 { - t.Fatalf("Parsing port range '%s' succeeded", r) - } - } -} - -func TestPort(t *testing.T) { - p, err := NewPort("tcp", "1234") - - if err != nil { - t.Fatalf("tcp, 1234 had a parsing issue: %v", err) - } - - if string(p) != "1234/tcp" { - t.Fatal("tcp, 1234 did not result in the string 1234/tcp") - } - - if p.Proto() != "tcp" { - t.Fatal("protocol was not tcp") - } - - if p.Port() != "1234" { - t.Fatal("port string value was not 1234") - } - - if p.Int() != 1234 { - t.Fatal("port int value was not 1234") - } - - p, err = NewPort("tcp", "asd1234") - if err == nil { - t.Fatal("tcp, asd1234 was supposed to fail") - } - - p, err = NewPort("tcp", "1234-1230") - if err == nil { - t.Fatal("tcp, 1234-1230 was supposed to fail") - } - - p, err = NewPort("tcp", "1234-1242") - if err != nil { - t.Fatalf("tcp, 1234-1242 had a parsing issue: %v", err) - } - - if string(p) != "1234-1242/tcp" { - t.Fatal("tcp, 1234-1242 did not result in the string 1234-1242/tcp") - } -} - -func TestSplitProtoPort(t *testing.T) { - var ( - proto string - port string - ) - - proto, port = SplitProtoPort("1234/tcp") - - if proto != "tcp" || port != "1234" { - t.Fatal("Could not split 1234/tcp properly") - } - - proto, port = SplitProtoPort("") - - if proto != "" || port != "" { - t.Fatal("parsing an empty string yielded surprising results", proto, port) - } - - proto, port = SplitProtoPort("1234") - - if proto != "tcp" || port != "1234" { - t.Fatal("tcp is not the default protocol for portspec '1234'", proto, port) - } - - proto, port = SplitProtoPort("1234/") - - if proto != "tcp" || port != "1234" { - t.Fatal("parsing '1234/' yielded:" + port + "/" + proto) - } - - proto, port = SplitProtoPort("/tcp") - - if proto != "" || port != "" { - t.Fatal("parsing '/tcp' yielded:" + port + "/" + proto) - } -} - -func TestParsePortSpecs(t *testing.T) { - var ( - portMap map[Port]struct{} - bindingMap map[Port][]PortBinding - err error - ) - - portMap, bindingMap, err = ParsePortSpecs([]string{"1234/tcp", "2345/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1234/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2345/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - if len(bindings) != 1 { - t.Fatalf("%s should have exactly one binding", portspec) - } - - if bindings[0].HostIP != "" { - t.Fatalf("HostIP should not be set for %s", portspec) - } - - if bindings[0].HostPort != "" { - t.Fatalf("HostPort should not be set for %s", portspec) - } - } - - portMap, bindingMap, err = ParsePortSpecs([]string{"1234:1234/tcp", "2345:2345/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1234/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2345/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - _, port := SplitProtoPort(string(portspec)) - - if len(bindings) != 1 { - t.Fatalf("%s should have exactly one binding", portspec) - } - - if bindings[0].HostIP != "" { - t.Fatalf("HostIP should not be set for %s", portspec) - } - - if bindings[0].HostPort != port { - t.Fatalf("HostPort should be %s for %s", port, portspec) - } - } - - portMap, bindingMap, err = ParsePortSpecs([]string{"0.0.0.0:1234:1234/tcp", "0.0.0.0:2345:2345/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1234/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2345/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - _, port := SplitProtoPort(string(portspec)) - - if len(bindings) != 1 { - t.Fatalf("%s should have exactly one binding", portspec) - } - - if bindings[0].HostIP != "0.0.0.0" { - t.Fatalf("HostIP is not 0.0.0.0 for %s", portspec) - } - - if bindings[0].HostPort != port { - t.Fatalf("HostPort should be %s for %s", port, portspec) - } - } - - _, _, err = ParsePortSpecs([]string{"localhost:1234:1234/tcp"}) - - if err == nil { - t.Fatal("Received no error while trying to parse a hostname instead of ip") - } -} - -func TestParsePortSpecsWithRange(t *testing.T) { - var ( - portMap map[Port]struct{} - bindingMap map[Port][]PortBinding - err error - ) - - portMap, bindingMap, err = ParsePortSpecs([]string{"1234-1236/tcp", "2345-2347/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1235/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2346/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - if len(bindings) != 1 { - t.Fatalf("%s should have exactly one binding", portspec) - } - - if bindings[0].HostIP != "" { - t.Fatalf("HostIP should not be set for %s", portspec) - } - - if bindings[0].HostPort != "" { - t.Fatalf("HostPort should not be set for %s", portspec) - } - } - - portMap, bindingMap, err = ParsePortSpecs([]string{"1234-1236:1234-1236/tcp", "2345-2347:2345-2347/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1235/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2346/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - _, port := SplitProtoPort(string(portspec)) - if len(bindings) != 1 { - t.Fatalf("%s should have exactly one binding", portspec) - } - - if bindings[0].HostIP != "" { - t.Fatalf("HostIP should not be set for %s", portspec) - } - - if bindings[0].HostPort != port { - t.Fatalf("HostPort should be %s for %s", port, portspec) - } - } - - portMap, bindingMap, err = ParsePortSpecs([]string{"0.0.0.0:1234-1236:1234-1236/tcp", "0.0.0.0:2345-2347:2345-2347/udp"}) - - if err != nil { - t.Fatalf("Error while processing ParsePortSpecs: %s", err) - } - - if _, ok := portMap[Port("1235/tcp")]; !ok { - t.Fatal("1234/tcp was not parsed properly") - } - - if _, ok := portMap[Port("2346/udp")]; !ok { - t.Fatal("2345/udp was not parsed properly") - } - - for portspec, bindings := range bindingMap { - _, port := SplitProtoPort(string(portspec)) - if len(bindings) != 1 || bindings[0].HostIP != "0.0.0.0" || bindings[0].HostPort != port { - t.Fatalf("Expect single binding to port %s but found %s", port, bindings) - } - } - - _, _, err = ParsePortSpecs([]string{"localhost:1234-1236:1234-1236/tcp"}) - - if err == nil { - t.Fatal("Received no error while trying to parse a hostname instead of ip") - } -} - -func TestParseNetworkOptsPrivateOnly(t *testing.T) { - ports, bindings, err := ParsePortSpecs([]string{"192.168.1.100::80"}) - if err != nil { - t.Fatal(err) - } - if len(ports) != 1 { - t.Logf("Expected 1 got %d", len(ports)) - t.FailNow() - } - if len(bindings) != 1 { - t.Logf("Expected 1 got %d", len(bindings)) - t.FailNow() - } - for k := range ports { - if k.Proto() != "tcp" { - t.Logf("Expected tcp got %s", k.Proto()) - t.Fail() - } - if k.Port() != "80" { - t.Logf("Expected 80 got %s", k.Port()) - t.Fail() - } - b, exists := bindings[k] - if !exists { - t.Log("Binding does not exist") - t.FailNow() - } - if len(b) != 1 { - t.Logf("Expected 1 got %d", len(b)) - t.FailNow() - } - s := b[0] - if s.HostPort != "" { - t.Logf("Expected \"\" got %s", s.HostPort) - t.Fail() - } - if s.HostIP != "192.168.1.100" { - t.Fail() - } - } -} - -func TestParseNetworkOptsPublic(t *testing.T) { - ports, bindings, err := ParsePortSpecs([]string{"192.168.1.100:8080:80"}) - if err != nil { - t.Fatal(err) - } - if len(ports) != 1 { - t.Logf("Expected 1 got %d", len(ports)) - t.FailNow() - } - if len(bindings) != 1 { - t.Logf("Expected 1 got %d", len(bindings)) - t.FailNow() - } - for k := range ports { - if k.Proto() != "tcp" { - t.Logf("Expected tcp got %s", k.Proto()) - t.Fail() - } - if k.Port() != "80" { - t.Logf("Expected 80 got %s", k.Port()) - t.Fail() - } - b, exists := bindings[k] - if !exists { - t.Log("Binding does not exist") - t.FailNow() - } - if len(b) != 1 { - t.Logf("Expected 1 got %d", len(b)) - t.FailNow() - } - s := b[0] - if s.HostPort != "8080" { - t.Logf("Expected 8080 got %s", s.HostPort) - t.Fail() - } - if s.HostIP != "192.168.1.100" { - t.Fail() - } - } -} - -func TestParseNetworkOptsPublicNoPort(t *testing.T) { - ports, bindings, err := ParsePortSpecs([]string{"192.168.1.100"}) - - if err == nil { - t.Logf("Expected error Invalid containerPort") - t.Fail() - } - if ports != nil { - t.Logf("Expected nil got %s", ports) - t.Fail() - } - if bindings != nil { - t.Logf("Expected nil got %s", bindings) - t.Fail() - } -} - -func TestParseNetworkOptsNegativePorts(t *testing.T) { - ports, bindings, err := ParsePortSpecs([]string{"192.168.1.100:-1:-1"}) - - if err == nil { - t.Fail() - } - if len(ports) != 0 { - t.Logf("Expected nil got %d", len(ports)) - t.Fail() - } - if len(bindings) != 0 { - t.Logf("Expected 0 got %d", len(bindings)) - t.Fail() - } -} - -func TestParseNetworkOptsUdp(t *testing.T) { - ports, bindings, err := ParsePortSpecs([]string{"192.168.1.100::6000/udp"}) - if err != nil { - t.Fatal(err) - } - if len(ports) != 1 { - t.Logf("Expected 1 got %d", len(ports)) - t.FailNow() - } - if len(bindings) != 1 { - t.Logf("Expected 1 got %d", len(bindings)) - t.FailNow() - } - for k := range ports { - if k.Proto() != "udp" { - t.Logf("Expected udp got %s", k.Proto()) - t.Fail() - } - if k.Port() != "6000" { - t.Logf("Expected 6000 got %s", k.Port()) - t.Fail() - } - b, exists := bindings[k] - if !exists { - t.Log("Binding does not exist") - t.FailNow() - } - if len(b) != 1 { - t.Logf("Expected 1 got %d", len(b)) - t.FailNow() - } - s := b[0] - if s.HostPort != "" { - t.Logf("Expected \"\" got %s", s.HostPort) - t.Fail() - } - if s.HostIP != "192.168.1.100" { - t.Fail() - } - } -} diff --git a/Godeps/_workspace/src/github.com/docker/go-connections/nat/parse_test.go b/Godeps/_workspace/src/github.com/docker/go-connections/nat/parse_test.go deleted file mode 100644 index 2ac204a05..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-connections/nat/parse_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package nat - -import ( - "strings" - "testing" -) - -func TestParsePortRange(t *testing.T) { - if start, end, err := ParsePortRange("8000-8080"); err != nil || start != 8000 || end != 8080 { - t.Fatalf("Error: %s or Expecting {start,end} values {8000,8080} but found {%d,%d}.", err, start, end) - } -} - -func TestParsePortRangeEmpty(t *testing.T) { - if _, _, err := ParsePortRange(""); err == nil || err.Error() != "Empty string specified for ports." { - t.Fatalf("Expected error 'Empty string specified for ports.', got %v", err) - } -} - -func TestParsePortRangeWithNoRange(t *testing.T) { - start, end, err := ParsePortRange("8080") - if err != nil { - t.Fatal(err) - } - if start != 8080 || end != 8080 { - t.Fatalf("Expected start and end to be the same and equal to 8080, but were %v and %v", start, end) - } -} - -func TestParsePortRangeIncorrectRange(t *testing.T) { - if _, _, err := ParsePortRange("9000-8080"); err == nil || !strings.Contains(err.Error(), "Invalid range specified for the Port") { - t.Fatalf("Expecting error 'Invalid range specified for the Port' but received %s.", err) - } -} - -func TestParsePortRangeIncorrectEndRange(t *testing.T) { - if _, _, err := ParsePortRange("8000-a"); err == nil || !strings.Contains(err.Error(), "invalid syntax") { - t.Fatalf("Expecting error 'Invalid range specified for the Port' but received %s.", err) - } - - if _, _, err := ParsePortRange("8000-30a"); err == nil || !strings.Contains(err.Error(), "invalid syntax") { - t.Fatalf("Expecting error 'Invalid range specified for the Port' but received %s.", err) - } -} - -func TestParsePortRangeIncorrectStartRange(t *testing.T) { - if _, _, err := ParsePortRange("a-8000"); err == nil || !strings.Contains(err.Error(), "invalid syntax") { - t.Fatalf("Expecting error 'Invalid range specified for the Port' but received %s.", err) - } - - if _, _, err := ParsePortRange("30a-8000"); err == nil || !strings.Contains(err.Error(), "invalid syntax") { - t.Fatalf("Expecting error 'Invalid range specified for the Port' but received %s.", err) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/go-connections/nat/sort_test.go b/Godeps/_workspace/src/github.com/docker/go-connections/nat/sort_test.go deleted file mode 100644 index 88ed91115..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-connections/nat/sort_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package nat - -import ( - "fmt" - "reflect" - "testing" -) - -func TestSortUniquePorts(t *testing.T) { - ports := []Port{ - Port("6379/tcp"), - Port("22/tcp"), - } - - Sort(ports, func(ip, jp Port) bool { - return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && ip.Proto() == "tcp") - }) - - first := ports[0] - if fmt.Sprint(first) != "22/tcp" { - t.Log(fmt.Sprint(first)) - t.Fail() - } -} - -func TestSortSamePortWithDifferentProto(t *testing.T) { - ports := []Port{ - Port("8888/tcp"), - Port("8888/udp"), - Port("6379/tcp"), - Port("6379/udp"), - } - - Sort(ports, func(ip, jp Port) bool { - return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && ip.Proto() == "tcp") - }) - - first := ports[0] - if fmt.Sprint(first) != "6379/tcp" { - t.Fail() - } -} - -func TestSortPortMap(t *testing.T) { - ports := []Port{ - Port("22/tcp"), - Port("22/udp"), - Port("8000/tcp"), - Port("6379/tcp"), - Port("9999/tcp"), - } - - portMap := PortMap{ - Port("22/tcp"): []PortBinding{ - {}, - }, - Port("8000/tcp"): []PortBinding{ - {}, - }, - Port("6379/tcp"): []PortBinding{ - {}, - {HostIP: "0.0.0.0", HostPort: "32749"}, - }, - Port("9999/tcp"): []PortBinding{ - {HostIP: "0.0.0.0", HostPort: "40000"}, - }, - } - - SortPortMap(ports, portMap) - if !reflect.DeepEqual(ports, []Port{ - Port("9999/tcp"), - Port("6379/tcp"), - Port("8000/tcp"), - Port("22/tcp"), - Port("22/udp"), - }) { - t.Errorf("failed to prioritize port with explicit mappings, got %v", ports) - } - if pm := portMap[Port("6379/tcp")]; !reflect.DeepEqual(pm, []PortBinding{ - {HostIP: "0.0.0.0", HostPort: "32749"}, - {}, - }) { - t.Errorf("failed to prioritize bindings with explicit mappings, got %v", pm) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/go-units/duration_test.go b/Godeps/_workspace/src/github.com/docker/go-units/duration_test.go deleted file mode 100644 index 63baa515b..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-units/duration_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package units - -import ( - "fmt" - "testing" - "time" -) - -func ExampleHumanDuration() { - fmt.Println(HumanDuration(450 * time.Millisecond)) - fmt.Println(HumanDuration(47 * time.Second)) - fmt.Println(HumanDuration(1 * time.Minute)) - fmt.Println(HumanDuration(3 * time.Minute)) - fmt.Println(HumanDuration(35 * time.Minute)) - fmt.Println(HumanDuration(35*time.Minute + 40*time.Second)) - fmt.Println(HumanDuration(1 * time.Hour)) - fmt.Println(HumanDuration(1*time.Hour + 45*time.Minute)) - fmt.Println(HumanDuration(3 * time.Hour)) - fmt.Println(HumanDuration(3*time.Hour + 59*time.Minute)) - fmt.Println(HumanDuration(3*time.Hour + 60*time.Minute)) - fmt.Println(HumanDuration(24 * time.Hour)) - fmt.Println(HumanDuration(24*time.Hour + 12*time.Hour)) - fmt.Println(HumanDuration(2 * 24 * time.Hour)) - fmt.Println(HumanDuration(7 * 24 * time.Hour)) - fmt.Println(HumanDuration(13*24*time.Hour + 5*time.Hour)) - fmt.Println(HumanDuration(2 * 7 * 24 * time.Hour)) - fmt.Println(HumanDuration(2*7*24*time.Hour + 4*24*time.Hour)) - fmt.Println(HumanDuration(3 * 7 * 24 * time.Hour)) - fmt.Println(HumanDuration(4 * 7 * 24 * time.Hour)) - fmt.Println(HumanDuration(4*7*24*time.Hour + 3*24*time.Hour)) - fmt.Println(HumanDuration(1 * 30 * 24 * time.Hour)) - fmt.Println(HumanDuration(1*30*24*time.Hour + 2*7*24*time.Hour)) - fmt.Println(HumanDuration(2 * 30 * 24 * time.Hour)) - fmt.Println(HumanDuration(3*30*24*time.Hour + 1*7*24*time.Hour)) - fmt.Println(HumanDuration(5*30*24*time.Hour + 2*7*24*time.Hour)) - fmt.Println(HumanDuration(13 * 30 * 24 * time.Hour)) - fmt.Println(HumanDuration(23 * 30 * 24 * time.Hour)) - fmt.Println(HumanDuration(24 * 30 * 24 * time.Hour)) - fmt.Println(HumanDuration(24*30*24*time.Hour + 2*7*24*time.Hour)) - fmt.Println(HumanDuration(3*365*24*time.Hour + 2*30*24*time.Hour)) -} - -func TestHumanDuration(t *testing.T) { - // Useful duration abstractions - day := 24 * time.Hour - week := 7 * day - month := 30 * day - year := 365 * day - - assertEquals(t, "Less than a second", HumanDuration(450*time.Millisecond)) - assertEquals(t, "47 seconds", HumanDuration(47*time.Second)) - assertEquals(t, "About a minute", HumanDuration(1*time.Minute)) - assertEquals(t, "3 minutes", HumanDuration(3*time.Minute)) - assertEquals(t, "35 minutes", HumanDuration(35*time.Minute)) - assertEquals(t, "35 minutes", HumanDuration(35*time.Minute+40*time.Second)) - assertEquals(t, "About an hour", HumanDuration(1*time.Hour)) - assertEquals(t, "About an hour", HumanDuration(1*time.Hour+45*time.Minute)) - assertEquals(t, "3 hours", HumanDuration(3*time.Hour)) - assertEquals(t, "3 hours", HumanDuration(3*time.Hour+59*time.Minute)) - assertEquals(t, "4 hours", HumanDuration(3*time.Hour+60*time.Minute)) - assertEquals(t, "24 hours", HumanDuration(24*time.Hour)) - assertEquals(t, "36 hours", HumanDuration(1*day+12*time.Hour)) - assertEquals(t, "2 days", HumanDuration(2*day)) - assertEquals(t, "7 days", HumanDuration(7*day)) - assertEquals(t, "13 days", HumanDuration(13*day+5*time.Hour)) - assertEquals(t, "2 weeks", HumanDuration(2*week)) - assertEquals(t, "2 weeks", HumanDuration(2*week+4*day)) - assertEquals(t, "3 weeks", HumanDuration(3*week)) - assertEquals(t, "4 weeks", HumanDuration(4*week)) - assertEquals(t, "4 weeks", HumanDuration(4*week+3*day)) - assertEquals(t, "4 weeks", HumanDuration(1*month)) - assertEquals(t, "6 weeks", HumanDuration(1*month+2*week)) - assertEquals(t, "8 weeks", HumanDuration(2*month)) - assertEquals(t, "3 months", HumanDuration(3*month+1*week)) - assertEquals(t, "5 months", HumanDuration(5*month+2*week)) - assertEquals(t, "13 months", HumanDuration(13*month)) - assertEquals(t, "23 months", HumanDuration(23*month)) - assertEquals(t, "24 months", HumanDuration(24*month)) - assertEquals(t, "2 years", HumanDuration(24*month+2*week)) - assertEquals(t, "3 years", HumanDuration(3*year+2*month)) -} diff --git a/Godeps/_workspace/src/github.com/docker/go-units/size_test.go b/Godeps/_workspace/src/github.com/docker/go-units/size_test.go deleted file mode 100644 index a968f5c0d..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-units/size_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package units - -import ( - "fmt" - "reflect" - "runtime" - "strings" - "testing" -) - -func ExampleBytesSize() { - fmt.Println(BytesSize(1024)) - fmt.Println(BytesSize(1024 * 1024)) - fmt.Println(BytesSize(1048576)) - fmt.Println(BytesSize(2 * MiB)) - fmt.Println(BytesSize(3.42 * GiB)) - fmt.Println(BytesSize(5.372 * TiB)) - fmt.Println(BytesSize(2.22 * PiB)) -} - -func ExampleHumanSize() { - fmt.Println(HumanSize(1000)) - fmt.Println(HumanSize(1024)) - fmt.Println(HumanSize(1000000)) - fmt.Println(HumanSize(1048576)) - fmt.Println(HumanSize(2 * MB)) - fmt.Println(HumanSize(float64(3.42 * GB))) - fmt.Println(HumanSize(float64(5.372 * TB))) - fmt.Println(HumanSize(float64(2.22 * PB))) -} - -func ExampleFromHumanSize() { - fmt.Println(FromHumanSize("32")) - fmt.Println(FromHumanSize("32b")) - fmt.Println(FromHumanSize("32B")) - fmt.Println(FromHumanSize("32k")) - fmt.Println(FromHumanSize("32K")) - fmt.Println(FromHumanSize("32kb")) - fmt.Println(FromHumanSize("32Kb")) - fmt.Println(FromHumanSize("32Mb")) - fmt.Println(FromHumanSize("32Gb")) - fmt.Println(FromHumanSize("32Tb")) - fmt.Println(FromHumanSize("32Pb")) -} - -func ExampleRAMInBytes() { - fmt.Println(RAMInBytes("32")) - fmt.Println(RAMInBytes("32b")) - fmt.Println(RAMInBytes("32B")) - fmt.Println(RAMInBytes("32k")) - fmt.Println(RAMInBytes("32K")) - fmt.Println(RAMInBytes("32kb")) - fmt.Println(RAMInBytes("32Kb")) - fmt.Println(RAMInBytes("32Mb")) - fmt.Println(RAMInBytes("32Gb")) - fmt.Println(RAMInBytes("32Tb")) - fmt.Println(RAMInBytes("32Pb")) - fmt.Println(RAMInBytes("32PB")) - fmt.Println(RAMInBytes("32P")) -} - -func TestBytesSize(t *testing.T) { - assertEquals(t, "1 KiB", BytesSize(1024)) - assertEquals(t, "1 MiB", BytesSize(1024*1024)) - assertEquals(t, "1 MiB", BytesSize(1048576)) - assertEquals(t, "2 MiB", BytesSize(2*MiB)) - assertEquals(t, "3.42 GiB", BytesSize(3.42*GiB)) - assertEquals(t, "5.372 TiB", BytesSize(5.372*TiB)) - assertEquals(t, "2.22 PiB", BytesSize(2.22*PiB)) -} - -func TestHumanSize(t *testing.T) { - assertEquals(t, "1 kB", HumanSize(1000)) - assertEquals(t, "1.024 kB", HumanSize(1024)) - assertEquals(t, "1 MB", HumanSize(1000000)) - assertEquals(t, "1.049 MB", HumanSize(1048576)) - assertEquals(t, "2 MB", HumanSize(2*MB)) - assertEquals(t, "3.42 GB", HumanSize(float64(3.42*GB))) - assertEquals(t, "5.372 TB", HumanSize(float64(5.372*TB))) - assertEquals(t, "2.22 PB", HumanSize(float64(2.22*PB))) -} - -func TestFromHumanSize(t *testing.T) { - assertSuccessEquals(t, 32, FromHumanSize, "32") - assertSuccessEquals(t, 32, FromHumanSize, "32b") - assertSuccessEquals(t, 32, FromHumanSize, "32B") - assertSuccessEquals(t, 32*KB, FromHumanSize, "32k") - assertSuccessEquals(t, 32*KB, FromHumanSize, "32K") - assertSuccessEquals(t, 32*KB, FromHumanSize, "32kb") - assertSuccessEquals(t, 32*KB, FromHumanSize, "32Kb") - assertSuccessEquals(t, 32*MB, FromHumanSize, "32Mb") - assertSuccessEquals(t, 32*GB, FromHumanSize, "32Gb") - assertSuccessEquals(t, 32*TB, FromHumanSize, "32Tb") - assertSuccessEquals(t, 32*PB, FromHumanSize, "32Pb") - - assertError(t, FromHumanSize, "") - assertError(t, FromHumanSize, "hello") - assertError(t, FromHumanSize, "-32") - assertError(t, FromHumanSize, "32.3") - assertError(t, FromHumanSize, " 32 ") - assertError(t, FromHumanSize, "32.3Kb") - assertError(t, FromHumanSize, "32 mb") - assertError(t, FromHumanSize, "32m b") - assertError(t, FromHumanSize, "32bm") -} - -func TestRAMInBytes(t *testing.T) { - assertSuccessEquals(t, 32, RAMInBytes, "32") - assertSuccessEquals(t, 32, RAMInBytes, "32b") - assertSuccessEquals(t, 32, RAMInBytes, "32B") - assertSuccessEquals(t, 32*KiB, RAMInBytes, "32k") - assertSuccessEquals(t, 32*KiB, RAMInBytes, "32K") - assertSuccessEquals(t, 32*KiB, RAMInBytes, "32kb") - assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kb") - assertSuccessEquals(t, 32*MiB, RAMInBytes, "32Mb") - assertSuccessEquals(t, 32*GiB, RAMInBytes, "32Gb") - assertSuccessEquals(t, 32*TiB, RAMInBytes, "32Tb") - assertSuccessEquals(t, 32*PiB, RAMInBytes, "32Pb") - assertSuccessEquals(t, 32*PiB, RAMInBytes, "32PB") - assertSuccessEquals(t, 32*PiB, RAMInBytes, "32P") - - assertError(t, RAMInBytes, "") - assertError(t, RAMInBytes, "hello") - assertError(t, RAMInBytes, "-32") - assertError(t, RAMInBytes, "32.3") - assertError(t, RAMInBytes, " 32 ") - assertError(t, RAMInBytes, "32.3Kb") - assertError(t, RAMInBytes, "32 mb") - assertError(t, RAMInBytes, "32m b") - assertError(t, RAMInBytes, "32bm") -} - -func assertEquals(t *testing.T, expected, actual interface{}) { - if expected != actual { - t.Errorf("Expected '%v' but got '%v'", expected, actual) - } -} - -// func that maps to the parse function signatures as testing abstraction -type parseFn func(string) (int64, error) - -// Define 'String()' for pretty-print -func (fn parseFn) String() string { - fnName := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name() - return fnName[strings.LastIndex(fnName, ".")+1:] -} - -func assertSuccessEquals(t *testing.T, expected int64, fn parseFn, arg string) { - res, err := fn(arg) - if err != nil || res != expected { - t.Errorf("%s(\"%s\") -> expected '%d' but got '%d' with error '%v'", fn, arg, expected, res, err) - } -} - -func assertError(t *testing.T, fn parseFn, arg string) { - res, err := fn(arg) - if err == nil && res != -1 { - t.Errorf("%s(\"%s\") -> expected error but got '%d'", fn, arg, res) - } -} diff --git a/Godeps/_workspace/src/github.com/docker/go-units/ulimit_test.go b/Godeps/_workspace/src/github.com/docker/go-units/ulimit_test.go deleted file mode 100644 index 3e7f10fc2..000000000 --- a/Godeps/_workspace/src/github.com/docker/go-units/ulimit_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package units - -import ( - "fmt" - "strconv" - "testing" -) - -func ExampleParseUlimit() { - fmt.Println(ParseUlimit("nofile=512:1024")) - fmt.Println(ParseUlimit("nofile=1024")) - fmt.Println(ParseUlimit("cpu=2:4")) - fmt.Println(ParseUlimit("cpu=6")) -} - -func TestParseUlimitValid(t *testing.T) { - u1 := &Ulimit{"nofile", 1024, 512} - if u2, _ := ParseUlimit("nofile=512:1024"); *u1 != *u2 { - t.Fatalf("expected %q, but got %q", u1, u2) - } -} - -func TestParseUlimitInvalidLimitType(t *testing.T) { - if _, err := ParseUlimit("notarealtype=1024:1024"); err == nil { - t.Fatalf("expected error on invalid ulimit type") - } -} - -func TestParseUlimitBadFormat(t *testing.T) { - if _, err := ParseUlimit("nofile:1024:1024"); err == nil { - t.Fatal("expected error on bad syntax") - } - - if _, err := ParseUlimit("nofile"); err == nil { - t.Fatal("expected error on bad syntax") - } - - if _, err := ParseUlimit("nofile="); err == nil { - t.Fatal("expected error on bad syntax") - } - if _, err := ParseUlimit("nofile=:"); err == nil { - t.Fatal("expected error on bad syntax") - } - if _, err := ParseUlimit("nofile=:1024"); err == nil { - t.Fatal("expected error on bad syntax") - } -} - -func TestParseUlimitHardLessThanSoft(t *testing.T) { - if _, err := ParseUlimit("nofile=1024:1"); err == nil { - t.Fatal("expected error on hard limit less than soft limit") - } -} - -func TestParseUlimitInvalidValueType(t *testing.T) { - if _, err := ParseUlimit("nofile=asdf"); err == nil { - t.Fatal("expected error on bad value type, but got no error") - } else if _, ok := err.(*strconv.NumError); !ok { - t.Fatalf("expected error on bad value type, but got `%s`", err) - } - - if _, err := ParseUlimit("nofile=1024:asdf"); err == nil { - t.Fatal("expected error on bad value type, but got no error") - } else if _, ok := err.(*strconv.NumError); !ok { - t.Fatalf("expected error on bad value type, but got `%s`", err) - } -} - -func TestUlimitStringOutput(t *testing.T) { - u := &Ulimit{"nofile", 1024, 512} - if s := u.String(); s != "nofile=512:1024" { - t.Fatal("expected String to return nofile=512:1024, but got", s) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go deleted file mode 100644 index db6a1a752..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package restful - -import ( - "fmt" - "net/http" - "net/http/httptest" - "testing" -) - -func setupCurly(container *Container) []string { - wsCount := 26 - rtCount := 26 - urisCurly := []string{} - - container.Router(CurlyRouter{}) - for i := 0; i < wsCount; i++ { - root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97)) - ws := new(WebService).Path(root) - for j := 0; j < rtCount; j++ { - sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97)) - ws.Route(ws.GET(sub).Consumes("application/xml").Produces("application/xml").To(echoCurly)) - } - container.Add(ws) - for _, each := range ws.Routes() { - urisCurly = append(urisCurly, "http://bench.com"+each.Path) - } - } - return urisCurly -} - -func echoCurly(req *Request, resp *Response) {} - -func BenchmarkManyCurly(b *testing.B) { - container := NewContainer() - urisCurly := setupCurly(container) - b.ResetTimer() - for t := 0; t < b.N; t++ { - for r := 0; r < 1000; r++ { - for _, each := range urisCurly { - sendNoReturnTo(each, container, t) - } - } - } -} - -func sendNoReturnTo(address string, container *Container, t int) { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "application/xml") - httpWriter := httptest.NewRecorder() - container.dispatch(httpWriter, httpRequest) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go deleted file mode 100644 index 3e77c2d29..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package restful - -import ( - "fmt" - "io" - "testing" -) - -var uris = []string{} - -func setup(container *Container) { - wsCount := 26 - rtCount := 26 - - for i := 0; i < wsCount; i++ { - root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97)) - ws := new(WebService).Path(root) - for j := 0; j < rtCount; j++ { - sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97)) - ws.Route(ws.GET(sub).To(echo)) - } - container.Add(ws) - for _, each := range ws.Routes() { - uris = append(uris, "http://bench.com"+each.Path) - } - } -} - -func echo(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "echo") -} - -func BenchmarkMany(b *testing.B) { - container := NewContainer() - setup(container) - b.ResetTimer() - for t := 0; t < b.N; t++ { - for _, each := range uris { - // println(each) - sendItTo(each, container) - } - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go deleted file mode 100644 index 84a93c3fc..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package restful - -import ( - "bytes" - "compress/gzip" - "compress/zlib" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestGzip ...restful -func TestGzip(t *testing.T) { - EnableContentEncoding = true - httpRequest, _ := http.NewRequest("GET", "/test", nil) - httpRequest.Header.Set("Accept-Encoding", "gzip,deflate") - httpWriter := httptest.NewRecorder() - wanted, encoding := wantsCompressedResponse(httpRequest) - if !wanted { - t.Fatal("should accept gzip") - } - if encoding != "gzip" { - t.Fatal("expected gzip") - } - c, err := NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - t.Fatal(err.Error()) - } - c.Write([]byte("Hello World")) - c.Close() - if httpWriter.Header().Get("Content-Encoding") != "gzip" { - t.Fatal("Missing gzip header") - } - reader, err := gzip.NewReader(httpWriter.Body) - if err != nil { - t.Fatal(err.Error()) - } - data, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err.Error()) - } - if got, want := string(data), "Hello World"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestDeflate(t *testing.T) { - EnableContentEncoding = true - httpRequest, _ := http.NewRequest("GET", "/test", nil) - httpRequest.Header.Set("Accept-Encoding", "deflate,gzip") - httpWriter := httptest.NewRecorder() - wanted, encoding := wantsCompressedResponse(httpRequest) - if !wanted { - t.Fatal("should accept deflate") - } - if encoding != "deflate" { - t.Fatal("expected deflate") - } - c, err := NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - t.Fatal(err.Error()) - } - c.Write([]byte("Hello World")) - c.Close() - if httpWriter.Header().Get("Content-Encoding") != "deflate" { - t.Fatal("Missing deflate header") - } - reader, err := zlib.NewReader(httpWriter.Body) - if err != nil { - t.Fatal(err.Error()) - } - data, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err.Error()) - } - if got, want := string(data), "Hello World"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestGzipDecompressRequestBody(t *testing.T) { - b := new(bytes.Buffer) - w := newGzipWriter() - w.Reset(b) - io.WriteString(w, `{"msg":"hi"}`) - w.Flush() - w.Close() - - req := new(Request) - httpRequest, _ := http.NewRequest("GET", "/", bytes.NewReader(b.Bytes())) - httpRequest.Header.Set("Content-Type", "application/json") - httpRequest.Header.Set("Content-Encoding", "gzip") - req.Request = httpRequest - - doCacheReadEntityBytes = false - doc := make(map[string]interface{}) - req.ReadEntity(&doc) - - if got, want := doc["msg"], "hi"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestZlibDecompressRequestBody(t *testing.T) { - b := new(bytes.Buffer) - w := newZlibWriter() - w.Reset(b) - io.WriteString(w, `{"msg":"hi"}`) - w.Flush() - w.Close() - - req := new(Request) - httpRequest, _ := http.NewRequest("GET", "/", bytes.NewReader(b.Bytes())) - httpRequest.Header.Set("Content-Type", "application/json") - httpRequest.Header.Set("Content-Encoding", "deflate") - req.Request = httpRequest - - doCacheReadEntityBytes = false - doc := make(map[string]interface{}) - req.ReadEntity(&doc) - - if got, want := doc["msg"], "hi"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/container_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/container_test.go deleted file mode 100644 index dd2552c37..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/container_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestContainer_computeAllowedMethods ...restful -func TestContainer_computeAllowedMethods(t *testing.T) { - wc := NewContainer() - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.GET("{i}").To(dummy)) - ws1.Route(ws1.POST("{i}").To(dummy)) - wc.Add(ws1) - httpRequest, _ := http.NewRequest("GET", "http://api.his.com/users/1", nil) - rreq := Request{Request: httpRequest} - m := wc.computeAllowedMethods(&rreq) - if len(m) != 2 { - t.Errorf("got %d expected 2 methods, %v", len(m), m) - } -} - -func TestContainer_HandleWithFilter(t *testing.T) { - prefilterCalled := false - postfilterCalled := false - httpHandlerCalled := false - - wc := NewContainer() - wc.Filter(func(request *Request, response *Response, chain *FilterChain) { - prefilterCalled = true - chain.ProcessFilter(request, response) - }) - wc.HandleWithFilter("/", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - httpHandlerCalled = true - w.Write([]byte("ok")) - })) - wc.Filter(func(request *Request, response *Response, chain *FilterChain) { - postfilterCalled = true - chain.ProcessFilter(request, response) - }) - - recorder := httptest.NewRecorder() - request, _ := http.NewRequest("GET", "/", nil) - wc.ServeHTTP(recorder, request) - if recorder.Code != http.StatusOK { - t.Errorf("unexpected code %d", recorder.Code) - } - if recorder.Body.String() != "ok" { - t.Errorf("unexpected body %s", recorder.Body.String()) - } - if !prefilterCalled { - t.Errorf("filter added before calling HandleWithFilter wasn't called") - } - if !postfilterCalled { - t.Errorf("filter added after calling HandleWithFilter wasn't called") - } - if !httpHandlerCalled { - t.Errorf("handler added by calling HandleWithFilter wasn't called") - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go deleted file mode 100644 index 9b4723089..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestCORSFilter_Preflight ...restful -// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request -func TestCORSFilter_Preflight(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-Custom-Header"}, - AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"}, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - // Preflight - httpRequest, _ := http.NewRequest("OPTIONS", "http://api.alice.com/cors", nil) - httpRequest.Method = "OPTIONS" - httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com") - httpRequest.Header.Set(HEADER_AccessControlRequestMethod, "PUT") - httpRequest.Header.Set(HEADER_AccessControlRequestHeaders, "X-Custom-Header, X-Additional-Header") - - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if "http://api.bob.com" != actual { - t.Fatal("expected: http://api.bob.com but got:" + actual) - } - actual = httpWriter.Header().Get(HEADER_AccessControlAllowMethods) - if "PUT" != actual { - t.Fatal("expected: PUT but got:" + actual) - } - actual = httpWriter.Header().Get(HEADER_AccessControlAllowHeaders) - if "X-Custom-Header, X-Additional-Header" != actual { - t.Fatal("expected: X-Custom-Header, X-Additional-Header but got:" + actual) - } - - if !cors.isOriginAllowed("somewhere") { - t.Fatal("origin expected to be allowed") - } - cors.AllowedDomains = []string{"overthere.com"} - if cors.isOriginAllowed("somewhere") { - t.Fatal("origin [somewhere] expected NOT to be allowed") - } - if !cors.isOriginAllowed("overthere.com") { - t.Fatal("origin [overthere] expected to be allowed") - } - -} - -// go test -v -test.run TestCORSFilter_Actual ...restful -// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request -func TestCORSFilter_Actual(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-Custom-Header"}, - AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"}, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - // Actual - httpRequest, _ := http.NewRequest("PUT", "http://api.alice.com/cors", nil) - httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com") - httpRequest.Header.Set("X-Custom-Header", "value") - - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if "http://api.bob.com" != actual { - t.Fatal("expected: http://api.bob.com but got:" + actual) - } - if httpWriter.Body.String() != "dummy" { - t.Fatal("expected: dummy but got:" + httpWriter.Body.String()) - } -} - -var allowedDomainInput = []struct { - domains []string - origin string - accepted bool -}{ - {[]string{}, "http://anything.com", true}, -} - -// go test -v -test.run TestCORSFilter_AllowedDomains ...restful -func TestCORSFilter_AllowedDomains(t *testing.T) { - for _, each := range allowedDomainInput { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - AllowedDomains: each.domains, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - httpRequest, _ := http.NewRequest("PUT", "http://api.his.com/cors", nil) - httpRequest.Header.Set(HEADER_Origin, each.origin) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if actual != each.origin && each.accepted { - t.Fatal("expected to be accepted") - } - if actual == each.origin && !each.accepted { - t.Fatal("did not expect to be accepted") - } - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go deleted file mode 100644 index 31d66dcbd..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go +++ /dev/null @@ -1,231 +0,0 @@ -package restful - -import ( - "io" - "net/http" - "testing" -) - -var requestPaths = []struct { - // url with path (1) is handled by service with root (2) and remainder has value final (3) - path, root string -}{ - {"/", "/"}, - {"/p", "/p"}, - {"/p/x", "/p/{q}"}, - {"/q/x", "/q"}, - {"/p/x/", "/p/{q}"}, - {"/p/x/y", "/p/{q}"}, - {"/q/x/y", "/q"}, - {"/z/q", "/{p}/q"}, - {"/a/b/c/q", "/"}, -} - -// go test -v -test.run TestCurlyDetectWebService ...restful -func TestCurlyDetectWebService(t *testing.T) { - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws7 := new(WebService).Path("/{p}/q") - var wss = []*WebService{ws1, ws2, ws3, ws4, ws5, ws7} - - for _, each := range wss { - t.Logf("path=%s,toks=%v\n", each.pathExpr.Source, each.pathExpr.tokens) - } - - router := CurlyRouter{} - - ok := true - for i, fixture := range requestPaths { - requestTokens := tokenizePath(fixture.path) - who := router.detectWebService(requestTokens, wss) - if who != nil && who.RootPath() != fixture.root { - t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath()) - ok = false - } - } - if !ok { - t.Fail() - } -} - -var serviceDetects = []struct { - path string - found bool - root string -}{ - {"/a/b", true, "/{p}/{q}/{r}"}, - {"/p/q", true, "/p/q"}, - {"/q/p", true, "/q"}, - {"/", true, "/"}, - {"/p/q/r", true, "/p/q"}, -} - -// go test -v -test.run Test_detectWebService ...restful -func Test_detectWebService(t *testing.T) { - router := CurlyRouter{} - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws6 := new(WebService).Path("/p/{q}/") - ws7 := new(WebService).Path("/{p}/q") - ws8 := new(WebService).Path("/{p}/{q}/{r}") - var wss = []*WebService{ws8, ws7, ws6, ws5, ws4, ws3, ws2, ws1} - for _, fix := range serviceDetects { - requestPath := fix.path - requestTokens := tokenizePath(requestPath) - for _, ws := range wss { - serviceTokens := ws.pathExpr.tokens - matches, score := router.computeWebserviceScore(requestTokens, serviceTokens) - t.Logf("req=%s,toks:%v,ws=%s,toks:%v,score=%d,matches=%v", requestPath, requestTokens, ws.RootPath(), serviceTokens, score, matches) - } - best := router.detectWebService(requestTokens, wss) - if best != nil { - if fix.found { - t.Logf("best=%s", best.RootPath()) - } else { - t.Fatalf("should have found:%s", fix.root) - } - } - } -} - -var routeMatchers = []struct { - route string - path string - matches bool - paramCount int - staticCount int -}{ - // route, request-path - {"/a", "/a", true, 0, 1}, - {"/a", "/b", false, 0, 0}, - {"/a", "/b", false, 0, 0}, - {"/a/{b}/c/", "/a/2/c", true, 1, 2}, - {"/{a}/{b}/{c}/", "/a/b", false, 0, 0}, - {"/{x:*}", "/", false, 0, 0}, - {"/{x:*}", "/a", true, 1, 0}, - {"/{x:*}", "/a/b", true, 1, 0}, - {"/a/{x:*}", "/a/b", true, 1, 1}, - {"/a/{x:[A-Z][A-Z]}", "/a/ZX", true, 1, 1}, - {"/basepath/{resource:*}", "/basepath/some/other/location/test.xml", true, 1, 1}, -} - -// clear && go test -v -test.run Test_matchesRouteByPathTokens ...restful -func Test_matchesRouteByPathTokens(t *testing.T) { - router := CurlyRouter{} - for i, each := range routeMatchers { - routeToks := tokenizePath(each.route) - reqToks := tokenizePath(each.path) - matches, pCount, sCount := router.matchesRouteByPathTokens(routeToks, reqToks) - if matches != each.matches { - t.Fatalf("[%d] unexpected matches outcome route:%s, path:%s, matches:%v", i, each.route, each.path, matches) - } - if pCount != each.paramCount { - t.Fatalf("[%d] unexpected paramCount got:%d want:%d ", i, pCount, each.paramCount) - } - if sCount != each.staticCount { - t.Fatalf("[%d] unexpected staticCount got:%d want:%d ", i, sCount, each.staticCount) - } - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard1 ...restful -func TestExtractParameters_Wildcard1(t *testing.T) { - params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remainder", t) - if params["var"] != "remainder" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard2 ...restful -func TestExtractParameters_Wildcard2(t *testing.T) { - params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remain/der", t) - if params["var"] != "remain/der" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard3 ...restful -func TestExtractParameters_Wildcard3(t *testing.T) { - params := doExtractParams("/static/{var:*}", 2, "/static/test/sub/hi.html", t) - if params["var"] != "test/sub/hi.html" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestCurly_ISSUE_34 ...restful -func TestCurly_ISSUE_34(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy)) - ws1.Route(ws1.GET("/network/{id}").To(curlyDummy)) - routes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12")) - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - } -} - -// clear && go test -v -test.run TestCurly_ISSUE_34_2 ...restful -func TestCurly_ISSUE_34_2(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/network/{id}").To(curlyDummy)) - ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy)) - routes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12")) - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - } -} - -// clear && go test -v -test.run TestCurly_JsonHtml ...restful -func TestCurly_JsonHtml(t *testing.T) { - ws1 := new(WebService) - ws1.Path("/") - ws1.Route(ws1.GET("/some.html").To(curlyDummy).Consumes("*/*").Produces("text/html")) - req, _ := http.NewRequest("GET", "/some.html", nil) - req.Header.Set("Accept", "application/json") - _, route, err := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - if err == nil { - t.Error("error expected") - } - if route != nil { - t.Error("no route expected") - } -} - -// go test -v -test.run TestCurly_ISSUE_137 ...restful -func TestCurly_ISSUE_137(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(curlyDummy)) - ws1.Path("/") - req, _ := http.NewRequest("GET", "/", nil) - _, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - t.Log(route) - if route != nil { - t.Error("no route expected") - } -} - -// go test -v -test.run TestCurly_ISSUE_137_2 ...restful -func TestCurly_ISSUE_137_2(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(curlyDummy)) - ws1.Path("/") - req, _ := http.NewRequest("GET", "/hello/bob", nil) - _, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - t.Log(route) - if route != nil { - t.Errorf("no route expected, got %v", route) - } -} - -func curlyDummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "curlyDummy") } diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go deleted file mode 100644 index 0af636e55..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package restful - -import "net/http" - -func ExampleOPTIONSFilter() { - // Install the OPTIONS filter on the default Container - Filter(OPTIONSFilter()) -} -func ExampleContainer_OPTIONSFilter() { - // Install the OPTIONS filter on a Container - myContainer := new(Container) - myContainer.Filter(myContainer.OPTIONSFilter) -} - -func ExampleContainer() { - // The Default container of go-restful uses the http.DefaultServeMux. - // You can create your own Container using restful.NewContainer() and create a new http.Server for that particular container - - ws := new(WebService) - wsContainer := NewContainer() - wsContainer.Add(ws) - server := &http.Server{Addr: ":8080", Handler: wsContainer} - server.ListenAndServe() -} - -func ExampleCrossOriginResourceSharing() { - // To install this filter on the Default Container use: - cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer} - Filter(cors.Filter) -} - -func ExampleServiceError() { - resp := new(Response) - resp.WriteEntity(NewError(http.StatusBadRequest, "Non-integer {id} path parameter")) -} - -func ExampleBoundedCachedCompressors() { - // Register a compressor provider (gzip/deflate read/write) that uses - // a bounded cache with a maximum of 20 writers and 20 readers. - SetCompressorProvider(NewBoundedCachedCompressors(20, 20)) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/entity_accessors_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/entity_accessors_test.go deleted file mode 100644 index 943093ae0..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/entity_accessors_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package restful - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/http/httptest" - "reflect" - "testing" -) - -type keyvalue struct { - readCalled bool - writeCalled bool -} - -func (kv *keyvalue) Read(req *Request, v interface{}) error { - //t := reflect.TypeOf(v) - //rv := reflect.ValueOf(v) - kv.readCalled = true - return nil -} - -func (kv *keyvalue) Write(resp *Response, status int, v interface{}) error { - t := reflect.TypeOf(v) - rv := reflect.ValueOf(v) - for ix := 0; ix < t.NumField(); ix++ { - sf := t.Field(ix) - io.WriteString(resp, sf.Name) - io.WriteString(resp, "=") - io.WriteString(resp, fmt.Sprintf("%v\n", rv.Field(ix).Interface())) - } - kv.writeCalled = true - return nil -} - -// go test -v -test.run TestKeyValueEncoding ...restful -func TestKeyValueEncoding(t *testing.T) { - type Book struct { - Title string - Author string - PublishedYear int - } - kv := new(keyvalue) - RegisterEntityAccessor("application/kv", kv) - b := Book{"Singing for Dummies", "john doe", 2015} - - // Write - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{httpWriter, "application/kv,*/*;q=0.8", []string{"application/kv"}, 0, 0, true, nil} - resp.WriteEntity(b) - t.Log(string(httpWriter.Body.Bytes())) - if !kv.writeCalled { - t.Error("Write never called") - } - - // Read - bodyReader := bytes.NewReader(httpWriter.Body.Bytes()) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/kv; charset=UTF-8") - request := NewRequest(httpRequest) - var bb Book - request.ReadEntity(&bb) - if !kv.readCalled { - t.Error("Read never called") - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey deleted file mode 100644 index 8485e986e..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey deleted file mode 100644 index 8485e986e..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml deleted file mode 100644 index 362db6b07..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# -# Include your application ID here -# -application: -version: 1 -runtime: go -api_version: go1 - -handlers: -# -# Regex for all swagger files to make as static content. -# You should create the folder static/swagger and copy -# swagger-ui into it. -# -- url: /apidocs/(.*?)/(.*\.(js|html|css)) - static_files: static/swagger/\1/\2 - upload: static/swagger/(.*?)/(.*\.(js|html|css)) - -- url: /.* - script: _go_app diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey deleted file mode 100644 index 8485e986e..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml deleted file mode 100644 index 1ac9dca28..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml +++ /dev/null @@ -1,18 +0,0 @@ -application: -version: 1 -runtime: go -api_version: go1 - -handlers: -# Regex for all swagger files to make as static content. -# You should create the folder static/swagger and copy -# swagger-ui into it. -# -- url: /apidocs/(.*?)/(.*\.(js|html|css)) - static_files: static/swagger/\1/\2 - upload: static/swagger/(.*?)/(.*\.(js|html|css)) - -# Catch all. -- url: /.* - script: _go_app - login: required diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go deleted file mode 100644 index ca2908180..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go +++ /dev/null @@ -1,266 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger" - "google.golang.org/appengine" - "google.golang.org/appengine/datastore" - "google.golang.org/appengine/user" - "net/http" - "time" -) - -// This example demonstrates a reasonably complete suite of RESTful operations backed -// by DataStore on Google App Engine. - -// Our simple example struct. -type Profile struct { - LastModified time.Time `json:"-" xml:"-"` - Email string `json:"-" xml:"-"` - FirstName string `json:"first_name" xml:"first-name"` - NickName string `json:"nick_name" xml:"nick-name"` - LastName string `json:"last_name" xml:"last-name"` -} - -type ProfileApi struct { - Path string -} - -func gaeUrl() string { - if appengine.IsDevAppServer() { - return "http://localhost:8080" - } else { - // Include your URL on App Engine here. - // I found no way to get AppID without appengine.Context and this always - // based on a http.Request. - return "http://federatedservices.appspot.com" - } -} - -func init() { - u := ProfileApi{Path: "/profiles"} - u.register() - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open .appspot.com/apidocs and enter - // Place the Swagger UI files into a folder called static/swagger if you wish to use Swagger - // http://.appspot.com/apidocs.json in the api input field. - // For testing, you can use http://localhost:8080/apidocs.json - config := swagger.Config{ - // You control what services are visible - WebServices: restful.RegisteredWebServices(), - WebServicesUrl: gaeUrl(), - ApiPath: "/apidocs.json", - - // Optionally, specifiy where the UI is located - SwaggerPath: "/apidocs/", - - // GAE support static content which is configured in your app.yaml. - // This example expect the swagger-ui in static/swagger so you should place it there :) - SwaggerFilePath: "static/swagger"} - swagger.InstallSwaggerService(config) -} - -func (u ProfileApi) register() { - ws := new(restful.WebService) - - ws. - Path(u.Path). - // You can specify consumes and produces per route as well. - Consumes(restful.MIME_JSON, restful.MIME_XML). - Produces(restful.MIME_JSON, restful.MIME_XML) - - ws.Route(ws.POST("").To(u.insert). - // Swagger documentation. - Doc("insert a new profile"). - Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")). - Reads(Profile{})) - - ws.Route(ws.GET("/{profile-id}").To(u.read). - // Swagger documentation. - Doc("read a profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")). - Writes(Profile{})) - - ws.Route(ws.PUT("/{profile-id}").To(u.update). - // Swagger documentation. - Doc("update an existing profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")). - Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")). - Reads(Profile{})) - - ws.Route(ws.DELETE("/{profile-id}").To(u.remove). - // Swagger documentation. - Doc("remove a profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string"))) - - restful.Add(ws) -} - -// POST http://localhost:8080/profiles -// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"} -// -func (u *ProfileApi) insert(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Marshall the entity from the request into a struct. - p := new(Profile) - err := r.ReadEntity(&p) - if err != nil { - w.WriteError(http.StatusNotAcceptable, err) - return - } - - // Ensure we start with a sensible value for this field. - p.LastModified = time.Now() - - // The profile belongs to this user. - p.Email = user.Current(c).String() - - k, err := datastore.Put(c, datastore.NewIncompleteKey(c, "profiles", nil), p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // Let them know the location of the newly created resource. - // TODO: Use a safe Url path append function. - w.AddHeader("Location", u.Path+"/"+k.Encode()) - - // Return the resultant entity. - w.WriteHeader(http.StatusCreated) - w.WriteEntity(p) -} - -// GET http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// -func (u ProfileApi) read(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Retrieve the entity from the datastore. - p := Profile{} - if err := datastore.Get(c, k, &p); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to view it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if p.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - w.WriteEntity(p) -} - -// PUT http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"} -// -func (u *ProfileApi) update(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Marshall the entity from the request into a struct. - p := new(Profile) - err = r.ReadEntity(&p) - if err != nil { - w.WriteError(http.StatusNotAcceptable, err) - return - } - - // Retrieve the old entity from the datastore. - old := Profile{} - if err := datastore.Get(c, k, &old); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to update it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if old.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - // Since the whole entity is re-written, we need to assign any invariant fields again - // e.g. the owner of the entity. - p.Email = user.Current(c).String() - - // Keep track of the last modification date. - p.LastModified = time.Now() - - // Attempt to overwrite the old entity. - _, err = datastore.Put(c, k, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // Let them know it succeeded. - w.WriteHeader(http.StatusNoContent) -} - -// DELETE http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// -func (u *ProfileApi) remove(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Retrieve the old entity from the datastore. - old := Profile{} - if err := datastore.Get(c, k, &old); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to delete it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if old.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - // Delete the entity. - if err := datastore.Delete(c, k); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - // Success notification. - w.WriteHeader(http.StatusNoContent) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go deleted file mode 100644 index b3261eeb9..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -import ( - "github.com/mjibson/appstats" -) - - -func stats(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - c := appstats.NewContext(req.Request) - chain.ProcessFilter(req, resp) - c.Stats.Status = resp.StatusCode() - c.Save() -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go deleted file mode 100644 index 3f38fd6b2..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go +++ /dev/null @@ -1,161 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger" - "google.golang.org/appengine" - "google.golang.org/appengine/memcache" - "net/http" -) - -// This example is functionally the same as ../restful-user-service.go -// but it`s supposed to run on Goole App Engine (GAE) -// -// contributed by ivanhawkes - -type User struct { - Id, Name string -} - -type UserService struct { - // normally one would use DAO (data access object) - // but in this example we simple use memcache. -} - -func (u UserService) Register() { - ws := new(restful.WebService) - - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/{user-id}").To(u.findUser). - // docs - Doc("get a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Writes(User{})) // on the response - - ws.Route(ws.PATCH("").To(u.updateUser). - // docs - Doc("update a user"). - Reads(User{})) // from the request - - ws.Route(ws.PUT("/{user-id}").To(u.createUser). - // docs - Doc("create a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Reads(User{})) // from the request - - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser). - // docs - Doc("delete a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string"))) - - restful.Add(ws) -} - -// GET http://localhost:8080/users/1 -// -func (u UserService) findUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - id := request.PathParameter("user-id") - usr := new(User) - _, err := memcache.Gob.Get(c, id, &usr) - if err != nil || len(usr.Id) == 0 { - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// PATCH http://localhost:8080/users -// 1Melissa Raspberry -// -func (u *UserService) updateUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - item := &memcache.Item{ - Key: usr.Id, - Object: &usr, - } - err = memcache.Gob.Set(c, item) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserService) createUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - item := &memcache.Item{ - Key: usr.Id, - Object: &usr, - } - err = memcache.Gob.Add(c, item) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteHeader(http.StatusCreated) - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserService) removeUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - id := request.PathParameter("user-id") - err := memcache.Delete(c, id) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - } -} - -func getGaeURL() string { - if appengine.IsDevAppServer() { - return "http://localhost:8080" - } else { - /** - * Include your URL on App Engine here. - * I found no way to get AppID without appengine.Context and this always - * based on a http.Request. - */ - return "http://.appspot.com" - } -} - -func init() { - u := UserService{} - u.Register() - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open .appspot.com/apidocs and enter http://.appspot.com/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: restful.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: getGaeURL(), - ApiPath: "/apidocs.json", - - // Optionally, specifiy where the UI is located - SwaggerPath: "/apidocs/", - // GAE support static content which is configured in your app.yaml. - // This example expect the swagger-ui in static/swagger so you should place it there :) - SwaggerFilePath: "static/swagger"} - swagger.InstallSwaggerService(config) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html deleted file mode 100644 index e5d49b42c..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - -

{{.Text}}

- - \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go deleted file mode 100644 index 6419d2538..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "io" - "log" - "net/http" - - "github.com/emicklei/go-restful" -) - -// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page -// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from. -// -// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing -// http://enable-cors.org/server.html -// -// GET http://localhost:8080/users -// -// GET http://localhost:8080/users/1 -// -// PUT http://localhost:8080/users/1 -// -// DELETE http://localhost:8080/users/1 -// -// OPTIONS http://localhost:8080/users/1 with Header "Origin" set to some domain and - -type UserResource struct{} - -func (u UserResource) RegisterTo(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes("*/*"). - Produces("*/*") - - ws.Route(ws.GET("/{user-id}").To(u.nop)) - ws.Route(ws.POST("").To(u.nop)) - ws.Route(ws.PUT("/{user-id}").To(u.nop)) - ws.Route(ws.DELETE("/{user-id}").To(u.nop)) - - container.Add(ws) -} - -func (u UserResource) nop(request *restful.Request, response *restful.Response) { - io.WriteString(response.ResponseWriter, "this would be a normal response") -} - -func main() { - wsContainer := restful.NewContainer() - u := UserResource{} - u.RegisterTo(wsContainer) - - // Add container filter to enable CORS - cors := restful.CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-My-Header"}, - AllowedHeaders: []string{"Content-Type", "Accept"}, - AllowedMethods: []string{"GET", "POST"}, - CookiesAllowed: false, - Container: wsContainer} - wsContainer.Filter(cors.Filter) - - // Add container filter to respond to OPTIONS - wsContainer.Filter(wsContainer.OPTIONSFilter) - - log.Printf("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go deleted file mode 100644 index 0cda50d34..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" - "os" - "strings" - "time" -) - -// This example shows how to create a filter that produces log lines -// according to the Common Log Format, also known as the NCSA standard. -// -// kindly contributed by leehambley -// -// GET http://localhost:8080/ping - -var logger *log.Logger = log.New(os.Stdout, "", 0) - -func NCSACommonLogFormatLogger() restful.FilterFunction { - return func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - var username = "-" - if req.Request.URL.User != nil { - if name := req.Request.URL.User.Username(); name != "" { - username = name - } - } - chain.ProcessFilter(req, resp) - logger.Printf("%s - %s [%s] \"%s %s %s\" %d %d", - strings.Split(req.Request.RemoteAddr, ":")[0], - username, - time.Now().Format("02/Jan/2006:15:04:05 -0700"), - req.Request.Method, - req.Request.URL.RequestURI(), - req.Request.Proto, - resp.StatusCode(), - resp.ContentLength(), - ) - } -} - -func main() { - ws := new(restful.WebService) - ws.Filter(NCSACommonLogFormatLogger()) - ws.Route(ws.GET("/ping").To(hello)) - restful.Add(ws) - http.ListenAndServe(":8080", nil) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "pong") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go deleted file mode 100644 index 5dd3067e9..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "net/http" -) - -// This example shows how to create a (Route) Filter that performs Basic Authentication on the Http request. -// -// GET http://localhost:8080/secret -// and use admin,admin for the credentials - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/secret").Filter(basicAuthenticate).To(secret)) - restful.Add(ws) - http.ListenAndServe(":8080", nil) -} - -func basicAuthenticate(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - encoded := req.Request.Header.Get("Authorization") - // usr/pwd = admin/admin - // real code does some decoding - if len(encoded) == 0 || "Basic YWRtaW46YWRtaW4=" != encoded { - resp.AddHeader("WWW-Authenticate", "Basic realm=Protected Area") - resp.WriteErrorString(401, "401: Not Authorized") - return - } - chain.ProcessFilter(req, resp) -} - -func secret(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "42") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go deleted file mode 100644 index 9148213cf..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "os" - "runtime/pprof" -) - -// ProfilingService is a WebService that can start/stop a CPU profile and write results to a file -// GET /{rootPath}/start will activate CPU profiling -// GET /{rootPath}/stop will stop profiling -// -// NewProfileService("/profiler", "ace.prof").AddWebServiceTo(restful.DefaultContainer) -// -type ProfilingService struct { - rootPath string // the base (root) of the service, e.g. /profiler - cpuprofile string // the output filename to write profile results, e.g. myservice.prof - cpufile *os.File // if not nil, then profiling is active -} - -func NewProfileService(rootPath string, outputFilename string) *ProfilingService { - ps := new(ProfilingService) - ps.rootPath = rootPath - ps.cpuprofile = outputFilename - return ps -} - -// Add this ProfileService to a restful Container -func (p ProfilingService) AddWebServiceTo(container *restful.Container) { - ws := new(restful.WebService) - ws.Path(p.rootPath).Consumes("*/*").Produces(restful.MIME_JSON) - ws.Route(ws.GET("/start").To(p.startProfiler)) - ws.Route(ws.GET("/stop").To(p.stopProfiler)) - container.Add(ws) -} - -func (p *ProfilingService) startProfiler(req *restful.Request, resp *restful.Response) { - if p.cpufile != nil { - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling already running") - return // error? - } - cpufile, err := os.Create(p.cpuprofile) - if err != nil { - log.Fatal(err) - } - // remember for close - p.cpufile = cpufile - pprof.StartCPUProfile(cpufile) - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling started, writing on:"+p.cpuprofile) -} - -func (p *ProfilingService) stopProfiler(req *restful.Request, resp *restful.Response) { - if p.cpufile == nil { - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling not active") - return // error? - } - pprof.StopCPUProfile() - p.cpufile.Close() - p.cpufile = nil - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling stopped, closing:"+p.cpuprofile) -} - -func main() {} // exists for example compilation only diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go deleted file mode 100644 index 1b95dd02b..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go +++ /dev/null @@ -1,107 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" -) - -// This example has the same service definition as restful-user-resource -// but uses a different router (CurlyRouter) that does not use regular expressions -// -// POST http://localhost:8080/users -// 1Melissa Raspberry -// -// GET http://localhost:8080/users/1 -// -// PUT http://localhost:8080/users/1 -// 1Melissa -// -// DELETE http://localhost:8080/users/1 -// - -type User struct { - Id, Name string -} - -type UserResource struct { - // normally one would use DAO (data access object) - users map[string]User -} - -func (u UserResource) Register(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/{user-id}").To(u.findUser)) - ws.Route(ws.POST("").To(u.updateUser)) - ws.Route(ws.PUT("/{user-id}").To(u.createUser)) - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser)) - - container.Add(ws) -} - -// GET http://localhost:8080/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// POST http://localhost:8080/users -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = *usr - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = usr - response.WriteHeader(http.StatusCreated) - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func main() { - wsContainer := restful.NewContainer() - wsContainer.Router(restful.CurlyRouter{}) - u := UserResource{map[string]User{}} - u.Register(wsContainer) - - log.Printf("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router_test.go deleted file mode 100644 index 9609eb31d..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package examples - -import ( - "bytes" - "fmt" - "log" - "net/http" - "testing" - "time" - - "github.com/emicklei/go-restful" -) - -type User struct { - Id, Name string -} - -type UserResource struct { - users map[string]User -} - -func (u UserResource) Register(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - ws.Route(ws.GET("/{user-id}").To(u.findUser)) - ws.Route(ws.POST("").To(u.updateUser)) - ws.Route(ws.PUT("/{user-id}").To(u.createUser)) - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser)) - - container.Add(ws) -} - -// GET http://localhost:8090/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// POST http://localhost:8090/users -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = *usr - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// PUT http://localhost:8090/users/1 -// 1Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = usr - response.WriteHeader(http.StatusCreated) - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// DELETE http://localhost:8090/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func RunRestfulCurlyRouterServer() { - wsContainer := restful.NewContainer() - wsContainer.Router(restful.CurlyRouter{}) - u := UserResource{map[string]User{}} - u.Register(wsContainer) - - log.Printf("start listening on localhost:8090") - server := &http.Server{Addr: ":8090", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} - -func waitForServerUp(serverURL string) error { - for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(5 * time.Second) { - _, err := http.Get(serverURL + "/") - if err == nil { - return nil - } - } - return fmt.Errorf("waiting for server timed out") -} - -func TestServer(t *testing.T) { - serverURL := "http://localhost:8090" - go func() { - RunRestfulCurlyRouterServer() - }() - if err := waitForServerUp(serverURL); err != nil { - t.Errorf("%v", err) - } - - // GET should give a 405 - resp, err := http.Get(serverURL + "/users/") - if err != nil { - t.Errorf("unexpected error in GET /users/: %v", err) - } - if resp.StatusCode != http.StatusMethodNotAllowed { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } - - // Send a POST request. - var jsonStr = []byte(`{"id":"1","name":"user1"}`) - req, err := http.NewRequest("POST", serverURL+"/users/", bytes.NewBuffer(jsonStr)) - req.Header.Set("Content-Type", restful.MIME_JSON) - - client := &http.Client{} - resp, err = client.Do(req) - if err != nil { - t.Errorf("unexpected error in sending req: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } - - // Test that GET works. - resp, err = http.Get(serverURL + "/users/1") - if err != nil { - t.Errorf("unexpected error in GET /users/1: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go deleted file mode 100644 index 6094c4909..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" -) - -type User struct { - Id, Name string -} - -type UserList struct { - Users []User -} - -// -// This example shows how to use the CompressingResponseWriter by a Filter -// such that encoding can be enabled per WebService or per Route (instead of per container) -// Using restful.DefaultContainer.EnableContentEncoding(true) will encode all responses served by WebServices in the DefaultContainer. -// -// Set Accept-Encoding to gzip or deflate -// GET http://localhost:8080/users/42 -// and look at the response headers - -func main() { - restful.Add(NewUserService()) - log.Printf("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func NewUserService() *restful.WebService { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - // install a response encoding filter - ws.Route(ws.GET("/{user-id}").Filter(encodingFilter).To(findUser)) - return ws -} - -// Route Filter (defines FilterFunction) -func encodingFilter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[encoding-filter] %s,%s\n", req.Request.Method, req.Request.URL) - // wrap responseWriter into a compressing one - compress, _ := restful.NewCompressingResponseWriter(resp.ResponseWriter, restful.ENCODING_GZIP) - resp.ResponseWriter = compress - defer func() { - compress.Close() - }() - chain.ProcessFilter(req, resp) -} - -// GET http://localhost:8080/users/42 -// -func findUser(request *restful.Request, response *restful.Response) { - log.Printf("findUser") - response.WriteEntity(User{"42", "Gandalf"}) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go deleted file mode 100644 index 47e1146a0..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go +++ /dev/null @@ -1,114 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" - "time" -) - -type User struct { - Id, Name string -} - -type UserList struct { - Users []User -} - -// This example show how to create and use the three different Filters (Container,WebService and Route) -// When applied to the restful.DefaultContainer, we refer to them as a global filter. -// -// GET http://locahost:8080/users/42 -// and see the logging per filter (try repeating this request) - -func main() { - // install a global (=DefaultContainer) filter (processed before any webservice in the DefaultContainer) - restful.Filter(globalLogging) - - restful.Add(NewUserService()) - log.Printf("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func NewUserService() *restful.WebService { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - // install a webservice filter (processed before any route) - ws.Filter(webserviceLogging).Filter(measureTime) - - // install a counter filter - ws.Route(ws.GET("").Filter(NewCountFilter().routeCounter).To(getAllUsers)) - - // install 2 chained route filters (processed before calling findUser) - ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser)) - return ws -} - -// Global Filter -func globalLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[global-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// WebService Filter -func webserviceLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[webservice-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// WebService (post-process) Filter (as a struct that defines a FilterFunction) -func measureTime(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - now := time.Now() - chain.ProcessFilter(req, resp) - log.Printf("[webservice-filter (timer)] %v\n", time.Now().Sub(now)) -} - -// Route Filter (defines FilterFunction) -func routeLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[route-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// Route Filter (as a struct that defines a FilterFunction) -// CountFilter implements a FilterFunction for counting requests. -type CountFilter struct { - count int - counter chan int // for go-routine safe count increments -} - -// NewCountFilter creates and initializes a new CountFilter. -func NewCountFilter() *CountFilter { - c := new(CountFilter) - c.counter = make(chan int) - go func() { - for { - c.count += <-c.counter - } - }() - return c -} - -// routeCounter increments the count of the filter (through a channel) -func (c *CountFilter) routeCounter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - c.counter <- 1 - log.Printf("[route-filter (counter)] count:%d", c.count) - chain.ProcessFilter(req, resp) -} - -// GET http://localhost:8080/users -// -func getAllUsers(request *restful.Request, response *restful.Response) { - log.Printf("getAllUsers") - response.WriteEntity(UserList{[]User{User{"42", "Gandalf"}, User{"3.14", "Pi"}}}) -} - -// GET http://localhost:8080/users/42 -// -func findUser(request *restful.Request, response *restful.Response) { - log.Printf("findUser") - response.WriteEntity(User{"42", "Gandalf"}) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go deleted file mode 100644 index a83db4492..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "fmt" - "github.com/emicklei/go-restful" - "github.com/gorilla/schema" - "io" - "net/http" -) - -// This example shows how to handle a POST of a HTML form that uses the standard x-www-form-urlencoded content-type. -// It uses the gorilla web tool kit schema package to decode the form data into a struct. -// -// GET http://localhost:8080/profiles -// - -type Profile struct { - Name string - Age int -} - -var decoder *schema.Decoder - -func main() { - decoder = schema.NewDecoder() - ws := new(restful.WebService) - ws.Route(ws.POST("/profiles").Consumes("application/x-www-form-urlencoded").To(postAdddress)) - ws.Route(ws.GET("/profiles").To(addresssForm)) - restful.Add(ws) - http.ListenAndServe(":8080", nil) -} - -func postAdddress(req *restful.Request, resp *restful.Response) { - err := req.Request.ParseForm() - if err != nil { - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - p := new(Profile) - err = decoder.Decode(p, req.Request.PostForm) - if err != nil { - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - io.WriteString(resp.ResponseWriter, fmt.Sprintf("Name=%s, Age=%d", p.Name, p.Age)) -} - -func addresssForm(req *restful.Request, resp *restful.Response) { - io.WriteString(resp.ResponseWriter, - ` - -

Enter Profile

-
- - - - - -
- - `) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go deleted file mode 100644 index a21c2a69c..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "net/http" -) - -// This example shows the minimal code needed to get a restful.WebService working. -// -// GET http://localhost:8080/hello - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - http.ListenAndServe(":8080", nil) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "world") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go deleted file mode 100644 index de51c5919..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "log" - "net/http" - "text/template" - - "github.com/emicklei/go-restful" -) - -// This example shows how to serve a HTML page using the standard Go template engine. -// -// GET http://localhost:8080/ - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/").To(home)) - restful.Add(ws) - print("open browser on http://localhost:8080/\n") - http.ListenAndServe(":8080", nil) -} - -type Message struct { - Text string -} - -func home(req *restful.Request, resp *restful.Response) { - p := &Message{"restful-html-template demo"} - // you might want to cache compiled templates - t, err := template.ParseFiles("home.html") - if err != nil { - log.Fatalf("Template gave: %s", err) - } - t.Execute(resp.ResponseWriter, p) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go deleted file mode 100644 index 3f1650b36..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to have a program with 2 WebServices containers -// each having a http server listening on its own port. -// -// The first "hello" is added to the restful.DefaultContainer (and uses DefaultServeMux) -// For the second "hello", a new container and ServeMux is created -// and requires a new http.Server with the container being the Handler. -// This first server is spawn in its own go-routine such that the program proceeds to create the second. -// -// GET http://localhost:8080/hello -// GET http://localhost:8081/hello - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - go func() { - http.ListenAndServe(":8080", nil) - }() - - container2 := restful.NewContainer() - ws2 := new(restful.WebService) - ws2.Route(ws2.GET("/hello").To(hello2)) - container2.Add(ws2) - server := &http.Server{Addr: ":8081", Handler: container2} - log.Fatal(server.ListenAndServe()) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "default world") -} - -func hello2(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "second world") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go deleted file mode 100644 index 04fae8dce..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "io" - "net/http" - - "github.com/emicklei/go-restful" -) - -func NoBrowserCacheFilter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - resp.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1. - resp.Header().Set("Pragma", "no-cache") // HTTP 1.0. - resp.Header().Set("Expires", "0") // Proxies. - chain.ProcessFilter(req, resp) -} - -// This example shows how to use a WebService filter that passed the Http headers to disable browser cacheing. -// -// GET http://localhost:8080/hello - -func main() { - ws := new(restful.WebService) - ws.Filter(NoBrowserCacheFilter) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - http.ListenAndServe(":8080", nil) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "world") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go deleted file mode 100644 index 73dc3cfe5..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to use the OPTIONSFilter on a Container -// -// OPTIONS http://localhost:8080/users -// -// OPTIONS http://localhost:8080/users/1 - -type UserResource struct{} - -func (u UserResource) RegisterTo(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes("*/*"). - Produces("*/*") - - ws.Route(ws.GET("/{user-id}").To(u.nop)) - ws.Route(ws.POST("").To(u.nop)) - ws.Route(ws.PUT("/{user-id}").To(u.nop)) - ws.Route(ws.DELETE("/{user-id}").To(u.nop)) - - container.Add(ws) -} - -func (u UserResource) nop(request *restful.Request, response *restful.Response) { - io.WriteString(response.ResponseWriter, "this would be a normal response") -} - -func main() { - wsContainer := restful.NewContainer() - u := UserResource{} - u.RegisterTo(wsContainer) - - // Add container filter to respond to OPTIONS - wsContainer.Filter(wsContainer.OPTIONSFilter) - - // For use on the default container, you can write - // restful.Filter(restful.OPTIONSFilter()) - - log.Printf("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go deleted file mode 100644 index 8488a232c..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "io" - "net/http" - . "github.com/emicklei/go-restful" -) - -// This example shows how to a Route that matches the "tail" of a path. -// Requires the use of a CurlyRouter and the star "*" path parameter pattern. -// -// GET http://localhost:8080/basepath/some/other/location/test.xml - -func main() { - DefaultContainer.Router(CurlyRouter{}) - ws := new(WebService) - ws.Route(ws.GET("/basepath/{resource:*}").To(staticFromPathParam)) - Add(ws) - - println("[go-restful] serve path tails from http://localhost:8080/basepath") - http.ListenAndServe(":8080", nil) -} - -func staticFromPathParam(req *Request, resp *Response) { - io.WriteString(resp, "Tail="+req.PathParameter("resource")) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go deleted file mode 100644 index 0b55f1493..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how the different types of filters are called in the request-response flow. -// The call chain is logged on the console when sending an http request. -// -// GET http://localhost:8080/1 -// GET http://localhost:8080/2 - -var indentLevel int - -func container_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("url path:%v\n", req.Request.URL) - trace("container_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("container_filter_A: after", -1) -} - -func container_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("container_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("container_filter_B: after", -1) -} - -func service_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("service_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("service_filter_A: after", -1) -} - -func service_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("service_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("service_filter_B: after", -1) -} - -func route_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("route_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("route_filter_A: after", -1) -} - -func route_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("route_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("route_filter_B: after", -1) -} - -func trace(what string, delta int) { - indented := what - if delta < 0 { - indentLevel += delta - } - for t := 0; t < indentLevel; t++ { - indented = "." + indented - } - log.Printf("%s", indented) - if delta > 0 { - indentLevel += delta - } -} - -func main() { - restful.Filter(container_filter_A) - restful.Filter(container_filter_B) - - ws1 := new(restful.WebService) - ws1.Path("/1") - ws1.Filter(service_filter_A) - ws1.Filter(service_filter_B) - ws1.Route(ws1.GET("").To(doit1).Filter(route_filter_A).Filter(route_filter_B)) - - ws2 := new(restful.WebService) - ws2.Path("/2") - ws2.Filter(service_filter_A) - ws2.Filter(service_filter_B) - ws2.Route(ws2.GET("").To(doit2).Filter(route_filter_A).Filter(route_filter_B)) - - restful.Add(ws1) - restful.Add(ws2) - - log.Print("go-restful example listing on http://localhost:8080/1 and http://localhost:8080/2") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func doit1(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "nothing to see in 1") -} - -func doit2(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "nothing to see in 2") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go deleted file mode 100644 index fb1012a02..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" -) - -// This example shows how to use methods as RouteFunctions for WebServices. -// The ProductResource has a Register() method that creates and initializes -// a WebService to expose its methods as REST operations. -// The WebService is added to the restful.DefaultContainer. -// A ProductResource is typically created using some data access object. -// -// GET http://localhost:8080/products/1 -// POST http://localhost:8080/products -// 1The First - -type Product struct { - Id, Title string -} - -type ProductResource struct { - // typically reference a DAO (data-access-object) -} - -func (p ProductResource) getOne(req *restful.Request, resp *restful.Response) { - id := req.PathParameter("id") - log.Println("getting product with id:" + id) - resp.WriteEntity(Product{Id: id, Title: "test"}) -} - -func (p ProductResource) postOne(req *restful.Request, resp *restful.Response) { - updatedProduct := new(Product) - err := req.ReadEntity(updatedProduct) - if err != nil { // bad request - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - log.Println("updating product with id:" + updatedProduct.Id) -} - -func (p ProductResource) Register() { - ws := new(restful.WebService) - ws.Path("/products") - ws.Consumes(restful.MIME_XML) - ws.Produces(restful.MIME_XML) - - ws.Route(ws.GET("/{id}").To(p.getOne). - Doc("get the product by its id"). - Param(ws.PathParameter("id", "identifier of the product").DataType("string"))) - - ws.Route(ws.POST("").To(p.postOne). - Doc("update or create a product"). - Param(ws.BodyParameter("Product", "a Product (XML)").DataType("main.Product"))) - - restful.Add(ws) -} - -func main() { - ProductResource{}.Register() - http.ListenAndServe(":8080", nil) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go deleted file mode 100644 index 20c366bf9..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/emicklei/go-restful" -) - -var ( - Result string -) - -func TestRouteExtractParameter(t *testing.T) { - // setup service - ws := new(restful.WebService) - ws.Consumes(restful.MIME_XML) - ws.Route(ws.GET("/test/{param}").To(DummyHandler)) - restful.Add(ws) - - // setup request + writer - bodyReader := strings.NewReader("42") - httpRequest, _ := http.NewRequest("GET", "/test/THIS", bodyReader) - httpRequest.Header.Set("Content-Type", restful.MIME_XML) - httpWriter := httptest.NewRecorder() - - // run - restful.DefaultContainer.ServeHTTP(httpWriter, httpRequest) - - if Result != "THIS" { - t.Fatalf("Result is actually: %s", Result) - } -} - -func DummyHandler(rq *restful.Request, rp *restful.Response) { - Result = rq.PathParameter("param") -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go deleted file mode 100644 index 957c05550..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/emicklei/go-restful" -) - -// This example show how to test one particular RouteFunction (getIt) -// It uses the httptest.ResponseRecorder to capture output - -func getIt(req *restful.Request, resp *restful.Response) { - resp.WriteHeader(204) -} - -func TestCallFunction(t *testing.T) { - httpReq, _ := http.NewRequest("GET", "/", nil) - req := restful.NewRequest(httpReq) - - recorder := new(httptest.ResponseRecorder) - resp := restful.NewResponse(recorder) - - getIt(req, resp) - if recorder.Code != 204 { - t.Fatalf("Missing or wrong status code:%d", recorder.Code) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go deleted file mode 100644 index 8cb7848c1..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "path" - - "github.com/emicklei/go-restful" -) - -// This example shows how to define methods that serve static files -// It uses the standard http.ServeFile method -// -// GET http://localhost:8080/static/test.xml -// GET http://localhost:8080/static/ -// -// GET http://localhost:8080/static?resource=subdir/test.xml - -var rootdir = "/tmp" - -func main() { - restful.DefaultContainer.Router(restful.CurlyRouter{}) - - ws := new(restful.WebService) - ws.Route(ws.GET("/static/{subpath:*}").To(staticFromPathParam)) - ws.Route(ws.GET("/static").To(staticFromQueryParam)) - restful.Add(ws) - - println("[go-restful] serving files on http://localhost:8080/static from local /tmp") - http.ListenAndServe(":8080", nil) -} - -func staticFromPathParam(req *restful.Request, resp *restful.Response) { - actual := path.Join(rootdir, req.PathParameter("subpath")) - fmt.Printf("serving %s ... (from %s)\n", actual, req.PathParameter("subpath")) - http.ServeFile( - resp.ResponseWriter, - req.Request, - actual) -} - -func staticFromQueryParam(req *restful.Request, resp *restful.Response) { - http.ServeFile( - resp.ResponseWriter, - req.Request, - path.Join(rootdir, req.QueryParameter("resource"))) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-swagger.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-swagger.go deleted file mode 100644 index 7746b5b07..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-swagger.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger" -) - -type Book struct { - Title string - Author string -} - -func main() { - ws := new(restful.WebService) - ws.Path("/books") - ws.Consumes(restful.MIME_JSON, restful.MIME_XML) - ws.Produces(restful.MIME_JSON, restful.MIME_XML) - restful.Add(ws) - - ws.Route(ws.GET("/{medium}").To(noop). - Doc("Search all books"). - Param(ws.PathParameter("medium", "digital or paperback").DataType("string")). - Param(ws.QueryParameter("language", "en,nl,de").DataType("string")). - Param(ws.HeaderParameter("If-Modified-Since", "last known timestamp").DataType("datetime")). - Do(returns200, returns500)) - - ws.Route(ws.PUT("/{medium}").To(noop). - Doc("Add a new book"). - Param(ws.PathParameter("medium", "digital or paperback").DataType("string")). - Reads(Book{})) - - // You can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: restful.DefaultContainer.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: "http://localhost:8080", - ApiPath: "/apidocs.json", - - // Optionally, specifiy where the UI is located - SwaggerPath: "/apidocs/", - SwaggerFilePath: "/Users/emicklei/xProjects/swagger-ui/dist"} - swagger.RegisterSwaggerService(config, restful.DefaultContainer) - - log.Printf("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: restful.DefaultContainer} - log.Fatal(server.ListenAndServe()) -} - -func noop(req *restful.Request, resp *restful.Response) {} - -func returns200(b *restful.RouteBuilder) { - b.Returns(http.StatusOK, "OK", Book{}) -} - -func returns500(b *restful.RouteBuilder) { - b.Returns(http.StatusInternalServerError, "Bummer, something went wrong", nil) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go deleted file mode 100644 index 6b860dc20..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go +++ /dev/null @@ -1,152 +0,0 @@ -package main - -import ( - "log" - "net/http" - "strconv" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger" -) - -// This example show a complete (GET,PUT,POST,DELETE) conventional example of -// a REST Resource including documentation to be served by e.g. a Swagger UI -// It is recommended to create a Resource struct (UserResource) that can encapsulate -// an object that provide domain access (a DAO) -// It has a Register method including the complete Route mapping to methods together -// with all the appropriate documentation -// -// POST http://localhost:8080/users -// 1Melissa Raspberry -// -// GET http://localhost:8080/users/1 -// -// PUT http://localhost:8080/users/1 -// 1Melissa -// -// DELETE http://localhost:8080/users/1 -// - -type User struct { - Id, Name string -} - -type UserResource struct { - // normally one would use DAO (data access object) - users map[string]User -} - -func (u UserResource) Register(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Doc("Manage Users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/{user-id}").To(u.findUser). - // docs - Doc("get a user"). - Operation("findUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Writes(User{})) // on the response - - ws.Route(ws.PUT("/{user-id}").To(u.updateUser). - // docs - Doc("update a user"). - Operation("updateUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - ReturnsError(409, "duplicate user-id", nil). - Reads(User{})) // from the request - - ws.Route(ws.POST("").To(u.createUser). - // docs - Doc("create a user"). - Operation("createUser"). - Reads(User{})) // from the request - - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser). - // docs - Doc("delete a user"). - Operation("removeUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string"))) - - container.Add(ws) -} - -// GET http://localhost:8080/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusNotFound, "404: User could not be found.") - return - } - response.WriteEntity(usr) -} - -// POST http://localhost:8080/users -// Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(usr) - if err != nil { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - return - } - usr.Id = strconv.Itoa(len(u.users) + 1) // simple id generation - u.users[usr.Id] = *usr - response.WriteHeaderAndEntity(http.StatusCreated, usr) -} - -// PUT http://localhost:8080/users/1 -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err != nil { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - return - } - u.users[usr.Id] = *usr - response.WriteEntity(usr) -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func main() { - // to see what happens in the package, uncomment the following - //restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile)) - - wsContainer := restful.NewContainer() - u := UserResource{map[string]User{}} - u.Register(wsContainer) - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: wsContainer.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: "http://localhost:8080", - ApiPath: "/apidocs.json", - - // Optionally, specifiy where the UI is located - SwaggerPath: "/apidocs/", - SwaggerFilePath: "/Users/emicklei/xProjects/swagger-ui/dist"} - swagger.RegisterSwaggerService(config, wsContainer) - - log.Printf("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go deleted file mode 100644 index 77c678ce4..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go +++ /dev/null @@ -1,137 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger" -) - -// This example is functionally the same as the example in restful-user-resource.go -// with the only difference that is served using the restful.DefaultContainer - -type User struct { - Id, Name string -} - -type UserService struct { - // normally one would use DAO (data access object) - users map[string]User -} - -func (u UserService) Register() { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/").To(u.findAllUsers). - // docs - Doc("get all users"). - Operation("findAllUsers"). - Returns(200, "OK", []User{})) - - ws.Route(ws.GET("/{user-id}").To(u.findUser). - // docs - Doc("get a user"). - Operation("findUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Writes(User{})) // on the response - - ws.Route(ws.PUT("/{user-id}").To(u.updateUser). - // docs - Doc("update a user"). - Operation("updateUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Reads(User{})) // from the request - - ws.Route(ws.PUT("").To(u.createUser). - // docs - Doc("create a user"). - Operation("createUser"). - Reads(User{})) // from the request - - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser). - // docs - Doc("delete a user"). - Operation("removeUser"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string"))) - - restful.Add(ws) -} - -// GET http://localhost:8080/users -// -func (u UserService) findAllUsers(request *restful.Request, response *restful.Response) { - response.WriteEntity(u.users) -} - -// GET http://localhost:8080/users/1 -// -func (u UserService) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa Raspberry -// -func (u *UserService) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = *usr - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserService) createUser(request *restful.Request, response *restful.Response) { - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = usr - response.WriteHeaderAndEntity(http.StatusCreated, usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserService) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func main() { - u := UserService{map[string]User{}} - u.Register() - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: restful.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: "http://localhost:8080", - ApiPath: "/apidocs.json", - - // Optionally, specifiy where the UI is located - SwaggerPath: "/apidocs/", - SwaggerFilePath: "/Users/emicklei/Projects/swagger-ui/dist"} - swagger.InstallSwaggerService(config) - - log.Printf("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go deleted file mode 100644 index fadfb570f..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go +++ /dev/null @@ -1,141 +0,0 @@ -package restful - -import ( - "io" - "net/http" - "net/http/httptest" - "testing" -) - -func setupServices(addGlobalFilter bool, addServiceFilter bool, addRouteFilter bool) { - if addGlobalFilter { - Filter(globalFilter) - } - Add(newTestService(addServiceFilter, addRouteFilter)) -} - -func tearDown() { - DefaultContainer.webServices = []*WebService{} - DefaultContainer.isRegisteredOnRoot = true // this allows for setupServices multiple times - DefaultContainer.containerFilters = []FilterFunction{} -} - -func newTestService(addServiceFilter bool, addRouteFilter bool) *WebService { - ws := new(WebService).Path("") - if addServiceFilter { - ws.Filter(serviceFilter) - } - rb := ws.GET("/foo").To(foo) - if addRouteFilter { - rb.Filter(routeFilter) - } - ws.Route(rb) - ws.Route(ws.GET("/bar").To(bar)) - return ws -} - -func foo(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "foo") -} - -func bar(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "bar") -} - -func fail(req *Request, resp *Response) { - http.Error(resp.ResponseWriter, "something failed", http.StatusInternalServerError) -} - -func globalFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "global-") - chain.ProcessFilter(req, resp) -} - -func serviceFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "service-") - chain.ProcessFilter(req, resp) -} - -func routeFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "route-") - chain.ProcessFilter(req, resp) -} - -func TestNoFilter(t *testing.T) { - tearDown() - setupServices(false, false, false) - actual := sendIt("http://example.com/foo") - if "foo" != actual { - t.Fatal("expected: foo but got:" + actual) - } -} - -func TestGlobalFilter(t *testing.T) { - tearDown() - setupServices(true, false, false) - actual := sendIt("http://example.com/foo") - if "global-foo" != actual { - t.Fatal("expected: global-foo but got:" + actual) - } -} - -func TestWebServiceFilter(t *testing.T) { - tearDown() - setupServices(true, true, false) - actual := sendIt("http://example.com/foo") - if "global-service-foo" != actual { - t.Fatal("expected: global-service-foo but got:" + actual) - } -} - -func TestRouteFilter(t *testing.T) { - tearDown() - setupServices(true, true, true) - actual := sendIt("http://example.com/foo") - if "global-service-route-foo" != actual { - t.Fatal("expected: global-service-route-foo but got:" + actual) - } -} - -func TestRouteFilterOnly(t *testing.T) { - tearDown() - setupServices(false, false, true) - actual := sendIt("http://example.com/foo") - if "route-foo" != actual { - t.Fatal("expected: route-foo but got:" + actual) - } -} - -func TestBar(t *testing.T) { - tearDown() - setupServices(false, true, false) - actual := sendIt("http://example.com/bar") - if "service-bar" != actual { - t.Fatal("expected: service-bar but got:" + actual) - } -} - -func TestAllFiltersBar(t *testing.T) { - tearDown() - setupServices(true, true, true) - actual := sendIt("http://example.com/bar") - if "global-service-bar" != actual { - t.Fatal("expected: global-service-bar but got:" + actual) - } -} - -func sendIt(address string) string { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - return httpWriter.Body.String() -} - -func sendItTo(address string, container *Container) string { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - container.dispatch(httpWriter, httpRequest) - return httpWriter.Body.String() -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go deleted file mode 100644 index 3e79a6def..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go +++ /dev/null @@ -1,212 +0,0 @@ -package restful - -import ( - "io" - "sort" - "testing" -) - -// -// Step 1 tests -// -var paths = []struct { - // url with path (1) is handled by service with root (2) and last capturing group has value final (3) - path, root, final string -}{ - {"/", "/", "/"}, - {"/p", "/p", ""}, - {"/p/x", "/p/{q}", ""}, - {"/q/x", "/q", "/x"}, - {"/p/x/", "/p/{q}", "/"}, - {"/p/x/y", "/p/{q}", "/y"}, - {"/q/x/y", "/q", "/x/y"}, - {"/z/q", "/{p}/q", ""}, - {"/a/b/c/q", "/", "/a/b/c/q"}, -} - -func TestDetectDispatcher(t *testing.T) { - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws6 := new(WebService).Path("/p/{q}/") - ws7 := new(WebService).Path("/{p}/q") - var dispatchers = []*WebService{ws1, ws2, ws3, ws4, ws5, ws6, ws7} - - wc := NewContainer() - for _, each := range dispatchers { - wc.Add(each) - } - - router := RouterJSR311{} - - ok := true - for i, fixture := range paths { - who, final, err := router.detectDispatcher(fixture.path, dispatchers) - if err != nil { - t.Logf("error in detection:%v", err) - ok = false - } - if who.RootPath() != fixture.root { - t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath()) - ok = false - } - if final != fixture.final { - t.Logf("[line:%v] Unexpected final, expected:%v, actual:%v", i, fixture.final, final) - ok = false - } - } - if !ok { - t.Fail() - } -} - -// -// Step 2 tests -// - -// go test -v -test.run TestISSUE_179 ...restful -func TestISSUE_179(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/v1/category/{param:*}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/v1/category/sub/sub") - t.Logf("%v", routes) -} - -// go test -v -test.run TestISSUE_30 ...restful -func TestISSUE_30(t *testing.T) { - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.GET("/{id}").To(dummy)) - ws1.Route(ws1.POST("/login").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/login") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/users/login" { - t.Error("first is", routes[0].Path) - t.Logf("routes:%v", routes) - } -} - -// go test -v -test.run TestISSUE_34 ...restful -func TestISSUE_34(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("/{type}/{id}").To(dummy)) - ws1.Route(ws1.GET("/network/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/network/12") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - t.Logf("routes:%v", routes) - } -} - -// go test -v -test.run TestISSUE_34_2 ...restful -func TestISSUE_34_2(t *testing.T) { - ws1 := new(WebService).Path("/") - // change the registration order - ws1.Route(ws1.GET("/network/{id}").To(dummy)) - ws1.Route(ws1.GET("/{type}/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/network/12") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - } -} - -// go test -v -test.run TestISSUE_137 ...restful -func TestISSUE_137(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/") - t.Log(routes) - if len(routes) > 0 { - t.Error("no route expected") - } -} - -func TestSelectRoutesSlash(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("").To(dummy)) - ws1.Route(ws1.GET("/").To(dummy)) - ws1.Route(ws1.GET("/u").To(dummy)) - ws1.Route(ws1.POST("/u").To(dummy)) - ws1.Route(ws1.POST("/u/v").To(dummy)) - ws1.Route(ws1.POST("/u/{w}").To(dummy)) - ws1.Route(ws1.POST("/u/{w}/z").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/u") - checkRoutesContains(routes, "/u", t) - checkRoutesContainsNo(routes, "/u/v", t) - checkRoutesContainsNo(routes, "/", t) - checkRoutesContainsNo(routes, "/u/{w}/z", t) -} -func TestSelectRoutesU(t *testing.T) { - ws1 := new(WebService).Path("/u") - ws1.Route(ws1.GET("").To(dummy)) - ws1.Route(ws1.GET("/").To(dummy)) - ws1.Route(ws1.GET("/v").To(dummy)) - ws1.Route(ws1.POST("/{w}").To(dummy)) - ws1.Route(ws1.POST("/{w}/z").To(dummy)) // so full path = /u/{w}/z - routes := RouterJSR311{}.selectRoutes(ws1, "/v") // test against /u/v - checkRoutesContains(routes, "/u/{w}", t) -} - -func TestSelectRoutesUsers1(t *testing.T) { - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.POST("").To(dummy)) - ws1.Route(ws1.POST("/").To(dummy)) - ws1.Route(ws1.PUT("/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/1") - checkRoutesContains(routes, "/users/{id}", t) -} -func checkRoutesContains(routes []Route, path string, t *testing.T) { - if !containsRoutePath(routes, path, t) { - for _, r := range routes { - t.Logf("route %v %v", r.Method, r.Path) - } - t.Fatalf("routes should include [%v]:", path) - } -} -func checkRoutesContainsNo(routes []Route, path string, t *testing.T) { - if containsRoutePath(routes, path, t) { - for _, r := range routes { - t.Logf("route %v %v", r.Method, r.Path) - } - t.Fatalf("routes should not include [%v]:", path) - } -} -func containsRoutePath(routes []Route, path string, t *testing.T) bool { - for _, each := range routes { - if each.Path == path { - return true - } - } - return false -} - -// go test -v -test.run TestSortableRouteCandidates ...restful -func TestSortableRouteCandidates(t *testing.T) { - fixture := &sortableRouteCandidates{} - r1 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 0} - r2 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 1} - r3 := routeCandidate{matchesCount: 0, literalCount: 1, nonDefaultCount: 1} - r4 := routeCandidate{matchesCount: 1, literalCount: 1, nonDefaultCount: 0} - r5 := routeCandidate{matchesCount: 1, literalCount: 0, nonDefaultCount: 0} - fixture.candidates = append(fixture.candidates, r5, r4, r3, r2, r1) - sort.Sort(sort.Reverse(fixture)) - first := fixture.candidates[0] - if first.matchesCount != 1 && first.literalCount != 1 && first.nonDefaultCount != 0 { - t.Fatal("expected r4") - } - last := fixture.candidates[len(fixture.candidates)-1] - if last.matchesCount != 0 && last.literalCount != 0 && last.nonDefaultCount != 0 { - t.Fatal("expected r1") - } -} - -func dummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "dummy") } diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/mime_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/mime_test.go deleted file mode 100644 index a910bb100..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/mime_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package restful - -import ( - "fmt" - "testing" -) - -// go test -v -test.run TestSortMimes ...restful -func TestSortMimes(t *testing.T) { - accept := "text/html; q=0.8, text/plain, image/gif, */*; q=0.01, image/jpeg" - result := sortedMimes(accept) - got := fmt.Sprintf("%v", result) - want := "[{text/plain 1} {image/gif 1} {image/jpeg 1} {text/html 0.8} {*/* 0.01}]" - if got != want { - t.Errorf("bad sort order of mime types:%s", got) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go deleted file mode 100644 index f0fceb834..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestOptionsFilter ...restful -func TestOptionsFilter(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.GET("/candy/{kind}").To(dummy)) - ws.Route(ws.DELETE("/candy/{kind}").To(dummy)) - ws.Route(ws.POST("/candies").To(dummy)) - Add(ws) - Filter(OPTIONSFilter()) - - httpRequest, _ := http.NewRequest("OPTIONS", "http://here.io/candy/gum", nil) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_Allow) - if "GET,DELETE" != actual { - t.Fatal("expected: GET,DELETE but got:" + actual) - } - - httpRequest, _ = http.NewRequest("OPTIONS", "http://here.io/candies", nil) - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual = httpWriter.Header().Get(HEADER_Allow) - if "POST" != actual { - t.Fatal("expected: POST but got:" + actual) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression_test.go deleted file mode 100644 index 334fcef73..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package restful - -import "testing" - -var tempregexs = []struct { - template, regex string - literalCount, varCount int -}{ - {"", "^(/.*)?$", 0, 0}, - {"/a/{b}/c/", "^/a/([^/]+?)/c(/.*)?$", 2, 1}, - {"/{a}/{b}/{c-d-e}/", "^/([^/]+?)/([^/]+?)/([^/]+?)(/.*)?$", 0, 3}, - {"/{p}/abcde", "^/([^/]+?)/abcde(/.*)?$", 5, 1}, - {"/a/{b:*}", "^/a/(.*)(/.*)?$", 1, 1}, - {"/a/{b:[a-z]+}", "^/a/([a-z]+)(/.*)?$", 1, 1}, -} - -func TestTemplateToRegularExpression(t *testing.T) { - ok := true - for i, fixture := range tempregexs { - actual, lCount, vCount, _ := templateToRegularExpression(fixture.template) - if actual != fixture.regex { - t.Logf("regex mismatch, expected:%v , actual:%v, line:%v\n", fixture.regex, actual, i) // 11 = where the data starts - ok = false - } - if lCount != fixture.literalCount { - t.Logf("literal count mismatch, expected:%v , actual:%v, line:%v\n", fixture.literalCount, lCount, i) - ok = false - } - if vCount != fixture.varCount { - t.Logf("variable count mismatch, expected:%v , actual:%v, line:%v\n", fixture.varCount, vCount, i) - ok = false - } - } - if !ok { - t.Fatal("one or more expression did not match") - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go deleted file mode 100644 index 72f078f92..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go +++ /dev/null @@ -1,204 +0,0 @@ -package restful - -import ( - "encoding/json" - "net/http" - "net/url" - "strconv" - "strings" - "testing" -) - -func TestQueryParameter(t *testing.T) { - hreq := http.Request{Method: "GET"} - hreq.URL, _ = url.Parse("http://www.google.com/search?q=foo&q=bar") - rreq := Request{Request: &hreq} - if rreq.QueryParameter("q") != "foo" { - t.Errorf("q!=foo %#v", rreq) - } -} - -type Anything map[string]interface{} - -type Number struct { - ValueFloat float64 - ValueInt int64 -} - -type Sample struct { - Value string -} - -func TestReadEntityXmlCached(t *testing.T) { - SetCacheReadEntity(true) - bodyReader := strings.NewReader("42") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/xml") - request := &Request{Request: httpRequest} - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } - if request.bodyContent == nil { - t.Fatal("no expected cached bytes found") - } -} - -func TestReadEntityXmlNonCached(t *testing.T) { - SetCacheReadEntity(false) - bodyReader := strings.NewReader("42") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/xml") - request := &Request{Request: httpRequest} - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } - if request.bodyContent != nil { - t.Fatal("unexpected cached bytes found") - } -} - -func TestReadEntityJson(t *testing.T) { - bodyReader := strings.NewReader(`{"Value" : "42"}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } -} - -func TestReadEntityJsonCharset(t *testing.T) { - bodyReader := strings.NewReader(`{"Value" : "42"}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json; charset=UTF-8") - request := NewRequest(httpRequest) - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } -} - -func TestReadEntityJsonNumber(t *testing.T) { - SetCacheReadEntity(true) - bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - any := make(Anything) - request.ReadEntity(&any) - number, ok := any["Value"].(json.Number) - if !ok { - t.Fatal("read failed") - } - vint, err := number.Int64() - if err != nil { - t.Fatal("convert failed") - } - if vint != 4899710515899924123 { - t.Fatal("read failed") - } - vfloat, err := number.Float64() - if err != nil { - t.Fatal("convert failed") - } - // match the default behaviour - vstring := strconv.FormatFloat(vfloat, 'e', 15, 64) - if vstring != "4.899710515899924e+18" { - t.Fatal("convert float64 failed") - } -} - -func TestReadEntityJsonNumberNonCached(t *testing.T) { - SetCacheReadEntity(false) - bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - any := make(Anything) - request.ReadEntity(&any) - number, ok := any["Value"].(json.Number) - if !ok { - t.Fatal("read failed") - } - vint, err := number.Int64() - if err != nil { - t.Fatal("convert failed") - } - if vint != 4899710515899924123 { - t.Fatal("read failed") - } - vfloat, err := number.Float64() - if err != nil { - t.Fatal("convert failed") - } - // match the default behaviour - vstring := strconv.FormatFloat(vfloat, 'e', 15, 64) - if vstring != "4.899710515899924e+18" { - t.Fatal("convert float64 failed") - } -} - -func TestReadEntityJsonLong(t *testing.T) { - bodyReader := strings.NewReader(`{"ValueFloat" : 4899710515899924123, "ValueInt": 4899710515899924123}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - number := new(Number) - request.ReadEntity(&number) - if number.ValueInt != 4899710515899924123 { - t.Fatal("read failed") - } - // match the default behaviour - vstring := strconv.FormatFloat(number.ValueFloat, 'e', 15, 64) - if vstring != "4.899710515899924e+18" { - t.Fatal("convert float64 failed") - } -} - -func TestBodyParameter(t *testing.T) { - bodyReader := strings.NewReader(`value1=42&value2=43`) - httpRequest, _ := http.NewRequest("POST", "/test?value1=44", bodyReader) // POST and PUT body parameters take precedence over URL query string - httpRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - request := NewRequest(httpRequest) - v1, err := request.BodyParameter("value1") - if err != nil { - t.Error(err) - } - v2, err := request.BodyParameter("value2") - if err != nil { - t.Error(err) - } - if v1 != "42" || v2 != "43" { - t.Fatal("read failed") - } -} - -func TestReadEntityUnkown(t *testing.T) { - bodyReader := strings.NewReader("?") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/rubbish") - request := NewRequest(httpRequest) - sam := new(Sample) - err := request.ReadEntity(sam) - if err == nil { - t.Fatal("read should be in error") - } -} - -func TestSetAttribute(t *testing.T) { - bodyReader := strings.NewReader("?") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - request := NewRequest(httpRequest) - request.SetAttribute("go", "there") - there := request.Attribute("go") - if there != "there" { - t.Fatalf("missing request attribute:%v", there) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go deleted file mode 100644 index d3db82c0d..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package restful - -import ( - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestWriteHeader(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - resp.WriteHeader(123) - if resp.StatusCode() != 123 { - t.Errorf("Unexpected status code:%d", resp.StatusCode()) - } -} - -func TestNoWriteHeader(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - if resp.StatusCode() != http.StatusOK { - t.Errorf("Unexpected status code:%d", resp.StatusCode()) - } -} - -type food struct { - Kind string -} - -// go test -v -test.run TestMeasureContentLengthXml ...restful -func TestMeasureContentLengthXml(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - resp.WriteAsXml(food{"apple"}) - if resp.ContentLength() != 76 { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthJson ...restful -func TestMeasureContentLengthJson(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - resp.WriteAsJson(food{"apple"}) - if resp.ContentLength() != 22 { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthJsonNotPretty ...restful -func TestMeasureContentLengthJsonNotPretty(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, false, nil} - resp.WriteAsJson(food{"apple"}) - if resp.ContentLength() != 17 { // 16+1 using the Encoder directly yields another /n - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthWriteErrorString ...restful -func TestMeasureContentLengthWriteErrorString(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - resp.WriteErrorString(404, "Invalid") - if resp.ContentLength() != len("Invalid") { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestStatusIsPassedToResponse ...restful -func TestStatusIsPassedToResponse(t *testing.T) { - for _, each := range []struct { - write, read int - }{ - {write: 204, read: 204}, - {write: 304, read: 304}, - {write: 200, read: 200}, - {write: 400, read: 400}, - } { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0, true, nil} - resp.WriteHeader(each.write) - if got, want := httpWriter.Code, each.read; got != want { - t.Errorf("got %v want %v", got, want) - } - } -} - -// go test -v -test.run TestStatusCreatedAndContentTypeJson_Issue54 ...restful -func TestStatusCreatedAndContentTypeJson_Issue54(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0, true, nil} - resp.WriteHeader(201) - resp.WriteAsJson(food{"Juicy"}) - if httpWriter.HeaderMap.Get("Content-Type") != "application/json" { - t.Errorf("Expected content type json but got:%d", httpWriter.HeaderMap.Get("Content-Type")) - } - if httpWriter.Code != 201 { - t.Errorf("Expected status 201 but got:%d", httpWriter.Code) - } -} - -type errorOnWriteRecorder struct { - *httptest.ResponseRecorder -} - -func (e errorOnWriteRecorder) Write(bytes []byte) (int, error) { - return 0, errors.New("fail") -} - -// go test -v -test.run TestLastWriteErrorCaught ...restful -func TestLastWriteErrorCaught(t *testing.T) { - httpWriter := errorOnWriteRecorder{httptest.NewRecorder()} - resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0, true, nil} - err := resp.WriteAsJson(food{"Juicy"}) - if err.Error() != "fail" { - t.Errorf("Unexpected error message:%v", err) - } -} - -// go test -v -test.run TestAcceptStarStar_Issue83 ...restful -func TestAcceptStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{httpWriter, "application/bogus,*/*;q=0.8", []string{"application/json"}, 0, 0, true, nil} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/json" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestAcceptSkipStarStar_Issue83 ...restful -func TestAcceptSkipStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{httpWriter, " application/xml ,*/* ; q=0.8", []string{"application/json", "application/xml"}, 0, 0, true, nil} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/xml" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestAcceptXmlBeforeStarStar_Issue83 ...restful -func TestAcceptXmlBeforeStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{httpWriter, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", []string{"application/json"}, 0, 0, true, nil} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/json" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestWriteHeaderNoContent_Issue124 ...restful -func TestWriteHeaderNoContent_Issue124(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "text/plain", []string{"text/plain"}, 0, 0, true, nil} - resp.WriteHeader(http.StatusNoContent) - if httpWriter.Code != http.StatusNoContent { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNoContent) - } -} - -// go test -v -test.run TestStatusCreatedAndContentTypeJson_Issue163 ...restful -func TestStatusCreatedAndContentTypeJson_Issue163(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0, true, nil} - resp.WriteHeader(http.StatusNotModified) - if httpWriter.Code != http.StatusNotModified { - t.Errorf("Got %d want %d", httpWriter.Code, http.StatusNotModified) - } -} - -func TestWriteHeaderAndEntity_Issue235(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0, true, nil} - var pong = struct { - Foo string `json:"foo"` - }{Foo: "123"} - resp.WriteHeaderAndEntity(404, pong) - if httpWriter.Code != http.StatusNotFound { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNoContent) - } - if got, want := httpWriter.Header().Get("Content-Type"), "application/json"; got != want { - t.Errorf("got %v want %v", got, want) - } - if !strings.HasPrefix(httpWriter.Body.String(), "{") { - t.Errorf("expected pong struct in json:%s", httpWriter.Body.String()) - } -} - -func TestWriteEntityNoAcceptMatchWithProduces(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "application/bogus", []string{"application/json"}, 0, 0, true, nil} - resp.WriteEntity("done") - if httpWriter.Code != http.StatusOK { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusOK) - } -} - -func TestWriteEntityNoAcceptMatchNoProduces(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{httpWriter, "application/bogus", []string{}, 0, 0, true, nil} - resp.WriteEntity("done") - if httpWriter.Code != http.StatusNotAcceptable { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNotAcceptable) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go deleted file mode 100644 index 56dbe02e4..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package restful - -import ( - "testing" -) - -func TestRouteBuilder_PathParameter(t *testing.T) { - p := &Parameter{&ParameterData{Name: "name", Description: "desc"}} - p.AllowMultiple(true) - p.DataType("int") - p.Required(true) - values := map[string]string{"a": "b"} - p.AllowableValues(values) - p.bePath() - - b := new(RouteBuilder) - b.function = dummy - b.Param(p) - r := b.Build() - if !r.ParameterDocs[0].Data().AllowMultiple { - t.Error("AllowMultiple invalid") - } - if r.ParameterDocs[0].Data().DataType != "int" { - t.Error("dataType invalid") - } - if !r.ParameterDocs[0].Data().Required { - t.Error("required invalid") - } - if r.ParameterDocs[0].Data().Kind != PathParameterKind { - t.Error("kind invalid") - } - if r.ParameterDocs[0].Data().AllowableValues["a"] != "b" { - t.Error("allowableValues invalid") - } - if b.ParameterNamed("name") == nil { - t.Error("access to parameter failed") - } -} - -func TestRouteBuilder(t *testing.T) { - json := "application/json" - b := new(RouteBuilder) - b.To(dummy) - b.Path("/routes").Method("HEAD").Consumes(json).Produces(json) - r := b.Build() - if r.Path != "/routes" { - t.Error("path invalid") - } - if r.Produces[0] != json { - t.Error("produces invalid") - } - if r.Consumes[0] != json { - t.Error("consumes invalid") - } - if r.Operation != "dummy" { - t.Error("Operation not set") - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go deleted file mode 100644 index 6a104aff8..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package restful - -import ( - "testing" -) - -// accept should match produces -func TestMatchesAcceptPlainTextWhenProducePlainTextAsLast(t *testing.T) { - r := Route{Produces: []string{"application/json", "text/plain"}} - if !r.matchesAccept("text/plain") { - t.Errorf("accept should match text/plain") - } -} - -// accept should match produces -func TestMatchesAcceptStar(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if !r.matchesAccept("*/*") { - t.Errorf("accept should match star") - } -} - -// accept should match produces -func TestMatchesAcceptIE(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if !r.matchesAccept("text/html, application/xhtml+xml, */*") { - t.Errorf("accept should match star") - } -} - -// accept should match produces -func TestMatchesAcceptXml(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if r.matchesAccept("application/json") { - t.Errorf("accept should not match json") - } - if !r.matchesAccept("application/xml") { - t.Errorf("accept should match xml") - } -} - -// accept should match produces -func TestMatchesAcceptAny(t *testing.T) { - r := Route{Produces: []string{"*/*"}} - if !r.matchesAccept("application/json") { - t.Errorf("accept should match json") - } - if !r.matchesAccept("application/xml") { - t.Errorf("accept should match xml") - } -} - -// content type should match consumes -func TestMatchesContentTypeXml(t *testing.T) { - r := Route{Consumes: []string{"application/xml"}} - if r.matchesContentType("application/json") { - t.Errorf("accept should not match json") - } - if !r.matchesContentType("application/xml") { - t.Errorf("accept should match xml") - } -} - -// content type should match consumes -func TestMatchesContentTypeCharsetInformation(t *testing.T) { - r := Route{Consumes: []string{"application/json"}} - if !r.matchesContentType("application/json; charset=UTF-8") { - t.Errorf("matchesContentType should ignore charset information") - } -} - -func TestMatchesPath_OneParam(t *testing.T) { - params := doExtractParams("/from/{source}", 2, "/from/here", t) - if params["source"] != "here" { - t.Errorf("parameter mismatch here") - } -} - -func TestMatchesPath_Slash(t *testing.T) { - params := doExtractParams("/", 0, "/", t) - if len(params) != 0 { - t.Errorf("expected empty parameters") - } -} - -func TestMatchesPath_SlashNonVar(t *testing.T) { - params := doExtractParams("/any", 1, "/any", t) - if len(params) != 0 { - t.Errorf("expected empty parameters") - } -} - -func TestMatchesPath_TwoVars(t *testing.T) { - params := doExtractParams("/from/{source}/to/{destination}", 4, "/from/AMS/to/NY", t) - if params["source"] != "AMS" { - t.Errorf("parameter mismatch AMS") - } -} - -func TestMatchesPath_VarOnFront(t *testing.T) { - params := doExtractParams("{what}/from/{source}/", 3, "who/from/SOS/", t) - if params["source"] != "SOS" { - t.Errorf("parameter mismatch SOS") - } -} - -func TestExtractParameters_EmptyValue(t *testing.T) { - params := doExtractParams("/fixed/{var}", 2, "/fixed/", t) - if params["var"] != "" { - t.Errorf("parameter mismatch var") - } -} - -func TestTokenizePath(t *testing.T) { - if len(tokenizePath("/")) != 0 { - t.Errorf("not empty path tokens") - } -} - -func doExtractParams(routePath string, size int, urlPath string, t *testing.T) map[string]string { - r := Route{Path: routePath} - r.postBuild() - if len(r.pathParts) != size { - t.Fatalf("len not %v %v, but %v", size, r.pathParts, len(r.pathParts)) - } - return r.extractParameters(urlPath) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go deleted file mode 100644 index ba782a255..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go +++ /dev/null @@ -1,1138 +0,0 @@ -package swagger - -import ( - "net" - "testing" - "time" -) - -type YesNo bool - -func (y YesNo) MarshalJSON() ([]byte, error) { - if y { - return []byte("yes"), nil - } - return []byte("no"), nil -} - -// clear && go test -v -test.run TestRef_Issue190 ...swagger -func TestRef_Issue190(t *testing.T) { - type User struct { - items []string - } - testJsonFromStruct(t, User{}, `{ - "swagger.User": { - "id": "swagger.User", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - }`) -} - -// clear && go test -v -test.run TestCustomMarshaller_Issue96 ...swagger -func TestCustomMarshaller_Issue96(t *testing.T) { - type Vote struct { - What YesNo - } - testJsonFromStruct(t, Vote{}, `{ - "swagger.Vote": { - "id": "swagger.Vote", - "required": [ - "What" - ], - "properties": { - "What": { - "type": "string" - } - } - } - }`) -} - -// clear && go test -v -test.run TestPrimitiveTypes ...swagger -func TestPrimitiveTypes(t *testing.T) { - type Prims struct { - f float64 - t time.Time - } - testJsonFromStruct(t, Prims{}, `{ - "swagger.Prims": { - "id": "swagger.Prims", - "required": [ - "f", - "t" - ], - "properties": { - "f": { - "type": "number", - "format": "double" - }, - "t": { - "type": "string", - "format": "date-time" - } - } - } - }`) -} - -// clear && go test -v -test.run TestPrimitivePtrTypes ...swagger -func TestPrimitivePtrTypes(t *testing.T) { - type Prims struct { - f *float64 - t *time.Time - b *bool - s *string - i *int - } - testJsonFromStruct(t, Prims{}, `{ - "swagger.Prims": { - "id": "swagger.Prims", - "required": [ - "f", - "t", - "b", - "s", - "i" - ], - "properties": { - "b": { - "type": "boolean" - }, - "f": { - "type": "number", - "format": "double" - }, - "i": { - "type": "integer", - "format": "int32" - }, - "s": { - "type": "string" - }, - "t": { - "type": "string", - "format": "date-time" - } - } - } - }`) -} - -// clear && go test -v -test.run TestS1 ...swagger -func TestS1(t *testing.T) { - type S1 struct { - Id string - } - testJsonFromStruct(t, S1{}, `{ - "swagger.S1": { - "id": "swagger.S1", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "string" - } - } - } - }`) -} - -// clear && go test -v -test.run TestS2 ...swagger -func TestS2(t *testing.T) { - type S2 struct { - Ids []string - } - testJsonFromStruct(t, S2{}, `{ - "swagger.S2": { - "id": "swagger.S2", - "required": [ - "Ids" - ], - "properties": { - "Ids": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - }`) -} - -// clear && go test -v -test.run TestS3 ...swagger -func TestS3(t *testing.T) { - type NestedS3 struct { - Id string - } - type S3 struct { - Nested NestedS3 - } - testJsonFromStruct(t, S3{}, `{ - "swagger.NestedS3": { - "id": "swagger.NestedS3", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "string" - } - } - }, - "swagger.S3": { - "id": "swagger.S3", - "required": [ - "Nested" - ], - "properties": { - "Nested": { - "$ref": "swagger.NestedS3" - } - } - } - }`) -} - -type sample struct { - id string `swagger:"required"` // TODO - items []item - rootItem item `json:"root" description:"root desc"` -} - -type item struct { - itemName string `json:"name"` -} - -// clear && go test -v -test.run TestSampleToModelAsJson ...swagger -func TestSampleToModelAsJson(t *testing.T) { - testJsonFromStruct(t, sample{items: []item{}}, `{ - "swagger.item": { - "id": "swagger.item", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - } - } - }, - "swagger.sample": { - "id": "swagger.sample", - "required": [ - "id", - "items", - "root" - ], - "properties": { - "id": { - "type": "string" - }, - "items": { - "type": "array", - "items": { - "$ref": "swagger.item" - } - }, - "root": { - "$ref": "swagger.item", - "description": "root desc" - } - } - } - }`) -} - -func TestJsonTags(t *testing.T) { - type X struct { - A string - B string `json:"-"` - C int `json:",string"` - D int `json:","` - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A", - "C", - "D" - ], - "properties": { - "A": { - "type": "string" - }, - "C": { - "type": "string" - }, - "D": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestJsonTagOmitempty(t *testing.T) { - type X struct { - A int `json:",omitempty"` - B int `json:"C,omitempty"` - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "properties": { - "A": { - "type": "integer", - "format": "int32" - }, - "C": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestJsonTagName(t *testing.T) { - type X struct { - A string `json:"B"` - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "B" - ], - "properties": { - "B": { - "type": "string" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestAnonymousStruct(t *testing.T) { - type X struct { - A struct { - B int - } - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A" - ], - "properties": { - "A": { - "$ref": "swagger.X.A" - } - } - }, - "swagger.X.A": { - "id": "swagger.X.A", - "required": [ - "B" - ], - "properties": { - "B": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestAnonymousPtrStruct(t *testing.T) { - type X struct { - A *struct { - B int - } - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A" - ], - "properties": { - "A": { - "$ref": "swagger.X.A" - } - } - }, - "swagger.X.A": { - "id": "swagger.X.A", - "required": [ - "B" - ], - "properties": { - "B": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestAnonymousArrayStruct(t *testing.T) { - type X struct { - A []struct { - B int - } - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A" - ], - "properties": { - "A": { - "type": "array", - "items": { - "$ref": "swagger.X.A" - } - } - } - }, - "swagger.X.A": { - "id": "swagger.X.A", - "required": [ - "B" - ], - "properties": { - "B": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -func TestAnonymousPtrArrayStruct(t *testing.T) { - type X struct { - A *[]struct { - B int - } - } - - expected := `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A" - ], - "properties": { - "A": { - "type": "array", - "items": { - "$ref": "swagger.X.A" - } - } - } - }, - "swagger.X.A": { - "id": "swagger.X.A", - "required": [ - "B" - ], - "properties": { - "B": { - "type": "integer", - "format": "int32" - } - } - } - }` - - testJsonFromStruct(t, X{}, expected) -} - -// go test -v -test.run TestEmbeddedStruct_Issue98 ...swagger -func TestEmbeddedStruct_Issue98(t *testing.T) { - type Y struct { - A int - } - type X struct { - Y - } - testJsonFromStruct(t, X{}, `{ - "swagger.X": { - "id": "swagger.X", - "required": [ - "A" - ], - "properties": { - "A": { - "type": "integer", - "format": "int32" - } - } - } - }`) -} - -type Dataset struct { - Names []string -} - -// clear && go test -v -test.run TestIssue85 ...swagger -func TestIssue85(t *testing.T) { - anon := struct{ Datasets []Dataset }{} - testJsonFromStruct(t, anon, `{ - "struct { Datasets ||swagger.Dataset }": { - "id": "struct { Datasets ||swagger.Dataset }", - "required": [ - "Datasets" - ], - "properties": { - "Datasets": { - "type": "array", - "items": { - "$ref": "swagger.Dataset" - } - } - } - }, - "swagger.Dataset": { - "id": "swagger.Dataset", - "required": [ - "Names" - ], - "properties": { - "Names": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - }`) -} - -type File struct { - History []File - HistoryPtrs []*File -} - -// go test -v -test.run TestRecursiveStructure ...swagger -func TestRecursiveStructure(t *testing.T) { - testJsonFromStruct(t, File{}, `{ - "swagger.File": { - "id": "swagger.File", - "required": [ - "History", - "HistoryPtrs" - ], - "properties": { - "History": { - "type": "array", - "items": { - "$ref": "swagger.File" - } - }, - "HistoryPtrs": { - "type": "array", - "items": { - "$ref": "swagger.File" - } - } - } - } - }`) -} - -type A1 struct { - B struct { - Id int - Comment string `json:"comment,omitempty"` - } -} - -// go test -v -test.run TestEmbeddedStructA1 ...swagger -func TestEmbeddedStructA1(t *testing.T) { - testJsonFromStruct(t, A1{}, `{ - "swagger.A1": { - "id": "swagger.A1", - "required": [ - "B" - ], - "properties": { - "B": { - "$ref": "swagger.A1.B" - } - } - }, - "swagger.A1.B": { - "id": "swagger.A1.B", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "integer", - "format": "int32" - }, - "comment": { - "type": "string" - } - } - } - }`) -} - -type A2 struct { - C -} -type C struct { - Id int `json:"B"` - Comment string `json:"comment,omitempty"` - Secure bool `json:"secure"` -} - -// go test -v -test.run TestEmbeddedStructA2 ...swagger -func TestEmbeddedStructA2(t *testing.T) { - testJsonFromStruct(t, A2{}, `{ - "swagger.A2": { - "id": "swagger.A2", - "required": [ - "B", - "secure" - ], - "properties": { - "B": { - "type": "integer", - "format": "int32" - }, - "comment": { - "type": "string" - }, - "secure": { - "type": "boolean" - } - } - } - }`) -} - -type A3 struct { - B D -} - -type D struct { - Id int -} - -// clear && go test -v -test.run TestStructA3 ...swagger -func TestStructA3(t *testing.T) { - testJsonFromStruct(t, A3{}, `{ - "swagger.A3": { - "id": "swagger.A3", - "required": [ - "B" - ], - "properties": { - "B": { - "$ref": "swagger.D" - } - } - }, - "swagger.D": { - "id": "swagger.D", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "integer", - "format": "int32" - } - } - } - }`) -} - -type A4 struct { - D "json:,inline" -} - -// clear && go test -v -test.run TestStructA4 ...swagger -func TestEmbeddedStructA4(t *testing.T) { - testJsonFromStruct(t, A4{}, `{ - "swagger.A4": { - "id": "swagger.A4", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "integer", - "format": "int32" - } - } - } - }`) -} - -type A5 struct { - D `json:"d"` -} - -// clear && go test -v -test.run TestStructA5 ...swagger -func TestEmbeddedStructA5(t *testing.T) { - testJsonFromStruct(t, A5{}, `{ - "swagger.A5": { - "id": "swagger.A5", - "required": [ - "d" - ], - "properties": { - "d": { - "$ref": "swagger.D" - } - } - }, - "swagger.D": { - "id": "swagger.D", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "integer", - "format": "int32" - } - } - } - }`) -} - -type D2 struct { - id int - D []D -} - -type A6 struct { - D2 "json:,inline" -} - -// clear && go test -v -test.run TestStructA4 ...swagger -func TestEmbeddedStructA6(t *testing.T) { - testJsonFromStruct(t, A6{}, `{ - "swagger.A6": { - "id": "swagger.A6", - "required": [ - "id", - "D" - ], - "properties": { - "D": { - "type": "array", - "items": { - "$ref": "swagger.D" - } - }, - "id": { - "type": "integer", - "format": "int32" - } - } - }, - "swagger.D": { - "id": "swagger.D", - "required": [ - "Id" - ], - "properties": { - "Id": { - "type": "integer", - "format": "int32" - } - } - } - }`) -} - -type ObjectId []byte - -type Region struct { - Id ObjectId `bson:"_id" json:"id"` - Name string `bson:"name" json:"name"` - Type string `bson:"type" json:"type"` -} - -// clear && go test -v -test.run TestRegion_Issue113 ...swagger -func TestRegion_Issue113(t *testing.T) { - testJsonFromStruct(t, []Region{}, `{ - "||swagger.Region": { - "id": "||swagger.Region", - "properties": {} - }, - "swagger.Region": { - "id": "swagger.Region", - "required": [ - "id", - "name", - "type" - ], - "properties": { - "id": { - "type": "array", - "items": { - "type": "integer" - } - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - } - } - }`) -} - -// clear && go test -v -test.run TestIssue158 ...swagger -func TestIssue158(t *testing.T) { - type Address struct { - Country string `json:"country,omitempty"` - } - - type Customer struct { - Name string `json:"name"` - Address Address `json:"address"` - } - expected := `{ - "swagger.Address": { - "id": "swagger.Address", - "properties": { - "country": { - "type": "string" - } - } - }, - "swagger.Customer": { - "id": "swagger.Customer", - "required": [ - "name", - "address" - ], - "properties": { - "address": { - "$ref": "swagger.Address" - }, - "name": { - "type": "string" - } - } - } - }` - testJsonFromStruct(t, Customer{}, expected) -} - -func TestSlices(t *testing.T) { - type Address struct { - Country string `json:"country,omitempty"` - } - expected := `{ - "swagger.Address": { - "id": "swagger.Address", - "properties": { - "country": { - "type": "string" - } - } - }, - "swagger.Customer": { - "id": "swagger.Customer", - "required": [ - "name", - "addresses" - ], - "properties": { - "addresses": { - "type": "array", - "items": { - "$ref": "swagger.Address" - } - }, - "name": { - "type": "string" - } - } - } - }` - // both slices (with pointer value and with type value) should have equal swagger representation - { - type Customer struct { - Name string `json:"name"` - Addresses []Address `json:"addresses"` - } - testJsonFromStruct(t, Customer{}, expected) - } - { - type Customer struct { - Name string `json:"name"` - Addresses []*Address `json:"addresses"` - } - testJsonFromStruct(t, Customer{}, expected) - } - -} - -type Name struct { - Value string -} - -func (n Name) PostBuildModel(m *Model) *Model { - m.Description = "titles must be upcase" - return m -} - -type TOC struct { - Titles []Name -} - -type Discography struct { - Title Name - TOC -} - -// clear && go test -v -test.run TestEmbeddedStructPull204 ...swagger -func TestEmbeddedStructPull204(t *testing.T) { - b := Discography{} - testJsonFromStruct(t, b, ` -{ - "swagger.Discography": { - "id": "swagger.Discography", - "required": [ - "Title", - "Titles" - ], - "properties": { - "Title": { - "$ref": "swagger.Name" - }, - "Titles": { - "type": "array", - "items": { - "$ref": "swagger.Name" - } - } - } - }, - "swagger.Name": { - "id": "swagger.Name", - "required": [ - "Value" - ], - "properties": { - "Value": { - "type": "string" - } - } - } - } -`) -} - -type AddressWithMethod struct { - Country string `json:"country,omitempty"` - PostCode int `json:"postcode,omitempty"` -} - -func (AddressWithMethod) SwaggerDoc() map[string]string { - return map[string]string{ - "": "Address doc", - "country": "Country doc", - "postcode": "PostCode doc", - } -} - -func TestDocInMethodSwaggerDoc(t *testing.T) { - expected := `{ - "swagger.AddressWithMethod": { - "id": "swagger.AddressWithMethod", - "description": "Address doc", - "properties": { - "country": { - "type": "string", - "description": "Country doc" - }, - "postcode": { - "type": "integer", - "format": "int32", - "description": "PostCode doc" - } - } - } - }` - testJsonFromStruct(t, AddressWithMethod{}, expected) -} - -type RefDesc struct { - f1 *int64 `description:"desc"` -} - -func TestPtrDescription(t *testing.T) { - b := RefDesc{} - expected := `{ - "swagger.RefDesc": { - "id": "swagger.RefDesc", - "required": [ - "f1" - ], - "properties": { - "f1": { - "type": "integer", - "format": "int64", - "description": "desc" - } - } - } - }` - testJsonFromStruct(t, b, expected) -} - -type A struct { - B `json:",inline"` - C1 `json:"metadata,omitempty"` -} - -type B struct { - SB string -} - -type C1 struct { - SC string -} - -func (A) SwaggerDoc() map[string]string { - return map[string]string{ - "": "A struct", - "B": "B field", // We should not get anything from this - "metadata": "C1 field", - } -} - -func (B) SwaggerDoc() map[string]string { - return map[string]string{ - "": "B struct", - "SB": "SB field", - } -} - -func (C1) SwaggerDoc() map[string]string { - return map[string]string{ - "": "C1 struct", - "SC": "SC field", - } -} - -func TestNestedStructDescription(t *testing.T) { - expected := ` -{ - "swagger.A": { - "id": "swagger.A", - "description": "A struct", - "required": [ - "SB" - ], - "properties": { - "SB": { - "type": "string", - "description": "SB field" - }, - "metadata": { - "$ref": "swagger.C1", - "description": "C1 field" - } - } - }, - "swagger.C1": { - "id": "swagger.C1", - "description": "C1 struct", - "required": [ - "SC" - ], - "properties": { - "SC": { - "type": "string", - "description": "SC field" - } - } - } - } -` - testJsonFromStruct(t, A{}, expected) -} - -// This tests a primitive with type overrides in the struct tags -type FakeInt int -type E struct { - Id FakeInt `type:"integer"` - IP net.IP `type:"string"` -} - -func TestOverridenTypeTagE1(t *testing.T) { - expected := ` -{ - "swagger.E": { - "id": "swagger.E", - "required": [ - "Id", - "IP" - ], - "properties": { - "Id": { - "type": "integer" - }, - "IP": { - "type": "string" - } - } - } - } -` - testJsonFromStruct(t, E{}, expected) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_list_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_list_test.go deleted file mode 100644 index 9a9ab919b..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_list_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package swagger - -import ( - "encoding/json" - "testing" -) - -func TestModelList(t *testing.T) { - m := Model{} - m.Id = "m" - l := ModelList{} - l.Put("m", m) - k, ok := l.At("m") - if !ok { - t.Error("want model back") - } - if got, want := k.Id, "m"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestModelList_Marshal(t *testing.T) { - l := ModelList{} - m := Model{Id: "myid"} - l.Put("myid", m) - data, err := json.Marshal(l) - if err != nil { - t.Error(err) - } - if got, want := string(data), `{"myid":{"id":"myid","properties":{}}}`; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestModelList_Unmarshal(t *testing.T) { - data := `{"myid":{"id":"myid","properties":{}}}` - l := ModelList{} - if err := json.Unmarshal([]byte(data), &l); err != nil { - t.Error(err) - } - m, ok := l.At("myid") - if !ok { - t.Error("expected myid") - } - if got, want := m.Id, "myid"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_ext_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_ext_test.go deleted file mode 100644 index eff0d59d3..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_ext_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package swagger - -import ( - "net" - "testing" -) - -// clear && go test -v -test.run TestThatExtraTagsAreReadIntoModel ...swagger -func TestThatExtraTagsAreReadIntoModel(t *testing.T) { - type fakeint int - type Anything struct { - Name string `description:"name" modelDescription:"a test"` - Size int `minimum:"0" maximum:"10"` - Stati string `enum:"off|on" default:"on" modelDescription:"more description"` - ID string `unique:"true"` - FakeInt fakeint `type:"integer"` - IP net.IP `type:"string"` - Password string - } - m := modelsFromStruct(Anything{}) - props, _ := m.At("swagger.Anything") - p1, _ := props.Properties.At("Name") - if got, want := p1.Description, "name"; got != want { - t.Errorf("got %v want %v", got, want) - } - p2, _ := props.Properties.At("Size") - if got, want := p2.Minimum, "0"; got != want { - t.Errorf("got %v want %v", got, want) - } - if got, want := p2.Maximum, "10"; got != want { - t.Errorf("got %v want %v", got, want) - } - p3, _ := props.Properties.At("Stati") - if got, want := p3.Enum[0], "off"; got != want { - t.Errorf("got %v want %v", got, want) - } - if got, want := p3.Enum[1], "on"; got != want { - t.Errorf("got %v want %v", got, want) - } - p4, _ := props.Properties.At("ID") - if got, want := *p4.UniqueItems, true; got != want { - t.Errorf("got %v want %v", got, want) - } - p5, _ := props.Properties.At("Password") - if got, want := *p5.Type, "string"; got != want { - t.Errorf("got %v want %v", got, want) - } - p6, _ := props.Properties.At("FakeInt") - if got, want := *p6.Type, "integer"; got != want { - t.Errorf("got %v want %v", got, want) - } - p7, _ := props.Properties.At("IP") - if got, want := *p7.Type, "string"; got != want { - t.Errorf("got %v want %v", got, want) - } - - if got, want := props.Description, "a test\nmore description"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_list_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_list_test.go deleted file mode 100644 index 2833ad8fd..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_property_list_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package swagger - -import ( - "encoding/json" - "testing" -) - -func TestModelPropertyList(t *testing.T) { - l := ModelPropertyList{} - p := ModelProperty{Description: "d"} - l.Put("p", p) - q, ok := l.At("p") - if !ok { - t.Error("expected p") - } - if got, want := q.Description, "d"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestModelPropertyList_Marshal(t *testing.T) { - l := ModelPropertyList{} - p := ModelProperty{Description: "d"} - l.Put("p", p) - data, err := json.Marshal(l) - if err != nil { - t.Error(err) - } - if got, want := string(data), `{"p":{"description":"d"}}`; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestModelPropertyList_Unmarshal(t *testing.T) { - data := `{"p":{"description":"d"}}` - l := ModelPropertyList{} - if err := json.Unmarshal([]byte(data), &l); err != nil { - t.Error(err) - } - m, ok := l.At("p") - if !ok { - t.Error("expected p") - } - if got, want := m.Description, "d"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/ordered_route_map_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/ordered_route_map_test.go deleted file mode 100644 index 964e7da05..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/ordered_route_map_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package swagger - -import ( - "testing" - - "github.com/emicklei/go-restful" -) - -// go test -v -test.run TestOrderedRouteMap ...swagger -func TestOrderedRouteMap(t *testing.T) { - m := newOrderedRouteMap() - r1 := restful.Route{Path: "/r1"} - r2 := restful.Route{Path: "/r2"} - m.Add("a", r1) - m.Add("b", r2) - m.Add("b", r1) - m.Add("d", r2) - m.Add("c", r2) - order := "" - m.Do(func(k string, routes []restful.Route) { - order += k - if len(routes) == 0 { - t.Fail() - } - }) - if order != "abdc" { - t.Fail() - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/postbuild_model_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/postbuild_model_test.go deleted file mode 100644 index 3e20d2f5b..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/postbuild_model_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package swagger - -import "testing" - -type Boat struct { - Length int `json:"-"` // on default, this makes the fields not required - Weight int `json:"-"` -} - -// PostBuildModel is from swagger.ModelBuildable -func (b Boat) PostBuildModel(m *Model) *Model { - // override required - m.Required = []string{"Length", "Weight"} - - // add model property (just to test is can be added; is this a real usecase?) - extraType := "string" - m.Properties.Put("extra", ModelProperty{ - Description: "extra description", - DataTypeFields: DataTypeFields{ - Type: &extraType, - }, - }) - return m -} - -func TestCustomPostModelBuilde(t *testing.T) { - testJsonFromStruct(t, Boat{}, `{ - "swagger.Boat": { - "id": "swagger.Boat", - "required": [ - "Length", - "Weight" - ], - "properties": { - "extra": { - "type": "string", - "description": "extra description" - } - } - } -}`) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go deleted file mode 100644 index 78e2d43cc..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go +++ /dev/null @@ -1,284 +0,0 @@ -package swagger - -import ( - "encoding/json" - "testing" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful/swagger/test_package" -) - -func TestInfoStruct_Issue231(t *testing.T) { - config := Config{ - Info: Info{ - Title: "Title", - Description: "Description", - TermsOfServiceUrl: "http://example.com", - Contact: "example@example.com", - License: "License", - LicenseUrl: "http://example.com/license.txt", - }, - } - sws := newSwaggerService(config) - str, err := json.MarshalIndent(sws.produceListing(), "", " ") - if err != nil { - t.Fatal(err) - } - compareJson(t, string(str), ` - { - "apiVersion": "", - "swaggerVersion": "1.2", - "apis": null, - "info": { - "title": "Title", - "description": "Description", - "termsOfServiceUrl": "http://example.com", - "contact": "example@example.com", - "license": "License", - "licenseUrl": "http://example.com/license.txt" - } - } - `) -} - -// go test -v -test.run TestThatMultiplePathsOnRootAreHandled ...swagger -func TestThatMultiplePathsOnRootAreHandled(t *testing.T) { - ws1 := new(restful.WebService) - ws1.Route(ws1.GET("/_ping").To(dummy)) - ws1.Route(ws1.GET("/version").To(dummy)) - - cfg := Config{ - WebServicesUrl: "http://here.com", - ApiPath: "/apipath", - WebServices: []*restful.WebService{ws1}, - } - sws := newSwaggerService(cfg) - decl := sws.composeDeclaration(ws1, "/") - if got, want := len(decl.Apis), 2; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestWriteSamples(t *testing.T) { - ws1 := new(restful.WebService) - ws1.Route(ws1.GET("/object").To(dummy).Writes(test_package.TestStruct{})) - ws1.Route(ws1.GET("/array").To(dummy).Writes([]test_package.TestStruct{})) - ws1.Route(ws1.GET("/object_and_array").To(dummy).Writes(struct{ Abc test_package.TestStruct }{})) - - cfg := Config{ - WebServicesUrl: "http://here.com", - ApiPath: "/apipath", - WebServices: []*restful.WebService{ws1}, - } - sws := newSwaggerService(cfg) - - decl := sws.composeDeclaration(ws1, "/") - - str, err := json.MarshalIndent(decl.Apis, "", " ") - if err != nil { - t.Fatal(err) - } - - compareJson(t, string(str), ` - [ - { - "path": "/object", - "description": "", - "operations": [ - { - "type": "test_package.TestStruct", - "method": "GET", - "nickname": "dummy", - "parameters": [] - } - ] - }, - { - "path": "/array", - "description": "", - "operations": [ - { - "type": "array", - "items": { - "$ref": "test_package.TestStruct" - }, - "method": "GET", - "nickname": "dummy", - "parameters": [] - } - ] - }, - { - "path": "/object_and_array", - "description": "", - "operations": [ - { - "type": "struct { Abc test_package.TestStruct }", - "method": "GET", - "nickname": "dummy", - "parameters": [] - } - ] - } - ]`) - - str, err = json.MarshalIndent(decl.Models, "", " ") - if err != nil { - t.Fatal(err) - } - compareJson(t, string(str), ` - { - "test_package.TestStruct": { - "id": "test_package.TestStruct", - "required": [ - "TestField" - ], - "properties": { - "TestField": { - "type": "string" - } - } - }, - "||test_package.TestStruct": { - "id": "||test_package.TestStruct", - "properties": {} - }, - "struct { Abc test_package.TestStruct }": { - "id": "struct { Abc test_package.TestStruct }", - "required": [ - "Abc" - ], - "properties": { - "Abc": { - "$ref": "test_package.TestStruct" - } - } - } - }`) -} - -// go test -v -test.run TestServiceToApi ...swagger -func TestServiceToApi(t *testing.T) { - ws := new(restful.WebService) - ws.Path("/tests") - ws.Consumes(restful.MIME_JSON) - ws.Produces(restful.MIME_XML) - ws.Route(ws.GET("/a").To(dummy).Writes(sample{})) - ws.Route(ws.PUT("/b").To(dummy).Writes(sample{})) - ws.Route(ws.POST("/c").To(dummy).Writes(sample{})) - ws.Route(ws.DELETE("/d").To(dummy).Writes(sample{})) - - ws.Route(ws.GET("/d").To(dummy).Writes(sample{})) - ws.Route(ws.PUT("/c").To(dummy).Writes(sample{})) - ws.Route(ws.POST("/b").To(dummy).Writes(sample{})) - ws.Route(ws.DELETE("/a").To(dummy).Writes(sample{})) - ws.ApiVersion("1.2.3") - cfg := Config{ - WebServicesUrl: "http://here.com", - ApiPath: "/apipath", - WebServices: []*restful.WebService{ws}, - PostBuildHandler: func(in *ApiDeclarationList) {}, - } - sws := newSwaggerService(cfg) - decl := sws.composeDeclaration(ws, "/tests") - // checks - if decl.ApiVersion != "1.2.3" { - t.Errorf("got %v want %v", decl.ApiVersion, "1.2.3") - } - if decl.BasePath != "http://here.com" { - t.Errorf("got %v want %v", decl.BasePath, "http://here.com") - } - if len(decl.Apis) != 4 { - t.Errorf("got %v want %v", len(decl.Apis), 4) - } - pathOrder := "" - for _, each := range decl.Apis { - pathOrder += each.Path - for _, other := range each.Operations { - pathOrder += other.Method - } - } - - if pathOrder != "/tests/aGETDELETE/tests/bPUTPOST/tests/cPOSTPUT/tests/dDELETEGET" { - t.Errorf("got %v want %v", pathOrder, "see test source") - } -} - -func dummy(i *restful.Request, o *restful.Response) {} - -// go test -v -test.run TestIssue78 ...swagger -type Response struct { - Code int - Users *[]User - Items *[]TestItem -} -type User struct { - Id, Name string -} -type TestItem struct { - Id, Name string -} - -// clear && go test -v -test.run TestComposeResponseMessages ...swagger -func TestComposeResponseMessages(t *testing.T) { - responseErrors := map[int]restful.ResponseError{} - responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: TestItem{}} - route := restful.Route{ResponseErrors: responseErrors} - decl := new(ApiDeclaration) - decl.Models = ModelList{} - msgs := composeResponseMessages(route, decl) - if msgs[0].ResponseModel != "swagger.TestItem" { - t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel) - } -} - -// clear && go test -v -test.run TestComposeResponseMessageArray ...swagger -func TestComposeResponseMessageArray(t *testing.T) { - responseErrors := map[int]restful.ResponseError{} - responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: []TestItem{}} - route := restful.Route{ResponseErrors: responseErrors} - decl := new(ApiDeclaration) - decl.Models = ModelList{} - msgs := composeResponseMessages(route, decl) - if msgs[0].ResponseModel != "array[swagger.TestItem]" { - t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel) - } -} - -func TestIssue78(t *testing.T) { - sws := newSwaggerService(Config{}) - models := new(ModelList) - sws.addModelFromSampleTo(&Operation{}, true, Response{Items: &[]TestItem{}}, models) - model, ok := models.At("swagger.Response") - if !ok { - t.Fatal("missing response model") - } - if "swagger.Response" != model.Id { - t.Fatal("wrong model id:" + model.Id) - } - code, ok := model.Properties.At("Code") - if !ok { - t.Fatal("missing code") - } - if "integer" != *code.Type { - t.Fatal("wrong code type:" + *code.Type) - } - items, ok := model.Properties.At("Items") - if !ok { - t.Fatal("missing items") - } - if "array" != *items.Type { - t.Fatal("wrong items type:" + *items.Type) - } - items_items := items.Items - if items_items == nil { - t.Fatal("missing items->items") - } - ref := items_items.Ref - if ref == nil { - t.Fatal("missing $ref") - } - if *ref != "swagger.TestItem" { - t.Fatal("wrong $ref:" + *ref) - } -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/test_package/struct.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/test_package/struct.go deleted file mode 100644 index b9a6f9308..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/test_package/struct.go +++ /dev/null @@ -1,5 +0,0 @@ -package test_package - -type TestStruct struct { - TestField string -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go deleted file mode 100644 index dab871032..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package swagger - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "strings" - "testing" -) - -func testJsonFromStruct(t *testing.T, sample interface{}, expectedJson string) bool { - m := modelsFromStruct(sample) - data, _ := json.MarshalIndent(m, " ", " ") - return compareJson(t, string(data), expectedJson) -} - -func modelsFromStruct(sample interface{}) *ModelList { - models := new(ModelList) - builder := modelBuilder{models} - builder.addModelFrom(sample) - return models -} - -func compareJson(t *testing.T, actualJsonAsString string, expectedJsonAsString string) bool { - success := false - var actualMap map[string]interface{} - json.Unmarshal([]byte(actualJsonAsString), &actualMap) - var expectedMap map[string]interface{} - err := json.Unmarshal([]byte(expectedJsonAsString), &expectedMap) - if err != nil { - var actualArray []interface{} - json.Unmarshal([]byte(actualJsonAsString), &actualArray) - var expectedArray []interface{} - err := json.Unmarshal([]byte(expectedJsonAsString), &expectedArray) - success = reflect.DeepEqual(actualArray, expectedArray) - if err != nil { - t.Fatalf("Unparsable expected JSON: %s", err) - } - } else { - success = reflect.DeepEqual(actualMap, expectedMap) - } - if !success { - t.Log("---- expected -----") - t.Log(withLineNumbers(expectedJsonAsString)) - t.Log("---- actual -----") - t.Log(withLineNumbers(actualJsonAsString)) - t.Log("---- raw -----") - t.Log(actualJsonAsString) - t.Error("there are differences") - return false - } - return true -} - -func indexOfNonMatchingLine(actual, expected string) int { - a := strings.Split(actual, "\n") - e := strings.Split(expected, "\n") - size := len(a) - if len(e) < len(a) { - size = len(e) - } - for i := 0; i < size; i++ { - if a[i] != e[i] { - return i - } - } - return -1 -} - -func withLineNumbers(content string) string { - var buffer bytes.Buffer - lines := strings.Split(content, "\n") - for i, each := range lines { - buffer.WriteString(fmt.Sprintf("%d:%s\n", i, each)) - } - return buffer.String() -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/tracer_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/tracer_test.go deleted file mode 100644 index 60c1e9fc0..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/tracer_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package restful - -import "testing" - -// Use like this: -// -// TraceLogger(testLogger{t}) -type testLogger struct { - t *testing.T -} - -func (l testLogger) Print(v ...interface{}) { - l.t.Log(v...) -} - -func (l testLogger) Printf(format string, v ...interface{}) { - l.t.Logf(format, v...) -} diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go deleted file mode 100644 index 5096cac4b..000000000 --- a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go +++ /dev/null @@ -1,297 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -const ( - pathGetFriends = "/get/{userId}/friends" -) - -func TestParameter(t *testing.T) { - p := &Parameter{&ParameterData{Name: "name", Description: "desc"}} - p.AllowMultiple(true) - p.DataType("int") - p.Required(true) - values := map[string]string{"a": "b"} - p.AllowableValues(values) - p.bePath() - - ws := new(WebService) - ws.Param(p) - if ws.pathParameters[0].Data().Name != "name" { - t.Error("path parameter (or name) invalid") - } -} -func TestWebService_CanCreateParameterKinds(t *testing.T) { - ws := new(WebService) - if ws.BodyParameter("b", "b").Kind() != BodyParameterKind { - t.Error("body parameter expected") - } - if ws.PathParameter("p", "p").Kind() != PathParameterKind { - t.Error("path parameter expected") - } - if ws.QueryParameter("q", "q").Kind() != QueryParameterKind { - t.Error("query parameter expected") - } -} - -func TestCapturePanic(t *testing.T) { - tearDown() - Add(newPanicingService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/fire", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 500 != httpWriter.Code { - t.Error("500 expected on fire") - } -} - -func TestCapturePanicWithEncoded(t *testing.T) { - tearDown() - Add(newPanicingService()) - DefaultContainer.EnableContentEncoding(true) - httpRequest, _ := http.NewRequest("GET", "http://here.com/fire", nil) - httpRequest.Header.Set("Accept", "*/*") - httpRequest.Header.Set("Accept-Encoding", "gzip") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 500 != httpWriter.Code { - t.Error("500 expected on fire, got", httpWriter.Code) - } -} - -func TestNotFound(t *testing.T) { - tearDown() - httpRequest, _ := http.NewRequest("GET", "http://here.com/missing", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 404 != httpWriter.Code { - t.Error("404 expected on missing") - } -} - -func TestMethodNotAllowed(t *testing.T) { - tearDown() - Add(newGetOnlyService()) - httpRequest, _ := http.NewRequest("POST", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 405 != httpWriter.Code { - t.Error("405 expected method not allowed") - } -} - -func TestSelectedRoutePath_Issue100(t *testing.T) { - tearDown() - Add(newSelectedRouteTestingService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get/232452/friends", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if http.StatusOK != httpWriter.Code { - t.Error(http.StatusOK, "expected,", httpWriter.Code, "received.") - } -} - -func TestContentType415_Issue170(t *testing.T) { - tearDown() - Add(newGetOnlyJsonOnlyService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -func TestContentType415_POST_Issue170(t *testing.T) { - tearDown() - Add(newPostOnlyJsonOnlyService()) - httpRequest, _ := http.NewRequest("POST", "http://here.com/post", nil) - httpRequest.Header.Set("Content-Type", "application/json") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -// go test -v -test.run TestContentType406PlainJson ...restful -func TestContentType406PlainJson(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - Add(newGetPlainTextOrJsonService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -func TestRemoveRoute(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - ws := newGetPlainTextOrJsonService() - Add(ws) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - // dynamic apis are disabled, should error and do nothing - if err := ws.RemoveRoute("/get", "GET"); err == nil { - t.Error("unexpected non-error") - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - ws.SetDynamicRoutes(true) - if err := ws.RemoveRoute("/get", "GET"); err != nil { - t.Errorf("unexpected error %v", err) - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 404; got != want { - t.Errorf("got %v, want %v", got, want) - } -} -func TestRemoveLastRoute(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - ws := newGetPlainTextOrJsonServiceMultiRoute() - Add(ws) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - // dynamic apis are disabled, should error and do nothing - if err := ws.RemoveRoute("/get", "GET"); err == nil { - t.Error("unexpected non-error") - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - ws.SetDynamicRoutes(true) - if err := ws.RemoveRoute("/get", "GET"); err != nil { - t.Errorf("unexpected error %v", err) - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 404; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -// go test -v -test.run TestContentTypeOctet_Issue170 ...restful -func TestContentTypeOctet_Issue170(t *testing.T) { - tearDown() - Add(newGetConsumingOctetStreamService()) - // with content-type - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Content-Type", MIME_OCTET) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } - // without content-type - httpRequest, _ = http.NewRequest("GET", "http://here.com/get", nil) - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -func newPanicingService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET("/fire").To(doPanic)) - return ws -} - -func newGetOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET("/get").To(doPanic)) - return ws -} - -func newPostOnlyJsonOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/json") - ws.Route(ws.POST("/post").To(doNothing)) - return ws -} - -func newGetOnlyJsonOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/json") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newGetPlainTextOrJsonService() *WebService { - ws := new(WebService).Path("") - ws.Produces("text/plain", "application/json") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newGetPlainTextOrJsonServiceMultiRoute() *WebService { - ws := new(WebService).Path("") - ws.Produces("text/plain", "application/json") - ws.Route(ws.GET("/get").To(doNothing)) - ws.Route(ws.GET("/status").To(doNothing)) - return ws -} - -func newGetConsumingOctetStreamService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/octet-stream") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newSelectedRouteTestingService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET(pathGetFriends).To(selectedRouteChecker)) - return ws -} - -func selectedRouteChecker(req *Request, resp *Response) { - if req.SelectedRoutePath() != pathGetFriends { - resp.InternalServerError() - } -} - -func doPanic(req *Request, resp *Response) { - println("lightning...") - panic("fire") -} - -func doNothing(req *Request, resp *Response) { -} diff --git a/Godeps/_workspace/src/github.com/evanphx/json-patch/merge_test.go b/Godeps/_workspace/src/github.com/evanphx/json-patch/merge_test.go deleted file mode 100644 index e9e68ceef..000000000 --- a/Godeps/_workspace/src/github.com/evanphx/json-patch/merge_test.go +++ /dev/null @@ -1,322 +0,0 @@ -package jsonpatch - -import ( - "strings" - "testing" -) - -func mergePatch(doc, patch string) string { - out, err := MergePatch([]byte(doc), []byte(patch)) - - if err != nil { - panic(err) - } - - return string(out) -} - -func TestMergePatchReplaceKey(t *testing.T) { - doc := `{ "title": "hello" }` - pat := `{ "title": "goodbye" }` - - res := mergePatch(doc, pat) - - if !compareJSON(pat, res) { - t.Fatalf("Key was not replaced") - } -} - -func TestMergePatchIgnoresOtherValues(t *testing.T) { - doc := `{ "title": "hello", "age": 18 }` - pat := `{ "title": "goodbye" }` - - res := mergePatch(doc, pat) - - exp := `{ "title": "goodbye", "age": 18 }` - - if !compareJSON(exp, res) { - t.Fatalf("Key was not replaced") - } -} - -func TestMergePatchNilDoc(t *testing.T) { - doc := `{ "title": null }` - pat := `{ "title": {"foo": "bar"} }` - - res := mergePatch(doc, pat) - - exp := `{ "title": {"foo": "bar"} }` - - if !compareJSON(exp, res) { - t.Fatalf("Key was not replaced") - } -} - -func TestMergePatchRecursesIntoObjects(t *testing.T) { - doc := `{ "person": { "title": "hello", "age": 18 } }` - pat := `{ "person": { "title": "goodbye" } }` - - res := mergePatch(doc, pat) - - exp := `{ "person": { "title": "goodbye", "age": 18 } }` - - if !compareJSON(exp, res) { - t.Fatalf("Key was not replaced") - } -} - -type nonObjectCases struct { - doc, pat, res string -} - -func TestMergePatchReplacesNonObjectsWholesale(t *testing.T) { - a1 := `[1]` - a2 := `[2]` - o1 := `{ "a": 1 }` - o2 := `{ "a": 2 }` - o3 := `{ "a": 1, "b": 1 }` - o4 := `{ "a": 2, "b": 1 }` - - cases := []nonObjectCases{ - {a1, a2, a2}, - {o1, a2, a2}, - {a1, o1, o1}, - {o3, o2, o4}, - } - - for _, c := range cases { - act := mergePatch(c.doc, c.pat) - - if !compareJSON(c.res, act) { - t.Errorf("whole object replacement failed") - } - } -} - -func TestMergePatchReturnsErrorOnBadJSON(t *testing.T) { - _, err := MergePatch([]byte(`[[[[`), []byte(`1`)) - - if err == nil { - t.Errorf("Did not return an error for bad json: %s", err) - } - - _, err = MergePatch([]byte(`1`), []byte(`[[[[`)) - - if err == nil { - t.Errorf("Did not return an error for bad json: %s", err) - } -} - -var rfcTests = []struct { - target string - patch string - expected string -}{ - // test cases from https://tools.ietf.org/html/rfc7386#appendix-A - {target: `{"a":"b"}`, patch: `{"a":"c"}`, expected: `{"a":"c"}`}, - {target: `{"a":"b"}`, patch: `{"b":"c"}`, expected: `{"a":"b","b":"c"}`}, - {target: `{"a":"b"}`, patch: `{"a":null}`, expected: `{}`}, - {target: `{"a":"b","b":"c"}`, patch: `{"a":null}`, expected: `{"b":"c"}`}, - {target: `{"a":["b"]}`, patch: `{"a":"c"}`, expected: `{"a":"c"}`}, - {target: `{"a":"c"}`, patch: `{"a":["b"]}`, expected: `{"a":["b"]}`}, - {target: `{"a":{"b": "c"}}`, patch: `{"a": {"b": "d","c": null}}`, expected: `{"a":{"b":"d"}}`}, - {target: `{"a":[{"b":"c"}]}`, patch: `{"a":[1]}`, expected: `{"a":[1]}`}, - {target: `["a","b"]`, patch: `["c","d"]`, expected: `["c","d"]`}, - {target: `{"a":"b"}`, patch: `["c"]`, expected: `["c"]`}, - // {target: `{"a":"foo"}`, patch: `null`, expected: `null`}, - // {target: `{"a":"foo"}`, patch: `"bar"`, expected: `"bar"`}, - {target: `{"e":null}`, patch: `{"a":1}`, expected: `{"a":1,"e":null}`}, - {target: `[1,2]`, patch: `{"a":"b","c":null}`, expected: `{"a":"b"}`}, - {target: `{}`, patch: `{"a":{"bb":{"ccc":null}}}`, expected: `{"a":{"bb":{}}}`}, -} - -func TestMergePatchRFCCases(t *testing.T) { - for i, c := range rfcTests { - out := mergePatch(c.target, c.patch) - - if !compareJSON(out, c.expected) { - t.Errorf("case[%d], patch '%s' did not apply properly to '%s'. expected:\n'%s'\ngot:\n'%s'", i, c.patch, c.target, c.expected, out) - } - } -} - -var rfcFailTests = ` - {"a":"foo"} | null - {"a":"foo"} | "bar" -` - -func TestMergePatchFailRFCCases(t *testing.T) { - tests := strings.Split(rfcFailTests, "\n") - - for _, c := range tests { - if strings.TrimSpace(c) == "" { - continue - } - - parts := strings.SplitN(c, "|", 2) - - doc := strings.TrimSpace(parts[0]) - pat := strings.TrimSpace(parts[1]) - - out, err := MergePatch([]byte(doc), []byte(pat)) - - if err != errBadJSONPatch { - t.Errorf("error not returned properly: %s, %s", err, string(out)) - } - } - -} - -func TestMergeReplaceKey(t *testing.T) { - doc := `{ "title": "hello", "nested": {"one": 1, "two": 2} }` - pat := `{ "title": "goodbye", "nested": {"one": 2, "two": 2} }` - - exp := `{ "title": "goodbye", "nested": {"one": 2} }` - - res, err := CreateMergePatch([]byte(doc), []byte(pat)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - if !compareJSON(exp, string(res)) { - t.Fatalf("Key was not replaced") - } -} - -func TestMergeGetArray(t *testing.T) { - doc := `{ "title": "hello", "array": ["one", "two"], "notmatch": [1, 2, 3] }` - pat := `{ "title": "hello", "array": ["one", "two", "three"], "notmatch": [1, 2, 3] }` - - exp := `{ "array": ["one", "two", "three"] }` - - res, err := CreateMergePatch([]byte(doc), []byte(pat)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - if !compareJSON(exp, string(res)) { - t.Fatalf("Array was not added") - } -} - -func TestMergeGetObjArray(t *testing.T) { - doc := `{ "title": "hello", "array": [{"banana": true}, {"evil": false}], "notmatch": [{"one":1}, {"two":2}, {"three":3}] }` - pat := `{ "title": "hello", "array": [{"banana": false}, {"evil": true}], "notmatch": [{"one":1}, {"two":2}, {"three":3}] }` - - exp := `{ "array": [{"banana": false}, {"evil": true}] }` - - res, err := CreateMergePatch([]byte(doc), []byte(pat)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - if !compareJSON(exp, string(res)) { - t.Fatalf("Object array was not added") - } -} - -func TestMergeDeleteKey(t *testing.T) { - doc := `{ "title": "hello", "nested": {"one": 1, "two": 2} }` - pat := `{ "title": "hello", "nested": {"one": 1} }` - - exp := `{"nested":{"two":null}}` - - res, err := CreateMergePatch([]byte(doc), []byte(pat)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - // We cannot use "compareJSON", since Equals does not report a difference if the value is null - if exp != string(res) { - t.Fatalf("Key was not removed") - } -} - -func TestMergeEmptyArray(t *testing.T) { - doc := `{ "array": null }` - pat := `{ "array": [] }` - - exp := `{"array":[]}` - - res, err := CreateMergePatch([]byte(doc), []byte(pat)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - // We cannot use "compareJSON", since Equals does not report a difference if the value is null - if exp != string(res) { - t.Fatalf("Key was not removed") - } -} - -func TestMergeObjArray(t *testing.T) { - doc := `{ "array": [ {"a": {"b": 2}}, {"a": {"b": 3}} ]}` - exp := `{}` - - res, err := CreateMergePatch([]byte(doc), []byte(doc)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - // We cannot use "compareJSON", since Equals does not report a difference if the value is null - if exp != string(res) { - t.Fatalf("Array was not empty, was " + string(res)) - } -} - -func TestMergeComplexMatch(t *testing.T) { - doc := `{"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4], "nested": {"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4]} }` - empty := `{}` - res, err := CreateMergePatch([]byte(doc), []byte(doc)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - // We cannot use "compareJSON", since Equals does not report a difference if the value is null - if empty != string(res) { - t.Fatalf("Did not get empty result, was:%s", string(res)) - } -} - -func TestMergeComplexAddAll(t *testing.T) { - doc := `{"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4], "nested": {"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4]} }` - empty := `{}` - res, err := CreateMergePatch([]byte(empty), []byte(doc)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - if !compareJSON(doc, string(res)) { - t.Fatalf("Did not get everything as, it was:\n%s", string(res)) - } -} - -func TestMergeComplexRemoveAll(t *testing.T) { - doc := `{"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4], "nested": {"hello": "world","t": true ,"f": false, "n": null,"i": 123,"pi": 3.1416,"a": [1, 2, 3, 4]} }` - exp := `{"a":null,"f":null,"hello":null,"i":null,"n":null,"nested":null,"pi":null,"t":null}` - empty := `{}` - res, err := CreateMergePatch([]byte(doc), []byte(empty)) - - if err != nil { - t.Errorf("Unexpected error: %s, %s", err, string(res)) - } - - if exp != string(res) { - t.Fatalf("Did not get result, was:%s", string(res)) - } - - // FIXME: Crashes if using compareJSON like this: - /* - if !compareJSON(doc, string(res)) { - t.Fatalf("Did not get everything as, it was:\n%s", string(res)) - } - */ -} diff --git a/Godeps/_workspace/src/github.com/evanphx/json-patch/patch_test.go b/Godeps/_workspace/src/github.com/evanphx/json-patch/patch_test.go deleted file mode 100644 index 493c4f165..000000000 --- a/Godeps/_workspace/src/github.com/evanphx/json-patch/patch_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package jsonpatch - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "testing" -) - -func reformatJSON(j string) string { - buf := new(bytes.Buffer) - - json.Indent(buf, []byte(j), "", " ") - - return buf.String() -} - -func compareJSON(a, b string) bool { - // return Equal([]byte(a), []byte(b)) - - var obj_a, obj_b map[string]interface{} - json.Unmarshal([]byte(a), &obj_a) - json.Unmarshal([]byte(b), &obj_b) - - // fmt.Printf("Comparing %#v\nagainst %#v\n", obj_a, obj_b) - return reflect.DeepEqual(obj_a, obj_b) -} - -func applyPatch(doc, patch string) (string, error) { - obj, err := DecodePatch([]byte(patch)) - - if err != nil { - panic(err) - } - - out, err := obj.Apply([]byte(doc)) - - if err != nil { - return "", err - } - - return string(out), nil -} - -type Case struct { - doc, patch, result string -} - -var Cases = []Case{ - { - `{ "foo": "bar"}`, - `[ - { "op": "add", "path": "/baz", "value": "qux" } - ]`, - `{ - "baz": "qux", - "foo": "bar" - }`, - }, - { - `{ "foo": [ "bar", "baz" ] }`, - `[ - { "op": "add", "path": "/foo/1", "value": "qux" } - ]`, - `{ "foo": [ "bar", "qux", "baz" ] }`, - }, - { - `{ "baz": "qux", "foo": "bar" }`, - `[ { "op": "remove", "path": "/baz" } ]`, - `{ "foo": "bar" }`, - }, - { - `{ "foo": [ "bar", "qux", "baz" ] }`, - `[ { "op": "remove", "path": "/foo/1" } ]`, - `{ "foo": [ "bar", "baz" ] }`, - }, - { - `{ "baz": "qux", "foo": "bar" }`, - `[ { "op": "replace", "path": "/baz", "value": "boo" } ]`, - `{ "baz": "boo", "foo": "bar" }`, - }, - { - `{ - "foo": { - "bar": "baz", - "waldo": "fred" - }, - "qux": { - "corge": "grault" - } - }`, - `[ { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" } ]`, - `{ - "foo": { - "bar": "baz" - }, - "qux": { - "corge": "grault", - "thud": "fred" - } - }`, - }, - { - `{ "foo": [ "all", "grass", "cows", "eat" ] }`, - `[ { "op": "move", "from": "/foo/1", "path": "/foo/3" } ]`, - `{ "foo": [ "all", "cows", "eat", "grass" ] }`, - }, - { - `{ "foo": "bar" }`, - `[ { "op": "add", "path": "/child", "value": { "grandchild": { } } } ]`, - `{ "foo": "bar", "child": { "grandchild": { } } }`, - }, - { - `{ "foo": ["bar"] }`, - `[ { "op": "add", "path": "/foo/-", "value": ["abc", "def"] } ]`, - `{ "foo": ["bar", ["abc", "def"]] }`, - }, - { - `{ "foo": "bar", "qux": { "baz": 1, "bar": null } }`, - `[ { "op": "remove", "path": "/qux/bar" } ]`, - `{ "foo": "bar", "qux": { "baz": 1 } }`, - }, -} - -type BadCase struct { - doc, patch string -} - -var MutationTestCases = []BadCase{ - { - `{ "foo": "bar", "qux": { "baz": 1, "bar": null } }`, - `[ { "op": "remove", "path": "/qux/bar" } ]`, - }, -} - -var BadCases = []BadCase{ - { - `{ "foo": "bar" }`, - `[ { "op": "add", "path": "/baz/bat", "value": "qux" } ]`, - }, -} - -func TestAllCases(t *testing.T) { - for _, c := range Cases { - out, err := applyPatch(c.doc, c.patch) - - if err != nil { - t.Errorf("Unable to apply patch: %s", err) - } - - if !compareJSON(out, c.result) { - t.Errorf("Patch did not apply. Expected:\n%s\n\nActual:\n%s", - reformatJSON(c.result), reformatJSON(out)) - } - } - - for _, c := range MutationTestCases { - out, err := applyPatch(c.doc, c.patch) - - if err != nil { - t.Errorf("Unable to apply patch: %s", err) - } - - if compareJSON(out, c.doc) { - t.Errorf("Patch did not apply. Original:\n%s\n\nPatched:\n%s", - reformatJSON(c.doc), reformatJSON(out)) - } - } - - for _, c := range BadCases { - _, err := applyPatch(c.doc, c.patch) - - if err == nil { - t.Errorf("Patch should have failed to apply but it did not") - } - } -} - -type TestCase struct { - doc, patch string - result bool - failedPath string -} - -var TestCases = []TestCase{ - { - `{ - "baz": "qux", - "foo": [ "a", 2, "c" ] - }`, - `[ - { "op": "test", "path": "/baz", "value": "qux" }, - { "op": "test", "path": "/foo/1", "value": 2 } - ]`, - true, - "", - }, - { - `{ "baz": "qux" }`, - `[ { "op": "test", "path": "/baz", "value": "bar" } ]`, - false, - "/baz", - }, - { - `{ - "baz": "qux", - "foo": ["a", 2, "c"] - }`, - `[ - { "op": "test", "path": "/baz", "value": "qux" }, - { "op": "test", "path": "/foo/1", "value": "c" } - ]`, - false, - "/foo/1", - }, -} - -func TestAllTest(t *testing.T) { - for _, c := range TestCases { - _, err := applyPatch(c.doc, c.patch) - - if c.result && err != nil { - t.Errorf("Testing failed when it should have passed: %s", err) - } else if !c.result && err == nil { - t.Errorf("Testing passed when it should have faild: %s", err) - } else if !c.result { - expected := fmt.Sprintf("Testing value %s failed", c.failedPath) - if err.Error() != expected { - t.Errorf("Testing failed as expected but invalid message: expected [%s], got [%s]", expected, err) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/fatih/structs/field_test.go b/Godeps/_workspace/src/github.com/fatih/structs/field_test.go deleted file mode 100644 index b77e95120..000000000 --- a/Godeps/_workspace/src/github.com/fatih/structs/field_test.go +++ /dev/null @@ -1,383 +0,0 @@ -package structs - -import ( - "reflect" - "testing" -) - -// A test struct that defines all cases -type Foo struct { - A string - B int `structs:"y"` - C bool `json:"c"` - d string // not exported - E *Baz - x string `xml:"x"` // not exported, with tag - Y []string - Z map[string]interface{} - *Bar // embedded -} - -type Baz struct { - A string - B int -} - -type Bar struct { - E string - F int - g []string -} - -func newStruct() *Struct { - b := &Bar{ - E: "example", - F: 2, - g: []string{"zeynep", "fatih"}, - } - - // B and x is not initialized for testing - f := &Foo{ - A: "gopher", - C: true, - d: "small", - E: nil, - Y: []string{"example"}, - Z: nil, - } - f.Bar = b - - return New(f) -} - -func TestField_Set(t *testing.T) { - s := newStruct() - - f := s.Field("A") - err := f.Set("fatih") - if err != nil { - t.Error(err) - } - - if f.Value().(string) != "fatih" { - t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") - } - - f = s.Field("Y") - err = f.Set([]string{"override", "with", "this"}) - if err != nil { - t.Error(err) - } - - sliceLen := len(f.Value().([]string)) - if sliceLen != 3 { - t.Errorf("Setted values slice length is wrong: %d, want: %d", sliceLen, 3) - } - - f = s.Field("C") - err = f.Set(false) - if err != nil { - t.Error(err) - } - - if f.Value().(bool) { - t.Errorf("Setted value is wrong: %t want: %t", f.Value().(bool), false) - } - - // let's pass a different type - f = s.Field("A") - err = f.Set(123) // Field A is of type string, but we are going to pass an integer - if err == nil { - t.Error("Setting a field's value with a different type than the field's type should return an error") - } - - // old value should be still there :) - if f.Value().(string) != "fatih" { - t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") - } - - // let's access an unexported field, which should give an error - f = s.Field("d") - err = f.Set("large") - if err != errNotExported { - t.Error(err) - } - - // let's set a pointer to struct - b := &Bar{ - E: "gopher", - F: 2, - } - - f = s.Field("Bar") - err = f.Set(b) - if err != nil { - t.Error(err) - } - - baz := &Baz{ - A: "helloWorld", - B: 42, - } - - f = s.Field("E") - err = f.Set(baz) - if err != nil { - t.Error(err) - } - - ba := s.Field("E").Value().(*Baz) - - if ba.A != "helloWorld" { - t.Errorf("could not set baz. Got: %s Want: helloWorld", ba.A) - } -} - -func TestField_Zero(t *testing.T) { - s := newStruct() - - f := s.Field("A") - err := f.Zero() - if err != nil { - t.Error(err) - } - - if f.Value().(string) != "" { - t.Errorf("Zeroed value is wrong: %s want: %s", f.Value().(string), "") - } - - f = s.Field("Y") - err = f.Zero() - if err != nil { - t.Error(err) - } - - sliceLen := len(f.Value().([]string)) - if sliceLen != 0 { - t.Errorf("Zeroed values slice length is wrong: %d, want: %d", sliceLen, 0) - } - - f = s.Field("C") - err = f.Zero() - if err != nil { - t.Error(err) - } - - if f.Value().(bool) { - t.Errorf("Zeroed value is wrong: %t want: %t", f.Value().(bool), false) - } - - // let's access an unexported field, which should give an error - f = s.Field("d") - err = f.Zero() - if err != errNotExported { - t.Error(err) - } - - f = s.Field("Bar") - err = f.Zero() - if err != nil { - t.Error(err) - } - - f = s.Field("E") - err = f.Zero() - if err != nil { - t.Error(err) - } - - v := s.Field("E").value - if !v.IsNil() { - t.Errorf("could not set baz. Got: %s Want: ", v.Interface()) - } -} - -func TestField(t *testing.T) { - s := newStruct() - - defer func() { - err := recover() - if err == nil { - t.Error("Retrieveing a non existing field from the struct should panic") - } - }() - - _ = s.Field("no-field") -} - -func TestField_Kind(t *testing.T) { - s := newStruct() - - f := s.Field("A") - if f.Kind() != reflect.String { - t.Errorf("Field A has wrong kind: %s want: %s", f.Kind(), reflect.String) - } - - f = s.Field("B") - if f.Kind() != reflect.Int { - t.Errorf("Field B has wrong kind: %s want: %s", f.Kind(), reflect.Int) - } - - // unexported - f = s.Field("d") - if f.Kind() != reflect.String { - t.Errorf("Field d has wrong kind: %s want: %s", f.Kind(), reflect.String) - } -} - -func TestField_Tag(t *testing.T) { - s := newStruct() - - v := s.Field("B").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a non existing tag should return empty, got: %s", v) - } - - v = s.Field("C").Tag("json") - if v != "c" { - t.Errorf("Field's tag value of the existing field C should return 'c', got: %s", v) - } - - v = s.Field("d").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a non exported field should return empty, got: %s", v) - } - - v = s.Field("x").Tag("xml") - if v != "x" { - t.Errorf("Field's tag value of a non exported field with a tag should return 'x', got: %s", v) - } - - v = s.Field("A").Tag("json") - if v != "" { - t.Errorf("Field's tag value of a existing field without a tag should return empty, got: %s", v) - } -} - -func TestField_Value(t *testing.T) { - s := newStruct() - - v := s.Field("A").Value() - val, ok := v.(string) - if !ok { - t.Errorf("Field's value of a A should be string") - } - - if val != "gopher" { - t.Errorf("Field's value of a existing tag should return 'gopher', got: %s", val) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Value of a non exported field from the field should panic") - } - }() - - // should panic - _ = s.Field("d").Value() -} - -func TestField_IsEmbedded(t *testing.T) { - s := newStruct() - - if !s.Field("Bar").IsEmbedded() { - t.Errorf("Fields 'Bar' field is an embedded field") - } - - if s.Field("d").IsEmbedded() { - t.Errorf("Fields 'd' field is not an embedded field") - } -} - -func TestField_IsExported(t *testing.T) { - s := newStruct() - - if !s.Field("Bar").IsExported() { - t.Errorf("Fields 'Bar' field is an exported field") - } - - if !s.Field("A").IsExported() { - t.Errorf("Fields 'A' field is an exported field") - } - - if s.Field("d").IsExported() { - t.Errorf("Fields 'd' field is not an exported field") - } -} - -func TestField_IsZero(t *testing.T) { - s := newStruct() - - if s.Field("A").IsZero() { - t.Errorf("Fields 'A' field is an initialized field") - } - - if !s.Field("B").IsZero() { - t.Errorf("Fields 'B' field is not an initialized field") - } -} - -func TestField_Name(t *testing.T) { - s := newStruct() - - if s.Field("A").Name() != "A" { - t.Errorf("Fields 'A' field should have the name 'A'") - } -} - -func TestField_Field(t *testing.T) { - s := newStruct() - - e := s.Field("Bar").Field("E") - - val, ok := e.Value().(string) - if !ok { - t.Error("The value of the field 'e' inside 'Bar' struct should be string") - } - - if val != "example" { - t.Errorf("The value of 'e' should be 'example, got: %s", val) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Field of a non existing nested struct should panic") - } - }() - - _ = s.Field("Bar").Field("e") -} - -func TestField_Fields(t *testing.T) { - s := newStruct() - fields := s.Field("Bar").Fields() - - if len(fields) != 3 { - t.Errorf("We expect 3 fields in embedded struct, was: %d", len(fields)) - } -} - -func TestField_FieldOk(t *testing.T) { - s := newStruct() - - b, ok := s.FieldOk("Bar") - if !ok { - t.Error("The field 'Bar' should exists.") - } - - e, ok := b.FieldOk("E") - if !ok { - t.Error("The field 'E' should exists.") - } - - val, ok := e.Value().(string) - if !ok { - t.Error("The value of the field 'e' inside 'Bar' struct should be string") - } - - if val != "example" { - t.Errorf("The value of 'e' should be 'example, got: %s", val) - } -} diff --git a/Godeps/_workspace/src/github.com/fatih/structs/structs_example_test.go b/Godeps/_workspace/src/github.com/fatih/structs/structs_example_test.go deleted file mode 100644 index 32bb82937..000000000 --- a/Godeps/_workspace/src/github.com/fatih/structs/structs_example_test.go +++ /dev/null @@ -1,351 +0,0 @@ -package structs - -import ( - "fmt" - "time" -) - -func ExampleNew() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - server := &Server{ - Name: "Arslan", - ID: 123456, - Enabled: true, - } - - s := New(server) - - fmt.Printf("Name : %v\n", s.Name()) - fmt.Printf("Values : %v\n", s.Values()) - fmt.Printf("Value of ID : %v\n", s.Field("ID").Value()) - // Output: - // Name : Server - // Values : [Arslan 123456 true] - // Value of ID : 123456 - -} - -func ExampleMap() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - s := &Server{ - Name: "Arslan", - ID: 123456, - Enabled: true, - } - - m := Map(s) - - fmt.Printf("%#v\n", m["Name"]) - fmt.Printf("%#v\n", m["ID"]) - fmt.Printf("%#v\n", m["Enabled"]) - // Output: - // "Arslan" - // 123456 - // true - -} - -func ExampleMap_tags() { - // Custom tags can change the map keys instead of using the fields name - type Server struct { - Name string `structs:"server_name"` - ID int32 `structs:"server_id"` - Enabled bool `structs:"enabled"` - } - - s := &Server{ - Name: "Zeynep", - ID: 789012, - } - - m := Map(s) - - // access them by the custom tags defined above - fmt.Printf("%#v\n", m["server_name"]) - fmt.Printf("%#v\n", m["server_id"]) - fmt.Printf("%#v\n", m["enabled"]) - // Output: - // "Zeynep" - // 789012 - // false - -} - -func ExampleMap_nested() { - // By default field with struct types are processed too. We can stop - // processing them via "omitnested" tag option. - type Server struct { - Name string `structs:"server_name"` - ID int32 `structs:"server_id"` - Time time.Time `structs:"time,omitnested"` // do not convert to map[string]interface{} - } - - const shortForm = "2006-Jan-02" - t, _ := time.Parse("2006-Jan-02", "2013-Feb-03") - - s := &Server{ - Name: "Zeynep", - ID: 789012, - Time: t, - } - - m := Map(s) - - // access them by the custom tags defined above - fmt.Printf("%v\n", m["server_name"]) - fmt.Printf("%v\n", m["server_id"]) - fmt.Printf("%v\n", m["time"].(time.Time)) - // Output: - // Zeynep - // 789012 - // 2013-02-03 00:00:00 +0000 UTC -} - -func ExampleMap_omitEmpty() { - // By default field with struct types of zero values are processed too. We - // can stop processing them via "omitempty" tag option. - type Server struct { - Name string `structs:",omitempty"` - ID int32 `structs:"server_id,omitempty"` - Location string - } - - // Only add location - s := &Server{ - Location: "Tokyo", - } - - m := Map(s) - - // map contains only the Location field - fmt.Printf("%v\n", m) - // Output: - // map[Location:Tokyo] -} - -func ExampleValues() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - s := &Server{ - Name: "Fatih", - ID: 135790, - Enabled: false, - } - - m := Values(s) - - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Fatih 135790 false] -} - -func ExampleValues_omitEmpty() { - // By default field with struct types of zero values are processed too. We - // can stop processing them via "omitempty" tag option. - type Server struct { - Name string `structs:",omitempty"` - ID int32 `structs:"server_id,omitempty"` - Location string - } - - // Only add location - s := &Server{ - Location: "Ankara", - } - - m := Values(s) - - // values contains only the Location field - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Ankara] -} - -func ExampleValues_tags() { - type Location struct { - City string - Country string - } - - type Server struct { - Name string - ID int32 - Enabled bool - Location Location `structs:"-"` // values from location are not included anymore - } - - s := &Server{ - Name: "Fatih", - ID: 135790, - Enabled: false, - Location: Location{City: "Ankara", Country: "Turkey"}, - } - - // Let get all values from the struct s. Note that we don't include values - // from the Location field - m := Values(s) - - fmt.Printf("Values: %+v\n", m) - // Output: - // Values: [Fatih 135790 false] -} - -func ExampleFields() { - type Access struct { - Name string - LastAccessed time.Time - Number int - } - - s := &Access{ - Name: "Fatih", - LastAccessed: time.Now(), - Number: 1234567, - } - - fields := Fields(s) - - for i, field := range fields { - fmt.Printf("[%d] %+v\n", i, field.Name()) - } - - // Output: - // [0] Name - // [1] LastAccessed - // [2] Number -} - -func ExampleFields_nested() { - type Person struct { - Name string - Number int - } - - type Access struct { - Person Person - HasPermission bool - LastAccessed time.Time - } - - s := &Access{ - Person: Person{Name: "fatih", Number: 1234567}, - LastAccessed: time.Now(), - HasPermission: true, - } - - // Let's get all fields from the struct s. - fields := Fields(s) - - for _, field := range fields { - if field.Name() == "Person" { - fmt.Printf("Access.Person.Name: %+v\n", field.Field("Name").Value()) - } - } - - // Output: - // Access.Person.Name: fatih -} - -func ExampleField() { - type Person struct { - Name string - Number int - } - - type Access struct { - Person Person - HasPermission bool - LastAccessed time.Time - } - - access := &Access{ - Person: Person{Name: "fatih", Number: 1234567}, - LastAccessed: time.Now(), - HasPermission: true, - } - - // Create a new Struct type - s := New(access) - - // Get the Field type for "Person" field - p := s.Field("Person") - - // Get the underlying "Name field" and print the value of it - name := p.Field("Name") - - fmt.Printf("Value of Person.Access.Name: %+v\n", name.Value()) - - // Output: - // Value of Person.Access.Name: fatih - -} - -func ExampleIsZero() { - type Server struct { - Name string - ID int32 - Enabled bool - } - - // Nothing is initalized - a := &Server{} - isZeroA := IsZero(a) - - // Name and Enabled is initialized, but not ID - b := &Server{ - Name: "Golang", - Enabled: true, - } - isZeroB := IsZero(b) - - fmt.Printf("%#v\n", isZeroA) - fmt.Printf("%#v\n", isZeroB) - // Output: - // true - // false -} - -func ExampleHasZero() { - // Let's define an Access struct. Note that the "Enabled" field is not - // going to be checked because we added the "structs" tag to the field. - type Access struct { - Name string - LastAccessed time.Time - Number int - Enabled bool `structs:"-"` - } - - // Name and Number is not initialized. - a := &Access{ - LastAccessed: time.Now(), - } - hasZeroA := HasZero(a) - - // Name and Number is initialized. - b := &Access{ - Name: "Fatih", - LastAccessed: time.Now(), - Number: 12345, - } - hasZeroB := HasZero(b) - - fmt.Printf("%#v\n", hasZeroA) - fmt.Printf("%#v\n", hasZeroB) - // Output: - // true - // false -} diff --git a/Godeps/_workspace/src/github.com/fatih/structs/structs_test.go b/Godeps/_workspace/src/github.com/fatih/structs/structs_test.go deleted file mode 100644 index 14e3de72f..000000000 --- a/Godeps/_workspace/src/github.com/fatih/structs/structs_test.go +++ /dev/null @@ -1,898 +0,0 @@ -package structs - -import ( - "fmt" - "reflect" - "testing" - "time" -) - -func TestMapNonStruct(t *testing.T) { - foo := []string{"foo"} - - defer func() { - err := recover() - if err == nil { - t.Error("Passing a non struct into Map should panic") - } - }() - - // this should panic. We are going to recover and and test it - _ = Map(foo) -} - -func TestStructIndexes(t *testing.T) { - type C struct { - something int - Props map[string]interface{} - } - - defer func() { - err := recover() - if err != nil { - fmt.Printf("err %+v\n", err) - t.Error("Using mixed indexes should not panic") - } - }() - - // They should not panic - _ = Map(&C{}) - _ = Fields(&C{}) - _ = Values(&C{}) - _ = IsZero(&C{}) - _ = HasZero(&C{}) -} - -func TestMap(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - a := Map(T) - - if typ := reflect.TypeOf(a).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - // we have three fields - if len(a) != 3 { - t.Errorf("Map should return a map of len 3, got: %d", len(a)) - } - - inMap := func(val interface{}) bool { - for _, v := range a { - if reflect.DeepEqual(v, val) { - return true - } - } - - return false - } - - for _, val := range []interface{}{"a-value", 2, true} { - if !inMap(val) { - t.Errorf("Map should have the value %v", val) - } - } - -} - -func TestMap_Tag(t *testing.T) { - var T = struct { - A string `structs:"x"` - B int `structs:"y"` - C bool `structs:"z"` - }{ - A: "a-value", - B: 2, - C: true, - } - - a := Map(T) - - inMap := func(key interface{}) bool { - for k := range a { - if reflect.DeepEqual(k, key) { - return true - } - } - return false - } - - for _, key := range []string{"x", "y", "z"} { - if !inMap(key) { - t.Errorf("Map should have the key %v", key) - } - } - -} - -func TestMap_CustomTag(t *testing.T) { - var T = struct { - A string `json:"x"` - B int `json:"y"` - C bool `json:"z"` - D struct { - E string `json:"jkl"` - } `json:"nested"` - }{ - A: "a-value", - B: 2, - C: true, - } - T.D.E = "e-value" - - s := New(T) - s.TagName = "json" - - a := s.Map() - - inMap := func(key interface{}) bool { - for k := range a { - if reflect.DeepEqual(k, key) { - return true - } - } - return false - } - - for _, key := range []string{"x", "y", "z"} { - if !inMap(key) { - t.Errorf("Map should have the key %v", key) - } - } - - nested, ok := a["nested"].(map[string]interface{}) - if !ok { - t.Fatalf("Map should contain the D field that is tagged as 'nested'") - } - - e, ok := nested["jkl"].(string) - if !ok { - t.Fatalf("Map should contain the D.E field that is tagged as 'jkl'") - } - - if e != "e-value" { - t.Errorf("D.E field should be equal to 'e-value', got: '%v'", e) - } - -} - -func TestMap_MultipleCustomTag(t *testing.T) { - var A = struct { - X string `aa:"ax"` - }{"a_value"} - - aStruct := New(A) - aStruct.TagName = "aa" - - var B = struct { - X string `bb:"bx"` - }{"b_value"} - - bStruct := New(B) - bStruct.TagName = "bb" - - a, b := aStruct.Map(), bStruct.Map() - if !reflect.DeepEqual(a, map[string]interface{}{"ax": "a_value"}) { - t.Error("Map should have field ax with value a_value") - } - - if !reflect.DeepEqual(b, map[string]interface{}{"bx": "b_value"}) { - t.Error("Map should have field bx with value b_value") - } -} - -func TestMap_OmitEmpty(t *testing.T) { - type A struct { - Name string - Value string `structs:",omitempty"` - Time time.Time `structs:",omitempty"` - } - a := A{} - - m := Map(a) - - _, ok := m["Value"].(map[string]interface{}) - if ok { - t.Error("Map should not contain the Value field that is tagged as omitempty") - } - - _, ok = m["Time"].(map[string]interface{}) - if ok { - t.Error("Map should not contain the Time field that is tagged as omitempty") - } -} - -func TestMap_OmitNested(t *testing.T) { - type A struct { - Name string - Value string - Time time.Time `structs:",omitnested"` - } - a := A{Time: time.Now()} - - type B struct { - Desc string - A A - } - b := &B{A: a} - - m := Map(b) - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Map nested structs is not available in the map") - } - - // should not happen - if _, ok := in["Time"].(map[string]interface{}); ok { - t.Error("Map nested struct should omit recursiving parsing of Time") - } - - if _, ok := in["Time"].(time.Time); !ok { - t.Error("Map nested struct should stop parsing of Time at is current value") - } -} - -func TestMap_Nested(t *testing.T) { - type A struct { - Name string - } - a := &A{Name: "example"} - - type B struct { - A *A - } - b := &B{A: a} - - m := Map(b) - - if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Map nested structs is not available in the map") - } - - if name := in["Name"].(string); name != "example" { - t.Errorf("Map nested struct's name field should give example, got: %s", name) - } -} - -func TestMap_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := &A{Name: "example"} - - type B struct { - *A - } - b := &B{} - b.A = a - - m := Map(b) - - if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { - t.Errorf("Map should return a map type, got: %v", typ) - } - - in, ok := m["A"].(map[string]interface{}) - if !ok { - t.Error("Embedded structs is not available in the map") - } - - if name := in["Name"].(string); name != "example" { - t.Errorf("Embedded A struct's Name field should give example, got: %s", name) - } -} - -func TestStruct(t *testing.T) { - var T = struct{}{} - - if !IsStruct(T) { - t.Errorf("T should be a struct, got: %T", T) - } - - if !IsStruct(&T) { - t.Errorf("T should be a struct, got: %T", T) - } - -} - -func TestValues(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Values(T) - - if typ := reflect.TypeOf(s).Kind(); typ != reflect.Slice { - t.Errorf("Values should return a slice type, got: %v", typ) - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"a-value", 2, true} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_OmitEmpty(t *testing.T) { - type A struct { - Name string - Value int `structs:",omitempty"` - } - - a := A{Name: "example"} - s := Values(a) - - if len(s) != 1 { - t.Errorf("Values of omitted empty fields should be not counted") - } - - if s[0].(string) != "example" { - t.Errorf("Values of omitted empty fields should left the value example") - } -} - -func TestValues_OmitNested(t *testing.T) { - type A struct { - Name string - Value int - } - - a := A{ - Name: "example", - Value: 123, - } - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - s := Values(b) - - if len(s) != 2 { - t.Errorf("Values of omitted nested struct should be not counted") - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{123, a} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_Nested(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - s := Values(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"example", 123} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestValues_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - s := Values(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"example", 123} { - if !inSlice(val) { - t.Errorf("Values should have the value %v", val) - } - } -} - -func TestNames(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Names(T) - - if len(s) != 3 { - t.Errorf("Names should return a slice of len 3, got: %d", len(s)) - } - - inSlice := func(val string) bool { - for _, v := range s { - if reflect.DeepEqual(v, val) { - return true - } - } - return false - } - - for _, val := range []string{"A", "B", "C"} { - if !inSlice(val) { - t.Errorf("Names should have the value %v", val) - } - } -} - -func TestFields(t *testing.T) { - var T = struct { - A string - B int - C bool - }{ - A: "a-value", - B: 2, - C: true, - } - - s := Fields(T) - - if len(s) != 3 { - t.Errorf("Fields should return a slice of len 3, got: %d", len(s)) - } - - inSlice := func(val string) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []string{"A", "B", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestFields_OmitNested(t *testing.T) { - type A struct { - Name string - Enabled bool - } - a := A{Name: "example"} - - type B struct { - A A - C int - Value string `structs:"-"` - Number int - } - b := &B{A: a, C: 123} - - s := Fields(b) - - if len(s) != 3 { - t.Errorf("Fields should omit nested struct. Expecting 2 got: %d", len(s)) - } - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"A", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestFields_Anonymous(t *testing.T) { - type A struct { - Name string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - s := Fields(b) - - inSlice := func(val interface{}) bool { - for _, v := range s { - if reflect.DeepEqual(v.Name(), val) { - return true - } - } - return false - } - - for _, val := range []interface{}{"A", "C"} { - if !inSlice(val) { - t.Errorf("Fields should have the value %v", val) - } - } -} - -func TestIsZero(t *testing.T) { - var T = struct { - A string - B int - C bool `structs:"-"` - D []string - }{} - - ok := IsZero(T) - if !ok { - t.Error("IsZero should return true because none of the fields are initialized.") - } - - var X = struct { - A string - F *bool - }{ - A: "a-value", - } - - ok = IsZero(X) - if ok { - t.Error("IsZero should return false because A is initialized") - } - - var Y = struct { - A string - B int - }{ - A: "a-value", - B: 123, - } - - ok = IsZero(Y) - if ok { - t.Error("IsZero should return false because A and B is initialized") - } -} - -func TestIsZero_OmitNested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{A: aZero} - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } - -} - -func TestIsZero_Nested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{A: aZero} - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } - -} - -func TestIsZero_Anonymous(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - ok := IsZero(b) - if ok { - t.Error("IsZero should return false because A, B and C are initialized") - } - - aZero := A{} - bZero := &B{} - bZero.A = aZero - - ok = IsZero(bZero) - if !ok { - t.Error("IsZero should return true because neither A nor B is initialized") - } -} - -func TestHasZero(t *testing.T) { - var T = struct { - A string - B int - C bool `structs:"-"` - D []string - }{ - A: "a-value", - B: 2, - } - - ok := HasZero(T) - if !ok { - t.Error("HasZero should return true because A and B are initialized.") - } - - var X = struct { - A string - F *bool - }{ - A: "a-value", - } - - ok = HasZero(X) - if !ok { - t.Error("HasZero should return true because A is initialized") - } - - var Y = struct { - A string - B int - }{ - A: "a-value", - B: 123, - } - - ok = HasZero(Y) - if ok { - t.Error("HasZero should return false because A and B is initialized") - } -} - -func TestHasZero_OmitNested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A `structs:",omitnested"` - C int - } - b := &B{A: a, C: 123} - - // Because the Field A inside B is omitted HasZero should return false - // because it will stop iterating deeper andnot going to lookup for D - ok := HasZero(b) - if ok { - t.Error("HasZero should return false because A and C are initialized") - } -} - -func TestHasZero_Nested(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A A - C int - } - b := &B{A: a, C: 123} - - ok := HasZero(b) - if !ok { - t.Error("HasZero should return true because D is not initialized") - } -} - -func TestHasZero_Anonymous(t *testing.T) { - type A struct { - Name string - D string - } - a := A{Name: "example"} - - type B struct { - A - C int - } - b := &B{C: 123} - b.A = a - - ok := HasZero(b) - if !ok { - t.Error("HasZero should return false because D is not initialized") - } -} - -func TestName(t *testing.T) { - type Foo struct { - A string - B bool - } - f := &Foo{} - - n := Name(f) - if n != "Foo" { - t.Errorf("Name should return Foo, got: %s", n) - } - - unnamed := struct{ Name string }{Name: "Cihangir"} - m := Name(unnamed) - if m != "" { - t.Errorf("Name should return empty string for unnamed struct, got: %s", n) - } - - defer func() { - err := recover() - if err == nil { - t.Error("Name should panic if a non struct is passed") - } - }() - - Name([]string{}) -} - -func TestNestedNilPointer(t *testing.T) { - type Collar struct { - Engraving string - } - - type Dog struct { - Name string - Collar *Collar - } - - type Person struct { - Name string - Dog *Dog - } - - person := &Person{ - Name: "John", - } - - personWithDog := &Person{ - Name: "Ron", - Dog: &Dog{ - Name: "Rover", - }, - } - - personWithDogWithCollar := &Person{ - Name: "Kon", - Dog: &Dog{ - Name: "Ruffles", - Collar: &Collar{ - Engraving: "If lost, call Kon", - }, - }, - } - - defer func() { - err := recover() - if err != nil { - fmt.Printf("err %+v\n", err) - t.Error("Internal nil pointer should not panic") - } - }() - - _ = Map(person) // Panics - _ = Map(personWithDog) // Panics - _ = Map(personWithDogWithCollar) // Doesn't panic -} diff --git a/Godeps/_workspace/src/github.com/fatih/structs/tags_test.go b/Godeps/_workspace/src/github.com/fatih/structs/tags_test.go deleted file mode 100644 index 5d12724f1..000000000 --- a/Godeps/_workspace/src/github.com/fatih/structs/tags_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package structs - -import "testing" - -func TestParseTag_Name(t *testing.T) { - tags := []struct { - tag string - has bool - }{ - {"", false}, - {"name", true}, - {"name,opt", true}, - {"name , opt, opt2", false}, // has a single whitespace - {", opt, opt2", false}, - } - - for _, tag := range tags { - name, _ := parseTag(tag.tag) - - if (name != "name") && tag.has { - t.Errorf("Parse tag should return name: %#v", tag) - } - } -} - -func TestParseTag_Opts(t *testing.T) { - tags := []struct { - opts string - has bool - }{ - {"name", false}, - {"name,opt", true}, - {"name , opt, opt2", false}, // has a single whitespace - {",opt, opt2", true}, - {", opt3, opt4", false}, - } - - // search for "opt" - for _, tag := range tags { - _, opts := parseTag(tag.opts) - - if opts.Has("opt") != tag.has { - t.Errorf("Tag opts should have opt: %#v", tag) - } - } -} diff --git a/Godeps/_workspace/src/github.com/ghodss/yaml/yaml_test.go b/Godeps/_workspace/src/github.com/ghodss/yaml/yaml_test.go deleted file mode 100644 index 0ae0954e9..000000000 --- a/Godeps/_workspace/src/github.com/ghodss/yaml/yaml_test.go +++ /dev/null @@ -1,271 +0,0 @@ -package yaml - -import ( - "fmt" - "math" - "reflect" - "strconv" - "testing" -) - -type MarshalTest struct { - A string - B int64 - // Would like to test float64, but it's not supported in go-yaml. - // (See https://github.com/go-yaml/yaml/issues/83.) - C float32 -} - -func TestMarshal(t *testing.T) { - f32String := strconv.FormatFloat(math.MaxFloat32, 'g', -1, 32) - s := MarshalTest{"a", math.MaxInt64, math.MaxFloat32} - e := []byte(fmt.Sprintf("A: a\nB: %d\nC: %s\n", math.MaxInt64, f32String)) - - y, err := Marshal(s) - if err != nil { - t.Errorf("error marshaling YAML: %v", err) - } - - if !reflect.DeepEqual(y, e) { - t.Errorf("marshal YAML was unsuccessful, expected: %#v, got: %#v", - string(e), string(y)) - } -} - -type UnmarshalString struct { - A string - True string -} - -type UnmarshalStringMap struct { - A map[string]string -} - -type UnmarshalNestedString struct { - A NestedString -} - -type NestedString struct { - A string -} - -type UnmarshalSlice struct { - A []NestedSlice -} - -type NestedSlice struct { - B string - C *string -} - -func TestUnmarshal(t *testing.T) { - y := []byte("a: 1") - s1 := UnmarshalString{} - e1 := UnmarshalString{A: "1"} - unmarshal(t, y, &s1, &e1) - - y = []byte("a: true") - s1 = UnmarshalString{} - e1 = UnmarshalString{A: "true"} - unmarshal(t, y, &s1, &e1) - - y = []byte("true: 1") - s1 = UnmarshalString{} - e1 = UnmarshalString{True: "1"} - unmarshal(t, y, &s1, &e1) - - y = []byte("a:\n a: 1") - s2 := UnmarshalNestedString{} - e2 := UnmarshalNestedString{NestedString{"1"}} - unmarshal(t, y, &s2, &e2) - - y = []byte("a:\n - b: abc\n c: def\n - b: 123\n c: 456\n") - s3 := UnmarshalSlice{} - e3 := UnmarshalSlice{[]NestedSlice{NestedSlice{"abc", strPtr("def")}, NestedSlice{"123", strPtr("456")}}} - unmarshal(t, y, &s3, &e3) - - y = []byte("a:\n b: 1") - s4 := UnmarshalStringMap{} - e4 := UnmarshalStringMap{map[string]string{"b": "1"}} - unmarshal(t, y, &s4, &e4) -} - -func unmarshal(t *testing.T, y []byte, s, e interface{}) { - err := Unmarshal(y, s) - if err != nil { - t.Errorf("error unmarshaling YAML: %v", err) - } - - if !reflect.DeepEqual(s, e) { - t.Errorf("unmarshal YAML was unsuccessful, expected: %+#v, got: %+#v", - e, s) - } -} - -type Case struct { - input string - output string - // By default we test that reversing the output == input. But if there is a - // difference in the reversed output, you can optionally specify it here. - reverse *string -} - -type RunType int - -const ( - RunTypeJSONToYAML RunType = iota - RunTypeYAMLToJSON -) - -func TestJSONToYAML(t *testing.T) { - cases := []Case{ - { - `{"t":"a"}`, - "t: a\n", - nil, - }, { - `{"t":null}`, - "t: null\n", - nil, - }, - } - - runCases(t, RunTypeJSONToYAML, cases) -} - -func TestYAMLToJSON(t *testing.T) { - cases := []Case{ - { - "t: a\n", - `{"t":"a"}`, - nil, - }, { - "t: \n", - `{"t":null}`, - strPtr("t: null\n"), - }, { - "t: null\n", - `{"t":null}`, - nil, - }, { - "1: a\n", - `{"1":"a"}`, - strPtr("\"1\": a\n"), - }, { - "1000000000000000000000000000000000000: a\n", - `{"1e+36":"a"}`, - strPtr("\"1e+36\": a\n"), - }, { - "1e+36: a\n", - `{"1e+36":"a"}`, - strPtr("\"1e+36\": a\n"), - }, { - "\"1e+36\": a\n", - `{"1e+36":"a"}`, - nil, - }, { - "\"1.2\": a\n", - `{"1.2":"a"}`, - nil, - }, { - "- t: a\n", - `[{"t":"a"}]`, - nil, - }, { - "- t: a\n" + - "- t:\n" + - " b: 1\n" + - " c: 2\n", - `[{"t":"a"},{"t":{"b":1,"c":2}}]`, - nil, - }, { - `[{t: a}, {t: {b: 1, c: 2}}]`, - `[{"t":"a"},{"t":{"b":1,"c":2}}]`, - strPtr("- t: a\n" + - "- t:\n" + - " b: 1\n" + - " c: 2\n"), - }, { - "- t: \n", - `[{"t":null}]`, - strPtr("- t: null\n"), - }, { - "- t: null\n", - `[{"t":null}]`, - nil, - }, - } - - // Cases that should produce errors. - _ = []Case{ - { - "~: a", - `{"null":"a"}`, - nil, - }, { - "a: !!binary gIGC\n", - "{\"a\":\"\x80\x81\x82\"}", - nil, - }, - } - - runCases(t, RunTypeYAMLToJSON, cases) -} - -func runCases(t *testing.T, runType RunType, cases []Case) { - var f func([]byte) ([]byte, error) - var invF func([]byte) ([]byte, error) - var msg string - var invMsg string - if runType == RunTypeJSONToYAML { - f = JSONToYAML - invF = YAMLToJSON - msg = "JSON to YAML" - invMsg = "YAML back to JSON" - } else { - f = YAMLToJSON - invF = JSONToYAML - msg = "YAML to JSON" - invMsg = "JSON back to YAML" - } - - for _, c := range cases { - // Convert the string. - t.Logf("converting %s\n", c.input) - output, err := f([]byte(c.input)) - if err != nil { - t.Errorf("Failed to convert %s, input: `%s`, err: %v", msg, c.input, err) - } - - // Check it against the expected output. - if string(output) != c.output { - t.Errorf("Failed to convert %s, input: `%s`, expected `%s`, got `%s`", - msg, c.input, c.output, string(output)) - } - - // Set the string that we will compare the reversed output to. - reverse := c.input - // If a special reverse string was specified, use that instead. - if c.reverse != nil { - reverse = *c.reverse - } - - // Reverse the output. - input, err := invF(output) - if err != nil { - t.Errorf("Failed to convert %s, input: `%s`, err: %v", invMsg, string(output), err) - } - - // Check the reverse is equal to the input (or to *c.reverse). - if string(input) != reverse { - t.Errorf("Failed to convert %s, input: `%s`, expected `%s`, got `%s`", - invMsg, string(output), reverse, string(input)) - } - } - -} - -// To be able to easily fill in the *Case.reverse string above. -func strPtr(s string) *string { - return &s -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go deleted file mode 100644 index dc7633172..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/all_test.go +++ /dev/null @@ -1,2169 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "math/rand" - "reflect" - "runtime/debug" - "strings" - "testing" - "time" - - . "github.com/gogo/protobuf/proto" - . "github.com/gogo/protobuf/proto/testdata" -) - -var globalO *Buffer - -func old() *Buffer { - if globalO == nil { - globalO = NewBuffer(nil) - } - globalO.Reset() - return globalO -} - -func equalbytes(b1, b2 []byte, t *testing.T) { - if len(b1) != len(b2) { - t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) - return - } - for i := 0; i < len(b1); i++ { - if b1[i] != b2[i] { - t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) - } - } -} - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} - -func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { - data := b.Bytes() - ld := len(data) - ls := len(s) / 2 - - fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) - - // find the interesting spot - n - n := ls - if ld < ls { - n = ld - } - j := 0 - for i := 0; i < n; i++ { - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - if data[i] == bs { - continue - } - n = i - break - } - l := n - 10 - if l < 0 { - l = 0 - } - h := n + 10 - - // find the interesting spot - n - fmt.Printf("is[%d]:", l) - for i := l; i < h; i++ { - if i >= ld { - fmt.Printf(" --") - continue - } - fmt.Printf(" %.2x", data[i]) - } - fmt.Printf("\n") - - fmt.Printf("sb[%d]:", l) - for i := l; i < h; i++ { - if i >= ls { - fmt.Printf(" --") - continue - } - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - fmt.Printf(" %.2x", bs) - } - fmt.Printf("\n") - - t.Fail() - - // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) - // Print the output in a partially-decoded format; can - // be helpful when updating the test. It produces the output - // that is pasted, with minor edits, into the argument to verify(). - // data := b.Bytes() - // nesting := 0 - // for b.Len() > 0 { - // start := len(data) - b.Len() - // var u uint64 - // u, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // wire := u & 0x7 - // tag := u >> 3 - // switch wire { - // case WireVarint: - // v, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed32: - // v, err := DecodeFixed32(b) - // if err != nil { - // fmt.Printf("decode error on fixed32:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed64: - // v, err := DecodeFixed64(b) - // if err != nil { - // fmt.Printf("decode error on fixed64:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireBytes: - // nb, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // after_tag := len(data) - b.Len() - // str := make([]byte, nb) - // _, err = b.Read(str) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", - // data[start:after_tag], str, tag, wire) - // case WireStartGroup: - // nesting++ - // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // case WireEndGroup: - // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // nesting-- - // default: - // fmt.Printf("unrecognized wire type %d\n", wire) - // return - // } - // } -} - -func hex(c uint8) uint8 { - if '0' <= c && c <= '9' { - return c - '0' - } - if 'a' <= c && c <= 'f' { - return 10 + c - 'a' - } - if 'A' <= c && c <= 'F' { - return 10 + c - 'A' - } - return 0 -} - -func equal(b []byte, s string, t *testing.T) bool { - if 2*len(b) != len(s) { - // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) - fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) - return false - } - for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { - x := hex(s[j])*16 + hex(s[j+1]) - if b[i] != x { - // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) - fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) - return false - } - } - return true -} - -func overify(t *testing.T, pb *GoTest, expected string) { - o := old() - err := o.Marshal(pb) - if err != nil { - fmt.Printf("overify marshal-1 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 1", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = o.Unmarshal(pbd) - if err != nil { - t.Fatalf("overify unmarshal err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - o.Reset() - err = o.Marshal(pbd) - if err != nil { - t.Errorf("overify marshal-2 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 2", o.Bytes()) - t.Fatalf("string = %s", expected) - } -} - -// Simple tests for numeric encode/decode primitives (varint, etc.) -func TestNumericPrimitives(t *testing.T) { - for i := uint64(0); i < 1e6; i += 111 { - o := old() - if o.EncodeVarint(i) != nil { - t.Error("EncodeVarint") - break - } - x, e := o.DecodeVarint() - if e != nil { - t.Fatal("DecodeVarint") - } - if x != i { - t.Fatal("varint decode fail:", i, x) - } - - o = old() - if o.EncodeFixed32(i) != nil { - t.Fatal("encFixed32") - } - x, e = o.DecodeFixed32() - if e != nil { - t.Fatal("decFixed32") - } - if x != i { - t.Fatal("fixed32 decode fail:", i, x) - } - - o = old() - if o.EncodeFixed64(i*1234567) != nil { - t.Error("encFixed64") - break - } - x, e = o.DecodeFixed64() - if e != nil { - t.Error("decFixed64") - break - } - if x != i*1234567 { - t.Error("fixed64 decode fail:", i*1234567, x) - break - } - - o = old() - i32 := int32(i - 12345) - if o.EncodeZigzag32(uint64(i32)) != nil { - t.Fatal("EncodeZigzag32") - } - x, e = o.DecodeZigzag32() - if e != nil { - t.Fatal("DecodeZigzag32") - } - if x != uint64(uint32(i32)) { - t.Fatal("zigzag32 decode fail:", i32, x) - } - - o = old() - i64 := int64(i - 12345) - if o.EncodeZigzag64(uint64(i64)) != nil { - t.Fatal("EncodeZigzag64") - } - x, e = o.DecodeZigzag64() - if e != nil { - t.Fatal("DecodeZigzag64") - } - if x != uint64(i64) { - t.Fatal("zigzag64 decode fail:", i64, x) - } - } -} - -// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. -type fakeMarshaler struct { - b []byte - err error -} - -func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } -func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } -func (f *fakeMarshaler) ProtoMessage() {} -func (f *fakeMarshaler) Reset() {} - -type msgWithFakeMarshaler struct { - M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` -} - -func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } -func (m *msgWithFakeMarshaler) ProtoMessage() {} -func (m *msgWithFakeMarshaler) Reset() {} - -// Simple tests for proto messages that implement the Marshaler interface. -func TestMarshalerEncoding(t *testing.T) { - tests := []struct { - name string - m Message - want []byte - wantErr error - }{ - { - name: "Marshaler that fails", - m: &fakeMarshaler{ - err: errors.New("some marshal err"), - b: []byte{5, 6, 7}, - }, - // Since there's an error, nothing should be written to buffer. - want: nil, - wantErr: errors.New("some marshal err"), - }, - { - name: "Marshaler that fails with RequiredNotSetError", - m: &msgWithFakeMarshaler{ - M: &fakeMarshaler{ - err: &RequiredNotSetError{}, - b: []byte{5, 6, 7}, - }, - }, - // Since there's an error that can be continued after, - // the buffer should be written. - want: []byte{ - 10, 3, // for &msgWithFakeMarshaler - 5, 6, 7, // for &fakeMarshaler - }, - wantErr: &RequiredNotSetError{}, - }, - { - name: "Marshaler that succeeds", - m: &fakeMarshaler{ - b: []byte{0, 1, 2, 3, 4, 127, 255}, - }, - want: []byte{0, 1, 2, 3, 4, 127, 255}, - wantErr: nil, - }, - } - for _, test := range tests { - b := NewBuffer(nil) - err := b.Marshal(test.m) - if _, ok := err.(*RequiredNotSetError); ok { - // We're not in package proto, so we can only assert the type in this case. - err = &RequiredNotSetError{} - } - if !reflect.DeepEqual(test.wantErr, err) { - t.Errorf("%s: got err %v wanted %v", test.name, err, test.wantErr) - } - if !reflect.DeepEqual(test.want, b.Bytes()) { - t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) - } - } -} - -// Simple tests for bytes -func TestBytesPrimitives(t *testing.T) { - o := old() - bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} - if o.EncodeRawBytes(bytes) != nil { - t.Error("EncodeRawBytes") - } - decb, e := o.DecodeRawBytes(false) - if e != nil { - t.Error("DecodeRawBytes") - } - equalbytes(bytes, decb, t) -} - -// Simple tests for strings -func TestStringPrimitives(t *testing.T) { - o := old() - s := "now is the time" - if o.EncodeStringBytes(s) != nil { - t.Error("enc_string") - } - decs, e := o.DecodeStringBytes() - if e != nil { - t.Error("dec_string") - } - if s != decs { - t.Error("string encode/decode fail:", s, decs) - } -} - -// Do we catch the "required bit not set" case? -func TestRequiredBit(t *testing.T) { - o := old() - pb := new(GoTest) - err := o.Marshal(pb) - if err == nil { - t.Error("did not catch missing required fields") - } else if strings.Index(err.Error(), "Kind") < 0 { - t.Error("wrong error type:", err) - } -} - -// Check that all fields are nil. -// Clearly silly, and a residue from a more interesting test with an earlier, -// different initialization property, but it once caught a compiler bug so -// it lives. -func checkInitialized(pb *GoTest, t *testing.T) { - if pb.F_BoolDefaulted != nil { - t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) - } - if pb.F_Int32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) - } - if pb.F_Int64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) - } - if pb.F_Fixed32Defaulted != nil { - t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) - } - if pb.F_Fixed64Defaulted != nil { - t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) - } - if pb.F_Uint32Defaulted != nil { - t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) - } - if pb.F_Uint64Defaulted != nil { - t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) - } - if pb.F_FloatDefaulted != nil { - t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) - } - if pb.F_DoubleDefaulted != nil { - t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) - } - if pb.F_StringDefaulted != nil { - t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) - } - if pb.F_BytesDefaulted != nil { - t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) - } - if pb.F_Sint32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) - } - if pb.F_Sint64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) - } -} - -// Does Reset() reset? -func TestReset(t *testing.T) { - pb := initGoTest(true) - // muck with some values - pb.F_BoolDefaulted = Bool(false) - pb.F_Int32Defaulted = Int32(237) - pb.F_Int64Defaulted = Int64(12346) - pb.F_Fixed32Defaulted = Uint32(32000) - pb.F_Fixed64Defaulted = Uint64(666) - pb.F_Uint32Defaulted = Uint32(323232) - pb.F_Uint64Defaulted = nil - pb.F_FloatDefaulted = nil - pb.F_DoubleDefaulted = Float64(0) - pb.F_StringDefaulted = String("gotcha") - pb.F_BytesDefaulted = []byte("asdfasdf") - pb.F_Sint32Defaulted = Int32(123) - pb.F_Sint64Defaulted = Int64(789) - pb.Reset() - checkInitialized(pb, t) -} - -// All required fields set, no defaults provided. -func TestEncodeDecode1(t *testing.T) { - pb := initGoTest(false) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 0x20 - "714000000000000000"+ // field 14, encoding 1, value 0x40 - "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 - "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" - "b304"+ // field 70, encoding 3, start group - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // field 70, encoding 4, end group - "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f") // field 103, encoding 0, 0x7f zigzag64 -} - -// All required fields set, defaults provided. -func TestEncodeDecode2(t *testing.T) { - pb := initGoTest(true) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All default fields set to their default value by hand -func TestEncodeDecode3(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolDefaulted = Bool(true) - pb.F_Int32Defaulted = Int32(32) - pb.F_Int64Defaulted = Int64(64) - pb.F_Fixed32Defaulted = Uint32(320) - pb.F_Fixed64Defaulted = Uint64(640) - pb.F_Uint32Defaulted = Uint32(3200) - pb.F_Uint64Defaulted = Uint64(6400) - pb.F_FloatDefaulted = Float32(314159) - pb.F_DoubleDefaulted = Float64(271828) - pb.F_StringDefaulted = String("hello, \"world!\"\n") - pb.F_BytesDefaulted = []byte("Bignose") - pb.F_Sint32Defaulted = Int32(-32) - pb.F_Sint64Defaulted = Int64(-64) - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all non-defaulted optional fields have values. -func TestEncodeDecode4(t *testing.T) { - pb := initGoTest(true) - pb.Table = String("hello") - pb.Param = Int32(7) - pb.OptionalField = initGoTestField() - pb.F_BoolOptional = Bool(true) - pb.F_Int32Optional = Int32(32) - pb.F_Int64Optional = Int64(64) - pb.F_Fixed32Optional = Uint32(3232) - pb.F_Fixed64Optional = Uint64(6464) - pb.F_Uint32Optional = Uint32(323232) - pb.F_Uint64Optional = Uint64(646464) - pb.F_FloatOptional = Float32(32.) - pb.F_DoubleOptional = Float64(64.) - pb.F_StringOptional = String("hello") - pb.F_BytesOptional = []byte("Bignose") - pb.F_Sint32Optional = Int32(-32) - pb.F_Sint64Optional = Int64(-64) - pb.Optionalgroup = initGoTest_OptionalGroup() - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" - "1807"+ // field 3, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "f00101"+ // field 30, encoding 0, value 1 - "f80120"+ // field 31, encoding 0, value 32 - "800240"+ // field 32, encoding 0, value 64 - "8d02a00c0000"+ // field 33, encoding 5, value 3232 - "91024019000000000000"+ // field 34, encoding 1, value 6464 - "9802a0dd13"+ // field 35, encoding 0, value 323232 - "a002c0ba27"+ // field 36, encoding 0, value 646464 - "ad0200000042"+ // field 37, encoding 5, value 32.0 - "b1020000000000005040"+ // field 38, encoding 1, value 64.0 - "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "d305"+ // start group field 90 level 1 - "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" - "d405"+ // end group field 90 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" - "f0123f"+ // field 302, encoding 0, value 63 - "f8127f"+ // field 303, encoding 0, value 127 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestEncodeDecode5(t *testing.T) { - pb := initGoTest(true) - pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} - pb.F_BoolRepeated = []bool{false, true} - pb.F_Int32Repeated = []int32{32, 33} - pb.F_Int64Repeated = []int64{64, 65} - pb.F_Fixed32Repeated = []uint32{3232, 3333} - pb.F_Fixed64Repeated = []uint64{6464, 6565} - pb.F_Uint32Repeated = []uint32{323232, 333333} - pb.F_Uint64Repeated = []uint64{646464, 656565} - pb.F_FloatRepeated = []float32{32., 33.} - pb.F_DoubleRepeated = []float64{64., 65.} - pb.F_StringRepeated = []string{"hello", "sailor"} - pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} - pb.F_Sint32Repeated = []int32{32, -32} - pb.F_Sint64Repeated = []int64{64, -64} - pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "a00100"+ // field 20, encoding 0, value 0 - "a00101"+ // field 20, encoding 0, value 1 - "a80120"+ // field 21, encoding 0, value 32 - "a80121"+ // field 21, encoding 0, value 33 - "b00140"+ // field 22, encoding 0, value 64 - "b00141"+ // field 22, encoding 0, value 65 - "bd01a00c0000"+ // field 23, encoding 5, value 3232 - "bd01050d0000"+ // field 23, encoding 5, value 3333 - "c1014019000000000000"+ // field 24, encoding 1, value 6464 - "c101a519000000000000"+ // field 24, encoding 1, value 6565 - "c801a0dd13"+ // field 25, encoding 0, value 323232 - "c80195ac14"+ // field 25, encoding 0, value 333333 - "d001c0ba27"+ // field 26, encoding 0, value 646464 - "d001b58928"+ // field 26, encoding 0, value 656565 - "dd0100000042"+ // field 27, encoding 5, value 32.0 - "dd0100000442"+ // field 27, encoding 5, value 33.0 - "e1010000000000005040"+ // field 28, encoding 1, value 64.0 - "e1010000000000405040"+ // field 28, encoding 1, value 65.0 - "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" - "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ca0c03"+"626967"+ // field 201, encoding 2, string "big" - "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" - "d00c40"+ // field 202, encoding 0, value 32 - "d00c3f"+ // field 202, encoding 0, value -32 - "d80c8001"+ // field 203, encoding 0, value 64 - "d80c7f"+ // field 203, encoding 0, value -64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, all packed repeated fields given two values. -func TestEncodeDecode6(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolRepeatedPacked = []bool{false, true} - pb.F_Int32RepeatedPacked = []int32{32, 33} - pb.F_Int64RepeatedPacked = []int64{64, 65} - pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} - pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} - pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} - pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} - pb.F_FloatRepeatedPacked = []float32{32., 33.} - pb.F_DoubleRepeatedPacked = []float64{64., 65.} - pb.F_Sint32RepeatedPacked = []int32{32, -32} - pb.F_Sint64RepeatedPacked = []int64{64, -64} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 - "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 - "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 - "aa0308"+ // field 53, encoding 2, 8 bytes - "a00c0000050d0000"+ // value 3232, value 3333 - "b20310"+ // field 54, encoding 2, 16 bytes - "4019000000000000a519000000000000"+ // value 6464, value 6565 - "ba0306"+ // field 55, encoding 2, 6 bytes - "a0dd1395ac14"+ // value 323232, value 333333 - "c20306"+ // field 56, encoding 2, 6 bytes - "c0ba27b58928"+ // value 646464, value 656565 - "ca0308"+ // field 57, encoding 2, 8 bytes - "0000004200000442"+ // value 32.0, value 33.0 - "d20310"+ // field 58, encoding 2, 16 bytes - "00000000000050400000000000405040"+ // value 64.0, value 65.0 - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "b21f02"+ // field 502, encoding 2, 2 bytes - "403f"+ // value 32, value -32 - "ba1f03"+ // field 503, encoding 2, 3 bytes - "80017f") // value 64, value -64 -} - -// Test that we can encode empty bytes fields. -func TestEncodeDecodeBytes1(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRequired = []byte{} - pb.F_BytesRepeated = [][]byte{{}} - pb.F_BytesOptional = []byte{} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { - t.Error("required empty bytes field is incorrect") - } - if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { - t.Error("repeated empty bytes field is incorrect") - } - if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { - t.Error("optional empty bytes field is incorrect") - } -} - -// Test that we encode nil-valued fields of a repeated bytes field correctly. -// Since entries in a repeated field cannot be nil, nil must mean empty value. -func TestEncodeDecodeBytes2(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRepeated = [][]byte{nil} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { - t.Error("Unexpected value for repeated bytes field") - } -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestSkippingUnrecognizedFields(t *testing.T) { - o := old() - pb := initGoTestField() - - // Marshal it normally. - o.Marshal(pb) - - // Now new a GoSkipTest record. - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - // Marshal it into same buffer. - o.Marshal(skip) - - pbd := new(GoTestField) - o.Unmarshal(pbd) - - // The __unrecognized field should be a marshaling of GoSkipTest - skipd := new(GoSkipTest) - - o.SetBuf(pbd.XXX_unrecognized) - o.Unmarshal(skipd) - - if *skipd.SkipInt32 != *skip.SkipInt32 { - t.Error("skip int32", skipd.SkipInt32) - } - if *skipd.SkipFixed32 != *skip.SkipFixed32 { - t.Error("skip fixed32", skipd.SkipFixed32) - } - if *skipd.SkipFixed64 != *skip.SkipFixed64 { - t.Error("skip fixed64", skipd.SkipFixed64) - } - if *skipd.SkipString != *skip.SkipString { - t.Error("skip string", *skipd.SkipString) - } - if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { - t.Error("skip group int32", skipd.Skipgroup.GroupInt32) - } - if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { - t.Error("skip group string", *skipd.Skipgroup.GroupString) - } -} - -// Check that unrecognized fields of a submessage are preserved. -func TestSubmessageUnrecognizedFields(t *testing.T) { - nm := &NewMessage{ - Nested: &NewMessage_Nested{ - Name: String("Nigel"), - FoodGroup: String("carbs"), - }, - } - b, err := Marshal(nm) - if err != nil { - t.Fatalf("Marshal of NewMessage: %v", err) - } - - // Unmarshal into an OldMessage. - om := new(OldMessage) - if err := Unmarshal(b, om); err != nil { - t.Fatalf("Unmarshal to OldMessage: %v", err) - } - exp := &OldMessage{ - Nested: &OldMessage_Nested{ - Name: String("Nigel"), - // normal protocol buffer users should not do this - XXX_unrecognized: []byte("\x12\x05carbs"), - }, - } - if !Equal(om, exp) { - t.Errorf("om = %v, want %v", om, exp) - } - - // Clone the OldMessage. - om = Clone(om).(*OldMessage) - if !Equal(om, exp) { - t.Errorf("Clone(om) = %v, want %v", om, exp) - } - - // Marshal the OldMessage, then unmarshal it into an empty NewMessage. - if b, err = Marshal(om); err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - t.Logf("Marshal(%v) -> %q", om, b) - nm2 := new(NewMessage) - if err := Unmarshal(b, nm2); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - if !Equal(nm, nm2) { - t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) - } -} - -// Check that an int32 field can be upgraded to an int64 field. -func TestNegativeInt32(t *testing.T) { - om := &OldMessage{ - Num: Int32(-1), - } - b, err := Marshal(om) - if err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - - // Check the size. It should be 11 bytes; - // 1 for the field/wire type, and 10 for the negative number. - if len(b) != 11 { - t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) - } - - // Unmarshal into a NewMessage. - nm := new(NewMessage) - if err := Unmarshal(b, nm); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - want := &NewMessage{ - Num: Int64(-1), - } - if !Equal(nm, want) { - t.Errorf("nm = %v, want %v", nm, want) - } -} - -// Check that we can grow an array (repeated field) to have many elements. -// This test doesn't depend only on our encoding; for variety, it makes sure -// we create, encode, and decode the correct contents explicitly. It's therefore -// a bit messier. -// This test also uses (and hence tests) the Marshal/Unmarshal functions -// instead of the methods. -func TestBigRepeated(t *testing.T) { - pb := initGoTest(true) - - // Create the arrays - const N = 50 // Internally the library starts much smaller. - pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) - pb.F_Sint64Repeated = make([]int64, N) - pb.F_Sint32Repeated = make([]int32, N) - pb.F_BytesRepeated = make([][]byte, N) - pb.F_StringRepeated = make([]string, N) - pb.F_DoubleRepeated = make([]float64, N) - pb.F_FloatRepeated = make([]float32, N) - pb.F_Uint64Repeated = make([]uint64, N) - pb.F_Uint32Repeated = make([]uint32, N) - pb.F_Fixed64Repeated = make([]uint64, N) - pb.F_Fixed32Repeated = make([]uint32, N) - pb.F_Int64Repeated = make([]int64, N) - pb.F_Int32Repeated = make([]int32, N) - pb.F_BoolRepeated = make([]bool, N) - pb.RepeatedField = make([]*GoTestField, N) - - // Fill in the arrays with checkable values. - igtf := initGoTestField() - igtrg := initGoTest_RepeatedGroup() - for i := 0; i < N; i++ { - pb.Repeatedgroup[i] = igtrg - pb.F_Sint64Repeated[i] = int64(i) - pb.F_Sint32Repeated[i] = int32(i) - s := fmt.Sprint(i) - pb.F_BytesRepeated[i] = []byte(s) - pb.F_StringRepeated[i] = s - pb.F_DoubleRepeated[i] = float64(i) - pb.F_FloatRepeated[i] = float32(i) - pb.F_Uint64Repeated[i] = uint64(i) - pb.F_Uint32Repeated[i] = uint32(i) - pb.F_Fixed64Repeated[i] = uint64(i) - pb.F_Fixed32Repeated[i] = uint32(i) - pb.F_Int64Repeated[i] = int64(i) - pb.F_Int32Repeated[i] = int32(i) - pb.F_BoolRepeated[i] = i%2 == 0 - pb.RepeatedField[i] = igtf - } - - // Marshal. - buf, _ := Marshal(pb) - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - Unmarshal(buf, pbd) - - // Check the checkable values - for i := uint64(0); i < N; i++ { - if pbd.Repeatedgroup[i] == nil { // TODO: more checking? - t.Error("pbd.Repeatedgroup bad") - } - var x uint64 - x = uint64(pbd.F_Sint64Repeated[i]) - if x != i { - t.Error("pbd.F_Sint64Repeated bad", x, i) - } - x = uint64(pbd.F_Sint32Repeated[i]) - if x != i { - t.Error("pbd.F_Sint32Repeated bad", x, i) - } - s := fmt.Sprint(i) - equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) - if pbd.F_StringRepeated[i] != s { - t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) - } - x = uint64(pbd.F_DoubleRepeated[i]) - if x != i { - t.Error("pbd.F_DoubleRepeated bad", x, i) - } - x = uint64(pbd.F_FloatRepeated[i]) - if x != i { - t.Error("pbd.F_FloatRepeated bad", x, i) - } - x = pbd.F_Uint64Repeated[i] - if x != i { - t.Error("pbd.F_Uint64Repeated bad", x, i) - } - x = uint64(pbd.F_Uint32Repeated[i]) - if x != i { - t.Error("pbd.F_Uint32Repeated bad", x, i) - } - x = pbd.F_Fixed64Repeated[i] - if x != i { - t.Error("pbd.F_Fixed64Repeated bad", x, i) - } - x = uint64(pbd.F_Fixed32Repeated[i]) - if x != i { - t.Error("pbd.F_Fixed32Repeated bad", x, i) - } - x = uint64(pbd.F_Int64Repeated[i]) - if x != i { - t.Error("pbd.F_Int64Repeated bad", x, i) - } - x = uint64(pbd.F_Int32Repeated[i]) - if x != i { - t.Error("pbd.F_Int32Repeated bad", x, i) - } - if pbd.F_BoolRepeated[i] != (i%2 == 0) { - t.Error("pbd.F_BoolRepeated bad", x, i) - } - if pbd.RepeatedField[i] == nil { // TODO: more checking? - t.Error("pbd.RepeatedField bad") - } - } -} - -// Verify we give a useful message when decoding to the wrong structure type. -func TestTypeMismatch(t *testing.T) { - pb1 := initGoTest(true) - - // Marshal - o := old() - o.Marshal(pb1) - - // Now Unmarshal it to the wrong type. - pb2 := initGoTestField() - err := o.Unmarshal(pb2) - if err == nil { - t.Error("expected error, got no error") - } else if !strings.Contains(err.Error(), "bad wiretype") { - t.Error("expected bad wiretype error, got", err) - } -} - -func encodeDecode(t *testing.T, in, out Message, msg string) { - buf, err := Marshal(in) - if err != nil { - t.Fatalf("failed marshaling %v: %v", msg, err) - } - if err := Unmarshal(buf, out); err != nil { - t.Fatalf("failed unmarshaling %v: %v", msg, err) - } -} - -func TestPackedNonPackedDecoderSwitching(t *testing.T) { - np, p := new(NonPackedTest), new(PackedTest) - - // non-packed -> packed - np.A = []int32{0, 1, 1, 2, 3, 5} - encodeDecode(t, np, p, "non-packed -> packed") - if !reflect.DeepEqual(np.A, p.B) { - t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) - } - - // packed -> non-packed - np.Reset() - p.B = []int32{3, 1, 4, 1, 5, 9} - encodeDecode(t, p, np, "packed -> non-packed") - if !reflect.DeepEqual(p.B, np.A) { - t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) - } -} - -func TestProto1RepeatedGroup(t *testing.T) { - pb := &MessageList{ - Message: []*MessageList_Message{ - { - Name: String("blah"), - Count: Int32(7), - }, - // NOTE: pb.Message[1] is a nil - nil, - }, - } - - o := old() - err := o.Marshal(pb) - if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { - t.Fatalf("unexpected or no error when marshaling: %v", err) - } -} - -// Test that enums work. Checks for a bug introduced by making enums -// named types instead of int32: newInt32FromUint64 would crash with -// a type mismatch in reflect.PointTo. -func TestEnum(t *testing.T) { - pb := new(GoEnum) - pb.Foo = FOO_FOO1.Enum() - o := old() - if err := o.Marshal(pb); err != nil { - t.Fatal("error encoding enum:", err) - } - pb1 := new(GoEnum) - if err := o.Unmarshal(pb1); err != nil { - t.Fatal("error decoding enum:", err) - } - if *pb1.Foo != FOO_FOO1 { - t.Error("expected 7 but got ", *pb1.Foo) - } -} - -// Enum types have String methods. Check that enum fields can be printed. -// We don't care what the value actually is, just as long as it doesn't crash. -func TestPrintingNilEnumFields(t *testing.T) { - pb := new(GoEnum) - _ = fmt.Sprintf("%+v", pb) -} - -// Verify that absent required fields cause Marshal/Unmarshal to return errors. -func TestRequiredFieldEnforcement(t *testing.T) { - pb := new(GoTestField) - _, err := Marshal(pb) - if err == nil { - t.Error("marshal: expected error, got nil") - } else if strings.Index(err.Error(), "Label") < 0 { - t.Errorf("marshal: bad error type: %v", err) - } - - // A slightly sneaky, yet valid, proto. It encodes the same required field twice, - // so simply counting the required fields is insufficient. - // field 1, encoding 2, value "hi" - buf := []byte("\x0A\x02hi\x0A\x02hi") - err = Unmarshal(buf, pb) - if err == nil { - t.Error("unmarshal: expected error, got nil") - } else if strings.Index(err.Error(), "{Unknown}") < 0 { - t.Errorf("unmarshal: bad error type: %v", err) - } -} - -func TestTypedNilMarshal(t *testing.T) { - // A typed nil should return ErrNil and not crash. - _, err := Marshal((*GoEnum)(nil)) - if err != ErrNil { - t.Errorf("Marshal: got err %v, want ErrNil", err) - } -} - -// A type that implements the Marshaler interface, but is not nillable. -type nonNillableInt uint64 - -func (nni nonNillableInt) Marshal() ([]byte, error) { - return EncodeVarint(uint64(nni)), nil -} - -type NNIMessage struct { - nni nonNillableInt -} - -func (*NNIMessage) Reset() {} -func (*NNIMessage) String() string { return "" } -func (*NNIMessage) ProtoMessage() {} - -// A type that implements the Marshaler interface and is nillable. -type nillableMessage struct { - x uint64 -} - -func (nm *nillableMessage) Marshal() ([]byte, error) { - return EncodeVarint(nm.x), nil -} - -type NMMessage struct { - nm *nillableMessage -} - -func (*NMMessage) Reset() {} -func (*NMMessage) String() string { return "" } -func (*NMMessage) ProtoMessage() {} - -// Verify a type that uses the Marshaler interface, but has a nil pointer. -func TestNilMarshaler(t *testing.T) { - // Try a struct with a Marshaler field that is nil. - // It should be directly marshable. - nmm := new(NMMessage) - if _, err := Marshal(nmm); err != nil { - t.Error("unexpected error marshaling nmm: ", err) - } - - // Try a struct with a Marshaler field that is not nillable. - nnim := new(NNIMessage) - nnim.nni = 7 - var _ Marshaler = nnim.nni // verify it is truly a Marshaler - if _, err := Marshal(nnim); err != nil { - t.Error("unexpected error marshaling nnim: ", err) - } -} - -func TestAllSetDefaults(t *testing.T) { - // Exercise SetDefaults with all scalar field types. - m := &Defaults{ - // NaN != NaN, so override that here. - F_Nan: Float32(1.7), - } - expected := &Defaults{ - F_Bool: Bool(true), - F_Int32: Int32(32), - F_Int64: Int64(64), - F_Fixed32: Uint32(320), - F_Fixed64: Uint64(640), - F_Uint32: Uint32(3200), - F_Uint64: Uint64(6400), - F_Float: Float32(314159), - F_Double: Float64(271828), - F_String: String(`hello, "world!"` + "\n"), - F_Bytes: []byte("Bignose"), - F_Sint32: Int32(-32), - F_Sint64: Int64(-64), - F_Enum: Defaults_GREEN.Enum(), - F_Pinf: Float32(float32(math.Inf(1))), - F_Ninf: Float32(float32(math.Inf(-1))), - F_Nan: Float32(1.7), - StrZero: String(""), - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithSetField(t *testing.T) { - // Check that a set value is not overridden. - m := &Defaults{ - F_Int32: Int32(12), - } - SetDefaults(m) - if v := m.GetF_Int32(); v != 12 { - t.Errorf("m.FInt32 = %v, want 12", v) - } -} - -func TestSetDefaultsWithSubMessage(t *testing.T) { - m := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - }, - } - expected := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - Port: Int32(4000), - }, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { - m := &MyMessage{ - RepInner: []*InnerMessage{{}}, - } - expected := &MyMessage{ - RepInner: []*InnerMessage{{ - Port: Int32(4000), - }}, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { - m := &MyMessage{ - Pet: []string{"turtle", "wombat"}, - } - expected := Clone(m) - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestMaximumTagNumber(t *testing.T) { - m := &MaxTag{ - LastField: String("natural goat essence"), - } - buf, err := Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal failed: %v", err) - } - m2 := new(MaxTag) - if err := Unmarshal(buf, m2); err != nil { - t.Fatalf("proto.Unmarshal failed: %v", err) - } - if got, want := m2.GetLastField(), *m.LastField; got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestJSON(t *testing.T) { - m := &MyMessage{ - Count: Int32(4), - Pet: []string{"bunny", "kitty"}, - Inner: &InnerMessage{ - Host: String("cauchy"), - }, - Bikeshed: MyMessage_GREEN.Enum(), - } - const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` - - b, err := json.Marshal(m) - if err != nil { - t.Fatalf("json.Marshal failed: %v", err) - } - s := string(b) - if s != expected { - t.Errorf("got %s\nwant %s", s, expected) - } - - received := new(MyMessage) - if err := json.Unmarshal(b, received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } - - // Test unmarshalling of JSON with symbolic enum name. - const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` - received.Reset() - if err := json.Unmarshal([]byte(old), received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } -} - -func TestBadWireType(t *testing.T) { - b := []byte{7<<3 | 6} // field 7, wire type 6 - pb := new(OtherMessage) - if err := Unmarshal(b, pb); err == nil { - t.Errorf("Unmarshal did not fail") - } else if !strings.Contains(err.Error(), "unknown wire type") { - t.Errorf("wrong error: %v", err) - } -} - -func TestBytesWithInvalidLength(t *testing.T) { - // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. - b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} - Unmarshal(b, new(MyMessage)) -} - -func TestLengthOverflow(t *testing.T) { - // Overflowing a length should not panic. - b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} - Unmarshal(b, new(MyMessage)) -} - -func TestVarintOverflow(t *testing.T) { - // Overflowing a 64-bit length should not be allowed. - b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} - if err := Unmarshal(b, new(MyMessage)); err == nil { - t.Fatalf("Overflowed uint64 length without error") - } -} - -func TestUnmarshalFuzz(t *testing.T) { - const N = 1000 - seed := time.Now().UnixNano() - t.Logf("RNG seed is %d", seed) - rng := rand.New(rand.NewSource(seed)) - buf := make([]byte, 20) - for i := 0; i < N; i++ { - for j := range buf { - buf[j] = byte(rng.Intn(256)) - } - fuzzUnmarshal(t, buf) - } -} - -func TestMergeMessages(t *testing.T) { - pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} - data, err := Marshal(pb) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - pb1 := new(MessageList) - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("first Unmarshal: %v", err) - } - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("second Unmarshal: %v", err) - } - if len(pb1.Message) != 1 { - t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) - } - - pb2 := new(MessageList) - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("first UnmarshalMerge: %v", err) - } - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("second UnmarshalMerge: %v", err) - } - if len(pb2.Message) != 2 { - t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) - } -} - -func TestExtensionMarshalOrder(t *testing.T) { - m := &MyMessage{Count: Int(123)} - if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { - t.Fatalf("SetExtension: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - var orig []byte - for i := 0; i < 100; i++ { - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if i == 0 { - orig = b - continue - } - if !bytes.Equal(b, orig) { - t.Errorf("Bytes differ on attempt #%d", i) - } - } -} - -// Many extensions, because small maps might not iterate differently on each iteration. -var exts = []*ExtensionDesc{ - E_X201, - E_X202, - E_X203, - E_X204, - E_X205, - E_X206, - E_X207, - E_X208, - E_X209, - E_X210, - E_X211, - E_X212, - E_X213, - E_X214, - E_X215, - E_X216, - E_X217, - E_X218, - E_X219, - E_X220, - E_X221, - E_X222, - E_X223, - E_X224, - E_X225, - E_X226, - E_X227, - E_X228, - E_X229, - E_X230, - E_X231, - E_X232, - E_X233, - E_X234, - E_X235, - E_X236, - E_X237, - E_X238, - E_X239, - E_X240, - E_X241, - E_X242, - E_X243, - E_X244, - E_X245, - E_X246, - E_X247, - E_X248, - E_X249, - E_X250, -} - -func TestMessageSetMarshalOrder(t *testing.T) { - m := &MyMessageSet{} - for _, x := range exts { - if err := SetExtension(m, x, &Empty{}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - } - - buf, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - for i := 0; i < 10; i++ { - b1, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if !bytes.Equal(b1, buf) { - t.Errorf("Bytes differ on re-Marshal #%d", i) - } - - m2 := &MyMessageSet{} - if err := Unmarshal(buf, m2); err != nil { - t.Errorf("Unmarshal: %v", err) - } - b2, err := Marshal(m2) - if err != nil { - t.Errorf("re-Marshal: %v", err) - } - if !bytes.Equal(b2, buf) { - t.Errorf("Bytes differ on round-trip #%d", i) - } - } -} - -func TestUnmarshalMergesMessages(t *testing.T) { - // If a nested message occurs twice in the input, - // the fields should be merged when decoding. - a := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("polhode"), - Port: Int32(1234), - }, - } - aData, err := Marshal(a) - if err != nil { - t.Fatalf("Marshal(a): %v", err) - } - b := &OtherMessage{ - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Connected: Bool(true), - }, - } - bData, err := Marshal(b) - if err != nil { - t.Fatalf("Marshal(b): %v", err) - } - want := &OtherMessage{ - Key: Int64(123), - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Port: Int32(1234), - Connected: Bool(true), - }, - } - got := new(OtherMessage) - if err := Unmarshal(append(aData, bData...), got); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !Equal(got, want) { - t.Errorf("\n got %v\nwant %v", got, want) - } -} - -func TestEncodingSizes(t *testing.T) { - tests := []struct { - m Message - n int - }{ - {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, - {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, - {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, - {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, - } - for _, test := range tests { - b, err := Marshal(test.m) - if err != nil { - t.Errorf("Marshal(%v): %v", test.m, err) - continue - } - if len(b) != test.n { - t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) - } - } -} - -func TestRequiredNotSetError(t *testing.T) { - pb := initGoTest(false) - pb.RequiredField.Label = nil - pb.F_Int32Required = nil - pb.F_Int64Required = nil - - expected := "0807" + // field 1, encoding 0, value 7 - "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) - "5001" + // field 10, encoding 0, value 1 - "6d20000000" + // field 13, encoding 5, value 0x20 - "714000000000000000" + // field 14, encoding 1, value 0x40 - "78a019" + // field 15, encoding 0, value 0xca0 = 3232 - "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45" + // field 17, encoding 5, value 3232.0 - "9101000000000040b940" + // field 18, encoding 1, value 6464.0 - "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" - "b304" + // field 70, encoding 3, start group - "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" - "b404" + // field 70, encoding 4, end group - "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" - "b0063f" + // field 102, encoding 0, 0x3f zigzag32 - "b8067f" // field 103, encoding 0, 0x7f zigzag64 - - o := old() - bytes, err := Marshal(pb) - if _, ok := err.(*RequiredNotSetError); !ok { - fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("expected = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-1 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 1", bytes) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = Unmarshal(bytes, pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { - t.Errorf("unmarshal wrong err msg: %v", err) - } - bytes, err = Marshal(pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-2 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 2", bytes) - t.Fatalf("string = %s", expected) - } -} - -func fuzzUnmarshal(t *testing.T, data []byte) { - defer func() { - if e := recover(); e != nil { - t.Errorf("These bytes caused a panic: %+v", data) - t.Logf("Stack:\n%s", debug.Stack()) - t.FailNow() - } - }() - - pb := new(MyMessage) - Unmarshal(data, pb) -} - -func TestMapFieldMarshal(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // b should be the concatenation of these three byte sequences in some order. - parts := []string{ - "\n\a\b\x01\x12\x03Rob", - "\n\a\b\x04\x12\x03Ian", - "\n\b\b\x08\x12\x04Dave", - } - ok := false - for i := range parts { - for j := range parts { - if j == i { - continue - } - for k := range parts { - if k == i || k == j { - continue - } - try := parts[i] + parts[j] + parts[k] - if bytes.Equal(b, []byte(try)) { - ok = true - break - } - } - } - } - if !ok { - t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) - } - t.Logf("FYI b: %q", b) - - (new(Buffer)).DebugPrint("Dump of b", b) -} - -func TestMapFieldRoundTrips(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - MsgMapping: map[int64]*FloatingPoint{ - 0x7001: {F: Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{ - false: []byte("that's not right!"), - true: []byte("aye, 'tis true!"), - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("FYI b: %q", b) - m2 := new(MessageWithMap) - if err := Unmarshal(b, m2); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - for _, pair := range [][2]interface{}{ - {m.NameMapping, m2.NameMapping}, - {m.MsgMapping, m2.MsgMapping}, - {m.ByteMapping, m2.ByteMapping}, - } { - if !reflect.DeepEqual(pair[0], pair[1]) { - t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1]) - } - } -} - -func TestMapFieldWithNil(t *testing.T) { - m := &MessageWithMap{ - MsgMapping: map[int64]*FloatingPoint{ - 1: nil, - }, - } - b, err := Marshal(m) - if err == nil { - t.Fatalf("Marshal of bad map should have failed, got these bytes: %v", b) - } -} - -func TestOneof(t *testing.T) { - m := &Communique{} - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal of empty message with oneof: %v", err) - } - if len(b) != 0 { - t.Errorf("Marshal of empty message yielded too many bytes: %v", b) - } - - m = &Communique{ - Union: &Communique_Name{"Barry"}, - } - - // Round-trip. - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof: %v", err) - } - if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) - t.Errorf("Incorrect marshal of message with oneof: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof: %v", err) - } - if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { - t.Errorf("After round trip, Union = %+v", m.Union) - } - if name := m.GetName(); name != "Barry" { - t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") - } - - // Let's try with a message in the oneof. - m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof set to message: %v", err) - } - if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) - t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof set to message: %v", err) - } - ss, ok := m.Union.(*Communique_Msg) - if !ok || ss.Msg.GetStringField() != "deep deep string" { - t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) - } -} - -func TestInefficientPackedBool(t *testing.T) { - // https://github.com/golang/protobuf/issues/76 - inp := []byte{ - 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes - // Usually a bool should take a single byte, - // but it is permitted to be any varint. - 0xb9, 0x30, - } - if err := Unmarshal(inp, new(MoreRepeated)); err != nil { - t.Error(err) - } -} - -// Benchmarks - -func testMsg() *GoTest { - pb := initGoTest(true) - const N = 1000 // Internally the library starts much smaller. - pb.F_Int32Repeated = make([]int32, N) - pb.F_DoubleRepeated = make([]float64, N) - for i := 0; i < N; i++ { - pb.F_Int32Repeated[i] = int32(i) - pb.F_DoubleRepeated[i] = float64(i) - } - return pb -} - -func bytesMsg() *GoTest { - pb := initGoTest(true) - buf := make([]byte, 4000) - for i := range buf { - buf[i] = byte(i) - } - pb.F_BytesDefaulted = buf - return pb -} - -func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { - d, _ := marshal(pb) - b.SetBytes(int64(len(d))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - marshal(pb) - } -} - -func benchmarkBufferMarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - p.Reset() - err := p.Marshal(pb0) - return p.Bytes(), err - }) -} - -func benchmarkSize(b *testing.B, pb Message) { - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - Size(pb) - return nil, nil - }) -} - -func newOf(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - return reflect.New(in.Type().Elem()).Interface().(Message) -} - -func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { - d, _ := Marshal(pb) - b.SetBytes(int64(len(d))) - pbd := newOf(pb) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - unmarshal(d, pbd) - } -} - -func benchmarkBufferUnmarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { - p.SetBuf(d) - return p.Unmarshal(pb0) - }) -} - -// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} - -func BenchmarkMarshal(b *testing.B) { - benchmarkMarshal(b, testMsg(), Marshal) -} - -func BenchmarkBufferMarshal(b *testing.B) { - benchmarkBufferMarshal(b, testMsg()) -} - -func BenchmarkSize(b *testing.B) { - benchmarkSize(b, testMsg()) -} - -func BenchmarkUnmarshal(b *testing.B) { - benchmarkUnmarshal(b, testMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshal(b *testing.B) { - benchmarkBufferUnmarshal(b, testMsg()) -} - -func BenchmarkMarshalBytes(b *testing.B) { - benchmarkMarshal(b, bytesMsg(), Marshal) -} - -func BenchmarkBufferMarshalBytes(b *testing.B) { - benchmarkBufferMarshal(b, bytesMsg()) -} - -func BenchmarkSizeBytes(b *testing.B) { - benchmarkSize(b, bytesMsg()) -} - -func BenchmarkUnmarshalBytes(b *testing.B) { - benchmarkUnmarshal(b, bytesMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshalBytes(b *testing.B) { - benchmarkBufferUnmarshal(b, bytesMsg()) -} - -func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { - b.StopTimer() - pb := initGoTestField() - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - pbd := new(GoTestField) - p := NewBuffer(nil) - p.Marshal(pb) - p.Marshal(skip) - p2 := NewBuffer(nil) - - b.StartTimer() - for i := 0; i < b.N; i++ { - p2.SetBuf(p.Bytes()) - p2.Unmarshal(pbd) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go deleted file mode 100644 index f065210b8..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/clone_test.go +++ /dev/null @@ -1,267 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - "github.com/gogo/protobuf/proto" - - proto3pb "github.com/gogo/protobuf/proto/proto3_proto" - pb "github.com/gogo/protobuf/proto/testdata" -) - -var cloneTestMessage = &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, -} - -func init() { - ext := &pb.Ext{ - Data: proto.String("extension"), - } - if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { - panic("SetExtension: " + err.Error()) - } -} - -func TestClone(t *testing.T) { - m := proto.Clone(cloneTestMessage).(*pb.MyMessage) - if !proto.Equal(m, cloneTestMessage) { - t.Errorf("Clone(%v) = %v", cloneTestMessage, m) - } - - // Verify it was a deep copy. - *m.Inner.Port++ - if proto.Equal(m, cloneTestMessage) { - t.Error("Mutating clone changed the original") - } - // Byte fields and repeated fields should be copied. - if &m.Pet[0] == &cloneTestMessage.Pet[0] { - t.Error("Pet: repeated field not copied") - } - if &m.Others[0] == &cloneTestMessage.Others[0] { - t.Error("Others: repeated field not copied") - } - if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { - t.Error("Others[0].Value: bytes field not copied") - } - if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { - t.Error("RepBytes: repeated field not copied") - } - if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { - t.Error("RepBytes[0]: bytes field not copied") - } -} - -func TestCloneNil(t *testing.T) { - var m *pb.MyMessage - if c := proto.Clone(m); !proto.Equal(m, c) { - t.Errorf("Clone(%v) = %v", m, c) - } -} - -var mergeTests = []struct { - src, dst, want proto.Message -}{ - { - src: &pb.MyMessage{ - Count: proto.Int32(42), - }, - dst: &pb.MyMessage{ - Name: proto.String("Dave"), - }, - want: &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - }, - }, - { - src: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - }, - Pet: []string{"horsey"}, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - }, - dst: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - { - // Explicitly test a src=nil field - Inner: nil, - }, - }, - }, - want: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty", "horsey"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - {}, - { - Value: []byte("some bytes"), - }, - }, - }, - }, - { - src: &pb.MyMessage{ - RepBytes: [][]byte{[]byte("wow")}, - }, - dst: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham")}, - }, - want: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, - }, - }, - // Check that a scalar bytes field replaces rather than appends. - { - src: &pb.OtherMessage{Value: []byte("foo")}, - dst: &pb.OtherMessage{Value: []byte("bar")}, - want: &pb.OtherMessage{Value: []byte("foo")}, - }, - { - src: &pb.MessageWithMap{ - NameMapping: map[int32]string{6: "Nigel"}, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: {F: proto.Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - dst: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Bruce", // should be overwritten - 7: "Andrew", - }, - }, - want: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Nigel", - 7: "Andrew", - }, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: {F: proto.Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - }, - // proto3 shouldn't merge zero values, - // in the same way that proto2 shouldn't merge nils. - { - src: &proto3pb.Message{ - Name: "Aaron", - Data: []byte(""), // zero value, but not nil - }, - dst: &proto3pb.Message{ - HeightInCm: 176, - Data: []byte("texas!"), - }, - want: &proto3pb.Message{ - Name: "Aaron", - HeightInCm: 176, - Data: []byte("texas!"), - }, - }, - // Oneof fields should merge by assignment. - { - src: &pb.Communique{ - Union: &pb.Communique_Number{Number: 41}, - }, - dst: &pb.Communique{ - Union: &pb.Communique_Name{Name: "Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Number{Number: 41}, - }, - }, - // Oneof nil is the same as not set. - { - src: &pb.Communique{}, - dst: &pb.Communique{ - Union: &pb.Communique_Name{Name: "Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Name{Name: "Bobby Tables"}, - }, - }, -} - -func TestMerge(t *testing.T) { - for _, m := range mergeTests { - got := proto.Clone(m.dst) - proto.Merge(got, m.src) - if !proto.Equal(got, m.want) { - t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go deleted file mode 100644 index 7cb36d378..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/equal_test.go +++ /dev/null @@ -1,209 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - . "github.com/gogo/protobuf/proto" - pb "github.com/gogo/protobuf/proto/testdata" -) - -// Four identical base messages. -// The init function adds extensions to some of them. -var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)} - -// Two messages with non-message extensions. -var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)} -var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)} - -func init() { - ext1 := &pb.Ext{Data: String("Kirk")} - ext2 := &pb.Ext{Data: String("Picard")} - - // messageWithExtension1a has ext1, but never marshals it. - if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1a failed: " + err.Error()) - } - - // messageWithExtension1b is the unmarshaled form of messageWithExtension1a. - if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1b failed: " + err.Error()) - } - buf, err := Marshal(messageWithExtension1b) - if err != nil { - panic("Marshal of 1b failed: " + err.Error()) - } - messageWithExtension1b.Reset() - if err := Unmarshal(buf, messageWithExtension1b); err != nil { - panic("Unmarshal of 1b failed: " + err.Error()) - } - - // messageWithExtension2 has ext2. - if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil { - panic("SetExtension on 2 failed: " + err.Error()) - } - - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil { - panic("SetExtension on Int32-1 failed: " + err.Error()) - } - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil { - panic("SetExtension on Int32-2 failed: " + err.Error()) - } -} - -var EqualTests = []struct { - desc string - a, b Message - exp bool -}{ - {"different types", &pb.GoEnum{}, &pb.GoTestField{}, false}, - {"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true}, - {"nil vs nil", nil, nil, true}, - {"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true}, - {"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false}, - {"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false}, - - {"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false}, - {"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false}, - {"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false}, - {"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true}, - - {"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false}, - {"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false}, - {"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false}, - {"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true}, - {"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true}, - {"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true}, - {"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true}, - - { - "nested, different", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}}, - false, - }, - { - "nested, equal", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - true, - }, - - {"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true}, - {"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true}, - {"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false}, - { - "repeated bytes", - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - true, - }, - - {"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false}, - {"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true}, - {"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false}, - - {"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true}, - {"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false}, - - { - "message with group", - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - true, - }, - - { - "map same", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - true, - }, - { - "map different entry", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}}, - false, - }, - { - "map different key only", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}}, - false, - }, - { - "map different value only", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}}, - false, - }, - { - "oneof same", - &pb.Communique{Union: &pb.Communique_Number{Number: 41}}, - &pb.Communique{Union: &pb.Communique_Number{Number: 41}}, - true, - }, - { - "oneof one nil", - &pb.Communique{Union: &pb.Communique_Number{Number: 41}}, - &pb.Communique{}, - false, - }, - { - "oneof different", - &pb.Communique{Union: &pb.Communique_Number{Number: 41}}, - &pb.Communique{Union: &pb.Communique_Name{Name: "Bobby Tables"}}, - false, - }, -} - -func TestEqual(t *testing.T) { - for _, tc := range EqualTests { - if res := Equal(tc.a, tc.b); res != tc.exp { - t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go deleted file mode 100644 index 86e3006d7..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/extensions_test.go +++ /dev/null @@ -1,292 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "fmt" - "reflect" - "testing" - - "github.com/gogo/protobuf/proto" - pb "github.com/gogo/protobuf/proto/testdata" -) - -func TestGetExtensionsWithMissingExtensions(t *testing.T) { - msg := &pb.MyMessage{} - ext1 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { - t.Fatalf("Could not set ext1: %s", ext1) - } - exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ - pb.E_Ext_More, - pb.E_Ext_Text, - }) - if err != nil { - t.Fatalf("GetExtensions() failed: %s", err) - } - if exts[0] != ext1 { - t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) - } - if exts[1] != nil { - t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) - } -} - -func TestGetExtensionStability(t *testing.T) { - check := func(m *pb.MyMessage) bool { - ext1, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - ext2, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - return ext1 == ext2 - } - msg := &pb.MyMessage{Count: proto.Int32(4)} - ext0 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { - t.Fatalf("Could not set ext1: %s", ext0) - } - if !check(msg) { - t.Errorf("GetExtension() not stable before marshaling") - } - bb, err := proto.Marshal(msg) - if err != nil { - t.Fatalf("Marshal() failed: %s", err) - } - msg1 := &pb.MyMessage{} - err = proto.Unmarshal(bb, msg1) - if err != nil { - t.Fatalf("Unmarshal() failed: %s", err) - } - if !check(msg1) { - t.Errorf("GetExtension() not stable after unmarshaling") - } -} - -func TestGetExtensionDefaults(t *testing.T) { - var setFloat64 float64 = 1 - var setFloat32 float32 = 2 - var setInt32 int32 = 3 - var setInt64 int64 = 4 - var setUint32 uint32 = 5 - var setUint64 uint64 = 6 - var setBool = true - var setBool2 = false - var setString = "Goodnight string" - var setBytes = []byte("Goodnight bytes") - var setEnum = pb.DefaultsMessage_TWO - - type testcase struct { - ext *proto.ExtensionDesc // Extension we are testing. - want interface{} // Expected value of extension, or nil (meaning that GetExtension will fail). - def interface{} // Expected value of extension after ClearExtension(). - } - tests := []testcase{ - {pb.E_NoDefaultDouble, setFloat64, nil}, - {pb.E_NoDefaultFloat, setFloat32, nil}, - {pb.E_NoDefaultInt32, setInt32, nil}, - {pb.E_NoDefaultInt64, setInt64, nil}, - {pb.E_NoDefaultUint32, setUint32, nil}, - {pb.E_NoDefaultUint64, setUint64, nil}, - {pb.E_NoDefaultSint32, setInt32, nil}, - {pb.E_NoDefaultSint64, setInt64, nil}, - {pb.E_NoDefaultFixed32, setUint32, nil}, - {pb.E_NoDefaultFixed64, setUint64, nil}, - {pb.E_NoDefaultSfixed32, setInt32, nil}, - {pb.E_NoDefaultSfixed64, setInt64, nil}, - {pb.E_NoDefaultBool, setBool, nil}, - {pb.E_NoDefaultBool, setBool2, nil}, - {pb.E_NoDefaultString, setString, nil}, - {pb.E_NoDefaultBytes, setBytes, nil}, - {pb.E_NoDefaultEnum, setEnum, nil}, - {pb.E_DefaultDouble, setFloat64, float64(3.1415)}, - {pb.E_DefaultFloat, setFloat32, float32(3.14)}, - {pb.E_DefaultInt32, setInt32, int32(42)}, - {pb.E_DefaultInt64, setInt64, int64(43)}, - {pb.E_DefaultUint32, setUint32, uint32(44)}, - {pb.E_DefaultUint64, setUint64, uint64(45)}, - {pb.E_DefaultSint32, setInt32, int32(46)}, - {pb.E_DefaultSint64, setInt64, int64(47)}, - {pb.E_DefaultFixed32, setUint32, uint32(48)}, - {pb.E_DefaultFixed64, setUint64, uint64(49)}, - {pb.E_DefaultSfixed32, setInt32, int32(50)}, - {pb.E_DefaultSfixed64, setInt64, int64(51)}, - {pb.E_DefaultBool, setBool, true}, - {pb.E_DefaultBool, setBool2, true}, - {pb.E_DefaultString, setString, "Hello, string"}, - {pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")}, - {pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE}, - } - - checkVal := func(test testcase, msg *pb.DefaultsMessage, valWant interface{}) error { - val, err := proto.GetExtension(msg, test.ext) - if err != nil { - if valWant != nil { - return fmt.Errorf("GetExtension(): %s", err) - } - if want := proto.ErrMissingExtension; err != want { - return fmt.Errorf("Unexpected error: got %v, want %v", err, want) - } - return nil - } - - // All proto2 extension values are either a pointer to a value or a slice of values. - ty := reflect.TypeOf(val) - tyWant := reflect.TypeOf(test.ext.ExtensionType) - if got, want := ty, tyWant; got != want { - return fmt.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want) - } - tye := ty.Elem() - tyeWant := tyWant.Elem() - if got, want := tye, tyeWant; got != want { - return fmt.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want) - } - - // Check the name of the type of the value. - // If it is an enum it will be type int32 with the name of the enum. - if got, want := tye.Name(), tye.Name(); got != want { - return fmt.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want) - } - - // Check that value is what we expect. - // If we have a pointer in val, get the value it points to. - valExp := val - if ty.Kind() == reflect.Ptr { - valExp = reflect.ValueOf(val).Elem().Interface() - } - if got, want := valExp, valWant; !reflect.DeepEqual(got, want) { - return fmt.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want) - } - - return nil - } - - setTo := func(test testcase) interface{} { - setTo := reflect.ValueOf(test.want) - if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr { - setTo = reflect.New(typ).Elem() - setTo.Set(reflect.New(setTo.Type().Elem())) - setTo.Elem().Set(reflect.ValueOf(test.want)) - } - return setTo.Interface() - } - - for _, test := range tests { - msg := &pb.DefaultsMessage{} - name := test.ext.Name - - // Check the initial value. - if err := checkVal(test, msg, test.def); err != nil { - t.Errorf("%s: %v", name, err) - } - - // Set the per-type value and check value. - name = fmt.Sprintf("%s (set to %T %v)", name, test.want, test.want) - if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil { - t.Errorf("%s: SetExtension(): %v", name, err) - continue - } - if err := checkVal(test, msg, test.want); err != nil { - t.Errorf("%s: %v", name, err) - continue - } - - // Set and check the value. - name += " (cleared)" - proto.ClearExtension(msg, test.ext) - if err := checkVal(test, msg, test.def); err != nil { - t.Errorf("%s: %v", name, err) - } - } -} - -func TestExtensionsRoundTrip(t *testing.T) { - msg := &pb.MyMessage{} - ext1 := &pb.Ext{ - Data: proto.String("hi"), - } - ext2 := &pb.Ext{ - Data: proto.String("there"), - } - exists := proto.HasExtension(msg, pb.E_Ext_More) - if exists { - t.Error("Extension More present unexpectedly") - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { - t.Error(err) - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { - t.Error(err) - } - e, err := proto.GetExtension(msg, pb.E_Ext_More) - if err != nil { - t.Error(err) - } - x, ok := e.(*pb.Ext) - if !ok { - t.Errorf("e has type %T, expected testdata.Ext", e) - } else if *x.Data != "there" { - t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) - } - proto.ClearExtension(msg, pb.E_Ext_More) - if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { - t.Errorf("got %v, expected ErrMissingExtension", e) - } - if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { - t.Error("expected bad extension error, got nil") - } - if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { - t.Error("expected extension err") - } - if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { - t.Error("expected some sort of type mismatch error, got nil") - } -} - -func TestNilExtension(t *testing.T) { - msg := &pb.MyMessage{ - Count: proto.Int32(1), - } - if err := proto.SetExtension(msg, pb.E_Ext_Text, proto.String("hello")); err != nil { - t.Fatal(err) - } - if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil { - t.Error("expected SetExtension to fail due to a nil extension") - } else if want := "proto: SetExtension called with nil value of type *testdata.Ext"; err.Error() != want { - t.Errorf("expected error %v, got %v", want, err) - } - // Note: if the behavior of Marshal is ever changed to ignore nil extensions, update - // this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal. -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go deleted file mode 100644 index ab8ac2f0e..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/message_set_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto - -import ( - "bytes" - "testing" -) - -func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { - // Check that a repeated message set entry will be concatenated. - in := &messageSet{ - Item: []*_MessageSet_Item{ - {TypeId: Int32(12345), Message: []byte("hoo")}, - {TypeId: Int32(12345), Message: []byte("hah")}, - }, - } - b, err := Marshal(in) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("Marshaled bytes: %q", b) - - m := make(map[int32]Extension) - if err := UnmarshalMessageSet(b, m); err != nil { - t.Fatalf("UnmarshalMessageSet: %v", err) - } - ext, ok := m[12345] - if !ok { - t.Fatalf("Didn't retrieve extension 12345; map is %v", m) - } - // Skip wire type/field number and length varints. - got := skipVarint(skipVarint(ext.enc)) - if want := []byte("hoohah"); !bytes.Equal(got, want) { - t.Errorf("Combined extension is %q, want %q", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go deleted file mode 100644 index 0de701e88..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go +++ /dev/null @@ -1,129 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: proto3_proto/proto3.proto -// DO NOT EDIT! - -/* -Package proto3_proto is a generated protocol buffer package. - -It is generated from these files: - proto3_proto/proto3.proto - -It has these top-level messages: - Message - Nested - MessageWithMap -*/ -package proto3_proto - -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" -import testdata "github.com/gogo/protobuf/proto/testdata" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -type Message_Humour int32 - -const ( - Message_UNKNOWN Message_Humour = 0 - Message_PUNS Message_Humour = 1 - Message_SLAPSTICK Message_Humour = 2 - Message_BILL_BAILEY Message_Humour = 3 -) - -var Message_Humour_name = map[int32]string{ - 0: "UNKNOWN", - 1: "PUNS", - 2: "SLAPSTICK", - 3: "BILL_BAILEY", -} -var Message_Humour_value = map[string]int32{ - "UNKNOWN": 0, - "PUNS": 1, - "SLAPSTICK": 2, - "BILL_BAILEY": 3, -} - -func (x Message_Humour) String() string { - return proto.EnumName(Message_Humour_name, int32(x)) -} - -type Message struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,proto3,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` - HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,proto3" json:"height_in_cm,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` - ResultCount int64 `protobuf:"varint,7,opt,name=result_count,proto3" json:"result_count,omitempty"` - TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,proto3" json:"true_scotsman,omitempty"` - Score float32 `protobuf:"fixed32,9,opt,name=score,proto3" json:"score,omitempty"` - Key []uint64 `protobuf:"varint,5,rep,name=key" json:"key,omitempty"` - Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` - Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` - Proto2Field *testdata.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field" json:"proto2_field,omitempty"` - Proto2Value map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} - -func (m *Message) GetNested() *Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *Message) GetTerrain() map[string]*Nested { - if m != nil { - return m.Terrain - } - return nil -} - -func (m *Message) GetProto2Field() *testdata.SubDefaults { - if m != nil { - return m.Proto2Field - } - return nil -} - -func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { - if m != nil { - return m.Proto2Value - } - return nil -} - -type Nested struct { - Bunny string `protobuf:"bytes,1,opt,name=bunny,proto3" json:"bunny,omitempty"` -} - -func (m *Nested) Reset() { *m = Nested{} } -func (m *Nested) String() string { return proto.CompactTextString(m) } -func (*Nested) ProtoMessage() {} - -type MessageWithMap struct { - ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } -func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } -func (*MessageWithMap) ProtoMessage() {} - -func (m *MessageWithMap) GetByteMapping() map[bool][]byte { - if m != nil { - return m.ByteMapping - } - return nil -} - -func init() { - proto.RegisterType((*Message)(nil), "proto3_proto.Message") - proto.RegisterType((*Nested)(nil), "proto3_proto.Nested") - proto.RegisterType((*MessageWithMap)(nil), "proto3_proto.MessageWithMap") - proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto deleted file mode 100644 index ca670015a..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_proto/proto3.proto +++ /dev/null @@ -1,68 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -syntax = "proto3"; - -package proto3_proto; - -import "github.com/gogo/protobuf/proto/testdata/test.proto"; - -message Message { - enum Humour { - UNKNOWN = 0; - PUNS = 1; - SLAPSTICK = 2; - BILL_BAILEY = 3; - } - - string name = 1; - Humour hilarity = 2; - uint32 height_in_cm = 3; - bytes data = 4; - int64 result_count = 7; - bool true_scotsman = 8; - float score = 9; - - repeated uint64 key = 5; - Nested nested = 6; - - map terrain = 10; - testdata.SubDefaults proto2_field = 11; - map proto2_value = 13; -} - -message Nested { - string bunny = 1; -} - -message MessageWithMap { - map byte_mapping = 1; -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_test.go deleted file mode 100644 index 6f9cddc3f..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/proto3_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - "github.com/gogo/protobuf/proto" - pb "github.com/gogo/protobuf/proto/proto3_proto" - tpb "github.com/gogo/protobuf/proto/testdata" -) - -func TestProto3ZeroValues(t *testing.T) { - tests := []struct { - desc string - m proto.Message - }{ - {"zero message", &pb.Message{}}, - {"empty bytes field", &pb.Message{Data: []byte{}}}, - } - for _, test := range tests { - b, err := proto.Marshal(test.m) - if err != nil { - t.Errorf("%s: proto.Marshal: %v", test.desc, err) - continue - } - if len(b) > 0 { - t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) - } - } -} - -func TestRoundTripProto3(t *testing.T) { - m := &pb.Message{ - Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" - Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 - HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 - Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" - ResultCount: 47, // (0 | 7<<3): 0x38 0x2f - TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 - Score: 8.1, // (5 | 9<<3): 0x4d <8.1> - - Key: []uint64{1, 0xdeadbeef}, - Nested: &pb.Nested{ - Bunny: "Monty", - }, - } - t.Logf(" m: %v", m) - - b, err := proto.Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal: %v", err) - } - t.Logf(" b: %q", b) - - m2 := new(pb.Message) - if err := proto.Unmarshal(b, m2); err != nil { - t.Fatalf("proto.Unmarshal: %v", err) - } - t.Logf("m2: %v", m2) - - if !proto.Equal(m, m2) { - t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) - } -} - -func TestProto3SetDefaults(t *testing.T) { - in := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: new(tpb.SubDefaults), - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": new(tpb.SubDefaults), - }, - } - - got := proto.Clone(in).(*pb.Message) - proto.SetDefaults(got) - - // There are no defaults in proto3. Everything should be the zero value, but - // we need to remember to set defaults for nested proto2 messages. - want := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": {N: proto.Int64(7)}, - }, - } - - if !proto.Equal(got, want) { - t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go deleted file mode 100644 index a2729c39a..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size2_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto - -import ( - "testing" -) - -// This is a separate file and package from size_test.go because that one uses -// generated messages and thus may not be in package proto without having a circular -// dependency, whereas this file tests unexported details of size.go. - -func TestVarintSize(t *testing.T) { - // Check the edge cases carefully. - testCases := []struct { - n uint64 - size int - }{ - {0, 1}, - {1, 1}, - {127, 1}, - {128, 2}, - {16383, 2}, - {16384, 3}, - {1<<63 - 1, 9}, - {1 << 63, 10}, - } - for _, tc := range testCases { - size := sizeVarint(tc.n) - if size != tc.size { - t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go deleted file mode 100644 index f4b8b8e3a..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/size_test.go +++ /dev/null @@ -1,147 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "log" - "strings" - "testing" - - . "github.com/gogo/protobuf/proto" - proto3pb "github.com/gogo/protobuf/proto/proto3_proto" - pb "github.com/gogo/protobuf/proto/testdata" -) - -var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} - -// messageWithExtension2 is in equal_test.go. -var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} - -func init() { - if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - - // Force messageWithExtension3 to have the extension encoded. - Marshal(messageWithExtension3) - -} - -var SizeTests = []struct { - desc string - pb Message -}{ - {"empty", &pb.OtherMessage{}}, - // Basic types. - {"bool", &pb.Defaults{F_Bool: Bool(true)}}, - {"int32", &pb.Defaults{F_Int32: Int32(12)}}, - {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, - {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, - {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, - {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, - {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, - {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, - {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, - {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, - {"float", &pb.Defaults{F_Float: Float32(12.6)}}, - {"double", &pb.Defaults{F_Double: Float64(13.9)}}, - {"string", &pb.Defaults{F_String: String("niles")}}, - {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, - {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, - {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, - {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, - {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, - // Repeated. - {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, - {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, - {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, - {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, - {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, - {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ - // Need enough large numbers to verify that the header is counting the number of bytes - // for the field, not the number of elements. - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - }}}, - {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, - {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, - // Nested. - {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, - {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, - // Other things. - {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, - {"extension (unencoded)", messageWithExtension1}, - {"extension (encoded)", messageWithExtension3}, - // proto3 message - {"proto3 empty", &proto3pb.Message{}}, - {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, - {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, - {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, - {"proto3 float", &proto3pb.Message{Score: 12.6}}, - {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, - {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, - {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, - {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, - {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: {}}}}, - - {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, - {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: {F: Float64(2.0)}}}}, - {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, - {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: {}}}}, - - {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, - {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, - {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, - - {"oneof not set", &pb.Communique{}}, - {"oneof zero int32", &pb.Communique{Union: &pb.Communique_Number{Number: 0}}}, - {"oneof int32", &pb.Communique{Union: &pb.Communique_Number{Number: 3}}}, - {"oneof string", &pb.Communique{Union: &pb.Communique_Name{Name: "Rhythmic Fman"}}}, -} - -func TestSize(t *testing.T) { - for _, tc := range SizeTests { - size := Size(tc.pb) - b, err := Marshal(tc.pb) - if err != nil { - t.Errorf("%v: Marshal failed: %v", tc.desc, err) - continue - } - if size != len(b) { - t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) - t.Logf("%v: bytes: %#v", tc.desc, b) - } - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile deleted file mode 100644 index 31d83277c..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - -all: regenerate - -regenerate: - go install github.com/gogo/protobuf/protoc-min-version - protoc-min-version --version="3.0.0" --gogo_out=. test.proto - diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go deleted file mode 100644 index 8e8451537..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/golden_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -// Verify that the compiler output for test.proto is unchanged. - -package testdata - -import ( - "crypto/sha1" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" -) - -// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. -func sum(t *testing.T, name string) string { - data, err := ioutil.ReadFile(name) - if err != nil { - t.Fatal(err) - } - t.Logf("sum(%q): length is %d", name, len(data)) - hash := sha1.New() - _, err = hash.Write(data) - if err != nil { - t.Fatal(err) - } - return fmt.Sprintf("% x", hash.Sum(nil)) -} - -func run(t *testing.T, name string, args ...string) { - cmd := exec.Command(name, args...) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - if err != nil { - t.Fatal(err) - } -} - -func TestGolden(t *testing.T) { - // Compute the original checksum. - goldenSum := sum(t, "test.pb.go") - // Run the proto compiler. - run(t, "protoc", "--gogo_out="+os.TempDir(), "test.proto") - newFile := filepath.Join(os.TempDir(), "test.pb.go") - defer os.Remove(newFile) - // Compute the new checksum. - newSum := sum(t, newFile) - // Verify - if newSum != goldenSum { - run(t, "diff", "-u", "test.pb.go", newFile) - t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go deleted file mode 100644 index e92056955..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go +++ /dev/null @@ -1,2985 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: test.proto -// DO NOT EDIT! - -/* -Package testdata is a generated protocol buffer package. - -It is generated from these files: - test.proto - -It has these top-level messages: - GoEnum - GoTestField - GoTest - GoSkipTest - NonPackedTest - PackedTest - MaxTag - OldMessage - NewMessage - InnerMessage - OtherMessage - MyMessage - Ext - DefaultsMessage - MyMessageSet - Empty - MessageList - Strings - Defaults - SubDefaults - RepeatedEnum - MoreRepeated - GroupOld - GroupNew - FloatingPoint - MessageWithMap - Communique -*/ -package testdata - -import proto "github.com/gogo/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 - -type FOO int32 - -const ( - FOO_FOO1 FOO = 1 -) - -var FOO_name = map[int32]string{ - 1: "FOO1", -} -var FOO_value = map[string]int32{ - "FOO1": 1, -} - -func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p -} -func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) -} -func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") - if err != nil { - return err - } - *x = FOO(value) - return nil -} - -// An enum, for completeness. -type GoTest_KIND int32 - -const ( - GoTest_VOID GoTest_KIND = 0 - // Basic types - GoTest_BOOL GoTest_KIND = 1 - GoTest_BYTES GoTest_KIND = 2 - GoTest_FINGERPRINT GoTest_KIND = 3 - GoTest_FLOAT GoTest_KIND = 4 - GoTest_INT GoTest_KIND = 5 - GoTest_STRING GoTest_KIND = 6 - GoTest_TIME GoTest_KIND = 7 - // Groupings - GoTest_TUPLE GoTest_KIND = 8 - GoTest_ARRAY GoTest_KIND = 9 - GoTest_MAP GoTest_KIND = 10 - // Table types - GoTest_TABLE GoTest_KIND = 11 - // Functions - GoTest_FUNCTION GoTest_KIND = 12 -) - -var GoTest_KIND_name = map[int32]string{ - 0: "VOID", - 1: "BOOL", - 2: "BYTES", - 3: "FINGERPRINT", - 4: "FLOAT", - 5: "INT", - 6: "STRING", - 7: "TIME", - 8: "TUPLE", - 9: "ARRAY", - 10: "MAP", - 11: "TABLE", - 12: "FUNCTION", -} -var GoTest_KIND_value = map[string]int32{ - "VOID": 0, - "BOOL": 1, - "BYTES": 2, - "FINGERPRINT": 3, - "FLOAT": 4, - "INT": 5, - "STRING": 6, - "TIME": 7, - "TUPLE": 8, - "ARRAY": 9, - "MAP": 10, - "TABLE": 11, - "FUNCTION": 12, -} - -func (x GoTest_KIND) Enum() *GoTest_KIND { - p := new(GoTest_KIND) - *p = x - return p -} -func (x GoTest_KIND) String() string { - return proto.EnumName(GoTest_KIND_name, int32(x)) -} -func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") - if err != nil { - return err - } - *x = GoTest_KIND(value) - return nil -} - -type MyMessage_Color int32 - -const ( - MyMessage_RED MyMessage_Color = 0 - MyMessage_GREEN MyMessage_Color = 1 - MyMessage_BLUE MyMessage_Color = 2 -) - -var MyMessage_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var MyMessage_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x MyMessage_Color) Enum() *MyMessage_Color { - p := new(MyMessage_Color) - *p = x - return p -} -func (x MyMessage_Color) String() string { - return proto.EnumName(MyMessage_Color_name, int32(x)) -} -func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") - if err != nil { - return err - } - *x = MyMessage_Color(value) - return nil -} - -type DefaultsMessage_DefaultsEnum int32 - -const ( - DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 - DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 - DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 -) - -var DefaultsMessage_DefaultsEnum_name = map[int32]string{ - 0: "ZERO", - 1: "ONE", - 2: "TWO", -} -var DefaultsMessage_DefaultsEnum_value = map[string]int32{ - "ZERO": 0, - "ONE": 1, - "TWO": 2, -} - -func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { - p := new(DefaultsMessage_DefaultsEnum) - *p = x - return p -} -func (x DefaultsMessage_DefaultsEnum) String() string { - return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) -} -func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") - if err != nil { - return err - } - *x = DefaultsMessage_DefaultsEnum(value) - return nil -} - -type Defaults_Color int32 - -const ( - Defaults_RED Defaults_Color = 0 - Defaults_GREEN Defaults_Color = 1 - Defaults_BLUE Defaults_Color = 2 -) - -var Defaults_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var Defaults_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x Defaults_Color) Enum() *Defaults_Color { - p := new(Defaults_Color) - *p = x - return p -} -func (x Defaults_Color) String() string { - return proto.EnumName(Defaults_Color_name, int32(x)) -} -func (x *Defaults_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") - if err != nil { - return err - } - *x = Defaults_Color(value) - return nil -} - -type RepeatedEnum_Color int32 - -const ( - RepeatedEnum_RED RepeatedEnum_Color = 1 -) - -var RepeatedEnum_Color_name = map[int32]string{ - 1: "RED", -} -var RepeatedEnum_Color_value = map[string]int32{ - "RED": 1, -} - -func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { - p := new(RepeatedEnum_Color) - *p = x - return p -} -func (x RepeatedEnum_Color) String() string { - return proto.EnumName(RepeatedEnum_Color_name, int32(x)) -} -func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") - if err != nil { - return err - } - *x = RepeatedEnum_Color(value) - return nil -} - -type GoEnum struct { - Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoEnum) Reset() { *m = GoEnum{} } -func (m *GoEnum) String() string { return proto.CompactTextString(m) } -func (*GoEnum) ProtoMessage() {} - -func (m *GoEnum) GetFoo() FOO { - if m != nil && m.Foo != nil { - return *m.Foo - } - return FOO_FOO1 -} - -type GoTestField struct { - Label *string `protobuf:"bytes,1,req,name=Label" json:"Label,omitempty"` - Type *string `protobuf:"bytes,2,req,name=Type" json:"Type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTestField) Reset() { *m = GoTestField{} } -func (m *GoTestField) String() string { return proto.CompactTextString(m) } -func (*GoTestField) ProtoMessage() {} - -func (m *GoTestField) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *GoTestField) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -type GoTest struct { - // Some typical parameters - Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` - Table *string `protobuf:"bytes,2,opt,name=Table" json:"Table,omitempty"` - Param *int32 `protobuf:"varint,3,opt,name=Param" json:"Param,omitempty"` - // Required, repeated and optional foreign fields. - RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField" json:"RequiredField,omitempty"` - RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField" json:"RepeatedField,omitempty"` - OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField" json:"OptionalField,omitempty"` - // Required fields of all basic types - F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required" json:"F_Bool_required,omitempty"` - F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required" json:"F_Int32_required,omitempty"` - F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required" json:"F_Int64_required,omitempty"` - F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required" json:"F_Fixed32_required,omitempty"` - F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required" json:"F_Fixed64_required,omitempty"` - F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required" json:"F_Uint32_required,omitempty"` - F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required" json:"F_Uint64_required,omitempty"` - F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required" json:"F_Float_required,omitempty"` - F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required" json:"F_Double_required,omitempty"` - F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required" json:"F_String_required,omitempty"` - F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required" json:"F_Bytes_required,omitempty"` - F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required" json:"F_Sint32_required,omitempty"` - F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required" json:"F_Sint64_required,omitempty"` - // Repeated fields of all basic types - F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated" json:"F_Bool_repeated,omitempty"` - F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated" json:"F_Int32_repeated,omitempty"` - F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated" json:"F_Int64_repeated,omitempty"` - F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated" json:"F_Fixed32_repeated,omitempty"` - F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated" json:"F_Fixed64_repeated,omitempty"` - F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated" json:"F_Uint32_repeated,omitempty"` - F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated" json:"F_Uint64_repeated,omitempty"` - F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated" json:"F_Float_repeated,omitempty"` - F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated" json:"F_Double_repeated,omitempty"` - F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated" json:"F_String_repeated,omitempty"` - F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated" json:"F_Bytes_repeated,omitempty"` - F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated" json:"F_Sint32_repeated,omitempty"` - F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated" json:"F_Sint64_repeated,omitempty"` - // Optional fields of all basic types - F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional" json:"F_Bool_optional,omitempty"` - F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional" json:"F_Int32_optional,omitempty"` - F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional" json:"F_Int64_optional,omitempty"` - F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional" json:"F_Fixed32_optional,omitempty"` - F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional" json:"F_Fixed64_optional,omitempty"` - F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional" json:"F_Uint32_optional,omitempty"` - F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional" json:"F_Uint64_optional,omitempty"` - F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional" json:"F_Float_optional,omitempty"` - F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional" json:"F_Double_optional,omitempty"` - F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional" json:"F_String_optional,omitempty"` - F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional" json:"F_Bytes_optional,omitempty"` - F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional" json:"F_Sint32_optional,omitempty"` - F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional" json:"F_Sint64_optional,omitempty"` - // Default-valued fields of all basic types - F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1" json:"F_Bool_defaulted,omitempty"` - F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32" json:"F_Int32_defaulted,omitempty"` - F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64" json:"F_Int64_defaulted,omitempty"` - F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` - F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` - F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` - F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` - F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159" json:"F_Float_defaulted,omitempty"` - F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828" json:"F_Double_defaulted,omitempty"` - F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` - F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` - F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` - F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` - // Packed repeated fields (no string or bytes). - F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed" json:"F_Bool_repeated_packed,omitempty"` - F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed" json:"F_Int32_repeated_packed,omitempty"` - F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed" json:"F_Int64_repeated_packed,omitempty"` - F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed" json:"F_Fixed32_repeated_packed,omitempty"` - F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed" json:"F_Fixed64_repeated_packed,omitempty"` - F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed" json:"F_Uint32_repeated_packed,omitempty"` - F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed" json:"F_Uint64_repeated_packed,omitempty"` - F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed" json:"F_Float_repeated_packed,omitempty"` - F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed" json:"F_Double_repeated_packed,omitempty"` - F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed" json:"F_Sint32_repeated_packed,omitempty"` - F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed" json:"F_Sint64_repeated_packed,omitempty"` - Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup" json:"requiredgroup,omitempty"` - Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup" json:"repeatedgroup,omitempty"` - Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest) Reset() { *m = GoTest{} } -func (m *GoTest) String() string { return proto.CompactTextString(m) } -func (*GoTest) ProtoMessage() {} - -const Default_GoTest_F_BoolDefaulted bool = true -const Default_GoTest_F_Int32Defaulted int32 = 32 -const Default_GoTest_F_Int64Defaulted int64 = 64 -const Default_GoTest_F_Fixed32Defaulted uint32 = 320 -const Default_GoTest_F_Fixed64Defaulted uint64 = 640 -const Default_GoTest_F_Uint32Defaulted uint32 = 3200 -const Default_GoTest_F_Uint64Defaulted uint64 = 6400 -const Default_GoTest_F_FloatDefaulted float32 = 314159 -const Default_GoTest_F_DoubleDefaulted float64 = 271828 -const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" - -var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") - -const Default_GoTest_F_Sint32Defaulted int32 = -32 -const Default_GoTest_F_Sint64Defaulted int64 = -64 - -func (m *GoTest) GetKind() GoTest_KIND { - if m != nil && m.Kind != nil { - return *m.Kind - } - return GoTest_VOID -} - -func (m *GoTest) GetTable() string { - if m != nil && m.Table != nil { - return *m.Table - } - return "" -} - -func (m *GoTest) GetParam() int32 { - if m != nil && m.Param != nil { - return *m.Param - } - return 0 -} - -func (m *GoTest) GetRequiredField() *GoTestField { - if m != nil { - return m.RequiredField - } - return nil -} - -func (m *GoTest) GetRepeatedField() []*GoTestField { - if m != nil { - return m.RepeatedField - } - return nil -} - -func (m *GoTest) GetOptionalField() *GoTestField { - if m != nil { - return m.OptionalField - } - return nil -} - -func (m *GoTest) GetF_BoolRequired() bool { - if m != nil && m.F_BoolRequired != nil { - return *m.F_BoolRequired - } - return false -} - -func (m *GoTest) GetF_Int32Required() int32 { - if m != nil && m.F_Int32Required != nil { - return *m.F_Int32Required - } - return 0 -} - -func (m *GoTest) GetF_Int64Required() int64 { - if m != nil && m.F_Int64Required != nil { - return *m.F_Int64Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Required() uint32 { - if m != nil && m.F_Fixed32Required != nil { - return *m.F_Fixed32Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Required() uint64 { - if m != nil && m.F_Fixed64Required != nil { - return *m.F_Fixed64Required - } - return 0 -} - -func (m *GoTest) GetF_Uint32Required() uint32 { - if m != nil && m.F_Uint32Required != nil { - return *m.F_Uint32Required - } - return 0 -} - -func (m *GoTest) GetF_Uint64Required() uint64 { - if m != nil && m.F_Uint64Required != nil { - return *m.F_Uint64Required - } - return 0 -} - -func (m *GoTest) GetF_FloatRequired() float32 { - if m != nil && m.F_FloatRequired != nil { - return *m.F_FloatRequired - } - return 0 -} - -func (m *GoTest) GetF_DoubleRequired() float64 { - if m != nil && m.F_DoubleRequired != nil { - return *m.F_DoubleRequired - } - return 0 -} - -func (m *GoTest) GetF_StringRequired() string { - if m != nil && m.F_StringRequired != nil { - return *m.F_StringRequired - } - return "" -} - -func (m *GoTest) GetF_BytesRequired() []byte { - if m != nil { - return m.F_BytesRequired - } - return nil -} - -func (m *GoTest) GetF_Sint32Required() int32 { - if m != nil && m.F_Sint32Required != nil { - return *m.F_Sint32Required - } - return 0 -} - -func (m *GoTest) GetF_Sint64Required() int64 { - if m != nil && m.F_Sint64Required != nil { - return *m.F_Sint64Required - } - return 0 -} - -func (m *GoTest) GetF_BoolRepeated() []bool { - if m != nil { - return m.F_BoolRepeated - } - return nil -} - -func (m *GoTest) GetF_Int32Repeated() []int32 { - if m != nil { - return m.F_Int32Repeated - } - return nil -} - -func (m *GoTest) GetF_Int64Repeated() []int64 { - if m != nil { - return m.F_Int64Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed32Repeated() []uint32 { - if m != nil { - return m.F_Fixed32Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed64Repeated() []uint64 { - if m != nil { - return m.F_Fixed64Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint32Repeated() []uint32 { - if m != nil { - return m.F_Uint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint64Repeated() []uint64 { - if m != nil { - return m.F_Uint64Repeated - } - return nil -} - -func (m *GoTest) GetF_FloatRepeated() []float32 { - if m != nil { - return m.F_FloatRepeated - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeated() []float64 { - if m != nil { - return m.F_DoubleRepeated - } - return nil -} - -func (m *GoTest) GetF_StringRepeated() []string { - if m != nil { - return m.F_StringRepeated - } - return nil -} - -func (m *GoTest) GetF_BytesRepeated() [][]byte { - if m != nil { - return m.F_BytesRepeated - } - return nil -} - -func (m *GoTest) GetF_Sint32Repeated() []int32 { - if m != nil { - return m.F_Sint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Sint64Repeated() []int64 { - if m != nil { - return m.F_Sint64Repeated - } - return nil -} - -func (m *GoTest) GetF_BoolOptional() bool { - if m != nil && m.F_BoolOptional != nil { - return *m.F_BoolOptional - } - return false -} - -func (m *GoTest) GetF_Int32Optional() int32 { - if m != nil && m.F_Int32Optional != nil { - return *m.F_Int32Optional - } - return 0 -} - -func (m *GoTest) GetF_Int64Optional() int64 { - if m != nil && m.F_Int64Optional != nil { - return *m.F_Int64Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Optional() uint32 { - if m != nil && m.F_Fixed32Optional != nil { - return *m.F_Fixed32Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Optional() uint64 { - if m != nil && m.F_Fixed64Optional != nil { - return *m.F_Fixed64Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint32Optional() uint32 { - if m != nil && m.F_Uint32Optional != nil { - return *m.F_Uint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint64Optional() uint64 { - if m != nil && m.F_Uint64Optional != nil { - return *m.F_Uint64Optional - } - return 0 -} - -func (m *GoTest) GetF_FloatOptional() float32 { - if m != nil && m.F_FloatOptional != nil { - return *m.F_FloatOptional - } - return 0 -} - -func (m *GoTest) GetF_DoubleOptional() float64 { - if m != nil && m.F_DoubleOptional != nil { - return *m.F_DoubleOptional - } - return 0 -} - -func (m *GoTest) GetF_StringOptional() string { - if m != nil && m.F_StringOptional != nil { - return *m.F_StringOptional - } - return "" -} - -func (m *GoTest) GetF_BytesOptional() []byte { - if m != nil { - return m.F_BytesOptional - } - return nil -} - -func (m *GoTest) GetF_Sint32Optional() int32 { - if m != nil && m.F_Sint32Optional != nil { - return *m.F_Sint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Sint64Optional() int64 { - if m != nil && m.F_Sint64Optional != nil { - return *m.F_Sint64Optional - } - return 0 -} - -func (m *GoTest) GetF_BoolDefaulted() bool { - if m != nil && m.F_BoolDefaulted != nil { - return *m.F_BoolDefaulted - } - return Default_GoTest_F_BoolDefaulted -} - -func (m *GoTest) GetF_Int32Defaulted() int32 { - if m != nil && m.F_Int32Defaulted != nil { - return *m.F_Int32Defaulted - } - return Default_GoTest_F_Int32Defaulted -} - -func (m *GoTest) GetF_Int64Defaulted() int64 { - if m != nil && m.F_Int64Defaulted != nil { - return *m.F_Int64Defaulted - } - return Default_GoTest_F_Int64Defaulted -} - -func (m *GoTest) GetF_Fixed32Defaulted() uint32 { - if m != nil && m.F_Fixed32Defaulted != nil { - return *m.F_Fixed32Defaulted - } - return Default_GoTest_F_Fixed32Defaulted -} - -func (m *GoTest) GetF_Fixed64Defaulted() uint64 { - if m != nil && m.F_Fixed64Defaulted != nil { - return *m.F_Fixed64Defaulted - } - return Default_GoTest_F_Fixed64Defaulted -} - -func (m *GoTest) GetF_Uint32Defaulted() uint32 { - if m != nil && m.F_Uint32Defaulted != nil { - return *m.F_Uint32Defaulted - } - return Default_GoTest_F_Uint32Defaulted -} - -func (m *GoTest) GetF_Uint64Defaulted() uint64 { - if m != nil && m.F_Uint64Defaulted != nil { - return *m.F_Uint64Defaulted - } - return Default_GoTest_F_Uint64Defaulted -} - -func (m *GoTest) GetF_FloatDefaulted() float32 { - if m != nil && m.F_FloatDefaulted != nil { - return *m.F_FloatDefaulted - } - return Default_GoTest_F_FloatDefaulted -} - -func (m *GoTest) GetF_DoubleDefaulted() float64 { - if m != nil && m.F_DoubleDefaulted != nil { - return *m.F_DoubleDefaulted - } - return Default_GoTest_F_DoubleDefaulted -} - -func (m *GoTest) GetF_StringDefaulted() string { - if m != nil && m.F_StringDefaulted != nil { - return *m.F_StringDefaulted - } - return Default_GoTest_F_StringDefaulted -} - -func (m *GoTest) GetF_BytesDefaulted() []byte { - if m != nil && m.F_BytesDefaulted != nil { - return m.F_BytesDefaulted - } - return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) -} - -func (m *GoTest) GetF_Sint32Defaulted() int32 { - if m != nil && m.F_Sint32Defaulted != nil { - return *m.F_Sint32Defaulted - } - return Default_GoTest_F_Sint32Defaulted -} - -func (m *GoTest) GetF_Sint64Defaulted() int64 { - if m != nil && m.F_Sint64Defaulted != nil { - return *m.F_Sint64Defaulted - } - return Default_GoTest_F_Sint64Defaulted -} - -func (m *GoTest) GetF_BoolRepeatedPacked() []bool { - if m != nil { - return m.F_BoolRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { - if m != nil { - return m.F_Int32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { - if m != nil { - return m.F_Int64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Fixed32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Fixed64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Uint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Uint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { - if m != nil { - return m.F_FloatRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { - if m != nil { - return m.F_DoubleRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { - if m != nil { - return m.F_Sint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { - if m != nil { - return m.F_Sint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { - if m != nil { - return m.Requiredgroup - } - return nil -} - -func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { - if m != nil { - return m.Repeatedgroup - } - return nil -} - -func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil -} - -// Required, repeated, and optional groups. -type GoTest_RequiredGroup struct { - RequiredField *string `protobuf:"bytes,71,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } -func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RequiredGroup) ProtoMessage() {} - -func (m *GoTest_RequiredGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_RepeatedGroup struct { - RequiredField *string `protobuf:"bytes,81,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } -func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RepeatedGroup) ProtoMessage() {} - -func (m *GoTest_RepeatedGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,91,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } -func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_OptionalGroup) ProtoMessage() {} - -func (m *GoTest_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -type GoSkipTest struct { - SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32" json:"skip_int32,omitempty"` - SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32" json:"skip_fixed32,omitempty"` - SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64" json:"skip_fixed64,omitempty"` - SkipString *string `protobuf:"bytes,14,req,name=skip_string" json:"skip_string,omitempty"` - Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup" json:"skipgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } -func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest) ProtoMessage() {} - -func (m *GoSkipTest) GetSkipInt32() int32 { - if m != nil && m.SkipInt32 != nil { - return *m.SkipInt32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed32() uint32 { - if m != nil && m.SkipFixed32 != nil { - return *m.SkipFixed32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed64() uint64 { - if m != nil && m.SkipFixed64 != nil { - return *m.SkipFixed64 - } - return 0 -} - -func (m *GoSkipTest) GetSkipString() string { - if m != nil && m.SkipString != nil { - return *m.SkipString - } - return "" -} - -func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { - if m != nil { - return m.Skipgroup - } - return nil -} - -type GoSkipTest_SkipGroup struct { - GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32" json:"group_int32,omitempty"` - GroupString *string `protobuf:"bytes,17,req,name=group_string" json:"group_string,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } -func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest_SkipGroup) ProtoMessage() {} - -func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { - if m != nil && m.GroupInt32 != nil { - return *m.GroupInt32 - } - return 0 -} - -func (m *GoSkipTest_SkipGroup) GetGroupString() string { - if m != nil && m.GroupString != nil { - return *m.GroupString - } - return "" -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -type NonPackedTest struct { - A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } -func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } -func (*NonPackedTest) ProtoMessage() {} - -func (m *NonPackedTest) GetA() []int32 { - if m != nil { - return m.A - } - return nil -} - -type PackedTest struct { - B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PackedTest) Reset() { *m = PackedTest{} } -func (m *PackedTest) String() string { return proto.CompactTextString(m) } -func (*PackedTest) ProtoMessage() {} - -func (m *PackedTest) GetB() []int32 { - if m != nil { - return m.B - } - return nil -} - -type MaxTag struct { - // Maximum possible tag number. - LastField *string `protobuf:"bytes,536870911,opt,name=last_field" json:"last_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MaxTag) Reset() { *m = MaxTag{} } -func (m *MaxTag) String() string { return proto.CompactTextString(m) } -func (*MaxTag) ProtoMessage() {} - -func (m *MaxTag) GetLastField() string { - if m != nil && m.LastField != nil { - return *m.LastField - } - return "" -} - -type OldMessage struct { - Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage) Reset() { *m = OldMessage{} } -func (m *OldMessage) String() string { return proto.CompactTextString(m) } -func (*OldMessage) ProtoMessage() {} - -func (m *OldMessage) GetNested() *OldMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *OldMessage) GetNum() int32 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type OldMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } -func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*OldMessage_Nested) ProtoMessage() {} - -func (m *OldMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -type NewMessage struct { - Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - // This is an int32 in OldMessage. - Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage) Reset() { *m = NewMessage{} } -func (m *NewMessage) String() string { return proto.CompactTextString(m) } -func (*NewMessage) ProtoMessage() {} - -func (m *NewMessage) GetNested() *NewMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *NewMessage) GetNum() int64 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type NewMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - FoodGroup *string `protobuf:"bytes,2,opt,name=food_group" json:"food_group,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } -func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*NewMessage_Nested) ProtoMessage() {} - -func (m *NewMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *NewMessage_Nested) GetFoodGroup() string { - if m != nil && m.FoodGroup != nil { - return *m.FoodGroup - } - return "" -} - -type InnerMessage struct { - Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` - Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` - Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *InnerMessage) Reset() { *m = InnerMessage{} } -func (m *InnerMessage) String() string { return proto.CompactTextString(m) } -func (*InnerMessage) ProtoMessage() {} - -const Default_InnerMessage_Port int32 = 4000 - -func (m *InnerMessage) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *InnerMessage) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return Default_InnerMessage_Port -} - -func (m *InnerMessage) GetConnected() bool { - if m != nil && m.Connected != nil { - return *m.Connected - } - return false -} - -type OtherMessage struct { - Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` - Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OtherMessage) Reset() { *m = OtherMessage{} } -func (m *OtherMessage) String() string { return proto.CompactTextString(m) } -func (*OtherMessage) ProtoMessage() {} - -func (m *OtherMessage) GetKey() int64 { - if m != nil && m.Key != nil { - return *m.Key - } - return 0 -} - -func (m *OtherMessage) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *OtherMessage) GetWeight() float32 { - if m != nil && m.Weight != nil { - return *m.Weight - } - return 0 -} - -func (m *OtherMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner" json:"rep_inner,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup" json:"somegroup,omitempty"` - // This field becomes [][]byte in the generated code. - RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes" json:"rep_bytes,omitempty"` - Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage) Reset() { *m = MyMessage{} } -func (m *MyMessage) String() string { return proto.CompactTextString(m) } -func (*MyMessage) ProtoMessage() {} - -var extRange_MyMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessage -} -func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *MyMessage) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *MyMessage) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MyMessage) GetQuote() string { - if m != nil && m.Quote != nil { - return *m.Quote - } - return "" -} - -func (m *MyMessage) GetPet() []string { - if m != nil { - return m.Pet - } - return nil -} - -func (m *MyMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -func (m *MyMessage) GetOthers() []*OtherMessage { - if m != nil { - return m.Others - } - return nil -} - -func (m *MyMessage) GetRepInner() []*InnerMessage { - if m != nil { - return m.RepInner - } - return nil -} - -func (m *MyMessage) GetBikeshed() MyMessage_Color { - if m != nil && m.Bikeshed != nil { - return *m.Bikeshed - } - return MyMessage_RED -} - -func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { - if m != nil { - return m.Somegroup - } - return nil -} - -func (m *MyMessage) GetRepBytes() [][]byte { - if m != nil { - return m.RepBytes - } - return nil -} - -func (m *MyMessage) GetBigfloat() float64 { - if m != nil && m.Bigfloat != nil { - return *m.Bigfloat - } - return 0 -} - -type MyMessage_SomeGroup struct { - GroupField *int32 `protobuf:"varint,9,opt,name=group_field" json:"group_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } -func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } -func (*MyMessage_SomeGroup) ProtoMessage() {} - -func (m *MyMessage_SomeGroup) GetGroupField() int32 { - if m != nil && m.GroupField != nil { - return *m.GroupField - } - return 0 -} - -type Ext struct { - Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ext) Reset() { *m = Ext{} } -func (m *Ext) String() string { return proto.CompactTextString(m) } -func (*Ext) ProtoMessage() {} - -func (m *Ext) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -var E_Ext_More = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*Ext)(nil), - Field: 103, - Name: "testdata.Ext.more", - Tag: "bytes,103,opt,name=more", -} - -var E_Ext_Text = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*string)(nil), - Field: 104, - Name: "testdata.Ext.text", - Tag: "bytes,104,opt,name=text", -} - -var E_Ext_Number = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 105, - Name: "testdata.Ext.number", - Tag: "varint,105,opt,name=number", -} - -type DefaultsMessage struct { - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } -func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } -func (*DefaultsMessage) ProtoMessage() {} - -var extRange_DefaultsMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_DefaultsMessage -} -func (m *DefaultsMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -type MyMessageSet struct { - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } -func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } -func (*MyMessageSet) ProtoMessage() {} - -func (m *MyMessageSet) Marshal() ([]byte, error) { - return proto.MarshalMessageSet(m.ExtensionMap()) -} -func (m *MyMessageSet) Unmarshal(buf []byte) error { - return proto.UnmarshalMessageSet(buf, m.ExtensionMap()) -} -func (m *MyMessageSet) MarshalJSON() ([]byte, error) { - return proto.MarshalMessageSetJSON(m.XXX_extensions) -} -func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { - return proto.UnmarshalMessageSetJSON(buf, m.XXX_extensions) -} - -// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler -var _ proto.Marshaler = (*MyMessageSet)(nil) -var _ proto.Unmarshaler = (*MyMessageSet)(nil) - -var extRange_MyMessageSet = []proto.ExtensionRange{ - {100, 2147483646}, -} - -func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessageSet -} -func (m *MyMessageSet) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -type Empty struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} - -type MessageList struct { - Message []*MessageList_Message `protobuf:"group,1,rep,name=Message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList) Reset() { *m = MessageList{} } -func (m *MessageList) String() string { return proto.CompactTextString(m) } -func (*MessageList) ProtoMessage() {} - -func (m *MessageList) GetMessage() []*MessageList_Message { - if m != nil { - return m.Message - } - return nil -} - -type MessageList_Message struct { - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } -func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } -func (*MessageList_Message) ProtoMessage() {} - -func (m *MessageList_Message) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MessageList_Message) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -type Strings struct { - StringField *string `protobuf:"bytes,1,opt,name=string_field" json:"string_field,omitempty"` - BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field" json:"bytes_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Strings) Reset() { *m = Strings{} } -func (m *Strings) String() string { return proto.CompactTextString(m) } -func (*Strings) ProtoMessage() {} - -func (m *Strings) GetStringField() string { - if m != nil && m.StringField != nil { - return *m.StringField - } - return "" -} - -func (m *Strings) GetBytesField() []byte { - if m != nil { - return m.BytesField - } - return nil -} - -type Defaults struct { - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,def=1" json:"F_Bool,omitempty"` - F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,def=32" json:"F_Int32,omitempty"` - F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,def=64" json:"F_Int64,omitempty"` - F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,def=320" json:"F_Fixed32,omitempty"` - F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,def=640" json:"F_Fixed64,omitempty"` - F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,def=3200" json:"F_Uint32,omitempty"` - F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,def=6400" json:"F_Uint64,omitempty"` - F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,def=314159" json:"F_Float,omitempty"` - F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,def=271828" json:"F_Double,omitempty"` - F_String *string `protobuf:"bytes,10,opt,name=F_String,def=hello, \"world!\"\n" json:"F_String,omitempty"` - F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,def=Bignose" json:"F_Bytes,omitempty"` - F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,def=-32" json:"F_Sint32,omitempty"` - F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,def=-64" json:"F_Sint64,omitempty"` - F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` - // More fields with crazy defaults. - F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,def=inf" json:"F_Pinf,omitempty"` - F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,def=-inf" json:"F_Ninf,omitempty"` - F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,def=nan" json:"F_Nan,omitempty"` - // Sub-message. - Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` - // Redundant but explicit defaults. - StrZero *string `protobuf:"bytes,19,opt,name=str_zero,def=" json:"str_zero,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Defaults) Reset() { *m = Defaults{} } -func (m *Defaults) String() string { return proto.CompactTextString(m) } -func (*Defaults) ProtoMessage() {} - -const Default_Defaults_F_Bool bool = true -const Default_Defaults_F_Int32 int32 = 32 -const Default_Defaults_F_Int64 int64 = 64 -const Default_Defaults_F_Fixed32 uint32 = 320 -const Default_Defaults_F_Fixed64 uint64 = 640 -const Default_Defaults_F_Uint32 uint32 = 3200 -const Default_Defaults_F_Uint64 uint64 = 6400 -const Default_Defaults_F_Float float32 = 314159 -const Default_Defaults_F_Double float64 = 271828 -const Default_Defaults_F_String string = "hello, \"world!\"\n" - -var Default_Defaults_F_Bytes []byte = []byte("Bignose") - -const Default_Defaults_F_Sint32 int32 = -32 -const Default_Defaults_F_Sint64 int64 = -64 -const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN - -var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) -var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) -var Default_Defaults_F_Nan float32 = float32(math.NaN()) - -func (m *Defaults) GetF_Bool() bool { - if m != nil && m.F_Bool != nil { - return *m.F_Bool - } - return Default_Defaults_F_Bool -} - -func (m *Defaults) GetF_Int32() int32 { - if m != nil && m.F_Int32 != nil { - return *m.F_Int32 - } - return Default_Defaults_F_Int32 -} - -func (m *Defaults) GetF_Int64() int64 { - if m != nil && m.F_Int64 != nil { - return *m.F_Int64 - } - return Default_Defaults_F_Int64 -} - -func (m *Defaults) GetF_Fixed32() uint32 { - if m != nil && m.F_Fixed32 != nil { - return *m.F_Fixed32 - } - return Default_Defaults_F_Fixed32 -} - -func (m *Defaults) GetF_Fixed64() uint64 { - if m != nil && m.F_Fixed64 != nil { - return *m.F_Fixed64 - } - return Default_Defaults_F_Fixed64 -} - -func (m *Defaults) GetF_Uint32() uint32 { - if m != nil && m.F_Uint32 != nil { - return *m.F_Uint32 - } - return Default_Defaults_F_Uint32 -} - -func (m *Defaults) GetF_Uint64() uint64 { - if m != nil && m.F_Uint64 != nil { - return *m.F_Uint64 - } - return Default_Defaults_F_Uint64 -} - -func (m *Defaults) GetF_Float() float32 { - if m != nil && m.F_Float != nil { - return *m.F_Float - } - return Default_Defaults_F_Float -} - -func (m *Defaults) GetF_Double() float64 { - if m != nil && m.F_Double != nil { - return *m.F_Double - } - return Default_Defaults_F_Double -} - -func (m *Defaults) GetF_String() string { - if m != nil && m.F_String != nil { - return *m.F_String - } - return Default_Defaults_F_String -} - -func (m *Defaults) GetF_Bytes() []byte { - if m != nil && m.F_Bytes != nil { - return m.F_Bytes - } - return append([]byte(nil), Default_Defaults_F_Bytes...) -} - -func (m *Defaults) GetF_Sint32() int32 { - if m != nil && m.F_Sint32 != nil { - return *m.F_Sint32 - } - return Default_Defaults_F_Sint32 -} - -func (m *Defaults) GetF_Sint64() int64 { - if m != nil && m.F_Sint64 != nil { - return *m.F_Sint64 - } - return Default_Defaults_F_Sint64 -} - -func (m *Defaults) GetF_Enum() Defaults_Color { - if m != nil && m.F_Enum != nil { - return *m.F_Enum - } - return Default_Defaults_F_Enum -} - -func (m *Defaults) GetF_Pinf() float32 { - if m != nil && m.F_Pinf != nil { - return *m.F_Pinf - } - return Default_Defaults_F_Pinf -} - -func (m *Defaults) GetF_Ninf() float32 { - if m != nil && m.F_Ninf != nil { - return *m.F_Ninf - } - return Default_Defaults_F_Ninf -} - -func (m *Defaults) GetF_Nan() float32 { - if m != nil && m.F_Nan != nil { - return *m.F_Nan - } - return Default_Defaults_F_Nan -} - -func (m *Defaults) GetSub() *SubDefaults { - if m != nil { - return m.Sub - } - return nil -} - -func (m *Defaults) GetStrZero() string { - if m != nil && m.StrZero != nil { - return *m.StrZero - } - return "" -} - -type SubDefaults struct { - N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SubDefaults) Reset() { *m = SubDefaults{} } -func (m *SubDefaults) String() string { return proto.CompactTextString(m) } -func (*SubDefaults) ProtoMessage() {} - -const Default_SubDefaults_N int64 = 7 - -func (m *SubDefaults) GetN() int64 { - if m != nil && m.N != nil { - return *m.N - } - return Default_SubDefaults_N -} - -type RepeatedEnum struct { - Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } -func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } -func (*RepeatedEnum) ProtoMessage() {} - -func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { - if m != nil { - return m.Color - } - return nil -} - -type MoreRepeated struct { - Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` - BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed" json:"bools_packed,omitempty"` - Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` - IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed" json:"ints_packed,omitempty"` - Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed" json:"int64s_packed,omitempty"` - Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` - Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } -func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } -func (*MoreRepeated) ProtoMessage() {} - -func (m *MoreRepeated) GetBools() []bool { - if m != nil { - return m.Bools - } - return nil -} - -func (m *MoreRepeated) GetBoolsPacked() []bool { - if m != nil { - return m.BoolsPacked - } - return nil -} - -func (m *MoreRepeated) GetInts() []int32 { - if m != nil { - return m.Ints - } - return nil -} - -func (m *MoreRepeated) GetIntsPacked() []int32 { - if m != nil { - return m.IntsPacked - } - return nil -} - -func (m *MoreRepeated) GetInt64SPacked() []int64 { - if m != nil { - return m.Int64SPacked - } - return nil -} - -func (m *MoreRepeated) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -func (m *MoreRepeated) GetFixeds() []uint32 { - if m != nil { - return m.Fixeds - } - return nil -} - -type GroupOld struct { - G *GroupOld_G `protobuf:"group,101,opt,name=G" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld) Reset() { *m = GroupOld{} } -func (m *GroupOld) String() string { return proto.CompactTextString(m) } -func (*GroupOld) ProtoMessage() {} - -func (m *GroupOld) GetG() *GroupOld_G { - if m != nil { - return m.G - } - return nil -} - -type GroupOld_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } -func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } -func (*GroupOld_G) ProtoMessage() {} - -func (m *GroupOld_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type GroupNew struct { - G *GroupNew_G `protobuf:"group,101,opt,name=G" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew) Reset() { *m = GroupNew{} } -func (m *GroupNew) String() string { return proto.CompactTextString(m) } -func (*GroupNew) ProtoMessage() {} - -func (m *GroupNew) GetG() *GroupNew_G { - if m != nil { - return m.G - } - return nil -} - -type GroupNew_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } -func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } -func (*GroupNew_G) ProtoMessage() {} - -func (m *GroupNew_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *GroupNew_G) GetY() int32 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -type FloatingPoint struct { - F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } -func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } -func (*FloatingPoint) ProtoMessage() {} - -func (m *FloatingPoint) GetF() float64 { - if m != nil && m.F != nil { - return *m.F - } - return 0 -} - -type MessageWithMap struct { - NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } -func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } -func (*MessageWithMap) ProtoMessage() {} - -func (m *MessageWithMap) GetNameMapping() map[int32]string { - if m != nil { - return m.NameMapping - } - return nil -} - -func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { - if m != nil { - return m.MsgMapping - } - return nil -} - -func (m *MessageWithMap) GetByteMapping() map[bool][]byte { - if m != nil { - return m.ByteMapping - } - return nil -} - -func (m *MessageWithMap) GetStrToStr() map[string]string { - if m != nil { - return m.StrToStr - } - return nil -} - -type Communique struct { - MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry" json:"make_me_cry,omitempty"` - // This is a oneof, called "union". - // - // Types that are valid to be assigned to Union: - // *Communique_Number - // *Communique_Name - // *Communique_Data - // *Communique_TempC - // *Communique_Col - // *Communique_Msg - Union isCommunique_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Communique) Reset() { *m = Communique{} } -func (m *Communique) String() string { return proto.CompactTextString(m) } -func (*Communique) ProtoMessage() {} - -type isCommunique_Union interface { - isCommunique_Union() -} - -type Communique_Number struct { - Number int32 `protobuf:"varint,5,opt,name=number,oneof"` -} -type Communique_Name struct { - Name string `protobuf:"bytes,6,opt,name=name,oneof"` -} -type Communique_Data struct { - Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` -} -type Communique_TempC struct { - TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,oneof"` -} -type Communique_Col struct { - Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=testdata.MyMessage_Color,oneof"` -} -type Communique_Msg struct { - Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` -} - -func (*Communique_Number) isCommunique_Union() {} -func (*Communique_Name) isCommunique_Union() {} -func (*Communique_Data) isCommunique_Union() {} -func (*Communique_TempC) isCommunique_Union() {} -func (*Communique_Col) isCommunique_Union() {} -func (*Communique_Msg) isCommunique_Union() {} - -func (m *Communique) GetUnion() isCommunique_Union { - if m != nil { - return m.Union - } - return nil -} - -func (m *Communique) GetMakeMeCry() bool { - if m != nil && m.MakeMeCry != nil { - return *m.MakeMeCry - } - return false -} - -func (m *Communique) GetNumber() int32 { - if x, ok := m.GetUnion().(*Communique_Number); ok { - return x.Number - } - return 0 -} - -func (m *Communique) GetName() string { - if x, ok := m.GetUnion().(*Communique_Name); ok { - return x.Name - } - return "" -} - -func (m *Communique) GetData() []byte { - if x, ok := m.GetUnion().(*Communique_Data); ok { - return x.Data - } - return nil -} - -func (m *Communique) GetTempC() float64 { - if x, ok := m.GetUnion().(*Communique_TempC); ok { - return x.TempC - } - return 0 -} - -func (m *Communique) GetCol() MyMessage_Color { - if x, ok := m.GetUnion().(*Communique_Col); ok { - return x.Col - } - return MyMessage_RED -} - -func (m *Communique) GetMsg() *Strings { - if x, ok := m.GetUnion().(*Communique_Msg); ok { - return x.Msg - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), []interface{}) { - return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, []interface{}{ - (*Communique_Number)(nil), - (*Communique_Name)(nil), - (*Communique_Data)(nil), - (*Communique_TempC)(nil), - (*Communique_Col)(nil), - (*Communique_Msg)(nil), - } -} - -func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*Communique) - // union - switch x := m.Union.(type) { - case *Communique_Number: - _ = b.EncodeVarint(5<<3 | proto.WireVarint) - _ = b.EncodeVarint(uint64(x.Number)) - case *Communique_Name: - _ = b.EncodeVarint(6<<3 | proto.WireBytes) - _ = b.EncodeStringBytes(x.Name) - case *Communique_Data: - _ = b.EncodeVarint(7<<3 | proto.WireBytes) - _ = b.EncodeRawBytes(x.Data) - case *Communique_TempC: - _ = b.EncodeVarint(8<<3 | proto.WireFixed64) - _ = b.EncodeFixed64(math.Float64bits(x.TempC)) - case *Communique_Col: - _ = b.EncodeVarint(9<<3 | proto.WireVarint) - _ = b.EncodeVarint(uint64(x.Col)) - case *Communique_Msg: - _ = b.EncodeVarint(10<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Msg); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("Communique.Union has unexpected type %T", x) - } - return nil -} - -func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*Communique) - switch tag { - case 5: // union.number - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Communique_Number{int32(x)} - return true, err - case 6: // union.name - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.Union = &Communique_Name{x} - return true, err - case 7: // union.data - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeRawBytes(true) - m.Union = &Communique_Data{x} - return true, err - case 8: // union.temp_c - if wire != proto.WireFixed64 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed64() - m.Union = &Communique_TempC{math.Float64frombits(x)} - return true, err - case 9: // union.col - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Communique_Col{MyMessage_Color(x)} - return true, err - case 10: // union.msg - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Strings) - err := b.DecodeMessage(msg) - m.Union = &Communique_Msg{msg} - return true, err - default: - return false, nil - } -} - -var E_Greeting = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: ([]string)(nil), - Field: 106, - Name: "testdata.greeting", - Tag: "bytes,106,rep,name=greeting", -} - -var E_NoDefaultDouble = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float64)(nil), - Field: 101, - Name: "testdata.no_default_double", - Tag: "fixed64,101,opt,name=no_default_double", -} - -var E_NoDefaultFloat = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float32)(nil), - Field: 102, - Name: "testdata.no_default_float", - Tag: "fixed32,102,opt,name=no_default_float", -} - -var E_NoDefaultInt32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 103, - Name: "testdata.no_default_int32", - Tag: "varint,103,opt,name=no_default_int32", -} - -var E_NoDefaultInt64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 104, - Name: "testdata.no_default_int64", - Tag: "varint,104,opt,name=no_default_int64", -} - -var E_NoDefaultUint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 105, - Name: "testdata.no_default_uint32", - Tag: "varint,105,opt,name=no_default_uint32", -} - -var E_NoDefaultUint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 106, - Name: "testdata.no_default_uint64", - Tag: "varint,106,opt,name=no_default_uint64", -} - -var E_NoDefaultSint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 107, - Name: "testdata.no_default_sint32", - Tag: "zigzag32,107,opt,name=no_default_sint32", -} - -var E_NoDefaultSint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 108, - Name: "testdata.no_default_sint64", - Tag: "zigzag64,108,opt,name=no_default_sint64", -} - -var E_NoDefaultFixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 109, - Name: "testdata.no_default_fixed32", - Tag: "fixed32,109,opt,name=no_default_fixed32", -} - -var E_NoDefaultFixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 110, - Name: "testdata.no_default_fixed64", - Tag: "fixed64,110,opt,name=no_default_fixed64", -} - -var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 111, - Name: "testdata.no_default_sfixed32", - Tag: "fixed32,111,opt,name=no_default_sfixed32", -} - -var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 112, - Name: "testdata.no_default_sfixed64", - Tag: "fixed64,112,opt,name=no_default_sfixed64", -} - -var E_NoDefaultBool = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 113, - Name: "testdata.no_default_bool", - Tag: "varint,113,opt,name=no_default_bool", -} - -var E_NoDefaultString = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*string)(nil), - Field: 114, - Name: "testdata.no_default_string", - Tag: "bytes,114,opt,name=no_default_string", -} - -var E_NoDefaultBytes = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: ([]byte)(nil), - Field: 115, - Name: "testdata.no_default_bytes", - Tag: "bytes,115,opt,name=no_default_bytes", -} - -var E_NoDefaultEnum = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), - Field: 116, - Name: "testdata.no_default_enum", - Tag: "varint,116,opt,name=no_default_enum,enum=testdata.DefaultsMessage_DefaultsEnum", -} - -var E_DefaultDouble = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float64)(nil), - Field: 201, - Name: "testdata.default_double", - Tag: "fixed64,201,opt,name=default_double,def=3.1415", -} - -var E_DefaultFloat = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float32)(nil), - Field: 202, - Name: "testdata.default_float", - Tag: "fixed32,202,opt,name=default_float,def=3.14", -} - -var E_DefaultInt32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 203, - Name: "testdata.default_int32", - Tag: "varint,203,opt,name=default_int32,def=42", -} - -var E_DefaultInt64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 204, - Name: "testdata.default_int64", - Tag: "varint,204,opt,name=default_int64,def=43", -} - -var E_DefaultUint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 205, - Name: "testdata.default_uint32", - Tag: "varint,205,opt,name=default_uint32,def=44", -} - -var E_DefaultUint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 206, - Name: "testdata.default_uint64", - Tag: "varint,206,opt,name=default_uint64,def=45", -} - -var E_DefaultSint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 207, - Name: "testdata.default_sint32", - Tag: "zigzag32,207,opt,name=default_sint32,def=46", -} - -var E_DefaultSint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 208, - Name: "testdata.default_sint64", - Tag: "zigzag64,208,opt,name=default_sint64,def=47", -} - -var E_DefaultFixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 209, - Name: "testdata.default_fixed32", - Tag: "fixed32,209,opt,name=default_fixed32,def=48", -} - -var E_DefaultFixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 210, - Name: "testdata.default_fixed64", - Tag: "fixed64,210,opt,name=default_fixed64,def=49", -} - -var E_DefaultSfixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 211, - Name: "testdata.default_sfixed32", - Tag: "fixed32,211,opt,name=default_sfixed32,def=50", -} - -var E_DefaultSfixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 212, - Name: "testdata.default_sfixed64", - Tag: "fixed64,212,opt,name=default_sfixed64,def=51", -} - -var E_DefaultBool = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 213, - Name: "testdata.default_bool", - Tag: "varint,213,opt,name=default_bool,def=1", -} - -var E_DefaultString = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*string)(nil), - Field: 214, - Name: "testdata.default_string", - Tag: "bytes,214,opt,name=default_string,def=Hello, string", -} - -var E_DefaultBytes = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: ([]byte)(nil), - Field: 215, - Name: "testdata.default_bytes", - Tag: "bytes,215,opt,name=default_bytes,def=Hello, bytes", -} - -var E_DefaultEnum = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), - Field: 216, - Name: "testdata.default_enum", - Tag: "varint,216,opt,name=default_enum,enum=testdata.DefaultsMessage_DefaultsEnum,def=1", -} - -var E_X201 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 201, - Name: "testdata.x201", - Tag: "bytes,201,opt,name=x201", -} - -var E_X202 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 202, - Name: "testdata.x202", - Tag: "bytes,202,opt,name=x202", -} - -var E_X203 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 203, - Name: "testdata.x203", - Tag: "bytes,203,opt,name=x203", -} - -var E_X204 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 204, - Name: "testdata.x204", - Tag: "bytes,204,opt,name=x204", -} - -var E_X205 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 205, - Name: "testdata.x205", - Tag: "bytes,205,opt,name=x205", -} - -var E_X206 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 206, - Name: "testdata.x206", - Tag: "bytes,206,opt,name=x206", -} - -var E_X207 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 207, - Name: "testdata.x207", - Tag: "bytes,207,opt,name=x207", -} - -var E_X208 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 208, - Name: "testdata.x208", - Tag: "bytes,208,opt,name=x208", -} - -var E_X209 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 209, - Name: "testdata.x209", - Tag: "bytes,209,opt,name=x209", -} - -var E_X210 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 210, - Name: "testdata.x210", - Tag: "bytes,210,opt,name=x210", -} - -var E_X211 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 211, - Name: "testdata.x211", - Tag: "bytes,211,opt,name=x211", -} - -var E_X212 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 212, - Name: "testdata.x212", - Tag: "bytes,212,opt,name=x212", -} - -var E_X213 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 213, - Name: "testdata.x213", - Tag: "bytes,213,opt,name=x213", -} - -var E_X214 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 214, - Name: "testdata.x214", - Tag: "bytes,214,opt,name=x214", -} - -var E_X215 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 215, - Name: "testdata.x215", - Tag: "bytes,215,opt,name=x215", -} - -var E_X216 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 216, - Name: "testdata.x216", - Tag: "bytes,216,opt,name=x216", -} - -var E_X217 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 217, - Name: "testdata.x217", - Tag: "bytes,217,opt,name=x217", -} - -var E_X218 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 218, - Name: "testdata.x218", - Tag: "bytes,218,opt,name=x218", -} - -var E_X219 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 219, - Name: "testdata.x219", - Tag: "bytes,219,opt,name=x219", -} - -var E_X220 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 220, - Name: "testdata.x220", - Tag: "bytes,220,opt,name=x220", -} - -var E_X221 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 221, - Name: "testdata.x221", - Tag: "bytes,221,opt,name=x221", -} - -var E_X222 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 222, - Name: "testdata.x222", - Tag: "bytes,222,opt,name=x222", -} - -var E_X223 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 223, - Name: "testdata.x223", - Tag: "bytes,223,opt,name=x223", -} - -var E_X224 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 224, - Name: "testdata.x224", - Tag: "bytes,224,opt,name=x224", -} - -var E_X225 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 225, - Name: "testdata.x225", - Tag: "bytes,225,opt,name=x225", -} - -var E_X226 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 226, - Name: "testdata.x226", - Tag: "bytes,226,opt,name=x226", -} - -var E_X227 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 227, - Name: "testdata.x227", - Tag: "bytes,227,opt,name=x227", -} - -var E_X228 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 228, - Name: "testdata.x228", - Tag: "bytes,228,opt,name=x228", -} - -var E_X229 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 229, - Name: "testdata.x229", - Tag: "bytes,229,opt,name=x229", -} - -var E_X230 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 230, - Name: "testdata.x230", - Tag: "bytes,230,opt,name=x230", -} - -var E_X231 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 231, - Name: "testdata.x231", - Tag: "bytes,231,opt,name=x231", -} - -var E_X232 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 232, - Name: "testdata.x232", - Tag: "bytes,232,opt,name=x232", -} - -var E_X233 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 233, - Name: "testdata.x233", - Tag: "bytes,233,opt,name=x233", -} - -var E_X234 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 234, - Name: "testdata.x234", - Tag: "bytes,234,opt,name=x234", -} - -var E_X235 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 235, - Name: "testdata.x235", - Tag: "bytes,235,opt,name=x235", -} - -var E_X236 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 236, - Name: "testdata.x236", - Tag: "bytes,236,opt,name=x236", -} - -var E_X237 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 237, - Name: "testdata.x237", - Tag: "bytes,237,opt,name=x237", -} - -var E_X238 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 238, - Name: "testdata.x238", - Tag: "bytes,238,opt,name=x238", -} - -var E_X239 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 239, - Name: "testdata.x239", - Tag: "bytes,239,opt,name=x239", -} - -var E_X240 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 240, - Name: "testdata.x240", - Tag: "bytes,240,opt,name=x240", -} - -var E_X241 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 241, - Name: "testdata.x241", - Tag: "bytes,241,opt,name=x241", -} - -var E_X242 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 242, - Name: "testdata.x242", - Tag: "bytes,242,opt,name=x242", -} - -var E_X243 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 243, - Name: "testdata.x243", - Tag: "bytes,243,opt,name=x243", -} - -var E_X244 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 244, - Name: "testdata.x244", - Tag: "bytes,244,opt,name=x244", -} - -var E_X245 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 245, - Name: "testdata.x245", - Tag: "bytes,245,opt,name=x245", -} - -var E_X246 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 246, - Name: "testdata.x246", - Tag: "bytes,246,opt,name=x246", -} - -var E_X247 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 247, - Name: "testdata.x247", - Tag: "bytes,247,opt,name=x247", -} - -var E_X248 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 248, - Name: "testdata.x248", - Tag: "bytes,248,opt,name=x248", -} - -var E_X249 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 249, - Name: "testdata.x249", - Tag: "bytes,249,opt,name=x249", -} - -var E_X250 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 250, - Name: "testdata.x250", - Tag: "bytes,250,opt,name=x250", -} - -func init() { - proto.RegisterType((*GoEnum)(nil), "testdata.GoEnum") - proto.RegisterType((*GoTestField)(nil), "testdata.GoTestField") - proto.RegisterType((*GoTest)(nil), "testdata.GoTest") - proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") - proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") - proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") - proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") - proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") - proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") - proto.RegisterType((*PackedTest)(nil), "testdata.PackedTest") - proto.RegisterType((*MaxTag)(nil), "testdata.MaxTag") - proto.RegisterType((*OldMessage)(nil), "testdata.OldMessage") - proto.RegisterType((*OldMessage_Nested)(nil), "testdata.OldMessage.Nested") - proto.RegisterType((*NewMessage)(nil), "testdata.NewMessage") - proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") - proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") - proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") - proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") - proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") - proto.RegisterType((*Ext)(nil), "testdata.Ext") - proto.RegisterType((*DefaultsMessage)(nil), "testdata.DefaultsMessage") - proto.RegisterType((*MyMessageSet)(nil), "testdata.MyMessageSet") - proto.RegisterType((*Empty)(nil), "testdata.Empty") - proto.RegisterType((*MessageList)(nil), "testdata.MessageList") - proto.RegisterType((*MessageList_Message)(nil), "testdata.MessageList.Message") - proto.RegisterType((*Strings)(nil), "testdata.Strings") - proto.RegisterType((*Defaults)(nil), "testdata.Defaults") - proto.RegisterType((*SubDefaults)(nil), "testdata.SubDefaults") - proto.RegisterType((*RepeatedEnum)(nil), "testdata.RepeatedEnum") - proto.RegisterType((*MoreRepeated)(nil), "testdata.MoreRepeated") - proto.RegisterType((*GroupOld)(nil), "testdata.GroupOld") - proto.RegisterType((*GroupOld_G)(nil), "testdata.GroupOld.G") - proto.RegisterType((*GroupNew)(nil), "testdata.GroupNew") - proto.RegisterType((*GroupNew_G)(nil), "testdata.GroupNew.G") - proto.RegisterType((*FloatingPoint)(nil), "testdata.FloatingPoint") - proto.RegisterType((*MessageWithMap)(nil), "testdata.MessageWithMap") - proto.RegisterType((*Communique)(nil), "testdata.Communique") - proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) - proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) - proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) - proto.RegisterEnum("testdata.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) - proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) - proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) - proto.RegisterExtension(E_Ext_More) - proto.RegisterExtension(E_Ext_Text) - proto.RegisterExtension(E_Ext_Number) - proto.RegisterExtension(E_Greeting) - proto.RegisterExtension(E_NoDefaultDouble) - proto.RegisterExtension(E_NoDefaultFloat) - proto.RegisterExtension(E_NoDefaultInt32) - proto.RegisterExtension(E_NoDefaultInt64) - proto.RegisterExtension(E_NoDefaultUint32) - proto.RegisterExtension(E_NoDefaultUint64) - proto.RegisterExtension(E_NoDefaultSint32) - proto.RegisterExtension(E_NoDefaultSint64) - proto.RegisterExtension(E_NoDefaultFixed32) - proto.RegisterExtension(E_NoDefaultFixed64) - proto.RegisterExtension(E_NoDefaultSfixed32) - proto.RegisterExtension(E_NoDefaultSfixed64) - proto.RegisterExtension(E_NoDefaultBool) - proto.RegisterExtension(E_NoDefaultString) - proto.RegisterExtension(E_NoDefaultBytes) - proto.RegisterExtension(E_NoDefaultEnum) - proto.RegisterExtension(E_DefaultDouble) - proto.RegisterExtension(E_DefaultFloat) - proto.RegisterExtension(E_DefaultInt32) - proto.RegisterExtension(E_DefaultInt64) - proto.RegisterExtension(E_DefaultUint32) - proto.RegisterExtension(E_DefaultUint64) - proto.RegisterExtension(E_DefaultSint32) - proto.RegisterExtension(E_DefaultSint64) - proto.RegisterExtension(E_DefaultFixed32) - proto.RegisterExtension(E_DefaultFixed64) - proto.RegisterExtension(E_DefaultSfixed32) - proto.RegisterExtension(E_DefaultSfixed64) - proto.RegisterExtension(E_DefaultBool) - proto.RegisterExtension(E_DefaultString) - proto.RegisterExtension(E_DefaultBytes) - proto.RegisterExtension(E_DefaultEnum) - proto.RegisterExtension(E_X201) - proto.RegisterExtension(E_X202) - proto.RegisterExtension(E_X203) - proto.RegisterExtension(E_X204) - proto.RegisterExtension(E_X205) - proto.RegisterExtension(E_X206) - proto.RegisterExtension(E_X207) - proto.RegisterExtension(E_X208) - proto.RegisterExtension(E_X209) - proto.RegisterExtension(E_X210) - proto.RegisterExtension(E_X211) - proto.RegisterExtension(E_X212) - proto.RegisterExtension(E_X213) - proto.RegisterExtension(E_X214) - proto.RegisterExtension(E_X215) - proto.RegisterExtension(E_X216) - proto.RegisterExtension(E_X217) - proto.RegisterExtension(E_X218) - proto.RegisterExtension(E_X219) - proto.RegisterExtension(E_X220) - proto.RegisterExtension(E_X221) - proto.RegisterExtension(E_X222) - proto.RegisterExtension(E_X223) - proto.RegisterExtension(E_X224) - proto.RegisterExtension(E_X225) - proto.RegisterExtension(E_X226) - proto.RegisterExtension(E_X227) - proto.RegisterExtension(E_X228) - proto.RegisterExtension(E_X229) - proto.RegisterExtension(E_X230) - proto.RegisterExtension(E_X231) - proto.RegisterExtension(E_X232) - proto.RegisterExtension(E_X233) - proto.RegisterExtension(E_X234) - proto.RegisterExtension(E_X235) - proto.RegisterExtension(E_X236) - proto.RegisterExtension(E_X237) - proto.RegisterExtension(E_X238) - proto.RegisterExtension(E_X239) - proto.RegisterExtension(E_X240) - proto.RegisterExtension(E_X241) - proto.RegisterExtension(E_X242) - proto.RegisterExtension(E_X243) - proto.RegisterExtension(E_X244) - proto.RegisterExtension(E_X245) - proto.RegisterExtension(E_X246) - proto.RegisterExtension(E_X247) - proto.RegisterExtension(E_X248) - proto.RegisterExtension(E_X249) - proto.RegisterExtension(E_X250) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden deleted file mode 100644 index 0387853d5..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden +++ /dev/null @@ -1,1737 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: test.proto -// DO NOT EDIT! - -package testdata - -import proto "github.com/gogo/protobuf/proto" -import json "encoding/json" -import math "math" - -import () - -// Reference proto, json, and math imports to suppress error if they are not otherwise used. -var _ = proto.Marshal -var _ = &json.SyntaxError{} -var _ = math.Inf - -type FOO int32 - -const ( - FOO_FOO1 FOO = 1 -) - -var FOO_name = map[int32]string{ - 1: "FOO1", -} -var FOO_value = map[string]int32{ - "FOO1": 1, -} - -func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p -} -func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) -} -func (x FOO) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") - if err != nil { - return err - } - *x = FOO(value) - return nil -} - -type GoTest_KIND int32 - -const ( - GoTest_VOID GoTest_KIND = 0 - GoTest_BOOL GoTest_KIND = 1 - GoTest_BYTES GoTest_KIND = 2 - GoTest_FINGERPRINT GoTest_KIND = 3 - GoTest_FLOAT GoTest_KIND = 4 - GoTest_INT GoTest_KIND = 5 - GoTest_STRING GoTest_KIND = 6 - GoTest_TIME GoTest_KIND = 7 - GoTest_TUPLE GoTest_KIND = 8 - GoTest_ARRAY GoTest_KIND = 9 - GoTest_MAP GoTest_KIND = 10 - GoTest_TABLE GoTest_KIND = 11 - GoTest_FUNCTION GoTest_KIND = 12 -) - -var GoTest_KIND_name = map[int32]string{ - 0: "VOID", - 1: "BOOL", - 2: "BYTES", - 3: "FINGERPRINT", - 4: "FLOAT", - 5: "INT", - 6: "STRING", - 7: "TIME", - 8: "TUPLE", - 9: "ARRAY", - 10: "MAP", - 11: "TABLE", - 12: "FUNCTION", -} -var GoTest_KIND_value = map[string]int32{ - "VOID": 0, - "BOOL": 1, - "BYTES": 2, - "FINGERPRINT": 3, - "FLOAT": 4, - "INT": 5, - "STRING": 6, - "TIME": 7, - "TUPLE": 8, - "ARRAY": 9, - "MAP": 10, - "TABLE": 11, - "FUNCTION": 12, -} - -func (x GoTest_KIND) Enum() *GoTest_KIND { - p := new(GoTest_KIND) - *p = x - return p -} -func (x GoTest_KIND) String() string { - return proto.EnumName(GoTest_KIND_name, int32(x)) -} -func (x GoTest_KIND) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") - if err != nil { - return err - } - *x = GoTest_KIND(value) - return nil -} - -type MyMessage_Color int32 - -const ( - MyMessage_RED MyMessage_Color = 0 - MyMessage_GREEN MyMessage_Color = 1 - MyMessage_BLUE MyMessage_Color = 2 -) - -var MyMessage_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var MyMessage_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x MyMessage_Color) Enum() *MyMessage_Color { - p := new(MyMessage_Color) - *p = x - return p -} -func (x MyMessage_Color) String() string { - return proto.EnumName(MyMessage_Color_name, int32(x)) -} -func (x MyMessage_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") - if err != nil { - return err - } - *x = MyMessage_Color(value) - return nil -} - -type Defaults_Color int32 - -const ( - Defaults_RED Defaults_Color = 0 - Defaults_GREEN Defaults_Color = 1 - Defaults_BLUE Defaults_Color = 2 -) - -var Defaults_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var Defaults_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x Defaults_Color) Enum() *Defaults_Color { - p := new(Defaults_Color) - *p = x - return p -} -func (x Defaults_Color) String() string { - return proto.EnumName(Defaults_Color_name, int32(x)) -} -func (x Defaults_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *Defaults_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") - if err != nil { - return err - } - *x = Defaults_Color(value) - return nil -} - -type RepeatedEnum_Color int32 - -const ( - RepeatedEnum_RED RepeatedEnum_Color = 1 -) - -var RepeatedEnum_Color_name = map[int32]string{ - 1: "RED", -} -var RepeatedEnum_Color_value = map[string]int32{ - "RED": 1, -} - -func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { - p := new(RepeatedEnum_Color) - *p = x - return p -} -func (x RepeatedEnum_Color) String() string { - return proto.EnumName(RepeatedEnum_Color_name, int32(x)) -} -func (x RepeatedEnum_Color) MarshalJSON() ([]byte, error) { - return json.Marshal(x.String()) -} -func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") - if err != nil { - return err - } - *x = RepeatedEnum_Color(value) - return nil -} - -type GoEnum struct { - Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoEnum) Reset() { *m = GoEnum{} } -func (m *GoEnum) String() string { return proto.CompactTextString(m) } -func (*GoEnum) ProtoMessage() {} - -func (m *GoEnum) GetFoo() FOO { - if m != nil && m.Foo != nil { - return *m.Foo - } - return 0 -} - -type GoTestField struct { - Label *string `protobuf:"bytes,1,req" json:"Label,omitempty"` - Type *string `protobuf:"bytes,2,req" json:"Type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTestField) Reset() { *m = GoTestField{} } -func (m *GoTestField) String() string { return proto.CompactTextString(m) } -func (*GoTestField) ProtoMessage() {} - -func (m *GoTestField) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *GoTestField) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -type GoTest struct { - Kind *GoTest_KIND `protobuf:"varint,1,req,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` - Table *string `protobuf:"bytes,2,opt" json:"Table,omitempty"` - Param *int32 `protobuf:"varint,3,opt" json:"Param,omitempty"` - RequiredField *GoTestField `protobuf:"bytes,4,req" json:"RequiredField,omitempty"` - RepeatedField []*GoTestField `protobuf:"bytes,5,rep" json:"RepeatedField,omitempty"` - OptionalField *GoTestField `protobuf:"bytes,6,opt" json:"OptionalField,omitempty"` - F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required" json:"F_Bool_required,omitempty"` - F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required" json:"F_Int32_required,omitempty"` - F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required" json:"F_Int64_required,omitempty"` - F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required" json:"F_Fixed32_required,omitempty"` - F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required" json:"F_Fixed64_required,omitempty"` - F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required" json:"F_Uint32_required,omitempty"` - F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required" json:"F_Uint64_required,omitempty"` - F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required" json:"F_Float_required,omitempty"` - F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required" json:"F_Double_required,omitempty"` - F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required" json:"F_String_required,omitempty"` - F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required" json:"F_Bytes_required,omitempty"` - F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required" json:"F_Sint32_required,omitempty"` - F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required" json:"F_Sint64_required,omitempty"` - F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated" json:"F_Bool_repeated,omitempty"` - F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated" json:"F_Int32_repeated,omitempty"` - F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated" json:"F_Int64_repeated,omitempty"` - F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated" json:"F_Fixed32_repeated,omitempty"` - F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated" json:"F_Fixed64_repeated,omitempty"` - F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated" json:"F_Uint32_repeated,omitempty"` - F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated" json:"F_Uint64_repeated,omitempty"` - F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated" json:"F_Float_repeated,omitempty"` - F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated" json:"F_Double_repeated,omitempty"` - F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated" json:"F_String_repeated,omitempty"` - F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated" json:"F_Bytes_repeated,omitempty"` - F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated" json:"F_Sint32_repeated,omitempty"` - F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated" json:"F_Sint64_repeated,omitempty"` - F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional" json:"F_Bool_optional,omitempty"` - F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional" json:"F_Int32_optional,omitempty"` - F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional" json:"F_Int64_optional,omitempty"` - F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional" json:"F_Fixed32_optional,omitempty"` - F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional" json:"F_Fixed64_optional,omitempty"` - F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional" json:"F_Uint32_optional,omitempty"` - F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional" json:"F_Uint64_optional,omitempty"` - F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional" json:"F_Float_optional,omitempty"` - F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional" json:"F_Double_optional,omitempty"` - F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional" json:"F_String_optional,omitempty"` - F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional" json:"F_Bytes_optional,omitempty"` - F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional" json:"F_Sint32_optional,omitempty"` - F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional" json:"F_Sint64_optional,omitempty"` - F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1" json:"F_Bool_defaulted,omitempty"` - F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32" json:"F_Int32_defaulted,omitempty"` - F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64" json:"F_Int64_defaulted,omitempty"` - F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` - F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` - F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` - F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` - F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159" json:"F_Float_defaulted,omitempty"` - F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828" json:"F_Double_defaulted,omitempty"` - F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` - F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` - F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` - F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` - F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed" json:"F_Bool_repeated_packed,omitempty"` - F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed" json:"F_Int32_repeated_packed,omitempty"` - F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed" json:"F_Int64_repeated_packed,omitempty"` - F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed" json:"F_Fixed32_repeated_packed,omitempty"` - F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed" json:"F_Fixed64_repeated_packed,omitempty"` - F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed" json:"F_Uint32_repeated_packed,omitempty"` - F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed" json:"F_Uint64_repeated_packed,omitempty"` - F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed" json:"F_Float_repeated_packed,omitempty"` - F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed" json:"F_Double_repeated_packed,omitempty"` - F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed" json:"F_Sint32_repeated_packed,omitempty"` - F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed" json:"F_Sint64_repeated_packed,omitempty"` - Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup" json:"requiredgroup,omitempty"` - Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup" json:"repeatedgroup,omitempty"` - Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest) Reset() { *m = GoTest{} } -func (m *GoTest) String() string { return proto.CompactTextString(m) } -func (*GoTest) ProtoMessage() {} - -const Default_GoTest_F_BoolDefaulted bool = true -const Default_GoTest_F_Int32Defaulted int32 = 32 -const Default_GoTest_F_Int64Defaulted int64 = 64 -const Default_GoTest_F_Fixed32Defaulted uint32 = 320 -const Default_GoTest_F_Fixed64Defaulted uint64 = 640 -const Default_GoTest_F_Uint32Defaulted uint32 = 3200 -const Default_GoTest_F_Uint64Defaulted uint64 = 6400 -const Default_GoTest_F_FloatDefaulted float32 = 314159 -const Default_GoTest_F_DoubleDefaulted float64 = 271828 -const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" - -var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") - -const Default_GoTest_F_Sint32Defaulted int32 = -32 -const Default_GoTest_F_Sint64Defaulted int64 = -64 - -func (m *GoTest) GetKind() GoTest_KIND { - if m != nil && m.Kind != nil { - return *m.Kind - } - return 0 -} - -func (m *GoTest) GetTable() string { - if m != nil && m.Table != nil { - return *m.Table - } - return "" -} - -func (m *GoTest) GetParam() int32 { - if m != nil && m.Param != nil { - return *m.Param - } - return 0 -} - -func (m *GoTest) GetRequiredField() *GoTestField { - if m != nil { - return m.RequiredField - } - return nil -} - -func (m *GoTest) GetRepeatedField() []*GoTestField { - if m != nil { - return m.RepeatedField - } - return nil -} - -func (m *GoTest) GetOptionalField() *GoTestField { - if m != nil { - return m.OptionalField - } - return nil -} - -func (m *GoTest) GetF_BoolRequired() bool { - if m != nil && m.F_BoolRequired != nil { - return *m.F_BoolRequired - } - return false -} - -func (m *GoTest) GetF_Int32Required() int32 { - if m != nil && m.F_Int32Required != nil { - return *m.F_Int32Required - } - return 0 -} - -func (m *GoTest) GetF_Int64Required() int64 { - if m != nil && m.F_Int64Required != nil { - return *m.F_Int64Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Required() uint32 { - if m != nil && m.F_Fixed32Required != nil { - return *m.F_Fixed32Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Required() uint64 { - if m != nil && m.F_Fixed64Required != nil { - return *m.F_Fixed64Required - } - return 0 -} - -func (m *GoTest) GetF_Uint32Required() uint32 { - if m != nil && m.F_Uint32Required != nil { - return *m.F_Uint32Required - } - return 0 -} - -func (m *GoTest) GetF_Uint64Required() uint64 { - if m != nil && m.F_Uint64Required != nil { - return *m.F_Uint64Required - } - return 0 -} - -func (m *GoTest) GetF_FloatRequired() float32 { - if m != nil && m.F_FloatRequired != nil { - return *m.F_FloatRequired - } - return 0 -} - -func (m *GoTest) GetF_DoubleRequired() float64 { - if m != nil && m.F_DoubleRequired != nil { - return *m.F_DoubleRequired - } - return 0 -} - -func (m *GoTest) GetF_StringRequired() string { - if m != nil && m.F_StringRequired != nil { - return *m.F_StringRequired - } - return "" -} - -func (m *GoTest) GetF_BytesRequired() []byte { - if m != nil { - return m.F_BytesRequired - } - return nil -} - -func (m *GoTest) GetF_Sint32Required() int32 { - if m != nil && m.F_Sint32Required != nil { - return *m.F_Sint32Required - } - return 0 -} - -func (m *GoTest) GetF_Sint64Required() int64 { - if m != nil && m.F_Sint64Required != nil { - return *m.F_Sint64Required - } - return 0 -} - -func (m *GoTest) GetF_BoolRepeated() []bool { - if m != nil { - return m.F_BoolRepeated - } - return nil -} - -func (m *GoTest) GetF_Int32Repeated() []int32 { - if m != nil { - return m.F_Int32Repeated - } - return nil -} - -func (m *GoTest) GetF_Int64Repeated() []int64 { - if m != nil { - return m.F_Int64Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed32Repeated() []uint32 { - if m != nil { - return m.F_Fixed32Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed64Repeated() []uint64 { - if m != nil { - return m.F_Fixed64Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint32Repeated() []uint32 { - if m != nil { - return m.F_Uint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint64Repeated() []uint64 { - if m != nil { - return m.F_Uint64Repeated - } - return nil -} - -func (m *GoTest) GetF_FloatRepeated() []float32 { - if m != nil { - return m.F_FloatRepeated - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeated() []float64 { - if m != nil { - return m.F_DoubleRepeated - } - return nil -} - -func (m *GoTest) GetF_StringRepeated() []string { - if m != nil { - return m.F_StringRepeated - } - return nil -} - -func (m *GoTest) GetF_BytesRepeated() [][]byte { - if m != nil { - return m.F_BytesRepeated - } - return nil -} - -func (m *GoTest) GetF_Sint32Repeated() []int32 { - if m != nil { - return m.F_Sint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Sint64Repeated() []int64 { - if m != nil { - return m.F_Sint64Repeated - } - return nil -} - -func (m *GoTest) GetF_BoolOptional() bool { - if m != nil && m.F_BoolOptional != nil { - return *m.F_BoolOptional - } - return false -} - -func (m *GoTest) GetF_Int32Optional() int32 { - if m != nil && m.F_Int32Optional != nil { - return *m.F_Int32Optional - } - return 0 -} - -func (m *GoTest) GetF_Int64Optional() int64 { - if m != nil && m.F_Int64Optional != nil { - return *m.F_Int64Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Optional() uint32 { - if m != nil && m.F_Fixed32Optional != nil { - return *m.F_Fixed32Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Optional() uint64 { - if m != nil && m.F_Fixed64Optional != nil { - return *m.F_Fixed64Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint32Optional() uint32 { - if m != nil && m.F_Uint32Optional != nil { - return *m.F_Uint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint64Optional() uint64 { - if m != nil && m.F_Uint64Optional != nil { - return *m.F_Uint64Optional - } - return 0 -} - -func (m *GoTest) GetF_FloatOptional() float32 { - if m != nil && m.F_FloatOptional != nil { - return *m.F_FloatOptional - } - return 0 -} - -func (m *GoTest) GetF_DoubleOptional() float64 { - if m != nil && m.F_DoubleOptional != nil { - return *m.F_DoubleOptional - } - return 0 -} - -func (m *GoTest) GetF_StringOptional() string { - if m != nil && m.F_StringOptional != nil { - return *m.F_StringOptional - } - return "" -} - -func (m *GoTest) GetF_BytesOptional() []byte { - if m != nil { - return m.F_BytesOptional - } - return nil -} - -func (m *GoTest) GetF_Sint32Optional() int32 { - if m != nil && m.F_Sint32Optional != nil { - return *m.F_Sint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Sint64Optional() int64 { - if m != nil && m.F_Sint64Optional != nil { - return *m.F_Sint64Optional - } - return 0 -} - -func (m *GoTest) GetF_BoolDefaulted() bool { - if m != nil && m.F_BoolDefaulted != nil { - return *m.F_BoolDefaulted - } - return Default_GoTest_F_BoolDefaulted -} - -func (m *GoTest) GetF_Int32Defaulted() int32 { - if m != nil && m.F_Int32Defaulted != nil { - return *m.F_Int32Defaulted - } - return Default_GoTest_F_Int32Defaulted -} - -func (m *GoTest) GetF_Int64Defaulted() int64 { - if m != nil && m.F_Int64Defaulted != nil { - return *m.F_Int64Defaulted - } - return Default_GoTest_F_Int64Defaulted -} - -func (m *GoTest) GetF_Fixed32Defaulted() uint32 { - if m != nil && m.F_Fixed32Defaulted != nil { - return *m.F_Fixed32Defaulted - } - return Default_GoTest_F_Fixed32Defaulted -} - -func (m *GoTest) GetF_Fixed64Defaulted() uint64 { - if m != nil && m.F_Fixed64Defaulted != nil { - return *m.F_Fixed64Defaulted - } - return Default_GoTest_F_Fixed64Defaulted -} - -func (m *GoTest) GetF_Uint32Defaulted() uint32 { - if m != nil && m.F_Uint32Defaulted != nil { - return *m.F_Uint32Defaulted - } - return Default_GoTest_F_Uint32Defaulted -} - -func (m *GoTest) GetF_Uint64Defaulted() uint64 { - if m != nil && m.F_Uint64Defaulted != nil { - return *m.F_Uint64Defaulted - } - return Default_GoTest_F_Uint64Defaulted -} - -func (m *GoTest) GetF_FloatDefaulted() float32 { - if m != nil && m.F_FloatDefaulted != nil { - return *m.F_FloatDefaulted - } - return Default_GoTest_F_FloatDefaulted -} - -func (m *GoTest) GetF_DoubleDefaulted() float64 { - if m != nil && m.F_DoubleDefaulted != nil { - return *m.F_DoubleDefaulted - } - return Default_GoTest_F_DoubleDefaulted -} - -func (m *GoTest) GetF_StringDefaulted() string { - if m != nil && m.F_StringDefaulted != nil { - return *m.F_StringDefaulted - } - return Default_GoTest_F_StringDefaulted -} - -func (m *GoTest) GetF_BytesDefaulted() []byte { - if m != nil && m.F_BytesDefaulted != nil { - return m.F_BytesDefaulted - } - return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) -} - -func (m *GoTest) GetF_Sint32Defaulted() int32 { - if m != nil && m.F_Sint32Defaulted != nil { - return *m.F_Sint32Defaulted - } - return Default_GoTest_F_Sint32Defaulted -} - -func (m *GoTest) GetF_Sint64Defaulted() int64 { - if m != nil && m.F_Sint64Defaulted != nil { - return *m.F_Sint64Defaulted - } - return Default_GoTest_F_Sint64Defaulted -} - -func (m *GoTest) GetF_BoolRepeatedPacked() []bool { - if m != nil { - return m.F_BoolRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { - if m != nil { - return m.F_Int32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { - if m != nil { - return m.F_Int64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Fixed32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Fixed64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Uint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Uint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { - if m != nil { - return m.F_FloatRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { - if m != nil { - return m.F_DoubleRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { - if m != nil { - return m.F_Sint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { - if m != nil { - return m.F_Sint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { - if m != nil { - return m.Requiredgroup - } - return nil -} - -func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { - if m != nil { - return m.Repeatedgroup - } - return nil -} - -func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil -} - -type GoTest_RequiredGroup struct { - RequiredField *string `protobuf:"bytes,71,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } - -func (m *GoTest_RequiredGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_RepeatedGroup struct { - RequiredField *string `protobuf:"bytes,81,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } - -func (m *GoTest_RepeatedGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,91,req" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } - -func (m *GoTest_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoSkipTest struct { - SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32" json:"skip_int32,omitempty"` - SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32" json:"skip_fixed32,omitempty"` - SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64" json:"skip_fixed64,omitempty"` - SkipString *string `protobuf:"bytes,14,req,name=skip_string" json:"skip_string,omitempty"` - Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup" json:"skipgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } -func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest) ProtoMessage() {} - -func (m *GoSkipTest) GetSkipInt32() int32 { - if m != nil && m.SkipInt32 != nil { - return *m.SkipInt32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed32() uint32 { - if m != nil && m.SkipFixed32 != nil { - return *m.SkipFixed32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed64() uint64 { - if m != nil && m.SkipFixed64 != nil { - return *m.SkipFixed64 - } - return 0 -} - -func (m *GoSkipTest) GetSkipString() string { - if m != nil && m.SkipString != nil { - return *m.SkipString - } - return "" -} - -func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { - if m != nil { - return m.Skipgroup - } - return nil -} - -type GoSkipTest_SkipGroup struct { - GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32" json:"group_int32,omitempty"` - GroupString *string `protobuf:"bytes,17,req,name=group_string" json:"group_string,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } - -func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { - if m != nil && m.GroupInt32 != nil { - return *m.GroupInt32 - } - return 0 -} - -func (m *GoSkipTest_SkipGroup) GetGroupString() string { - if m != nil && m.GroupString != nil { - return *m.GroupString - } - return "" -} - -type NonPackedTest struct { - A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } -func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } -func (*NonPackedTest) ProtoMessage() {} - -func (m *NonPackedTest) GetA() []int32 { - if m != nil { - return m.A - } - return nil -} - -type PackedTest struct { - B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PackedTest) Reset() { *m = PackedTest{} } -func (m *PackedTest) String() string { return proto.CompactTextString(m) } -func (*PackedTest) ProtoMessage() {} - -func (m *PackedTest) GetB() []int32 { - if m != nil { - return m.B - } - return nil -} - -type MaxTag struct { - LastField *string `protobuf:"bytes,536870911,opt,name=last_field" json:"last_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MaxTag) Reset() { *m = MaxTag{} } -func (m *MaxTag) String() string { return proto.CompactTextString(m) } -func (*MaxTag) ProtoMessage() {} - -func (m *MaxTag) GetLastField() string { - if m != nil && m.LastField != nil { - return *m.LastField - } - return "" -} - -type OldMessage struct { - Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage) Reset() { *m = OldMessage{} } -func (m *OldMessage) String() string { return proto.CompactTextString(m) } -func (*OldMessage) ProtoMessage() {} - -func (m *OldMessage) GetNested() *OldMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -type OldMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } -func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*OldMessage_Nested) ProtoMessage() {} - -func (m *OldMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type NewMessage struct { - Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage) Reset() { *m = NewMessage{} } -func (m *NewMessage) String() string { return proto.CompactTextString(m) } -func (*NewMessage) ProtoMessage() {} - -func (m *NewMessage) GetNested() *NewMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -type NewMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - FoodGroup *string `protobuf:"bytes,2,opt,name=food_group" json:"food_group,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } -func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*NewMessage_Nested) ProtoMessage() {} - -func (m *NewMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *NewMessage_Nested) GetFoodGroup() string { - if m != nil && m.FoodGroup != nil { - return *m.FoodGroup - } - return "" -} - -type InnerMessage struct { - Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` - Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` - Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *InnerMessage) Reset() { *m = InnerMessage{} } -func (m *InnerMessage) String() string { return proto.CompactTextString(m) } -func (*InnerMessage) ProtoMessage() {} - -const Default_InnerMessage_Port int32 = 4000 - -func (m *InnerMessage) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *InnerMessage) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return Default_InnerMessage_Port -} - -func (m *InnerMessage) GetConnected() bool { - if m != nil && m.Connected != nil { - return *m.Connected - } - return false -} - -type OtherMessage struct { - Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` - Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OtherMessage) Reset() { *m = OtherMessage{} } -func (m *OtherMessage) String() string { return proto.CompactTextString(m) } -func (*OtherMessage) ProtoMessage() {} - -func (m *OtherMessage) GetKey() int64 { - if m != nil && m.Key != nil { - return *m.Key - } - return 0 -} - -func (m *OtherMessage) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *OtherMessage) GetWeight() float32 { - if m != nil && m.Weight != nil { - return *m.Weight - } - return 0 -} - -func (m *OtherMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup" json:"somegroup,omitempty"` - RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes" json:"rep_bytes,omitempty"` - Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage) Reset() { *m = MyMessage{} } -func (m *MyMessage) String() string { return proto.CompactTextString(m) } -func (*MyMessage) ProtoMessage() {} - -var extRange_MyMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessage -} -func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *MyMessage) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *MyMessage) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MyMessage) GetQuote() string { - if m != nil && m.Quote != nil { - return *m.Quote - } - return "" -} - -func (m *MyMessage) GetPet() []string { - if m != nil { - return m.Pet - } - return nil -} - -func (m *MyMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -func (m *MyMessage) GetOthers() []*OtherMessage { - if m != nil { - return m.Others - } - return nil -} - -func (m *MyMessage) GetBikeshed() MyMessage_Color { - if m != nil && m.Bikeshed != nil { - return *m.Bikeshed - } - return 0 -} - -func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { - if m != nil { - return m.Somegroup - } - return nil -} - -func (m *MyMessage) GetRepBytes() [][]byte { - if m != nil { - return m.RepBytes - } - return nil -} - -func (m *MyMessage) GetBigfloat() float64 { - if m != nil && m.Bigfloat != nil { - return *m.Bigfloat - } - return 0 -} - -type MyMessage_SomeGroup struct { - GroupField *int32 `protobuf:"varint,9,opt,name=group_field" json:"group_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } - -func (m *MyMessage_SomeGroup) GetGroupField() int32 { - if m != nil && m.GroupField != nil { - return *m.GroupField - } - return 0 -} - -type Ext struct { - Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ext) Reset() { *m = Ext{} } -func (m *Ext) String() string { return proto.CompactTextString(m) } -func (*Ext) ProtoMessage() {} - -func (m *Ext) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -var E_Ext_More = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*Ext)(nil), - Field: 103, - Name: "testdata.Ext.more", - Tag: "bytes,103,opt,name=more", -} - -var E_Ext_Text = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*string)(nil), - Field: 104, - Name: "testdata.Ext.text", - Tag: "bytes,104,opt,name=text", -} - -var E_Ext_Number = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 105, - Name: "testdata.Ext.number", - Tag: "varint,105,opt,name=number", -} - -type MessageList struct { - Message []*MessageList_Message `protobuf:"group,1,rep" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList) Reset() { *m = MessageList{} } -func (m *MessageList) String() string { return proto.CompactTextString(m) } -func (*MessageList) ProtoMessage() {} - -func (m *MessageList) GetMessage() []*MessageList_Message { - if m != nil { - return m.Message - } - return nil -} - -type MessageList_Message struct { - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } - -func (m *MessageList_Message) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MessageList_Message) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -type Strings struct { - StringField *string `protobuf:"bytes,1,opt,name=string_field" json:"string_field,omitempty"` - BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field" json:"bytes_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Strings) Reset() { *m = Strings{} } -func (m *Strings) String() string { return proto.CompactTextString(m) } -func (*Strings) ProtoMessage() {} - -func (m *Strings) GetStringField() string { - if m != nil && m.StringField != nil { - return *m.StringField - } - return "" -} - -func (m *Strings) GetBytesField() []byte { - if m != nil { - return m.BytesField - } - return nil -} - -type Defaults struct { - F_Bool *bool `protobuf:"varint,1,opt,def=1" json:"F_Bool,omitempty"` - F_Int32 *int32 `protobuf:"varint,2,opt,def=32" json:"F_Int32,omitempty"` - F_Int64 *int64 `protobuf:"varint,3,opt,def=64" json:"F_Int64,omitempty"` - F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,def=320" json:"F_Fixed32,omitempty"` - F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,def=640" json:"F_Fixed64,omitempty"` - F_Uint32 *uint32 `protobuf:"varint,6,opt,def=3200" json:"F_Uint32,omitempty"` - F_Uint64 *uint64 `protobuf:"varint,7,opt,def=6400" json:"F_Uint64,omitempty"` - F_Float *float32 `protobuf:"fixed32,8,opt,def=314159" json:"F_Float,omitempty"` - F_Double *float64 `protobuf:"fixed64,9,opt,def=271828" json:"F_Double,omitempty"` - F_String *string `protobuf:"bytes,10,opt,def=hello, \"world!\"\n" json:"F_String,omitempty"` - F_Bytes []byte `protobuf:"bytes,11,opt,def=Bignose" json:"F_Bytes,omitempty"` - F_Sint32 *int32 `protobuf:"zigzag32,12,opt,def=-32" json:"F_Sint32,omitempty"` - F_Sint64 *int64 `protobuf:"zigzag64,13,opt,def=-64" json:"F_Sint64,omitempty"` - F_Enum *Defaults_Color `protobuf:"varint,14,opt,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` - F_Pinf *float32 `protobuf:"fixed32,15,opt,def=inf" json:"F_Pinf,omitempty"` - F_Ninf *float32 `protobuf:"fixed32,16,opt,def=-inf" json:"F_Ninf,omitempty"` - F_Nan *float32 `protobuf:"fixed32,17,opt,def=nan" json:"F_Nan,omitempty"` - Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Defaults) Reset() { *m = Defaults{} } -func (m *Defaults) String() string { return proto.CompactTextString(m) } -func (*Defaults) ProtoMessage() {} - -const Default_Defaults_F_Bool bool = true -const Default_Defaults_F_Int32 int32 = 32 -const Default_Defaults_F_Int64 int64 = 64 -const Default_Defaults_F_Fixed32 uint32 = 320 -const Default_Defaults_F_Fixed64 uint64 = 640 -const Default_Defaults_F_Uint32 uint32 = 3200 -const Default_Defaults_F_Uint64 uint64 = 6400 -const Default_Defaults_F_Float float32 = 314159 -const Default_Defaults_F_Double float64 = 271828 -const Default_Defaults_F_String string = "hello, \"world!\"\n" - -var Default_Defaults_F_Bytes []byte = []byte("Bignose") - -const Default_Defaults_F_Sint32 int32 = -32 -const Default_Defaults_F_Sint64 int64 = -64 -const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN - -var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) -var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) -var Default_Defaults_F_Nan float32 = float32(math.NaN()) - -func (m *Defaults) GetF_Bool() bool { - if m != nil && m.F_Bool != nil { - return *m.F_Bool - } - return Default_Defaults_F_Bool -} - -func (m *Defaults) GetF_Int32() int32 { - if m != nil && m.F_Int32 != nil { - return *m.F_Int32 - } - return Default_Defaults_F_Int32 -} - -func (m *Defaults) GetF_Int64() int64 { - if m != nil && m.F_Int64 != nil { - return *m.F_Int64 - } - return Default_Defaults_F_Int64 -} - -func (m *Defaults) GetF_Fixed32() uint32 { - if m != nil && m.F_Fixed32 != nil { - return *m.F_Fixed32 - } - return Default_Defaults_F_Fixed32 -} - -func (m *Defaults) GetF_Fixed64() uint64 { - if m != nil && m.F_Fixed64 != nil { - return *m.F_Fixed64 - } - return Default_Defaults_F_Fixed64 -} - -func (m *Defaults) GetF_Uint32() uint32 { - if m != nil && m.F_Uint32 != nil { - return *m.F_Uint32 - } - return Default_Defaults_F_Uint32 -} - -func (m *Defaults) GetF_Uint64() uint64 { - if m != nil && m.F_Uint64 != nil { - return *m.F_Uint64 - } - return Default_Defaults_F_Uint64 -} - -func (m *Defaults) GetF_Float() float32 { - if m != nil && m.F_Float != nil { - return *m.F_Float - } - return Default_Defaults_F_Float -} - -func (m *Defaults) GetF_Double() float64 { - if m != nil && m.F_Double != nil { - return *m.F_Double - } - return Default_Defaults_F_Double -} - -func (m *Defaults) GetF_String() string { - if m != nil && m.F_String != nil { - return *m.F_String - } - return Default_Defaults_F_String -} - -func (m *Defaults) GetF_Bytes() []byte { - if m != nil && m.F_Bytes != nil { - return m.F_Bytes - } - return append([]byte(nil), Default_Defaults_F_Bytes...) -} - -func (m *Defaults) GetF_Sint32() int32 { - if m != nil && m.F_Sint32 != nil { - return *m.F_Sint32 - } - return Default_Defaults_F_Sint32 -} - -func (m *Defaults) GetF_Sint64() int64 { - if m != nil && m.F_Sint64 != nil { - return *m.F_Sint64 - } - return Default_Defaults_F_Sint64 -} - -func (m *Defaults) GetF_Enum() Defaults_Color { - if m != nil && m.F_Enum != nil { - return *m.F_Enum - } - return Default_Defaults_F_Enum -} - -func (m *Defaults) GetF_Pinf() float32 { - if m != nil && m.F_Pinf != nil { - return *m.F_Pinf - } - return Default_Defaults_F_Pinf -} - -func (m *Defaults) GetF_Ninf() float32 { - if m != nil && m.F_Ninf != nil { - return *m.F_Ninf - } - return Default_Defaults_F_Ninf -} - -func (m *Defaults) GetF_Nan() float32 { - if m != nil && m.F_Nan != nil { - return *m.F_Nan - } - return Default_Defaults_F_Nan -} - -func (m *Defaults) GetSub() *SubDefaults { - if m != nil { - return m.Sub - } - return nil -} - -type SubDefaults struct { - N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SubDefaults) Reset() { *m = SubDefaults{} } -func (m *SubDefaults) String() string { return proto.CompactTextString(m) } -func (*SubDefaults) ProtoMessage() {} - -const Default_SubDefaults_N int64 = 7 - -func (m *SubDefaults) GetN() int64 { - if m != nil && m.N != nil { - return *m.N - } - return Default_SubDefaults_N -} - -type RepeatedEnum struct { - Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } -func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } -func (*RepeatedEnum) ProtoMessage() {} - -func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { - if m != nil { - return m.Color - } - return nil -} - -type MoreRepeated struct { - Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` - BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed" json:"bools_packed,omitempty"` - Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` - IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed" json:"ints_packed,omitempty"` - Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } -func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } -func (*MoreRepeated) ProtoMessage() {} - -func (m *MoreRepeated) GetBools() []bool { - if m != nil { - return m.Bools - } - return nil -} - -func (m *MoreRepeated) GetBoolsPacked() []bool { - if m != nil { - return m.BoolsPacked - } - return nil -} - -func (m *MoreRepeated) GetInts() []int32 { - if m != nil { - return m.Ints - } - return nil -} - -func (m *MoreRepeated) GetIntsPacked() []int32 { - if m != nil { - return m.IntsPacked - } - return nil -} - -func (m *MoreRepeated) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -type GroupOld struct { - G *GroupOld_G `protobuf:"group,1,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld) Reset() { *m = GroupOld{} } -func (m *GroupOld) String() string { return proto.CompactTextString(m) } -func (*GroupOld) ProtoMessage() {} - -func (m *GroupOld) GetG() *GroupOld_G { - if m != nil { - return m.G - } - return nil -} - -type GroupOld_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } - -func (m *GroupOld_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type GroupNew struct { - G *GroupNew_G `protobuf:"group,1,opt" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew) Reset() { *m = GroupNew{} } -func (m *GroupNew) String() string { return proto.CompactTextString(m) } -func (*GroupNew) ProtoMessage() {} - -func (m *GroupNew) GetG() *GroupNew_G { - if m != nil { - return m.G - } - return nil -} - -type GroupNew_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } - -func (m *GroupNew_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *GroupNew_G) GetY() int32 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -var E_Greeting = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: ([]string)(nil), - Field: 106, - Name: "testdata.greeting", - Tag: "bytes,106,rep,name=greeting", -} - -func init() { - proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) - proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) - proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) - proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) - proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) - proto.RegisterExtension(E_Ext_More) - proto.RegisterExtension(E_Ext_Text) - proto.RegisterExtension(E_Ext_Number) - proto.RegisterExtension(E_Greeting) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto deleted file mode 100644 index 3d1cbb675..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/testdata/test.proto +++ /dev/null @@ -1,494 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -// A feature-rich test file for the protocol compiler and libraries. - -syntax = "proto2"; - -package testdata; - -enum FOO { FOO1 = 1; }; - -message GoEnum { - required FOO foo = 1; -} - -message GoTestField { - required string Label = 1; - required string Type = 2; -} - -message GoTest { - // An enum, for completeness. - enum KIND { - VOID = 0; - - // Basic types - BOOL = 1; - BYTES = 2; - FINGERPRINT = 3; - FLOAT = 4; - INT = 5; - STRING = 6; - TIME = 7; - - // Groupings - TUPLE = 8; - ARRAY = 9; - MAP = 10; - - // Table types - TABLE = 11; - - // Functions - FUNCTION = 12; // last tag - }; - - // Some typical parameters - required KIND Kind = 1; - optional string Table = 2; - optional int32 Param = 3; - - // Required, repeated and optional foreign fields. - required GoTestField RequiredField = 4; - repeated GoTestField RepeatedField = 5; - optional GoTestField OptionalField = 6; - - // Required fields of all basic types - required bool F_Bool_required = 10; - required int32 F_Int32_required = 11; - required int64 F_Int64_required = 12; - required fixed32 F_Fixed32_required = 13; - required fixed64 F_Fixed64_required = 14; - required uint32 F_Uint32_required = 15; - required uint64 F_Uint64_required = 16; - required float F_Float_required = 17; - required double F_Double_required = 18; - required string F_String_required = 19; - required bytes F_Bytes_required = 101; - required sint32 F_Sint32_required = 102; - required sint64 F_Sint64_required = 103; - - // Repeated fields of all basic types - repeated bool F_Bool_repeated = 20; - repeated int32 F_Int32_repeated = 21; - repeated int64 F_Int64_repeated = 22; - repeated fixed32 F_Fixed32_repeated = 23; - repeated fixed64 F_Fixed64_repeated = 24; - repeated uint32 F_Uint32_repeated = 25; - repeated uint64 F_Uint64_repeated = 26; - repeated float F_Float_repeated = 27; - repeated double F_Double_repeated = 28; - repeated string F_String_repeated = 29; - repeated bytes F_Bytes_repeated = 201; - repeated sint32 F_Sint32_repeated = 202; - repeated sint64 F_Sint64_repeated = 203; - - // Optional fields of all basic types - optional bool F_Bool_optional = 30; - optional int32 F_Int32_optional = 31; - optional int64 F_Int64_optional = 32; - optional fixed32 F_Fixed32_optional = 33; - optional fixed64 F_Fixed64_optional = 34; - optional uint32 F_Uint32_optional = 35; - optional uint64 F_Uint64_optional = 36; - optional float F_Float_optional = 37; - optional double F_Double_optional = 38; - optional string F_String_optional = 39; - optional bytes F_Bytes_optional = 301; - optional sint32 F_Sint32_optional = 302; - optional sint64 F_Sint64_optional = 303; - - // Default-valued fields of all basic types - optional bool F_Bool_defaulted = 40 [default=true]; - optional int32 F_Int32_defaulted = 41 [default=32]; - optional int64 F_Int64_defaulted = 42 [default=64]; - optional fixed32 F_Fixed32_defaulted = 43 [default=320]; - optional fixed64 F_Fixed64_defaulted = 44 [default=640]; - optional uint32 F_Uint32_defaulted = 45 [default=3200]; - optional uint64 F_Uint64_defaulted = 46 [default=6400]; - optional float F_Float_defaulted = 47 [default=314159.]; - optional double F_Double_defaulted = 48 [default=271828.]; - optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; - optional sint32 F_Sint32_defaulted = 402 [default = -32]; - optional sint64 F_Sint64_defaulted = 403 [default = -64]; - - // Packed repeated fields (no string or bytes). - repeated bool F_Bool_repeated_packed = 50 [packed=true]; - repeated int32 F_Int32_repeated_packed = 51 [packed=true]; - repeated int64 F_Int64_repeated_packed = 52 [packed=true]; - repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; - repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; - repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; - repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; - repeated float F_Float_repeated_packed = 57 [packed=true]; - repeated double F_Double_repeated_packed = 58 [packed=true]; - repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; - repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; - - // Required, repeated, and optional groups. - required group RequiredGroup = 70 { - required string RequiredField = 71; - }; - - repeated group RepeatedGroup = 80 { - required string RequiredField = 81; - }; - - optional group OptionalGroup = 90 { - required string RequiredField = 91; - }; -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -message GoSkipTest { - required int32 skip_int32 = 11; - required fixed32 skip_fixed32 = 12; - required fixed64 skip_fixed64 = 13; - required string skip_string = 14; - required group SkipGroup = 15 { - required int32 group_int32 = 16; - required string group_string = 17; - } -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -message NonPackedTest { - repeated int32 a = 1; -} - -message PackedTest { - repeated int32 b = 1 [packed=true]; -} - -message MaxTag { - // Maximum possible tag number. - optional string last_field = 536870911; -} - -message OldMessage { - message Nested { - optional string name = 1; - } - optional Nested nested = 1; - - optional int32 num = 2; -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -message NewMessage { - message Nested { - optional string name = 1; - optional string food_group = 2; - } - optional Nested nested = 1; - - // This is an int32 in OldMessage. - optional int64 num = 2; -} - -// Smaller tests for ASCII formatting. - -message InnerMessage { - required string host = 1; - optional int32 port = 2 [default=4000]; - optional bool connected = 3; -} - -message OtherMessage { - optional int64 key = 1; - optional bytes value = 2; - optional float weight = 3; - optional InnerMessage inner = 4; -} - -message MyMessage { - required int32 count = 1; - optional string name = 2; - optional string quote = 3; - repeated string pet = 4; - optional InnerMessage inner = 5; - repeated OtherMessage others = 6; - repeated InnerMessage rep_inner = 12; - - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - }; - optional Color bikeshed = 7; - - optional group SomeGroup = 8 { - optional int32 group_field = 9; - } - - // This field becomes [][]byte in the generated code. - repeated bytes rep_bytes = 10; - - optional double bigfloat = 11; - - extensions 100 to max; -} - -message Ext { - extend MyMessage { - optional Ext more = 103; - optional string text = 104; - optional int32 number = 105; - } - - optional string data = 1; -} - -extend MyMessage { - repeated string greeting = 106; -} - -message DefaultsMessage { - enum DefaultsEnum { - ZERO = 0; - ONE = 1; - TWO = 2; - }; - extensions 100 to max; -} - -extend DefaultsMessage { - optional double no_default_double = 101; - optional float no_default_float = 102; - optional int32 no_default_int32 = 103; - optional int64 no_default_int64 = 104; - optional uint32 no_default_uint32 = 105; - optional uint64 no_default_uint64 = 106; - optional sint32 no_default_sint32 = 107; - optional sint64 no_default_sint64 = 108; - optional fixed32 no_default_fixed32 = 109; - optional fixed64 no_default_fixed64 = 110; - optional sfixed32 no_default_sfixed32 = 111; - optional sfixed64 no_default_sfixed64 = 112; - optional bool no_default_bool = 113; - optional string no_default_string = 114; - optional bytes no_default_bytes = 115; - optional DefaultsMessage.DefaultsEnum no_default_enum = 116; - - optional double default_double = 201 [default = 3.1415]; - optional float default_float = 202 [default = 3.14]; - optional int32 default_int32 = 203 [default = 42]; - optional int64 default_int64 = 204 [default = 43]; - optional uint32 default_uint32 = 205 [default = 44]; - optional uint64 default_uint64 = 206 [default = 45]; - optional sint32 default_sint32 = 207 [default = 46]; - optional sint64 default_sint64 = 208 [default = 47]; - optional fixed32 default_fixed32 = 209 [default = 48]; - optional fixed64 default_fixed64 = 210 [default = 49]; - optional sfixed32 default_sfixed32 = 211 [default = 50]; - optional sfixed64 default_sfixed64 = 212 [default = 51]; - optional bool default_bool = 213 [default = true]; - optional string default_string = 214 [default = "Hello, string"]; - optional bytes default_bytes = 215 [default = "Hello, bytes"]; - optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; -} - -message MyMessageSet { - option message_set_wire_format = true; - extensions 100 to max; -} - -message Empty { -} - -extend MyMessageSet { - optional Empty x201 = 201; - optional Empty x202 = 202; - optional Empty x203 = 203; - optional Empty x204 = 204; - optional Empty x205 = 205; - optional Empty x206 = 206; - optional Empty x207 = 207; - optional Empty x208 = 208; - optional Empty x209 = 209; - optional Empty x210 = 210; - optional Empty x211 = 211; - optional Empty x212 = 212; - optional Empty x213 = 213; - optional Empty x214 = 214; - optional Empty x215 = 215; - optional Empty x216 = 216; - optional Empty x217 = 217; - optional Empty x218 = 218; - optional Empty x219 = 219; - optional Empty x220 = 220; - optional Empty x221 = 221; - optional Empty x222 = 222; - optional Empty x223 = 223; - optional Empty x224 = 224; - optional Empty x225 = 225; - optional Empty x226 = 226; - optional Empty x227 = 227; - optional Empty x228 = 228; - optional Empty x229 = 229; - optional Empty x230 = 230; - optional Empty x231 = 231; - optional Empty x232 = 232; - optional Empty x233 = 233; - optional Empty x234 = 234; - optional Empty x235 = 235; - optional Empty x236 = 236; - optional Empty x237 = 237; - optional Empty x238 = 238; - optional Empty x239 = 239; - optional Empty x240 = 240; - optional Empty x241 = 241; - optional Empty x242 = 242; - optional Empty x243 = 243; - optional Empty x244 = 244; - optional Empty x245 = 245; - optional Empty x246 = 246; - optional Empty x247 = 247; - optional Empty x248 = 248; - optional Empty x249 = 249; - optional Empty x250 = 250; -} - -message MessageList { - repeated group Message = 1 { - required string name = 2; - required int32 count = 3; - } -} - -message Strings { - optional string string_field = 1; - optional bytes bytes_field = 2; -} - -message Defaults { - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - } - - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - optional bool F_Bool = 1 [default=true]; - optional int32 F_Int32 = 2 [default=32]; - optional int64 F_Int64 = 3 [default=64]; - optional fixed32 F_Fixed32 = 4 [default=320]; - optional fixed64 F_Fixed64 = 5 [default=640]; - optional uint32 F_Uint32 = 6 [default=3200]; - optional uint64 F_Uint64 = 7 [default=6400]; - optional float F_Float = 8 [default=314159.]; - optional double F_Double = 9 [default=271828.]; - optional string F_String = 10 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes = 11 [default="Bignose"]; - optional sint32 F_Sint32 = 12 [default=-32]; - optional sint64 F_Sint64 = 13 [default=-64]; - optional Color F_Enum = 14 [default=GREEN]; - - // More fields with crazy defaults. - optional float F_Pinf = 15 [default=inf]; - optional float F_Ninf = 16 [default=-inf]; - optional float F_Nan = 17 [default=nan]; - - // Sub-message. - optional SubDefaults sub = 18; - - // Redundant but explicit defaults. - optional string str_zero = 19 [default=""]; -} - -message SubDefaults { - optional int64 n = 1 [default=7]; -} - -message RepeatedEnum { - enum Color { - RED = 1; - } - repeated Color color = 1; -} - -message MoreRepeated { - repeated bool bools = 1; - repeated bool bools_packed = 2 [packed=true]; - repeated int32 ints = 3; - repeated int32 ints_packed = 4 [packed=true]; - repeated int64 int64s_packed = 7 [packed=true]; - repeated string strings = 5; - repeated fixed32 fixeds = 6; -} - -// GroupOld and GroupNew have the same wire format. -// GroupNew has a new field inside a group. - -message GroupOld { - optional group G = 101 { - optional int32 x = 2; - } -} - -message GroupNew { - optional group G = 101 { - optional int32 x = 2; - optional int32 y = 3; - } -} - -message FloatingPoint { - required double f = 1; -} - -message MessageWithMap { - map name_mapping = 1; - map msg_mapping = 2; - map byte_mapping = 3; - map str_to_str = 4; -} - -message Communique { - optional bool make_me_cry = 1; - - // This is a oneof, called "union". - oneof union { - int32 number = 5; - string name = 6; - bytes data = 7; - double temp_c = 8; - MyMessage.Color col = 9; - Strings msg = 10; - } -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go deleted file mode 100644 index 664846c40..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_parser_test.go +++ /dev/null @@ -1,532 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "math" - "reflect" - "testing" - - . "github.com/gogo/protobuf/proto" - proto3pb "github.com/gogo/protobuf/proto/proto3_proto" - . "github.com/gogo/protobuf/proto/testdata" -) - -type UnmarshalTextTest struct { - in string - err string // if "", no error expected - out *MyMessage -} - -func buildExtStructTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_More, &Ext{ - Data: String("Hello, world!"), - }) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtDataTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_Text, String("Hello, world!")) - SetExtension(msg, E_Ext_Number, Int32(1729)) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtRepStringTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { - panic(err) - } - return UnmarshalTextTest{in: text, out: msg} -} - -var unMarshalTextTests = []UnmarshalTextTest{ - // Basic - { - in: " count:42\n name:\"Dave\" ", - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - }, - }, - - // Empty quoted string - { - in: `count:42 name:""`, - out: &MyMessage{ - Count: Int32(42), - Name: String(""), - }, - }, - - // Quoted string concatenation - { - in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string with escaped apostrophe - { - in: `count:42 name: "HOLIDAY - New Year\'s Day"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("HOLIDAY - New Year's Day"), - }, - }, - - // Quoted string with single quote - { - in: `count:42 name: 'Roger "The Ramster" Ramjet'`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`Roger "The Ramster" Ramjet`), - }, - }, - - // Quoted string with all the accepted special characters from the C++ test - { - in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), - }, - }, - - // Quoted string with quoted backslash - { - in: `count:42 name: "\\'xyz"`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`\'xyz`), - }, - }, - - // Quoted string with UTF-8 bytes. - { - in: "count:42 name: '\303\277\302\201\xAB'", - out: &MyMessage{ - Count: Int32(42), - Name: String("\303\277\302\201\xAB"), - }, - }, - - // Bad quoted string - { - in: `inner: < host: "\0" >` + "\n", - err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, - }, - - // Number too large for int64 - { - in: "count: 1 others { key: 123456789012345678901 }", - err: "line 1.23: invalid int64: 123456789012345678901", - }, - - // Number too large for int32 - { - in: "count: 1234567890123", - err: "line 1.7: invalid int32: 1234567890123", - }, - - // Number in hexadecimal - { - in: "count: 0x2beef", - out: &MyMessage{ - Count: Int32(0x2beef), - }, - }, - - // Number in octal - { - in: "count: 024601", - out: &MyMessage{ - Count: Int32(024601), - }, - }, - - // Floating point number with "f" suffix - { - in: "count: 4 others:< weight: 17.0f >", - out: &MyMessage{ - Count: Int32(4), - Others: []*OtherMessage{ - { - Weight: Float32(17), - }, - }, - }, - }, - - // Floating point positive infinity - { - in: "count: 4 bigfloat: inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(1)), - }, - }, - - // Floating point negative infinity - { - in: "count: 4 bigfloat: -inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(-1)), - }, - }, - - // Number too large for float32 - { - in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", - err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", - }, - - // Number posing as a quoted string - { - in: `inner: < host: 12 >` + "\n", - err: `line 1.15: invalid string: 12`, - }, - - // Quoted string posing as int32 - { - in: `count: "12"`, - err: `line 1.7: invalid int32: "12"`, - }, - - // Quoted string posing a float32 - { - in: `others:< weight: "17.4" >`, - err: `line 1.17: invalid float32: "17.4"`, - }, - - // Enum - { - in: `count:42 bikeshed: BLUE`, - out: &MyMessage{ - Count: Int32(42), - Bikeshed: MyMessage_BLUE.Enum(), - }, - }, - - // Repeated field - { - in: `count:42 pet: "horsey" pet:"bunny"`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated field with list notation - { - in: `count:42 pet: ["horsey", "bunny"]`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated message with/without colon and <>/{} - { - in: `count:42 others:{} others{} others:<> others:{}`, - out: &MyMessage{ - Count: Int32(42), - Others: []*OtherMessage{ - {}, - {}, - {}, - {}, - }, - }, - }, - - // Missing colon for inner message - { - in: `count:42 inner < host: "cauchy.syd" >`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("cauchy.syd"), - }, - }, - }, - - // Missing colon for string field - { - in: `name "Dave"`, - err: `line 1.5: expected ':', found "\"Dave\""`, - }, - - // Missing colon for int32 field - { - in: `count 42`, - err: `line 1.6: expected ':', found "42"`, - }, - - // Missing required field - { - in: `name: "Pawel"`, - err: `proto: required field "testdata.MyMessage.count" not set`, - out: &MyMessage{ - Name: String("Pawel"), - }, - }, - - // Repeated non-repeated field - { - in: `name: "Rob" name: "Russ"`, - err: `line 1.12: non-repeated field "name" was repeated`, - }, - - // Group - { - in: `count: 17 SomeGroup { group_field: 12 }`, - out: &MyMessage{ - Count: Int32(17), - Somegroup: &MyMessage_SomeGroup{ - GroupField: Int32(12), - }, - }, - }, - - // Semicolon between fields - { - in: `count:3;name:"Calvin"`, - out: &MyMessage{ - Count: Int32(3), - Name: String("Calvin"), - }, - }, - // Comma between fields - { - in: `count:4,name:"Ezekiel"`, - out: &MyMessage{ - Count: Int32(4), - Name: String("Ezekiel"), - }, - }, - - // Extension - buildExtStructTest(`count: 42 [testdata.Ext.more]:`), - buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), - buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), - buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), - - // Big all-in-one - { - in: "count:42 # Meaning\n" + - `name:"Dave" ` + - `quote:"\"I didn't want to go.\"" ` + - `pet:"bunny" ` + - `pet:"kitty" ` + - `pet:"horsey" ` + - `inner:<` + - ` host:"footrest.syd" ` + - ` port:7001 ` + - ` connected:true ` + - `> ` + - `others:<` + - ` key:3735928559 ` + - ` value:"\x01A\a\f" ` + - `> ` + - `others:<` + - " weight:58.9 # Atomic weight of Co\n" + - ` inner:<` + - ` host:"lesha.mtv" ` + - ` port:8002 ` + - ` >` + - `>`, - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - Quote: String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &InnerMessage{ - Host: String("footrest.syd"), - Port: Int32(7001), - Connected: Bool(true), - }, - Others: []*OtherMessage{ - { - Key: Int64(3735928559), - Value: []byte{0x1, 'A', '\a', '\f'}, - }, - { - Weight: Float32(58.9), - Inner: &InnerMessage{ - Host: String("lesha.mtv"), - Port: Int32(8002), - }, - }, - }, - }, - }, -} - -func TestUnmarshalText(t *testing.T) { - for i, test := range unMarshalTextTests { - pb := new(MyMessage) - err := UnmarshalText(test.in, pb) - if test.err == "" { - // We don't expect failure. - if err != nil { - t.Errorf("Test %d: Unexpected error: %v", i, err) - } else if !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } else { - // We do expect failure. - if err == nil { - t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) - } else if err.Error() != test.err { - t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", - i, err.Error(), test.err) - } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } - } -} - -func TestUnmarshalTextCustomMessage(t *testing.T) { - msg := &textMessage{} - if err := UnmarshalText("custom", msg); err != nil { - t.Errorf("Unexpected error from custom unmarshal: %v", err) - } - if UnmarshalText("not custom", msg) == nil { - t.Errorf("Didn't get expected error from custom unmarshal") - } -} - -// Regression test; this caused a panic. -func TestRepeatedEnum(t *testing.T) { - pb := new(RepeatedEnum) - if err := UnmarshalText("color: RED", pb); err != nil { - t.Fatal(err) - } - exp := &RepeatedEnum{ - Color: []RepeatedEnum_Color{RepeatedEnum_RED}, - } - if !Equal(pb, exp) { - t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) - } -} - -func TestProto3TextParsing(t *testing.T) { - m := new(proto3pb.Message) - const in = `name: "Wallace" true_scotsman: true` - want := &proto3pb.Message{ - Name: "Wallace", - TrueScotsman: true, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestMapParsing(t *testing.T) { - m := new(MessageWithMap) - const in = `name_mapping: name_mapping:` + - `msg_mapping:,>` + // separating commas are okay - `msg_mapping>` + // no colon after "value" - `byte_mapping:` - want := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Beatles", - 1234: "Feist", - }, - MsgMapping: map[int64]*FloatingPoint{ - -4: {F: Float64(2.0)}, - -2: {F: Float64(4.0)}, - }, - ByteMapping: map[bool][]byte{ - true: []byte("so be it"), - }, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestOneofParsing(t *testing.T) { - const in = `name:"Shrek"` - m := new(Communique) - want := &Communique{Union: &Communique_Name{"Shrek"}} - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -var benchInput string - -func init() { - benchInput = "count: 4\n" - for i := 0; i < 1000; i++ { - benchInput += "pet: \"fido\"\n" - } - - // Check it is valid input. - pb := new(MyMessage) - err := UnmarshalText(benchInput, pb) - if err != nil { - panic("Bad benchmark input: " + err.Error()) - } -} - -func BenchmarkUnmarshalText(b *testing.B) { - pb := new(MyMessage) - for i := 0; i < b.N; i++ { - UnmarshalText(benchInput, pb) - } - b.SetBytes(int64(len(benchInput))) -} diff --git a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go b/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go deleted file mode 100644 index 652404842..000000000 --- a/Godeps/_workspace/src/github.com/gogo/protobuf/proto/text_test.go +++ /dev/null @@ -1,474 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "bytes" - "errors" - "io/ioutil" - "math" - "strings" - "testing" - - "github.com/gogo/protobuf/proto" - - proto3pb "github.com/gogo/protobuf/proto/proto3_proto" - pb "github.com/gogo/protobuf/proto/testdata" -) - -// textMessage implements the methods that allow it to marshal and unmarshal -// itself as text. -type textMessage struct { -} - -func (*textMessage) MarshalText() ([]byte, error) { - return []byte("custom"), nil -} - -func (*textMessage) UnmarshalText(bytes []byte) error { - if string(bytes) != "custom" { - return errors.New("expected 'custom'") - } - return nil -} - -func (*textMessage) Reset() {} -func (*textMessage) String() string { return "" } -func (*textMessage) ProtoMessage() {} - -func newTestMessage() *pb.MyMessage { - msg := &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Quote: proto.String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("footrest.syd"), - Port: proto.Int32(7001), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(0xdeadbeef), - Value: []byte{1, 65, 7, 12}, - }, - { - Weight: proto.Float32(6.022), - Inner: &pb.InnerMessage{ - Host: proto.String("lesha.mtv"), - Port: proto.Int32(8002), - }, - }, - }, - Bikeshed: pb.MyMessage_BLUE.Enum(), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(8), - }, - // One normally wouldn't do this. - // This is an undeclared tag 13, as a varint (wire type 0) with value 4. - XXX_unrecognized: []byte{13<<3 | 0, 4}, - } - ext := &pb.Ext{ - Data: proto.String("Big gobs for big rats"), - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { - panic(err) - } - greetings := []string{"adg", "easy", "cow"} - if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { - panic(err) - } - - // Add an unknown extension. We marshal a pb.Ext, and fake the ID. - b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) - if err != nil { - panic(err) - } - b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) - proto.SetRawExtension(msg, 201, b) - - // Extensions can be plain fields, too, so let's test that. - b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) - proto.SetRawExtension(msg, 202, b) - - return msg -} - -const text = `count: 42 -name: "Dave" -quote: "\"I didn't want to go.\"" -pet: "bunny" -pet: "kitty" -pet: "horsey" -inner: < - host: "footrest.syd" - port: 7001 - connected: true -> -others: < - key: 3735928559 - value: "\001A\007\014" -> -others: < - weight: 6.022 - inner: < - host: "lesha.mtv" - port: 8002 - > -> -bikeshed: BLUE -SomeGroup { - group_field: 8 -} -/* 2 unknown bytes */ -13: 4 -[testdata.Ext.more]: < - data: "Big gobs for big rats" -> -[testdata.greeting]: "adg" -[testdata.greeting]: "easy" -[testdata.greeting]: "cow" -/* 13 unknown bytes */ -201: "\t3G skiing" -/* 3 unknown bytes */ -202: 19 -` - -func TestMarshalText(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, newTestMessage()); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != text { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) - } -} - -func TestMarshalTextCustomMessage(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, &textMessage{}); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != "custom" { - t.Errorf("Got %q, expected %q", s, "custom") - } -} -func TestMarshalTextNil(t *testing.T) { - want := "" - tests := []proto.Message{nil, (*pb.MyMessage)(nil)} - for i, test := range tests { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, test); err != nil { - t.Fatal(err) - } - if got := buf.String(); got != want { - t.Errorf("%d: got %q want %q", i, got, want) - } - } -} - -func TestMarshalTextUnknownEnum(t *testing.T) { - // The Color enum only specifies values 0-2. - m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} - got := m.String() - const want = `bikeshed:3 ` - if got != want { - t.Errorf("\n got %q\nwant %q", got, want) - } -} - -func TestTextOneof(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&pb.Communique{}, ``}, - // scalar field - {&pb.Communique{Union: &pb.Communique_Number{Number: 4}}, `number:4`}, - // message field - {&pb.Communique{Union: &pb.Communique_Msg{ - Msg: &pb.Strings{StringField: proto.String("why hello!")}, - }}, `msg:`}, - // bad oneof (should not panic) - {&pb.Communique{Union: &pb.Communique_Msg{Msg: nil}}, `msg:/* nil */`}, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} - -func BenchmarkMarshalTextBuffered(b *testing.B) { - buf := new(bytes.Buffer) - m := newTestMessage() - for i := 0; i < b.N; i++ { - buf.Reset() - proto.MarshalText(buf, m) - } -} - -func BenchmarkMarshalTextUnbuffered(b *testing.B) { - w := ioutil.Discard - m := newTestMessage() - for i := 0; i < b.N; i++ { - proto.MarshalText(w, m) - } -} - -func compact(src string) string { - // s/[ \n]+/ /g; s/ $//; - dst := make([]byte, len(src)) - space, comment := false, false - j := 0 - for i := 0; i < len(src); i++ { - if strings.HasPrefix(src[i:], "/*") { - comment = true - i++ - continue - } - if comment && strings.HasPrefix(src[i:], "*/") { - comment = false - i++ - continue - } - if comment { - continue - } - c := src[i] - if c == ' ' || c == '\n' { - space = true - continue - } - if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { - space = false - } - if c == '{' { - space = false - } - if space { - dst[j] = ' ' - j++ - space = false - } - dst[j] = c - j++ - } - if space { - dst[j] = ' ' - j++ - } - return string(dst[0:j]) -} - -var compactText = compact(text) - -func TestCompactText(t *testing.T) { - s := proto.CompactTextString(newTestMessage()) - if s != compactText { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) - } -} - -func TestStringEscaping(t *testing.T) { - testCases := []struct { - in *pb.Strings - out string - }{ - { - // Test data from C++ test (TextFormatTest.StringEscape). - // Single divergence: we don't escape apostrophes. - &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, - "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", - }, - { - // Test data from the same C++ test. - &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, - "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", - }, - { - // Some UTF-8. - &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, - `string_field: "\000\001\377\201"` + "\n", - }, - } - - for i, tc := range testCases { - var buf bytes.Buffer - if err := proto.MarshalText(&buf, tc.in); err != nil { - t.Errorf("proto.MarsalText: %v", err) - continue - } - s := buf.String() - if s != tc.out { - t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) - continue - } - - // Check round-trip. - pb := new(pb.Strings) - if err := proto.UnmarshalText(s, pb); err != nil { - t.Errorf("#%d: UnmarshalText: %v", i, err) - continue - } - if !proto.Equal(pb, tc.in) { - t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) - } - } -} - -// A limitedWriter accepts some output before it fails. -// This is a proxy for something like a nearly-full or imminently-failing disk, -// or a network connection that is about to die. -type limitedWriter struct { - b bytes.Buffer - limit int -} - -var outOfSpace = errors.New("proto: insufficient space") - -func (w *limitedWriter) Write(p []byte) (n int, err error) { - var avail = w.limit - w.b.Len() - if avail <= 0 { - return 0, outOfSpace - } - if len(p) <= avail { - return w.b.Write(p) - } - n, _ = w.b.Write(p[:avail]) - return n, outOfSpace -} - -func TestMarshalTextFailing(t *testing.T) { - // Try lots of different sizes to exercise more error code-paths. - for lim := 0; lim < len(text); lim++ { - buf := new(limitedWriter) - buf.limit = lim - err := proto.MarshalText(buf, newTestMessage()) - // We expect a certain error, but also some partial results in the buffer. - if err != outOfSpace { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) - } - s := buf.b.String() - x := text[:buf.limit] - if s != x { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) - } - } -} - -func TestFloats(t *testing.T) { - tests := []struct { - f float64 - want string - }{ - {0, "0"}, - {4.7, "4.7"}, - {math.Inf(1), "inf"}, - {math.Inf(-1), "-inf"}, - {math.NaN(), "nan"}, - } - for _, test := range tests { - msg := &pb.FloatingPoint{F: &test.f} - got := strings.TrimSpace(msg.String()) - want := `f:` + test.want - if got != want { - t.Errorf("f=%f: got %q, want %q", test.f, got, want) - } - } -} - -func TestRepeatedNilText(t *testing.T) { - m := &pb.MessageList{ - Message: []*pb.MessageList_Message{ - nil, - { - Name: proto.String("Horse"), - }, - nil, - }, - } - want := `Message -Message { - name: "Horse" -} -Message -` - if s := proto.MarshalTextString(m); s != want { - t.Errorf(" got: %s\nwant: %s", s, want) - } -} - -func TestProto3Text(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&proto3pb.Message{}, ``}, - // zero message except for an empty byte slice - {&proto3pb.Message{Data: []byte{}}, ``}, - // trivial case - {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, - // empty map - {&pb.MessageWithMap{}, ``}, - // non-empty map; map format is the same as a repeated struct, - // and they are sorted by key (numerically for numeric keys). - { - &pb.MessageWithMap{NameMapping: map[int32]string{ - -1: "Negatory", - 7: "Lucky", - 1234: "Feist", - 6345789: "Otis", - }}, - `name_mapping: ` + - `name_mapping: ` + - `name_mapping: ` + - `name_mapping:`, - }, - // map with nil value; not well-defined, but we shouldn't crash - { - &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, - `msg_mapping:`, - }, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/glog/glog_test.go b/Godeps/_workspace/src/github.com/golang/glog/glog_test.go deleted file mode 100644 index 0fb376e1f..000000000 --- a/Godeps/_workspace/src/github.com/golang/glog/glog_test.go +++ /dev/null @@ -1,415 +0,0 @@ -// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/ -// -// Copyright 2013 Google Inc. All Rights Reserved. -// -// 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 glog - -import ( - "bytes" - "fmt" - stdLog "log" - "path/filepath" - "runtime" - "strconv" - "strings" - "testing" - "time" -) - -// Test that shortHostname works as advertised. -func TestShortHostname(t *testing.T) { - for hostname, expect := range map[string]string{ - "": "", - "host": "host", - "host.google.com": "host", - } { - if got := shortHostname(hostname); expect != got { - t.Errorf("shortHostname(%q): expected %q, got %q", hostname, expect, got) - } - } -} - -// flushBuffer wraps a bytes.Buffer to satisfy flushSyncWriter. -type flushBuffer struct { - bytes.Buffer -} - -func (f *flushBuffer) Flush() error { - return nil -} - -func (f *flushBuffer) Sync() error { - return nil -} - -// swap sets the log writers and returns the old array. -func (l *loggingT) swap(writers [numSeverity]flushSyncWriter) (old [numSeverity]flushSyncWriter) { - l.mu.Lock() - defer l.mu.Unlock() - old = l.file - for i, w := range writers { - logging.file[i] = w - } - return -} - -// newBuffers sets the log writers to all new byte buffers and returns the old array. -func (l *loggingT) newBuffers() [numSeverity]flushSyncWriter { - return l.swap([numSeverity]flushSyncWriter{new(flushBuffer), new(flushBuffer), new(flushBuffer), new(flushBuffer)}) -} - -// contents returns the specified log value as a string. -func contents(s severity) string { - return logging.file[s].(*flushBuffer).String() -} - -// contains reports whether the string is contained in the log. -func contains(s severity, str string, t *testing.T) bool { - return strings.Contains(contents(s), str) -} - -// setFlags configures the logging flags how the test expects them. -func setFlags() { - logging.toStderr = false -} - -// Test that Info works as advertised. -func TestInfo(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - Info("test") - if !contains(infoLog, "I", t) { - t.Errorf("Info has wrong character: %q", contents(infoLog)) - } - if !contains(infoLog, "test", t) { - t.Error("Info failed") - } -} - -func TestInfoDepth(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - - f := func() { InfoDepth(1, "depth-test1") } - - // The next three lines must stay together - _, _, wantLine, _ := runtime.Caller(0) - InfoDepth(0, "depth-test0") - f() - - msgs := strings.Split(strings.TrimSuffix(contents(infoLog), "\n"), "\n") - if len(msgs) != 2 { - t.Fatalf("Got %d lines, expected 2", len(msgs)) - } - - for i, m := range msgs { - if !strings.HasPrefix(m, "I") { - t.Errorf("InfoDepth[%d] has wrong character: %q", i, m) - } - w := fmt.Sprintf("depth-test%d", i) - if !strings.Contains(m, w) { - t.Errorf("InfoDepth[%d] missing %q: %q", i, w, m) - } - - // pull out the line number (between : and ]) - msg := m[strings.LastIndex(m, ":")+1:] - x := strings.Index(msg, "]") - if x < 0 { - t.Errorf("InfoDepth[%d]: missing ']': %q", i, m) - continue - } - line, err := strconv.Atoi(msg[:x]) - if err != nil { - t.Errorf("InfoDepth[%d]: bad line number: %q", i, m) - continue - } - wantLine++ - if wantLine != line { - t.Errorf("InfoDepth[%d]: got line %d, want %d", i, line, wantLine) - } - } -} - -func init() { - CopyStandardLogTo("INFO") -} - -// Test that CopyStandardLogTo panics on bad input. -func TestCopyStandardLogToPanic(t *testing.T) { - defer func() { - if s, ok := recover().(string); !ok || !strings.Contains(s, "LOG") { - t.Errorf(`CopyStandardLogTo("LOG") should have panicked: %v`, s) - } - }() - CopyStandardLogTo("LOG") -} - -// Test that using the standard log package logs to INFO. -func TestStandardLog(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - stdLog.Print("test") - if !contains(infoLog, "I", t) { - t.Errorf("Info has wrong character: %q", contents(infoLog)) - } - if !contains(infoLog, "test", t) { - t.Error("Info failed") - } -} - -// Test that the header has the correct format. -func TestHeader(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - defer func(previous func() time.Time) { timeNow = previous }(timeNow) - timeNow = func() time.Time { - return time.Date(2006, 1, 2, 15, 4, 5, .067890e9, time.Local) - } - pid = 1234 - Info("test") - var line int - format := "I0102 15:04:05.067890 1234 glog_test.go:%d] test\n" - n, err := fmt.Sscanf(contents(infoLog), format, &line) - if n != 1 || err != nil { - t.Errorf("log format error: %d elements, error %s:\n%s", n, err, contents(infoLog)) - } - // Scanf treats multiple spaces as equivalent to a single space, - // so check for correct space-padding also. - want := fmt.Sprintf(format, line) - if contents(infoLog) != want { - t.Errorf("log format error: got:\n\t%q\nwant:\t%q", contents(infoLog), want) - } -} - -// Test that an Error log goes to Warning and Info. -// Even in the Info log, the source character will be E, so the data should -// all be identical. -func TestError(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - Error("test") - if !contains(errorLog, "E", t) { - t.Errorf("Error has wrong character: %q", contents(errorLog)) - } - if !contains(errorLog, "test", t) { - t.Error("Error failed") - } - str := contents(errorLog) - if !contains(warningLog, str, t) { - t.Error("Warning failed") - } - if !contains(infoLog, str, t) { - t.Error("Info failed") - } -} - -// Test that a Warning log goes to Info. -// Even in the Info log, the source character will be W, so the data should -// all be identical. -func TestWarning(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - Warning("test") - if !contains(warningLog, "W", t) { - t.Errorf("Warning has wrong character: %q", contents(warningLog)) - } - if !contains(warningLog, "test", t) { - t.Error("Warning failed") - } - str := contents(warningLog) - if !contains(infoLog, str, t) { - t.Error("Info failed") - } -} - -// Test that a V log goes to Info. -func TestV(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - logging.verbosity.Set("2") - defer logging.verbosity.Set("0") - V(2).Info("test") - if !contains(infoLog, "I", t) { - t.Errorf("Info has wrong character: %q", contents(infoLog)) - } - if !contains(infoLog, "test", t) { - t.Error("Info failed") - } -} - -// Test that a vmodule enables a log in this file. -func TestVmoduleOn(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - logging.vmodule.Set("glog_test=2") - defer logging.vmodule.Set("") - if !V(1) { - t.Error("V not enabled for 1") - } - if !V(2) { - t.Error("V not enabled for 2") - } - if V(3) { - t.Error("V enabled for 3") - } - V(2).Info("test") - if !contains(infoLog, "I", t) { - t.Errorf("Info has wrong character: %q", contents(infoLog)) - } - if !contains(infoLog, "test", t) { - t.Error("Info failed") - } -} - -// Test that a vmodule of another file does not enable a log in this file. -func TestVmoduleOff(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - logging.vmodule.Set("notthisfile=2") - defer logging.vmodule.Set("") - for i := 1; i <= 3; i++ { - if V(Level(i)) { - t.Errorf("V enabled for %d", i) - } - } - V(2).Info("test") - if contents(infoLog) != "" { - t.Error("V logged incorrectly") - } -} - -// vGlobs are patterns that match/don't match this file at V=2. -var vGlobs = map[string]bool{ - // Easy to test the numeric match here. - "glog_test=1": false, // If -vmodule sets V to 1, V(2) will fail. - "glog_test=2": true, - "glog_test=3": true, // If -vmodule sets V to 1, V(3) will succeed. - // These all use 2 and check the patterns. All are true. - "*=2": true, - "?l*=2": true, - "????_*=2": true, - "??[mno]?_*t=2": true, - // These all use 2 and check the patterns. All are false. - "*x=2": false, - "m*=2": false, - "??_*=2": false, - "?[abc]?_*t=2": false, -} - -// Test that vmodule globbing works as advertised. -func testVmoduleGlob(pat string, match bool, t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - defer logging.vmodule.Set("") - logging.vmodule.Set(pat) - if V(2) != Verbose(match) { - t.Errorf("incorrect match for %q: got %t expected %t", pat, V(2), match) - } -} - -// Test that a vmodule globbing works as advertised. -func TestVmoduleGlob(t *testing.T) { - for glob, match := range vGlobs { - testVmoduleGlob(glob, match, t) - } -} - -func TestRollover(t *testing.T) { - setFlags() - var err error - defer func(previous func(error)) { logExitFunc = previous }(logExitFunc) - logExitFunc = func(e error) { - err = e - } - defer func(previous uint64) { MaxSize = previous }(MaxSize) - MaxSize = 512 - - Info("x") // Be sure we have a file. - info, ok := logging.file[infoLog].(*syncBuffer) - if !ok { - t.Fatal("info wasn't created") - } - if err != nil { - t.Fatalf("info has initial error: %v", err) - } - fname0 := info.file.Name() - Info(strings.Repeat("x", int(MaxSize))) // force a rollover - if err != nil { - t.Fatalf("info has error after big write: %v", err) - } - - // Make sure the next log file gets a file name with a different - // time stamp. - // - // TODO: determine whether we need to support subsecond log - // rotation. C++ does not appear to handle this case (nor does it - // handle Daylight Savings Time properly). - time.Sleep(1 * time.Second) - - Info("x") // create a new file - if err != nil { - t.Fatalf("error after rotation: %v", err) - } - fname1 := info.file.Name() - if fname0 == fname1 { - t.Errorf("info.f.Name did not change: %v", fname0) - } - if info.nbytes >= MaxSize { - t.Errorf("file size was not reset: %d", info.nbytes) - } -} - -func TestLogBacktraceAt(t *testing.T) { - setFlags() - defer logging.swap(logging.newBuffers()) - // The peculiar style of this code simplifies line counting and maintenance of the - // tracing block below. - var infoLine string - setTraceLocation := func(file string, line int, ok bool, delta int) { - if !ok { - t.Fatal("could not get file:line") - } - _, file = filepath.Split(file) - infoLine = fmt.Sprintf("%s:%d", file, line+delta) - err := logging.traceLocation.Set(infoLine) - if err != nil { - t.Fatal("error setting log_backtrace_at: ", err) - } - } - { - // Start of tracing block. These lines know about each other's relative position. - _, file, line, ok := runtime.Caller(0) - setTraceLocation(file, line, ok, +2) // Two lines between Caller and Info calls. - Info("we want a stack trace here") - } - numAppearances := strings.Count(contents(infoLog), infoLine) - if numAppearances < 2 { - // Need 2 appearances, one in the log header and one in the trace: - // log_test.go:281: I0511 16:36:06.952398 02238 log_test.go:280] we want a stack trace here - // ... - // github.com/glog/glog_test.go:280 (0x41ba91) - // ... - // We could be more precise but that would require knowing the details - // of the traceback format, which may not be dependable. - t.Fatal("got no trace back; log is ", contents(infoLog)) - } -} - -func BenchmarkHeader(b *testing.B) { - for i := 0; i < b.N; i++ { - buf, _, _ := logging.header(infoLog, 0) - logging.putBuffer(buf) - } -} diff --git a/Godeps/_workspace/src/github.com/golang/groupcache/lru/lru_test.go b/Godeps/_workspace/src/github.com/golang/groupcache/lru/lru_test.go deleted file mode 100644 index 98a2656e8..000000000 --- a/Godeps/_workspace/src/github.com/golang/groupcache/lru/lru_test.go +++ /dev/null @@ -1,73 +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 - -import ( - "testing" -) - -type simpleStruct struct { - int - string -} - -type complexStruct struct { - int - simpleStruct -} - -var getTests = []struct { - name string - keyToAdd interface{} - keyToGet interface{} - expectedOk bool -}{ - {"string_hit", "myKey", "myKey", true}, - {"string_miss", "myKey", "nonsense", false}, - {"simple_struct_hit", simpleStruct{1, "two"}, simpleStruct{1, "two"}, true}, - {"simeple_struct_miss", simpleStruct{1, "two"}, simpleStruct{0, "noway"}, false}, - {"complex_struct_hit", complexStruct{1, simpleStruct{2, "three"}}, - complexStruct{1, simpleStruct{2, "three"}}, true}, -} - -func TestGet(t *testing.T) { - for _, tt := range getTests { - lru := New(0) - lru.Add(tt.keyToAdd, 1234) - val, ok := lru.Get(tt.keyToGet) - if ok != tt.expectedOk { - t.Fatalf("%s: cache hit = %v; want %v", tt.name, ok, !ok) - } else if ok && val != 1234 { - t.Fatalf("%s expected get to return 1234 but got %v", tt.name, val) - } - } -} - -func TestRemove(t *testing.T) { - lru := New(0) - lru.Add("myKey", 1234) - if val, ok := lru.Get("myKey"); !ok { - t.Fatal("TestRemove returned no match") - } else if val != 1234 { - t.Fatalf("TestRemove failed. Expected %d, got %v", 1234, val) - } - - lru.Remove("myKey") - if _, ok := lru.Get("myKey"); ok { - t.Fatal("TestRemove returned a removed entry") - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/all_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/all_test.go deleted file mode 100644 index f68f913df..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/all_test.go +++ /dev/null @@ -1,2169 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "math/rand" - "reflect" - "runtime/debug" - "strings" - "testing" - "time" - - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -var globalO *Buffer - -func old() *Buffer { - if globalO == nil { - globalO = NewBuffer(nil) - } - globalO.Reset() - return globalO -} - -func equalbytes(b1, b2 []byte, t *testing.T) { - if len(b1) != len(b2) { - t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) - return - } - for i := 0; i < len(b1); i++ { - if b1[i] != b2[i] { - t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) - } - } -} - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} - -func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { - data := b.Bytes() - ld := len(data) - ls := len(s) / 2 - - fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) - - // find the interesting spot - n - n := ls - if ld < ls { - n = ld - } - j := 0 - for i := 0; i < n; i++ { - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - if data[i] == bs { - continue - } - n = i - break - } - l := n - 10 - if l < 0 { - l = 0 - } - h := n + 10 - - // find the interesting spot - n - fmt.Printf("is[%d]:", l) - for i := l; i < h; i++ { - if i >= ld { - fmt.Printf(" --") - continue - } - fmt.Printf(" %.2x", data[i]) - } - fmt.Printf("\n") - - fmt.Printf("sb[%d]:", l) - for i := l; i < h; i++ { - if i >= ls { - fmt.Printf(" --") - continue - } - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - fmt.Printf(" %.2x", bs) - } - fmt.Printf("\n") - - t.Fail() - - // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) - // Print the output in a partially-decoded format; can - // be helpful when updating the test. It produces the output - // that is pasted, with minor edits, into the argument to verify(). - // data := b.Bytes() - // nesting := 0 - // for b.Len() > 0 { - // start := len(data) - b.Len() - // var u uint64 - // u, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // wire := u & 0x7 - // tag := u >> 3 - // switch wire { - // case WireVarint: - // v, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed32: - // v, err := DecodeFixed32(b) - // if err != nil { - // fmt.Printf("decode error on fixed32:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed64: - // v, err := DecodeFixed64(b) - // if err != nil { - // fmt.Printf("decode error on fixed64:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireBytes: - // nb, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // after_tag := len(data) - b.Len() - // str := make([]byte, nb) - // _, err = b.Read(str) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", - // data[start:after_tag], str, tag, wire) - // case WireStartGroup: - // nesting++ - // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // case WireEndGroup: - // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // nesting-- - // default: - // fmt.Printf("unrecognized wire type %d\n", wire) - // return - // } - // } -} - -func hex(c uint8) uint8 { - if '0' <= c && c <= '9' { - return c - '0' - } - if 'a' <= c && c <= 'f' { - return 10 + c - 'a' - } - if 'A' <= c && c <= 'F' { - return 10 + c - 'A' - } - return 0 -} - -func equal(b []byte, s string, t *testing.T) bool { - if 2*len(b) != len(s) { - // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) - fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) - return false - } - for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { - x := hex(s[j])*16 + hex(s[j+1]) - if b[i] != x { - // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) - fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) - return false - } - } - return true -} - -func overify(t *testing.T, pb *GoTest, expected string) { - o := old() - err := o.Marshal(pb) - if err != nil { - fmt.Printf("overify marshal-1 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 1", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = o.Unmarshal(pbd) - if err != nil { - t.Fatalf("overify unmarshal err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - o.Reset() - err = o.Marshal(pbd) - if err != nil { - t.Errorf("overify marshal-2 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 2", o.Bytes()) - t.Fatalf("string = %s", expected) - } -} - -// Simple tests for numeric encode/decode primitives (varint, etc.) -func TestNumericPrimitives(t *testing.T) { - for i := uint64(0); i < 1e6; i += 111 { - o := old() - if o.EncodeVarint(i) != nil { - t.Error("EncodeVarint") - break - } - x, e := o.DecodeVarint() - if e != nil { - t.Fatal("DecodeVarint") - } - if x != i { - t.Fatal("varint decode fail:", i, x) - } - - o = old() - if o.EncodeFixed32(i) != nil { - t.Fatal("encFixed32") - } - x, e = o.DecodeFixed32() - if e != nil { - t.Fatal("decFixed32") - } - if x != i { - t.Fatal("fixed32 decode fail:", i, x) - } - - o = old() - if o.EncodeFixed64(i*1234567) != nil { - t.Error("encFixed64") - break - } - x, e = o.DecodeFixed64() - if e != nil { - t.Error("decFixed64") - break - } - if x != i*1234567 { - t.Error("fixed64 decode fail:", i*1234567, x) - break - } - - o = old() - i32 := int32(i - 12345) - if o.EncodeZigzag32(uint64(i32)) != nil { - t.Fatal("EncodeZigzag32") - } - x, e = o.DecodeZigzag32() - if e != nil { - t.Fatal("DecodeZigzag32") - } - if x != uint64(uint32(i32)) { - t.Fatal("zigzag32 decode fail:", i32, x) - } - - o = old() - i64 := int64(i - 12345) - if o.EncodeZigzag64(uint64(i64)) != nil { - t.Fatal("EncodeZigzag64") - } - x, e = o.DecodeZigzag64() - if e != nil { - t.Fatal("DecodeZigzag64") - } - if x != uint64(i64) { - t.Fatal("zigzag64 decode fail:", i64, x) - } - } -} - -// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. -type fakeMarshaler struct { - b []byte - err error -} - -func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } -func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } -func (f *fakeMarshaler) ProtoMessage() {} -func (f *fakeMarshaler) Reset() {} - -type msgWithFakeMarshaler struct { - M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` -} - -func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } -func (m *msgWithFakeMarshaler) ProtoMessage() {} -func (m *msgWithFakeMarshaler) Reset() {} - -// Simple tests for proto messages that implement the Marshaler interface. -func TestMarshalerEncoding(t *testing.T) { - tests := []struct { - name string - m Message - want []byte - wantErr error - }{ - { - name: "Marshaler that fails", - m: &fakeMarshaler{ - err: errors.New("some marshal err"), - b: []byte{5, 6, 7}, - }, - // Since there's an error, nothing should be written to buffer. - want: nil, - wantErr: errors.New("some marshal err"), - }, - { - name: "Marshaler that fails with RequiredNotSetError", - m: &msgWithFakeMarshaler{ - M: &fakeMarshaler{ - err: &RequiredNotSetError{}, - b: []byte{5, 6, 7}, - }, - }, - // Since there's an error that can be continued after, - // the buffer should be written. - want: []byte{ - 10, 3, // for &msgWithFakeMarshaler - 5, 6, 7, // for &fakeMarshaler - }, - wantErr: &RequiredNotSetError{}, - }, - { - name: "Marshaler that succeeds", - m: &fakeMarshaler{ - b: []byte{0, 1, 2, 3, 4, 127, 255}, - }, - want: []byte{0, 1, 2, 3, 4, 127, 255}, - wantErr: nil, - }, - } - for _, test := range tests { - b := NewBuffer(nil) - err := b.Marshal(test.m) - if _, ok := err.(*RequiredNotSetError); ok { - // We're not in package proto, so we can only assert the type in this case. - err = &RequiredNotSetError{} - } - if !reflect.DeepEqual(test.wantErr, err) { - t.Errorf("%s: got err %v wanted %v", test.name, err, test.wantErr) - } - if !reflect.DeepEqual(test.want, b.Bytes()) { - t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) - } - } -} - -// Simple tests for bytes -func TestBytesPrimitives(t *testing.T) { - o := old() - bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} - if o.EncodeRawBytes(bytes) != nil { - t.Error("EncodeRawBytes") - } - decb, e := o.DecodeRawBytes(false) - if e != nil { - t.Error("DecodeRawBytes") - } - equalbytes(bytes, decb, t) -} - -// Simple tests for strings -func TestStringPrimitives(t *testing.T) { - o := old() - s := "now is the time" - if o.EncodeStringBytes(s) != nil { - t.Error("enc_string") - } - decs, e := o.DecodeStringBytes() - if e != nil { - t.Error("dec_string") - } - if s != decs { - t.Error("string encode/decode fail:", s, decs) - } -} - -// Do we catch the "required bit not set" case? -func TestRequiredBit(t *testing.T) { - o := old() - pb := new(GoTest) - err := o.Marshal(pb) - if err == nil { - t.Error("did not catch missing required fields") - } else if strings.Index(err.Error(), "Kind") < 0 { - t.Error("wrong error type:", err) - } -} - -// Check that all fields are nil. -// Clearly silly, and a residue from a more interesting test with an earlier, -// different initialization property, but it once caught a compiler bug so -// it lives. -func checkInitialized(pb *GoTest, t *testing.T) { - if pb.F_BoolDefaulted != nil { - t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) - } - if pb.F_Int32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) - } - if pb.F_Int64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) - } - if pb.F_Fixed32Defaulted != nil { - t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) - } - if pb.F_Fixed64Defaulted != nil { - t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) - } - if pb.F_Uint32Defaulted != nil { - t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) - } - if pb.F_Uint64Defaulted != nil { - t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) - } - if pb.F_FloatDefaulted != nil { - t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) - } - if pb.F_DoubleDefaulted != nil { - t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) - } - if pb.F_StringDefaulted != nil { - t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) - } - if pb.F_BytesDefaulted != nil { - t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) - } - if pb.F_Sint32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) - } - if pb.F_Sint64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) - } -} - -// Does Reset() reset? -func TestReset(t *testing.T) { - pb := initGoTest(true) - // muck with some values - pb.F_BoolDefaulted = Bool(false) - pb.F_Int32Defaulted = Int32(237) - pb.F_Int64Defaulted = Int64(12346) - pb.F_Fixed32Defaulted = Uint32(32000) - pb.F_Fixed64Defaulted = Uint64(666) - pb.F_Uint32Defaulted = Uint32(323232) - pb.F_Uint64Defaulted = nil - pb.F_FloatDefaulted = nil - pb.F_DoubleDefaulted = Float64(0) - pb.F_StringDefaulted = String("gotcha") - pb.F_BytesDefaulted = []byte("asdfasdf") - pb.F_Sint32Defaulted = Int32(123) - pb.F_Sint64Defaulted = Int64(789) - pb.Reset() - checkInitialized(pb, t) -} - -// All required fields set, no defaults provided. -func TestEncodeDecode1(t *testing.T) { - pb := initGoTest(false) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 0x20 - "714000000000000000"+ // field 14, encoding 1, value 0x40 - "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 - "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" - "b304"+ // field 70, encoding 3, start group - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // field 70, encoding 4, end group - "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f") // field 103, encoding 0, 0x7f zigzag64 -} - -// All required fields set, defaults provided. -func TestEncodeDecode2(t *testing.T) { - pb := initGoTest(true) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All default fields set to their default value by hand -func TestEncodeDecode3(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolDefaulted = Bool(true) - pb.F_Int32Defaulted = Int32(32) - pb.F_Int64Defaulted = Int64(64) - pb.F_Fixed32Defaulted = Uint32(320) - pb.F_Fixed64Defaulted = Uint64(640) - pb.F_Uint32Defaulted = Uint32(3200) - pb.F_Uint64Defaulted = Uint64(6400) - pb.F_FloatDefaulted = Float32(314159) - pb.F_DoubleDefaulted = Float64(271828) - pb.F_StringDefaulted = String("hello, \"world!\"\n") - pb.F_BytesDefaulted = []byte("Bignose") - pb.F_Sint32Defaulted = Int32(-32) - pb.F_Sint64Defaulted = Int64(-64) - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all non-defaulted optional fields have values. -func TestEncodeDecode4(t *testing.T) { - pb := initGoTest(true) - pb.Table = String("hello") - pb.Param = Int32(7) - pb.OptionalField = initGoTestField() - pb.F_BoolOptional = Bool(true) - pb.F_Int32Optional = Int32(32) - pb.F_Int64Optional = Int64(64) - pb.F_Fixed32Optional = Uint32(3232) - pb.F_Fixed64Optional = Uint64(6464) - pb.F_Uint32Optional = Uint32(323232) - pb.F_Uint64Optional = Uint64(646464) - pb.F_FloatOptional = Float32(32.) - pb.F_DoubleOptional = Float64(64.) - pb.F_StringOptional = String("hello") - pb.F_BytesOptional = []byte("Bignose") - pb.F_Sint32Optional = Int32(-32) - pb.F_Sint64Optional = Int64(-64) - pb.Optionalgroup = initGoTest_OptionalGroup() - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" - "1807"+ // field 3, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "f00101"+ // field 30, encoding 0, value 1 - "f80120"+ // field 31, encoding 0, value 32 - "800240"+ // field 32, encoding 0, value 64 - "8d02a00c0000"+ // field 33, encoding 5, value 3232 - "91024019000000000000"+ // field 34, encoding 1, value 6464 - "9802a0dd13"+ // field 35, encoding 0, value 323232 - "a002c0ba27"+ // field 36, encoding 0, value 646464 - "ad0200000042"+ // field 37, encoding 5, value 32.0 - "b1020000000000005040"+ // field 38, encoding 1, value 64.0 - "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "d305"+ // start group field 90 level 1 - "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" - "d405"+ // end group field 90 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" - "f0123f"+ // field 302, encoding 0, value 63 - "f8127f"+ // field 303, encoding 0, value 127 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestEncodeDecode5(t *testing.T) { - pb := initGoTest(true) - pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} - pb.F_BoolRepeated = []bool{false, true} - pb.F_Int32Repeated = []int32{32, 33} - pb.F_Int64Repeated = []int64{64, 65} - pb.F_Fixed32Repeated = []uint32{3232, 3333} - pb.F_Fixed64Repeated = []uint64{6464, 6565} - pb.F_Uint32Repeated = []uint32{323232, 333333} - pb.F_Uint64Repeated = []uint64{646464, 656565} - pb.F_FloatRepeated = []float32{32., 33.} - pb.F_DoubleRepeated = []float64{64., 65.} - pb.F_StringRepeated = []string{"hello", "sailor"} - pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} - pb.F_Sint32Repeated = []int32{32, -32} - pb.F_Sint64Repeated = []int64{64, -64} - pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "a00100"+ // field 20, encoding 0, value 0 - "a00101"+ // field 20, encoding 0, value 1 - "a80120"+ // field 21, encoding 0, value 32 - "a80121"+ // field 21, encoding 0, value 33 - "b00140"+ // field 22, encoding 0, value 64 - "b00141"+ // field 22, encoding 0, value 65 - "bd01a00c0000"+ // field 23, encoding 5, value 3232 - "bd01050d0000"+ // field 23, encoding 5, value 3333 - "c1014019000000000000"+ // field 24, encoding 1, value 6464 - "c101a519000000000000"+ // field 24, encoding 1, value 6565 - "c801a0dd13"+ // field 25, encoding 0, value 323232 - "c80195ac14"+ // field 25, encoding 0, value 333333 - "d001c0ba27"+ // field 26, encoding 0, value 646464 - "d001b58928"+ // field 26, encoding 0, value 656565 - "dd0100000042"+ // field 27, encoding 5, value 32.0 - "dd0100000442"+ // field 27, encoding 5, value 33.0 - "e1010000000000005040"+ // field 28, encoding 1, value 64.0 - "e1010000000000405040"+ // field 28, encoding 1, value 65.0 - "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" - "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ca0c03"+"626967"+ // field 201, encoding 2, string "big" - "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" - "d00c40"+ // field 202, encoding 0, value 32 - "d00c3f"+ // field 202, encoding 0, value -32 - "d80c8001"+ // field 203, encoding 0, value 64 - "d80c7f"+ // field 203, encoding 0, value -64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, all packed repeated fields given two values. -func TestEncodeDecode6(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolRepeatedPacked = []bool{false, true} - pb.F_Int32RepeatedPacked = []int32{32, 33} - pb.F_Int64RepeatedPacked = []int64{64, 65} - pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} - pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} - pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} - pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} - pb.F_FloatRepeatedPacked = []float32{32., 33.} - pb.F_DoubleRepeatedPacked = []float64{64., 65.} - pb.F_Sint32RepeatedPacked = []int32{32, -32} - pb.F_Sint64RepeatedPacked = []int64{64, -64} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 - "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 - "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 - "aa0308"+ // field 53, encoding 2, 8 bytes - "a00c0000050d0000"+ // value 3232, value 3333 - "b20310"+ // field 54, encoding 2, 16 bytes - "4019000000000000a519000000000000"+ // value 6464, value 6565 - "ba0306"+ // field 55, encoding 2, 6 bytes - "a0dd1395ac14"+ // value 323232, value 333333 - "c20306"+ // field 56, encoding 2, 6 bytes - "c0ba27b58928"+ // value 646464, value 656565 - "ca0308"+ // field 57, encoding 2, 8 bytes - "0000004200000442"+ // value 32.0, value 33.0 - "d20310"+ // field 58, encoding 2, 16 bytes - "00000000000050400000000000405040"+ // value 64.0, value 65.0 - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "b21f02"+ // field 502, encoding 2, 2 bytes - "403f"+ // value 32, value -32 - "ba1f03"+ // field 503, encoding 2, 3 bytes - "80017f") // value 64, value -64 -} - -// Test that we can encode empty bytes fields. -func TestEncodeDecodeBytes1(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRequired = []byte{} - pb.F_BytesRepeated = [][]byte{{}} - pb.F_BytesOptional = []byte{} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { - t.Error("required empty bytes field is incorrect") - } - if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { - t.Error("repeated empty bytes field is incorrect") - } - if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { - t.Error("optional empty bytes field is incorrect") - } -} - -// Test that we encode nil-valued fields of a repeated bytes field correctly. -// Since entries in a repeated field cannot be nil, nil must mean empty value. -func TestEncodeDecodeBytes2(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRepeated = [][]byte{nil} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { - t.Error("Unexpected value for repeated bytes field") - } -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestSkippingUnrecognizedFields(t *testing.T) { - o := old() - pb := initGoTestField() - - // Marshal it normally. - o.Marshal(pb) - - // Now new a GoSkipTest record. - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - // Marshal it into same buffer. - o.Marshal(skip) - - pbd := new(GoTestField) - o.Unmarshal(pbd) - - // The __unrecognized field should be a marshaling of GoSkipTest - skipd := new(GoSkipTest) - - o.SetBuf(pbd.XXX_unrecognized) - o.Unmarshal(skipd) - - if *skipd.SkipInt32 != *skip.SkipInt32 { - t.Error("skip int32", skipd.SkipInt32) - } - if *skipd.SkipFixed32 != *skip.SkipFixed32 { - t.Error("skip fixed32", skipd.SkipFixed32) - } - if *skipd.SkipFixed64 != *skip.SkipFixed64 { - t.Error("skip fixed64", skipd.SkipFixed64) - } - if *skipd.SkipString != *skip.SkipString { - t.Error("skip string", *skipd.SkipString) - } - if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { - t.Error("skip group int32", skipd.Skipgroup.GroupInt32) - } - if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { - t.Error("skip group string", *skipd.Skipgroup.GroupString) - } -} - -// Check that unrecognized fields of a submessage are preserved. -func TestSubmessageUnrecognizedFields(t *testing.T) { - nm := &NewMessage{ - Nested: &NewMessage_Nested{ - Name: String("Nigel"), - FoodGroup: String("carbs"), - }, - } - b, err := Marshal(nm) - if err != nil { - t.Fatalf("Marshal of NewMessage: %v", err) - } - - // Unmarshal into an OldMessage. - om := new(OldMessage) - if err := Unmarshal(b, om); err != nil { - t.Fatalf("Unmarshal to OldMessage: %v", err) - } - exp := &OldMessage{ - Nested: &OldMessage_Nested{ - Name: String("Nigel"), - // normal protocol buffer users should not do this - XXX_unrecognized: []byte("\x12\x05carbs"), - }, - } - if !Equal(om, exp) { - t.Errorf("om = %v, want %v", om, exp) - } - - // Clone the OldMessage. - om = Clone(om).(*OldMessage) - if !Equal(om, exp) { - t.Errorf("Clone(om) = %v, want %v", om, exp) - } - - // Marshal the OldMessage, then unmarshal it into an empty NewMessage. - if b, err = Marshal(om); err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - t.Logf("Marshal(%v) -> %q", om, b) - nm2 := new(NewMessage) - if err := Unmarshal(b, nm2); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - if !Equal(nm, nm2) { - t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) - } -} - -// Check that an int32 field can be upgraded to an int64 field. -func TestNegativeInt32(t *testing.T) { - om := &OldMessage{ - Num: Int32(-1), - } - b, err := Marshal(om) - if err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - - // Check the size. It should be 11 bytes; - // 1 for the field/wire type, and 10 for the negative number. - if len(b) != 11 { - t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) - } - - // Unmarshal into a NewMessage. - nm := new(NewMessage) - if err := Unmarshal(b, nm); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - want := &NewMessage{ - Num: Int64(-1), - } - if !Equal(nm, want) { - t.Errorf("nm = %v, want %v", nm, want) - } -} - -// Check that we can grow an array (repeated field) to have many elements. -// This test doesn't depend only on our encoding; for variety, it makes sure -// we create, encode, and decode the correct contents explicitly. It's therefore -// a bit messier. -// This test also uses (and hence tests) the Marshal/Unmarshal functions -// instead of the methods. -func TestBigRepeated(t *testing.T) { - pb := initGoTest(true) - - // Create the arrays - const N = 50 // Internally the library starts much smaller. - pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) - pb.F_Sint64Repeated = make([]int64, N) - pb.F_Sint32Repeated = make([]int32, N) - pb.F_BytesRepeated = make([][]byte, N) - pb.F_StringRepeated = make([]string, N) - pb.F_DoubleRepeated = make([]float64, N) - pb.F_FloatRepeated = make([]float32, N) - pb.F_Uint64Repeated = make([]uint64, N) - pb.F_Uint32Repeated = make([]uint32, N) - pb.F_Fixed64Repeated = make([]uint64, N) - pb.F_Fixed32Repeated = make([]uint32, N) - pb.F_Int64Repeated = make([]int64, N) - pb.F_Int32Repeated = make([]int32, N) - pb.F_BoolRepeated = make([]bool, N) - pb.RepeatedField = make([]*GoTestField, N) - - // Fill in the arrays with checkable values. - igtf := initGoTestField() - igtrg := initGoTest_RepeatedGroup() - for i := 0; i < N; i++ { - pb.Repeatedgroup[i] = igtrg - pb.F_Sint64Repeated[i] = int64(i) - pb.F_Sint32Repeated[i] = int32(i) - s := fmt.Sprint(i) - pb.F_BytesRepeated[i] = []byte(s) - pb.F_StringRepeated[i] = s - pb.F_DoubleRepeated[i] = float64(i) - pb.F_FloatRepeated[i] = float32(i) - pb.F_Uint64Repeated[i] = uint64(i) - pb.F_Uint32Repeated[i] = uint32(i) - pb.F_Fixed64Repeated[i] = uint64(i) - pb.F_Fixed32Repeated[i] = uint32(i) - pb.F_Int64Repeated[i] = int64(i) - pb.F_Int32Repeated[i] = int32(i) - pb.F_BoolRepeated[i] = i%2 == 0 - pb.RepeatedField[i] = igtf - } - - // Marshal. - buf, _ := Marshal(pb) - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - Unmarshal(buf, pbd) - - // Check the checkable values - for i := uint64(0); i < N; i++ { - if pbd.Repeatedgroup[i] == nil { // TODO: more checking? - t.Error("pbd.Repeatedgroup bad") - } - var x uint64 - x = uint64(pbd.F_Sint64Repeated[i]) - if x != i { - t.Error("pbd.F_Sint64Repeated bad", x, i) - } - x = uint64(pbd.F_Sint32Repeated[i]) - if x != i { - t.Error("pbd.F_Sint32Repeated bad", x, i) - } - s := fmt.Sprint(i) - equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) - if pbd.F_StringRepeated[i] != s { - t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) - } - x = uint64(pbd.F_DoubleRepeated[i]) - if x != i { - t.Error("pbd.F_DoubleRepeated bad", x, i) - } - x = uint64(pbd.F_FloatRepeated[i]) - if x != i { - t.Error("pbd.F_FloatRepeated bad", x, i) - } - x = pbd.F_Uint64Repeated[i] - if x != i { - t.Error("pbd.F_Uint64Repeated bad", x, i) - } - x = uint64(pbd.F_Uint32Repeated[i]) - if x != i { - t.Error("pbd.F_Uint32Repeated bad", x, i) - } - x = pbd.F_Fixed64Repeated[i] - if x != i { - t.Error("pbd.F_Fixed64Repeated bad", x, i) - } - x = uint64(pbd.F_Fixed32Repeated[i]) - if x != i { - t.Error("pbd.F_Fixed32Repeated bad", x, i) - } - x = uint64(pbd.F_Int64Repeated[i]) - if x != i { - t.Error("pbd.F_Int64Repeated bad", x, i) - } - x = uint64(pbd.F_Int32Repeated[i]) - if x != i { - t.Error("pbd.F_Int32Repeated bad", x, i) - } - if pbd.F_BoolRepeated[i] != (i%2 == 0) { - t.Error("pbd.F_BoolRepeated bad", x, i) - } - if pbd.RepeatedField[i] == nil { // TODO: more checking? - t.Error("pbd.RepeatedField bad") - } - } -} - -// Verify we give a useful message when decoding to the wrong structure type. -func TestTypeMismatch(t *testing.T) { - pb1 := initGoTest(true) - - // Marshal - o := old() - o.Marshal(pb1) - - // Now Unmarshal it to the wrong type. - pb2 := initGoTestField() - err := o.Unmarshal(pb2) - if err == nil { - t.Error("expected error, got no error") - } else if !strings.Contains(err.Error(), "bad wiretype") { - t.Error("expected bad wiretype error, got", err) - } -} - -func encodeDecode(t *testing.T, in, out Message, msg string) { - buf, err := Marshal(in) - if err != nil { - t.Fatalf("failed marshaling %v: %v", msg, err) - } - if err := Unmarshal(buf, out); err != nil { - t.Fatalf("failed unmarshaling %v: %v", msg, err) - } -} - -func TestPackedNonPackedDecoderSwitching(t *testing.T) { - np, p := new(NonPackedTest), new(PackedTest) - - // non-packed -> packed - np.A = []int32{0, 1, 1, 2, 3, 5} - encodeDecode(t, np, p, "non-packed -> packed") - if !reflect.DeepEqual(np.A, p.B) { - t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) - } - - // packed -> non-packed - np.Reset() - p.B = []int32{3, 1, 4, 1, 5, 9} - encodeDecode(t, p, np, "packed -> non-packed") - if !reflect.DeepEqual(p.B, np.A) { - t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) - } -} - -func TestProto1RepeatedGroup(t *testing.T) { - pb := &MessageList{ - Message: []*MessageList_Message{ - { - Name: String("blah"), - Count: Int32(7), - }, - // NOTE: pb.Message[1] is a nil - nil, - }, - } - - o := old() - err := o.Marshal(pb) - if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { - t.Fatalf("unexpected or no error when marshaling: %v", err) - } -} - -// Test that enums work. Checks for a bug introduced by making enums -// named types instead of int32: newInt32FromUint64 would crash with -// a type mismatch in reflect.PointTo. -func TestEnum(t *testing.T) { - pb := new(GoEnum) - pb.Foo = FOO_FOO1.Enum() - o := old() - if err := o.Marshal(pb); err != nil { - t.Fatal("error encoding enum:", err) - } - pb1 := new(GoEnum) - if err := o.Unmarshal(pb1); err != nil { - t.Fatal("error decoding enum:", err) - } - if *pb1.Foo != FOO_FOO1 { - t.Error("expected 7 but got ", *pb1.Foo) - } -} - -// Enum types have String methods. Check that enum fields can be printed. -// We don't care what the value actually is, just as long as it doesn't crash. -func TestPrintingNilEnumFields(t *testing.T) { - pb := new(GoEnum) - fmt.Sprintf("%+v", pb) -} - -// Verify that absent required fields cause Marshal/Unmarshal to return errors. -func TestRequiredFieldEnforcement(t *testing.T) { - pb := new(GoTestField) - _, err := Marshal(pb) - if err == nil { - t.Error("marshal: expected error, got nil") - } else if strings.Index(err.Error(), "Label") < 0 { - t.Errorf("marshal: bad error type: %v", err) - } - - // A slightly sneaky, yet valid, proto. It encodes the same required field twice, - // so simply counting the required fields is insufficient. - // field 1, encoding 2, value "hi" - buf := []byte("\x0A\x02hi\x0A\x02hi") - err = Unmarshal(buf, pb) - if err == nil { - t.Error("unmarshal: expected error, got nil") - } else if strings.Index(err.Error(), "{Unknown}") < 0 { - t.Errorf("unmarshal: bad error type: %v", err) - } -} - -func TestTypedNilMarshal(t *testing.T) { - // A typed nil should return ErrNil and not crash. - _, err := Marshal((*GoEnum)(nil)) - if err != ErrNil { - t.Errorf("Marshal: got err %v, want ErrNil", err) - } -} - -// A type that implements the Marshaler interface, but is not nillable. -type nonNillableInt uint64 - -func (nni nonNillableInt) Marshal() ([]byte, error) { - return EncodeVarint(uint64(nni)), nil -} - -type NNIMessage struct { - nni nonNillableInt -} - -func (*NNIMessage) Reset() {} -func (*NNIMessage) String() string { return "" } -func (*NNIMessage) ProtoMessage() {} - -// A type that implements the Marshaler interface and is nillable. -type nillableMessage struct { - x uint64 -} - -func (nm *nillableMessage) Marshal() ([]byte, error) { - return EncodeVarint(nm.x), nil -} - -type NMMessage struct { - nm *nillableMessage -} - -func (*NMMessage) Reset() {} -func (*NMMessage) String() string { return "" } -func (*NMMessage) ProtoMessage() {} - -// Verify a type that uses the Marshaler interface, but has a nil pointer. -func TestNilMarshaler(t *testing.T) { - // Try a struct with a Marshaler field that is nil. - // It should be directly marshable. - nmm := new(NMMessage) - if _, err := Marshal(nmm); err != nil { - t.Error("unexpected error marshaling nmm: ", err) - } - - // Try a struct with a Marshaler field that is not nillable. - nnim := new(NNIMessage) - nnim.nni = 7 - var _ Marshaler = nnim.nni // verify it is truly a Marshaler - if _, err := Marshal(nnim); err != nil { - t.Error("unexpected error marshaling nnim: ", err) - } -} - -func TestAllSetDefaults(t *testing.T) { - // Exercise SetDefaults with all scalar field types. - m := &Defaults{ - // NaN != NaN, so override that here. - F_Nan: Float32(1.7), - } - expected := &Defaults{ - F_Bool: Bool(true), - F_Int32: Int32(32), - F_Int64: Int64(64), - F_Fixed32: Uint32(320), - F_Fixed64: Uint64(640), - F_Uint32: Uint32(3200), - F_Uint64: Uint64(6400), - F_Float: Float32(314159), - F_Double: Float64(271828), - F_String: String(`hello, "world!"` + "\n"), - F_Bytes: []byte("Bignose"), - F_Sint32: Int32(-32), - F_Sint64: Int64(-64), - F_Enum: Defaults_GREEN.Enum(), - F_Pinf: Float32(float32(math.Inf(1))), - F_Ninf: Float32(float32(math.Inf(-1))), - F_Nan: Float32(1.7), - StrZero: String(""), - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithSetField(t *testing.T) { - // Check that a set value is not overridden. - m := &Defaults{ - F_Int32: Int32(12), - } - SetDefaults(m) - if v := m.GetF_Int32(); v != 12 { - t.Errorf("m.FInt32 = %v, want 12", v) - } -} - -func TestSetDefaultsWithSubMessage(t *testing.T) { - m := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - }, - } - expected := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - Port: Int32(4000), - }, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { - m := &MyMessage{ - RepInner: []*InnerMessage{{}}, - } - expected := &MyMessage{ - RepInner: []*InnerMessage{{ - Port: Int32(4000), - }}, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { - m := &MyMessage{ - Pet: []string{"turtle", "wombat"}, - } - expected := Clone(m) - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestMaximumTagNumber(t *testing.T) { - m := &MaxTag{ - LastField: String("natural goat essence"), - } - buf, err := Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal failed: %v", err) - } - m2 := new(MaxTag) - if err := Unmarshal(buf, m2); err != nil { - t.Fatalf("proto.Unmarshal failed: %v", err) - } - if got, want := m2.GetLastField(), *m.LastField; got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestJSON(t *testing.T) { - m := &MyMessage{ - Count: Int32(4), - Pet: []string{"bunny", "kitty"}, - Inner: &InnerMessage{ - Host: String("cauchy"), - }, - Bikeshed: MyMessage_GREEN.Enum(), - } - const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` - - b, err := json.Marshal(m) - if err != nil { - t.Fatalf("json.Marshal failed: %v", err) - } - s := string(b) - if s != expected { - t.Errorf("got %s\nwant %s", s, expected) - } - - received := new(MyMessage) - if err := json.Unmarshal(b, received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } - - // Test unmarshalling of JSON with symbolic enum name. - const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` - received.Reset() - if err := json.Unmarshal([]byte(old), received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } -} - -func TestBadWireType(t *testing.T) { - b := []byte{7<<3 | 6} // field 7, wire type 6 - pb := new(OtherMessage) - if err := Unmarshal(b, pb); err == nil { - t.Errorf("Unmarshal did not fail") - } else if !strings.Contains(err.Error(), "unknown wire type") { - t.Errorf("wrong error: %v", err) - } -} - -func TestBytesWithInvalidLength(t *testing.T) { - // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. - b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} - Unmarshal(b, new(MyMessage)) -} - -func TestLengthOverflow(t *testing.T) { - // Overflowing a length should not panic. - b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} - Unmarshal(b, new(MyMessage)) -} - -func TestVarintOverflow(t *testing.T) { - // Overflowing a 64-bit length should not be allowed. - b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} - if err := Unmarshal(b, new(MyMessage)); err == nil { - t.Fatalf("Overflowed uint64 length without error") - } -} - -func TestUnmarshalFuzz(t *testing.T) { - const N = 1000 - seed := time.Now().UnixNano() - t.Logf("RNG seed is %d", seed) - rng := rand.New(rand.NewSource(seed)) - buf := make([]byte, 20) - for i := 0; i < N; i++ { - for j := range buf { - buf[j] = byte(rng.Intn(256)) - } - fuzzUnmarshal(t, buf) - } -} - -func TestMergeMessages(t *testing.T) { - pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} - data, err := Marshal(pb) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - pb1 := new(MessageList) - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("first Unmarshal: %v", err) - } - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("second Unmarshal: %v", err) - } - if len(pb1.Message) != 1 { - t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) - } - - pb2 := new(MessageList) - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("first UnmarshalMerge: %v", err) - } - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("second UnmarshalMerge: %v", err) - } - if len(pb2.Message) != 2 { - t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) - } -} - -func TestExtensionMarshalOrder(t *testing.T) { - m := &MyMessage{Count: Int(123)} - if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { - t.Fatalf("SetExtension: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - var orig []byte - for i := 0; i < 100; i++ { - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if i == 0 { - orig = b - continue - } - if !bytes.Equal(b, orig) { - t.Errorf("Bytes differ on attempt #%d", i) - } - } -} - -// Many extensions, because small maps might not iterate differently on each iteration. -var exts = []*ExtensionDesc{ - E_X201, - E_X202, - E_X203, - E_X204, - E_X205, - E_X206, - E_X207, - E_X208, - E_X209, - E_X210, - E_X211, - E_X212, - E_X213, - E_X214, - E_X215, - E_X216, - E_X217, - E_X218, - E_X219, - E_X220, - E_X221, - E_X222, - E_X223, - E_X224, - E_X225, - E_X226, - E_X227, - E_X228, - E_X229, - E_X230, - E_X231, - E_X232, - E_X233, - E_X234, - E_X235, - E_X236, - E_X237, - E_X238, - E_X239, - E_X240, - E_X241, - E_X242, - E_X243, - E_X244, - E_X245, - E_X246, - E_X247, - E_X248, - E_X249, - E_X250, -} - -func TestMessageSetMarshalOrder(t *testing.T) { - m := &MyMessageSet{} - for _, x := range exts { - if err := SetExtension(m, x, &Empty{}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - } - - buf, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - for i := 0; i < 10; i++ { - b1, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if !bytes.Equal(b1, buf) { - t.Errorf("Bytes differ on re-Marshal #%d", i) - } - - m2 := &MyMessageSet{} - if err := Unmarshal(buf, m2); err != nil { - t.Errorf("Unmarshal: %v", err) - } - b2, err := Marshal(m2) - if err != nil { - t.Errorf("re-Marshal: %v", err) - } - if !bytes.Equal(b2, buf) { - t.Errorf("Bytes differ on round-trip #%d", i) - } - } -} - -func TestUnmarshalMergesMessages(t *testing.T) { - // If a nested message occurs twice in the input, - // the fields should be merged when decoding. - a := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("polhode"), - Port: Int32(1234), - }, - } - aData, err := Marshal(a) - if err != nil { - t.Fatalf("Marshal(a): %v", err) - } - b := &OtherMessage{ - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Connected: Bool(true), - }, - } - bData, err := Marshal(b) - if err != nil { - t.Fatalf("Marshal(b): %v", err) - } - want := &OtherMessage{ - Key: Int64(123), - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Port: Int32(1234), - Connected: Bool(true), - }, - } - got := new(OtherMessage) - if err := Unmarshal(append(aData, bData...), got); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !Equal(got, want) { - t.Errorf("\n got %v\nwant %v", got, want) - } -} - -func TestEncodingSizes(t *testing.T) { - tests := []struct { - m Message - n int - }{ - {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, - {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, - {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, - {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, - } - for _, test := range tests { - b, err := Marshal(test.m) - if err != nil { - t.Errorf("Marshal(%v): %v", test.m, err) - continue - } - if len(b) != test.n { - t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) - } - } -} - -func TestRequiredNotSetError(t *testing.T) { - pb := initGoTest(false) - pb.RequiredField.Label = nil - pb.F_Int32Required = nil - pb.F_Int64Required = nil - - expected := "0807" + // field 1, encoding 0, value 7 - "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) - "5001" + // field 10, encoding 0, value 1 - "6d20000000" + // field 13, encoding 5, value 0x20 - "714000000000000000" + // field 14, encoding 1, value 0x40 - "78a019" + // field 15, encoding 0, value 0xca0 = 3232 - "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45" + // field 17, encoding 5, value 3232.0 - "9101000000000040b940" + // field 18, encoding 1, value 6464.0 - "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" - "b304" + // field 70, encoding 3, start group - "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" - "b404" + // field 70, encoding 4, end group - "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" - "b0063f" + // field 102, encoding 0, 0x3f zigzag32 - "b8067f" // field 103, encoding 0, 0x7f zigzag64 - - o := old() - bytes, err := Marshal(pb) - if _, ok := err.(*RequiredNotSetError); !ok { - fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("expected = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-1 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 1", bytes) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = Unmarshal(bytes, pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { - t.Errorf("unmarshal wrong err msg: %v", err) - } - bytes, err = Marshal(pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-2 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 2", bytes) - t.Fatalf("string = %s", expected) - } -} - -func fuzzUnmarshal(t *testing.T, data []byte) { - defer func() { - if e := recover(); e != nil { - t.Errorf("These bytes caused a panic: %+v", data) - t.Logf("Stack:\n%s", debug.Stack()) - t.FailNow() - } - }() - - pb := new(MyMessage) - Unmarshal(data, pb) -} - -func TestMapFieldMarshal(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // b should be the concatenation of these three byte sequences in some order. - parts := []string{ - "\n\a\b\x01\x12\x03Rob", - "\n\a\b\x04\x12\x03Ian", - "\n\b\b\x08\x12\x04Dave", - } - ok := false - for i := range parts { - for j := range parts { - if j == i { - continue - } - for k := range parts { - if k == i || k == j { - continue - } - try := parts[i] + parts[j] + parts[k] - if bytes.Equal(b, []byte(try)) { - ok = true - break - } - } - } - } - if !ok { - t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) - } - t.Logf("FYI b: %q", b) - - (new(Buffer)).DebugPrint("Dump of b", b) -} - -func TestMapFieldRoundTrips(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - MsgMapping: map[int64]*FloatingPoint{ - 0x7001: &FloatingPoint{F: Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{ - false: []byte("that's not right!"), - true: []byte("aye, 'tis true!"), - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("FYI b: %q", b) - m2 := new(MessageWithMap) - if err := Unmarshal(b, m2); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - for _, pair := range [][2]interface{}{ - {m.NameMapping, m2.NameMapping}, - {m.MsgMapping, m2.MsgMapping}, - {m.ByteMapping, m2.ByteMapping}, - } { - if !reflect.DeepEqual(pair[0], pair[1]) { - t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1]) - } - } -} - -func TestMapFieldWithNil(t *testing.T) { - m := &MessageWithMap{ - MsgMapping: map[int64]*FloatingPoint{ - 1: nil, - }, - } - b, err := Marshal(m) - if err == nil { - t.Fatalf("Marshal of bad map should have failed, got these bytes: %v", b) - } -} - -func TestOneof(t *testing.T) { - m := &Communique{} - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal of empty message with oneof: %v", err) - } - if len(b) != 0 { - t.Errorf("Marshal of empty message yielded too many bytes: %v", b) - } - - m = &Communique{ - Union: &Communique_Name{"Barry"}, - } - - // Round-trip. - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof: %v", err) - } - if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) - t.Errorf("Incorrect marshal of message with oneof: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof: %v", err) - } - if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { - t.Errorf("After round trip, Union = %+v", m.Union) - } - if name := m.GetName(); name != "Barry" { - t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") - } - - // Let's try with a message in the oneof. - m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof set to message: %v", err) - } - if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) - t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof set to message: %v", err) - } - ss, ok := m.Union.(*Communique_Msg) - if !ok || ss.Msg.GetStringField() != "deep deep string" { - t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) - } -} - -func TestInefficientPackedBool(t *testing.T) { - // https://github.com/golang/protobuf/issues/76 - inp := []byte{ - 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes - // Usually a bool should take a single byte, - // but it is permitted to be any varint. - 0xb9, 0x30, - } - if err := Unmarshal(inp, new(MoreRepeated)); err != nil { - t.Error(err) - } -} - -// Benchmarks - -func testMsg() *GoTest { - pb := initGoTest(true) - const N = 1000 // Internally the library starts much smaller. - pb.F_Int32Repeated = make([]int32, N) - pb.F_DoubleRepeated = make([]float64, N) - for i := 0; i < N; i++ { - pb.F_Int32Repeated[i] = int32(i) - pb.F_DoubleRepeated[i] = float64(i) - } - return pb -} - -func bytesMsg() *GoTest { - pb := initGoTest(true) - buf := make([]byte, 4000) - for i := range buf { - buf[i] = byte(i) - } - pb.F_BytesDefaulted = buf - return pb -} - -func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { - d, _ := marshal(pb) - b.SetBytes(int64(len(d))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - marshal(pb) - } -} - -func benchmarkBufferMarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - p.Reset() - err := p.Marshal(pb0) - return p.Bytes(), err - }) -} - -func benchmarkSize(b *testing.B, pb Message) { - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - Size(pb) - return nil, nil - }) -} - -func newOf(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - return reflect.New(in.Type().Elem()).Interface().(Message) -} - -func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { - d, _ := Marshal(pb) - b.SetBytes(int64(len(d))) - pbd := newOf(pb) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - unmarshal(d, pbd) - } -} - -func benchmarkBufferUnmarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { - p.SetBuf(d) - return p.Unmarshal(pb0) - }) -} - -// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} - -func BenchmarkMarshal(b *testing.B) { - benchmarkMarshal(b, testMsg(), Marshal) -} - -func BenchmarkBufferMarshal(b *testing.B) { - benchmarkBufferMarshal(b, testMsg()) -} - -func BenchmarkSize(b *testing.B) { - benchmarkSize(b, testMsg()) -} - -func BenchmarkUnmarshal(b *testing.B) { - benchmarkUnmarshal(b, testMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshal(b *testing.B) { - benchmarkBufferUnmarshal(b, testMsg()) -} - -func BenchmarkMarshalBytes(b *testing.B) { - benchmarkMarshal(b, bytesMsg(), Marshal) -} - -func BenchmarkBufferMarshalBytes(b *testing.B) { - benchmarkBufferMarshal(b, bytesMsg()) -} - -func BenchmarkSizeBytes(b *testing.B) { - benchmarkSize(b, bytesMsg()) -} - -func BenchmarkUnmarshalBytes(b *testing.B) { - benchmarkUnmarshal(b, bytesMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshalBytes(b *testing.B) { - benchmarkBufferUnmarshal(b, bytesMsg()) -} - -func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { - b.StopTimer() - pb := initGoTestField() - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - pbd := new(GoTestField) - p := NewBuffer(nil) - p.Marshal(pb) - p.Marshal(skip) - p2 := NewBuffer(nil) - - b.StartTimer() - for i := 0; i < b.N; i++ { - p2.SetBuf(p.Bytes()) - p2.Unmarshal(pbd) - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/clone_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/clone_test.go deleted file mode 100644 index 76720f18b..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/clone_test.go +++ /dev/null @@ -1,267 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - "github.com/golang/protobuf/proto" - - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -var cloneTestMessage = &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, -} - -func init() { - ext := &pb.Ext{ - Data: proto.String("extension"), - } - if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { - panic("SetExtension: " + err.Error()) - } -} - -func TestClone(t *testing.T) { - m := proto.Clone(cloneTestMessage).(*pb.MyMessage) - if !proto.Equal(m, cloneTestMessage) { - t.Errorf("Clone(%v) = %v", cloneTestMessage, m) - } - - // Verify it was a deep copy. - *m.Inner.Port++ - if proto.Equal(m, cloneTestMessage) { - t.Error("Mutating clone changed the original") - } - // Byte fields and repeated fields should be copied. - if &m.Pet[0] == &cloneTestMessage.Pet[0] { - t.Error("Pet: repeated field not copied") - } - if &m.Others[0] == &cloneTestMessage.Others[0] { - t.Error("Others: repeated field not copied") - } - if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { - t.Error("Others[0].Value: bytes field not copied") - } - if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { - t.Error("RepBytes: repeated field not copied") - } - if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { - t.Error("RepBytes[0]: bytes field not copied") - } -} - -func TestCloneNil(t *testing.T) { - var m *pb.MyMessage - if c := proto.Clone(m); !proto.Equal(m, c) { - t.Errorf("Clone(%v) = %v", m, c) - } -} - -var mergeTests = []struct { - src, dst, want proto.Message -}{ - { - src: &pb.MyMessage{ - Count: proto.Int32(42), - }, - dst: &pb.MyMessage{ - Name: proto.String("Dave"), - }, - want: &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - }, - }, - { - src: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - }, - Pet: []string{"horsey"}, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - }, - dst: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - { - // Explicitly test a src=nil field - Inner: nil, - }, - }, - }, - want: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty", "horsey"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - {}, - { - Value: []byte("some bytes"), - }, - }, - }, - }, - { - src: &pb.MyMessage{ - RepBytes: [][]byte{[]byte("wow")}, - }, - dst: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham")}, - }, - want: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, - }, - }, - // Check that a scalar bytes field replaces rather than appends. - { - src: &pb.OtherMessage{Value: []byte("foo")}, - dst: &pb.OtherMessage{Value: []byte("bar")}, - want: &pb.OtherMessage{Value: []byte("foo")}, - }, - { - src: &pb.MessageWithMap{ - NameMapping: map[int32]string{6: "Nigel"}, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - dst: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Bruce", // should be overwritten - 7: "Andrew", - }, - }, - want: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Nigel", - 7: "Andrew", - }, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - }, - // proto3 shouldn't merge zero values, - // in the same way that proto2 shouldn't merge nils. - { - src: &proto3pb.Message{ - Name: "Aaron", - Data: []byte(""), // zero value, but not nil - }, - dst: &proto3pb.Message{ - HeightInCm: 176, - Data: []byte("texas!"), - }, - want: &proto3pb.Message{ - Name: "Aaron", - HeightInCm: 176, - Data: []byte("texas!"), - }, - }, - // Oneof fields should merge by assignment. - { - src: &pb.Communique{ - Union: &pb.Communique_Number{41}, - }, - dst: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Number{41}, - }, - }, - // Oneof nil is the same as not set. - { - src: &pb.Communique{}, - dst: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - }, -} - -func TestMerge(t *testing.T) { - for _, m := range mergeTests { - got := proto.Clone(m.dst) - proto.Merge(got, m.src) - if !proto.Equal(got, m.want) { - t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/equal_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/equal_test.go deleted file mode 100644 index 7b45eaa6d..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/equal_test.go +++ /dev/null @@ -1,212 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - . "github.com/golang/protobuf/proto" - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -// Four identical base messages. -// The init function adds extensions to some of them. -var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)} -var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)} - -// Two messages with non-message extensions. -var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)} -var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)} - -func init() { - ext1 := &pb.Ext{Data: String("Kirk")} - ext2 := &pb.Ext{Data: String("Picard")} - - // messageWithExtension1a has ext1, but never marshals it. - if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1a failed: " + err.Error()) - } - - // messageWithExtension1b is the unmarshaled form of messageWithExtension1a. - if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil { - panic("SetExtension on 1b failed: " + err.Error()) - } - buf, err := Marshal(messageWithExtension1b) - if err != nil { - panic("Marshal of 1b failed: " + err.Error()) - } - messageWithExtension1b.Reset() - if err := Unmarshal(buf, messageWithExtension1b); err != nil { - panic("Unmarshal of 1b failed: " + err.Error()) - } - - // messageWithExtension2 has ext2. - if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil { - panic("SetExtension on 2 failed: " + err.Error()) - } - - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil { - panic("SetExtension on Int32-1 failed: " + err.Error()) - } - if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil { - panic("SetExtension on Int32-2 failed: " + err.Error()) - } -} - -var EqualTests = []struct { - desc string - a, b Message - exp bool -}{ - {"different types", &pb.GoEnum{}, &pb.GoTestField{}, false}, - {"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true}, - {"nil vs nil", nil, nil, true}, - {"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true}, - {"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false}, - {"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false}, - - {"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false}, - {"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false}, - {"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false}, - {"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true}, - - {"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false}, - {"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false}, - {"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false}, - {"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true}, - {"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true}, - {"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true}, - {"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true}, - - { - "nested, different", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}}, - false, - }, - { - "nested, equal", - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, - true, - }, - - {"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true}, - {"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true}, - {"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false}, - { - "repeated bytes", - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, - true, - }, - // In proto3, []byte{} and []byte(nil) are equal. - {"proto3 bytes, empty vs nil", &proto3pb.Message{Data: []byte{}}, &proto3pb.Message{Data: nil}, true}, - - {"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false}, - {"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true}, - {"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false}, - - {"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true}, - {"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false}, - - { - "message with group", - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - &pb.MyMessage{ - Count: Int32(1), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: Int32(5), - }, - }, - true, - }, - - { - "map same", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - true, - }, - { - "map different entry", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}}, - false, - }, - { - "map different key only", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}}, - false, - }, - { - "map different value only", - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, - &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}}, - false, - }, - { - "oneof same", - &pb.Communique{Union: &pb.Communique_Number{41}}, - &pb.Communique{Union: &pb.Communique_Number{41}}, - true, - }, - { - "oneof one nil", - &pb.Communique{Union: &pb.Communique_Number{41}}, - &pb.Communique{}, - false, - }, - { - "oneof different", - &pb.Communique{Union: &pb.Communique_Number{41}}, - &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, - false, - }, -} - -func TestEqual(t *testing.T) { - for _, tc := range EqualTests { - if res := Equal(tc.a, tc.b); res != tc.exp { - t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/extensions_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/extensions_test.go deleted file mode 100644 index 80122108b..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/extensions_test.go +++ /dev/null @@ -1,430 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "bytes" - "fmt" - "reflect" - "testing" - - "github.com/golang/protobuf/proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -func TestGetExtensionsWithMissingExtensions(t *testing.T) { - msg := &pb.MyMessage{} - ext1 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { - t.Fatalf("Could not set ext1: %s", ext1) - } - exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ - pb.E_Ext_More, - pb.E_Ext_Text, - }) - if err != nil { - t.Fatalf("GetExtensions() failed: %s", err) - } - if exts[0] != ext1 { - t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) - } - if exts[1] != nil { - t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) - } -} - -func TestGetExtensionStability(t *testing.T) { - check := func(m *pb.MyMessage) bool { - ext1, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - ext2, err := proto.GetExtension(m, pb.E_Ext_More) - if err != nil { - t.Fatalf("GetExtension() failed: %s", err) - } - return ext1 == ext2 - } - msg := &pb.MyMessage{Count: proto.Int32(4)} - ext0 := &pb.Ext{} - if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { - t.Fatalf("Could not set ext1: %s", ext0) - } - if !check(msg) { - t.Errorf("GetExtension() not stable before marshaling") - } - bb, err := proto.Marshal(msg) - if err != nil { - t.Fatalf("Marshal() failed: %s", err) - } - msg1 := &pb.MyMessage{} - err = proto.Unmarshal(bb, msg1) - if err != nil { - t.Fatalf("Unmarshal() failed: %s", err) - } - if !check(msg1) { - t.Errorf("GetExtension() not stable after unmarshaling") - } -} - -func TestGetExtensionDefaults(t *testing.T) { - var setFloat64 float64 = 1 - var setFloat32 float32 = 2 - var setInt32 int32 = 3 - var setInt64 int64 = 4 - var setUint32 uint32 = 5 - var setUint64 uint64 = 6 - var setBool = true - var setBool2 = false - var setString = "Goodnight string" - var setBytes = []byte("Goodnight bytes") - var setEnum = pb.DefaultsMessage_TWO - - type testcase struct { - ext *proto.ExtensionDesc // Extension we are testing. - want interface{} // Expected value of extension, or nil (meaning that GetExtension will fail). - def interface{} // Expected value of extension after ClearExtension(). - } - tests := []testcase{ - {pb.E_NoDefaultDouble, setFloat64, nil}, - {pb.E_NoDefaultFloat, setFloat32, nil}, - {pb.E_NoDefaultInt32, setInt32, nil}, - {pb.E_NoDefaultInt64, setInt64, nil}, - {pb.E_NoDefaultUint32, setUint32, nil}, - {pb.E_NoDefaultUint64, setUint64, nil}, - {pb.E_NoDefaultSint32, setInt32, nil}, - {pb.E_NoDefaultSint64, setInt64, nil}, - {pb.E_NoDefaultFixed32, setUint32, nil}, - {pb.E_NoDefaultFixed64, setUint64, nil}, - {pb.E_NoDefaultSfixed32, setInt32, nil}, - {pb.E_NoDefaultSfixed64, setInt64, nil}, - {pb.E_NoDefaultBool, setBool, nil}, - {pb.E_NoDefaultBool, setBool2, nil}, - {pb.E_NoDefaultString, setString, nil}, - {pb.E_NoDefaultBytes, setBytes, nil}, - {pb.E_NoDefaultEnum, setEnum, nil}, - {pb.E_DefaultDouble, setFloat64, float64(3.1415)}, - {pb.E_DefaultFloat, setFloat32, float32(3.14)}, - {pb.E_DefaultInt32, setInt32, int32(42)}, - {pb.E_DefaultInt64, setInt64, int64(43)}, - {pb.E_DefaultUint32, setUint32, uint32(44)}, - {pb.E_DefaultUint64, setUint64, uint64(45)}, - {pb.E_DefaultSint32, setInt32, int32(46)}, - {pb.E_DefaultSint64, setInt64, int64(47)}, - {pb.E_DefaultFixed32, setUint32, uint32(48)}, - {pb.E_DefaultFixed64, setUint64, uint64(49)}, - {pb.E_DefaultSfixed32, setInt32, int32(50)}, - {pb.E_DefaultSfixed64, setInt64, int64(51)}, - {pb.E_DefaultBool, setBool, true}, - {pb.E_DefaultBool, setBool2, true}, - {pb.E_DefaultString, setString, "Hello, string"}, - {pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")}, - {pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE}, - } - - checkVal := func(test testcase, msg *pb.DefaultsMessage, valWant interface{}) error { - val, err := proto.GetExtension(msg, test.ext) - if err != nil { - if valWant != nil { - return fmt.Errorf("GetExtension(): %s", err) - } - if want := proto.ErrMissingExtension; err != want { - return fmt.Errorf("Unexpected error: got %v, want %v", err, want) - } - return nil - } - - // All proto2 extension values are either a pointer to a value or a slice of values. - ty := reflect.TypeOf(val) - tyWant := reflect.TypeOf(test.ext.ExtensionType) - if got, want := ty, tyWant; got != want { - return fmt.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want) - } - tye := ty.Elem() - tyeWant := tyWant.Elem() - if got, want := tye, tyeWant; got != want { - return fmt.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want) - } - - // Check the name of the type of the value. - // If it is an enum it will be type int32 with the name of the enum. - if got, want := tye.Name(), tye.Name(); got != want { - return fmt.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want) - } - - // Check that value is what we expect. - // If we have a pointer in val, get the value it points to. - valExp := val - if ty.Kind() == reflect.Ptr { - valExp = reflect.ValueOf(val).Elem().Interface() - } - if got, want := valExp, valWant; !reflect.DeepEqual(got, want) { - return fmt.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want) - } - - return nil - } - - setTo := func(test testcase) interface{} { - setTo := reflect.ValueOf(test.want) - if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr { - setTo = reflect.New(typ).Elem() - setTo.Set(reflect.New(setTo.Type().Elem())) - setTo.Elem().Set(reflect.ValueOf(test.want)) - } - return setTo.Interface() - } - - for _, test := range tests { - msg := &pb.DefaultsMessage{} - name := test.ext.Name - - // Check the initial value. - if err := checkVal(test, msg, test.def); err != nil { - t.Errorf("%s: %v", name, err) - } - - // Set the per-type value and check value. - name = fmt.Sprintf("%s (set to %T %v)", name, test.want, test.want) - if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil { - t.Errorf("%s: SetExtension(): %v", name, err) - continue - } - if err := checkVal(test, msg, test.want); err != nil { - t.Errorf("%s: %v", name, err) - continue - } - - // Set and check the value. - name += " (cleared)" - proto.ClearExtension(msg, test.ext) - if err := checkVal(test, msg, test.def); err != nil { - t.Errorf("%s: %v", name, err) - } - } -} - -func TestExtensionsRoundTrip(t *testing.T) { - msg := &pb.MyMessage{} - ext1 := &pb.Ext{ - Data: proto.String("hi"), - } - ext2 := &pb.Ext{ - Data: proto.String("there"), - } - exists := proto.HasExtension(msg, pb.E_Ext_More) - if exists { - t.Error("Extension More present unexpectedly") - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { - t.Error(err) - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { - t.Error(err) - } - e, err := proto.GetExtension(msg, pb.E_Ext_More) - if err != nil { - t.Error(err) - } - x, ok := e.(*pb.Ext) - if !ok { - t.Errorf("e has type %T, expected testdata.Ext", e) - } else if *x.Data != "there" { - t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) - } - proto.ClearExtension(msg, pb.E_Ext_More) - if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { - t.Errorf("got %v, expected ErrMissingExtension", e) - } - if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { - t.Error("expected bad extension error, got nil") - } - if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { - t.Error("expected extension err") - } - if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { - t.Error("expected some sort of type mismatch error, got nil") - } -} - -func TestNilExtension(t *testing.T) { - msg := &pb.MyMessage{ - Count: proto.Int32(1), - } - if err := proto.SetExtension(msg, pb.E_Ext_Text, proto.String("hello")); err != nil { - t.Fatal(err) - } - if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil { - t.Error("expected SetExtension to fail due to a nil extension") - } else if want := "proto: SetExtension called with nil value of type *testdata.Ext"; err.Error() != want { - t.Errorf("expected error %v, got %v", want, err) - } - // Note: if the behavior of Marshal is ever changed to ignore nil extensions, update - // this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal. -} - -func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { - // Add a repeated extension to the result. - tests := []struct { - name string - ext []*pb.ComplexExtension - }{ - { - "two fields", - []*pb.ComplexExtension{ - {First: proto.Int32(7)}, - {Second: proto.Int32(11)}, - }, - }, - { - "repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {Third: []int32{2000}}, - }, - }, - { - "two fields and repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {First: proto.Int32(9)}, - {Second: proto.Int32(21)}, - {Third: []int32{2000}}, - }, - }, - } - for _, test := range tests { - // Marshal message with a repeated extension. - msg1 := new(pb.OtherMessage) - err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) - if err != nil { - t.Fatalf("[%s] Error setting extension: %v", test.name, err) - } - b, err := proto.Marshal(msg1) - if err != nil { - t.Fatalf("[%s] Error marshaling message: %v", test.name, err) - } - - // Unmarshal and read the merged proto. - msg2 := new(pb.OtherMessage) - err = proto.Unmarshal(b, msg2) - if err != nil { - t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) - } - e, err := proto.GetExtension(msg2, pb.E_RComplex) - if err != nil { - t.Fatalf("[%s] Error getting extension: %v", test.name, err) - } - ext := e.([]*pb.ComplexExtension) - if ext == nil { - t.Fatalf("[%s] Invalid extension", test.name) - } - if !reflect.DeepEqual(ext, test.ext) { - t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext) - } - } -} - -func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { - // We may see multiple instances of the same extension in the wire - // format. For example, the proto compiler may encode custom options in - // this way. Here, we verify that we merge the extensions together. - tests := []struct { - name string - ext []*pb.ComplexExtension - }{ - { - "two fields", - []*pb.ComplexExtension{ - {First: proto.Int32(7)}, - {Second: proto.Int32(11)}, - }, - }, - { - "repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {Third: []int32{2000}}, - }, - }, - { - "two fields and repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {First: proto.Int32(9)}, - {Second: proto.Int32(21)}, - {Third: []int32{2000}}, - }, - }, - } - for _, test := range tests { - var buf bytes.Buffer - var want pb.ComplexExtension - - // Generate a serialized representation of a repeated extension - // by catenating bytes together. - for i, e := range test.ext { - // Merge to create the wanted proto. - proto.Merge(&want, e) - - // serialize the message - msg := new(pb.OtherMessage) - err := proto.SetExtension(msg, pb.E_Complex, e) - if err != nil { - t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) - } - b, err := proto.Marshal(msg) - if err != nil { - t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) - } - buf.Write(b) - } - - // Unmarshal and read the merged proto. - msg2 := new(pb.OtherMessage) - err := proto.Unmarshal(buf.Bytes(), msg2) - if err != nil { - t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) - } - e, err := proto.GetExtension(msg2, pb.E_Complex) - if err != nil { - t.Fatalf("[%s] Error getting extension: %v", test.name, err) - } - ext := e.(*pb.ComplexExtension) - if ext == nil { - t.Fatalf("[%s] Invalid extension", test.name) - } - if !reflect.DeepEqual(*ext, want) { - t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/message_set_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/message_set_test.go deleted file mode 100644 index ab8ac2f0e..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/message_set_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto - -import ( - "bytes" - "testing" -) - -func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { - // Check that a repeated message set entry will be concatenated. - in := &messageSet{ - Item: []*_MessageSet_Item{ - {TypeId: Int32(12345), Message: []byte("hoo")}, - {TypeId: Int32(12345), Message: []byte("hah")}, - }, - } - b, err := Marshal(in) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("Marshaled bytes: %q", b) - - m := make(map[int32]Extension) - if err := UnmarshalMessageSet(b, m); err != nil { - t.Fatalf("UnmarshalMessageSet: %v", err) - } - ext, ok := m[12345] - if !ok { - t.Fatalf("Didn't retrieve extension 12345; map is %v", m) - } - // Skip wire type/field number and length varints. - got := skipVarint(skipVarint(ext.enc)) - if want := []byte("hoohah"); !bytes.Equal(got, want) { - t.Errorf("Combined extension is %q, want %q", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go deleted file mode 100644 index 37c778209..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go +++ /dev/null @@ -1,122 +0,0 @@ -// Code generated by protoc-gen-go. -// source: proto3_proto/proto3.proto -// DO NOT EDIT! - -/* -Package proto3_proto is a generated protocol buffer package. - -It is generated from these files: - proto3_proto/proto3.proto - -It has these top-level messages: - Message - Nested - MessageWithMap -*/ -package proto3_proto - -import proto "github.com/golang/protobuf/proto" -import testdata "github.com/golang/protobuf/proto/testdata" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal - -type Message_Humour int32 - -const ( - Message_UNKNOWN Message_Humour = 0 - Message_PUNS Message_Humour = 1 - Message_SLAPSTICK Message_Humour = 2 - Message_BILL_BAILEY Message_Humour = 3 -) - -var Message_Humour_name = map[int32]string{ - 0: "UNKNOWN", - 1: "PUNS", - 2: "SLAPSTICK", - 3: "BILL_BAILEY", -} -var Message_Humour_value = map[string]int32{ - "UNKNOWN": 0, - "PUNS": 1, - "SLAPSTICK": 2, - "BILL_BAILEY": 3, -} - -func (x Message_Humour) String() string { - return proto.EnumName(Message_Humour_name, int32(x)) -} - -type Message struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` - HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm" json:"height_in_cm,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` - ResultCount int64 `protobuf:"varint,7,opt,name=result_count" json:"result_count,omitempty"` - TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman" json:"true_scotsman,omitempty"` - Score float32 `protobuf:"fixed32,9,opt,name=score" json:"score,omitempty"` - Key []uint64 `protobuf:"varint,5,rep,name=key" json:"key,omitempty"` - Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` - Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - Proto2Field *testdata.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field" json:"proto2_field,omitempty"` - Proto2Value map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} - -func (m *Message) GetNested() *Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *Message) GetTerrain() map[string]*Nested { - if m != nil { - return m.Terrain - } - return nil -} - -func (m *Message) GetProto2Field() *testdata.SubDefaults { - if m != nil { - return m.Proto2Field - } - return nil -} - -func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { - if m != nil { - return m.Proto2Value - } - return nil -} - -type Nested struct { - Bunny string `protobuf:"bytes,1,opt,name=bunny" json:"bunny,omitempty"` -} - -func (m *Nested) Reset() { *m = Nested{} } -func (m *Nested) String() string { return proto.CompactTextString(m) } -func (*Nested) ProtoMessage() {} - -type MessageWithMap struct { - ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } -func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } -func (*MessageWithMap) ProtoMessage() {} - -func (m *MessageWithMap) GetByteMapping() map[bool][]byte { - if m != nil { - return m.ByteMapping - } - return nil -} - -func init() { - proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto b/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto deleted file mode 100644 index e2311d929..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto +++ /dev/null @@ -1,68 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -syntax = "proto3"; - -import "testdata/test.proto"; - -package proto3_proto; - -message Message { - enum Humour { - UNKNOWN = 0; - PUNS = 1; - SLAPSTICK = 2; - BILL_BAILEY = 3; - } - - string name = 1; - Humour hilarity = 2; - uint32 height_in_cm = 3; - bytes data = 4; - int64 result_count = 7; - bool true_scotsman = 8; - float score = 9; - - repeated uint64 key = 5; - Nested nested = 6; - - map terrain = 10; - testdata.SubDefaults proto2_field = 11; - map proto2_value = 13; -} - -message Nested { - string bunny = 1; -} - -message MessageWithMap { - map byte_mapping = 1; -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_test.go deleted file mode 100644 index 462f8055c..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/proto3_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "testing" - - "github.com/golang/protobuf/proto" - pb "github.com/golang/protobuf/proto/proto3_proto" - tpb "github.com/golang/protobuf/proto/testdata" -) - -func TestProto3ZeroValues(t *testing.T) { - tests := []struct { - desc string - m proto.Message - }{ - {"zero message", &pb.Message{}}, - {"empty bytes field", &pb.Message{Data: []byte{}}}, - } - for _, test := range tests { - b, err := proto.Marshal(test.m) - if err != nil { - t.Errorf("%s: proto.Marshal: %v", test.desc, err) - continue - } - if len(b) > 0 { - t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) - } - } -} - -func TestRoundTripProto3(t *testing.T) { - m := &pb.Message{ - Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" - Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 - HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 - Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" - ResultCount: 47, // (0 | 7<<3): 0x38 0x2f - TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 - Score: 8.1, // (5 | 9<<3): 0x4d <8.1> - - Key: []uint64{1, 0xdeadbeef}, - Nested: &pb.Nested{ - Bunny: "Monty", - }, - } - t.Logf(" m: %v", m) - - b, err := proto.Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal: %v", err) - } - t.Logf(" b: %q", b) - - m2 := new(pb.Message) - if err := proto.Unmarshal(b, m2); err != nil { - t.Fatalf("proto.Unmarshal: %v", err) - } - t.Logf("m2: %v", m2) - - if !proto.Equal(m, m2) { - t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) - } -} - -func TestProto3SetDefaults(t *testing.T) { - in := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: new(tpb.SubDefaults), - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": new(tpb.SubDefaults), - }, - } - - got := proto.Clone(in).(*pb.Message) - proto.SetDefaults(got) - - // There are no defaults in proto3. Everything should be the zero value, but - // we need to remember to set defaults for nested proto2 messages. - want := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": &tpb.SubDefaults{N: proto.Int64(7)}, - }, - } - - if !proto.Equal(got, want) { - t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/size2_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/size2_test.go deleted file mode 100644 index a2729c39a..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/size2_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto - -import ( - "testing" -) - -// This is a separate file and package from size_test.go because that one uses -// generated messages and thus may not be in package proto without having a circular -// dependency, whereas this file tests unexported details of size.go. - -func TestVarintSize(t *testing.T) { - // Check the edge cases carefully. - testCases := []struct { - n uint64 - size int - }{ - {0, 1}, - {1, 1}, - {127, 1}, - {128, 2}, - {16383, 2}, - {16384, 3}, - {1<<63 - 1, 9}, - {1 << 63, 10}, - } - for _, tc := range testCases { - size := sizeVarint(tc.n) - if size != tc.size { - t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/size_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/size_test.go deleted file mode 100644 index af1034dc7..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/size_test.go +++ /dev/null @@ -1,164 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "log" - "strings" - "testing" - - . "github.com/golang/protobuf/proto" - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} - -// messageWithExtension2 is in equal_test.go. -var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} - -func init() { - if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - - // Force messageWithExtension3 to have the extension encoded. - Marshal(messageWithExtension3) - -} - -var SizeTests = []struct { - desc string - pb Message -}{ - {"empty", &pb.OtherMessage{}}, - // Basic types. - {"bool", &pb.Defaults{F_Bool: Bool(true)}}, - {"int32", &pb.Defaults{F_Int32: Int32(12)}}, - {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, - {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, - {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, - {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, - {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, - {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, - {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, - {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, - {"float", &pb.Defaults{F_Float: Float32(12.6)}}, - {"double", &pb.Defaults{F_Double: Float64(13.9)}}, - {"string", &pb.Defaults{F_String: String("niles")}}, - {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, - {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, - {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, - {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, - {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, - // Repeated. - {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, - {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, - {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, - {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, - {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, - {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ - // Need enough large numbers to verify that the header is counting the number of bytes - // for the field, not the number of elements. - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - }}}, - {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, - {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, - // Nested. - {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, - {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, - // Other things. - {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, - {"extension (unencoded)", messageWithExtension1}, - {"extension (encoded)", messageWithExtension3}, - // proto3 message - {"proto3 empty", &proto3pb.Message{}}, - {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, - {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, - {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, - {"proto3 float", &proto3pb.Message{Score: 12.6}}, - {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, - {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, - {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, - {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, - {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, - - {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, - {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, - {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, - {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, - - {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, - {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, - {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, - - {"oneof not set", &pb.Oneof{}}, - {"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, - {"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, - {"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, - {"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, - {"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, - {"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, - {"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, - {"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, - {"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, - {"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, - {"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, - {"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, - {"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, - {"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, - {"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, - {"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, - {"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, - {"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, - {"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, - {"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, -} - -func TestSize(t *testing.T) { - for _, tc := range SizeTests { - size := Size(tc.pb) - b, err := Marshal(tc.pb) - if err != nil { - t.Errorf("%v: Marshal failed: %v", tc.desc, err) - continue - } - if size != len(b) { - t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) - t.Logf("%v: bytes: %#v", tc.desc, b) - } - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/Makefile b/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/Makefile deleted file mode 100644 index fc288628a..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - - -include ../../Make.protobuf - -all: regenerate - -regenerate: - rm -f test.pb.go - make test.pb.go - -# The following rules are just aids to development. Not needed for typical testing. - -diff: regenerate - git diff test.pb.go - -restore: - cp test.pb.go.golden test.pb.go - -preserve: - cp test.pb.go test.pb.go.golden diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/golden_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/golden_test.go deleted file mode 100644 index 7172d0e96..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/golden_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -// Verify that the compiler output for test.proto is unchanged. - -package testdata - -import ( - "crypto/sha1" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" -) - -// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. -func sum(t *testing.T, name string) string { - data, err := ioutil.ReadFile(name) - if err != nil { - t.Fatal(err) - } - t.Logf("sum(%q): length is %d", name, len(data)) - hash := sha1.New() - _, err = hash.Write(data) - if err != nil { - t.Fatal(err) - } - return fmt.Sprintf("% x", hash.Sum(nil)) -} - -func run(t *testing.T, name string, args ...string) { - cmd := exec.Command(name, args...) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - if err != nil { - t.Fatal(err) - } -} - -func TestGolden(t *testing.T) { - // Compute the original checksum. - goldenSum := sum(t, "test.pb.go") - // Run the proto compiler. - run(t, "protoc", "--go_out="+os.TempDir(), "test.proto") - newFile := filepath.Join(os.TempDir(), "test.pb.go") - defer os.Remove(newFile) - // Compute the new checksum. - newSum := sum(t, newFile) - // Verify - if newSum != goldenSum { - run(t, "diff", "-u", "test.pb.go", newFile) - t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.pb.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.pb.go deleted file mode 100644 index e3c83fc1a..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.pb.go +++ /dev/null @@ -1,3926 +0,0 @@ -// Code generated by protoc-gen-go. -// source: test.proto -// DO NOT EDIT! - -/* -Package testdata is a generated protocol buffer package. - -It is generated from these files: - test.proto - -It has these top-level messages: - GoEnum - GoTestField - GoTest - GoSkipTest - NonPackedTest - PackedTest - MaxTag - OldMessage - NewMessage - InnerMessage - OtherMessage - MyMessage - Ext - ComplexExtension - DefaultsMessage - MyMessageSet - Empty - MessageList - Strings - Defaults - SubDefaults - RepeatedEnum - MoreRepeated - GroupOld - GroupNew - FloatingPoint - MessageWithMap - Oneof - Communique -*/ -package testdata - -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. -const _ = proto.ProtoPackageIsVersion1 - -type FOO int32 - -const ( - FOO_FOO1 FOO = 1 -) - -var FOO_name = map[int32]string{ - 1: "FOO1", -} -var FOO_value = map[string]int32{ - "FOO1": 1, -} - -func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p -} -func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) -} -func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") - if err != nil { - return err - } - *x = FOO(value) - return nil -} -func (FOO) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -// An enum, for completeness. -type GoTest_KIND int32 - -const ( - GoTest_VOID GoTest_KIND = 0 - // Basic types - GoTest_BOOL GoTest_KIND = 1 - GoTest_BYTES GoTest_KIND = 2 - GoTest_FINGERPRINT GoTest_KIND = 3 - GoTest_FLOAT GoTest_KIND = 4 - GoTest_INT GoTest_KIND = 5 - GoTest_STRING GoTest_KIND = 6 - GoTest_TIME GoTest_KIND = 7 - // Groupings - GoTest_TUPLE GoTest_KIND = 8 - GoTest_ARRAY GoTest_KIND = 9 - GoTest_MAP GoTest_KIND = 10 - // Table types - GoTest_TABLE GoTest_KIND = 11 - // Functions - GoTest_FUNCTION GoTest_KIND = 12 -) - -var GoTest_KIND_name = map[int32]string{ - 0: "VOID", - 1: "BOOL", - 2: "BYTES", - 3: "FINGERPRINT", - 4: "FLOAT", - 5: "INT", - 6: "STRING", - 7: "TIME", - 8: "TUPLE", - 9: "ARRAY", - 10: "MAP", - 11: "TABLE", - 12: "FUNCTION", -} -var GoTest_KIND_value = map[string]int32{ - "VOID": 0, - "BOOL": 1, - "BYTES": 2, - "FINGERPRINT": 3, - "FLOAT": 4, - "INT": 5, - "STRING": 6, - "TIME": 7, - "TUPLE": 8, - "ARRAY": 9, - "MAP": 10, - "TABLE": 11, - "FUNCTION": 12, -} - -func (x GoTest_KIND) Enum() *GoTest_KIND { - p := new(GoTest_KIND) - *p = x - return p -} -func (x GoTest_KIND) String() string { - return proto.EnumName(GoTest_KIND_name, int32(x)) -} -func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") - if err != nil { - return err - } - *x = GoTest_KIND(value) - return nil -} -func (GoTest_KIND) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } - -type MyMessage_Color int32 - -const ( - MyMessage_RED MyMessage_Color = 0 - MyMessage_GREEN MyMessage_Color = 1 - MyMessage_BLUE MyMessage_Color = 2 -) - -var MyMessage_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var MyMessage_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x MyMessage_Color) Enum() *MyMessage_Color { - p := new(MyMessage_Color) - *p = x - return p -} -func (x MyMessage_Color) String() string { - return proto.EnumName(MyMessage_Color_name, int32(x)) -} -func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") - if err != nil { - return err - } - *x = MyMessage_Color(value) - return nil -} -func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} } - -type DefaultsMessage_DefaultsEnum int32 - -const ( - DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 - DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 - DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 -) - -var DefaultsMessage_DefaultsEnum_name = map[int32]string{ - 0: "ZERO", - 1: "ONE", - 2: "TWO", -} -var DefaultsMessage_DefaultsEnum_value = map[string]int32{ - "ZERO": 0, - "ONE": 1, - "TWO": 2, -} - -func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { - p := new(DefaultsMessage_DefaultsEnum) - *p = x - return p -} -func (x DefaultsMessage_DefaultsEnum) String() string { - return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) -} -func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") - if err != nil { - return err - } - *x = DefaultsMessage_DefaultsEnum(value) - return nil -} -func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{14, 0} -} - -type Defaults_Color int32 - -const ( - Defaults_RED Defaults_Color = 0 - Defaults_GREEN Defaults_Color = 1 - Defaults_BLUE Defaults_Color = 2 -) - -var Defaults_Color_name = map[int32]string{ - 0: "RED", - 1: "GREEN", - 2: "BLUE", -} -var Defaults_Color_value = map[string]int32{ - "RED": 0, - "GREEN": 1, - "BLUE": 2, -} - -func (x Defaults_Color) Enum() *Defaults_Color { - p := new(Defaults_Color) - *p = x - return p -} -func (x Defaults_Color) String() string { - return proto.EnumName(Defaults_Color_name, int32(x)) -} -func (x *Defaults_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") - if err != nil { - return err - } - *x = Defaults_Color(value) - return nil -} -func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } - -type RepeatedEnum_Color int32 - -const ( - RepeatedEnum_RED RepeatedEnum_Color = 1 -) - -var RepeatedEnum_Color_name = map[int32]string{ - 1: "RED", -} -var RepeatedEnum_Color_value = map[string]int32{ - "RED": 1, -} - -func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { - p := new(RepeatedEnum_Color) - *p = x - return p -} -func (x RepeatedEnum_Color) String() string { - return proto.EnumName(RepeatedEnum_Color_name, int32(x)) -} -func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") - if err != nil { - return err - } - *x = RepeatedEnum_Color(value) - return nil -} -func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{21, 0} } - -type GoEnum struct { - Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoEnum) Reset() { *m = GoEnum{} } -func (m *GoEnum) String() string { return proto.CompactTextString(m) } -func (*GoEnum) ProtoMessage() {} -func (*GoEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *GoEnum) GetFoo() FOO { - if m != nil && m.Foo != nil { - return *m.Foo - } - return FOO_FOO1 -} - -type GoTestField struct { - Label *string `protobuf:"bytes,1,req,name=Label" json:"Label,omitempty"` - Type *string `protobuf:"bytes,2,req,name=Type" json:"Type,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTestField) Reset() { *m = GoTestField{} } -func (m *GoTestField) String() string { return proto.CompactTextString(m) } -func (*GoTestField) ProtoMessage() {} -func (*GoTestField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *GoTestField) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *GoTestField) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -type GoTest struct { - // Some typical parameters - Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` - Table *string `protobuf:"bytes,2,opt,name=Table" json:"Table,omitempty"` - Param *int32 `protobuf:"varint,3,opt,name=Param" json:"Param,omitempty"` - // Required, repeated and optional foreign fields. - RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField" json:"RequiredField,omitempty"` - RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField" json:"RepeatedField,omitempty"` - OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField" json:"OptionalField,omitempty"` - // Required fields of all basic types - F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required" json:"F_Bool_required,omitempty"` - F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required" json:"F_Int32_required,omitempty"` - F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required" json:"F_Int64_required,omitempty"` - F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required" json:"F_Fixed32_required,omitempty"` - F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required" json:"F_Fixed64_required,omitempty"` - F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required" json:"F_Uint32_required,omitempty"` - F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required" json:"F_Uint64_required,omitempty"` - F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required" json:"F_Float_required,omitempty"` - F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required" json:"F_Double_required,omitempty"` - F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required" json:"F_String_required,omitempty"` - F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required" json:"F_Bytes_required,omitempty"` - F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required" json:"F_Sint32_required,omitempty"` - F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required" json:"F_Sint64_required,omitempty"` - // Repeated fields of all basic types - F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated" json:"F_Bool_repeated,omitempty"` - F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated" json:"F_Int32_repeated,omitempty"` - F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated" json:"F_Int64_repeated,omitempty"` - F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated" json:"F_Fixed32_repeated,omitempty"` - F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated" json:"F_Fixed64_repeated,omitempty"` - F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated" json:"F_Uint32_repeated,omitempty"` - F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated" json:"F_Uint64_repeated,omitempty"` - F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated" json:"F_Float_repeated,omitempty"` - F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated" json:"F_Double_repeated,omitempty"` - F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated" json:"F_String_repeated,omitempty"` - F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated" json:"F_Bytes_repeated,omitempty"` - F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated" json:"F_Sint32_repeated,omitempty"` - F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated" json:"F_Sint64_repeated,omitempty"` - // Optional fields of all basic types - F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional" json:"F_Bool_optional,omitempty"` - F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional" json:"F_Int32_optional,omitempty"` - F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional" json:"F_Int64_optional,omitempty"` - F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional" json:"F_Fixed32_optional,omitempty"` - F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional" json:"F_Fixed64_optional,omitempty"` - F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional" json:"F_Uint32_optional,omitempty"` - F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional" json:"F_Uint64_optional,omitempty"` - F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional" json:"F_Float_optional,omitempty"` - F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional" json:"F_Double_optional,omitempty"` - F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional" json:"F_String_optional,omitempty"` - F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional" json:"F_Bytes_optional,omitempty"` - F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional" json:"F_Sint32_optional,omitempty"` - F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional" json:"F_Sint64_optional,omitempty"` - // Default-valued fields of all basic types - F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,def=1" json:"F_Bool_defaulted,omitempty"` - F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,def=32" json:"F_Int32_defaulted,omitempty"` - F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,def=64" json:"F_Int64_defaulted,omitempty"` - F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` - F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` - F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` - F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` - F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,def=314159" json:"F_Float_defaulted,omitempty"` - F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,def=271828" json:"F_Double_defaulted,omitempty"` - F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` - F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` - F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` - F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` - // Packed repeated fields (no string or bytes). - F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed" json:"F_Bool_repeated_packed,omitempty"` - F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed" json:"F_Int32_repeated_packed,omitempty"` - F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed" json:"F_Int64_repeated_packed,omitempty"` - F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed" json:"F_Fixed32_repeated_packed,omitempty"` - F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed" json:"F_Fixed64_repeated_packed,omitempty"` - F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed" json:"F_Uint32_repeated_packed,omitempty"` - F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed" json:"F_Uint64_repeated_packed,omitempty"` - F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed" json:"F_Float_repeated_packed,omitempty"` - F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed" json:"F_Double_repeated_packed,omitempty"` - F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed" json:"F_Sint32_repeated_packed,omitempty"` - F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed" json:"F_Sint64_repeated_packed,omitempty"` - Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup" json:"requiredgroup,omitempty"` - Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup" json:"repeatedgroup,omitempty"` - Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest) Reset() { *m = GoTest{} } -func (m *GoTest) String() string { return proto.CompactTextString(m) } -func (*GoTest) ProtoMessage() {} -func (*GoTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -const Default_GoTest_F_BoolDefaulted bool = true -const Default_GoTest_F_Int32Defaulted int32 = 32 -const Default_GoTest_F_Int64Defaulted int64 = 64 -const Default_GoTest_F_Fixed32Defaulted uint32 = 320 -const Default_GoTest_F_Fixed64Defaulted uint64 = 640 -const Default_GoTest_F_Uint32Defaulted uint32 = 3200 -const Default_GoTest_F_Uint64Defaulted uint64 = 6400 -const Default_GoTest_F_FloatDefaulted float32 = 314159 -const Default_GoTest_F_DoubleDefaulted float64 = 271828 -const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" - -var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") - -const Default_GoTest_F_Sint32Defaulted int32 = -32 -const Default_GoTest_F_Sint64Defaulted int64 = -64 - -func (m *GoTest) GetKind() GoTest_KIND { - if m != nil && m.Kind != nil { - return *m.Kind - } - return GoTest_VOID -} - -func (m *GoTest) GetTable() string { - if m != nil && m.Table != nil { - return *m.Table - } - return "" -} - -func (m *GoTest) GetParam() int32 { - if m != nil && m.Param != nil { - return *m.Param - } - return 0 -} - -func (m *GoTest) GetRequiredField() *GoTestField { - if m != nil { - return m.RequiredField - } - return nil -} - -func (m *GoTest) GetRepeatedField() []*GoTestField { - if m != nil { - return m.RepeatedField - } - return nil -} - -func (m *GoTest) GetOptionalField() *GoTestField { - if m != nil { - return m.OptionalField - } - return nil -} - -func (m *GoTest) GetF_BoolRequired() bool { - if m != nil && m.F_BoolRequired != nil { - return *m.F_BoolRequired - } - return false -} - -func (m *GoTest) GetF_Int32Required() int32 { - if m != nil && m.F_Int32Required != nil { - return *m.F_Int32Required - } - return 0 -} - -func (m *GoTest) GetF_Int64Required() int64 { - if m != nil && m.F_Int64Required != nil { - return *m.F_Int64Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Required() uint32 { - if m != nil && m.F_Fixed32Required != nil { - return *m.F_Fixed32Required - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Required() uint64 { - if m != nil && m.F_Fixed64Required != nil { - return *m.F_Fixed64Required - } - return 0 -} - -func (m *GoTest) GetF_Uint32Required() uint32 { - if m != nil && m.F_Uint32Required != nil { - return *m.F_Uint32Required - } - return 0 -} - -func (m *GoTest) GetF_Uint64Required() uint64 { - if m != nil && m.F_Uint64Required != nil { - return *m.F_Uint64Required - } - return 0 -} - -func (m *GoTest) GetF_FloatRequired() float32 { - if m != nil && m.F_FloatRequired != nil { - return *m.F_FloatRequired - } - return 0 -} - -func (m *GoTest) GetF_DoubleRequired() float64 { - if m != nil && m.F_DoubleRequired != nil { - return *m.F_DoubleRequired - } - return 0 -} - -func (m *GoTest) GetF_StringRequired() string { - if m != nil && m.F_StringRequired != nil { - return *m.F_StringRequired - } - return "" -} - -func (m *GoTest) GetF_BytesRequired() []byte { - if m != nil { - return m.F_BytesRequired - } - return nil -} - -func (m *GoTest) GetF_Sint32Required() int32 { - if m != nil && m.F_Sint32Required != nil { - return *m.F_Sint32Required - } - return 0 -} - -func (m *GoTest) GetF_Sint64Required() int64 { - if m != nil && m.F_Sint64Required != nil { - return *m.F_Sint64Required - } - return 0 -} - -func (m *GoTest) GetF_BoolRepeated() []bool { - if m != nil { - return m.F_BoolRepeated - } - return nil -} - -func (m *GoTest) GetF_Int32Repeated() []int32 { - if m != nil { - return m.F_Int32Repeated - } - return nil -} - -func (m *GoTest) GetF_Int64Repeated() []int64 { - if m != nil { - return m.F_Int64Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed32Repeated() []uint32 { - if m != nil { - return m.F_Fixed32Repeated - } - return nil -} - -func (m *GoTest) GetF_Fixed64Repeated() []uint64 { - if m != nil { - return m.F_Fixed64Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint32Repeated() []uint32 { - if m != nil { - return m.F_Uint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Uint64Repeated() []uint64 { - if m != nil { - return m.F_Uint64Repeated - } - return nil -} - -func (m *GoTest) GetF_FloatRepeated() []float32 { - if m != nil { - return m.F_FloatRepeated - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeated() []float64 { - if m != nil { - return m.F_DoubleRepeated - } - return nil -} - -func (m *GoTest) GetF_StringRepeated() []string { - if m != nil { - return m.F_StringRepeated - } - return nil -} - -func (m *GoTest) GetF_BytesRepeated() [][]byte { - if m != nil { - return m.F_BytesRepeated - } - return nil -} - -func (m *GoTest) GetF_Sint32Repeated() []int32 { - if m != nil { - return m.F_Sint32Repeated - } - return nil -} - -func (m *GoTest) GetF_Sint64Repeated() []int64 { - if m != nil { - return m.F_Sint64Repeated - } - return nil -} - -func (m *GoTest) GetF_BoolOptional() bool { - if m != nil && m.F_BoolOptional != nil { - return *m.F_BoolOptional - } - return false -} - -func (m *GoTest) GetF_Int32Optional() int32 { - if m != nil && m.F_Int32Optional != nil { - return *m.F_Int32Optional - } - return 0 -} - -func (m *GoTest) GetF_Int64Optional() int64 { - if m != nil && m.F_Int64Optional != nil { - return *m.F_Int64Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed32Optional() uint32 { - if m != nil && m.F_Fixed32Optional != nil { - return *m.F_Fixed32Optional - } - return 0 -} - -func (m *GoTest) GetF_Fixed64Optional() uint64 { - if m != nil && m.F_Fixed64Optional != nil { - return *m.F_Fixed64Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint32Optional() uint32 { - if m != nil && m.F_Uint32Optional != nil { - return *m.F_Uint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Uint64Optional() uint64 { - if m != nil && m.F_Uint64Optional != nil { - return *m.F_Uint64Optional - } - return 0 -} - -func (m *GoTest) GetF_FloatOptional() float32 { - if m != nil && m.F_FloatOptional != nil { - return *m.F_FloatOptional - } - return 0 -} - -func (m *GoTest) GetF_DoubleOptional() float64 { - if m != nil && m.F_DoubleOptional != nil { - return *m.F_DoubleOptional - } - return 0 -} - -func (m *GoTest) GetF_StringOptional() string { - if m != nil && m.F_StringOptional != nil { - return *m.F_StringOptional - } - return "" -} - -func (m *GoTest) GetF_BytesOptional() []byte { - if m != nil { - return m.F_BytesOptional - } - return nil -} - -func (m *GoTest) GetF_Sint32Optional() int32 { - if m != nil && m.F_Sint32Optional != nil { - return *m.F_Sint32Optional - } - return 0 -} - -func (m *GoTest) GetF_Sint64Optional() int64 { - if m != nil && m.F_Sint64Optional != nil { - return *m.F_Sint64Optional - } - return 0 -} - -func (m *GoTest) GetF_BoolDefaulted() bool { - if m != nil && m.F_BoolDefaulted != nil { - return *m.F_BoolDefaulted - } - return Default_GoTest_F_BoolDefaulted -} - -func (m *GoTest) GetF_Int32Defaulted() int32 { - if m != nil && m.F_Int32Defaulted != nil { - return *m.F_Int32Defaulted - } - return Default_GoTest_F_Int32Defaulted -} - -func (m *GoTest) GetF_Int64Defaulted() int64 { - if m != nil && m.F_Int64Defaulted != nil { - return *m.F_Int64Defaulted - } - return Default_GoTest_F_Int64Defaulted -} - -func (m *GoTest) GetF_Fixed32Defaulted() uint32 { - if m != nil && m.F_Fixed32Defaulted != nil { - return *m.F_Fixed32Defaulted - } - return Default_GoTest_F_Fixed32Defaulted -} - -func (m *GoTest) GetF_Fixed64Defaulted() uint64 { - if m != nil && m.F_Fixed64Defaulted != nil { - return *m.F_Fixed64Defaulted - } - return Default_GoTest_F_Fixed64Defaulted -} - -func (m *GoTest) GetF_Uint32Defaulted() uint32 { - if m != nil && m.F_Uint32Defaulted != nil { - return *m.F_Uint32Defaulted - } - return Default_GoTest_F_Uint32Defaulted -} - -func (m *GoTest) GetF_Uint64Defaulted() uint64 { - if m != nil && m.F_Uint64Defaulted != nil { - return *m.F_Uint64Defaulted - } - return Default_GoTest_F_Uint64Defaulted -} - -func (m *GoTest) GetF_FloatDefaulted() float32 { - if m != nil && m.F_FloatDefaulted != nil { - return *m.F_FloatDefaulted - } - return Default_GoTest_F_FloatDefaulted -} - -func (m *GoTest) GetF_DoubleDefaulted() float64 { - if m != nil && m.F_DoubleDefaulted != nil { - return *m.F_DoubleDefaulted - } - return Default_GoTest_F_DoubleDefaulted -} - -func (m *GoTest) GetF_StringDefaulted() string { - if m != nil && m.F_StringDefaulted != nil { - return *m.F_StringDefaulted - } - return Default_GoTest_F_StringDefaulted -} - -func (m *GoTest) GetF_BytesDefaulted() []byte { - if m != nil && m.F_BytesDefaulted != nil { - return m.F_BytesDefaulted - } - return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) -} - -func (m *GoTest) GetF_Sint32Defaulted() int32 { - if m != nil && m.F_Sint32Defaulted != nil { - return *m.F_Sint32Defaulted - } - return Default_GoTest_F_Sint32Defaulted -} - -func (m *GoTest) GetF_Sint64Defaulted() int64 { - if m != nil && m.F_Sint64Defaulted != nil { - return *m.F_Sint64Defaulted - } - return Default_GoTest_F_Sint64Defaulted -} - -func (m *GoTest) GetF_BoolRepeatedPacked() []bool { - if m != nil { - return m.F_BoolRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { - if m != nil { - return m.F_Int32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { - if m != nil { - return m.F_Int64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Fixed32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Fixed64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { - if m != nil { - return m.F_Uint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { - if m != nil { - return m.F_Uint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { - if m != nil { - return m.F_FloatRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { - if m != nil { - return m.F_DoubleRepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { - if m != nil { - return m.F_Sint32RepeatedPacked - } - return nil -} - -func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { - if m != nil { - return m.F_Sint64RepeatedPacked - } - return nil -} - -func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { - if m != nil { - return m.Requiredgroup - } - return nil -} - -func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { - if m != nil { - return m.Repeatedgroup - } - return nil -} - -func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil -} - -// Required, repeated, and optional groups. -type GoTest_RequiredGroup struct { - RequiredField *string `protobuf:"bytes,71,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } -func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RequiredGroup) ProtoMessage() {} - -func (m *GoTest_RequiredGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_RepeatedGroup struct { - RequiredField *string `protobuf:"bytes,81,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } -func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_RepeatedGroup) ProtoMessage() {} - -func (m *GoTest_RepeatedGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -type GoTest_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,91,req,name=RequiredField" json:"RequiredField,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } -func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } -func (*GoTest_OptionalGroup) ProtoMessage() {} - -func (m *GoTest_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -type GoSkipTest struct { - SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32" json:"skip_int32,omitempty"` - SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32" json:"skip_fixed32,omitempty"` - SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64" json:"skip_fixed64,omitempty"` - SkipString *string `protobuf:"bytes,14,req,name=skip_string" json:"skip_string,omitempty"` - Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup" json:"skipgroup,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } -func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest) ProtoMessage() {} -func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *GoSkipTest) GetSkipInt32() int32 { - if m != nil && m.SkipInt32 != nil { - return *m.SkipInt32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed32() uint32 { - if m != nil && m.SkipFixed32 != nil { - return *m.SkipFixed32 - } - return 0 -} - -func (m *GoSkipTest) GetSkipFixed64() uint64 { - if m != nil && m.SkipFixed64 != nil { - return *m.SkipFixed64 - } - return 0 -} - -func (m *GoSkipTest) GetSkipString() string { - if m != nil && m.SkipString != nil { - return *m.SkipString - } - return "" -} - -func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { - if m != nil { - return m.Skipgroup - } - return nil -} - -type GoSkipTest_SkipGroup struct { - GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32" json:"group_int32,omitempty"` - GroupString *string `protobuf:"bytes,17,req,name=group_string" json:"group_string,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } -func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } -func (*GoSkipTest_SkipGroup) ProtoMessage() {} - -func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { - if m != nil && m.GroupInt32 != nil { - return *m.GroupInt32 - } - return 0 -} - -func (m *GoSkipTest_SkipGroup) GetGroupString() string { - if m != nil && m.GroupString != nil { - return *m.GroupString - } - return "" -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -type NonPackedTest struct { - A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } -func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } -func (*NonPackedTest) ProtoMessage() {} -func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -func (m *NonPackedTest) GetA() []int32 { - if m != nil { - return m.A - } - return nil -} - -type PackedTest struct { - B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PackedTest) Reset() { *m = PackedTest{} } -func (m *PackedTest) String() string { return proto.CompactTextString(m) } -func (*PackedTest) ProtoMessage() {} -func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -func (m *PackedTest) GetB() []int32 { - if m != nil { - return m.B - } - return nil -} - -type MaxTag struct { - // Maximum possible tag number. - LastField *string `protobuf:"bytes,536870911,opt,name=last_field" json:"last_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MaxTag) Reset() { *m = MaxTag{} } -func (m *MaxTag) String() string { return proto.CompactTextString(m) } -func (*MaxTag) ProtoMessage() {} -func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -func (m *MaxTag) GetLastField() string { - if m != nil && m.LastField != nil { - return *m.LastField - } - return "" -} - -type OldMessage struct { - Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage) Reset() { *m = OldMessage{} } -func (m *OldMessage) String() string { return proto.CompactTextString(m) } -func (*OldMessage) ProtoMessage() {} -func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -func (m *OldMessage) GetNested() *OldMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *OldMessage) GetNum() int32 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type OldMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } -func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*OldMessage_Nested) ProtoMessage() {} -func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } - -func (m *OldMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -type NewMessage struct { - Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` - // This is an int32 in OldMessage. - Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage) Reset() { *m = NewMessage{} } -func (m *NewMessage) String() string { return proto.CompactTextString(m) } -func (*NewMessage) ProtoMessage() {} -func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } - -func (m *NewMessage) GetNested() *NewMessage_Nested { - if m != nil { - return m.Nested - } - return nil -} - -func (m *NewMessage) GetNum() int64 { - if m != nil && m.Num != nil { - return *m.Num - } - return 0 -} - -type NewMessage_Nested struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - FoodGroup *string `protobuf:"bytes,2,opt,name=food_group" json:"food_group,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } -func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } -func (*NewMessage_Nested) ProtoMessage() {} -func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } - -func (m *NewMessage_Nested) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *NewMessage_Nested) GetFoodGroup() string { - if m != nil && m.FoodGroup != nil { - return *m.FoodGroup - } - return "" -} - -type InnerMessage struct { - Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` - Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` - Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *InnerMessage) Reset() { *m = InnerMessage{} } -func (m *InnerMessage) String() string { return proto.CompactTextString(m) } -func (*InnerMessage) ProtoMessage() {} -func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } - -const Default_InnerMessage_Port int32 = 4000 - -func (m *InnerMessage) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *InnerMessage) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return Default_InnerMessage_Port -} - -func (m *InnerMessage) GetConnected() bool { - if m != nil && m.Connected != nil { - return *m.Connected - } - return false -} - -type OtherMessage struct { - Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` - Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *OtherMessage) Reset() { *m = OtherMessage{} } -func (m *OtherMessage) String() string { return proto.CompactTextString(m) } -func (*OtherMessage) ProtoMessage() {} -func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } - -var extRange_OtherMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*OtherMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_OtherMessage -} -func (m *OtherMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *OtherMessage) GetKey() int64 { - if m != nil && m.Key != nil { - return *m.Key - } - return 0 -} - -func (m *OtherMessage) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *OtherMessage) GetWeight() float32 { - if m != nil && m.Weight != nil { - return *m.Weight - } - return 0 -} - -func (m *OtherMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -type MyMessage struct { - Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` - Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` - Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` - Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` - RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner" json:"rep_inner,omitempty"` - Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` - Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup" json:"somegroup,omitempty"` - // This field becomes [][]byte in the generated code. - RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes" json:"rep_bytes,omitempty"` - Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage) Reset() { *m = MyMessage{} } -func (m *MyMessage) String() string { return proto.CompactTextString(m) } -func (*MyMessage) ProtoMessage() {} -func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } - -var extRange_MyMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessage -} -func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -func (m *MyMessage) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *MyMessage) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MyMessage) GetQuote() string { - if m != nil && m.Quote != nil { - return *m.Quote - } - return "" -} - -func (m *MyMessage) GetPet() []string { - if m != nil { - return m.Pet - } - return nil -} - -func (m *MyMessage) GetInner() *InnerMessage { - if m != nil { - return m.Inner - } - return nil -} - -func (m *MyMessage) GetOthers() []*OtherMessage { - if m != nil { - return m.Others - } - return nil -} - -func (m *MyMessage) GetRepInner() []*InnerMessage { - if m != nil { - return m.RepInner - } - return nil -} - -func (m *MyMessage) GetBikeshed() MyMessage_Color { - if m != nil && m.Bikeshed != nil { - return *m.Bikeshed - } - return MyMessage_RED -} - -func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { - if m != nil { - return m.Somegroup - } - return nil -} - -func (m *MyMessage) GetRepBytes() [][]byte { - if m != nil { - return m.RepBytes - } - return nil -} - -func (m *MyMessage) GetBigfloat() float64 { - if m != nil && m.Bigfloat != nil { - return *m.Bigfloat - } - return 0 -} - -type MyMessage_SomeGroup struct { - GroupField *int32 `protobuf:"varint,9,opt,name=group_field" json:"group_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } -func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } -func (*MyMessage_SomeGroup) ProtoMessage() {} - -func (m *MyMessage_SomeGroup) GetGroupField() int32 { - if m != nil && m.GroupField != nil { - return *m.GroupField - } - return 0 -} - -type Ext struct { - Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Ext) Reset() { *m = Ext{} } -func (m *Ext) String() string { return proto.CompactTextString(m) } -func (*Ext) ProtoMessage() {} -func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } - -func (m *Ext) GetData() string { - if m != nil && m.Data != nil { - return *m.Data - } - return "" -} - -var E_Ext_More = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*Ext)(nil), - Field: 103, - Name: "testdata.Ext.more", - Tag: "bytes,103,opt,name=more", -} - -var E_Ext_Text = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*string)(nil), - Field: 104, - Name: "testdata.Ext.text", - Tag: "bytes,104,opt,name=text", -} - -var E_Ext_Number = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 105, - Name: "testdata.Ext.number", - Tag: "varint,105,opt,name=number", -} - -type ComplexExtension struct { - First *int32 `protobuf:"varint,1,opt,name=first" json:"first,omitempty"` - Second *int32 `protobuf:"varint,2,opt,name=second" json:"second,omitempty"` - Third []int32 `protobuf:"varint,3,rep,name=third" json:"third,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } -func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } -func (*ComplexExtension) ProtoMessage() {} -func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } - -func (m *ComplexExtension) GetFirst() int32 { - if m != nil && m.First != nil { - return *m.First - } - return 0 -} - -func (m *ComplexExtension) GetSecond() int32 { - if m != nil && m.Second != nil { - return *m.Second - } - return 0 -} - -func (m *ComplexExtension) GetThird() []int32 { - if m != nil { - return m.Third - } - return nil -} - -type DefaultsMessage struct { - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } -func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } -func (*DefaultsMessage) ProtoMessage() {} -func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } - -var extRange_DefaultsMessage = []proto.ExtensionRange{ - {100, 536870911}, -} - -func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_DefaultsMessage -} -func (m *DefaultsMessage) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -type MyMessageSet struct { - XXX_extensions map[int32]proto.Extension `json:"-"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } -func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } -func (*MyMessageSet) ProtoMessage() {} -func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } - -func (m *MyMessageSet) Marshal() ([]byte, error) { - return proto.MarshalMessageSet(m.ExtensionMap()) -} -func (m *MyMessageSet) Unmarshal(buf []byte) error { - return proto.UnmarshalMessageSet(buf, m.ExtensionMap()) -} -func (m *MyMessageSet) MarshalJSON() ([]byte, error) { - return proto.MarshalMessageSetJSON(m.XXX_extensions) -} -func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { - return proto.UnmarshalMessageSetJSON(buf, m.XXX_extensions) -} - -// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler -var _ proto.Marshaler = (*MyMessageSet)(nil) -var _ proto.Unmarshaler = (*MyMessageSet)(nil) - -var extRange_MyMessageSet = []proto.ExtensionRange{ - {100, 2147483646}, -} - -func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_MyMessageSet -} -func (m *MyMessageSet) ExtensionMap() map[int32]proto.Extension { - if m.XXX_extensions == nil { - m.XXX_extensions = make(map[int32]proto.Extension) - } - return m.XXX_extensions -} - -type Empty struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } - -type MessageList struct { - Message []*MessageList_Message `protobuf:"group,1,rep,name=Message" json:"message,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList) Reset() { *m = MessageList{} } -func (m *MessageList) String() string { return proto.CompactTextString(m) } -func (*MessageList) ProtoMessage() {} -func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } - -func (m *MessageList) GetMessage() []*MessageList_Message { - if m != nil { - return m.Message - } - return nil -} - -type MessageList_Message struct { - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } -func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } -func (*MessageList_Message) ProtoMessage() {} - -func (m *MessageList_Message) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MessageList_Message) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -type Strings struct { - StringField *string `protobuf:"bytes,1,opt,name=string_field" json:"string_field,omitempty"` - BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field" json:"bytes_field,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Strings) Reset() { *m = Strings{} } -func (m *Strings) String() string { return proto.CompactTextString(m) } -func (*Strings) ProtoMessage() {} -func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } - -func (m *Strings) GetStringField() string { - if m != nil && m.StringField != nil { - return *m.StringField - } - return "" -} - -func (m *Strings) GetBytesField() []byte { - if m != nil { - return m.BytesField - } - return nil -} - -type Defaults struct { - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,def=1" json:"F_Bool,omitempty"` - F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,def=32" json:"F_Int32,omitempty"` - F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,def=64" json:"F_Int64,omitempty"` - F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,def=320" json:"F_Fixed32,omitempty"` - F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,def=640" json:"F_Fixed64,omitempty"` - F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,def=3200" json:"F_Uint32,omitempty"` - F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,def=6400" json:"F_Uint64,omitempty"` - F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,def=314159" json:"F_Float,omitempty"` - F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,def=271828" json:"F_Double,omitempty"` - F_String *string `protobuf:"bytes,10,opt,name=F_String,def=hello, \"world!\"\n" json:"F_String,omitempty"` - F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,def=Bignose" json:"F_Bytes,omitempty"` - F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,def=-32" json:"F_Sint32,omitempty"` - F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,def=-64" json:"F_Sint64,omitempty"` - F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` - // More fields with crazy defaults. - F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,def=inf" json:"F_Pinf,omitempty"` - F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,def=-inf" json:"F_Ninf,omitempty"` - F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,def=nan" json:"F_Nan,omitempty"` - // Sub-message. - Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` - // Redundant but explicit defaults. - StrZero *string `protobuf:"bytes,19,opt,name=str_zero,def=" json:"str_zero,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Defaults) Reset() { *m = Defaults{} } -func (m *Defaults) String() string { return proto.CompactTextString(m) } -func (*Defaults) ProtoMessage() {} -func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } - -const Default_Defaults_F_Bool bool = true -const Default_Defaults_F_Int32 int32 = 32 -const Default_Defaults_F_Int64 int64 = 64 -const Default_Defaults_F_Fixed32 uint32 = 320 -const Default_Defaults_F_Fixed64 uint64 = 640 -const Default_Defaults_F_Uint32 uint32 = 3200 -const Default_Defaults_F_Uint64 uint64 = 6400 -const Default_Defaults_F_Float float32 = 314159 -const Default_Defaults_F_Double float64 = 271828 -const Default_Defaults_F_String string = "hello, \"world!\"\n" - -var Default_Defaults_F_Bytes []byte = []byte("Bignose") - -const Default_Defaults_F_Sint32 int32 = -32 -const Default_Defaults_F_Sint64 int64 = -64 -const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN - -var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) -var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) -var Default_Defaults_F_Nan float32 = float32(math.NaN()) - -func (m *Defaults) GetF_Bool() bool { - if m != nil && m.F_Bool != nil { - return *m.F_Bool - } - return Default_Defaults_F_Bool -} - -func (m *Defaults) GetF_Int32() int32 { - if m != nil && m.F_Int32 != nil { - return *m.F_Int32 - } - return Default_Defaults_F_Int32 -} - -func (m *Defaults) GetF_Int64() int64 { - if m != nil && m.F_Int64 != nil { - return *m.F_Int64 - } - return Default_Defaults_F_Int64 -} - -func (m *Defaults) GetF_Fixed32() uint32 { - if m != nil && m.F_Fixed32 != nil { - return *m.F_Fixed32 - } - return Default_Defaults_F_Fixed32 -} - -func (m *Defaults) GetF_Fixed64() uint64 { - if m != nil && m.F_Fixed64 != nil { - return *m.F_Fixed64 - } - return Default_Defaults_F_Fixed64 -} - -func (m *Defaults) GetF_Uint32() uint32 { - if m != nil && m.F_Uint32 != nil { - return *m.F_Uint32 - } - return Default_Defaults_F_Uint32 -} - -func (m *Defaults) GetF_Uint64() uint64 { - if m != nil && m.F_Uint64 != nil { - return *m.F_Uint64 - } - return Default_Defaults_F_Uint64 -} - -func (m *Defaults) GetF_Float() float32 { - if m != nil && m.F_Float != nil { - return *m.F_Float - } - return Default_Defaults_F_Float -} - -func (m *Defaults) GetF_Double() float64 { - if m != nil && m.F_Double != nil { - return *m.F_Double - } - return Default_Defaults_F_Double -} - -func (m *Defaults) GetF_String() string { - if m != nil && m.F_String != nil { - return *m.F_String - } - return Default_Defaults_F_String -} - -func (m *Defaults) GetF_Bytes() []byte { - if m != nil && m.F_Bytes != nil { - return m.F_Bytes - } - return append([]byte(nil), Default_Defaults_F_Bytes...) -} - -func (m *Defaults) GetF_Sint32() int32 { - if m != nil && m.F_Sint32 != nil { - return *m.F_Sint32 - } - return Default_Defaults_F_Sint32 -} - -func (m *Defaults) GetF_Sint64() int64 { - if m != nil && m.F_Sint64 != nil { - return *m.F_Sint64 - } - return Default_Defaults_F_Sint64 -} - -func (m *Defaults) GetF_Enum() Defaults_Color { - if m != nil && m.F_Enum != nil { - return *m.F_Enum - } - return Default_Defaults_F_Enum -} - -func (m *Defaults) GetF_Pinf() float32 { - if m != nil && m.F_Pinf != nil { - return *m.F_Pinf - } - return Default_Defaults_F_Pinf -} - -func (m *Defaults) GetF_Ninf() float32 { - if m != nil && m.F_Ninf != nil { - return *m.F_Ninf - } - return Default_Defaults_F_Ninf -} - -func (m *Defaults) GetF_Nan() float32 { - if m != nil && m.F_Nan != nil { - return *m.F_Nan - } - return Default_Defaults_F_Nan -} - -func (m *Defaults) GetSub() *SubDefaults { - if m != nil { - return m.Sub - } - return nil -} - -func (m *Defaults) GetStrZero() string { - if m != nil && m.StrZero != nil { - return *m.StrZero - } - return "" -} - -type SubDefaults struct { - N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SubDefaults) Reset() { *m = SubDefaults{} } -func (m *SubDefaults) String() string { return proto.CompactTextString(m) } -func (*SubDefaults) ProtoMessage() {} -func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } - -const Default_SubDefaults_N int64 = 7 - -func (m *SubDefaults) GetN() int64 { - if m != nil && m.N != nil { - return *m.N - } - return Default_SubDefaults_N -} - -type RepeatedEnum struct { - Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } -func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } -func (*RepeatedEnum) ProtoMessage() {} -func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } - -func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { - if m != nil { - return m.Color - } - return nil -} - -type MoreRepeated struct { - Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` - BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed" json:"bools_packed,omitempty"` - Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` - IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed" json:"ints_packed,omitempty"` - Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed" json:"int64s_packed,omitempty"` - Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` - Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } -func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } -func (*MoreRepeated) ProtoMessage() {} -func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } - -func (m *MoreRepeated) GetBools() []bool { - if m != nil { - return m.Bools - } - return nil -} - -func (m *MoreRepeated) GetBoolsPacked() []bool { - if m != nil { - return m.BoolsPacked - } - return nil -} - -func (m *MoreRepeated) GetInts() []int32 { - if m != nil { - return m.Ints - } - return nil -} - -func (m *MoreRepeated) GetIntsPacked() []int32 { - if m != nil { - return m.IntsPacked - } - return nil -} - -func (m *MoreRepeated) GetInt64SPacked() []int64 { - if m != nil { - return m.Int64SPacked - } - return nil -} - -func (m *MoreRepeated) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -func (m *MoreRepeated) GetFixeds() []uint32 { - if m != nil { - return m.Fixeds - } - return nil -} - -type GroupOld struct { - G *GroupOld_G `protobuf:"group,101,opt,name=G" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld) Reset() { *m = GroupOld{} } -func (m *GroupOld) String() string { return proto.CompactTextString(m) } -func (*GroupOld) ProtoMessage() {} -func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } - -func (m *GroupOld) GetG() *GroupOld_G { - if m != nil { - return m.G - } - return nil -} - -type GroupOld_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } -func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } -func (*GroupOld_G) ProtoMessage() {} - -func (m *GroupOld_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type GroupNew struct { - G *GroupNew_G `protobuf:"group,101,opt,name=G" json:"g,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew) Reset() { *m = GroupNew{} } -func (m *GroupNew) String() string { return proto.CompactTextString(m) } -func (*GroupNew) ProtoMessage() {} -func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } - -func (m *GroupNew) GetG() *GroupNew_G { - if m != nil { - return m.G - } - return nil -} - -type GroupNew_G struct { - X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` - Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } -func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } -func (*GroupNew_G) ProtoMessage() {} - -func (m *GroupNew_G) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *GroupNew_G) GetY() int32 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -type FloatingPoint struct { - F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } -func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } -func (*FloatingPoint) ProtoMessage() {} -func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } - -func (m *FloatingPoint) GetF() float64 { - if m != nil && m.F != nil { - return *m.F - } - return 0 -} - -type MessageWithMap struct { - NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } -func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } -func (*MessageWithMap) ProtoMessage() {} -func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } - -func (m *MessageWithMap) GetNameMapping() map[int32]string { - if m != nil { - return m.NameMapping - } - return nil -} - -func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { - if m != nil { - return m.MsgMapping - } - return nil -} - -func (m *MessageWithMap) GetByteMapping() map[bool][]byte { - if m != nil { - return m.ByteMapping - } - return nil -} - -func (m *MessageWithMap) GetStrToStr() map[string]string { - if m != nil { - return m.StrToStr - } - return nil -} - -type Oneof struct { - // Types that are valid to be assigned to Union: - // *Oneof_F_Bool - // *Oneof_F_Int32 - // *Oneof_F_Int64 - // *Oneof_F_Fixed32 - // *Oneof_F_Fixed64 - // *Oneof_F_Uint32 - // *Oneof_F_Uint64 - // *Oneof_F_Float - // *Oneof_F_Double - // *Oneof_F_String - // *Oneof_F_Bytes - // *Oneof_F_Sint32 - // *Oneof_F_Sint64 - // *Oneof_F_Enum - // *Oneof_F_Message - // *Oneof_FGroup - // *Oneof_F_Largest_Tag - Union isOneof_Union `protobuf_oneof:"union"` - // Types that are valid to be assigned to Tormato: - // *Oneof_Value - Tormato isOneof_Tormato `protobuf_oneof:"tormato"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Oneof) Reset() { *m = Oneof{} } -func (m *Oneof) String() string { return proto.CompactTextString(m) } -func (*Oneof) ProtoMessage() {} -func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } - -type isOneof_Union interface { - isOneof_Union() -} -type isOneof_Tormato interface { - isOneof_Tormato() -} - -type Oneof_F_Bool struct { - F_Bool bool `protobuf:"varint,1,opt,name=F_Bool,oneof"` -} -type Oneof_F_Int32 struct { - F_Int32 int32 `protobuf:"varint,2,opt,name=F_Int32,oneof"` -} -type Oneof_F_Int64 struct { - F_Int64 int64 `protobuf:"varint,3,opt,name=F_Int64,oneof"` -} -type Oneof_F_Fixed32 struct { - F_Fixed32 uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,oneof"` -} -type Oneof_F_Fixed64 struct { - F_Fixed64 uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,oneof"` -} -type Oneof_F_Uint32 struct { - F_Uint32 uint32 `protobuf:"varint,6,opt,name=F_Uint32,oneof"` -} -type Oneof_F_Uint64 struct { - F_Uint64 uint64 `protobuf:"varint,7,opt,name=F_Uint64,oneof"` -} -type Oneof_F_Float struct { - F_Float float32 `protobuf:"fixed32,8,opt,name=F_Float,oneof"` -} -type Oneof_F_Double struct { - F_Double float64 `protobuf:"fixed64,9,opt,name=F_Double,oneof"` -} -type Oneof_F_String struct { - F_String string `protobuf:"bytes,10,opt,name=F_String,oneof"` -} -type Oneof_F_Bytes struct { - F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,oneof"` -} -type Oneof_F_Sint32 struct { - F_Sint32 int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,oneof"` -} -type Oneof_F_Sint64 struct { - F_Sint64 int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,oneof"` -} -type Oneof_F_Enum struct { - F_Enum MyMessage_Color `protobuf:"varint,14,opt,name=F_Enum,enum=testdata.MyMessage_Color,oneof"` -} -type Oneof_F_Message struct { - F_Message *GoTestField `protobuf:"bytes,15,opt,name=F_Message,oneof"` -} -type Oneof_FGroup struct { - FGroup *Oneof_F_Group `protobuf:"group,16,opt,name=F_Group,oneof"` -} -type Oneof_F_Largest_Tag struct { - F_Largest_Tag int32 `protobuf:"varint,536870911,opt,name=F_Largest_Tag,oneof"` -} -type Oneof_Value struct { - Value int32 `protobuf:"varint,100,opt,name=value,oneof"` -} - -func (*Oneof_F_Bool) isOneof_Union() {} -func (*Oneof_F_Int32) isOneof_Union() {} -func (*Oneof_F_Int64) isOneof_Union() {} -func (*Oneof_F_Fixed32) isOneof_Union() {} -func (*Oneof_F_Fixed64) isOneof_Union() {} -func (*Oneof_F_Uint32) isOneof_Union() {} -func (*Oneof_F_Uint64) isOneof_Union() {} -func (*Oneof_F_Float) isOneof_Union() {} -func (*Oneof_F_Double) isOneof_Union() {} -func (*Oneof_F_String) isOneof_Union() {} -func (*Oneof_F_Bytes) isOneof_Union() {} -func (*Oneof_F_Sint32) isOneof_Union() {} -func (*Oneof_F_Sint64) isOneof_Union() {} -func (*Oneof_F_Enum) isOneof_Union() {} -func (*Oneof_F_Message) isOneof_Union() {} -func (*Oneof_FGroup) isOneof_Union() {} -func (*Oneof_F_Largest_Tag) isOneof_Union() {} -func (*Oneof_Value) isOneof_Tormato() {} - -func (m *Oneof) GetUnion() isOneof_Union { - if m != nil { - return m.Union - } - return nil -} -func (m *Oneof) GetTormato() isOneof_Tormato { - if m != nil { - return m.Tormato - } - return nil -} - -func (m *Oneof) GetF_Bool() bool { - if x, ok := m.GetUnion().(*Oneof_F_Bool); ok { - return x.F_Bool - } - return false -} - -func (m *Oneof) GetF_Int32() int32 { - if x, ok := m.GetUnion().(*Oneof_F_Int32); ok { - return x.F_Int32 - } - return 0 -} - -func (m *Oneof) GetF_Int64() int64 { - if x, ok := m.GetUnion().(*Oneof_F_Int64); ok { - return x.F_Int64 - } - return 0 -} - -func (m *Oneof) GetF_Fixed32() uint32 { - if x, ok := m.GetUnion().(*Oneof_F_Fixed32); ok { - return x.F_Fixed32 - } - return 0 -} - -func (m *Oneof) GetF_Fixed64() uint64 { - if x, ok := m.GetUnion().(*Oneof_F_Fixed64); ok { - return x.F_Fixed64 - } - return 0 -} - -func (m *Oneof) GetF_Uint32() uint32 { - if x, ok := m.GetUnion().(*Oneof_F_Uint32); ok { - return x.F_Uint32 - } - return 0 -} - -func (m *Oneof) GetF_Uint64() uint64 { - if x, ok := m.GetUnion().(*Oneof_F_Uint64); ok { - return x.F_Uint64 - } - return 0 -} - -func (m *Oneof) GetF_Float() float32 { - if x, ok := m.GetUnion().(*Oneof_F_Float); ok { - return x.F_Float - } - return 0 -} - -func (m *Oneof) GetF_Double() float64 { - if x, ok := m.GetUnion().(*Oneof_F_Double); ok { - return x.F_Double - } - return 0 -} - -func (m *Oneof) GetF_String() string { - if x, ok := m.GetUnion().(*Oneof_F_String); ok { - return x.F_String - } - return "" -} - -func (m *Oneof) GetF_Bytes() []byte { - if x, ok := m.GetUnion().(*Oneof_F_Bytes); ok { - return x.F_Bytes - } - return nil -} - -func (m *Oneof) GetF_Sint32() int32 { - if x, ok := m.GetUnion().(*Oneof_F_Sint32); ok { - return x.F_Sint32 - } - return 0 -} - -func (m *Oneof) GetF_Sint64() int64 { - if x, ok := m.GetUnion().(*Oneof_F_Sint64); ok { - return x.F_Sint64 - } - return 0 -} - -func (m *Oneof) GetF_Enum() MyMessage_Color { - if x, ok := m.GetUnion().(*Oneof_F_Enum); ok { - return x.F_Enum - } - return MyMessage_RED -} - -func (m *Oneof) GetF_Message() *GoTestField { - if x, ok := m.GetUnion().(*Oneof_F_Message); ok { - return x.F_Message - } - return nil -} - -func (m *Oneof) GetFGroup() *Oneof_F_Group { - if x, ok := m.GetUnion().(*Oneof_FGroup); ok { - return x.FGroup - } - return nil -} - -func (m *Oneof) GetF_Largest_Tag() int32 { - if x, ok := m.GetUnion().(*Oneof_F_Largest_Tag); ok { - return x.F_Largest_Tag - } - return 0 -} - -func (m *Oneof) GetValue() int32 { - if x, ok := m.GetTormato().(*Oneof_Value); ok { - return x.Value - } - return 0 -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*Oneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _Oneof_OneofMarshaler, _Oneof_OneofUnmarshaler, _Oneof_OneofSizer, []interface{}{ - (*Oneof_F_Bool)(nil), - (*Oneof_F_Int32)(nil), - (*Oneof_F_Int64)(nil), - (*Oneof_F_Fixed32)(nil), - (*Oneof_F_Fixed64)(nil), - (*Oneof_F_Uint32)(nil), - (*Oneof_F_Uint64)(nil), - (*Oneof_F_Float)(nil), - (*Oneof_F_Double)(nil), - (*Oneof_F_String)(nil), - (*Oneof_F_Bytes)(nil), - (*Oneof_F_Sint32)(nil), - (*Oneof_F_Sint64)(nil), - (*Oneof_F_Enum)(nil), - (*Oneof_F_Message)(nil), - (*Oneof_FGroup)(nil), - (*Oneof_F_Largest_Tag)(nil), - (*Oneof_Value)(nil), - } -} - -func _Oneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*Oneof) - // union - switch x := m.Union.(type) { - case *Oneof_F_Bool: - t := uint64(0) - if x.F_Bool { - t = 1 - } - b.EncodeVarint(1<<3 | proto.WireVarint) - b.EncodeVarint(t) - case *Oneof_F_Int32: - b.EncodeVarint(2<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Int32)) - case *Oneof_F_Int64: - b.EncodeVarint(3<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Int64)) - case *Oneof_F_Fixed32: - b.EncodeVarint(4<<3 | proto.WireFixed32) - b.EncodeFixed32(uint64(x.F_Fixed32)) - case *Oneof_F_Fixed64: - b.EncodeVarint(5<<3 | proto.WireFixed64) - b.EncodeFixed64(uint64(x.F_Fixed64)) - case *Oneof_F_Uint32: - b.EncodeVarint(6<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Uint32)) - case *Oneof_F_Uint64: - b.EncodeVarint(7<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Uint64)) - case *Oneof_F_Float: - b.EncodeVarint(8<<3 | proto.WireFixed32) - b.EncodeFixed32(uint64(math.Float32bits(x.F_Float))) - case *Oneof_F_Double: - b.EncodeVarint(9<<3 | proto.WireFixed64) - b.EncodeFixed64(math.Float64bits(x.F_Double)) - case *Oneof_F_String: - b.EncodeVarint(10<<3 | proto.WireBytes) - b.EncodeStringBytes(x.F_String) - case *Oneof_F_Bytes: - b.EncodeVarint(11<<3 | proto.WireBytes) - b.EncodeRawBytes(x.F_Bytes) - case *Oneof_F_Sint32: - b.EncodeVarint(12<<3 | proto.WireVarint) - b.EncodeZigzag32(uint64(x.F_Sint32)) - case *Oneof_F_Sint64: - b.EncodeVarint(13<<3 | proto.WireVarint) - b.EncodeZigzag64(uint64(x.F_Sint64)) - case *Oneof_F_Enum: - b.EncodeVarint(14<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Enum)) - case *Oneof_F_Message: - b.EncodeVarint(15<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.F_Message); err != nil { - return err - } - case *Oneof_FGroup: - b.EncodeVarint(16<<3 | proto.WireStartGroup) - if err := b.Marshal(x.FGroup); err != nil { - return err - } - b.EncodeVarint(16<<3 | proto.WireEndGroup) - case *Oneof_F_Largest_Tag: - b.EncodeVarint(536870911<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.F_Largest_Tag)) - case nil: - default: - return fmt.Errorf("Oneof.Union has unexpected type %T", x) - } - // tormato - switch x := m.Tormato.(type) { - case *Oneof_Value: - b.EncodeVarint(100<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.Value)) - case nil: - default: - return fmt.Errorf("Oneof.Tormato has unexpected type %T", x) - } - return nil -} - -func _Oneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*Oneof) - switch tag { - case 1: // union.F_Bool - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Bool{x != 0} - return true, err - case 2: // union.F_Int32 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Int32{int32(x)} - return true, err - case 3: // union.F_Int64 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Int64{int64(x)} - return true, err - case 4: // union.F_Fixed32 - if wire != proto.WireFixed32 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed32() - m.Union = &Oneof_F_Fixed32{uint32(x)} - return true, err - case 5: // union.F_Fixed64 - if wire != proto.WireFixed64 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed64() - m.Union = &Oneof_F_Fixed64{x} - return true, err - case 6: // union.F_Uint32 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Uint32{uint32(x)} - return true, err - case 7: // union.F_Uint64 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Uint64{x} - return true, err - case 8: // union.F_Float - if wire != proto.WireFixed32 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed32() - m.Union = &Oneof_F_Float{math.Float32frombits(uint32(x))} - return true, err - case 9: // union.F_Double - if wire != proto.WireFixed64 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed64() - m.Union = &Oneof_F_Double{math.Float64frombits(x)} - return true, err - case 10: // union.F_String - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.Union = &Oneof_F_String{x} - return true, err - case 11: // union.F_Bytes - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeRawBytes(true) - m.Union = &Oneof_F_Bytes{x} - return true, err - case 12: // union.F_Sint32 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeZigzag32() - m.Union = &Oneof_F_Sint32{int32(x)} - return true, err - case 13: // union.F_Sint64 - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeZigzag64() - m.Union = &Oneof_F_Sint64{int64(x)} - return true, err - case 14: // union.F_Enum - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Enum{MyMessage_Color(x)} - return true, err - case 15: // union.F_Message - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(GoTestField) - err := b.DecodeMessage(msg) - m.Union = &Oneof_F_Message{msg} - return true, err - case 16: // union.f_group - if wire != proto.WireStartGroup { - return true, proto.ErrInternalBadWireType - } - msg := new(Oneof_F_Group) - err := b.DecodeGroup(msg) - m.Union = &Oneof_FGroup{msg} - return true, err - case 536870911: // union.F_Largest_Tag - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Oneof_F_Largest_Tag{int32(x)} - return true, err - case 100: // tormato.value - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Tormato = &Oneof_Value{int32(x)} - return true, err - default: - return false, nil - } -} - -func _Oneof_OneofSizer(msg proto.Message) (n int) { - m := msg.(*Oneof) - // union - switch x := m.Union.(type) { - case *Oneof_F_Bool: - n += proto.SizeVarint(1<<3 | proto.WireVarint) - n += 1 - case *Oneof_F_Int32: - n += proto.SizeVarint(2<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Int32)) - case *Oneof_F_Int64: - n += proto.SizeVarint(3<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Int64)) - case *Oneof_F_Fixed32: - n += proto.SizeVarint(4<<3 | proto.WireFixed32) - n += 4 - case *Oneof_F_Fixed64: - n += proto.SizeVarint(5<<3 | proto.WireFixed64) - n += 8 - case *Oneof_F_Uint32: - n += proto.SizeVarint(6<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Uint32)) - case *Oneof_F_Uint64: - n += proto.SizeVarint(7<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Uint64)) - case *Oneof_F_Float: - n += proto.SizeVarint(8<<3 | proto.WireFixed32) - n += 4 - case *Oneof_F_Double: - n += proto.SizeVarint(9<<3 | proto.WireFixed64) - n += 8 - case *Oneof_F_String: - n += proto.SizeVarint(10<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(len(x.F_String))) - n += len(x.F_String) - case *Oneof_F_Bytes: - n += proto.SizeVarint(11<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(len(x.F_Bytes))) - n += len(x.F_Bytes) - case *Oneof_F_Sint32: - n += proto.SizeVarint(12<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64((uint32(x.F_Sint32) << 1) ^ uint32((int32(x.F_Sint32) >> 31)))) - case *Oneof_F_Sint64: - n += proto.SizeVarint(13<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(uint64(x.F_Sint64<<1) ^ uint64((int64(x.F_Sint64) >> 63)))) - case *Oneof_F_Enum: - n += proto.SizeVarint(14<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Enum)) - case *Oneof_F_Message: - s := proto.Size(x.F_Message) - n += proto.SizeVarint(15<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *Oneof_FGroup: - n += proto.SizeVarint(16<<3 | proto.WireStartGroup) - n += proto.Size(x.FGroup) - n += proto.SizeVarint(16<<3 | proto.WireEndGroup) - case *Oneof_F_Largest_Tag: - n += proto.SizeVarint(536870911<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.F_Largest_Tag)) - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - // tormato - switch x := m.Tormato.(type) { - case *Oneof_Value: - n += proto.SizeVarint(100<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.Value)) - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type Oneof_F_Group struct { - X *int32 `protobuf:"varint,17,opt,name=x" json:"x,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } -func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } -func (*Oneof_F_Group) ProtoMessage() {} - -func (m *Oneof_F_Group) GetX() int32 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -type Communique struct { - MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry" json:"make_me_cry,omitempty"` - // This is a oneof, called "union". - // - // Types that are valid to be assigned to Union: - // *Communique_Number - // *Communique_Name - // *Communique_Data - // *Communique_TempC - // *Communique_Col - // *Communique_Msg - Union isCommunique_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Communique) Reset() { *m = Communique{} } -func (m *Communique) String() string { return proto.CompactTextString(m) } -func (*Communique) ProtoMessage() {} -func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } - -type isCommunique_Union interface { - isCommunique_Union() -} - -type Communique_Number struct { - Number int32 `protobuf:"varint,5,opt,name=number,oneof"` -} -type Communique_Name struct { - Name string `protobuf:"bytes,6,opt,name=name,oneof"` -} -type Communique_Data struct { - Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` -} -type Communique_TempC struct { - TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,oneof"` -} -type Communique_Col struct { - Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=testdata.MyMessage_Color,oneof"` -} -type Communique_Msg struct { - Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` -} - -func (*Communique_Number) isCommunique_Union() {} -func (*Communique_Name) isCommunique_Union() {} -func (*Communique_Data) isCommunique_Union() {} -func (*Communique_TempC) isCommunique_Union() {} -func (*Communique_Col) isCommunique_Union() {} -func (*Communique_Msg) isCommunique_Union() {} - -func (m *Communique) GetUnion() isCommunique_Union { - if m != nil { - return m.Union - } - return nil -} - -func (m *Communique) GetMakeMeCry() bool { - if m != nil && m.MakeMeCry != nil { - return *m.MakeMeCry - } - return false -} - -func (m *Communique) GetNumber() int32 { - if x, ok := m.GetUnion().(*Communique_Number); ok { - return x.Number - } - return 0 -} - -func (m *Communique) GetName() string { - if x, ok := m.GetUnion().(*Communique_Name); ok { - return x.Name - } - return "" -} - -func (m *Communique) GetData() []byte { - if x, ok := m.GetUnion().(*Communique_Data); ok { - return x.Data - } - return nil -} - -func (m *Communique) GetTempC() float64 { - if x, ok := m.GetUnion().(*Communique_TempC); ok { - return x.TempC - } - return 0 -} - -func (m *Communique) GetCol() MyMessage_Color { - if x, ok := m.GetUnion().(*Communique_Col); ok { - return x.Col - } - return MyMessage_RED -} - -func (m *Communique) GetMsg() *Strings { - if x, ok := m.GetUnion().(*Communique_Msg); ok { - return x.Msg - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ - (*Communique_Number)(nil), - (*Communique_Name)(nil), - (*Communique_Data)(nil), - (*Communique_TempC)(nil), - (*Communique_Col)(nil), - (*Communique_Msg)(nil), - } -} - -func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*Communique) - // union - switch x := m.Union.(type) { - case *Communique_Number: - b.EncodeVarint(5<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.Number)) - case *Communique_Name: - b.EncodeVarint(6<<3 | proto.WireBytes) - b.EncodeStringBytes(x.Name) - case *Communique_Data: - b.EncodeVarint(7<<3 | proto.WireBytes) - b.EncodeRawBytes(x.Data) - case *Communique_TempC: - b.EncodeVarint(8<<3 | proto.WireFixed64) - b.EncodeFixed64(math.Float64bits(x.TempC)) - case *Communique_Col: - b.EncodeVarint(9<<3 | proto.WireVarint) - b.EncodeVarint(uint64(x.Col)) - case *Communique_Msg: - b.EncodeVarint(10<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Msg); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("Communique.Union has unexpected type %T", x) - } - return nil -} - -func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*Communique) - switch tag { - case 5: // union.number - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Communique_Number{int32(x)} - return true, err - case 6: // union.name - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.Union = &Communique_Name{x} - return true, err - case 7: // union.data - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeRawBytes(true) - m.Union = &Communique_Data{x} - return true, err - case 8: // union.temp_c - if wire != proto.WireFixed64 { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeFixed64() - m.Union = &Communique_TempC{math.Float64frombits(x)} - return true, err - case 9: // union.col - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Union = &Communique_Col{MyMessage_Color(x)} - return true, err - case 10: // union.msg - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Strings) - err := b.DecodeMessage(msg) - m.Union = &Communique_Msg{msg} - return true, err - default: - return false, nil - } -} - -func _Communique_OneofSizer(msg proto.Message) (n int) { - m := msg.(*Communique) - // union - switch x := m.Union.(type) { - case *Communique_Number: - n += proto.SizeVarint(5<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.Number)) - case *Communique_Name: - n += proto.SizeVarint(6<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(len(x.Name))) - n += len(x.Name) - case *Communique_Data: - n += proto.SizeVarint(7<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(len(x.Data))) - n += len(x.Data) - case *Communique_TempC: - n += proto.SizeVarint(8<<3 | proto.WireFixed64) - n += 8 - case *Communique_Col: - n += proto.SizeVarint(9<<3 | proto.WireVarint) - n += proto.SizeVarint(uint64(x.Col)) - case *Communique_Msg: - s := proto.Size(x.Msg) - n += proto.SizeVarint(10<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -var E_Greeting = &proto.ExtensionDesc{ - ExtendedType: (*MyMessage)(nil), - ExtensionType: ([]string)(nil), - Field: 106, - Name: "testdata.greeting", - Tag: "bytes,106,rep,name=greeting", -} - -var E_Complex = &proto.ExtensionDesc{ - ExtendedType: (*OtherMessage)(nil), - ExtensionType: (*ComplexExtension)(nil), - Field: 200, - Name: "testdata.complex", - Tag: "bytes,200,opt,name=complex", -} - -var E_RComplex = &proto.ExtensionDesc{ - ExtendedType: (*OtherMessage)(nil), - ExtensionType: ([]*ComplexExtension)(nil), - Field: 201, - Name: "testdata.r_complex", - Tag: "bytes,201,rep,name=r_complex", -} - -var E_NoDefaultDouble = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float64)(nil), - Field: 101, - Name: "testdata.no_default_double", - Tag: "fixed64,101,opt,name=no_default_double", -} - -var E_NoDefaultFloat = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float32)(nil), - Field: 102, - Name: "testdata.no_default_float", - Tag: "fixed32,102,opt,name=no_default_float", -} - -var E_NoDefaultInt32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 103, - Name: "testdata.no_default_int32", - Tag: "varint,103,opt,name=no_default_int32", -} - -var E_NoDefaultInt64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 104, - Name: "testdata.no_default_int64", - Tag: "varint,104,opt,name=no_default_int64", -} - -var E_NoDefaultUint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 105, - Name: "testdata.no_default_uint32", - Tag: "varint,105,opt,name=no_default_uint32", -} - -var E_NoDefaultUint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 106, - Name: "testdata.no_default_uint64", - Tag: "varint,106,opt,name=no_default_uint64", -} - -var E_NoDefaultSint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 107, - Name: "testdata.no_default_sint32", - Tag: "zigzag32,107,opt,name=no_default_sint32", -} - -var E_NoDefaultSint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 108, - Name: "testdata.no_default_sint64", - Tag: "zigzag64,108,opt,name=no_default_sint64", -} - -var E_NoDefaultFixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 109, - Name: "testdata.no_default_fixed32", - Tag: "fixed32,109,opt,name=no_default_fixed32", -} - -var E_NoDefaultFixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 110, - Name: "testdata.no_default_fixed64", - Tag: "fixed64,110,opt,name=no_default_fixed64", -} - -var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 111, - Name: "testdata.no_default_sfixed32", - Tag: "fixed32,111,opt,name=no_default_sfixed32", -} - -var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 112, - Name: "testdata.no_default_sfixed64", - Tag: "fixed64,112,opt,name=no_default_sfixed64", -} - -var E_NoDefaultBool = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 113, - Name: "testdata.no_default_bool", - Tag: "varint,113,opt,name=no_default_bool", -} - -var E_NoDefaultString = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*string)(nil), - Field: 114, - Name: "testdata.no_default_string", - Tag: "bytes,114,opt,name=no_default_string", -} - -var E_NoDefaultBytes = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: ([]byte)(nil), - Field: 115, - Name: "testdata.no_default_bytes", - Tag: "bytes,115,opt,name=no_default_bytes", -} - -var E_NoDefaultEnum = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), - Field: 116, - Name: "testdata.no_default_enum", - Tag: "varint,116,opt,name=no_default_enum,enum=testdata.DefaultsMessage_DefaultsEnum", -} - -var E_DefaultDouble = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float64)(nil), - Field: 201, - Name: "testdata.default_double", - Tag: "fixed64,201,opt,name=default_double,def=3.1415", -} - -var E_DefaultFloat = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*float32)(nil), - Field: 202, - Name: "testdata.default_float", - Tag: "fixed32,202,opt,name=default_float,def=3.14", -} - -var E_DefaultInt32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 203, - Name: "testdata.default_int32", - Tag: "varint,203,opt,name=default_int32,def=42", -} - -var E_DefaultInt64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 204, - Name: "testdata.default_int64", - Tag: "varint,204,opt,name=default_int64,def=43", -} - -var E_DefaultUint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 205, - Name: "testdata.default_uint32", - Tag: "varint,205,opt,name=default_uint32,def=44", -} - -var E_DefaultUint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 206, - Name: "testdata.default_uint64", - Tag: "varint,206,opt,name=default_uint64,def=45", -} - -var E_DefaultSint32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 207, - Name: "testdata.default_sint32", - Tag: "zigzag32,207,opt,name=default_sint32,def=46", -} - -var E_DefaultSint64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 208, - Name: "testdata.default_sint64", - Tag: "zigzag64,208,opt,name=default_sint64,def=47", -} - -var E_DefaultFixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint32)(nil), - Field: 209, - Name: "testdata.default_fixed32", - Tag: "fixed32,209,opt,name=default_fixed32,def=48", -} - -var E_DefaultFixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*uint64)(nil), - Field: 210, - Name: "testdata.default_fixed64", - Tag: "fixed64,210,opt,name=default_fixed64,def=49", -} - -var E_DefaultSfixed32 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int32)(nil), - Field: 211, - Name: "testdata.default_sfixed32", - Tag: "fixed32,211,opt,name=default_sfixed32,def=50", -} - -var E_DefaultSfixed64 = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*int64)(nil), - Field: 212, - Name: "testdata.default_sfixed64", - Tag: "fixed64,212,opt,name=default_sfixed64,def=51", -} - -var E_DefaultBool = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 213, - Name: "testdata.default_bool", - Tag: "varint,213,opt,name=default_bool,def=1", -} - -var E_DefaultString = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*string)(nil), - Field: 214, - Name: "testdata.default_string", - Tag: "bytes,214,opt,name=default_string,def=Hello, string", -} - -var E_DefaultBytes = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: ([]byte)(nil), - Field: 215, - Name: "testdata.default_bytes", - Tag: "bytes,215,opt,name=default_bytes,def=Hello, bytes", -} - -var E_DefaultEnum = &proto.ExtensionDesc{ - ExtendedType: (*DefaultsMessage)(nil), - ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), - Field: 216, - Name: "testdata.default_enum", - Tag: "varint,216,opt,name=default_enum,enum=testdata.DefaultsMessage_DefaultsEnum,def=1", -} - -var E_X201 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 201, - Name: "testdata.x201", - Tag: "bytes,201,opt,name=x201", -} - -var E_X202 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 202, - Name: "testdata.x202", - Tag: "bytes,202,opt,name=x202", -} - -var E_X203 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 203, - Name: "testdata.x203", - Tag: "bytes,203,opt,name=x203", -} - -var E_X204 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 204, - Name: "testdata.x204", - Tag: "bytes,204,opt,name=x204", -} - -var E_X205 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 205, - Name: "testdata.x205", - Tag: "bytes,205,opt,name=x205", -} - -var E_X206 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 206, - Name: "testdata.x206", - Tag: "bytes,206,opt,name=x206", -} - -var E_X207 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 207, - Name: "testdata.x207", - Tag: "bytes,207,opt,name=x207", -} - -var E_X208 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 208, - Name: "testdata.x208", - Tag: "bytes,208,opt,name=x208", -} - -var E_X209 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 209, - Name: "testdata.x209", - Tag: "bytes,209,opt,name=x209", -} - -var E_X210 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 210, - Name: "testdata.x210", - Tag: "bytes,210,opt,name=x210", -} - -var E_X211 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 211, - Name: "testdata.x211", - Tag: "bytes,211,opt,name=x211", -} - -var E_X212 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 212, - Name: "testdata.x212", - Tag: "bytes,212,opt,name=x212", -} - -var E_X213 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 213, - Name: "testdata.x213", - Tag: "bytes,213,opt,name=x213", -} - -var E_X214 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 214, - Name: "testdata.x214", - Tag: "bytes,214,opt,name=x214", -} - -var E_X215 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 215, - Name: "testdata.x215", - Tag: "bytes,215,opt,name=x215", -} - -var E_X216 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 216, - Name: "testdata.x216", - Tag: "bytes,216,opt,name=x216", -} - -var E_X217 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 217, - Name: "testdata.x217", - Tag: "bytes,217,opt,name=x217", -} - -var E_X218 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 218, - Name: "testdata.x218", - Tag: "bytes,218,opt,name=x218", -} - -var E_X219 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 219, - Name: "testdata.x219", - Tag: "bytes,219,opt,name=x219", -} - -var E_X220 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 220, - Name: "testdata.x220", - Tag: "bytes,220,opt,name=x220", -} - -var E_X221 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 221, - Name: "testdata.x221", - Tag: "bytes,221,opt,name=x221", -} - -var E_X222 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 222, - Name: "testdata.x222", - Tag: "bytes,222,opt,name=x222", -} - -var E_X223 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 223, - Name: "testdata.x223", - Tag: "bytes,223,opt,name=x223", -} - -var E_X224 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 224, - Name: "testdata.x224", - Tag: "bytes,224,opt,name=x224", -} - -var E_X225 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 225, - Name: "testdata.x225", - Tag: "bytes,225,opt,name=x225", -} - -var E_X226 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 226, - Name: "testdata.x226", - Tag: "bytes,226,opt,name=x226", -} - -var E_X227 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 227, - Name: "testdata.x227", - Tag: "bytes,227,opt,name=x227", -} - -var E_X228 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 228, - Name: "testdata.x228", - Tag: "bytes,228,opt,name=x228", -} - -var E_X229 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 229, - Name: "testdata.x229", - Tag: "bytes,229,opt,name=x229", -} - -var E_X230 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 230, - Name: "testdata.x230", - Tag: "bytes,230,opt,name=x230", -} - -var E_X231 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 231, - Name: "testdata.x231", - Tag: "bytes,231,opt,name=x231", -} - -var E_X232 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 232, - Name: "testdata.x232", - Tag: "bytes,232,opt,name=x232", -} - -var E_X233 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 233, - Name: "testdata.x233", - Tag: "bytes,233,opt,name=x233", -} - -var E_X234 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 234, - Name: "testdata.x234", - Tag: "bytes,234,opt,name=x234", -} - -var E_X235 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 235, - Name: "testdata.x235", - Tag: "bytes,235,opt,name=x235", -} - -var E_X236 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 236, - Name: "testdata.x236", - Tag: "bytes,236,opt,name=x236", -} - -var E_X237 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 237, - Name: "testdata.x237", - Tag: "bytes,237,opt,name=x237", -} - -var E_X238 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 238, - Name: "testdata.x238", - Tag: "bytes,238,opt,name=x238", -} - -var E_X239 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 239, - Name: "testdata.x239", - Tag: "bytes,239,opt,name=x239", -} - -var E_X240 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 240, - Name: "testdata.x240", - Tag: "bytes,240,opt,name=x240", -} - -var E_X241 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 241, - Name: "testdata.x241", - Tag: "bytes,241,opt,name=x241", -} - -var E_X242 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 242, - Name: "testdata.x242", - Tag: "bytes,242,opt,name=x242", -} - -var E_X243 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 243, - Name: "testdata.x243", - Tag: "bytes,243,opt,name=x243", -} - -var E_X244 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 244, - Name: "testdata.x244", - Tag: "bytes,244,opt,name=x244", -} - -var E_X245 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 245, - Name: "testdata.x245", - Tag: "bytes,245,opt,name=x245", -} - -var E_X246 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 246, - Name: "testdata.x246", - Tag: "bytes,246,opt,name=x246", -} - -var E_X247 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 247, - Name: "testdata.x247", - Tag: "bytes,247,opt,name=x247", -} - -var E_X248 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 248, - Name: "testdata.x248", - Tag: "bytes,248,opt,name=x248", -} - -var E_X249 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 249, - Name: "testdata.x249", - Tag: "bytes,249,opt,name=x249", -} - -var E_X250 = &proto.ExtensionDesc{ - ExtendedType: (*MyMessageSet)(nil), - ExtensionType: (*Empty)(nil), - Field: 250, - Name: "testdata.x250", - Tag: "bytes,250,opt,name=x250", -} - -func init() { - proto.RegisterType((*GoEnum)(nil), "testdata.GoEnum") - proto.RegisterType((*GoTestField)(nil), "testdata.GoTestField") - proto.RegisterType((*GoTest)(nil), "testdata.GoTest") - proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") - proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") - proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") - proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") - proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") - proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") - proto.RegisterType((*PackedTest)(nil), "testdata.PackedTest") - proto.RegisterType((*MaxTag)(nil), "testdata.MaxTag") - proto.RegisterType((*OldMessage)(nil), "testdata.OldMessage") - proto.RegisterType((*OldMessage_Nested)(nil), "testdata.OldMessage.Nested") - proto.RegisterType((*NewMessage)(nil), "testdata.NewMessage") - proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") - proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") - proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") - proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") - proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") - proto.RegisterType((*Ext)(nil), "testdata.Ext") - proto.RegisterType((*ComplexExtension)(nil), "testdata.ComplexExtension") - proto.RegisterType((*DefaultsMessage)(nil), "testdata.DefaultsMessage") - proto.RegisterType((*MyMessageSet)(nil), "testdata.MyMessageSet") - proto.RegisterType((*Empty)(nil), "testdata.Empty") - proto.RegisterType((*MessageList)(nil), "testdata.MessageList") - proto.RegisterType((*MessageList_Message)(nil), "testdata.MessageList.Message") - proto.RegisterType((*Strings)(nil), "testdata.Strings") - proto.RegisterType((*Defaults)(nil), "testdata.Defaults") - proto.RegisterType((*SubDefaults)(nil), "testdata.SubDefaults") - proto.RegisterType((*RepeatedEnum)(nil), "testdata.RepeatedEnum") - proto.RegisterType((*MoreRepeated)(nil), "testdata.MoreRepeated") - proto.RegisterType((*GroupOld)(nil), "testdata.GroupOld") - proto.RegisterType((*GroupOld_G)(nil), "testdata.GroupOld.G") - proto.RegisterType((*GroupNew)(nil), "testdata.GroupNew") - proto.RegisterType((*GroupNew_G)(nil), "testdata.GroupNew.G") - proto.RegisterType((*FloatingPoint)(nil), "testdata.FloatingPoint") - proto.RegisterType((*MessageWithMap)(nil), "testdata.MessageWithMap") - proto.RegisterType((*Oneof)(nil), "testdata.Oneof") - proto.RegisterType((*Oneof_F_Group)(nil), "testdata.Oneof.F_Group") - proto.RegisterType((*Communique)(nil), "testdata.Communique") - proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) - proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) - proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) - proto.RegisterEnum("testdata.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) - proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) - proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) - proto.RegisterExtension(E_Ext_More) - proto.RegisterExtension(E_Ext_Text) - proto.RegisterExtension(E_Ext_Number) - proto.RegisterExtension(E_Greeting) - proto.RegisterExtension(E_Complex) - proto.RegisterExtension(E_RComplex) - proto.RegisterExtension(E_NoDefaultDouble) - proto.RegisterExtension(E_NoDefaultFloat) - proto.RegisterExtension(E_NoDefaultInt32) - proto.RegisterExtension(E_NoDefaultInt64) - proto.RegisterExtension(E_NoDefaultUint32) - proto.RegisterExtension(E_NoDefaultUint64) - proto.RegisterExtension(E_NoDefaultSint32) - proto.RegisterExtension(E_NoDefaultSint64) - proto.RegisterExtension(E_NoDefaultFixed32) - proto.RegisterExtension(E_NoDefaultFixed64) - proto.RegisterExtension(E_NoDefaultSfixed32) - proto.RegisterExtension(E_NoDefaultSfixed64) - proto.RegisterExtension(E_NoDefaultBool) - proto.RegisterExtension(E_NoDefaultString) - proto.RegisterExtension(E_NoDefaultBytes) - proto.RegisterExtension(E_NoDefaultEnum) - proto.RegisterExtension(E_DefaultDouble) - proto.RegisterExtension(E_DefaultFloat) - proto.RegisterExtension(E_DefaultInt32) - proto.RegisterExtension(E_DefaultInt64) - proto.RegisterExtension(E_DefaultUint32) - proto.RegisterExtension(E_DefaultUint64) - proto.RegisterExtension(E_DefaultSint32) - proto.RegisterExtension(E_DefaultSint64) - proto.RegisterExtension(E_DefaultFixed32) - proto.RegisterExtension(E_DefaultFixed64) - proto.RegisterExtension(E_DefaultSfixed32) - proto.RegisterExtension(E_DefaultSfixed64) - proto.RegisterExtension(E_DefaultBool) - proto.RegisterExtension(E_DefaultString) - proto.RegisterExtension(E_DefaultBytes) - proto.RegisterExtension(E_DefaultEnum) - proto.RegisterExtension(E_X201) - proto.RegisterExtension(E_X202) - proto.RegisterExtension(E_X203) - proto.RegisterExtension(E_X204) - proto.RegisterExtension(E_X205) - proto.RegisterExtension(E_X206) - proto.RegisterExtension(E_X207) - proto.RegisterExtension(E_X208) - proto.RegisterExtension(E_X209) - proto.RegisterExtension(E_X210) - proto.RegisterExtension(E_X211) - proto.RegisterExtension(E_X212) - proto.RegisterExtension(E_X213) - proto.RegisterExtension(E_X214) - proto.RegisterExtension(E_X215) - proto.RegisterExtension(E_X216) - proto.RegisterExtension(E_X217) - proto.RegisterExtension(E_X218) - proto.RegisterExtension(E_X219) - proto.RegisterExtension(E_X220) - proto.RegisterExtension(E_X221) - proto.RegisterExtension(E_X222) - proto.RegisterExtension(E_X223) - proto.RegisterExtension(E_X224) - proto.RegisterExtension(E_X225) - proto.RegisterExtension(E_X226) - proto.RegisterExtension(E_X227) - proto.RegisterExtension(E_X228) - proto.RegisterExtension(E_X229) - proto.RegisterExtension(E_X230) - proto.RegisterExtension(E_X231) - proto.RegisterExtension(E_X232) - proto.RegisterExtension(E_X233) - proto.RegisterExtension(E_X234) - proto.RegisterExtension(E_X235) - proto.RegisterExtension(E_X236) - proto.RegisterExtension(E_X237) - proto.RegisterExtension(E_X238) - proto.RegisterExtension(E_X239) - proto.RegisterExtension(E_X240) - proto.RegisterExtension(E_X241) - proto.RegisterExtension(E_X242) - proto.RegisterExtension(E_X243) - proto.RegisterExtension(E_X244) - proto.RegisterExtension(E_X245) - proto.RegisterExtension(E_X246) - proto.RegisterExtension(E_X247) - proto.RegisterExtension(E_X248) - proto.RegisterExtension(E_X249) - proto.RegisterExtension(E_X250) -} - -var fileDescriptor0 = []byte{ - // 3329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x58, 0xd9, 0x73, 0x1b, 0xc7, - 0xf1, 0xd6, 0xe2, 0xc6, 0x00, 0x24, 0x96, 0x4b, 0x1d, 0x10, 0xe5, 0x83, 0x5a, 0xd9, 0xfa, 0xc9, - 0x92, 0x0d, 0x93, 0x20, 0x48, 0x49, 0xfb, 0xab, 0x94, 0x23, 0x4a, 0x00, 0xcd, 0x98, 0x24, 0x18, - 0x92, 0x8a, 0xcb, 0x4e, 0x25, 0x28, 0x90, 0x5c, 0x82, 0x30, 0x01, 0x2c, 0x04, 0x2c, 0x62, 0x31, - 0x4f, 0x79, 0xcd, 0x43, 0x1e, 0x92, 0x54, 0xaa, 0x5c, 0xf9, 0x1f, 0x92, 0xbc, 0xe7, 0x2f, 0x88, - 0xef, 0xfb, 0xc8, 0x7d, 0x39, 0xf7, 0xed, 0x24, 0x76, 0x92, 0x97, 0xa4, 0xbb, 0x67, 0x6f, 0x60, - 0x87, 0xb4, 0x1e, 0x6c, 0x70, 0xbe, 0xfe, 0x7a, 0x66, 0x7a, 0xba, 0x7b, 0xbe, 0x59, 0xc6, 0x4c, - 0xbd, 0x6f, 0x16, 0xba, 0x3d, 0xc3, 0x34, 0x94, 0x14, 0xfe, 0xde, 0xad, 0x9b, 0x75, 0xf5, 0x01, - 0x96, 0x58, 0x32, 0xca, 0x9d, 0x41, 0x5b, 0x99, 0x62, 0xd1, 0x3d, 0xc3, 0xc8, 0x4b, 0xd3, 0x91, - 0x4b, 0xe3, 0xc5, 0xb1, 0x82, 0x6d, 0x51, 0xa8, 0x54, 0xab, 0xea, 0x65, 0x96, 0x59, 0x32, 0xb6, - 0x60, 0xa4, 0xd2, 0xd4, 0x5b, 0xbb, 0xca, 0x18, 0x8b, 0xaf, 0xd4, 0xb7, 0xf5, 0x16, 0x19, 0xa7, - 0x95, 0x2c, 0x8b, 0x6d, 0x1d, 0x76, 0xf5, 0x7c, 0x04, 0xff, 0x52, 0xbf, 0x7c, 0x12, 0x5d, 0xa2, - 0xb1, 0x72, 0x81, 0xc5, 0x9e, 0x68, 0x76, 0x76, 0x2d, 0x9f, 0xa7, 0x5c, 0x9f, 0x1c, 0x2f, 0x3c, - 0xb1, 0xbc, 0x76, 0x0b, 0x9d, 0x6d, 0xd5, 0xb7, 0x5b, 0x48, 0x97, 0xc0, 0x19, 0xfc, 0xb9, 0x5e, - 0xef, 0xd5, 0xdb, 0xf9, 0x28, 0xfc, 0x19, 0x57, 0x1e, 0x66, 0x63, 0x1b, 0xfa, 0x9d, 0x41, 0xb3, - 0xa7, 0xef, 0xd2, 0xdc, 0xf9, 0x18, 0xf8, 0xca, 0x0c, 0xfb, 0xe2, 0x0b, 0x23, 0xeb, 0xae, 0x5e, - 0x37, 0x6d, 0xeb, 0xf8, 0x74, 0x54, 0x68, 0x5d, 0xed, 0x9a, 0x4d, 0xa3, 0x53, 0x6f, 0x71, 0xeb, - 0x04, 0x4c, 0x19, 0x6a, 0x7d, 0x86, 0xe5, 0x2a, 0xb5, 0x45, 0xc3, 0x68, 0xd5, 0x7a, 0xd6, 0x82, - 0xf2, 0x0c, 0xd6, 0x92, 0x52, 0xf2, 0x4c, 0xae, 0xd4, 0x96, 0x3b, 0xe6, 0x5c, 0xd1, 0x45, 0x32, - 0x80, 0xc4, 0x1d, 0x64, 0xa1, 0xe4, 0x22, 0x59, 0x40, 0xa2, 0x10, 0x6c, 0xa5, 0x52, 0xab, 0x34, - 0xef, 0xea, 0xbb, 0x5e, 0xd6, 0x18, 0x60, 0x49, 0x0f, 0xe6, 0xe5, 0x8d, 0x03, 0x96, 0x50, 0xce, - 0xb2, 0x89, 0x4a, 0xed, 0x76, 0xd3, 0x3f, 0x59, 0x0e, 0xa0, 0x31, 0x17, 0xf2, 0xb2, 0x64, 0x80, - 0x62, 0x7c, 0x1d, 0x95, 0x96, 0x51, 0x37, 0x5d, 0x64, 0x02, 0x90, 0x08, 0x27, 0xdd, 0x32, 0x06, - 0x10, 0x7f, 0x17, 0x52, 0x00, 0x92, 0x38, 0xb4, 0x69, 0xf6, 0x9a, 0x9d, 0x86, 0x0b, 0x4d, 0xd2, - 0x81, 0x93, 0xbf, 0xc5, 0x43, 0x08, 0x93, 0x8b, 0xe8, 0x80, 0x64, 0x2d, 0x52, 0x60, 0x7d, 0x7b, - 0x00, 0x4d, 0xb8, 0x90, 0x77, 0x7d, 0x0d, 0x80, 0x14, 0x5f, 0x68, 0xf9, 0xe9, 0xe5, 0x4f, 0xc2, - 0xc1, 0x05, 0x42, 0x6b, 0x21, 0xa7, 0x00, 0x09, 0x84, 0xd6, 0x42, 0x4e, 0x03, 0x32, 0x14, 0x5a, - 0x0b, 0x3b, 0x03, 0xd8, 0x50, 0x68, 0x2d, 0x2c, 0x0f, 0x58, 0x30, 0xb4, 0x16, 0x74, 0x16, 0xa0, - 0x60, 0x68, 0x2d, 0x68, 0x0a, 0xa0, 0x40, 0x68, 0x2d, 0xe4, 0x1c, 0x20, 0xc1, 0xd0, 0x5a, 0xd0, - 0x3d, 0x00, 0x05, 0x43, 0x6b, 0x41, 0xf7, 0x02, 0x94, 0x06, 0xc8, 0x13, 0x5a, 0x0b, 0x79, 0x5e, - 0x02, 0x28, 0x0b, 0x8b, 0xf7, 0xc6, 0xd6, 0xc2, 0x5e, 0x40, 0x6c, 0xc2, 0xc5, 0xbc, 0x2b, 0x7c, - 0x11, 0x31, 0x6f, 0x74, 0x0d, 0x2b, 0xdb, 0xf3, 0xf7, 0x41, 0xa2, 0xfb, 0xa2, 0xeb, 0x20, 0xf7, - 0x53, 0xd5, 0x79, 0xa2, 0xeb, 0x20, 0xd3, 0x80, 0x04, 0xa2, 0xeb, 0x60, 0xe7, 0x01, 0x0b, 0x44, - 0xd7, 0xc1, 0x54, 0xc0, 0xfc, 0xd1, 0x75, 0xa0, 0x0b, 0x00, 0xf9, 0xa3, 0xeb, 0x40, 0x0f, 0x00, - 0xe4, 0x8b, 0xae, 0x83, 0x3c, 0x08, 0x88, 0x3f, 0xba, 0x0e, 0x74, 0x11, 0x20, 0x7f, 0x74, 0x1d, - 0xe8, 0xff, 0xa8, 0xb9, 0x78, 0xa2, 0xeb, 0x20, 0xdf, 0xc2, 0xbe, 0xe3, 0x8f, 0xae, 0x83, 0x7d, - 0x1b, 0x31, 0x7f, 0x74, 0x1d, 0xec, 0x3b, 0x88, 0x29, 0xca, 0x7d, 0xe4, 0x12, 0xa3, 0xbb, 0xab, - 0xef, 0xd5, 0x07, 0x2d, 0x0c, 0xfc, 0x25, 0x0c, 0xaf, 0x16, 0x33, 0x7b, 0x03, 0x5d, 0xb9, 0x17, - 0xb9, 0x3c, 0xc8, 0xae, 0xc1, 0x43, 0x18, 0x65, 0x2d, 0x32, 0x57, 0x74, 0x60, 0xf0, 0xec, 0xc2, - 0x97, 0x31, 0xd4, 0x5a, 0x64, 0xa1, 0xa4, 0x4c, 0xb3, 0x49, 0x37, 0xdc, 0xae, 0xc1, 0x15, 0x8c, - 0xb7, 0x16, 0x9d, 0x2b, 0xce, 0x78, 0x2c, 0x7c, 0x2e, 0x1e, 0xc6, 0xa8, 0x6b, 0xd1, 0x85, 0x12, - 0x5a, 0x28, 0x4e, 0xe8, 0x5d, 0x83, 0x47, 0x30, 0xf6, 0x5a, 0x0c, 0x5c, 0x78, 0x2c, 0x7c, 0x2e, - 0x0a, 0x78, 0x04, 0x5a, 0x0c, 0x5c, 0xcc, 0x28, 0xe7, 0x71, 0x99, 0xfc, 0x20, 0x5c, 0x83, 0x47, - 0xf1, 0x24, 0xb4, 0xc4, 0xdc, 0x6c, 0x69, 0x76, 0xfe, 0xba, 0xa2, 0xa2, 0x13, 0xeb, 0x44, 0x5c, - 0x9b, 0x19, 0x3c, 0x12, 0x2d, 0x51, 0xbc, 0x3a, 0x7b, 0xad, 0x78, 0x0d, 0x3a, 0xae, 0xe2, 0x1c, - 0x8d, 0x6b, 0x33, 0x8b, 0x67, 0xa3, 0xc9, 0xfb, 0x7a, 0xab, 0x65, 0x3c, 0x3c, 0xad, 0x3e, 0x6b, - 0xf4, 0x5a, 0xbb, 0xe7, 0xc1, 0xdd, 0x05, 0x9c, 0x94, 0x9f, 0x96, 0x6b, 0xfc, 0x55, 0xbc, 0x17, - 0xb2, 0x5a, 0x72, 0xb1, 0xd9, 0xe8, 0x18, 0x7d, 0x9d, 0xaf, 0x7d, 0x33, 0xb8, 0xbb, 0xaf, 0xa1, - 0xd5, 0x84, 0x16, 0x7d, 0x04, 0x42, 0xec, 0x58, 0xf8, 0x76, 0xf7, 0x75, 0xb4, 0x50, 0xc0, 0x02, - 0xa2, 0xac, 0xb2, 0xd3, 0x81, 0xfe, 0x53, 0xeb, 0xd6, 0x77, 0x0e, 0xc0, 0xaa, 0x88, 0x6d, 0x68, - 0x31, 0x22, 0x4b, 0xb0, 0x98, 0x33, 0xc1, 0x56, 0x64, 0x1b, 0xcd, 0x61, 0x47, 0xf2, 0x19, 0x79, - 0xaa, 0xd0, 0x36, 0x2a, 0x61, 0x73, 0x22, 0xa3, 0x07, 0xd9, 0xd9, 0xe1, 0x06, 0x65, 0x9b, 0xcd, - 0x63, 0x9f, 0x0a, 0x98, 0x8d, 0xf0, 0xb6, 0x80, 0x2d, 0x8b, 0xcc, 0x1e, 0x60, 0xf9, 0xa1, 0xb6, - 0x65, 0x5b, 0x5d, 0xc5, 0xee, 0xe5, 0xb7, 0x1a, 0xe1, 0xeb, 0x1a, 0x36, 0x32, 0x77, 0xf9, 0xfe, - 0x66, 0x66, 0x1b, 0x5d, 0xc7, 0x9e, 0xe6, 0xba, 0x0a, 0xf4, 0x35, 0xdb, 0x4a, 0xc3, 0xf6, 0x66, - 0xad, 0x3e, 0x3f, 0xd4, 0xac, 0x6c, 0xab, 0x0f, 0xa3, 0xd8, 0xb3, 0xfc, 0x66, 0x23, 0xd6, 0xf5, - 0x11, 0x9a, 0x29, 0x64, 0x36, 0xcf, 0xc6, 0xec, 0x2b, 0xa3, 0xd1, 0x33, 0x06, 0xdd, 0x7c, 0x05, - 0xee, 0x0d, 0x56, 0xbc, 0x6f, 0x48, 0x51, 0xd8, 0x5a, 0x61, 0x09, 0xad, 0x38, 0x8d, 0x3b, 0xe5, - 0xb4, 0x75, 0xf0, 0x38, 0x9a, 0xc6, 0xad, 0x1c, 0x9a, 0x5d, 0xe5, 0x9c, 0xf6, 0x34, 0xa4, 0xca, - 0x28, 0x9a, 0xad, 0x1e, 0x88, 0x36, 0x75, 0xd1, 0x95, 0x2a, 0xdc, 0xcf, 0xa9, 0xa0, 0x76, 0x59, - 0xc2, 0xdb, 0x93, 0xdb, 0x79, 0xe7, 0x1b, 0xb2, 0xfb, 0xb4, 0x6d, 0xe7, 0x9b, 0x60, 0xd8, 0xee, - 0xb3, 0x24, 0xb8, 0x9e, 0x93, 0x40, 0x66, 0xa1, 0x92, 0x4a, 0xb1, 0xd8, 0x67, 0xaa, 0xcb, 0xb7, - 0xe4, 0x13, 0xf8, 0x6b, 0xb1, 0x5a, 0x5d, 0x81, 0xc8, 0xa5, 0x59, 0x7c, 0xf1, 0xa9, 0xad, 0xf2, - 0xa6, 0x1c, 0x51, 0x72, 0x2c, 0x53, 0x59, 0x5e, 0x5b, 0x2a, 0x6f, 0xac, 0x6f, 0x2c, 0xaf, 0x6d, - 0xc9, 0x51, 0xc4, 0x2a, 0x2b, 0xd5, 0x1b, 0x5b, 0x72, 0x4c, 0x49, 0xb2, 0x28, 0x8e, 0xc5, 0x15, - 0xc6, 0x12, 0x9b, 0x5b, 0x80, 0x2f, 0xc9, 0x09, 0xf4, 0xb2, 0xb5, 0xbc, 0x5a, 0x96, 0x93, 0x68, - 0xb9, 0x75, 0x7b, 0x7d, 0xa5, 0x2c, 0xa7, 0xf0, 0xe7, 0x8d, 0x8d, 0x8d, 0x1b, 0x4f, 0xc9, 0x69, - 0x24, 0xad, 0xde, 0x58, 0x97, 0x19, 0xc1, 0x37, 0x16, 0x01, 0xce, 0x80, 0x16, 0x4c, 0x55, 0x6e, - 0xaf, 0xdd, 0xdc, 0x5a, 0xae, 0xae, 0xc9, 0x59, 0xf5, 0x25, 0x89, 0xb1, 0x25, 0x63, 0xf3, 0xa0, - 0xd9, 0x25, 0x3d, 0x08, 0xde, 0xfb, 0xf0, 0xbb, 0x46, 0x69, 0x61, 0x69, 0xa4, 0x93, 0x2c, 0x4b, - 0x63, 0x7b, 0xbc, 0x20, 0x48, 0x1f, 0x25, 0xfd, 0xa3, 0x0b, 0x25, 0x52, 0x46, 0x09, 0x65, 0x92, - 0x65, 0x68, 0xb4, 0x4f, 0x1d, 0x84, 0x24, 0x51, 0x5a, 0x99, 0x65, 0x69, 0x1c, 0xe4, 0x27, 0x95, - 0x1b, 0xce, 0x0b, 0x7b, 0xf6, 0x02, 0xfe, 0xe0, 0x27, 0xb5, 0xc0, 0xd2, 0xce, 0x1f, 0xe8, 0x94, - 0xb8, 0xd6, 0xaa, 0x64, 0x7b, 0x55, 0x7c, 0xd0, 0x9a, 0x6a, 0x82, 0x22, 0x3d, 0xc5, 0xc6, 0xd6, - 0x8c, 0xce, 0x3a, 0xa5, 0x27, 0x6d, 0x28, 0xcd, 0xa4, 0x7a, 0x1e, 0x6f, 0xd9, 0xb8, 0x7a, 0x8e, - 0x31, 0x0f, 0x30, 0xc6, 0xa4, 0x6d, 0x0e, 0x60, 0xfe, 0xaa, 0xd3, 0x2c, 0xb1, 0x5a, 0xbf, 0xbb, - 0x55, 0x6f, 0x28, 0xa7, 0x19, 0x6b, 0xd5, 0xfb, 0x26, 0x6c, 0x0c, 0x0f, 0xf0, 0xbf, 0xf0, 0x4f, - 0xc2, 0xee, 0xa7, 0x7e, 0x9e, 0xb1, 0x6a, 0x6b, 0x77, 0x55, 0xef, 0xf7, 0xeb, 0x0d, 0x5d, 0xb9, - 0xc2, 0x12, 0x1d, 0x70, 0xa3, 0xa3, 0x74, 0x46, 0x49, 0x7a, 0xce, 0xdd, 0x90, 0x6b, 0x55, 0x58, - 0x23, 0x13, 0x25, 0xc3, 0xa2, 0xa0, 0xdf, 0x49, 0x3e, 0xc7, 0xa7, 0x4e, 0xb3, 0x84, 0x35, 0x0c, - 0xaa, 0xbc, 0x53, 0x6f, 0xeb, 0x79, 0xee, 0xbf, 0xc7, 0xd8, 0x9a, 0xfe, 0xec, 0x31, 0xfc, 0xbb, - 0x56, 0x23, 0xfc, 0x47, 0xa7, 0x2e, 0x8f, 0xf6, 0x8f, 0x47, 0x0b, 0xaf, 0x87, 0xdd, 0x1a, 0x3f, - 0x06, 0x92, 0xf2, 0xea, 0x4d, 0x96, 0x5d, 0xee, 0x74, 0xf4, 0x9e, 0x3d, 0x2b, 0x30, 0xf6, 0x8d, - 0xbe, 0x69, 0xbd, 0x1a, 0x14, 0x16, 0xeb, 0x1a, 0x3d, 0x93, 0xaf, 0x5b, 0x8b, 0xc1, 0x2d, 0x33, - 0xa3, 0x4c, 0xb0, 0xf4, 0x8e, 0x01, 0x94, 0x1d, 0x5c, 0x1a, 0x36, 0xe8, 0x94, 0x7a, 0xc0, 0xb2, - 0x55, 0x73, 0xdf, 0x75, 0x02, 0xab, 0x39, 0xd0, 0x0f, 0x69, 0xd6, 0x28, 0x3e, 0x16, 0xbe, 0x50, - 0x6f, 0x0d, 0xf8, 0xdb, 0x21, 0xab, 0x8c, 0xb3, 0xc4, 0xb3, 0x7a, 0xb3, 0xb1, 0x6f, 0x12, 0x37, - 0x02, 0xdd, 0x25, 0xde, 0xc4, 0x05, 0xc0, 0xa3, 0x01, 0x77, 0x79, 0xda, 0xdd, 0xa5, 0x77, 0x5d, - 0x97, 0x53, 0xa9, 0x5d, 0xf9, 0x4b, 0xf0, 0x2f, 0xa2, 0x7e, 0x23, 0xca, 0xd2, 0xab, 0x87, 0xf6, - 0x54, 0xe0, 0x7d, 0xc7, 0x18, 0x74, 0xf8, 0x82, 0xe3, 0xce, 0x86, 0x9d, 0x77, 0xca, 0x9d, 0x81, - 0x61, 0xea, 0x34, 0x55, 0x1a, 0x97, 0xd5, 0xd5, 0x4d, 0x98, 0x08, 0x45, 0x9c, 0x33, 0x6f, 0x5c, - 0x34, 0xaf, 0x72, 0x91, 0x25, 0x0c, 0xdc, 0x5a, 0x1f, 0x1e, 0x1e, 0x51, 0xbf, 0x9d, 0x6f, 0xcb, - 0x0f, 0xb1, 0x34, 0xb4, 0xb1, 0x1a, 0x77, 0x99, 0x0d, 0x9a, 0xfa, 0x5c, 0x5e, 0x61, 0xa9, 0xed, - 0xe6, 0x81, 0xde, 0xdf, 0x87, 0xf8, 0x25, 0x61, 0xf2, 0xf1, 0xe2, 0x59, 0xd7, 0xd2, 0xd9, 0x59, - 0xe1, 0xa6, 0xd1, 0x32, 0x7a, 0xca, 0x0c, 0x54, 0x8e, 0xd1, 0xd6, 0xf9, 0x91, 0xa5, 0xa8, 0xc7, - 0xdd, 0x3b, 0xca, 0x7a, 0x13, 0x8c, 0x78, 0xad, 0x4c, 0xf0, 0x95, 0x6c, 0xe3, 0x9d, 0x0c, 0xaf, - 0x1f, 0x54, 0xa5, 0x32, 0xce, 0xd8, 0xd8, 0xc3, 0x4b, 0x03, 0x2a, 0x1a, 0x2e, 0xfb, 0xa9, 0x69, - 0xa8, 0x2e, 0x87, 0xe1, 0x54, 0x17, 0x4f, 0xf8, 0x34, 0x1e, 0xb6, 0x0a, 0xf1, 0xe1, 0x2b, 0x80, - 0x0e, 0xb2, 0x51, 0xc6, 0x86, 0x05, 0x1d, 0x64, 0x69, 0xa3, 0x5c, 0x5e, 0x83, 0x8e, 0x85, 0xbd, - 0x6b, 0xe5, 0x76, 0x59, 0x8e, 0x78, 0xce, 0xe5, 0x2b, 0x12, 0x8b, 0x96, 0xef, 0x9a, 0x78, 0x04, - 0xb8, 0x36, 0x9e, 0x73, 0xc5, 0x19, 0x16, 0x6b, 0x1b, 0x3d, 0x5d, 0x99, 0x1c, 0xb1, 0x68, 0x78, - 0x59, 0x60, 0xe8, 0x3d, 0xef, 0x58, 0xe0, 0x17, 0xcf, 0xb3, 0x98, 0xa9, 0x83, 0x9f, 0x91, 0x8c, - 0x7d, 0x72, 0x7a, 0x01, 0x4a, 0x63, 0xd0, 0xde, 0xd6, 0x7b, 0xa3, 0x8d, 0x9a, 0xb4, 0x81, 0x4f, - 0x32, 0xf9, 0xa6, 0xd1, 0xee, 0xb6, 0xf4, 0xbb, 0xe0, 0x55, 0xef, 0xf4, 0xa1, 0x49, 0x63, 0x42, - 0xec, 0x35, 0x7b, 0x94, 0xde, 0x28, 0xa1, 0x21, 0x17, 0xfb, 0x3a, 0x24, 0xf3, 0x2e, 0x4f, 0x70, - 0x84, 0xcd, 0xfd, 0x66, 0x0f, 0xd3, 0x1a, 0xdb, 0xc5, 0x12, 0xcb, 0xdd, 0xe2, 0x5a, 0xa4, 0x6f, - 0xb9, 0x86, 0x47, 0x76, 0xd6, 0x1e, 0xa2, 0x07, 0x39, 0x04, 0xe2, 0xe9, 0xf2, 0x46, 0x15, 0xa2, - 0x03, 0x61, 0xaa, 0xae, 0x95, 0x21, 0x36, 0xf0, 0x63, 0xeb, 0xc9, 0xaa, 0x2f, 0x34, 0xf7, 0xb0, - 0xac, 0xb3, 0xba, 0x4d, 0xdd, 0x24, 0x04, 0xdb, 0x4a, 0x52, 0x8b, 0xa4, 0x24, 0x35, 0xc9, 0xe2, - 0xe5, 0x76, 0xd7, 0x3c, 0x54, 0x75, 0x96, 0xb1, 0x8c, 0x56, 0x9a, 0xd0, 0x9f, 0x0a, 0x2c, 0xd9, - 0xb6, 0x76, 0x24, 0xd1, 0x9d, 0xe8, 0x3d, 0x78, 0xd7, 0xce, 0xfe, 0x0d, 0x77, 0x51, 0xd2, 0x53, - 0xc5, 0x56, 0x19, 0x44, 0x78, 0x19, 0xf0, 0x1a, 0x89, 0x62, 0x8d, 0xa8, 0x25, 0x96, 0xe4, 0xf2, - 0xae, 0x4f, 0x2d, 0x9c, 0x2b, 0x3d, 0x7e, 0xf4, 0xbc, 0x4f, 0x40, 0x3e, 0x50, 0xf6, 0x58, 0x83, - 0x54, 0xb7, 0xea, 0x73, 0x31, 0x96, 0xb2, 0xb7, 0x0e, 0xbc, 0x04, 0x17, 0x63, 0xc4, 0xb0, 0x65, - 0xf4, 0x24, 0x4b, 0x5a, 0xf2, 0xcb, 0x6a, 0x18, 0x28, 0x9e, 0xed, 0x41, 0xb8, 0x20, 0xa2, 0x8e, - 0x64, 0x3e, 0xcd, 0xd2, 0x8e, 0xbc, 0xa2, 0xc2, 0xb7, 0x84, 0xb2, 0x3b, 0x0e, 0xe6, 0x71, 0x57, - 0x1e, 0x9f, 0x86, 0x1b, 0xcb, 0x12, 0x50, 0xf4, 0x01, 0xc0, 0x16, 0xc5, 0xce, 0x38, 0x98, 0x27, - 0x3d, 0x52, 0xf8, 0x0c, 0x4e, 0x4a, 0x22, 0x89, 0x6a, 0xc6, 0x15, 0xc0, 0x79, 0x24, 0x70, 0x61, - 0x44, 0x79, 0xee, 0xca, 0x5e, 0x15, 0x11, 0x1e, 0x17, 0xa8, 0x9a, 0xd1, 0x62, 0x37, 0x8f, 0x6e, - 0x49, 0xec, 0x52, 0x19, 0x79, 0x14, 0xee, 0x29, 0x62, 0xf3, 0x05, 0x66, 0x5d, 0x59, 0xeb, 0x0c, - 0xd3, 0xf5, 0xe8, 0x68, 0xd9, 0x47, 0x31, 0x7c, 0x98, 0x3f, 0x70, 0x3d, 0x62, 0xfd, 0xe7, 0xdd, - 0x83, 0xb5, 0x43, 0xcc, 0xcb, 0x5f, 0xe3, 0x15, 0x07, 0x41, 0x04, 0xc2, 0x7a, 0xb3, 0xb3, 0x07, - 0x97, 0x27, 0x6e, 0x27, 0x0a, 0x3f, 0xf9, 0x21, 0xac, 0xe1, 0xa0, 0x4c, 0x83, 0xb1, 0x47, 0x70, - 0x54, 0x01, 0xc1, 0x50, 0x5b, 0xab, 0x77, 0xe0, 0x3a, 0x24, 0xcb, 0x4e, 0xbd, 0x03, 0x7b, 0x8b, - 0xf6, 0x07, 0xdb, 0x79, 0x25, 0xf8, 0xe9, 0x64, 0x73, 0xb0, 0xed, 0x1c, 0xa9, 0xc2, 0x52, 0x90, - 0x0a, 0xb5, 0x2f, 0xea, 0x3d, 0x23, 0x3f, 0x49, 0xfb, 0x3f, 0x71, 0xcc, 0x1e, 0x00, 0xd7, 0x6a, - 0xc6, 0xeb, 0x29, 0xcb, 0xa4, 0x0e, 0xef, 0xfd, 0x9a, 0x74, 0x55, 0x5d, 0x65, 0x59, 0x5b, 0x49, - 0x51, 0xc5, 0x5c, 0xc1, 0x64, 0x04, 0x9f, 0x94, 0xd3, 0xe3, 0xc5, 0x7b, 0xdc, 0xd5, 0x78, 0xcd, - 0xf8, 0xf6, 0x55, 0x39, 0xb0, 0x00, 0x49, 0xfd, 0xa6, 0x04, 0xb5, 0x04, 0x0d, 0xc5, 0x36, 0xc6, - 0xe4, 0xde, 0x86, 0x44, 0xec, 0x93, 0x3f, 0x7c, 0x2f, 0x67, 0xe9, 0x4f, 0x5b, 0xa0, 0x46, 0x9c, - 0xc7, 0x01, 0xd4, 0x04, 0x1c, 0x44, 0x9f, 0xd7, 0x36, 0x64, 0x48, 0x06, 0xff, 0xb2, 0xcd, 0x62, - 0xce, 0xf3, 0xe0, 0x2c, 0x1b, 0xa3, 0xf3, 0x72, 0xa0, 0xa4, 0xf3, 0x28, 0xc8, 0xb1, 0x24, 0xaf, - 0x96, 0x3e, 0x7d, 0xb3, 0x4a, 0x63, 0xff, 0x20, 0xf1, 0xc3, 0x2f, 0x87, 0xa4, 0xfa, 0xff, 0x2c, - 0x45, 0x1d, 0x15, 0xee, 0x7f, 0xe5, 0x7e, 0x26, 0x35, 0xf2, 0x3a, 0x35, 0xec, 0x93, 0x1e, 0xa9, - 0x63, 0xc1, 0x85, 0xa5, 0xa9, 0x71, 0x26, 0x2d, 0xa1, 0x38, 0xb9, 0xcb, 0x8b, 0x45, 0xad, 0x58, - 0x64, 0xb8, 0xdc, 0x45, 0x64, 0x80, 0x81, 0x7c, 0xd6, 0x4f, 0xc6, 0x9f, 0x87, 0xfc, 0x6b, 0x1c, - 0x0a, 0x20, 0xca, 0x7c, 0x58, 0xe7, 0xba, 0x01, 0x5b, 0x41, 0x6c, 0x8f, 0xae, 0x47, 0x49, 0xfd, - 0x20, 0xca, 0xc6, 0xad, 0x1e, 0xf1, 0x64, 0xd3, 0xdc, 0x5f, 0xad, 0x77, 0x95, 0xc7, 0x58, 0x16, - 0x5b, 0x45, 0xad, 0x5d, 0xef, 0x76, 0x31, 0xf7, 0x25, 0xba, 0xbb, 0x1e, 0x1a, 0x6a, 0x35, 0x96, - 0x7d, 0x61, 0x0d, 0x8c, 0x57, 0xb9, 0x6d, 0xb9, 0x63, 0xf6, 0x0e, 0x95, 0x4f, 0xb0, 0x4c, 0xbb, - 0xdf, 0x70, 0xf8, 0x11, 0xe2, 0x5f, 0x0a, 0xe5, 0xaf, 0xf6, 0x1b, 0x3e, 0x3a, 0xcc, 0x8f, 0xcd, - 0xc6, 0xe1, 0x47, 0x8f, 0x98, 0x1f, 0xcb, 0xcf, 0xe7, 0x40, 0x03, 0xc1, 0x0a, 0x89, 0x6b, 0x1a, - 0xa8, 0x03, 0xe9, 0x20, 0x33, 0xc5, 0x8b, 0xa1, 0x74, 0xa8, 0xf0, 0x2d, 0x03, 0xfe, 0x43, 0xdc, - 0xa9, 0x22, 0x93, 0x87, 0xf6, 0xe3, 0x11, 0x2f, 0x71, 0xbf, 0x78, 0x49, 0x6b, 0x91, 0x6b, 0xd2, - 0xd4, 0xa7, 0x58, 0x2e, 0xb8, 0x07, 0x0f, 0x45, 0x01, 0xc5, 0xe0, 0xa1, 0x64, 0x8a, 0x67, 0x3c, - 0x5f, 0x69, 0xbd, 0xc7, 0x42, 0xbe, 0x60, 0xfe, 0xa1, 0xfd, 0x78, 0x9c, 0xa5, 0x02, 0xe2, 0x89, - 0x38, 0x8f, 0xb2, 0x31, 0xdf, 0x26, 0xbc, 0x84, 0xf4, 0x88, 0x05, 0xab, 0xef, 0x47, 0x59, 0xbc, - 0xda, 0xd1, 0x8d, 0x3d, 0xd0, 0x01, 0xbe, 0xb6, 0xfd, 0xf8, 0x09, 0x10, 0x0b, 0xfe, 0x96, 0xed, - 0x19, 0xb2, 0x1b, 0x36, 0x0c, 0x4d, 0x0e, 0xb5, 0x6b, 0xdf, 0xa0, 0xdd, 0xab, 0x61, 0x50, 0x09, - 0x36, 0x6a, 0xef, 0x98, 0xdd, 0xa4, 0xed, 0x49, 0x3c, 0x0d, 0xda, 0x36, 0xf3, 0xb6, 0x66, 0x7b, - 0xcc, 0xdb, 0x94, 0x6d, 0xaa, 0xa7, 0x09, 0x3b, 0x66, 0x9e, 0xee, 0xeb, 0x1d, 0xb3, 0x5b, 0x2f, - 0x8c, 0x5d, 0x09, 0xf4, 0xdd, 0x70, 0xdd, 0x05, 0xc6, 0x97, 0x71, 0x7f, 0xb6, 0xa4, 0xc8, 0x09, - 0xbe, 0x3a, 0x93, 0x6d, 0x72, 0xcf, 0x92, 0xd5, 0x32, 0x55, 0xad, 0xe7, 0xd4, 0x29, 0xf4, 0x85, - 0x4a, 0x8d, 0xaa, 0x17, 0x6c, 0xcf, 0x41, 0x7d, 0xd6, 0x56, 0xea, 0xbd, 0x06, 0x18, 0xd4, 0xe0, - 0xb9, 0xe1, 0x3c, 0x30, 0x30, 0xf8, 0x39, 0xfb, 0xf8, 0x76, 0x69, 0x40, 0x9a, 0x3a, 0x89, 0xbb, - 0xe5, 0x32, 0x8d, 0xca, 0x1d, 0xbb, 0x7a, 0x7c, 0x11, 0x24, 0xc3, 0xa0, 0x03, 0x82, 0x66, 0x31, - 0xcd, 0x92, 0xa6, 0xd1, 0x6b, 0xd7, 0x4d, 0x43, 0xfd, 0x2e, 0xbc, 0xe3, 0x40, 0xf0, 0xb4, 0x01, - 0xb8, 0x43, 0x97, 0x71, 0xa6, 0x5d, 0x3f, 0x80, 0xba, 0xd2, 0x6b, 0x3b, 0x3d, 0x3b, 0x9d, 0x64, - 0x5b, 0x38, 0xd1, 0x81, 0xe1, 0x84, 0xe3, 0x96, 0x52, 0x48, 0x58, 0xd1, 0x1d, 0xb7, 0xd4, 0x5b, - 0xd2, 0x0a, 0x2d, 0x30, 0x4c, 0xbd, 0xdd, 0xad, 0xed, 0xd0, 0x39, 0xe1, 0x99, 0x5c, 0x62, 0x51, - 0x68, 0xe0, 0x74, 0x44, 0x47, 0x44, 0x70, 0x9a, 0x45, 0xa1, 0x33, 0xd0, 0xc1, 0x65, 0x8a, 0x13, - 0x9e, 0x6b, 0x87, 0x37, 0xd1, 0xc7, 0x4f, 0x38, 0xfb, 0xb8, 0x9c, 0x63, 0xd1, 0x4a, 0xb5, 0x8a, - 0x77, 0x0a, 0xfc, 0x6f, 0x56, 0x96, 0xb4, 0x07, 0x59, 0xaa, 0xd1, 0xd3, 0x75, 0x2c, 0x97, 0xd1, - 0x22, 0xef, 0x19, 0xec, 0xc0, 0xda, 0x2d, 0x96, 0xdc, 0xe1, 0x22, 0x4f, 0x09, 0x51, 0xe6, 0xf9, - 0xef, 0xf1, 0xe7, 0xd3, 0x94, 0x0b, 0x07, 0x65, 0xa1, 0x56, 0x01, 0xc9, 0x5c, 0x3b, 0xca, 0xcf, - 0xf3, 0xbc, 0x33, 0x8a, 0xfc, 0x94, 0xd8, 0x44, 0xc7, 0xb0, 0xbf, 0x5f, 0xd5, 0x76, 0x29, 0x97, - 0x95, 0xb3, 0xc3, 0x97, 0xbb, 0xed, 0x52, 0x27, 0x05, 0x32, 0xc7, 0x64, 0x0f, 0x8b, 0x54, 0xba, - 0x88, 0xb4, 0x47, 0xf7, 0xba, 0x9f, 0x44, 0xa9, 0x2f, 0x22, 0x35, 0x48, 0x8f, 0x0d, 0x91, 0x40, - 0x8b, 0x08, 0x48, 0xfb, 0x74, 0x87, 0xfb, 0x37, 0x35, 0x38, 0x72, 0xaa, 0x26, 0xe9, 0xb3, 0x61, - 0x96, 0x78, 0xae, 0x67, 0x48, 0xbd, 0xf9, 0x59, 0xfd, 0x23, 0xe7, 0x3a, 0x20, 0xa9, 0x35, 0xcc, - 0x12, 0xcf, 0xd5, 0x22, 0x25, 0x36, 0xcf, 0x14, 0x6f, 0xd8, 0x79, 0x77, 0x13, 0xd1, 0xda, 0xa4, - 0x53, 0x47, 0xd0, 0xc4, 0xb3, 0x75, 0x48, 0xc6, 0x2e, 0xb0, 0x49, 0xef, 0x1a, 0x8f, 0x31, 0x9d, - 0x01, 0xbc, 0xdc, 0x48, 0x9e, 0x78, 0xbe, 0x2e, 0xf0, 0x64, 0xad, 0xc8, 0x72, 0x1e, 0x1e, 0x4a, - 0x22, 0x11, 0xe7, 0x0e, 0xa9, 0xf8, 0x40, 0x1c, 0xa9, 0x4a, 0x45, 0xac, 0x1e, 0x5d, 0x31, 0xfe, - 0xa4, 0xa2, 0x87, 0x83, 0x88, 0xd4, 0xa7, 0x8b, 0xec, 0x69, 0xdf, 0xf2, 0x74, 0x14, 0x86, 0x02, - 0x8e, 0x49, 0xbd, 0xe6, 0x62, 0xa8, 0x41, 0xc1, 0xfb, 0x26, 0xd3, 0x34, 0x36, 0x7e, 0xfc, 0x12, - 0x7c, 0x5e, 0xe2, 0xaf, 0x80, 0xb9, 0x02, 0x3e, 0x10, 0xb4, 0xab, 0x6c, 0xec, 0xd8, 0x85, 0xf8, - 0x82, 0xc4, 0x65, 0x37, 0x52, 0x21, 0x2d, 0xc6, 0x8e, 0x5d, 0x8c, 0x2f, 0x4a, 0xfc, 0x75, 0x54, - 0x2a, 0x06, 0x68, 0xe2, 0x83, 0x7d, 0x89, 0x6b, 0xea, 0x48, 0x69, 0x0e, 0xb2, 0x62, 0xfc, 0xf8, - 0x05, 0xf9, 0xb2, 0x44, 0x15, 0x19, 0x29, 0x95, 0x82, 0x3c, 0xf1, 0x7c, 0xaf, 0x48, 0x54, 0x93, - 0x91, 0xd2, 0xbc, 0x97, 0x77, 0x74, 0x51, 0xbe, 0x2a, 0x51, 0x55, 0x46, 0x4a, 0x0b, 0x41, 0x9e, - 0x78, 0xbe, 0xd7, 0x48, 0x3f, 0x01, 0xef, 0x2a, 0x1c, 0x43, 0xee, 0x63, 0x14, 0xe6, 0xeb, 0x12, - 0x55, 0x66, 0xa4, 0x74, 0x6d, 0x88, 0x28, 0x9e, 0xf1, 0x0d, 0x89, 0x6a, 0x33, 0x52, 0xba, 0xae, - 0x5d, 0x63, 0xf2, 0xc7, 0x29, 0xce, 0x37, 0x25, 0xaa, 0xce, 0xc8, 0xfc, 0xcc, 0x30, 0x53, 0x3c, - 0xe7, 0x5b, 0x12, 0xd5, 0x67, 0x64, 0x7e, 0x16, 0xa2, 0x93, 0x3d, 0x6e, 0x81, 0xbe, 0xed, 0x79, - 0x67, 0x6b, 0x37, 0x3c, 0x51, 0x3d, 0xb2, 0x48, 0xdf, 0x21, 0x5d, 0xa8, 0x8d, 0x3d, 0xce, 0x1f, - 0xb3, 0x9c, 0xa0, 0x3d, 0xe6, 0xe6, 0xdd, 0x91, 0x15, 0xfb, 0xae, 0x44, 0x25, 0x9b, 0xb5, 0x3c, - 0x90, 0xbd, 0xf6, 0x39, 0x77, 0xed, 0x47, 0x55, 0xef, 0x7b, 0xd2, 0xc7, 0x2a, 0x5f, 0xfc, 0x8c, - 0x02, 0xa1, 0x89, 0xdd, 0x2d, 0xce, 0xcc, 0x7a, 0x2f, 0x63, 0xef, 0x17, 0x14, 0x5e, 0xb6, 0x99, - 0x62, 0xce, 0xf3, 0xe9, 0x08, 0x3f, 0xa1, 0x58, 0xbc, 0x62, 0x28, 0xef, 0x05, 0x21, 0x6f, 0x2e, - 0x94, 0xf7, 0xa2, 0x90, 0x57, 0x0a, 0xe5, 0xbd, 0x24, 0xe4, 0xcd, 0x87, 0xf2, 0x5e, 0x16, 0xf2, - 0x16, 0x42, 0x79, 0xaf, 0x08, 0x79, 0x57, 0x43, 0x79, 0xaf, 0x0a, 0x79, 0xd7, 0x42, 0x79, 0xaf, - 0x09, 0x79, 0xd7, 0x43, 0x79, 0xaf, 0x8b, 0x78, 0xb3, 0x33, 0xa1, 0xbc, 0x37, 0x84, 0xbc, 0xf0, - 0x7c, 0x79, 0x53, 0xc8, 0x0b, 0xcf, 0x97, 0xb7, 0x84, 0xbc, 0xf0, 0x7c, 0x79, 0x5b, 0xc8, 0x0b, - 0xcf, 0x97, 0x77, 0x84, 0xbc, 0xf0, 0x7c, 0x79, 0x57, 0xc8, 0x0b, 0xcf, 0x97, 0xf7, 0x84, 0xbc, - 0xf0, 0x7c, 0xf9, 0xbe, 0x90, 0x17, 0x9e, 0x2f, 0x3f, 0x10, 0xf2, 0xc2, 0xf3, 0xe5, 0x87, 0x22, - 0x5e, 0x31, 0x3c, 0x5f, 0x7e, 0x24, 0xe4, 0x85, 0xe7, 0xcb, 0x8f, 0x85, 0xbc, 0xf0, 0x7c, 0xf9, - 0x89, 0x90, 0x17, 0x9e, 0x2f, 0x3f, 0x15, 0xf2, 0xc2, 0xf3, 0xe5, 0x67, 0x42, 0x5e, 0x78, 0xbe, - 0xfc, 0x5c, 0xc8, 0x0b, 0xcf, 0x97, 0x5f, 0x08, 0x79, 0xe1, 0xf9, 0xf2, 0x4b, 0x21, 0x2f, 0x3c, - 0x5f, 0xde, 0x17, 0xf2, 0xc2, 0xf3, 0xe5, 0x57, 0x22, 0xde, 0x5c, 0x78, 0xbe, 0xfc, 0x5a, 0xc8, - 0x0b, 0xcf, 0x97, 0xdf, 0x08, 0x79, 0xe1, 0xf9, 0xf2, 0x5b, 0x21, 0x2f, 0x3c, 0x5f, 0x7e, 0x27, - 0xe4, 0x85, 0xe7, 0xcb, 0xef, 0x85, 0xbc, 0xf0, 0x7c, 0xf9, 0x83, 0x90, 0x17, 0x9e, 0x2f, 0x7f, - 0x14, 0xf2, 0xc2, 0xf3, 0xe5, 0x4f, 0x42, 0x5e, 0x78, 0xbe, 0xfc, 0x59, 0xc8, 0x0b, 0xcf, 0x97, - 0xbf, 0x88, 0x78, 0xa5, 0xf0, 0x7c, 0xf9, 0xab, 0x90, 0x17, 0x9e, 0x2f, 0x7f, 0x13, 0xf2, 0xc2, - 0xf3, 0xe5, 0x03, 0x21, 0x2f, 0x3c, 0x5f, 0xfe, 0x2e, 0xe4, 0x85, 0xe7, 0xcb, 0x3f, 0x84, 0xbc, - 0xf0, 0x7c, 0xf9, 0xa7, 0x90, 0x17, 0x9e, 0x2f, 0x1f, 0x0a, 0x79, 0xe1, 0xf9, 0xf2, 0x91, 0x90, - 0x17, 0x9e, 0x2f, 0xff, 0x12, 0xf2, 0xc2, 0xf3, 0xe5, 0xdf, 0x22, 0xde, 0x7c, 0x78, 0xbe, 0xfc, - 0x67, 0x34, 0xef, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xa4, 0xcf, 0x8d, 0xf9, 0x2b, 0x00, - 0x00, -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.proto b/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.proto deleted file mode 100644 index 698c8ce24..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/testdata/test.proto +++ /dev/null @@ -1,535 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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. - -// A feature-rich test file for the protocol compiler and libraries. - -syntax = "proto2"; - -package testdata; - -enum FOO { FOO1 = 1; }; - -message GoEnum { - required FOO foo = 1; -} - -message GoTestField { - required string Label = 1; - required string Type = 2; -} - -message GoTest { - // An enum, for completeness. - enum KIND { - VOID = 0; - - // Basic types - BOOL = 1; - BYTES = 2; - FINGERPRINT = 3; - FLOAT = 4; - INT = 5; - STRING = 6; - TIME = 7; - - // Groupings - TUPLE = 8; - ARRAY = 9; - MAP = 10; - - // Table types - TABLE = 11; - - // Functions - FUNCTION = 12; // last tag - }; - - // Some typical parameters - required KIND Kind = 1; - optional string Table = 2; - optional int32 Param = 3; - - // Required, repeated and optional foreign fields. - required GoTestField RequiredField = 4; - repeated GoTestField RepeatedField = 5; - optional GoTestField OptionalField = 6; - - // Required fields of all basic types - required bool F_Bool_required = 10; - required int32 F_Int32_required = 11; - required int64 F_Int64_required = 12; - required fixed32 F_Fixed32_required = 13; - required fixed64 F_Fixed64_required = 14; - required uint32 F_Uint32_required = 15; - required uint64 F_Uint64_required = 16; - required float F_Float_required = 17; - required double F_Double_required = 18; - required string F_String_required = 19; - required bytes F_Bytes_required = 101; - required sint32 F_Sint32_required = 102; - required sint64 F_Sint64_required = 103; - - // Repeated fields of all basic types - repeated bool F_Bool_repeated = 20; - repeated int32 F_Int32_repeated = 21; - repeated int64 F_Int64_repeated = 22; - repeated fixed32 F_Fixed32_repeated = 23; - repeated fixed64 F_Fixed64_repeated = 24; - repeated uint32 F_Uint32_repeated = 25; - repeated uint64 F_Uint64_repeated = 26; - repeated float F_Float_repeated = 27; - repeated double F_Double_repeated = 28; - repeated string F_String_repeated = 29; - repeated bytes F_Bytes_repeated = 201; - repeated sint32 F_Sint32_repeated = 202; - repeated sint64 F_Sint64_repeated = 203; - - // Optional fields of all basic types - optional bool F_Bool_optional = 30; - optional int32 F_Int32_optional = 31; - optional int64 F_Int64_optional = 32; - optional fixed32 F_Fixed32_optional = 33; - optional fixed64 F_Fixed64_optional = 34; - optional uint32 F_Uint32_optional = 35; - optional uint64 F_Uint64_optional = 36; - optional float F_Float_optional = 37; - optional double F_Double_optional = 38; - optional string F_String_optional = 39; - optional bytes F_Bytes_optional = 301; - optional sint32 F_Sint32_optional = 302; - optional sint64 F_Sint64_optional = 303; - - // Default-valued fields of all basic types - optional bool F_Bool_defaulted = 40 [default=true]; - optional int32 F_Int32_defaulted = 41 [default=32]; - optional int64 F_Int64_defaulted = 42 [default=64]; - optional fixed32 F_Fixed32_defaulted = 43 [default=320]; - optional fixed64 F_Fixed64_defaulted = 44 [default=640]; - optional uint32 F_Uint32_defaulted = 45 [default=3200]; - optional uint64 F_Uint64_defaulted = 46 [default=6400]; - optional float F_Float_defaulted = 47 [default=314159.]; - optional double F_Double_defaulted = 48 [default=271828.]; - optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; - optional sint32 F_Sint32_defaulted = 402 [default = -32]; - optional sint64 F_Sint64_defaulted = 403 [default = -64]; - - // Packed repeated fields (no string or bytes). - repeated bool F_Bool_repeated_packed = 50 [packed=true]; - repeated int32 F_Int32_repeated_packed = 51 [packed=true]; - repeated int64 F_Int64_repeated_packed = 52 [packed=true]; - repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; - repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; - repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; - repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; - repeated float F_Float_repeated_packed = 57 [packed=true]; - repeated double F_Double_repeated_packed = 58 [packed=true]; - repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; - repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; - - // Required, repeated, and optional groups. - required group RequiredGroup = 70 { - required string RequiredField = 71; - }; - - repeated group RepeatedGroup = 80 { - required string RequiredField = 81; - }; - - optional group OptionalGroup = 90 { - required string RequiredField = 91; - }; -} - -// For testing skipping of unrecognized fields. -// Numbers are all big, larger than tag numbers in GoTestField, -// the message used in the corresponding test. -message GoSkipTest { - required int32 skip_int32 = 11; - required fixed32 skip_fixed32 = 12; - required fixed64 skip_fixed64 = 13; - required string skip_string = 14; - required group SkipGroup = 15 { - required int32 group_int32 = 16; - required string group_string = 17; - } -} - -// For testing packed/non-packed decoder switching. -// A serialized instance of one should be deserializable as the other. -message NonPackedTest { - repeated int32 a = 1; -} - -message PackedTest { - repeated int32 b = 1 [packed=true]; -} - -message MaxTag { - // Maximum possible tag number. - optional string last_field = 536870911; -} - -message OldMessage { - message Nested { - optional string name = 1; - } - optional Nested nested = 1; - - optional int32 num = 2; -} - -// NewMessage is wire compatible with OldMessage; -// imagine it as a future version. -message NewMessage { - message Nested { - optional string name = 1; - optional string food_group = 2; - } - optional Nested nested = 1; - - // This is an int32 in OldMessage. - optional int64 num = 2; -} - -// Smaller tests for ASCII formatting. - -message InnerMessage { - required string host = 1; - optional int32 port = 2 [default=4000]; - optional bool connected = 3; -} - -message OtherMessage { - optional int64 key = 1; - optional bytes value = 2; - optional float weight = 3; - optional InnerMessage inner = 4; - - extensions 100 to max; -} - -message MyMessage { - required int32 count = 1; - optional string name = 2; - optional string quote = 3; - repeated string pet = 4; - optional InnerMessage inner = 5; - repeated OtherMessage others = 6; - repeated InnerMessage rep_inner = 12; - - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - }; - optional Color bikeshed = 7; - - optional group SomeGroup = 8 { - optional int32 group_field = 9; - } - - // This field becomes [][]byte in the generated code. - repeated bytes rep_bytes = 10; - - optional double bigfloat = 11; - - extensions 100 to max; -} - -message Ext { - extend MyMessage { - optional Ext more = 103; - optional string text = 104; - optional int32 number = 105; - } - - optional string data = 1; -} - -extend MyMessage { - repeated string greeting = 106; -} - -message ComplexExtension { - optional int32 first = 1; - optional int32 second = 2; - repeated int32 third = 3; -} - -extend OtherMessage { - optional ComplexExtension complex = 200; - repeated ComplexExtension r_complex = 201; -} - -message DefaultsMessage { - enum DefaultsEnum { - ZERO = 0; - ONE = 1; - TWO = 2; - }; - extensions 100 to max; -} - -extend DefaultsMessage { - optional double no_default_double = 101; - optional float no_default_float = 102; - optional int32 no_default_int32 = 103; - optional int64 no_default_int64 = 104; - optional uint32 no_default_uint32 = 105; - optional uint64 no_default_uint64 = 106; - optional sint32 no_default_sint32 = 107; - optional sint64 no_default_sint64 = 108; - optional fixed32 no_default_fixed32 = 109; - optional fixed64 no_default_fixed64 = 110; - optional sfixed32 no_default_sfixed32 = 111; - optional sfixed64 no_default_sfixed64 = 112; - optional bool no_default_bool = 113; - optional string no_default_string = 114; - optional bytes no_default_bytes = 115; - optional DefaultsMessage.DefaultsEnum no_default_enum = 116; - - optional double default_double = 201 [default = 3.1415]; - optional float default_float = 202 [default = 3.14]; - optional int32 default_int32 = 203 [default = 42]; - optional int64 default_int64 = 204 [default = 43]; - optional uint32 default_uint32 = 205 [default = 44]; - optional uint64 default_uint64 = 206 [default = 45]; - optional sint32 default_sint32 = 207 [default = 46]; - optional sint64 default_sint64 = 208 [default = 47]; - optional fixed32 default_fixed32 = 209 [default = 48]; - optional fixed64 default_fixed64 = 210 [default = 49]; - optional sfixed32 default_sfixed32 = 211 [default = 50]; - optional sfixed64 default_sfixed64 = 212 [default = 51]; - optional bool default_bool = 213 [default = true]; - optional string default_string = 214 [default = "Hello, string"]; - optional bytes default_bytes = 215 [default = "Hello, bytes"]; - optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; -} - -message MyMessageSet { - option message_set_wire_format = true; - extensions 100 to max; -} - -message Empty { -} - -extend MyMessageSet { - optional Empty x201 = 201; - optional Empty x202 = 202; - optional Empty x203 = 203; - optional Empty x204 = 204; - optional Empty x205 = 205; - optional Empty x206 = 206; - optional Empty x207 = 207; - optional Empty x208 = 208; - optional Empty x209 = 209; - optional Empty x210 = 210; - optional Empty x211 = 211; - optional Empty x212 = 212; - optional Empty x213 = 213; - optional Empty x214 = 214; - optional Empty x215 = 215; - optional Empty x216 = 216; - optional Empty x217 = 217; - optional Empty x218 = 218; - optional Empty x219 = 219; - optional Empty x220 = 220; - optional Empty x221 = 221; - optional Empty x222 = 222; - optional Empty x223 = 223; - optional Empty x224 = 224; - optional Empty x225 = 225; - optional Empty x226 = 226; - optional Empty x227 = 227; - optional Empty x228 = 228; - optional Empty x229 = 229; - optional Empty x230 = 230; - optional Empty x231 = 231; - optional Empty x232 = 232; - optional Empty x233 = 233; - optional Empty x234 = 234; - optional Empty x235 = 235; - optional Empty x236 = 236; - optional Empty x237 = 237; - optional Empty x238 = 238; - optional Empty x239 = 239; - optional Empty x240 = 240; - optional Empty x241 = 241; - optional Empty x242 = 242; - optional Empty x243 = 243; - optional Empty x244 = 244; - optional Empty x245 = 245; - optional Empty x246 = 246; - optional Empty x247 = 247; - optional Empty x248 = 248; - optional Empty x249 = 249; - optional Empty x250 = 250; -} - -message MessageList { - repeated group Message = 1 { - required string name = 2; - required int32 count = 3; - } -} - -message Strings { - optional string string_field = 1; - optional bytes bytes_field = 2; -} - -message Defaults { - enum Color { - RED = 0; - GREEN = 1; - BLUE = 2; - } - - // Default-valued fields of all basic types. - // Same as GoTest, but copied here to make testing easier. - optional bool F_Bool = 1 [default=true]; - optional int32 F_Int32 = 2 [default=32]; - optional int64 F_Int64 = 3 [default=64]; - optional fixed32 F_Fixed32 = 4 [default=320]; - optional fixed64 F_Fixed64 = 5 [default=640]; - optional uint32 F_Uint32 = 6 [default=3200]; - optional uint64 F_Uint64 = 7 [default=6400]; - optional float F_Float = 8 [default=314159.]; - optional double F_Double = 9 [default=271828.]; - optional string F_String = 10 [default="hello, \"world!\"\n"]; - optional bytes F_Bytes = 11 [default="Bignose"]; - optional sint32 F_Sint32 = 12 [default=-32]; - optional sint64 F_Sint64 = 13 [default=-64]; - optional Color F_Enum = 14 [default=GREEN]; - - // More fields with crazy defaults. - optional float F_Pinf = 15 [default=inf]; - optional float F_Ninf = 16 [default=-inf]; - optional float F_Nan = 17 [default=nan]; - - // Sub-message. - optional SubDefaults sub = 18; - - // Redundant but explicit defaults. - optional string str_zero = 19 [default=""]; -} - -message SubDefaults { - optional int64 n = 1 [default=7]; -} - -message RepeatedEnum { - enum Color { - RED = 1; - } - repeated Color color = 1; -} - -message MoreRepeated { - repeated bool bools = 1; - repeated bool bools_packed = 2 [packed=true]; - repeated int32 ints = 3; - repeated int32 ints_packed = 4 [packed=true]; - repeated int64 int64s_packed = 7 [packed=true]; - repeated string strings = 5; - repeated fixed32 fixeds = 6; -} - -// GroupOld and GroupNew have the same wire format. -// GroupNew has a new field inside a group. - -message GroupOld { - optional group G = 101 { - optional int32 x = 2; - } -} - -message GroupNew { - optional group G = 101 { - optional int32 x = 2; - optional int32 y = 3; - } -} - -message FloatingPoint { - required double f = 1; -} - -message MessageWithMap { - map name_mapping = 1; - map msg_mapping = 2; - map byte_mapping = 3; - map str_to_str = 4; -} - -message Oneof { - oneof union { - bool F_Bool = 1; - int32 F_Int32 = 2; - int64 F_Int64 = 3; - fixed32 F_Fixed32 = 4; - fixed64 F_Fixed64 = 5; - uint32 F_Uint32 = 6; - uint64 F_Uint64 = 7; - float F_Float = 8; - double F_Double = 9; - string F_String = 10; - bytes F_Bytes = 11; - sint32 F_Sint32 = 12; - sint64 F_Sint64 = 13; - MyMessage.Color F_Enum = 14; - GoTestField F_Message = 15; - group F_Group = 16 { - optional int32 x = 17; - } - int32 F_Largest_Tag = 536870911; - } - - oneof tormato { - int32 value = 100; - } -} - -message Communique { - optional bool make_me_cry = 1; - - // This is a oneof, called "union". - oneof union { - int32 number = 5; - string name = 6; - bytes data = 7; - double temp_c = 8; - MyMessage.Color col = 9; - Strings msg = 10; - } -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_parser_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_parser_test.go deleted file mode 100644 index d2e4cca0c..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_parser_test.go +++ /dev/null @@ -1,557 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "math" - "reflect" - "testing" - - . "github.com/golang/protobuf/proto" - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - . "github.com/golang/protobuf/proto/testdata" -) - -type UnmarshalTextTest struct { - in string - err string // if "", no error expected - out *MyMessage -} - -func buildExtStructTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_More, &Ext{ - Data: String("Hello, world!"), - }) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtDataTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_Text, String("Hello, world!")) - SetExtension(msg, E_Ext_Number, Int32(1729)) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtRepStringTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { - panic(err) - } - return UnmarshalTextTest{in: text, out: msg} -} - -var unMarshalTextTests = []UnmarshalTextTest{ - // Basic - { - in: " count:42\n name:\"Dave\" ", - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - }, - }, - - // Empty quoted string - { - in: `count:42 name:""`, - out: &MyMessage{ - Count: Int32(42), - Name: String(""), - }, - }, - - // Quoted string concatenation with double quotes - { - in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string concatenation with single quotes - { - in: "count:42 name: 'My name is '\n'elsewhere'", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string concatenations with mixed quotes - { - in: "count:42 name: 'My name is '\n\"elsewhere\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - { - in: "count:42 name: \"My name is \"\n'elsewhere'", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string with escaped apostrophe - { - in: `count:42 name: "HOLIDAY - New Year\'s Day"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("HOLIDAY - New Year's Day"), - }, - }, - - // Quoted string with single quote - { - in: `count:42 name: 'Roger "The Ramster" Ramjet'`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`Roger "The Ramster" Ramjet`), - }, - }, - - // Quoted string with all the accepted special characters from the C++ test - { - in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), - }, - }, - - // Quoted string with quoted backslash - { - in: `count:42 name: "\\'xyz"`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`\'xyz`), - }, - }, - - // Quoted string with UTF-8 bytes. - { - in: "count:42 name: '\303\277\302\201\xAB'", - out: &MyMessage{ - Count: Int32(42), - Name: String("\303\277\302\201\xAB"), - }, - }, - - // Bad quoted string - { - in: `inner: < host: "\0" >` + "\n", - err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, - }, - - // Number too large for int64 - { - in: "count: 1 others { key: 123456789012345678901 }", - err: "line 1.23: invalid int64: 123456789012345678901", - }, - - // Number too large for int32 - { - in: "count: 1234567890123", - err: "line 1.7: invalid int32: 1234567890123", - }, - - // Number in hexadecimal - { - in: "count: 0x2beef", - out: &MyMessage{ - Count: Int32(0x2beef), - }, - }, - - // Number in octal - { - in: "count: 024601", - out: &MyMessage{ - Count: Int32(024601), - }, - }, - - // Floating point number with "f" suffix - { - in: "count: 4 others:< weight: 17.0f >", - out: &MyMessage{ - Count: Int32(4), - Others: []*OtherMessage{ - { - Weight: Float32(17), - }, - }, - }, - }, - - // Floating point positive infinity - { - in: "count: 4 bigfloat: inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(1)), - }, - }, - - // Floating point negative infinity - { - in: "count: 4 bigfloat: -inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(-1)), - }, - }, - - // Number too large for float32 - { - in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", - err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", - }, - - // Number posing as a quoted string - { - in: `inner: < host: 12 >` + "\n", - err: `line 1.15: invalid string: 12`, - }, - - // Quoted string posing as int32 - { - in: `count: "12"`, - err: `line 1.7: invalid int32: "12"`, - }, - - // Quoted string posing a float32 - { - in: `others:< weight: "17.4" >`, - err: `line 1.17: invalid float32: "17.4"`, - }, - - // Enum - { - in: `count:42 bikeshed: BLUE`, - out: &MyMessage{ - Count: Int32(42), - Bikeshed: MyMessage_BLUE.Enum(), - }, - }, - - // Repeated field - { - in: `count:42 pet: "horsey" pet:"bunny"`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated field with list notation - { - in: `count:42 pet: ["horsey", "bunny"]`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated message with/without colon and <>/{} - { - in: `count:42 others:{} others{} others:<> others:{}`, - out: &MyMessage{ - Count: Int32(42), - Others: []*OtherMessage{ - {}, - {}, - {}, - {}, - }, - }, - }, - - // Missing colon for inner message - { - in: `count:42 inner < host: "cauchy.syd" >`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("cauchy.syd"), - }, - }, - }, - - // Missing colon for string field - { - in: `name "Dave"`, - err: `line 1.5: expected ':', found "\"Dave\""`, - }, - - // Missing colon for int32 field - { - in: `count 42`, - err: `line 1.6: expected ':', found "42"`, - }, - - // Missing required field - { - in: `name: "Pawel"`, - err: `proto: required field "testdata.MyMessage.count" not set`, - out: &MyMessage{ - Name: String("Pawel"), - }, - }, - - // Repeated non-repeated field - { - in: `name: "Rob" name: "Russ"`, - err: `line 1.12: non-repeated field "name" was repeated`, - }, - - // Group - { - in: `count: 17 SomeGroup { group_field: 12 }`, - out: &MyMessage{ - Count: Int32(17), - Somegroup: &MyMessage_SomeGroup{ - GroupField: Int32(12), - }, - }, - }, - - // Semicolon between fields - { - in: `count:3;name:"Calvin"`, - out: &MyMessage{ - Count: Int32(3), - Name: String("Calvin"), - }, - }, - // Comma between fields - { - in: `count:4,name:"Ezekiel"`, - out: &MyMessage{ - Count: Int32(4), - Name: String("Ezekiel"), - }, - }, - - // Extension - buildExtStructTest(`count: 42 [testdata.Ext.more]:`), - buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), - buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), - buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), - - // Big all-in-one - { - in: "count:42 # Meaning\n" + - `name:"Dave" ` + - `quote:"\"I didn't want to go.\"" ` + - `pet:"bunny" ` + - `pet:"kitty" ` + - `pet:"horsey" ` + - `inner:<` + - ` host:"footrest.syd" ` + - ` port:7001 ` + - ` connected:true ` + - `> ` + - `others:<` + - ` key:3735928559 ` + - ` value:"\x01A\a\f" ` + - `> ` + - `others:<` + - " weight:58.9 # Atomic weight of Co\n" + - ` inner:<` + - ` host:"lesha.mtv" ` + - ` port:8002 ` + - ` >` + - `>`, - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - Quote: String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &InnerMessage{ - Host: String("footrest.syd"), - Port: Int32(7001), - Connected: Bool(true), - }, - Others: []*OtherMessage{ - { - Key: Int64(3735928559), - Value: []byte{0x1, 'A', '\a', '\f'}, - }, - { - Weight: Float32(58.9), - Inner: &InnerMessage{ - Host: String("lesha.mtv"), - Port: Int32(8002), - }, - }, - }, - }, - }, -} - -func TestUnmarshalText(t *testing.T) { - for i, test := range unMarshalTextTests { - pb := new(MyMessage) - err := UnmarshalText(test.in, pb) - if test.err == "" { - // We don't expect failure. - if err != nil { - t.Errorf("Test %d: Unexpected error: %v", i, err) - } else if !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } else { - // We do expect failure. - if err == nil { - t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) - } else if err.Error() != test.err { - t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", - i, err.Error(), test.err) - } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } - } -} - -func TestUnmarshalTextCustomMessage(t *testing.T) { - msg := &textMessage{} - if err := UnmarshalText("custom", msg); err != nil { - t.Errorf("Unexpected error from custom unmarshal: %v", err) - } - if UnmarshalText("not custom", msg) == nil { - t.Errorf("Didn't get expected error from custom unmarshal") - } -} - -// Regression test; this caused a panic. -func TestRepeatedEnum(t *testing.T) { - pb := new(RepeatedEnum) - if err := UnmarshalText("color: RED", pb); err != nil { - t.Fatal(err) - } - exp := &RepeatedEnum{ - Color: []RepeatedEnum_Color{RepeatedEnum_RED}, - } - if !Equal(pb, exp) { - t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) - } -} - -func TestProto3TextParsing(t *testing.T) { - m := new(proto3pb.Message) - const in = `name: "Wallace" true_scotsman: true` - want := &proto3pb.Message{ - Name: "Wallace", - TrueScotsman: true, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestMapParsing(t *testing.T) { - m := new(MessageWithMap) - const in = `name_mapping: name_mapping:` + - `msg_mapping:,>` + // separating commas are okay - `msg_mapping>` + // no colon after "value" - `byte_mapping:` - want := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Beatles", - 1234: "Feist", - }, - MsgMapping: map[int64]*FloatingPoint{ - -4: {F: Float64(2.0)}, - -2: {F: Float64(4.0)}, - }, - ByteMapping: map[bool][]byte{ - true: []byte("so be it"), - }, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestOneofParsing(t *testing.T) { - const in = `name:"Shrek"` - m := new(Communique) - want := &Communique{Union: &Communique_Name{"Shrek"}} - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -var benchInput string - -func init() { - benchInput = "count: 4\n" - for i := 0; i < 1000; i++ { - benchInput += "pet: \"fido\"\n" - } - - // Check it is valid input. - pb := new(MyMessage) - err := UnmarshalText(benchInput, pb) - if err != nil { - panic("Bad benchmark input: " + err.Error()) - } -} - -func BenchmarkUnmarshalText(b *testing.B) { - pb := new(MyMessage) - for i := 0; i < b.N; i++ { - UnmarshalText(benchInput, pb) - } - b.SetBytes(int64(len(benchInput))) -} diff --git a/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_test.go b/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_test.go deleted file mode 100644 index 3eabacac8..000000000 --- a/Godeps/_workspace/src/github.com/golang/protobuf/proto/text_test.go +++ /dev/null @@ -1,474 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// 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 proto_test - -import ( - "bytes" - "errors" - "io/ioutil" - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -// textMessage implements the methods that allow it to marshal and unmarshal -// itself as text. -type textMessage struct { -} - -func (*textMessage) MarshalText() ([]byte, error) { - return []byte("custom"), nil -} - -func (*textMessage) UnmarshalText(bytes []byte) error { - if string(bytes) != "custom" { - return errors.New("expected 'custom'") - } - return nil -} - -func (*textMessage) Reset() {} -func (*textMessage) String() string { return "" } -func (*textMessage) ProtoMessage() {} - -func newTestMessage() *pb.MyMessage { - msg := &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Quote: proto.String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("footrest.syd"), - Port: proto.Int32(7001), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(0xdeadbeef), - Value: []byte{1, 65, 7, 12}, - }, - { - Weight: proto.Float32(6.022), - Inner: &pb.InnerMessage{ - Host: proto.String("lesha.mtv"), - Port: proto.Int32(8002), - }, - }, - }, - Bikeshed: pb.MyMessage_BLUE.Enum(), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(8), - }, - // One normally wouldn't do this. - // This is an undeclared tag 13, as a varint (wire type 0) with value 4. - XXX_unrecognized: []byte{13<<3 | 0, 4}, - } - ext := &pb.Ext{ - Data: proto.String("Big gobs for big rats"), - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { - panic(err) - } - greetings := []string{"adg", "easy", "cow"} - if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { - panic(err) - } - - // Add an unknown extension. We marshal a pb.Ext, and fake the ID. - b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) - if err != nil { - panic(err) - } - b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) - proto.SetRawExtension(msg, 201, b) - - // Extensions can be plain fields, too, so let's test that. - b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) - proto.SetRawExtension(msg, 202, b) - - return msg -} - -const text = `count: 42 -name: "Dave" -quote: "\"I didn't want to go.\"" -pet: "bunny" -pet: "kitty" -pet: "horsey" -inner: < - host: "footrest.syd" - port: 7001 - connected: true -> -others: < - key: 3735928559 - value: "\001A\007\014" -> -others: < - weight: 6.022 - inner: < - host: "lesha.mtv" - port: 8002 - > -> -bikeshed: BLUE -SomeGroup { - group_field: 8 -} -/* 2 unknown bytes */ -13: 4 -[testdata.Ext.more]: < - data: "Big gobs for big rats" -> -[testdata.greeting]: "adg" -[testdata.greeting]: "easy" -[testdata.greeting]: "cow" -/* 13 unknown bytes */ -201: "\t3G skiing" -/* 3 unknown bytes */ -202: 19 -` - -func TestMarshalText(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, newTestMessage()); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != text { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) - } -} - -func TestMarshalTextCustomMessage(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, &textMessage{}); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != "custom" { - t.Errorf("Got %q, expected %q", s, "custom") - } -} -func TestMarshalTextNil(t *testing.T) { - want := "" - tests := []proto.Message{nil, (*pb.MyMessage)(nil)} - for i, test := range tests { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, test); err != nil { - t.Fatal(err) - } - if got := buf.String(); got != want { - t.Errorf("%d: got %q want %q", i, got, want) - } - } -} - -func TestMarshalTextUnknownEnum(t *testing.T) { - // The Color enum only specifies values 0-2. - m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} - got := m.String() - const want = `bikeshed:3 ` - if got != want { - t.Errorf("\n got %q\nwant %q", got, want) - } -} - -func TestTextOneof(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&pb.Communique{}, ``}, - // scalar field - {&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, - // message field - {&pb.Communique{Union: &pb.Communique_Msg{ - &pb.Strings{StringField: proto.String("why hello!")}, - }}, `msg:`}, - // bad oneof (should not panic) - {&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} - -func BenchmarkMarshalTextBuffered(b *testing.B) { - buf := new(bytes.Buffer) - m := newTestMessage() - for i := 0; i < b.N; i++ { - buf.Reset() - proto.MarshalText(buf, m) - } -} - -func BenchmarkMarshalTextUnbuffered(b *testing.B) { - w := ioutil.Discard - m := newTestMessage() - for i := 0; i < b.N; i++ { - proto.MarshalText(w, m) - } -} - -func compact(src string) string { - // s/[ \n]+/ /g; s/ $//; - dst := make([]byte, len(src)) - space, comment := false, false - j := 0 - for i := 0; i < len(src); i++ { - if strings.HasPrefix(src[i:], "/*") { - comment = true - i++ - continue - } - if comment && strings.HasPrefix(src[i:], "*/") { - comment = false - i++ - continue - } - if comment { - continue - } - c := src[i] - if c == ' ' || c == '\n' { - space = true - continue - } - if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { - space = false - } - if c == '{' { - space = false - } - if space { - dst[j] = ' ' - j++ - space = false - } - dst[j] = c - j++ - } - if space { - dst[j] = ' ' - j++ - } - return string(dst[0:j]) -} - -var compactText = compact(text) - -func TestCompactText(t *testing.T) { - s := proto.CompactTextString(newTestMessage()) - if s != compactText { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) - } -} - -func TestStringEscaping(t *testing.T) { - testCases := []struct { - in *pb.Strings - out string - }{ - { - // Test data from C++ test (TextFormatTest.StringEscape). - // Single divergence: we don't escape apostrophes. - &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, - "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", - }, - { - // Test data from the same C++ test. - &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, - "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", - }, - { - // Some UTF-8. - &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, - `string_field: "\000\001\377\201"` + "\n", - }, - } - - for i, tc := range testCases { - var buf bytes.Buffer - if err := proto.MarshalText(&buf, tc.in); err != nil { - t.Errorf("proto.MarsalText: %v", err) - continue - } - s := buf.String() - if s != tc.out { - t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) - continue - } - - // Check round-trip. - pb := new(pb.Strings) - if err := proto.UnmarshalText(s, pb); err != nil { - t.Errorf("#%d: UnmarshalText: %v", i, err) - continue - } - if !proto.Equal(pb, tc.in) { - t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) - } - } -} - -// A limitedWriter accepts some output before it fails. -// This is a proxy for something like a nearly-full or imminently-failing disk, -// or a network connection that is about to die. -type limitedWriter struct { - b bytes.Buffer - limit int -} - -var outOfSpace = errors.New("proto: insufficient space") - -func (w *limitedWriter) Write(p []byte) (n int, err error) { - var avail = w.limit - w.b.Len() - if avail <= 0 { - return 0, outOfSpace - } - if len(p) <= avail { - return w.b.Write(p) - } - n, _ = w.b.Write(p[:avail]) - return n, outOfSpace -} - -func TestMarshalTextFailing(t *testing.T) { - // Try lots of different sizes to exercise more error code-paths. - for lim := 0; lim < len(text); lim++ { - buf := new(limitedWriter) - buf.limit = lim - err := proto.MarshalText(buf, newTestMessage()) - // We expect a certain error, but also some partial results in the buffer. - if err != outOfSpace { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) - } - s := buf.b.String() - x := text[:buf.limit] - if s != x { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) - } - } -} - -func TestFloats(t *testing.T) { - tests := []struct { - f float64 - want string - }{ - {0, "0"}, - {4.7, "4.7"}, - {math.Inf(1), "inf"}, - {math.Inf(-1), "-inf"}, - {math.NaN(), "nan"}, - } - for _, test := range tests { - msg := &pb.FloatingPoint{F: &test.f} - got := strings.TrimSpace(msg.String()) - want := `f:` + test.want - if got != want { - t.Errorf("f=%f: got %q, want %q", test.f, got, want) - } - } -} - -func TestRepeatedNilText(t *testing.T) { - m := &pb.MessageList{ - Message: []*pb.MessageList_Message{ - nil, - &pb.MessageList_Message{ - Name: proto.String("Horse"), - }, - nil, - }, - } - want := `Message -Message { - name: "Horse" -} -Message -` - if s := proto.MarshalTextString(m); s != want { - t.Errorf(" got: %s\nwant: %s", s, want) - } -} - -func TestProto3Text(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&proto3pb.Message{}, ``}, - // zero message except for an empty byte slice - {&proto3pb.Message{Data: []byte{}}, ``}, - // trivial case - {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, - // empty map - {&pb.MessageWithMap{}, ``}, - // non-empty map; map format is the same as a repeated struct, - // and they are sorted by key (numerically for numeric keys). - { - &pb.MessageWithMap{NameMapping: map[int32]string{ - -1: "Negatory", - 7: "Lucky", - 1234: "Feist", - 6345789: "Otis", - }}, - `name_mapping: ` + - `name_mapping: ` + - `name_mapping: ` + - `name_mapping:`, - }, - // map with nil value; not well-defined, but we shouldn't crash - { - &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, - `msg_mapping:`, - }, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/container_test.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/container_test.go deleted file mode 100644 index 58dc79e39..000000000 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/container_test.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 v1 - -import ( - "testing" - "time" -) - -func TestStatsStartTime(t *testing.T) { - N := 10 - stats := make([]*ContainerStats, 0, N) - ct := time.Now() - for i := 0; i < N; i++ { - s := &ContainerStats{ - Timestamp: ct.Add(time.Duration(i) * time.Second), - } - stats = append(stats, s) - } - cinfo := &ContainerInfo{ - ContainerReference: ContainerReference{ - Name: "/some/container", - }, - Stats: stats, - } - ref := ct.Add(time.Duration(N-1) * time.Second) - end := cinfo.StatsEndTime() - - if !ref.Equal(end) { - t.Errorf("end time is %v; should be %v", end, ref) - } -} - -func TestStatsEndTime(t *testing.T) { - N := 10 - stats := make([]*ContainerStats, 0, N) - ct := time.Now() - for i := 0; i < N; i++ { - s := &ContainerStats{ - Timestamp: ct.Add(time.Duration(i) * time.Second), - } - stats = append(stats, s) - } - cinfo := &ContainerInfo{ - ContainerReference: ContainerReference{ - Name: "/some/container", - }, - Stats: stats, - } - ref := ct - start := cinfo.StatsStartTime() - - if !ref.Equal(start) { - t.Errorf("start time is %v; should be %v", start, ref) - } -} - -func createStats(cpuUsage, memUsage uint64, timestamp time.Time) *ContainerStats { - stats := &ContainerStats{} - stats.Cpu.Usage.PerCpu = []uint64{cpuUsage} - stats.Cpu.Usage.Total = cpuUsage - stats.Cpu.Usage.System = 0 - stats.Cpu.Usage.User = cpuUsage - stats.Memory.Usage = memUsage - stats.Timestamp = timestamp - return stats -} diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/test/datagen.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/test/datagen.go deleted file mode 100644 index 42a0526d4..000000000 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/v1/test/datagen.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 test - -import ( - "fmt" - "math/rand" - "time" - - info "github.com/google/cadvisor/info/v1" -) - -func GenerateRandomStats(numStats, numCores int, duration time.Duration) []*info.ContainerStats { - ret := make([]*info.ContainerStats, numStats) - perCoreUsages := make([]uint64, numCores) - currentTime := time.Now() - for i := range perCoreUsages { - perCoreUsages[i] = uint64(rand.Int63n(1000)) - } - for i := 0; i < numStats; i++ { - stats := new(info.ContainerStats) - stats.Timestamp = currentTime - currentTime = currentTime.Add(duration) - - percore := make([]uint64, numCores) - for i := range perCoreUsages { - perCoreUsages[i] += uint64(rand.Int63n(1000)) - percore[i] = perCoreUsages[i] - stats.Cpu.Usage.Total += percore[i] - } - stats.Cpu.Usage.PerCpu = percore - stats.Cpu.Usage.User = stats.Cpu.Usage.Total - stats.Cpu.Usage.System = 0 - stats.Memory.Usage = uint64(rand.Int63n(4096)) - stats.Memory.Cache = uint64(rand.Int63n(4096)) - stats.Memory.RSS = uint64(rand.Int63n(4096)) - ret[i] = stats - } - return ret -} - -func GenerateRandomContainerSpec(numCores int) info.ContainerSpec { - ret := info.ContainerSpec{ - CreationTime: time.Now(), - HasCpu: true, - Cpu: info.CpuSpec{}, - HasMemory: true, - Memory: info.MemorySpec{}, - } - ret.Cpu.Limit = uint64(1000 + rand.Int63n(2000)) - ret.Cpu.MaxLimit = uint64(1000 + rand.Int63n(2000)) - ret.Cpu.Mask = fmt.Sprintf("0-%d", numCores-1) - ret.Memory.Limit = uint64(4096 + rand.Int63n(4096)) - return ret -} - -func GenerateRandomContainerInfo(containerName string, numCores int, query *info.ContainerInfoRequest, duration time.Duration) *info.ContainerInfo { - stats := GenerateRandomStats(query.NumStats, numCores, duration) - spec := GenerateRandomContainerSpec(numCores) - - ret := &info.ContainerInfo{ - ContainerReference: info.ContainerReference{ - Name: containerName, - }, - Spec: spec, - Stats: stats, - } - return ret -} diff --git a/Godeps/_workspace/src/github.com/google/gofuzz/example_test.go b/Godeps/_workspace/src/github.com/google/gofuzz/example_test.go deleted file mode 100644 index 792707a3a..000000000 --- a/Godeps/_workspace/src/github.com/google/gofuzz/example_test.go +++ /dev/null @@ -1,225 +0,0 @@ -/* -Copyright 2014 Google Inc. All rights reserved. - -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 fuzz_test - -import ( - "encoding/json" - "fmt" - "math/rand" - - "github.com/google/gofuzz" -) - -func ExampleSimple() { - type MyType struct { - A string - B string - C int - D struct { - E float64 - } - } - - f := fuzz.New() - object := MyType{} - - uniqueObjects := map[MyType]int{} - - for i := 0; i < 1000; i++ { - f.Fuzz(&object) - uniqueObjects[object]++ - } - fmt.Printf("Got %v unique objects.\n", len(uniqueObjects)) - // Output: - // Got 1000 unique objects. -} - -func ExampleCustom() { - type MyType struct { - A int - B string - } - - counter := 0 - f := fuzz.New().Funcs( - func(i *int, c fuzz.Continue) { - *i = counter - counter++ - }, - ) - object := MyType{} - - uniqueObjects := map[MyType]int{} - - for i := 0; i < 100; i++ { - f.Fuzz(&object) - if object.A != i { - fmt.Printf("Unexpected value: %#v\n", object) - } - uniqueObjects[object]++ - } - fmt.Printf("Got %v unique objects.\n", len(uniqueObjects)) - // Output: - // Got 100 unique objects. -} - -func ExampleComplex() { - type OtherType struct { - A string - B string - } - type MyType struct { - Pointer *OtherType - Map map[string]OtherType - PointerMap *map[string]OtherType - Slice []OtherType - SlicePointer []*OtherType - PointerSlicePointer *[]*OtherType - } - - f := fuzz.New().RandSource(rand.NewSource(0)).NilChance(0).NumElements(1, 1).Funcs( - func(o *OtherType, c fuzz.Continue) { - o.A = "Foo" - o.B = "Bar" - }, - func(op **OtherType, c fuzz.Continue) { - *op = &OtherType{"A", "B"} - }, - func(m map[string]OtherType, c fuzz.Continue) { - m["Works Because"] = OtherType{ - "Fuzzer", - "Preallocated", - } - }, - ) - object := MyType{} - f.Fuzz(&object) - bytes, err := json.MarshalIndent(&object, "", " ") - if err != nil { - fmt.Printf("error: %v\n", err) - } - fmt.Printf("%s\n", string(bytes)) - // Output: - // { - // "Pointer": { - // "A": "A", - // "B": "B" - // }, - // "Map": { - // "Works Because": { - // "A": "Fuzzer", - // "B": "Preallocated" - // } - // }, - // "PointerMap": { - // "Works Because": { - // "A": "Fuzzer", - // "B": "Preallocated" - // } - // }, - // "Slice": [ - // { - // "A": "Foo", - // "B": "Bar" - // } - // ], - // "SlicePointer": [ - // { - // "A": "A", - // "B": "B" - // } - // ], - // "PointerSlicePointer": [ - // { - // "A": "A", - // "B": "B" - // } - // ] - // } -} - -func ExampleMap() { - f := fuzz.New().NilChance(0).NumElements(1, 1) - var myMap map[struct{ A, B, C int }]string - f.Fuzz(&myMap) - fmt.Printf("myMap has %v element(s).\n", len(myMap)) - // Output: - // myMap has 1 element(s). -} - -func ExampleSingle() { - f := fuzz.New() - var i int - f.Fuzz(&i) - - // Technically, we'd expect this to fail one out of 2 billion attempts... - fmt.Printf("(i == 0) == %v", i == 0) - // Output: - // (i == 0) == false -} - -func ExampleEnum() { - type MyEnum string - const ( - A MyEnum = "A" - B MyEnum = "B" - ) - type MyInfo struct { - Type MyEnum - AInfo *string - BInfo *string - } - - f := fuzz.New().NilChance(0).Funcs( - func(e *MyInfo, c fuzz.Continue) { - // Note c's embedded Rand allows for direct use. - // We could also use c.RandBool() here. - switch c.Intn(2) { - case 0: - e.Type = A - c.Fuzz(&e.AInfo) - case 1: - e.Type = B - c.Fuzz(&e.BInfo) - } - }, - ) - - for i := 0; i < 100; i++ { - var myObject MyInfo - f.Fuzz(&myObject) - switch myObject.Type { - case A: - if myObject.AInfo == nil { - fmt.Println("AInfo should have been set!") - } - if myObject.BInfo != nil { - fmt.Println("BInfo should NOT have been set!") - } - case B: - if myObject.BInfo == nil { - fmt.Println("BInfo should have been set!") - } - if myObject.AInfo != nil { - fmt.Println("AInfo should NOT have been set!") - } - default: - fmt.Println("Invalid enum value!") - } - } - // Output: -} diff --git a/Godeps/_workspace/src/github.com/google/gofuzz/fuzz_test.go b/Godeps/_workspace/src/github.com/google/gofuzz/fuzz_test.go deleted file mode 100644 index 12abc8f65..000000000 --- a/Godeps/_workspace/src/github.com/google/gofuzz/fuzz_test.go +++ /dev/null @@ -1,384 +0,0 @@ -/* -Copyright 2014 Google Inc. All rights reserved. - -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 fuzz - -import ( - "reflect" - "testing" - "time" -) - -func TestFuzz_basic(t *testing.T) { - obj := &struct { - I int - I8 int8 - I16 int16 - I32 int32 - I64 int64 - U uint - U8 uint8 - U16 uint16 - U32 uint32 - U64 uint64 - Uptr uintptr - S string - B bool - T time.Time - }{} - - failed := map[string]int{} - for i := 0; i < 10; i++ { - New().Fuzz(obj) - - if n, v := "i", obj.I; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "i8", obj.I8; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "i16", obj.I16; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "i32", obj.I32; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "i64", obj.I64; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "u", obj.U; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "u8", obj.U8; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "u16", obj.U16; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "u32", obj.U32; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "u64", obj.U64; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "uptr", obj.Uptr; v == 0 { - failed[n] = failed[n] + 1 - } - if n, v := "s", obj.S; v == "" { - failed[n] = failed[n] + 1 - } - if n, v := "b", obj.B; v == false { - failed[n] = failed[n] + 1 - } - if n, v := "t", obj.T; v.IsZero() { - failed[n] = failed[n] + 1 - } - } - checkFailed(t, failed) -} - -func checkFailed(t *testing.T, failed map[string]int) { - for k, v := range failed { - if v > 8 { - t.Errorf("%v seems to not be getting set, was zero value %v times", k, v) - } - } -} - -func TestFuzz_structptr(t *testing.T) { - obj := &struct { - A *struct { - S string - } - }{} - - f := New().NilChance(.5) - failed := map[string]int{} - for i := 0; i < 10; i++ { - f.Fuzz(obj) - - if n, v := "a not nil", obj.A; v == nil { - failed[n] = failed[n] + 1 - } - if n, v := "a nil", obj.A; v != nil { - failed[n] = failed[n] + 1 - } - if n, v := "as", obj.A; v == nil || v.S == "" { - failed[n] = failed[n] + 1 - } - } - checkFailed(t, failed) -} - -// tryFuzz tries fuzzing up to 20 times. Fail if check() never passes, report the highest -// stage it ever got to. -func tryFuzz(t *testing.T, f *Fuzzer, obj interface{}, check func() (stage int, passed bool)) { - maxStage := 0 - for i := 0; i < 20; i++ { - f.Fuzz(obj) - stage, passed := check() - if stage > maxStage { - maxStage = stage - } - if passed { - return - } - } - t.Errorf("Only ever got to stage %v", maxStage) -} - -func TestFuzz_structmap(t *testing.T) { - obj := &struct { - A map[struct { - S string - }]struct { - S2 string - } - B map[string]string - }{} - - tryFuzz(t, New(), obj, func() (int, bool) { - if obj.A == nil { - return 1, false - } - if len(obj.A) == 0 { - return 2, false - } - for k, v := range obj.A { - if k.S == "" { - return 3, false - } - if v.S2 == "" { - return 4, false - } - } - - if obj.B == nil { - return 5, false - } - if len(obj.B) == 0 { - return 6, false - } - for k, v := range obj.B { - if k == "" { - return 7, false - } - if v == "" { - return 8, false - } - } - return 9, true - }) -} - -func TestFuzz_structslice(t *testing.T) { - obj := &struct { - A []struct { - S string - } - B []string - }{} - - tryFuzz(t, New(), obj, func() (int, bool) { - if obj.A == nil { - return 1, false - } - if len(obj.A) == 0 { - return 2, false - } - for _, v := range obj.A { - if v.S == "" { - return 3, false - } - } - - if obj.B == nil { - return 4, false - } - if len(obj.B) == 0 { - return 5, false - } - for _, v := range obj.B { - if v == "" { - return 6, false - } - } - return 7, true - }) -} - -func TestFuzz_custom(t *testing.T) { - obj := &struct { - A string - B *string - C map[string]string - D *map[string]string - }{} - - testPhrase := "gotcalled" - testMap := map[string]string{"C": "D"} - f := New().Funcs( - func(s *string, c Continue) { - *s = testPhrase - }, - func(m map[string]string, c Continue) { - m["C"] = "D" - }, - ) - - tryFuzz(t, f, obj, func() (int, bool) { - if obj.A != testPhrase { - return 1, false - } - if obj.B == nil { - return 2, false - } - if *obj.B != testPhrase { - return 3, false - } - if e, a := testMap, obj.C; !reflect.DeepEqual(e, a) { - return 4, false - } - if obj.D == nil { - return 5, false - } - if e, a := testMap, *obj.D; !reflect.DeepEqual(e, a) { - return 6, false - } - return 7, true - }) -} - -type SelfFuzzer string - -// Implement fuzz.Interface. -func (sf *SelfFuzzer) Fuzz(c Continue) { - *sf = selfFuzzerTestPhrase -} - -const selfFuzzerTestPhrase = "was fuzzed" - -func TestFuzz_interface(t *testing.T) { - f := New() - - var obj1 SelfFuzzer - tryFuzz(t, f, &obj1, func() (int, bool) { - if obj1 != selfFuzzerTestPhrase { - return 1, false - } - return 1, true - }) - - var obj2 map[int]SelfFuzzer - tryFuzz(t, f, &obj2, func() (int, bool) { - for _, v := range obj2 { - if v != selfFuzzerTestPhrase { - return 1, false - } - } - return 1, true - }) -} - -func TestFuzz_interfaceAndFunc(t *testing.T) { - const privateTestPhrase = "private phrase" - f := New().Funcs( - // This should take precedence over SelfFuzzer.Fuzz(). - func(s *SelfFuzzer, c Continue) { - *s = privateTestPhrase - }, - ) - - var obj1 SelfFuzzer - tryFuzz(t, f, &obj1, func() (int, bool) { - if obj1 != privateTestPhrase { - return 1, false - } - return 1, true - }) - - var obj2 map[int]SelfFuzzer - tryFuzz(t, f, &obj2, func() (int, bool) { - for _, v := range obj2 { - if v != privateTestPhrase { - return 1, false - } - } - return 1, true - }) -} - -func TestFuzz_noCustom(t *testing.T) { - type Inner struct { - Str string - } - type Outer struct { - Str string - In Inner - } - - testPhrase := "gotcalled" - f := New().Funcs( - func(outer *Outer, c Continue) { - outer.Str = testPhrase - c.Fuzz(&outer.In) - }, - func(inner *Inner, c Continue) { - inner.Str = testPhrase - }, - ) - c := Continue{f: f, Rand: f.r} - - // Fuzzer.Fuzz() - obj1 := Outer{} - f.Fuzz(&obj1) - if obj1.Str != testPhrase { - t.Errorf("expected Outer custom function to have been called") - } - if obj1.In.Str != testPhrase { - t.Errorf("expected Inner custom function to have been called") - } - - // Continue.Fuzz() - obj2 := Outer{} - c.Fuzz(&obj2) - if obj2.Str != testPhrase { - t.Errorf("expected Outer custom function to have been called") - } - if obj2.In.Str != testPhrase { - t.Errorf("expected Inner custom function to have been called") - } - - // Fuzzer.FuzzNoCustom() - obj3 := Outer{} - f.FuzzNoCustom(&obj3) - if obj3.Str == testPhrase { - t.Errorf("expected Outer custom function to not have been called") - } - if obj3.In.Str != testPhrase { - t.Errorf("expected Inner custom function to have been called") - } - - // Continue.FuzzNoCustom() - obj4 := Outer{} - c.FuzzNoCustom(&obj4) - if obj4.Str == testPhrase { - t.Errorf("expected Outer custom function to not have been called") - } - if obj4.In.Str != testPhrase { - t.Errorf("expected Inner custom function to have been called") - } -} diff --git a/Godeps/_workspace/src/github.com/imdario/mergo/mergo_test.go b/Godeps/_workspace/src/github.com/imdario/mergo/mergo_test.go deleted file mode 100644 index 072bddb79..000000000 --- a/Godeps/_workspace/src/github.com/imdario/mergo/mergo_test.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 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 mergo - -import ( - "gopkg.in/yaml.v1" - "io/ioutil" - "reflect" - "testing" -) - -type simpleTest struct { - Value int -} - -type complexTest struct { - St simpleTest - sz int - Id string -} - -type moreComplextText struct { - Ct complexTest - St simpleTest - Nt simpleTest -} - -type pointerTest struct { - C *simpleTest -} - -type sliceTest struct { - S []int -} - -func TestNil(t *testing.T) { - if err := Merge(nil, nil); err != ErrNilArguments { - t.Fail() - } -} - -func TestDifferentTypes(t *testing.T) { - a := simpleTest{42} - b := 42 - if err := Merge(&a, b); err != ErrDifferentArgumentsTypes { - t.Fail() - } -} - -func TestSimpleStruct(t *testing.T) { - a := simpleTest{} - b := simpleTest{42} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if a.Value != 42 { - t.Fatalf("b not merged in a properly: a.Value(%d) != b.Value(%d)", a.Value, b.Value) - } - if !reflect.DeepEqual(a, b) { - t.FailNow() - } -} - -func TestComplexStruct(t *testing.T) { - a := complexTest{} - a.Id = "athing" - b := complexTest{simpleTest{42}, 1, "bthing"} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if a.St.Value != 42 { - t.Fatalf("b not merged in a properly: a.St.Value(%d) != b.St.Value(%d)", a.St.Value, b.St.Value) - } - if a.sz == 1 { - t.Fatalf("a's private field sz not preserved from merge: a.sz(%d) == b.sz(%d)", a.sz, b.sz) - } - if a.Id != b.Id { - t.Fatalf("a's field Id not merged properly: a.Id(%s) != b.Id(%s)", a.Id, b.Id) - } -} - -func TestPointerStruct(t *testing.T) { - s1 := simpleTest{} - s2 := simpleTest{19} - a := pointerTest{&s1} - b := pointerTest{&s2} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if a.C.Value != b.C.Value { - //t.Fatalf("b not merged in a properly: a.C.Value(%d) != b.C.Value(%d)", a.C.Value, b.C.Value) - } -} - -func TestPointerStructNil(t *testing.T) { - a := pointerTest{nil} - b := pointerTest{&simpleTest{19}} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if a.C.Value != b.C.Value { - t.Fatalf("b not merged in a properly: a.C.Value(%d) != b.C.Value(%d)", a.C.Value, b.C.Value) - } -} - -func TestSliceStruct(t *testing.T) { - a := sliceTest{} - b := sliceTest{[]int{1, 2, 3}} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if len(b.S) != 3 { - t.FailNow() - } - if len(a.S) != len(b.S) { - t.Fatalf("b not merged in a properly %d != %d", len(a.S), len(b.S)) - } - - a = sliceTest{[]int{1}} - b = sliceTest{[]int{1, 2, 3}} - if err := Merge(&a, b); err != nil { - t.FailNow() - } - if len(b.S) != 3 { - t.FailNow() - } - if len(a.S) != len(b.S) { - t.Fatalf("b not merged in a properly %d != %d", len(a.S), len(b.S)) - } -} - -func TestMaps(t *testing.T) { - m := map[string]simpleTest{ - "a": simpleTest{}, - "b": simpleTest{42}, - } - n := map[string]simpleTest{ - "a": simpleTest{16}, - "b": simpleTest{}, - "c": simpleTest{12}, - } - if err := Merge(&m, n); err != nil { - t.Fatalf(err.Error()) - } - if len(m) != 3 { - t.Fatalf(`n not merged in m properly, m must have 3 elements instead of %d`, len(m)) - } - if m["a"].Value != 0 { - t.Fatalf(`n merged in m because I solved non-addressable map values TODO: m["a"].Value(%d) != n["a"].Value(%d)`, m["a"].Value, n["a"].Value) - } - if m["b"].Value != 42 { - t.Fatalf(`n wrongly merged in m: m["b"].Value(%d) != n["b"].Value(%d)`, m["b"].Value, n["b"].Value) - } - if m["c"].Value != 12 { - t.Fatalf(`n not merged in m: m["c"].Value(%d) != n["c"].Value(%d)`, m["c"].Value, n["c"].Value) - } -} - -func TestYAMLMaps(t *testing.T) { - thing := loadYAML("testdata/thing.yml") - license := loadYAML("testdata/license.yml") - ft := thing["fields"].(map[interface{}]interface{}) - fl := license["fields"].(map[interface{}]interface{}) - expectedLength := len(ft) + len(fl) - if err := Merge(&license, thing); err != nil { - t.Fatal(err.Error()) - } - currentLength := len(license["fields"].(map[interface{}]interface{})) - if currentLength != expectedLength { - t.Fatalf(`thing not merged in license properly, license must have %d elements instead of %d`, expectedLength, currentLength) - } - fields := license["fields"].(map[interface{}]interface{}) - if _, ok := fields["id"]; !ok { - t.Fatalf(`thing not merged in license properly, license must have a new id field from thing`) - } -} - -func TestTwoPointerValues(t *testing.T) { - a := &simpleTest{} - b := &simpleTest{42} - if err := Merge(a, b); err != nil { - t.Fatalf(`Boom. You crossed the streams: %s`, err) - } -} - -func TestMap(t *testing.T) { - a := complexTest{} - a.Id = "athing" - c := moreComplextText{a, simpleTest{}, simpleTest{}} - b := map[string]interface{}{ - "ct": map[string]interface{}{ - "st": map[string]interface{}{ - "value": 42, - }, - "sz": 1, - "id": "bthing", - }, - "st": &simpleTest{144}, // Mapping a reference - "zt": simpleTest{299}, // Mapping a missing field (zt doesn't exist) - "nt": simpleTest{3}, - } - if err := Map(&c, b); err != nil { - t.FailNow() - } - m := b["ct"].(map[string]interface{}) - n := m["st"].(map[string]interface{}) - o := b["st"].(*simpleTest) - p := b["nt"].(simpleTest) - if c.Ct.St.Value != 42 { - t.Fatalf("b not merged in a properly: c.Ct.St.Value(%d) != b.Ct.St.Value(%d)", c.Ct.St.Value, n["value"]) - } - if c.St.Value != 144 { - t.Fatalf("b not merged in a properly: c.St.Value(%d) != b.St.Value(%d)", c.St.Value, o.Value) - } - if c.Nt.Value != 3 { - t.Fatalf("b not merged in a properly: c.Nt.Value(%d) != b.Nt.Value(%d)", c.St.Value, p.Value) - } - if c.Ct.sz == 1 { - t.Fatalf("a's private field sz not preserved from merge: c.Ct.sz(%d) == b.Ct.sz(%d)", c.Ct.sz, m["sz"]) - } - if c.Ct.Id != m["id"] { - t.Fatalf("a's field Id not merged properly: c.Ct.Id(%s) != b.Ct.Id(%s)", c.Ct.Id, m["id"]) - } -} - -func TestSimpleMap(t *testing.T) { - a := simpleTest{} - b := map[string]interface{}{ - "value": 42, - } - if err := Map(&a, b); err != nil { - t.FailNow() - } - if a.Value != 42 { - t.Fatalf("b not merged in a properly: a.Value(%d) != b.Value(%v)", a.Value, b["value"]) - } -} - -type pointerMapTest struct { - A int - hidden int - B *simpleTest -} - -func TestBackAndForth(t *testing.T) { - pt := pointerMapTest{42, 1, &simpleTest{66}} - m := make(map[string]interface{}) - if err := Map(&m, pt); err != nil { - t.FailNow() - } - var ( - v interface{} - ok bool - ) - if v, ok = m["a"]; v.(int) != pt.A || !ok { - t.Fatalf("pt not merged properly: m[`a`](%d) != pt.A(%d)", v, pt.A) - } - if v, ok = m["b"]; !ok { - t.Fatalf("pt not merged properly: B is missing in m") - } - var st *simpleTest - if st = v.(*simpleTest); st.Value != 66 { - t.Fatalf("something went wrong while mapping pt on m, B wasn't copied") - } - bpt := pointerMapTest{} - if err := Map(&bpt, m); err != nil { - t.Fatal(err) - } - if bpt.A != pt.A { - t.Fatalf("pt not merged properly: bpt.A(%d) != pt.A(%d)", bpt.A, pt.A) - } - if bpt.hidden == pt.hidden { - t.Fatalf("pt unexpectedly merged: bpt.hidden(%d) == pt.hidden(%d)", bpt.hidden, pt.hidden) - } - if bpt.B.Value != pt.B.Value { - t.Fatalf("pt not merged properly: bpt.B.Value(%d) != pt.B.Value(%d)", bpt.B.Value, pt.B.Value) - } -} - -func loadYAML(path string) (m map[string]interface{}) { - m = make(map[string]interface{}) - raw, _ := ioutil.ReadFile(path) - _ = yaml.Unmarshal(raw, &m) - return -} diff --git a/Godeps/_workspace/src/github.com/imdario/mergo/testdata/license.yml b/Godeps/_workspace/src/github.com/imdario/mergo/testdata/license.yml deleted file mode 100644 index 62fdb61ec..000000000 --- a/Godeps/_workspace/src/github.com/imdario/mergo/testdata/license.yml +++ /dev/null @@ -1,3 +0,0 @@ -import: ../../../../fossene/db/schema/thing.yml -fields: - site: string diff --git a/Godeps/_workspace/src/github.com/imdario/mergo/testdata/thing.yml b/Godeps/_workspace/src/github.com/imdario/mergo/testdata/thing.yml deleted file mode 100644 index c28eab0d0..000000000 --- a/Godeps/_workspace/src/github.com/imdario/mergo/testdata/thing.yml +++ /dev/null @@ -1,5 +0,0 @@ -fields: - id: int - name: string - parent: ref "datu:thing" - status: enum(draft, public, private) diff --git a/Godeps/_workspace/src/github.com/juju/ratelimit/ratelimit_test.go b/Godeps/_workspace/src/github.com/juju/ratelimit/ratelimit_test.go deleted file mode 100644 index 62d88ded0..000000000 --- a/Godeps/_workspace/src/github.com/juju/ratelimit/ratelimit_test.go +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -package ratelimit - -import ( - "math" - "testing" - "time" - - gc "gopkg.in/check.v1" -) - -func TestPackage(t *testing.T) { - gc.TestingT(t) -} - -type rateLimitSuite struct{} - -var _ = gc.Suite(rateLimitSuite{}) - -type takeReq struct { - time time.Duration - count int64 - expectWait time.Duration -} - -var takeTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 0, - expectWait: 0, - }, { - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 1, - expectWait: 250 * time.Millisecond, - }, { - time: 250 * time.Millisecond, - count: 1, - expectWait: 250 * time.Millisecond, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 2, - expectWait: 500 * time.Millisecond, - }, { - time: 0, - count: 2, - expectWait: 1000 * time.Millisecond, - }, { - time: 0, - count: 1, - expectWait: 1250 * time.Millisecond, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 20 * time.Millisecond, - count: 15, - expectWait: 5 * time.Millisecond, - }}, -}, { - about: "sub-quantum time", - fillInterval: 10 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 7 * time.Millisecond, - count: 1, - expectWait: 3 * time.Millisecond, - }, { - time: 8 * time.Millisecond, - count: 1, - expectWait: 12 * time.Millisecond, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeReq{{ - time: 0, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 1, - expectWait: 10 * time.Millisecond, - }, { - time: 80 * time.Millisecond, - count: 2, - expectWait: 10 * time.Millisecond, - }}, -}} - -var availTests = []struct { - about string - capacity int64 - fillInterval time.Duration - take int64 - sleep time.Duration - - expectCountAfterTake int64 - expectCountAfterSleep int64 -}{{ - about: "should fill tokens after interval", - capacity: 5, - fillInterval: time.Second, - take: 5, - sleep: time.Second, - expectCountAfterTake: 0, - expectCountAfterSleep: 1, -}, { - about: "should fill tokens plus existing count", - capacity: 2, - fillInterval: time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}, { - about: "shouldn't fill before interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 1, -}, { - about: "should fill only once after 1*interval before 2*interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: 3 * time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}} - -func (rateLimitSuite) TestTake(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, infinityDuration) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -func (rateLimitSuite) TestTakeMaxDuration(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - if req.expectWait > 0 { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait-1) - c.Assert(ok, gc.Equals, false) - c.Assert(d, gc.Equals, time.Duration(0)) - } - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -type takeAvailableReq struct { - time time.Duration - count int64 - expect int64 -} - -var takeAvailableTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeAvailableReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 0, - expect: 0, - }, { - time: 0, - count: 10, - expect: 10, - }, { - time: 0, - count: 1, - expect: 0, - }, { - time: 250 * time.Millisecond, - count: 1, - expect: 1, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 0, - count: 2, - expect: 2, - }, { - time: 0, - count: 5, - expect: 3, - }, { - time: 0, - count: 1, - expect: 0, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 10, - expect: 10, - }, { - time: 20 * time.Millisecond, - count: 15, - expect: 10, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 60 * time.Millisecond, - count: 5, - expect: 5, - }, { - time: 70 * time.Millisecond, - count: 1, - expect: 1, - }}, -}} - -func (rateLimitSuite) TestTakeAvailable(c *gc.C) { - for i, test := range takeAvailableTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d := tb.takeAvailable(tb.startTime.Add(req.time), req.count) - if d != req.expect { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expect) - } - } - } -} - -func (rateLimitSuite) TestPanics(c *gc.C) { - c.Assert(func() { NewBucket(0, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(-2, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(1, 0) }, gc.PanicMatches, "token bucket capacity is not > 0") - c.Assert(func() { NewBucket(1, -2) }, gc.PanicMatches, "token bucket capacity is not > 0") -} - -func isCloseTo(x, y, tolerance float64) bool { - return math.Abs(x-y)/y < tolerance -} - -func (rateLimitSuite) TestRate(c *gc.C) { - tb := NewBucket(1, 1) - if !isCloseTo(tb.Rate(), 1e9, 0.00001) { - c.Fatalf("got %v want 1e9", tb.Rate()) - } - tb = NewBucket(2*time.Second, 1) - if !isCloseTo(tb.Rate(), 0.5, 0.00001) { - c.Fatalf("got %v want 0.5", tb.Rate()) - } - tb = NewBucketWithQuantum(100*time.Millisecond, 1, 5) - if !isCloseTo(tb.Rate(), 50, 0.00001) { - c.Fatalf("got %v want 50", tb.Rate()) - } -} - -func checkRate(c *gc.C, rate float64) { - tb := NewBucketWithRate(rate, 1<<62) - if !isCloseTo(tb.Rate(), rate, rateMargin) { - c.Fatalf("got %g want %v", tb.Rate(), rate) - } - d, ok := tb.take(tb.startTime, 1<<62, infinityDuration) - c.Assert(ok, gc.Equals, true) - c.Assert(d, gc.Equals, time.Duration(0)) - - // Check that the actual rate is as expected by - // asking for a not-quite multiple of the bucket's - // quantum and checking that the wait time - // correct. - d, ok = tb.take(tb.startTime, tb.quantum*2-tb.quantum/2, infinityDuration) - c.Assert(ok, gc.Equals, true) - expectTime := 1e9 * float64(tb.quantum) * 2 / rate - if !isCloseTo(float64(d), expectTime, rateMargin) { - c.Fatalf("rate %g: got %g want %v", rate, float64(d), expectTime) - } -} - -func (rateLimitSuite) TestNewWithRate(c *gc.C) { - for rate := float64(1); rate < 1e6; rate += 7 { - checkRate(c, rate) - } - for _, rate := range []float64{ - 1024 * 1024 * 1024, - 1e-5, - 0.9e-5, - 0.5, - 0.9, - 0.9e8, - 3e12, - 4e18, - } { - checkRate(c, rate) - checkRate(c, rate/3) - checkRate(c, rate*1.3) - } -} - -func TestAvailable(t *testing.T) { - for i, tt := range availTests { - tb := NewBucket(tt.fillInterval, tt.capacity) - if c := tb.takeAvailable(tb.startTime, tt.take); c != tt.take { - t.Fatalf("#%d: %s, take = %d, want = %d", i, tt.about, c, tt.take) - } - if c := tb.available(tb.startTime); c != tt.expectCountAfterTake { - t.Fatalf("#%d: %s, after take, available = %d, want = %d", i, tt.about, c, tt.expectCountAfterTake) - } - if c := tb.available(tb.startTime.Add(tt.sleep)); c != tt.expectCountAfterSleep { - t.Fatalf("#%d: %s, after some time it should fill in new tokens, available = %d, want = %d", - i, tt.about, c, tt.expectCountAfterSleep) - } - } - -} - -func BenchmarkWait(b *testing.B) { - tb := NewBucket(1, 16*1024) - for i := b.N - 1; i >= 0; i-- { - tb.Wait(1) - } -} diff --git a/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go b/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go deleted file mode 100644 index 094156e66..000000000 --- a/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// 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 pbutil - -import ( - "bytes" - "math/rand" - "reflect" - "testing" - "testing/quick" - - "github.com/matttproud/golang_protobuf_extensions/pbtest" - - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -func TestWriteDelimited(t *testing.T) { - for _, test := range []struct { - msg Message - buf []byte - n int - err error - }{ - { - msg: &Empty{}, - n: 1, - buf: []byte{0}, - }, - { - msg: &GoEnum{Foo: FOO_FOO1.Enum()}, - n: 3, - buf: []byte{2, 8, 1}, - }, - { - msg: &Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }, - n: 271, - buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, - 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, - 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, - 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, - 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, - 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, - 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, - 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, - 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, - 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, - 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, - 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, - 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, - 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, - 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, - 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, - 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, - 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, - }, - } { - var buf bytes.Buffer - if n, err := WriteDelimited(&buf, test.msg); n != test.n || err != test.err { - t.Fatalf("WriteDelimited(buf, %#v) = %v, %v; want %v, %v", test.msg, n, err, test.n, test.err) - } - if out := buf.Bytes(); !bytes.Equal(out, test.buf) { - t.Fatalf("WriteDelimited(buf, %#v); buf = %v; want %v", test.msg, out, test.buf) - } - } -} - -func TestReadDelimited(t *testing.T) { - for _, test := range []struct { - buf []byte - msg Message - n int - err error - }{ - { - buf: []byte{0}, - msg: &Empty{}, - n: 1, - }, - { - n: 3, - buf: []byte{2, 8, 1}, - msg: &GoEnum{Foo: FOO_FOO1.Enum()}, - }, - { - buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, - 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, - 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, - 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, - 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, - 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, - 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, - 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, - 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, - 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, - 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, - 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, - 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, - 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, - 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, - 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, - 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, - 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, - msg: &Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }, - n: 271, - }, - } { - msg := Clone(test.msg) - msg.Reset() - if n, err := ReadDelimited(bytes.NewBuffer(test.buf), msg); n != test.n || err != test.err { - t.Fatalf("ReadDelimited(%v, msg) = %v, %v; want %v, %v", test.buf, n, err, test.n, test.err) - } - if !Equal(msg, test.msg) { - t.Fatalf("ReadDelimited(%v, msg); msg = %v; want %v", test.buf, msg, test.msg) - } - } -} - -func TestEndToEndValid(t *testing.T) { - for _, test := range [][]Message{ - {&Empty{}}, - {&GoEnum{Foo: FOO_FOO1.Enum()}, &Empty{}, &GoEnum{Foo: FOO_FOO1.Enum()}}, - {&GoEnum{Foo: FOO_FOO1.Enum()}}, - {&Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }}, - } { - var buf bytes.Buffer - var written int - for i, msg := range test { - n, err := WriteDelimited(&buf, msg) - if err != nil { - // Assumption: TestReadDelimited and TestWriteDelimited are sufficient - // and inputs for this test are explicitly exercised there. - t.Fatalf("WriteDelimited(buf, %v[%d]) = ?, %v; wanted ?, nil", test, i, err) - } - written += n - } - var read int - for i, msg := range test { - out := Clone(msg) - out.Reset() - n, _ := ReadDelimited(&buf, out) - // Decide to do EOF checking? - read += n - if !Equal(out, msg) { - t.Fatalf("out = %v; want %v[%d] = %#v", out, test, i, msg) - } - } - if read != written { - t.Fatalf("%v read = %d; want %d", test, read, written) - } - } -} - -// rndMessage generates a random valid Protocol Buffer message. -func rndMessage(r *rand.Rand) Message { - var t reflect.Type - switch v := rand.Intn(23); v { - // TODO(br): Uncomment the elements below once fix is incorporated, except - // for the elements marked as patently incompatible. - // case 0: - // t = reflect.TypeOf(&GoEnum{}) - // break - // case 1: - // t = reflect.TypeOf(&GoTestField{}) - // break - case 2: - t = reflect.TypeOf(&GoTest{}) - break - // case 3: - // t = reflect.TypeOf(&GoSkipTest{}) - // break - // case 4: - // t = reflect.TypeOf(&NonPackedTest{}) - // break - // case 5: - // t = reflect.TypeOf(&PackedTest{}) - // break - case 6: - t = reflect.TypeOf(&MaxTag{}) - break - case 7: - t = reflect.TypeOf(&OldMessage{}) - break - case 8: - t = reflect.TypeOf(&NewMessage{}) - break - case 9: - t = reflect.TypeOf(&InnerMessage{}) - break - case 10: - t = reflect.TypeOf(&OtherMessage{}) - break - case 11: - // PATENTLY INVALID FOR FUZZ GENERATION - // t = reflect.TypeOf(&MyMessage{}) - break - // case 12: - // t = reflect.TypeOf(&Ext{}) - // break - case 13: - // PATENTLY INVALID FOR FUZZ GENERATION - // t = reflect.TypeOf(&MyMessageSet{}) - break - // case 14: - // t = reflect.TypeOf(&Empty{}) - // break - // case 15: - // t = reflect.TypeOf(&MessageList{}) - // break - // case 16: - // t = reflect.TypeOf(&Strings{}) - // break - // case 17: - // t = reflect.TypeOf(&Defaults{}) - // break - // case 17: - // t = reflect.TypeOf(&SubDefaults{}) - // break - // case 18: - // t = reflect.TypeOf(&RepeatedEnum{}) - // break - case 19: - t = reflect.TypeOf(&MoreRepeated{}) - break - // case 20: - // t = reflect.TypeOf(&GroupOld{}) - // break - // case 21: - // t = reflect.TypeOf(&GroupNew{}) - // break - case 22: - t = reflect.TypeOf(&FloatingPoint{}) - break - default: - // TODO(br): Replace with an unreachable once fixed. - t = reflect.TypeOf(&GoTest{}) - break - } - if t == nil { - t = reflect.TypeOf(&GoTest{}) - } - v, ok := quick.Value(t, r) - if !ok { - panic("attempt to generate illegal item; consult item 11") - } - if err := pbtest.SanitizeGenerated(v.Interface().(Message)); err != nil { - panic(err) - } - return v.Interface().(Message) -} - -// rndMessages generates several random Protocol Buffer messages. -func rndMessages(r *rand.Rand) []Message { - n := r.Intn(128) - out := make([]Message, 0, n) - for i := 0; i < n; i++ { - out = append(out, rndMessage(r)) - } - return out -} - -func TestFuzz(t *testing.T) { - rnd := rand.New(rand.NewSource(42)) - check := func() bool { - messages := rndMessages(rnd) - var buf bytes.Buffer - var written int - for i, msg := range messages { - n, err := WriteDelimited(&buf, msg) - if err != nil { - t.Fatalf("WriteDelimited(buf, %v[%d]) = ?, %v; wanted ?, nil", messages, i, err) - } - written += n - } - var read int - for i, msg := range messages { - out := Clone(msg) - out.Reset() - n, _ := ReadDelimited(&buf, out) - read += n - if !Equal(out, msg) { - t.Fatalf("out = %v; want %v[%d] = %#v", out, messages, i, msg) - } - } - if read != written { - t.Fatalf("%v read = %d; want %d", messages, read, written) - } - return true - } - if err := quick.Check(check, nil); err != nil { - t.Fatal(err) - } -} diff --git a/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go b/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go deleted file mode 100644 index d6d9b2559..000000000 --- a/Godeps/_workspace/src/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// http://github.com/golang/protobuf/ -// -// 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 pbutil - -import ( - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -// FROM https://github.com/golang/protobuf/blob/master/proto/all_test.go. - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} diff --git a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/decode_hooks_test.go b/Godeps/_workspace/src/github.com/mitchellh/mapstructure/decode_hooks_test.go deleted file mode 100644 index b417deeb6..000000000 --- a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/decode_hooks_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package mapstructure - -import ( - "errors" - "reflect" - "testing" -) - -func TestComposeDecodeHookFunc(t *testing.T) { - f1 := func( - f reflect.Kind, - t reflect.Kind, - data interface{}) (interface{}, error) { - return data.(string) + "foo", nil - } - - f2 := func( - f reflect.Kind, - t reflect.Kind, - data interface{}) (interface{}, error) { - return data.(string) + "bar", nil - } - - f := ComposeDecodeHookFunc(f1, f2) - - result, err := f(reflect.String, reflect.Slice, "") - if err != nil { - t.Fatalf("bad: %s", err) - } - if result.(string) != "foobar" { - t.Fatalf("bad: %#v", result) - } -} - -func TestComposeDecodeHookFunc_err(t *testing.T) { - f1 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) { - return nil, errors.New("foo") - } - - f2 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) { - panic("NOPE") - } - - f := ComposeDecodeHookFunc(f1, f2) - - _, err := f(reflect.String, reflect.Slice, 42) - if err.Error() != "foo" { - t.Fatalf("bad: %s", err) - } -} - -func TestComposeDecodeHookFunc_kinds(t *testing.T) { - var f2From reflect.Kind - - f1 := func( - f reflect.Kind, - t reflect.Kind, - data interface{}) (interface{}, error) { - return int(42), nil - } - - f2 := func( - f reflect.Kind, - t reflect.Kind, - data interface{}) (interface{}, error) { - f2From = f - return data, nil - } - - f := ComposeDecodeHookFunc(f1, f2) - - _, err := f(reflect.String, reflect.Slice, "") - if err != nil { - t.Fatalf("bad: %s", err) - } - if f2From != reflect.Int { - t.Fatalf("bad: %#v", f2From) - } -} - -func TestStringToSliceHookFunc(t *testing.T) { - f := StringToSliceHookFunc(",") - - cases := []struct { - f, t reflect.Kind - data interface{} - result interface{} - err bool - }{ - {reflect.Slice, reflect.Slice, 42, 42, false}, - {reflect.String, reflect.String, 42, 42, false}, - { - reflect.String, - reflect.Slice, - "foo,bar,baz", - []string{"foo", "bar", "baz"}, - false, - }, - { - reflect.String, - reflect.Slice, - "", - []string{}, - false, - }, - } - - for i, tc := range cases { - actual, err := f(tc.f, tc.t, tc.data) - if tc.err != (err != nil) { - t.Fatalf("case %d: expected err %#v", i, tc.err) - } - if !reflect.DeepEqual(actual, tc.result) { - t.Fatalf( - "case %d: expected %#v, got %#v", - i, tc.result, actual) - } - } -} - -func TestWeaklyTypedHook(t *testing.T) { - var f DecodeHookFunc = WeaklyTypedHook - - cases := []struct { - f, t reflect.Kind - data interface{} - result interface{} - err bool - }{ - // TO STRING - { - reflect.Bool, - reflect.String, - false, - "0", - false, - }, - - { - reflect.Bool, - reflect.String, - true, - "1", - false, - }, - - { - reflect.Float32, - reflect.String, - float32(7), - "7", - false, - }, - - { - reflect.Int, - reflect.String, - int(7), - "7", - false, - }, - - { - reflect.Slice, - reflect.String, - []uint8("foo"), - "foo", - false, - }, - - { - reflect.Uint, - reflect.String, - uint(7), - "7", - false, - }, - } - - for i, tc := range cases { - actual, err := f(tc.f, tc.t, tc.data) - if tc.err != (err != nil) { - t.Fatalf("case %d: expected err %#v", i, tc.err) - } - if !reflect.DeepEqual(actual, tc.result) { - t.Fatalf( - "case %d: expected %#v, got %#v", - i, tc.result, actual) - } - } -} diff --git a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go b/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go deleted file mode 100644 index b50ac36e5..000000000 --- a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go +++ /dev/null @@ -1,243 +0,0 @@ -package mapstructure - -import ( - "testing" -) - -func Benchmark_Decode(b *testing.B) { - type Person struct { - Name string - Age int - Emails []string - Extra map[string]string - } - - input := map[string]interface{}{ - "name": "Mitchell", - "age": 91, - "emails": []string{"one", "two", "three"}, - "extra": map[string]string{ - "twitter": "mitchellh", - }, - } - - var result Person - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeBasic(b *testing.B) { - input := map[string]interface{}{ - "vstring": "foo", - "vint": 42, - "Vuint": 42, - "vbool": true, - "Vfloat": 42.42, - "vsilent": true, - "vdata": 42, - } - - var result Basic - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeEmbedded(b *testing.B) { - input := map[string]interface{}{ - "vstring": "foo", - "Basic": map[string]interface{}{ - "vstring": "innerfoo", - }, - "vunique": "bar", - } - - var result Embedded - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeTypeConversion(b *testing.B) { - input := map[string]interface{}{ - "IntToFloat": 42, - "IntToUint": 42, - "IntToBool": 1, - "IntToString": 42, - "UintToInt": 42, - "UintToFloat": 42, - "UintToBool": 42, - "UintToString": 42, - "BoolToInt": true, - "BoolToUint": true, - "BoolToFloat": true, - "BoolToString": true, - "FloatToInt": 42.42, - "FloatToUint": 42.42, - "FloatToBool": 42.42, - "FloatToString": 42.42, - "StringToInt": "42", - "StringToUint": "42", - "StringToBool": "1", - "StringToFloat": "42.42", - "SliceToMap": []interface{}{}, - "MapToSlice": map[string]interface{}{}, - } - - var resultStrict TypeConversionResult - for i := 0; i < b.N; i++ { - Decode(input, &resultStrict) - } -} - -func Benchmark_DecodeMap(b *testing.B) { - input := map[string]interface{}{ - "vfoo": "foo", - "vother": map[interface{}]interface{}{ - "foo": "foo", - "bar": "bar", - }, - } - - var result Map - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeMapOfStruct(b *testing.B) { - input := map[string]interface{}{ - "value": map[string]interface{}{ - "foo": map[string]string{"vstring": "one"}, - "bar": map[string]string{"vstring": "two"}, - }, - } - - var result MapOfStruct - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeSlice(b *testing.B) { - input := map[string]interface{}{ - "vfoo": "foo", - "vbar": []string{"foo", "bar", "baz"}, - } - - var result Slice - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeSliceOfStruct(b *testing.B) { - input := map[string]interface{}{ - "value": []map[string]interface{}{ - {"vstring": "one"}, - {"vstring": "two"}, - }, - } - - var result SliceOfStruct - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} - -func Benchmark_DecodeWeaklyTypedInput(b *testing.B) { - type Person struct { - Name string - Age int - Emails []string - } - - // This input can come from anywhere, but typically comes from - // something like decoding JSON, generated by a weakly typed language - // such as PHP. - input := map[string]interface{}{ - "name": 123, // number => string - "age": "42", // string => number - "emails": map[string]interface{}{}, // empty map => empty array - } - - var result Person - config := &DecoderConfig{ - WeaklyTypedInput: true, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - panic(err) - } - - for i := 0; i < b.N; i++ { - decoder.Decode(input) - } -} - -func Benchmark_DecodeMetadata(b *testing.B) { - type Person struct { - Name string - Age int - } - - input := map[string]interface{}{ - "name": "Mitchell", - "age": 91, - "email": "foo@bar.com", - } - - var md Metadata - var result Person - config := &DecoderConfig{ - Metadata: &md, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - panic(err) - } - - for i := 0; i < b.N; i++ { - decoder.Decode(input) - } -} - -func Benchmark_DecodeMetadataEmbedded(b *testing.B) { - input := map[string]interface{}{ - "vstring": "foo", - "vunique": "bar", - } - - var md Metadata - var result EmbeddedSquash - config := &DecoderConfig{ - Metadata: &md, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - b.Fatalf("err: %s", err) - } - - for i := 0; i < b.N; i++ { - decoder.Decode(input) - } -} - -func Benchmark_DecodeTagged(b *testing.B) { - input := map[string]interface{}{ - "foo": "bar", - "bar": "value", - } - - var result Tagged - for i := 0; i < b.N; i++ { - Decode(input, &result) - } -} diff --git a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go b/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go deleted file mode 100644 index 7054f1ac9..000000000 --- a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package mapstructure - -import "testing" - -// GH-1 -func TestDecode_NilValue(t *testing.T) { - input := map[string]interface{}{ - "vfoo": nil, - "vother": nil, - } - - var result Map - err := Decode(input, &result) - if err != nil { - t.Fatalf("should not error: %s", err) - } - - if result.Vfoo != "" { - t.Fatalf("value should be default: %s", result.Vfoo) - } - - if result.Vother != nil { - t.Fatalf("Vother should be nil: %s", result.Vother) - } -} - -// GH-10 -func TestDecode_mapInterfaceInterface(t *testing.T) { - input := map[interface{}]interface{}{ - "vfoo": nil, - "vother": nil, - } - - var result Map - err := Decode(input, &result) - if err != nil { - t.Fatalf("should not error: %s", err) - } - - if result.Vfoo != "" { - t.Fatalf("value should be default: %s", result.Vfoo) - } - - if result.Vother != nil { - t.Fatalf("Vother should be nil: %s", result.Vother) - } -} diff --git a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_examples_test.go b/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_examples_test.go deleted file mode 100644 index aa393cc57..000000000 --- a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_examples_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package mapstructure - -import ( - "fmt" -) - -func ExampleDecode() { - type Person struct { - Name string - Age int - Emails []string - Extra map[string]string - } - - // This input can come from anywhere, but typically comes from - // something like decoding JSON where we're not quite sure of the - // struct initially. - input := map[string]interface{}{ - "name": "Mitchell", - "age": 91, - "emails": []string{"one", "two", "three"}, - "extra": map[string]string{ - "twitter": "mitchellh", - }, - } - - var result Person - err := Decode(input, &result) - if err != nil { - panic(err) - } - - fmt.Printf("%#v", result) - // Output: - // mapstructure.Person{Name:"Mitchell", Age:91, Emails:[]string{"one", "two", "three"}, Extra:map[string]string{"twitter":"mitchellh"}} -} - -func ExampleDecode_errors() { - type Person struct { - Name string - Age int - Emails []string - Extra map[string]string - } - - // This input can come from anywhere, but typically comes from - // something like decoding JSON where we're not quite sure of the - // struct initially. - input := map[string]interface{}{ - "name": 123, - "age": "bad value", - "emails": []int{1, 2, 3}, - } - - var result Person - err := Decode(input, &result) - if err == nil { - panic("should have an error") - } - - fmt.Println(err.Error()) - // Output: - // 5 error(s) decoding: - // - // * 'Name' expected type 'string', got unconvertible type 'int' - // * 'Age' expected type 'int', got unconvertible type 'string' - // * 'Emails[0]' expected type 'string', got unconvertible type 'int' - // * 'Emails[1]' expected type 'string', got unconvertible type 'int' - // * 'Emails[2]' expected type 'string', got unconvertible type 'int' -} - -func ExampleDecode_metadata() { - type Person struct { - Name string - Age int - } - - // This input can come from anywhere, but typically comes from - // something like decoding JSON where we're not quite sure of the - // struct initially. - input := map[string]interface{}{ - "name": "Mitchell", - "age": 91, - "email": "foo@bar.com", - } - - // For metadata, we make a more advanced DecoderConfig so we can - // more finely configure the decoder that is used. In this case, we - // just tell the decoder we want to track metadata. - var md Metadata - var result Person - config := &DecoderConfig{ - Metadata: &md, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - panic(err) - } - - if err := decoder.Decode(input); err != nil { - panic(err) - } - - fmt.Printf("Unused keys: %#v", md.Unused) - // Output: - // Unused keys: []string{"email"} -} - -func ExampleDecode_weaklyTypedInput() { - type Person struct { - Name string - Age int - Emails []string - } - - // This input can come from anywhere, but typically comes from - // something like decoding JSON, generated by a weakly typed language - // such as PHP. - input := map[string]interface{}{ - "name": 123, // number => string - "age": "42", // string => number - "emails": map[string]interface{}{}, // empty map => empty array - } - - var result Person - config := &DecoderConfig{ - WeaklyTypedInput: true, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - panic(err) - } - - err = decoder.Decode(input) - if err != nil { - panic(err) - } - - fmt.Printf("%#v", result) - // Output: mapstructure.Person{Name:"123", Age:42, Emails:[]string{}} -} - -func ExampleDecode_tags() { - // Note that the mapstructure tags defined in the struct type - // can indicate which fields the values are mapped to. - type Person struct { - Name string `mapstructure:"person_name"` - Age int `mapstructure:"person_age"` - } - - input := map[string]interface{}{ - "person_name": "Mitchell", - "person_age": 91, - } - - var result Person - err := Decode(input, &result) - if err != nil { - panic(err) - } - - fmt.Printf("%#v", result) - // Output: - // mapstructure.Person{Name:"Mitchell", Age:91} -} diff --git a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_test.go b/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_test.go deleted file mode 100644 index 23029c7c4..000000000 --- a/Godeps/_workspace/src/github.com/mitchellh/mapstructure/mapstructure_test.go +++ /dev/null @@ -1,828 +0,0 @@ -package mapstructure - -import ( - "reflect" - "sort" - "testing" -) - -type Basic struct { - Vstring string - Vint int - Vuint uint - Vbool bool - Vfloat float64 - Vextra string - vsilent bool - Vdata interface{} -} - -type Embedded struct { - Basic - Vunique string -} - -type EmbeddedPointer struct { - *Basic - Vunique string -} - -type EmbeddedSquash struct { - Basic `mapstructure:",squash"` - Vunique string -} - -type Map struct { - Vfoo string - Vother map[string]string -} - -type MapOfStruct struct { - Value map[string]Basic -} - -type Nested struct { - Vfoo string - Vbar Basic -} - -type NestedPointer struct { - Vfoo string - Vbar *Basic -} - -type Slice struct { - Vfoo string - Vbar []string -} - -type SliceOfStruct struct { - Value []Basic -} - -type Tagged struct { - Extra string `mapstructure:"bar,what,what"` - Value string `mapstructure:"foo"` -} - -type TypeConversionResult struct { - IntToFloat float32 - IntToUint uint - IntToBool bool - IntToString string - UintToInt int - UintToFloat float32 - UintToBool bool - UintToString string - BoolToInt int - BoolToUint uint - BoolToFloat float32 - BoolToString string - FloatToInt int - FloatToUint uint - FloatToBool bool - FloatToString string - SliceUint8ToString string - StringToInt int - StringToUint uint - StringToBool bool - StringToFloat float32 - SliceToMap map[string]interface{} - MapToSlice []interface{} -} - -func TestBasicTypes(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "foo", - "vint": 42, - "Vuint": 42, - "vbool": true, - "Vfloat": 42.42, - "vsilent": true, - "vdata": 42, - } - - var result Basic - err := Decode(input, &result) - if err != nil { - t.Errorf("got an err: %s", err.Error()) - t.FailNow() - } - - if result.Vstring != "foo" { - t.Errorf("vstring value should be 'foo': %#v", result.Vstring) - } - - if result.Vint != 42 { - t.Errorf("vint value should be 42: %#v", result.Vint) - } - - if result.Vuint != 42 { - t.Errorf("vuint value should be 42: %#v", result.Vuint) - } - - if result.Vbool != true { - t.Errorf("vbool value should be true: %#v", result.Vbool) - } - - if result.Vfloat != 42.42 { - t.Errorf("vfloat value should be 42.42: %#v", result.Vfloat) - } - - if result.Vextra != "" { - t.Errorf("vextra value should be empty: %#v", result.Vextra) - } - - if result.vsilent != false { - t.Error("vsilent should not be set, it is unexported") - } - - if result.Vdata != 42 { - t.Error("vdata should be valid") - } -} - -func TestBasic_IntWithFloat(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vint": float64(42), - } - - var result Basic - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err) - } -} - -func TestDecode_Embedded(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "foo", - "Basic": map[string]interface{}{ - "vstring": "innerfoo", - }, - "vunique": "bar", - } - - var result Embedded - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err.Error()) - } - - if result.Vstring != "innerfoo" { - t.Errorf("vstring value should be 'innerfoo': %#v", result.Vstring) - } - - if result.Vunique != "bar" { - t.Errorf("vunique value should be 'bar': %#v", result.Vunique) - } -} - -func TestDecode_EmbeddedPointer(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "foo", - "Basic": map[string]interface{}{ - "vstring": "innerfoo", - }, - "vunique": "bar", - } - - var result EmbeddedPointer - err := Decode(input, &result) - if err == nil { - t.Fatal("should get error") - } -} - -func TestDecode_EmbeddedSquash(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "foo", - "vunique": "bar", - } - - var result EmbeddedSquash - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err.Error()) - } - - if result.Vstring != "foo" { - t.Errorf("vstring value should be 'foo': %#v", result.Vstring) - } - - if result.Vunique != "bar" { - t.Errorf("vunique value should be 'bar': %#v", result.Vunique) - } -} - -func TestDecode_DecodeHook(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vint": "WHAT", - } - - decodeHook := func(from reflect.Kind, to reflect.Kind, v interface{}) (interface{}, error) { - if from == reflect.String && to != reflect.String { - return 5, nil - } - - return v, nil - } - - var result Basic - config := &DecoderConfig{ - DecodeHook: decodeHook, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - t.Fatalf("err: %s", err) - } - - err = decoder.Decode(input) - if err != nil { - t.Fatalf("got an err: %s", err) - } - - if result.Vint != 5 { - t.Errorf("vint should be 5: %#v", result.Vint) - } -} - -func TestDecode_Nil(t *testing.T) { - t.Parallel() - - var input interface{} = nil - result := Basic{ - Vstring: "foo", - } - - err := Decode(input, &result) - if err != nil { - t.Fatalf("err: %s", err) - } - - if result.Vstring != "foo" { - t.Fatalf("bad: %#v", result.Vstring) - } -} - -func TestDecode_NonStruct(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "foo": "bar", - "bar": "baz", - } - - var result map[string]string - err := Decode(input, &result) - if err != nil { - t.Fatalf("err: %s", err) - } - - if result["foo"] != "bar" { - t.Fatal("foo is not bar") - } -} - -func TestDecode_TypeConversion(t *testing.T) { - input := map[string]interface{}{ - "IntToFloat": 42, - "IntToUint": 42, - "IntToBool": 1, - "IntToString": 42, - "UintToInt": 42, - "UintToFloat": 42, - "UintToBool": 42, - "UintToString": 42, - "BoolToInt": true, - "BoolToUint": true, - "BoolToFloat": true, - "BoolToString": true, - "FloatToInt": 42.42, - "FloatToUint": 42.42, - "FloatToBool": 42.42, - "FloatToString": 42.42, - "SliceUint8ToString": []uint8("foo"), - "StringToInt": "42", - "StringToUint": "42", - "StringToBool": "1", - "StringToFloat": "42.42", - "SliceToMap": []interface{}{}, - "MapToSlice": map[string]interface{}{}, - } - - expectedResultStrict := TypeConversionResult{ - IntToFloat: 42.0, - IntToUint: 42, - UintToInt: 42, - UintToFloat: 42, - BoolToInt: 0, - BoolToUint: 0, - BoolToFloat: 0, - FloatToInt: 42, - FloatToUint: 42, - } - - expectedResultWeak := TypeConversionResult{ - IntToFloat: 42.0, - IntToUint: 42, - IntToBool: true, - IntToString: "42", - UintToInt: 42, - UintToFloat: 42, - UintToBool: true, - UintToString: "42", - BoolToInt: 1, - BoolToUint: 1, - BoolToFloat: 1, - BoolToString: "1", - FloatToInt: 42, - FloatToUint: 42, - FloatToBool: true, - FloatToString: "42.42", - SliceUint8ToString: "foo", - StringToInt: 42, - StringToUint: 42, - StringToBool: true, - StringToFloat: 42.42, - SliceToMap: map[string]interface{}{}, - MapToSlice: []interface{}{}, - } - - // Test strict type conversion - var resultStrict TypeConversionResult - err := Decode(input, &resultStrict) - if err == nil { - t.Errorf("should return an error") - } - if !reflect.DeepEqual(resultStrict, expectedResultStrict) { - t.Errorf("expected %v, got: %v", expectedResultStrict, resultStrict) - } - - // Test weak type conversion - var decoder *Decoder - var resultWeak TypeConversionResult - - config := &DecoderConfig{ - WeaklyTypedInput: true, - Result: &resultWeak, - } - - decoder, err = NewDecoder(config) - if err != nil { - t.Fatalf("err: %s", err) - } - - err = decoder.Decode(input) - if err != nil { - t.Fatalf("got an err: %s", err) - } - - if !reflect.DeepEqual(resultWeak, expectedResultWeak) { - t.Errorf("expected \n%#v, got: \n%#v", expectedResultWeak, resultWeak) - } -} - -func TestDecoder_ErrorUnused(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "hello", - "foo": "bar", - } - - var result Basic - config := &DecoderConfig{ - ErrorUnused: true, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - t.Fatalf("err: %s", err) - } - - err = decoder.Decode(input) - if err == nil { - t.Fatal("expected error") - } -} - -func TestMap(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vfoo": "foo", - "vother": map[interface{}]interface{}{ - "foo": "foo", - "bar": "bar", - }, - } - - var result Map - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an error: %s", err) - } - - if result.Vfoo != "foo" { - t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) - } - - if result.Vother == nil { - t.Fatal("vother should not be nil") - } - - if len(result.Vother) != 2 { - t.Error("vother should have two items") - } - - if result.Vother["foo"] != "foo" { - t.Errorf("'foo' key should be foo, got: %#v", result.Vother["foo"]) - } - - if result.Vother["bar"] != "bar" { - t.Errorf("'bar' key should be bar, got: %#v", result.Vother["bar"]) - } -} - -func TestMapOfStruct(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "value": map[string]interface{}{ - "foo": map[string]string{"vstring": "one"}, - "bar": map[string]string{"vstring": "two"}, - }, - } - - var result MapOfStruct - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err) - } - - if result.Value == nil { - t.Fatal("value should not be nil") - } - - if len(result.Value) != 2 { - t.Error("value should have two items") - } - - if result.Value["foo"].Vstring != "one" { - t.Errorf("foo value should be 'one', got: %s", result.Value["foo"].Vstring) - } - - if result.Value["bar"].Vstring != "two" { - t.Errorf("bar value should be 'two', got: %s", result.Value["bar"].Vstring) - } -} - -func TestNestedType(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vfoo": "foo", - "vbar": map[string]interface{}{ - "vstring": "foo", - "vint": 42, - "vbool": true, - }, - } - - var result Nested - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err.Error()) - } - - if result.Vfoo != "foo" { - t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) - } - - if result.Vbar.Vstring != "foo" { - t.Errorf("vstring value should be 'foo': %#v", result.Vbar.Vstring) - } - - if result.Vbar.Vint != 42 { - t.Errorf("vint value should be 42: %#v", result.Vbar.Vint) - } - - if result.Vbar.Vbool != true { - t.Errorf("vbool value should be true: %#v", result.Vbar.Vbool) - } - - if result.Vbar.Vextra != "" { - t.Errorf("vextra value should be empty: %#v", result.Vbar.Vextra) - } -} - -func TestNestedTypePointer(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vfoo": "foo", - "vbar": &map[string]interface{}{ - "vstring": "foo", - "vint": 42, - "vbool": true, - }, - } - - var result NestedPointer - err := Decode(input, &result) - if err != nil { - t.Fatalf("got an err: %s", err.Error()) - } - - if result.Vfoo != "foo" { - t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) - } - - if result.Vbar.Vstring != "foo" { - t.Errorf("vstring value should be 'foo': %#v", result.Vbar.Vstring) - } - - if result.Vbar.Vint != 42 { - t.Errorf("vint value should be 42: %#v", result.Vbar.Vint) - } - - if result.Vbar.Vbool != true { - t.Errorf("vbool value should be true: %#v", result.Vbar.Vbool) - } - - if result.Vbar.Vextra != "" { - t.Errorf("vextra value should be empty: %#v", result.Vbar.Vextra) - } -} - -func TestSlice(t *testing.T) { - t.Parallel() - - inputStringSlice := map[string]interface{}{ - "vfoo": "foo", - "vbar": []string{"foo", "bar", "baz"}, - } - - inputStringSlicePointer := map[string]interface{}{ - "vfoo": "foo", - "vbar": &[]string{"foo", "bar", "baz"}, - } - - outputStringSlice := &Slice{ - "foo", - []string{"foo", "bar", "baz"}, - } - - testSliceInput(t, inputStringSlice, outputStringSlice) - testSliceInput(t, inputStringSlicePointer, outputStringSlice) -} - -func TestInvalidSlice(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vfoo": "foo", - "vbar": 42, - } - - result := Slice{} - err := Decode(input, &result) - if err == nil { - t.Errorf("expected failure") - } -} - -func TestSliceOfStruct(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "value": []map[string]interface{}{ - {"vstring": "one"}, - {"vstring": "two"}, - }, - } - - var result SliceOfStruct - err := Decode(input, &result) - if err != nil { - t.Fatalf("got unexpected error: %s", err) - } - - if len(result.Value) != 2 { - t.Fatalf("expected two values, got %d", len(result.Value)) - } - - if result.Value[0].Vstring != "one" { - t.Errorf("first value should be 'one', got: %s", result.Value[0].Vstring) - } - - if result.Value[1].Vstring != "two" { - t.Errorf("second value should be 'two', got: %s", result.Value[1].Vstring) - } -} - -func TestInvalidType(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": 42, - } - - var result Basic - err := Decode(input, &result) - if err == nil { - t.Fatal("error should exist") - } - - derr, ok := err.(*Error) - if !ok { - t.Fatalf("error should be kind of Error, instead: %#v", err) - } - - if derr.Errors[0] != "'Vstring' expected type 'string', got unconvertible type 'int'" { - t.Errorf("got unexpected error: %s", err) - } -} - -func TestMetadata(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vfoo": "foo", - "vbar": map[string]interface{}{ - "vstring": "foo", - "Vuint": 42, - "foo": "bar", - }, - "bar": "nil", - } - - var md Metadata - var result Nested - config := &DecoderConfig{ - Metadata: &md, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - t.Fatalf("err: %s", err) - } - - err = decoder.Decode(input) - if err != nil { - t.Fatalf("err: %s", err.Error()) - } - - expectedKeys := []string{"Vfoo", "Vbar.Vstring", "Vbar.Vuint", "Vbar"} - if !reflect.DeepEqual(md.Keys, expectedKeys) { - t.Fatalf("bad keys: %#v", md.Keys) - } - - expectedUnused := []string{"Vbar.foo", "bar"} - if !reflect.DeepEqual(md.Unused, expectedUnused) { - t.Fatalf("bad unused: %#v", md.Unused) - } -} - -func TestMetadata_Embedded(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "vstring": "foo", - "vunique": "bar", - } - - var md Metadata - var result EmbeddedSquash - config := &DecoderConfig{ - Metadata: &md, - Result: &result, - } - - decoder, err := NewDecoder(config) - if err != nil { - t.Fatalf("err: %s", err) - } - - err = decoder.Decode(input) - if err != nil { - t.Fatalf("err: %s", err.Error()) - } - - expectedKeys := []string{"Vstring", "Vunique"} - - sort.Strings(md.Keys) - if !reflect.DeepEqual(md.Keys, expectedKeys) { - t.Fatalf("bad keys: %#v", md.Keys) - } - - expectedUnused := []string{} - if !reflect.DeepEqual(md.Unused, expectedUnused) { - t.Fatalf("bad unused: %#v", md.Unused) - } -} - -func TestNonPtrValue(t *testing.T) { - t.Parallel() - - err := Decode(map[string]interface{}{}, Basic{}) - if err == nil { - t.Fatal("error should exist") - } - - if err.Error() != "result must be a pointer" { - t.Errorf("got unexpected error: %s", err) - } -} - -func TestTagged(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "foo": "bar", - "bar": "value", - } - - var result Tagged - err := Decode(input, &result) - if err != nil { - t.Fatalf("unexpected error: %s", err) - } - - if result.Value != "bar" { - t.Errorf("value should be 'bar', got: %#v", result.Value) - } - - if result.Extra != "value" { - t.Errorf("extra should be 'value', got: %#v", result.Extra) - } -} - -func TestWeakDecode(t *testing.T) { - t.Parallel() - - input := map[string]interface{}{ - "foo": "4", - "bar": "value", - } - - var result struct { - Foo int - Bar string - } - - if err := WeakDecode(input, &result); err != nil { - t.Fatalf("err: %s", err) - } - if result.Foo != 4 { - t.Fatalf("bad: %#v", result) - } - if result.Bar != "value" { - t.Fatalf("bad: %#v", result) - } -} - -func testSliceInput(t *testing.T, input map[string]interface{}, expected *Slice) { - var result Slice - err := Decode(input, &result) - if err != nil { - t.Fatalf("got error: %s", err) - } - - if result.Vfoo != expected.Vfoo { - t.Errorf("Vfoo expected '%s', got '%s'", expected.Vfoo, result.Vfoo) - } - - if result.Vbar == nil { - t.Fatalf("Vbar a slice, got '%#v'", result.Vbar) - } - - if len(result.Vbar) != len(expected.Vbar) { - t.Errorf("Vbar length should be %d, got %d", len(expected.Vbar), len(result.Vbar)) - } - - for i, v := range result.Vbar { - if v != expected.Vbar[i] { - t.Errorf( - "Vbar[%d] should be '%#v', got '%#v'", - i, expected.Vbar[i], v) - } - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/cgroups_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/cgroups_test.go deleted file mode 100644 index 2f702bc2e..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/cgroups_test.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux - -package cgroups - -import ( - "testing" -) - -func TestParseCgroups(t *testing.T) { - cgroups, err := ParseCgroupFile("/proc/self/cgroup") - if err != nil { - t.Fatal(err) - } - - if _, ok := cgroups["cpu"]; !ok { - t.Fail() - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio_test.go deleted file mode 100644 index 695739204..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/blkio_test.go +++ /dev/null @@ -1,636 +0,0 @@ -// +build linux - -package fs - -import ( - "strconv" - "testing" - - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/configs" -) - -const ( - sectorsRecursiveContents = `8:0 1024` - serviceBytesRecursiveContents = `8:0 Read 100 -8:0 Write 200 -8:0 Sync 300 -8:0 Async 500 -8:0 Total 500 -Total 500` - servicedRecursiveContents = `8:0 Read 10 -8:0 Write 40 -8:0 Sync 20 -8:0 Async 30 -8:0 Total 50 -Total 50` - queuedRecursiveContents = `8:0 Read 1 -8:0 Write 4 -8:0 Sync 2 -8:0 Async 3 -8:0 Total 5 -Total 5` - serviceTimeRecursiveContents = `8:0 Read 173959 -8:0 Write 0 -8:0 Sync 0 -8:0 Async 173959 -8:0 Total 17395 -Total 17395` - waitTimeRecursiveContents = `8:0 Read 15571 -8:0 Write 0 -8:0 Sync 0 -8:0 Async 15571 -8:0 Total 15571` - mergedRecursiveContents = `8:0 Read 5 -8:0 Write 10 -8:0 Sync 0 -8:0 Async 0 -8:0 Total 15 -Total 15` - timeRecursiveContents = `8:0 8` - throttleServiceBytes = `8:0 Read 11030528 -8:0 Write 23 -8:0 Sync 42 -8:0 Async 11030528 -8:0 Total 11030528 -252:0 Read 11030528 -252:0 Write 23 -252:0 Sync 42 -252:0 Async 11030528 -252:0 Total 11030528 -Total 22061056` - throttleServiced = `8:0 Read 164 -8:0 Write 23 -8:0 Sync 42 -8:0 Async 164 -8:0 Total 164 -252:0 Read 164 -252:0 Write 23 -252:0 Sync 42 -252:0 Async 164 -252:0 Total 164 -Total 328` -) - -func appendBlkioStatEntry(blkioStatEntries *[]cgroups.BlkioStatEntry, major, minor, value uint64, op string) { - *blkioStatEntries = append(*blkioStatEntries, cgroups.BlkioStatEntry{Major: major, Minor: minor, Value: value, Op: op}) -} - -func TestBlkioSetWeight(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - weightBefore = 100 - weightAfter = 200 - ) - - helper.writeFileContents(map[string]string{ - "blkio.weight": strconv.Itoa(weightBefore), - }) - - helper.CgroupData.config.Resources.BlkioWeight = weightAfter - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "blkio.weight") - if err != nil { - t.Fatalf("Failed to parse blkio.weight - %s", err) - } - - if value != weightAfter { - t.Fatal("Got the wrong value, set blkio.weight failed.") - } -} - -func TestBlkioSetWeightDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - weightDeviceBefore = "8:0 400" - ) - - wd := configs.NewWeightDevice(8, 0, 500, 0) - weightDeviceAfter := wd.WeightString() - - helper.writeFileContents(map[string]string{ - "blkio.weight_device": weightDeviceBefore, - }) - - helper.CgroupData.config.Resources.BlkioWeightDevice = []*configs.WeightDevice{wd} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.weight_device") - if err != nil { - t.Fatalf("Failed to parse blkio.weight_device - %s", err) - } - - if value != weightDeviceAfter { - t.Fatal("Got the wrong value, set blkio.weight_device failed.") - } -} - -// regression #274 -func TestBlkioSetMultipleWeightDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - weightDeviceBefore = "8:0 400" - ) - - wd1 := configs.NewWeightDevice(8, 0, 500, 0) - wd2 := configs.NewWeightDevice(8, 16, 500, 0) - // we cannot actually set and check both because normal ioutil.WriteFile - // when writing to cgroup file will overwrite the whole file content instead - // of updating it as the kernel is doing. Just check the second device - // is present will suffice for the test to ensure multiple writes are done. - weightDeviceAfter := wd2.WeightString() - - helper.writeFileContents(map[string]string{ - "blkio.weight_device": weightDeviceBefore, - }) - - helper.CgroupData.config.Resources.BlkioWeightDevice = []*configs.WeightDevice{wd1, wd2} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.weight_device") - if err != nil { - t.Fatalf("Failed to parse blkio.weight_device - %s", err) - } - - if value != weightDeviceAfter { - t.Fatal("Got the wrong value, set blkio.weight_device failed.") - } -} - -func TestBlkioStats(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } - - // Verify expected stats. - expectedStats := cgroups.BlkioStats{} - appendBlkioStatEntry(&expectedStats.SectorsRecursive, 8, 0, 1024, "") - - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 100, "Read") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 200, "Write") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 300, "Sync") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 500, "Async") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 500, "Total") - - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 10, "Read") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 40, "Write") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 20, "Sync") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 30, "Async") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 50, "Total") - - appendBlkioStatEntry(&expectedStats.IoQueuedRecursive, 8, 0, 1, "Read") - appendBlkioStatEntry(&expectedStats.IoQueuedRecursive, 8, 0, 4, "Write") - appendBlkioStatEntry(&expectedStats.IoQueuedRecursive, 8, 0, 2, "Sync") - appendBlkioStatEntry(&expectedStats.IoQueuedRecursive, 8, 0, 3, "Async") - appendBlkioStatEntry(&expectedStats.IoQueuedRecursive, 8, 0, 5, "Total") - - appendBlkioStatEntry(&expectedStats.IoServiceTimeRecursive, 8, 0, 173959, "Read") - appendBlkioStatEntry(&expectedStats.IoServiceTimeRecursive, 8, 0, 0, "Write") - appendBlkioStatEntry(&expectedStats.IoServiceTimeRecursive, 8, 0, 0, "Sync") - appendBlkioStatEntry(&expectedStats.IoServiceTimeRecursive, 8, 0, 173959, "Async") - appendBlkioStatEntry(&expectedStats.IoServiceTimeRecursive, 8, 0, 17395, "Total") - - appendBlkioStatEntry(&expectedStats.IoWaitTimeRecursive, 8, 0, 15571, "Read") - appendBlkioStatEntry(&expectedStats.IoWaitTimeRecursive, 8, 0, 0, "Write") - appendBlkioStatEntry(&expectedStats.IoWaitTimeRecursive, 8, 0, 0, "Sync") - appendBlkioStatEntry(&expectedStats.IoWaitTimeRecursive, 8, 0, 15571, "Async") - appendBlkioStatEntry(&expectedStats.IoWaitTimeRecursive, 8, 0, 15571, "Total") - - appendBlkioStatEntry(&expectedStats.IoMergedRecursive, 8, 0, 5, "Read") - appendBlkioStatEntry(&expectedStats.IoMergedRecursive, 8, 0, 10, "Write") - appendBlkioStatEntry(&expectedStats.IoMergedRecursive, 8, 0, 0, "Sync") - appendBlkioStatEntry(&expectedStats.IoMergedRecursive, 8, 0, 0, "Async") - appendBlkioStatEntry(&expectedStats.IoMergedRecursive, 8, 0, 15, "Total") - - appendBlkioStatEntry(&expectedStats.IoTimeRecursive, 8, 0, 8, "") - - expectBlkioStatsEquals(t, expectedStats, actualStats.BlkioStats) -} - -func TestBlkioStatsNoSectorsFile(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoServiceBytesFile(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoServicedFile(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoQueuedFile(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoServiceTimeFile(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode.") - } - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoWaitTimeFile(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode.") - } - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoMergedFile(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode.") - } - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsNoTimeFile(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode.") - } - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": serviceBytesRecursiveContents, - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatalf("Failed unexpectedly: %s", err) - } -} - -func TestBlkioStatsUnexpectedNumberOfFields(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": "8:0 Read 100 100", - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected to fail, but did not") - } -} - -func TestBlkioStatsUnexpectedFieldType(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": "8:0 Read Write", - "blkio.io_serviced_recursive": servicedRecursiveContents, - "blkio.io_queued_recursive": queuedRecursiveContents, - "blkio.sectors_recursive": sectorsRecursiveContents, - "blkio.io_service_time_recursive": serviceTimeRecursiveContents, - "blkio.io_wait_time_recursive": waitTimeRecursiveContents, - "blkio.io_merged_recursive": mergedRecursiveContents, - "blkio.time_recursive": timeRecursiveContents, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected to fail, but did not") - } -} - -func TestNonCFQBlkioStats(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "blkio.io_service_bytes_recursive": "", - "blkio.io_serviced_recursive": "", - "blkio.io_queued_recursive": "", - "blkio.sectors_recursive": "", - "blkio.io_service_time_recursive": "", - "blkio.io_wait_time_recursive": "", - "blkio.io_merged_recursive": "", - "blkio.time_recursive": "", - "blkio.throttle.io_service_bytes": throttleServiceBytes, - "blkio.throttle.io_serviced": throttleServiced, - }) - - blkio := &BlkioGroup{} - actualStats := *cgroups.NewStats() - err := blkio.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } - - // Verify expected stats. - expectedStats := cgroups.BlkioStats{} - - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 11030528, "Read") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 23, "Write") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 42, "Sync") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 11030528, "Async") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 8, 0, 11030528, "Total") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 252, 0, 11030528, "Read") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 252, 0, 23, "Write") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 252, 0, 42, "Sync") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 252, 0, 11030528, "Async") - appendBlkioStatEntry(&expectedStats.IoServiceBytesRecursive, 252, 0, 11030528, "Total") - - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 164, "Read") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 23, "Write") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 42, "Sync") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 164, "Async") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 8, 0, 164, "Total") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 252, 0, 164, "Read") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 252, 0, 23, "Write") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 252, 0, 42, "Sync") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 252, 0, 164, "Async") - appendBlkioStatEntry(&expectedStats.IoServicedRecursive, 252, 0, 164, "Total") - - expectBlkioStatsEquals(t, expectedStats, actualStats.BlkioStats) -} - -func TestBlkioSetThrottleReadBpsDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - throttleBefore = `8:0 1024` - ) - - td := configs.NewThrottleDevice(8, 0, 2048) - throttleAfter := td.String() - - helper.writeFileContents(map[string]string{ - "blkio.throttle.read_bps_device": throttleBefore, - }) - - helper.CgroupData.config.Resources.BlkioThrottleReadBpsDevice = []*configs.ThrottleDevice{td} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.throttle.read_bps_device") - if err != nil { - t.Fatalf("Failed to parse blkio.throttle.read_bps_device - %s", err) - } - - if value != throttleAfter { - t.Fatal("Got the wrong value, set blkio.throttle.read_bps_device failed.") - } -} -func TestBlkioSetThrottleWriteBpsDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - throttleBefore = `8:0 1024` - ) - - td := configs.NewThrottleDevice(8, 0, 2048) - throttleAfter := td.String() - - helper.writeFileContents(map[string]string{ - "blkio.throttle.write_bps_device": throttleBefore, - }) - - helper.CgroupData.config.Resources.BlkioThrottleWriteBpsDevice = []*configs.ThrottleDevice{td} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.throttle.write_bps_device") - if err != nil { - t.Fatalf("Failed to parse blkio.throttle.write_bps_device - %s", err) - } - - if value != throttleAfter { - t.Fatal("Got the wrong value, set blkio.throttle.write_bps_device failed.") - } -} -func TestBlkioSetThrottleReadIOpsDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - throttleBefore = `8:0 1024` - ) - - td := configs.NewThrottleDevice(8, 0, 2048) - throttleAfter := td.String() - - helper.writeFileContents(map[string]string{ - "blkio.throttle.read_iops_device": throttleBefore, - }) - - helper.CgroupData.config.Resources.BlkioThrottleReadIOPSDevice = []*configs.ThrottleDevice{td} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.throttle.read_iops_device") - if err != nil { - t.Fatalf("Failed to parse blkio.throttle.read_iops_device - %s", err) - } - - if value != throttleAfter { - t.Fatal("Got the wrong value, set blkio.throttle.read_iops_device failed.") - } -} -func TestBlkioSetThrottleWriteIOpsDevice(t *testing.T) { - helper := NewCgroupTestUtil("blkio", t) - defer helper.cleanup() - - const ( - throttleBefore = `8:0 1024` - ) - - td := configs.NewThrottleDevice(8, 0, 2048) - throttleAfter := td.String() - - helper.writeFileContents(map[string]string{ - "blkio.throttle.write_iops_device": throttleBefore, - }) - - helper.CgroupData.config.Resources.BlkioThrottleWriteIOPSDevice = []*configs.ThrottleDevice{td} - blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "blkio.throttle.write_iops_device") - if err != nil { - t.Fatalf("Failed to parse blkio.throttle.write_iops_device - %s", err) - } - - if value != throttleAfter { - t.Fatal("Got the wrong value, set blkio.throttle.write_iops_device failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu_test.go deleted file mode 100644 index 554fd5e85..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// +build linux - -package fs - -import ( - "fmt" - "strconv" - "testing" - - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -func TestCpuSetShares(t *testing.T) { - helper := NewCgroupTestUtil("cpu", t) - defer helper.cleanup() - - const ( - sharesBefore = 1024 - sharesAfter = 512 - ) - - helper.writeFileContents(map[string]string{ - "cpu.shares": strconv.Itoa(sharesBefore), - }) - - helper.CgroupData.config.Resources.CpuShares = sharesAfter - cpu := &CpuGroup{} - if err := cpu.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "cpu.shares") - if err != nil { - t.Fatalf("Failed to parse cpu.shares - %s", err) - } - - if value != sharesAfter { - t.Fatal("Got the wrong value, set cpu.shares failed.") - } -} - -func TestCpuSetBandWidth(t *testing.T) { - helper := NewCgroupTestUtil("cpu", t) - defer helper.cleanup() - - const ( - quotaBefore = 8000 - quotaAfter = 5000 - periodBefore = 10000 - periodAfter = 7000 - rtRuntimeBefore = 8000 - rtRuntimeAfter = 5000 - rtPeriodBefore = 10000 - rtPeriodAfter = 7000 - ) - - helper.writeFileContents(map[string]string{ - "cpu.cfs_quota_us": strconv.Itoa(quotaBefore), - "cpu.cfs_period_us": strconv.Itoa(periodBefore), - "cpu.rt_runtime_us": strconv.Itoa(rtRuntimeBefore), - "cpu.rt_period_us": strconv.Itoa(rtPeriodBefore), - }) - - helper.CgroupData.config.Resources.CpuQuota = quotaAfter - helper.CgroupData.config.Resources.CpuPeriod = periodAfter - helper.CgroupData.config.Resources.CpuRtRuntime = rtRuntimeAfter - helper.CgroupData.config.Resources.CpuRtPeriod = rtPeriodAfter - cpu := &CpuGroup{} - if err := cpu.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - quota, err := getCgroupParamUint(helper.CgroupPath, "cpu.cfs_quota_us") - if err != nil { - t.Fatalf("Failed to parse cpu.cfs_quota_us - %s", err) - } - if quota != quotaAfter { - t.Fatal("Got the wrong value, set cpu.cfs_quota_us failed.") - } - - period, err := getCgroupParamUint(helper.CgroupPath, "cpu.cfs_period_us") - if err != nil { - t.Fatalf("Failed to parse cpu.cfs_period_us - %s", err) - } - if period != periodAfter { - t.Fatal("Got the wrong value, set cpu.cfs_period_us failed.") - } - rtRuntime, err := getCgroupParamUint(helper.CgroupPath, "cpu.rt_runtime_us") - if err != nil { - t.Fatalf("Failed to parse cpu.rt_runtime_us - %s", err) - } - if rtRuntime != rtRuntimeAfter { - t.Fatal("Got the wrong value, set cpu.rt_runtime_us failed.") - } - rtPeriod, err := getCgroupParamUint(helper.CgroupPath, "cpu.rt_period_us") - if err != nil { - t.Fatalf("Failed to parse cpu.rt_period_us - %s", err) - } - if rtPeriod != rtPeriodAfter { - t.Fatal("Got the wrong value, set cpu.rt_period_us failed.") - } -} - -func TestCpuStats(t *testing.T) { - helper := NewCgroupTestUtil("cpu", t) - defer helper.cleanup() - - const ( - kNrPeriods = 2000 - kNrThrottled = 200 - kThrottledTime = uint64(18446744073709551615) - ) - - cpuStatContent := fmt.Sprintf("nr_periods %d\n nr_throttled %d\n throttled_time %d\n", - kNrPeriods, kNrThrottled, kThrottledTime) - helper.writeFileContents(map[string]string{ - "cpu.stat": cpuStatContent, - }) - - cpu := &CpuGroup{} - actualStats := *cgroups.NewStats() - err := cpu.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } - - expectedStats := cgroups.ThrottlingData{ - Periods: kNrPeriods, - ThrottledPeriods: kNrThrottled, - ThrottledTime: kThrottledTime} - - expectThrottlingDataEquals(t, expectedStats, actualStats.CpuStats.ThrottlingData) -} - -func TestNoCpuStatFile(t *testing.T) { - helper := NewCgroupTestUtil("cpu", t) - defer helper.cleanup() - - cpu := &CpuGroup{} - actualStats := *cgroups.NewStats() - err := cpu.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal("Expected not to fail, but did") - } -} - -func TestInvalidCpuStat(t *testing.T) { - helper := NewCgroupTestUtil("cpu", t) - defer helper.cleanup() - cpuStatContent := `nr_periods 2000 - nr_throttled 200 - throttled_time fortytwo` - helper.writeFileContents(map[string]string{ - "cpu.stat": cpuStatContent, - }) - - cpu := &CpuGroup{} - actualStats := *cgroups.NewStats() - err := cpu.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failed stat parsing.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset_test.go deleted file mode 100644 index 0f929151f..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpuset_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// +build linux - -package fs - -import ( - "testing" -) - -func TestCpusetSetCpus(t *testing.T) { - helper := NewCgroupTestUtil("cpuset", t) - defer helper.cleanup() - - const ( - cpusBefore = "0" - cpusAfter = "1-3" - ) - - helper.writeFileContents(map[string]string{ - "cpuset.cpus": cpusBefore, - }) - - helper.CgroupData.config.Resources.CpusetCpus = cpusAfter - cpuset := &CpusetGroup{} - if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "cpuset.cpus") - if err != nil { - t.Fatalf("Failed to parse cpuset.cpus - %s", err) - } - - if value != cpusAfter { - t.Fatal("Got the wrong value, set cpuset.cpus failed.") - } -} - -func TestCpusetSetMems(t *testing.T) { - helper := NewCgroupTestUtil("cpuset", t) - defer helper.cleanup() - - const ( - memsBefore = "0" - memsAfter = "1" - ) - - helper.writeFileContents(map[string]string{ - "cpuset.mems": memsBefore, - }) - - helper.CgroupData.config.Resources.CpusetMems = memsAfter - cpuset := &CpusetGroup{} - if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "cpuset.mems") - if err != nil { - t.Fatalf("Failed to parse cpuset.mems - %s", err) - } - - if value != memsAfter { - t.Fatal("Got the wrong value, set cpuset.mems failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices_test.go deleted file mode 100644 index ee44084ee..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/devices_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// +build linux - -package fs - -import ( - "testing" - - "github.com/opencontainers/runc/libcontainer/configs" -) - -var ( - allowedDevices = []*configs.Device{ - { - Path: "/dev/zero", - Type: 'c', - Major: 1, - Minor: 5, - Permissions: "rwm", - FileMode: 0666, - }, - } - allowedList = "c 1:5 rwm" - deniedDevices = []*configs.Device{ - { - Path: "/dev/null", - Type: 'c', - Major: 1, - Minor: 3, - Permissions: "rwm", - FileMode: 0666, - }, - } - deniedList = "c 1:3 rwm" -) - -func TestDevicesSetAllow(t *testing.T) { - helper := NewCgroupTestUtil("devices", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "devices.deny": "a", - }) - - helper.CgroupData.config.Resources.AllowAllDevices = false - helper.CgroupData.config.Resources.AllowedDevices = allowedDevices - devices := &DevicesGroup{} - if err := devices.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "devices.allow") - if err != nil { - t.Fatalf("Failed to parse devices.allow - %s", err) - } - - if value != allowedList { - t.Fatal("Got the wrong value, set devices.allow failed.") - } -} - -func TestDevicesSetDeny(t *testing.T) { - helper := NewCgroupTestUtil("devices", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "devices.allow": "a", - }) - - helper.CgroupData.config.Resources.AllowAllDevices = true - helper.CgroupData.config.Resources.DeniedDevices = deniedDevices - devices := &DevicesGroup{} - if err := devices.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "devices.deny") - if err != nil { - t.Fatalf("Failed to parse devices.deny - %s", err) - } - - if value != deniedList { - t.Fatal("Got the wrong value, set devices.deny failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer_test.go deleted file mode 100644 index 77708db9a..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/freezer_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build linux - -package fs - -import ( - "testing" - - "github.com/opencontainers/runc/libcontainer/configs" -) - -func TestFreezerSetState(t *testing.T) { - helper := NewCgroupTestUtil("freezer", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "freezer.state": string(configs.Frozen), - }) - - helper.CgroupData.config.Resources.Freezer = configs.Thawed - freezer := &FreezerGroup{} - if err := freezer.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "freezer.state") - if err != nil { - t.Fatalf("Failed to parse freezer.state - %s", err) - } - if value != string(configs.Thawed) { - t.Fatal("Got the wrong value, set freezer.state failed.") - } -} - -func TestFreezerSetInvalidState(t *testing.T) { - helper := NewCgroupTestUtil("freezer", t) - defer helper.cleanup() - - const ( - invalidArg configs.FreezerState = "Invalid" - ) - - helper.CgroupData.config.Resources.Freezer = invalidArg - freezer := &FreezerGroup{} - if err := freezer.Set(helper.CgroupPath, helper.CgroupData.config); err == nil { - t.Fatal("Failed to return invalid argument error") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb_test.go deleted file mode 100644 index 2d41c4eb2..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/hugetlb_test.go +++ /dev/null @@ -1,154 +0,0 @@ -// +build linux - -package fs - -import ( - "fmt" - "strconv" - "testing" - - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/configs" -) - -const ( - hugetlbUsageContents = "128\n" - hugetlbMaxUsageContents = "256\n" - hugetlbFailcnt = "100\n" -) - -var ( - usage = "hugetlb.%s.usage_in_bytes" - limit = "hugetlb.%s.limit_in_bytes" - maxUsage = "hugetlb.%s.max_usage_in_bytes" - failcnt = "hugetlb.%s.failcnt" -) - -func TestHugetlbSetHugetlb(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - - const ( - hugetlbBefore = 256 - hugetlbAfter = 512 - ) - - for _, pageSize := range HugePageSizes { - helper.writeFileContents(map[string]string{ - fmt.Sprintf(limit, pageSize): strconv.Itoa(hugetlbBefore), - }) - } - - for _, pageSize := range HugePageSizes { - helper.CgroupData.config.Resources.HugetlbLimit = []*configs.HugepageLimit{ - { - Pagesize: pageSize, - Limit: hugetlbAfter, - }, - } - hugetlb := &HugetlbGroup{} - if err := hugetlb.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - } - - for _, pageSize := range HugePageSizes { - limit := fmt.Sprintf(limit, pageSize) - value, err := getCgroupParamUint(helper.CgroupPath, limit) - if err != nil { - t.Fatalf("Failed to parse %s - %s", limit, err) - } - if value != hugetlbAfter { - t.Fatalf("Set hugetlb.limit_in_bytes failed. Expected: %v, Got: %v", hugetlbAfter, value) - } - } -} - -func TestHugetlbStats(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - for _, pageSize := range HugePageSizes { - helper.writeFileContents(map[string]string{ - fmt.Sprintf(usage, pageSize): hugetlbUsageContents, - fmt.Sprintf(maxUsage, pageSize): hugetlbMaxUsageContents, - fmt.Sprintf(failcnt, pageSize): hugetlbFailcnt, - }) - } - - hugetlb := &HugetlbGroup{} - actualStats := *cgroups.NewStats() - err := hugetlb.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } - expectedStats := cgroups.HugetlbStats{Usage: 128, MaxUsage: 256, Failcnt: 100} - for _, pageSize := range HugePageSizes { - expectHugetlbStatEquals(t, expectedStats, actualStats.HugetlbStats[pageSize]) - } -} - -func TestHugetlbStatsNoUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - maxUsage: hugetlbMaxUsageContents, - }) - - hugetlb := &HugetlbGroup{} - actualStats := *cgroups.NewStats() - err := hugetlb.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestHugetlbStatsNoMaxUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - for _, pageSize := range HugePageSizes { - helper.writeFileContents(map[string]string{ - fmt.Sprintf(usage, pageSize): hugetlbUsageContents, - }) - } - - hugetlb := &HugetlbGroup{} - actualStats := *cgroups.NewStats() - err := hugetlb.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestHugetlbStatsBadUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - for _, pageSize := range HugePageSizes { - helper.writeFileContents(map[string]string{ - fmt.Sprintf(usage, pageSize): "bad", - maxUsage: hugetlbMaxUsageContents, - }) - } - - hugetlb := &HugetlbGroup{} - actualStats := *cgroups.NewStats() - err := hugetlb.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestHugetlbStatsBadMaxUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("hugetlb", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - usage: hugetlbUsageContents, - maxUsage: "bad", - }) - - hugetlb := &HugetlbGroup{} - actualStats := *cgroups.NewStats() - err := hugetlb.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory_test.go deleted file mode 100644 index 9464599b0..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory_test.go +++ /dev/null @@ -1,294 +0,0 @@ -// +build linux - -package fs - -import ( - "strconv" - "testing" - - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -const ( - memoryStatContents = `cache 512 -rss 1024` - memoryUsageContents = "2048\n" - memoryMaxUsageContents = "4096\n" - memoryFailcnt = "100\n" -) - -func TestMemorySetMemory(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - - const ( - memoryBefore = 314572800 // 300M - memoryAfter = 524288000 // 500M - reservationBefore = 209715200 // 200M - reservationAfter = 314572800 // 300M - ) - - helper.writeFileContents(map[string]string{ - "memory.limit_in_bytes": strconv.Itoa(memoryBefore), - "memory.soft_limit_in_bytes": strconv.Itoa(reservationBefore), - }) - - helper.CgroupData.config.Resources.Memory = memoryAfter - helper.CgroupData.config.Resources.MemoryReservation = reservationAfter - memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "memory.limit_in_bytes") - if err != nil { - t.Fatalf("Failed to parse memory.limit_in_bytes - %s", err) - } - if value != memoryAfter { - t.Fatal("Got the wrong value, set memory.limit_in_bytes failed.") - } - - value, err = getCgroupParamUint(helper.CgroupPath, "memory.soft_limit_in_bytes") - if err != nil { - t.Fatalf("Failed to parse memory.soft_limit_in_bytes - %s", err) - } - if value != reservationAfter { - t.Fatal("Got the wrong value, set memory.soft_limit_in_bytes failed.") - } -} - -func TestMemorySetMemoryswap(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - - const ( - memoryswapBefore = 314572800 // 300M - memoryswapAfter = 524288000 // 500M - ) - - helper.writeFileContents(map[string]string{ - "memory.memsw.limit_in_bytes": strconv.Itoa(memoryswapBefore), - }) - - helper.CgroupData.config.Resources.MemorySwap = memoryswapAfter - memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "memory.memsw.limit_in_bytes") - if err != nil { - t.Fatalf("Failed to parse memory.memsw.limit_in_bytes - %s", err) - } - if value != memoryswapAfter { - t.Fatal("Got the wrong value, set memory.memsw.limit_in_bytes failed.") - } -} - -func TestMemorySetKernelMemory(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - - const ( - kernelMemoryBefore = 314572800 // 300M - kernelMemoryAfter = 524288000 // 500M - ) - - helper.writeFileContents(map[string]string{ - "memory.kmem.limit_in_bytes": strconv.Itoa(kernelMemoryBefore), - }) - - helper.CgroupData.config.Resources.KernelMemory = kernelMemoryAfter - memory := &MemoryGroup{} - if err := memory.SetKernelMemory(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "memory.kmem.limit_in_bytes") - if err != nil { - t.Fatalf("Failed to parse memory.kmem.limit_in_bytes - %s", err) - } - if value != kernelMemoryAfter { - t.Fatal("Got the wrong value, set memory.kmem.limit_in_bytes failed.") - } -} - -func TestMemorySetMemorySwappinessDefault(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - - const ( - swappinessBefore = 60 //deafult is 60 - swappinessAfter = 0 - ) - - helper.writeFileContents(map[string]string{ - "memory.swappiness": strconv.Itoa(swappinessBefore), - }) - - helper.CgroupData.config.Resources.Memory = swappinessAfter - memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "memory.swappiness") - if err != nil { - t.Fatalf("Failed to parse memory.swappiness - %s", err) - } - if value != swappinessAfter { - t.Fatal("Got the wrong value, set memory.swappiness failed.") - } -} - -func TestMemoryStats(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": memoryStatContents, - "memory.usage_in_bytes": memoryUsageContents, - "memory.max_usage_in_bytes": memoryMaxUsageContents, - "memory.failcnt": memoryFailcnt, - "memory.memsw.usage_in_bytes": memoryUsageContents, - "memory.memsw.max_usage_in_bytes": memoryMaxUsageContents, - "memory.memsw.failcnt": memoryFailcnt, - "memory.kmem.usage_in_bytes": memoryUsageContents, - "memory.kmem.max_usage_in_bytes": memoryMaxUsageContents, - "memory.kmem.failcnt": memoryFailcnt, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } - expectedStats := cgroups.MemoryStats{Cache: 512, Usage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100}, SwapUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100}, KernelUsage: cgroups.MemoryData{Usage: 2048, MaxUsage: 4096, Failcnt: 100}, Stats: map[string]uint64{"cache": 512, "rss": 1024}} - expectMemoryStatEquals(t, expectedStats, actualStats.MemoryStats) -} - -func TestMemoryStatsNoStatFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.usage_in_bytes": memoryUsageContents, - "memory.max_usage_in_bytes": memoryMaxUsageContents, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err != nil { - t.Fatal(err) - } -} - -func TestMemoryStatsNoUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": memoryStatContents, - "memory.max_usage_in_bytes": memoryMaxUsageContents, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestMemoryStatsNoMaxUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": memoryStatContents, - "memory.usage_in_bytes": memoryUsageContents, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestMemoryStatsBadStatFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": "rss rss", - "memory.usage_in_bytes": memoryUsageContents, - "memory.max_usage_in_bytes": memoryMaxUsageContents, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestMemoryStatsBadUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": memoryStatContents, - "memory.usage_in_bytes": "bad", - "memory.max_usage_in_bytes": memoryMaxUsageContents, - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestMemoryStatsBadMaxUsageFile(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - helper.writeFileContents(map[string]string{ - "memory.stat": memoryStatContents, - "memory.usage_in_bytes": memoryUsageContents, - "memory.max_usage_in_bytes": "bad", - }) - - memory := &MemoryGroup{} - actualStats := *cgroups.NewStats() - err := memory.GetStats(helper.CgroupPath, &actualStats) - if err == nil { - t.Fatal("Expected failure") - } -} - -func TestMemorySetOomControl(t *testing.T) { - helper := NewCgroupTestUtil("memory", t) - defer helper.cleanup() - - const ( - oom_kill_disable = 1 // disable oom killer, default is 0 - ) - - helper.writeFileContents(map[string]string{ - "memory.oom_control": strconv.Itoa(oom_kill_disable), - }) - - memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "memory.oom_control") - if err != nil { - t.Fatalf("Failed to parse memory.oom_control - %s", err) - } - - if value != oom_kill_disable { - t.Fatalf("Got the wrong value, set memory.oom_control failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_cls_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_cls_test.go deleted file mode 100644 index 974bd9d88..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_cls_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build linux - -package fs - -import ( - "testing" -) - -const ( - classidBefore = "0x100002" - classidAfter = "0x100001" -) - -func TestNetClsSetClassid(t *testing.T) { - helper := NewCgroupTestUtil("net_cls", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "net_cls.classid": classidBefore, - }) - - helper.CgroupData.config.Resources.NetClsClassid = classidAfter - netcls := &NetClsGroup{} - if err := netcls.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - // As we are in mock environment, we can't get correct value of classid from - // net_cls.classid. - // So. we just judge if we successfully write classid into file - value, err := getCgroupParamString(helper.CgroupPath, "net_cls.classid") - if err != nil { - t.Fatalf("Failed to parse net_cls.classid - %s", err) - } - if value != classidAfter { - t.Fatal("Got the wrong value, set net_cls.classid failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_prio_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_prio_test.go deleted file mode 100644 index efbf0639a..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/net_prio_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build linux - -package fs - -import ( - "strings" - "testing" - - "github.com/opencontainers/runc/libcontainer/configs" -) - -var ( - prioMap = []*configs.IfPrioMap{ - { - Interface: "test", - Priority: 5, - }, - } -) - -func TestNetPrioSetIfPrio(t *testing.T) { - helper := NewCgroupTestUtil("net_prio", t) - defer helper.cleanup() - - helper.CgroupData.config.Resources.NetPrioIfpriomap = prioMap - netPrio := &NetPrioGroup{} - if err := netPrio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "net_prio.ifpriomap") - if err != nil { - t.Fatalf("Failed to parse net_prio.ifpriomap - %s", err) - } - if !strings.Contains(value, "test 5") { - t.Fatal("Got the wrong value, set net_prio.ifpriomap failed.") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/pids_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/pids_test.go deleted file mode 100644 index 06b11927a..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/pids_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// +build linux - -package fs - -import ( - "strconv" - "testing" - - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -const ( - maxUnlimited = -1 - maxLimited = 1024 -) - -func TestPidsSetMax(t *testing.T) { - helper := NewCgroupTestUtil("pids", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "pids.max": "max", - }) - - helper.CgroupData.config.Resources.PidsLimit = maxLimited - pids := &PidsGroup{} - if err := pids.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamUint(helper.CgroupPath, "pids.max") - if err != nil { - t.Fatalf("Failed to parse pids.max - %s", err) - } - - if value != maxLimited { - t.Fatalf("Expected %d, got %d for setting pids.max - limited", maxLimited, value) - } -} - -func TestPidsSetUnlimited(t *testing.T) { - helper := NewCgroupTestUtil("pids", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "pids.max": strconv.Itoa(maxLimited), - }) - - helper.CgroupData.config.Resources.PidsLimit = maxUnlimited - pids := &PidsGroup{} - if err := pids.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { - t.Fatal(err) - } - - value, err := getCgroupParamString(helper.CgroupPath, "pids.max") - if err != nil { - t.Fatalf("Failed to parse pids.max - %s", err) - } - - if value != "max" { - t.Fatalf("Expected %s, got %s for setting pids.max - unlimited", "max", value) - } -} - -func TestPidsStats(t *testing.T) { - helper := NewCgroupTestUtil("pids", t) - defer helper.cleanup() - - helper.writeFileContents(map[string]string{ - "pids.current": strconv.Itoa(1337), - "pids.max": strconv.Itoa(maxLimited), - }) - - pids := &PidsGroup{} - stats := *cgroups.NewStats() - if err := pids.GetStats(helper.CgroupPath, &stats); err != nil { - t.Fatal(err) - } - - if stats.PidsStats.Current != 1337 { - t.Fatalf("Expected %d, got %d for pids.current", 1337, stats.PidsStats.Current) - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/stats_util_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/stats_util_test.go deleted file mode 100644 index b1777cc0a..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/stats_util_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// +build linux - -package fs - -import ( - "fmt" - "testing" - - "github.com/Sirupsen/logrus" - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -func blkioStatEntryEquals(expected, actual []cgroups.BlkioStatEntry) error { - if len(expected) != len(actual) { - return fmt.Errorf("blkioStatEntries length do not match") - } - for i, expValue := range expected { - actValue := actual[i] - if expValue != actValue { - return fmt.Errorf("Expected blkio stat entry %v but found %v", expValue, actValue) - } - } - return nil -} - -func expectBlkioStatsEquals(t *testing.T, expected, actual cgroups.BlkioStats) { - if err := blkioStatEntryEquals(expected.IoServiceBytesRecursive, actual.IoServiceBytesRecursive); err != nil { - logrus.Printf("blkio IoServiceBytesRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoServicedRecursive, actual.IoServicedRecursive); err != nil { - logrus.Printf("blkio IoServicedRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoQueuedRecursive, actual.IoQueuedRecursive); err != nil { - logrus.Printf("blkio IoQueuedRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.SectorsRecursive, actual.SectorsRecursive); err != nil { - logrus.Printf("blkio SectorsRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoServiceTimeRecursive, actual.IoServiceTimeRecursive); err != nil { - logrus.Printf("blkio IoServiceTimeRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoWaitTimeRecursive, actual.IoWaitTimeRecursive); err != nil { - logrus.Printf("blkio IoWaitTimeRecursive do not match - %s\n", err) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoMergedRecursive, actual.IoMergedRecursive); err != nil { - logrus.Printf("blkio IoMergedRecursive do not match - %v vs %v\n", expected.IoMergedRecursive, actual.IoMergedRecursive) - t.Fail() - } - - if err := blkioStatEntryEquals(expected.IoTimeRecursive, actual.IoTimeRecursive); err != nil { - logrus.Printf("blkio IoTimeRecursive do not match - %s\n", err) - t.Fail() - } -} - -func expectThrottlingDataEquals(t *testing.T, expected, actual cgroups.ThrottlingData) { - if expected != actual { - logrus.Printf("Expected throttling data %v but found %v\n", expected, actual) - t.Fail() - } -} - -func expectHugetlbStatEquals(t *testing.T, expected, actual cgroups.HugetlbStats) { - if expected != actual { - logrus.Printf("Expected hugetlb stats %v but found %v\n", expected, actual) - t.Fail() - } -} - -func expectMemoryStatEquals(t *testing.T, expected, actual cgroups.MemoryStats) { - expectMemoryDataEquals(t, expected.Usage, actual.Usage) - expectMemoryDataEquals(t, expected.SwapUsage, actual.SwapUsage) - expectMemoryDataEquals(t, expected.KernelUsage, actual.KernelUsage) - - for key, expValue := range expected.Stats { - actValue, ok := actual.Stats[key] - if !ok { - logrus.Printf("Expected memory stat key %s not found\n", key) - t.Fail() - } - if expValue != actValue { - logrus.Printf("Expected memory stat value %d but found %d\n", expValue, actValue) - t.Fail() - } - } -} - -func expectMemoryDataEquals(t *testing.T, expected, actual cgroups.MemoryData) { - if expected.Usage != actual.Usage { - logrus.Printf("Expected memory usage %d but found %d\n", expected.Usage, actual.Usage) - t.Fail() - } - if expected.MaxUsage != actual.MaxUsage { - logrus.Printf("Expected memory max usage %d but found %d\n", expected.MaxUsage, actual.MaxUsage) - t.Fail() - } - if expected.Failcnt != actual.Failcnt { - logrus.Printf("Expected memory failcnt %d but found %d\n", expected.Failcnt, actual.Failcnt) - t.Fail() - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/util_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/util_test.go deleted file mode 100644 index 7067e799f..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/util_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build linux - -/* -Utility for testing cgroup operations. - -Creates a mock of the cgroup filesystem for the duration of the test. -*/ -package fs - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/opencontainers/runc/libcontainer/configs" -) - -type cgroupTestUtil struct { - // cgroup data to use in tests. - CgroupData *cgroupData - - // Path to the mock cgroup directory. - CgroupPath string - - // Temporary directory to store mock cgroup filesystem. - tempDir string - t *testing.T -} - -// Creates a new test util for the specified subsystem -func NewCgroupTestUtil(subsystem string, t *testing.T) *cgroupTestUtil { - d := &cgroupData{ - config: &configs.Cgroup{}, - } - d.config.Resources = &configs.Resources{} - tempDir, err := ioutil.TempDir("", "cgroup_test") - if err != nil { - t.Fatal(err) - } - d.root = tempDir - testCgroupPath := filepath.Join(d.root, subsystem) - if err != nil { - t.Fatal(err) - } - - // Ensure the full mock cgroup path exists. - err = os.MkdirAll(testCgroupPath, 0755) - if err != nil { - t.Fatal(err) - } - return &cgroupTestUtil{CgroupData: d, CgroupPath: testCgroupPath, tempDir: tempDir, t: t} -} - -func (c *cgroupTestUtil) cleanup() { - os.RemoveAll(c.tempDir) -} - -// Write the specified contents on the mock of the specified cgroup files. -func (c *cgroupTestUtil) writeFileContents(fileContents map[string]string) { - for file, contents := range fileContents { - err := writeFile(c.CgroupPath, file, contents) - if err != nil { - c.t.Fatal(err) - } - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/utils_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/utils_test.go deleted file mode 100644 index 99cdc18e0..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/utils_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// +build linux - -package fs - -import ( - "io/ioutil" - "math" - "os" - "path/filepath" - "strconv" - "testing" -) - -const ( - cgroupFile = "cgroup.file" - floatValue = 2048.0 - floatString = "2048" -) - -func TestGetCgroupParamsInt(t *testing.T) { - // Setup tempdir. - tempDir, err := ioutil.TempDir("", "cgroup_utils_test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempDir) - tempFile := filepath.Join(tempDir, cgroupFile) - - // Success. - err = ioutil.WriteFile(tempFile, []byte(floatString), 0755) - if err != nil { - t.Fatal(err) - } - value, err := getCgroupParamUint(tempDir, cgroupFile) - if err != nil { - t.Fatal(err) - } else if value != floatValue { - t.Fatalf("Expected %d to equal %f", value, floatValue) - } - - // Success with new line. - err = ioutil.WriteFile(tempFile, []byte(floatString+"\n"), 0755) - if err != nil { - t.Fatal(err) - } - value, err = getCgroupParamUint(tempDir, cgroupFile) - if err != nil { - t.Fatal(err) - } else if value != floatValue { - t.Fatalf("Expected %d to equal %f", value, floatValue) - } - - // Success with negative values - err = ioutil.WriteFile(tempFile, []byte("-12345"), 0755) - if err != nil { - t.Fatal(err) - } - value, err = getCgroupParamUint(tempDir, cgroupFile) - if err != nil { - t.Fatal(err) - } else if value != 0 { - t.Fatalf("Expected %d to equal %d", value, 0) - } - - // Success with negative values lesser than min int64 - s := strconv.FormatFloat(math.MinInt64, 'f', -1, 64) - err = ioutil.WriteFile(tempFile, []byte(s), 0755) - if err != nil { - t.Fatal(err) - } - value, err = getCgroupParamUint(tempDir, cgroupFile) - if err != nil { - t.Fatal(err) - } else if value != 0 { - t.Fatalf("Expected %d to equal %d", value, 0) - } - - // Not a float. - err = ioutil.WriteFile(tempFile, []byte("not-a-float"), 0755) - if err != nil { - t.Fatal(err) - } - _, err = getCgroupParamUint(tempDir, cgroupFile) - if err == nil { - t.Fatal("Expecting error, got none") - } - - // Unknown file. - err = os.Remove(tempFile) - if err != nil { - t.Fatal(err) - } - _, err = getCgroupParamUint(tempDir, cgroupFile) - if err == nil { - t.Fatal("Expecting error, got none") - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_nosystemd.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_nosystemd.go deleted file mode 100644 index 7de9ae605..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_nosystemd.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build !linux - -package systemd - -import ( - "fmt" - - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/configs" -) - -type Manager struct { - Cgroups *configs.Cgroup - Paths map[string]string -} - -func UseSystemd() bool { - return false -} - -func (m *Manager) Apply(pid int) error { - return fmt.Errorf("Systemd not supported") -} - -func (m *Manager) GetPids() ([]int, error) { - return nil, fmt.Errorf("Systemd not supported") -} - -func (m *Manager) GetAllPids() ([]int, error) { - return nil, fmt.Errorf("Systemd not supported") -} - -func (m *Manager) Destroy() error { - return fmt.Errorf("Systemd not supported") -} - -func (m *Manager) GetPaths() map[string]string { - return nil -} - -func (m *Manager) GetStats() (*cgroups.Stats, error) { - return nil, fmt.Errorf("Systemd not supported") -} - -func (m *Manager) Set(container *configs.Config) error { - return nil, fmt.Errorf("Systemd not supported") -} - -func (m *Manager) Freeze(state configs.FreezerState) error { - return fmt.Errorf("Systemd not supported") -} - -func Freeze(c *configs.Cgroup, state configs.FreezerState) error { - return fmt.Errorf("Systemd not supported") -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_systemd.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_systemd.go deleted file mode 100644 index db020a971..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/apply_systemd.go +++ /dev/null @@ -1,596 +0,0 @@ -// +build linux - -package systemd - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "time" - - systemdDbus "github.com/coreos/go-systemd/dbus" - systemdUtil "github.com/coreos/go-systemd/util" - "github.com/godbus/dbus" - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/cgroups/fs" - "github.com/opencontainers/runc/libcontainer/configs" -) - -type Manager struct { - mu sync.Mutex - Cgroups *configs.Cgroup - Paths map[string]string -} - -type subsystem interface { - // Name returns the name of the subsystem. - Name() string - // Returns the stats, as 'stats', corresponding to the cgroup under 'path'. - GetStats(path string, stats *cgroups.Stats) error - // Set the cgroup represented by cgroup. - Set(path string, cgroup *configs.Cgroup) error -} - -var errSubsystemDoesNotExist = errors.New("cgroup: subsystem does not exist") - -type subsystemSet []subsystem - -func (s subsystemSet) Get(name string) (subsystem, error) { - for _, ss := range s { - if ss.Name() == name { - return ss, nil - } - } - return nil, errSubsystemDoesNotExist -} - -var subsystems = subsystemSet{ - &fs.CpusetGroup{}, - &fs.DevicesGroup{}, - &fs.MemoryGroup{}, - &fs.CpuGroup{}, - &fs.CpuacctGroup{}, - &fs.PidsGroup{}, - &fs.BlkioGroup{}, - &fs.HugetlbGroup{}, - &fs.PerfEventGroup{}, - &fs.FreezerGroup{}, - &fs.NetPrioGroup{}, - &fs.NetClsGroup{}, - &fs.NameGroup{GroupName: "name=systemd"}, -} - -const ( - testScopeWait = 4 -) - -var ( - connLock sync.Mutex - theConn *systemdDbus.Conn - hasStartTransientUnit bool - hasTransientDefaultDependencies bool -) - -func newProp(name string, units interface{}) systemdDbus.Property { - return systemdDbus.Property{ - Name: name, - Value: dbus.MakeVariant(units), - } -} - -func UseSystemd() bool { - if !systemdUtil.IsRunningSystemd() { - return false - } - - connLock.Lock() - defer connLock.Unlock() - - if theConn == nil { - var err error - theConn, err = systemdDbus.New() - if err != nil { - return false - } - - // Assume we have StartTransientUnit - hasStartTransientUnit = true - - // But if we get UnknownMethod error we don't - if _, err := theConn.StartTransientUnit("test.scope", "invalid", nil, nil); err != nil { - if dbusError, ok := err.(dbus.Error); ok { - if dbusError.Name == "org.freedesktop.DBus.Error.UnknownMethod" { - hasStartTransientUnit = false - return hasStartTransientUnit - } - } - } - - // Ensure the scope name we use doesn't exist. Use the Pid to - // avoid collisions between multiple libcontainer users on a - // single host. - scope := fmt.Sprintf("libcontainer-%d-systemd-test-default-dependencies.scope", os.Getpid()) - testScopeExists := true - for i := 0; i <= testScopeWait; i++ { - if _, err := theConn.StopUnit(scope, "replace", nil); err != nil { - if dbusError, ok := err.(dbus.Error); ok { - if strings.Contains(dbusError.Name, "org.freedesktop.systemd1.NoSuchUnit") { - testScopeExists = false - break - } - } - } - time.Sleep(time.Millisecond) - } - - // Bail out if we can't kill this scope without testing for DefaultDependencies - if testScopeExists { - return hasStartTransientUnit - } - - // Assume StartTransientUnit on a scope allows DefaultDependencies - hasTransientDefaultDependencies = true - ddf := newProp("DefaultDependencies", false) - if _, err := theConn.StartTransientUnit(scope, "replace", []systemdDbus.Property{ddf}, nil); err != nil { - if dbusError, ok := err.(dbus.Error); ok { - if strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.PropertyReadOnly") { - hasTransientDefaultDependencies = false - } - } - } - - // Not critical because of the stop unit logic above. - theConn.StopUnit(scope, "replace", nil) - } - return hasStartTransientUnit -} - -func getIfaceForUnit(unitName string) string { - if strings.HasSuffix(unitName, ".scope") { - return "Scope" - } - if strings.HasSuffix(unitName, ".service") { - return "Service" - } - return "Unit" -} - -func (m *Manager) Apply(pid int) error { - var ( - c = m.Cgroups - unitName = getUnitName(c) - slice = "system.slice" - properties []systemdDbus.Property - ) - - if c.Paths != nil { - paths := make(map[string]string) - for name, path := range c.Paths { - _, err := getSubsystemPath(m.Cgroups, name) - if err != nil { - // Don't fail if a cgroup hierarchy was not found, just skip this subsystem - if cgroups.IsNotFound(err) { - continue - } - return err - } - paths[name] = path - } - m.Paths = paths - return cgroups.EnterPid(m.Paths, pid) - } - - if c.Parent != "" { - slice = c.Parent - } - - properties = append(properties, - systemdDbus.PropSlice(slice), - systemdDbus.PropDescription("docker container "+c.Name), - newProp("PIDs", []uint32{uint32(pid)}), - ) - - // Always enable accounting, this gets us the same behaviour as the fs implementation, - // plus the kernel has some problems with joining the memory cgroup at a later time. - properties = append(properties, - newProp("MemoryAccounting", true), - newProp("CPUAccounting", true), - newProp("BlockIOAccounting", true)) - - if hasTransientDefaultDependencies { - properties = append(properties, - newProp("DefaultDependencies", false)) - } - - if c.Resources.Memory != 0 { - properties = append(properties, - newProp("MemoryLimit", uint64(c.Resources.Memory))) - } - - if c.Resources.CpuShares != 0 { - properties = append(properties, - newProp("CPUShares", uint64(c.Resources.CpuShares))) - } - - if c.Resources.BlkioWeight != 0 { - properties = append(properties, - newProp("BlockIOWeight", uint64(c.Resources.BlkioWeight))) - } - - // We need to set kernel memory before processes join cgroup because - // kmem.limit_in_bytes can only be set when the cgroup is empty. - // And swap memory limit needs to be set after memory limit, only - // memory limit is handled by systemd, so it's kind of ugly here. - if c.Resources.KernelMemory > 0 { - if err := setKernelMemory(c); err != nil { - return err - } - } - - if _, err := theConn.StartTransientUnit(unitName, "replace", properties, nil); err != nil { - return err - } - - if err := joinDevices(c, pid); err != nil { - return err - } - - // TODO: CpuQuota and CpuPeriod not available in systemd - // we need to manually join the cpu.cfs_quota_us and cpu.cfs_period_us - if err := joinCpu(c, pid); err != nil { - return err - } - - // TODO: MemoryReservation and MemorySwap not available in systemd - if err := joinMemory(c, pid); err != nil { - return err - } - - // we need to manually join the freezer, net_cls, net_prio, pids and cpuset cgroup in systemd - // because it does not currently support it via the dbus api. - if err := joinFreezer(c, pid); err != nil { - return err - } - - if err := joinNetPrio(c, pid); err != nil { - return err - } - if err := joinNetCls(c, pid); err != nil { - return err - } - - if err := joinPids(c, pid); err != nil { - return err - } - - if err := joinCpuset(c, pid); err != nil { - return err - } - - if err := joinHugetlb(c, pid); err != nil { - return err - } - - if err := joinPerfEvent(c, pid); err != nil { - return err - } - // FIXME: Systemd does have `BlockIODeviceWeight` property, but we got problem - // using that (at least on systemd 208, see https://github.com/opencontainers/runc/libcontainer/pull/354), - // so use fs work around for now. - if err := joinBlkio(c, pid); err != nil { - return err - } - - paths := make(map[string]string) - for _, s := range subsystems { - subsystemPath, err := getSubsystemPath(m.Cgroups, s.Name()) - if err != nil { - // Don't fail if a cgroup hierarchy was not found, just skip this subsystem - if cgroups.IsNotFound(err) { - continue - } - return err - } - paths[s.Name()] = subsystemPath - } - m.Paths = paths - return nil -} - -func (m *Manager) Destroy() error { - if m.Cgroups.Paths != nil { - return nil - } - m.mu.Lock() - defer m.mu.Unlock() - theConn.StopUnit(getUnitName(m.Cgroups), "replace", nil) - if err := cgroups.RemovePaths(m.Paths); err != nil { - return err - } - m.Paths = make(map[string]string) - return nil -} - -func (m *Manager) GetPaths() map[string]string { - m.mu.Lock() - paths := m.Paths - m.mu.Unlock() - return paths -} - -func writeFile(dir, file, data string) error { - // Normally dir should not be empty, one case is that cgroup subsystem - // is not mounted, we will get empty dir, and we want it fail here. - if dir == "" { - return fmt.Errorf("no such directory for %s.", file) - } - return ioutil.WriteFile(filepath.Join(dir, file), []byte(data), 0700) -} - -func join(c *configs.Cgroup, subsystem string, pid int) (string, error) { - path, err := getSubsystemPath(c, subsystem) - if err != nil { - return "", err - } - if err := os.MkdirAll(path, 0755); err != nil { - return "", err - } - if err := writeFile(path, "cgroup.procs", strconv.Itoa(pid)); err != nil { - return "", err - } - - return path, nil -} - -func joinCpu(c *configs.Cgroup, pid int) error { - _, err := join(c, "cpu", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -func joinFreezer(c *configs.Cgroup, pid int) error { - _, err := join(c, "freezer", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -func joinNetPrio(c *configs.Cgroup, pid int) error { - _, err := join(c, "net_prio", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -func joinNetCls(c *configs.Cgroup, pid int) error { - _, err := join(c, "net_cls", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -func joinPids(c *configs.Cgroup, pid int) error { - _, err := join(c, "pids", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -// systemd represents slice heirarchy using `-`, so we need to follow suit when -// generating the path of slice. Essentially, test-a-b.slice becomes -// test.slice/test-a.slice/test-a-b.slice. -func expandSlice(slice string) (string, error) { - suffix := ".slice" - sliceName := strings.TrimSuffix(slice, suffix) - - var path, prefix string - for _, component := range strings.Split(sliceName, "-") { - // test--a.slice isn't permitted, nor is -test.slice. - if component == "" { - return "", fmt.Errorf("invalid slice name: %s", slice) - } - - // Append the component to the path and to the prefix. - path += prefix + component + suffix + "/" - prefix += component + "-" - } - - return path, nil -} - -func getSubsystemPath(c *configs.Cgroup, subsystem string) (string, error) { - mountpoint, err := cgroups.FindCgroupMountpoint(subsystem) - if err != nil { - return "", err - } - - initPath, err := cgroups.GetInitCgroupDir(subsystem) - if err != nil { - return "", err - } - - slice := "system.slice" - if c.Parent != "" { - slice = c.Parent - } - - slice, err = expandSlice(slice) - if err != nil { - return "", err - } - - return filepath.Join(mountpoint, initPath, slice, getUnitName(c)), nil -} - -func (m *Manager) Freeze(state configs.FreezerState) error { - path, err := getSubsystemPath(m.Cgroups, "freezer") - if err != nil { - return err - } - prevState := m.Cgroups.Resources.Freezer - m.Cgroups.Resources.Freezer = state - freezer, err := subsystems.Get("freezer") - if err != nil { - return err - } - err = freezer.Set(path, m.Cgroups) - if err != nil { - m.Cgroups.Resources.Freezer = prevState - return err - } - return nil -} - -func (m *Manager) GetPids() ([]int, error) { - path, err := getSubsystemPath(m.Cgroups, "devices") - if err != nil { - return nil, err - } - return cgroups.GetPids(path) -} - -func (m *Manager) GetAllPids() ([]int, error) { - path, err := getSubsystemPath(m.Cgroups, "devices") - if err != nil { - return nil, err - } - return cgroups.GetAllPids(path) -} - -func (m *Manager) GetStats() (*cgroups.Stats, error) { - m.mu.Lock() - defer m.mu.Unlock() - stats := cgroups.NewStats() - for name, path := range m.Paths { - sys, err := subsystems.Get(name) - if err == errSubsystemDoesNotExist || !cgroups.PathExists(path) { - continue - } - if err := sys.GetStats(path, stats); err != nil { - return nil, err - } - } - - return stats, nil -} - -func (m *Manager) Set(container *configs.Config) error { - for _, sys := range subsystems { - // Get the subsystem path, but don't error out for not found cgroups. - path, err := getSubsystemPath(container.Cgroups, sys.Name()) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - - if err := sys.Set(path, container.Cgroups); err != nil { - return err - } - } - - if m.Paths["cpu"] != "" { - if err := fs.CheckCpushares(m.Paths["cpu"], container.Cgroups.Resources.CpuShares); err != nil { - return err - } - } - return nil -} - -func getUnitName(c *configs.Cgroup) string { - return fmt.Sprintf("%s-%s.scope", c.ScopePrefix, c.Name) -} - -// Atm we can't use the systemd device support because of two missing things: -// * Support for wildcards to allow mknod on any device -// * Support for wildcards to allow /dev/pts support -// -// The second is available in more recent systemd as "char-pts", but not in e.g. v208 which is -// in wide use. When both these are available we will be able to switch, but need to keep the old -// implementation for backwards compat. -// -// Note: we can't use systemd to set up the initial limits, and then change the cgroup -// because systemd will re-write the device settings if it needs to re-apply the cgroup context. -// This happens at least for v208 when any sibling unit is started. -func joinDevices(c *configs.Cgroup, pid int) error { - _, err := join(c, "devices", pid) - // Even if it's `not found` error, we'll return err because devices cgroup - // is hard requirement for container security. - if err != nil { - return err - } - return nil -} - -func setKernelMemory(c *configs.Cgroup) error { - path, err := getSubsystemPath(c, "memory") - if err != nil && !cgroups.IsNotFound(err) { - return err - } - - if err := os.MkdirAll(path, 0755); err != nil { - return err - } - - // This doesn't get called by manager.Set, so we need to do it here. - s := &fs.MemoryGroup{} - return s.SetKernelMemory(path, c) -} - -func joinMemory(c *configs.Cgroup, pid int) error { - _, err := join(c, "memory", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -// systemd does not atm set up the cpuset controller, so we must manually -// join it. Additionally that is a very finicky controller where each -// level must have a full setup as the default for a new directory is "no cpus" -func joinCpuset(c *configs.Cgroup, pid int) error { - path, err := getSubsystemPath(c, "cpuset") - if err != nil && !cgroups.IsNotFound(err) { - return err - } - - s := &fs.CpusetGroup{} - - return s.ApplyDir(path, c, pid) -} - -// `BlockIODeviceWeight` property of systemd does not work properly, and systemd -// expects device path instead of major minor numbers, which is also confusing -// for users. So we use fs work around for now. -func joinBlkio(c *configs.Cgroup, pid int) error { - _, err := join(c, "blkio", pid) - if err != nil { - return err - } - return nil -} - -func joinHugetlb(c *configs.Cgroup, pid int) error { - _, err := join(c, "hugetlb", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} - -func joinPerfEvent(c *configs.Cgroup, pid int) error { - _, err := join(c, "perf_event", pid) - if err != nil && !cgroups.IsNotFound(err) { - return err - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_unix_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_unix_test.go deleted file mode 100644 index 27d07d4e8..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_unix_test.go +++ /dev/null @@ -1,156 +0,0 @@ -// +build linux freebsd - -package configs - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "testing" -) - -// Checks whether the expected capability is specified in the capabilities. -func contains(expected string, values []string) bool { - for _, v := range values { - if v == expected { - return true - } - } - return false -} - -func containsDevice(expected *Device, values []*Device) bool { - for _, d := range values { - if d.Path == expected.Path && - d.Permissions == expected.Permissions && - d.FileMode == expected.FileMode && - d.Major == expected.Major && - d.Minor == expected.Minor && - d.Type == expected.Type { - return true - } - } - return false -} - -func loadConfig(name string) (*Config, error) { - f, err := os.Open(filepath.Join("../sample_configs", name)) - if err != nil { - return nil, err - } - defer f.Close() - - var container *Config - if err := json.NewDecoder(f).Decode(&container); err != nil { - return nil, err - } - - // Check that a config doesn't contain extra fields - var configMap, abstractMap map[string]interface{} - - if _, err := f.Seek(0, 0); err != nil { - return nil, err - } - - if err := json.NewDecoder(f).Decode(&abstractMap); err != nil { - return nil, err - } - - configData, err := json.Marshal(&container) - if err != nil { - return nil, err - } - - if err := json.Unmarshal(configData, &configMap); err != nil { - return nil, err - } - - for k := range configMap { - delete(abstractMap, k) - } - - if len(abstractMap) != 0 { - return nil, fmt.Errorf("unknown fields: %s", abstractMap) - } - - return container, nil -} - -func TestRemoveNamespace(t *testing.T) { - ns := Namespaces{ - {Type: NEWNET}, - } - if !ns.Remove(NEWNET) { - t.Fatal("NEWNET was not removed") - } - if len(ns) != 0 { - t.Fatalf("namespaces should have 0 items but reports %d", len(ns)) - } -} - -func TestHostUIDNoUSERNS(t *testing.T) { - config := &Config{ - Namespaces: Namespaces{}, - } - uid, err := config.HostUID() - if err != nil { - t.Fatal(err) - } - if uid != 0 { - t.Fatalf("expected uid 0 with no USERNS but received %d", uid) - } -} - -func TestHostUIDWithUSERNS(t *testing.T) { - config := &Config{ - Namespaces: Namespaces{{Type: NEWUSER}}, - UidMappings: []IDMap{ - { - ContainerID: 0, - HostID: 1000, - Size: 1, - }, - }, - } - uid, err := config.HostUID() - if err != nil { - t.Fatal(err) - } - if uid != 1000 { - t.Fatalf("expected uid 1000 with no USERNS but received %d", uid) - } -} - -func TestHostGIDNoUSERNS(t *testing.T) { - config := &Config{ - Namespaces: Namespaces{}, - } - uid, err := config.HostGID() - if err != nil { - t.Fatal(err) - } - if uid != 0 { - t.Fatalf("expected gid 0 with no USERNS but received %d", uid) - } -} - -func TestHostGIDWithUSERNS(t *testing.T) { - config := &Config{ - Namespaces: Namespaces{{Type: NEWUSER}}, - GidMappings: []IDMap{ - { - ContainerID: 0, - HostID: 1000, - Size: 1, - }, - }, - } - uid, err := config.HostGID() - if err != nil { - t.Fatal(err) - } - if uid != 1000 { - t.Fatalf("expected gid 1000 with no USERNS but received %d", uid) - } -} diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_windows_test.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_windows_test.go deleted file mode 100644 index 1a0c8fa2d..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/config_windows_test.go +++ /dev/null @@ -1,3 +0,0 @@ -package configs - -// All current tests are for Unix-specific functionality diff --git a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/validate/config.go b/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/validate/config.go deleted file mode 100644 index 848a67c34..000000000 --- a/Godeps/_workspace/src/github.com/opencontainers/runc/libcontainer/configs/validate/config.go +++ /dev/null @@ -1,93 +0,0 @@ -package validate - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/opencontainers/runc/libcontainer/configs" -) - -type Validator interface { - Validate(*configs.Config) error -} - -func New() Validator { - return &ConfigValidator{} -} - -type ConfigValidator struct { -} - -func (v *ConfigValidator) Validate(config *configs.Config) error { - if err := v.rootfs(config); err != nil { - return err - } - if err := v.network(config); err != nil { - return err - } - if err := v.hostname(config); err != nil { - return err - } - if err := v.security(config); err != nil { - return err - } - if err := v.usernamespace(config); err != nil { - return err - } - return nil -} - -// rootfs validates the the rootfs is an absolute path and is not a symlink -// to the container's root filesystem. -func (v *ConfigValidator) rootfs(config *configs.Config) error { - cleaned, err := filepath.Abs(config.Rootfs) - if err != nil { - return err - } - if cleaned, err = filepath.EvalSymlinks(cleaned); err != nil { - return err - } - if config.Rootfs != cleaned { - return fmt.Errorf("%s is not an absolute path or is a symlink", config.Rootfs) - } - return nil -} - -func (v *ConfigValidator) network(config *configs.Config) error { - if !config.Namespaces.Contains(configs.NEWNET) { - if len(config.Networks) > 0 || len(config.Routes) > 0 { - return fmt.Errorf("unable to apply network settings without a private NET namespace") - } - } - return nil -} - -func (v *ConfigValidator) hostname(config *configs.Config) error { - if config.Hostname != "" && !config.Namespaces.Contains(configs.NEWUTS) { - return fmt.Errorf("unable to set hostname without a private UTS namespace") - } - return nil -} - -func (v *ConfigValidator) security(config *configs.Config) error { - // restrict sys without mount namespace - if (len(config.MaskPaths) > 0 || len(config.ReadonlyPaths) > 0) && - !config.Namespaces.Contains(configs.NEWNS) { - return fmt.Errorf("unable to restrict sys entries without a private MNT namespace") - } - return nil -} - -func (v *ConfigValidator) usernamespace(config *configs.Config) error { - if config.Namespaces.Contains(configs.NEWUSER) { - if _, err := os.Stat("/proc/self/ns/user"); os.IsNotExist(err) { - return fmt.Errorf("USER namespaces aren't enabled in the kernel") - } - } else { - if config.UidMappings != nil || config.GidMappings != nil { - return fmt.Errorf("User namespace mappings specified, but USER namespace isn't enabled in the config") - } - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go deleted file mode 100644 index b5eae0924..000000000 --- a/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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 uuid - -import ( - "encoding/json" - "reflect" - "testing" -) - -var testUUID = Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479") - -func TestJSON(t *testing.T) { - type S struct { - ID1 UUID - ID2 UUID - } - s1 := S{ID1: testUUID} - data, err := json.Marshal(&s1) - if err != nil { - t.Fatal(err) - } - var s2 S - if err := json.Unmarshal(data, &s2); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(&s1, &s2) { - t.Errorf("got %#v, want %#v", s2, s1) - } -} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go deleted file mode 100644 index 3b3d1430d..000000000 --- a/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2014 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 uuid - -import ( - "flag" - "runtime" - "testing" - "time" -) - -// This test is only run when --regressions is passed on the go test line. -var regressions = flag.Bool("regressions", false, "run uuid regression tests") - -// TestClockSeqRace tests for a particular race condition of returning two -// identical Version1 UUIDs. The duration of 1 minute was chosen as the race -// condition, before being fixed, nearly always occured in under 30 seconds. -func TestClockSeqRace(t *testing.T) { - if !*regressions { - t.Skip("skipping regression tests") - } - duration := time.Minute - - done := make(chan struct{}) - defer close(done) - - ch := make(chan UUID, 10000) - ncpu := runtime.NumCPU() - switch ncpu { - case 0, 1: - // We can't run the test effectively. - t.Skip("skipping race test, only one CPU detected") - return - default: - runtime.GOMAXPROCS(ncpu) - } - for i := 0; i < ncpu; i++ { - go func() { - for { - select { - case <-done: - return - case ch <- NewUUID(): - } - } - }() - } - - uuids := make(map[string]bool) - cnt := 0 - start := time.Now() - for u := range ch { - s := u.String() - if uuids[s] { - t.Errorf("duplicate uuid after %d in %v: %s", cnt, time.Since(start), s) - return - } - uuids[s] = true - if time.Since(start) > duration { - return - } - cnt++ - } -} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go deleted file mode 100644 index 417ebeb26..000000000 --- a/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright 2011 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 uuid - -import ( - "bytes" - "fmt" - "os" - "strings" - "testing" - "time" -) - -type test struct { - in string - version Version - variant Variant - isuuid bool -} - -var tests = []test{ - {"f47ac10b-58cc-0372-8567-0e02b2c3d479", 0, RFC4122, true}, - {"f47ac10b-58cc-1372-8567-0e02b2c3d479", 1, RFC4122, true}, - {"f47ac10b-58cc-2372-8567-0e02b2c3d479", 2, RFC4122, true}, - {"f47ac10b-58cc-3372-8567-0e02b2c3d479", 3, RFC4122, true}, - {"f47ac10b-58cc-4372-8567-0e02b2c3d479", 4, RFC4122, true}, - {"f47ac10b-58cc-5372-8567-0e02b2c3d479", 5, RFC4122, true}, - {"f47ac10b-58cc-6372-8567-0e02b2c3d479", 6, RFC4122, true}, - {"f47ac10b-58cc-7372-8567-0e02b2c3d479", 7, RFC4122, true}, - {"f47ac10b-58cc-8372-8567-0e02b2c3d479", 8, RFC4122, true}, - {"f47ac10b-58cc-9372-8567-0e02b2c3d479", 9, RFC4122, true}, - {"f47ac10b-58cc-a372-8567-0e02b2c3d479", 10, RFC4122, true}, - {"f47ac10b-58cc-b372-8567-0e02b2c3d479", 11, RFC4122, true}, - {"f47ac10b-58cc-c372-8567-0e02b2c3d479", 12, RFC4122, true}, - {"f47ac10b-58cc-d372-8567-0e02b2c3d479", 13, RFC4122, true}, - {"f47ac10b-58cc-e372-8567-0e02b2c3d479", 14, RFC4122, true}, - {"f47ac10b-58cc-f372-8567-0e02b2c3d479", 15, RFC4122, true}, - - {"urn:uuid:f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true}, - {"URN:UUID:f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-1567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-2567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-3567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-4567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-5567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-6567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-7567-0e02b2c3d479", 4, Reserved, true}, - {"f47ac10b-58cc-4372-8567-0e02b2c3d479", 4, RFC4122, true}, - {"f47ac10b-58cc-4372-9567-0e02b2c3d479", 4, RFC4122, true}, - {"f47ac10b-58cc-4372-a567-0e02b2c3d479", 4, RFC4122, true}, - {"f47ac10b-58cc-4372-b567-0e02b2c3d479", 4, RFC4122, true}, - {"f47ac10b-58cc-4372-c567-0e02b2c3d479", 4, Microsoft, true}, - {"f47ac10b-58cc-4372-d567-0e02b2c3d479", 4, Microsoft, true}, - {"f47ac10b-58cc-4372-e567-0e02b2c3d479", 4, Future, true}, - {"f47ac10b-58cc-4372-f567-0e02b2c3d479", 4, Future, true}, - - {"f47ac10b158cc-5372-a567-0e02b2c3d479", 0, Invalid, false}, - {"f47ac10b-58cc25372-a567-0e02b2c3d479", 0, Invalid, false}, - {"f47ac10b-58cc-53723a567-0e02b2c3d479", 0, Invalid, false}, - {"f47ac10b-58cc-5372-a56740e02b2c3d479", 0, Invalid, false}, - {"f47ac10b-58cc-5372-a567-0e02-2c3d479", 0, Invalid, false}, - {"g47ac10b-58cc-4372-a567-0e02b2c3d479", 0, Invalid, false}, -} - -var constants = []struct { - c interface{} - name string -}{ - {Person, "Person"}, - {Group, "Group"}, - {Org, "Org"}, - {Invalid, "Invalid"}, - {RFC4122, "RFC4122"}, - {Reserved, "Reserved"}, - {Microsoft, "Microsoft"}, - {Future, "Future"}, - {Domain(17), "Domain17"}, - {Variant(42), "BadVariant42"}, -} - -func testTest(t *testing.T, in string, tt test) { - uuid := Parse(in) - if ok := (uuid != nil); ok != tt.isuuid { - t.Errorf("Parse(%s) got %v expected %v\b", in, ok, tt.isuuid) - } - if uuid == nil { - return - } - - if v := uuid.Variant(); v != tt.variant { - t.Errorf("Variant(%s) got %d expected %d\b", in, v, tt.variant) - } - if v, _ := uuid.Version(); v != tt.version { - t.Errorf("Version(%s) got %d expected %d\b", in, v, tt.version) - } -} - -func TestUUID(t *testing.T) { - for _, tt := range tests { - testTest(t, tt.in, tt) - testTest(t, strings.ToUpper(tt.in), tt) - } -} - -func TestConstants(t *testing.T) { - for x, tt := range constants { - v, ok := tt.c.(fmt.Stringer) - if !ok { - t.Errorf("%x: %v: not a stringer", x, v) - } else if s := v.String(); s != tt.name { - v, _ := tt.c.(int) - t.Errorf("%x: Constant %T:%d gives %q, expected %q\n", x, tt.c, v, s, tt.name) - } - } -} - -func TestRandomUUID(t *testing.T) { - m := make(map[string]bool) - for x := 1; x < 32; x++ { - uuid := NewRandom() - s := uuid.String() - if m[s] { - t.Errorf("NewRandom returned duplicated UUID %s\n", s) - } - m[s] = true - if v, _ := uuid.Version(); v != 4 { - t.Errorf("Random UUID of version %s\n", v) - } - if uuid.Variant() != RFC4122 { - t.Errorf("Random UUID is variant %d\n", uuid.Variant()) - } - } -} - -func TestNew(t *testing.T) { - m := make(map[string]bool) - for x := 1; x < 32; x++ { - s := New() - if m[s] { - t.Errorf("New returned duplicated UUID %s\n", s) - } - m[s] = true - uuid := Parse(s) - if uuid == nil { - t.Errorf("New returned %q which does not decode\n", s) - continue - } - if v, _ := uuid.Version(); v != 4 { - t.Errorf("Random UUID of version %s\n", v) - } - if uuid.Variant() != RFC4122 { - t.Errorf("Random UUID is variant %d\n", uuid.Variant()) - } - } -} - -func clockSeq(t *testing.T, uuid UUID) int { - seq, ok := uuid.ClockSequence() - if !ok { - t.Fatalf("%s: invalid clock sequence\n", uuid) - } - return seq -} - -func TestClockSeq(t *testing.T) { - // Fake time.Now for this test to return a monotonically advancing time; restore it at end. - defer func(orig func() time.Time) { timeNow = orig }(timeNow) - monTime := time.Now() - timeNow = func() time.Time { - monTime = monTime.Add(1 * time.Second) - return monTime - } - - SetClockSequence(-1) - uuid1 := NewUUID() - uuid2 := NewUUID() - - if clockSeq(t, uuid1) != clockSeq(t, uuid2) { - t.Errorf("clock sequence %d != %d\n", clockSeq(t, uuid1), clockSeq(t, uuid2)) - } - - SetClockSequence(-1) - uuid2 = NewUUID() - - // Just on the very off chance we generated the same sequence - // two times we try again. - if clockSeq(t, uuid1) == clockSeq(t, uuid2) { - SetClockSequence(-1) - uuid2 = NewUUID() - } - if clockSeq(t, uuid1) == clockSeq(t, uuid2) { - t.Errorf("Duplicate clock sequence %d\n", clockSeq(t, uuid1)) - } - - SetClockSequence(0x1234) - uuid1 = NewUUID() - if seq := clockSeq(t, uuid1); seq != 0x1234 { - t.Errorf("%s: expected seq 0x1234 got 0x%04x\n", uuid1, seq) - } -} - -func TestCoding(t *testing.T) { - text := "7d444840-9dc0-11d1-b245-5ffdce74fad2" - urn := "urn:uuid:7d444840-9dc0-11d1-b245-5ffdce74fad2" - data := UUID{ - 0x7d, 0x44, 0x48, 0x40, - 0x9d, 0xc0, - 0x11, 0xd1, - 0xb2, 0x45, - 0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2, - } - if v := data.String(); v != text { - t.Errorf("%x: encoded to %s, expected %s\n", data, v, text) - } - if v := data.URN(); v != urn { - t.Errorf("%x: urn is %s, expected %s\n", data, v, urn) - } - - uuid := Parse(text) - if !Equal(uuid, data) { - t.Errorf("%s: decoded to %s, expected %s\n", text, uuid, data) - } -} - -func TestVersion1(t *testing.T) { - uuid1 := NewUUID() - uuid2 := NewUUID() - - if Equal(uuid1, uuid2) { - t.Errorf("%s:duplicate uuid\n", uuid1) - } - if v, _ := uuid1.Version(); v != 1 { - t.Errorf("%s: version %s expected 1\n", uuid1, v) - } - if v, _ := uuid2.Version(); v != 1 { - t.Errorf("%s: version %s expected 1\n", uuid2, v) - } - n1 := uuid1.NodeID() - n2 := uuid2.NodeID() - if !bytes.Equal(n1, n2) { - t.Errorf("Different nodes %x != %x\n", n1, n2) - } - t1, ok := uuid1.Time() - if !ok { - t.Errorf("%s: invalid time\n", uuid1) - } - t2, ok := uuid2.Time() - if !ok { - t.Errorf("%s: invalid time\n", uuid2) - } - q1, ok := uuid1.ClockSequence() - if !ok { - t.Errorf("%s: invalid clock sequence\n", uuid1) - } - q2, ok := uuid2.ClockSequence() - if !ok { - t.Errorf("%s: invalid clock sequence", uuid2) - } - - switch { - case t1 == t2 && q1 == q2: - t.Errorf("time stopped\n") - case t1 > t2 && q1 == q2: - t.Errorf("time reversed\n") - case t1 < t2 && q1 != q2: - t.Errorf("clock sequence chaned unexpectedly\n") - } -} - -func TestNodeAndTime(t *testing.T) { - // Time is February 5, 1998 12:30:23.136364800 AM GMT - - uuid := Parse("7d444840-9dc0-11d1-b245-5ffdce74fad2") - node := []byte{0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2} - - ts, ok := uuid.Time() - if ok { - c := time.Unix(ts.UnixTime()) - want := time.Date(1998, 2, 5, 0, 30, 23, 136364800, time.UTC) - if !c.Equal(want) { - t.Errorf("Got time %v, want %v", c, want) - } - } else { - t.Errorf("%s: bad time\n", uuid) - } - if !bytes.Equal(node, uuid.NodeID()) { - t.Errorf("Expected node %v got %v\n", node, uuid.NodeID()) - } -} - -func TestMD5(t *testing.T) { - uuid := NewMD5(NameSpace_DNS, []byte("python.org")).String() - want := "6fa459ea-ee8a-3ca4-894e-db77e160355e" - if uuid != want { - t.Errorf("MD5: got %q expected %q\n", uuid, want) - } -} - -func TestSHA1(t *testing.T) { - uuid := NewSHA1(NameSpace_DNS, []byte("python.org")).String() - want := "886313e1-3b8a-5372-9b90-0c9aee199e5d" - if uuid != want { - t.Errorf("SHA1: got %q expected %q\n", uuid, want) - } -} - -func TestNodeID(t *testing.T) { - nid := []byte{1, 2, 3, 4, 5, 6} - SetNodeInterface("") - s := NodeInterface() - if s == "" || s == "user" { - t.Errorf("NodeInterface %q after SetInteface\n", s) - } - node1 := NodeID() - if node1 == nil { - t.Errorf("NodeID nil after SetNodeInterface\n", s) - } - SetNodeID(nid) - s = NodeInterface() - if s != "user" { - t.Errorf("Expected NodeInterface %q got %q\n", "user", s) - } - node2 := NodeID() - if node2 == nil { - t.Errorf("NodeID nil after SetNodeID\n", s) - } - if bytes.Equal(node1, node2) { - t.Errorf("NodeID not changed after SetNodeID\n", s) - } else if !bytes.Equal(nid, node2) { - t.Errorf("NodeID is %x, expected %x\n", node2, nid) - } -} - -func testDCE(t *testing.T, name string, uuid UUID, domain Domain, id uint32) { - if uuid == nil { - t.Errorf("%s failed\n", name) - return - } - if v, _ := uuid.Version(); v != 2 { - t.Errorf("%s: %s: expected version 2, got %s\n", name, uuid, v) - return - } - if v, ok := uuid.Domain(); !ok || v != domain { - if !ok { - t.Errorf("%s: %d: Domain failed\n", name, uuid) - } else { - t.Errorf("%s: %s: expected domain %d, got %d\n", name, uuid, domain, v) - } - } - if v, ok := uuid.Id(); !ok || v != id { - if !ok { - t.Errorf("%s: %d: Id failed\n", name, uuid) - } else { - t.Errorf("%s: %s: expected id %d, got %d\n", name, uuid, id, v) - } - } -} - -func TestDCE(t *testing.T) { - testDCE(t, "NewDCESecurity", NewDCESecurity(42, 12345678), 42, 12345678) - testDCE(t, "NewDCEPerson", NewDCEPerson(), Person, uint32(os.Getuid())) - testDCE(t, "NewDCEGroup", NewDCEGroup(), Group, uint32(os.Getgid())) -} - -type badRand struct{} - -func (r badRand) Read(buf []byte) (int, error) { - for i, _ := range buf { - buf[i] = byte(i) - } - return len(buf), nil -} - -func TestBadRand(t *testing.T) { - SetRand(badRand{}) - uuid1 := New() - uuid2 := New() - if uuid1 != uuid2 { - t.Errorf("execpted duplicates, got %q and %q\n", uuid1, uuid2) - } - SetRand(nil) - uuid1 = New() - uuid2 = New() - if uuid1 == uuid2 { - t.Errorf("unexecpted duplicates, got %q\n", uuid1) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/benchmark_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/benchmark_test.go deleted file mode 100644 index 6ae7333fc..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/benchmark_test.go +++ /dev/null @@ -1,159 +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 ( - "testing" -) - -func BenchmarkCounterWithLabelValues(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Inc() - } -} - -func BenchmarkCounterWithMappedLabels(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.With(Labels{"two": "zwei", "one": "eins", "three": "drei"}).Inc() - } -} - -func BenchmarkCounterWithPreparedMappedLabels(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - labels := Labels{"two": "zwei", "one": "eins", "three": "drei"} - for i := 0; i < b.N; i++ { - m.With(labels).Inc() - } -} - -func BenchmarkCounterNoLabels(b *testing.B) { - m := NewCounter(CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Inc() - } -} - -func BenchmarkGaugeWithLabelValues(b *testing.B) { - m := NewGaugeVec( - GaugeOpts{ - Name: "benchmark_gauge", - Help: "A gauge to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Set(3.1415) - } -} - -func BenchmarkGaugeNoLabels(b *testing.B) { - m := NewGauge(GaugeOpts{ - Name: "benchmark_gauge", - Help: "A gauge to benchmark it.", - }) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Set(3.1415) - } -} - -func BenchmarkSummaryWithLabelValues(b *testing.B) { - m := NewSummaryVec( - SummaryOpts{ - Name: "benchmark_summary", - Help: "A summary to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) - } -} - -func BenchmarkSummaryNoLabels(b *testing.B) { - m := NewSummary(SummaryOpts{ - Name: "benchmark_summary", - Help: "A summary to benchmark it.", - }, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Observe(3.1415) - } -} - -func BenchmarkHistogramWithLabelValues(b *testing.B) { - m := NewHistogramVec( - HistogramOpts{ - Name: "benchmark_histogram", - Help: "A histogram to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) - } -} - -func BenchmarkHistogramNoLabels(b *testing.B) { - m := NewHistogram(HistogramOpts{ - Name: "benchmark_histogram", - Help: "A histogram to benchmark it.", - }, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Observe(3.1415) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/counter_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/counter_test.go deleted file mode 100644 index 67391a23a..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/counter_test.go +++ /dev/null @@ -1,58 +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" - "testing" - - dto "github.com/prometheus/client_model/go" -) - -func TestCounterAdd(t *testing.T) { - counter := NewCounter(CounterOpts{ - Name: "test", - Help: "test help", - ConstLabels: Labels{"a": "1", "b": "2"}, - }).(*counter) - counter.Inc() - if expected, got := 1., math.Float64frombits(counter.valBits); expected != got { - t.Errorf("Expected %f, got %f.", expected, got) - } - counter.Add(42) - if expected, got := 43., math.Float64frombits(counter.valBits); expected != got { - t.Errorf("Expected %f, got %f.", expected, got) - } - - if expected, got := "counter cannot decrease in value", decreaseCounter(counter).Error(); expected != got { - t.Errorf("Expected error %q, got %q.", expected, got) - } - - m := &dto.Metric{} - counter.Write(m) - - if expected, got := `label: label: counter: `, m.String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } -} - -func decreaseCounter(c *counter) (err error) { - defer func() { - if e := recover(); e != nil { - err = e.(error) - } - }() - c.Add(-1) - return nil -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go deleted file mode 100644 index 6f3e215d4..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go +++ /dev/null @@ -1,130 +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_test - -import ( - "sync" - - "github.com/prometheus/client_golang/prometheus" -) - -// ClusterManager is an example for a system that might have been built without -// Prometheus in mind. It models a central manager of jobs running in a -// cluster. To turn it into something that collects Prometheus metrics, we -// simply add the two methods required for the Collector interface. -// -// An additional challenge is that multiple instances of the ClusterManager are -// run within the same binary, each in charge of a different zone. We need to -// make use of ConstLabels to be able to register each ClusterManager instance -// with Prometheus. -type ClusterManager struct { - Zone string - OOMCount *prometheus.CounterVec - RAMUsage *prometheus.GaugeVec - mtx sync.Mutex // Protects OOMCount and RAMUsage. - // ... many more fields -} - -// ReallyExpensiveAssessmentOfTheSystemState is a mock for the data gathering a -// real cluster manager would have to do. Since it may actually be really -// expensive, it must only be called once per collection. This implementation, -// obviously, only returns some made-up data. -func (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( - oomCountByHost map[string]int, ramUsageByHost map[string]float64, -) { - // Just example fake data. - oomCountByHost = map[string]int{ - "foo.example.org": 42, - "bar.example.org": 2001, - } - ramUsageByHost = map[string]float64{ - "foo.example.org": 6.023e23, - "bar.example.org": 3.14, - } - return -} - -// Describe faces the interesting challenge that the two metric vectors that are -// used in this example are already Collectors themselves. However, thanks to -// the use of channels, it is really easy to "chain" Collectors. Here we simply -// call the Describe methods of the two metric vectors. -func (c *ClusterManager) Describe(ch chan<- *prometheus.Desc) { - c.OOMCount.Describe(ch) - c.RAMUsage.Describe(ch) -} - -// Collect first triggers the ReallyExpensiveAssessmentOfTheSystemState. Then it -// sets the retrieved values in the two metric vectors and then sends all their -// metrics to the channel (again using a chaining technique as in the Describe -// method). Since Collect could be called multiple times concurrently, that part -// is protected by a mutex. -func (c *ClusterManager) Collect(ch chan<- prometheus.Metric) { - oomCountByHost, ramUsageByHost := c.ReallyExpensiveAssessmentOfTheSystemState() - c.mtx.Lock() - defer c.mtx.Unlock() - for host, oomCount := range oomCountByHost { - c.OOMCount.WithLabelValues(host).Set(float64(oomCount)) - } - for host, ramUsage := range ramUsageByHost { - c.RAMUsage.WithLabelValues(host).Set(ramUsage) - } - c.OOMCount.Collect(ch) - c.RAMUsage.Collect(ch) - // All metrics in OOMCount and RAMUsage are sent to the channel now. We - // can safely reset the two metric vectors now, so that we can start - // fresh in the next Collect cycle. (Imagine a host disappears from the - // cluster. If we did not reset here, its Metric would stay in the - // metric vectors forever.) - c.OOMCount.Reset() - c.RAMUsage.Reset() -} - -// NewClusterManager creates the two metric vectors OOMCount and RAMUsage. Note -// that the zone is set as a ConstLabel. (It's different in each instance of the -// ClusterManager, but constant over the lifetime of an instance.) The reported -// values are partitioned by host, which is therefore a variable label. -func NewClusterManager(zone string) *ClusterManager { - return &ClusterManager{ - Zone: zone, - OOMCount: prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "clustermanager", - Name: "oom_count", - Help: "number of OOM crashes", - ConstLabels: prometheus.Labels{"zone": zone}, - }, - []string{"host"}, - ), - RAMUsage: prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: "clustermanager", - Name: "ram_usage_bytes", - Help: "RAM usage as reported to the cluster manager", - ConstLabels: prometheus.Labels{"zone": zone}, - }, - []string{"host"}, - ), - } -} - -func ExampleCollector_clustermanager() { - workerDB := NewClusterManager("db") - workerCA := NewClusterManager("ca") - prometheus.MustRegister(workerDB) - prometheus.MustRegister(workerCA) - - // Since we are dealing with custom Collector implementations, it might - // be a good idea to enable the collect checks in the registry. - prometheus.EnableCollectChecks(true) -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_memstats_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_memstats_test.go deleted file mode 100644 index a84d07250..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_memstats_test.go +++ /dev/null @@ -1,87 +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_test - -import ( - "runtime" - - "github.com/prometheus/client_golang/prometheus" -) - -var ( - allocDesc = prometheus.NewDesc( - prometheus.BuildFQName("", "memstats", "alloc_bytes"), - "bytes allocated and still in use", - nil, nil, - ) - totalAllocDesc = prometheus.NewDesc( - prometheus.BuildFQName("", "memstats", "total_alloc_bytes"), - "bytes allocated (even if freed)", - nil, nil, - ) - numGCDesc = prometheus.NewDesc( - prometheus.BuildFQName("", "memstats", "num_gc_total"), - "number of GCs run", - nil, nil, - ) -) - -// MemStatsCollector is an example for a custom Collector that solves the -// problem of feeding into multiple metrics at the same time. The -// runtime.ReadMemStats should happen only once, and then the results need to be -// fed into a number of separate Metrics. In this example, only a few of the -// values reported by ReadMemStats are used. For each, there is a Desc provided -// as a var, so the MemStatsCollector itself needs nothing else in the -// struct. Only the methods need to be implemented. -type MemStatsCollector struct{} - -// Describe just sends the three Desc objects for the Metrics we intend to -// collect. -func (_ MemStatsCollector) Describe(ch chan<- *prometheus.Desc) { - ch <- allocDesc - ch <- totalAllocDesc - ch <- numGCDesc -} - -// Collect does the trick by calling ReadMemStats once and then constructing -// three different Metrics on the fly. -func (_ MemStatsCollector) Collect(ch chan<- prometheus.Metric) { - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - ch <- prometheus.MustNewConstMetric( - allocDesc, - prometheus.GaugeValue, - float64(ms.Alloc), - ) - ch <- prometheus.MustNewConstMetric( - totalAllocDesc, - prometheus.GaugeValue, - float64(ms.TotalAlloc), - ) - ch <- prometheus.MustNewConstMetric( - numGCDesc, - prometheus.CounterValue, - float64(ms.NumGC), - ) - // To avoid new allocations on each collection, you could also keep - // metric objects around and return the same objects each time, just - // with new values set. -} - -func ExampleCollector_memstats() { - prometheus.MustRegister(&MemStatsCollector{}) - // Since we are dealing with custom Collector implementations, it might - // be a good idea to enable the collect checks in the registry. - prometheus.EnableCollectChecks(true) -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_selfcollector_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_selfcollector_test.go deleted file mode 100644 index 608deeb02..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/example_selfcollector_test.go +++ /dev/null @@ -1,69 +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_test - -import ( - "runtime" - - "github.com/golang/protobuf/proto" - - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus" -) - -func NewCallbackMetric(desc *prometheus.Desc, callback func() float64) *CallbackMetric { - result := &CallbackMetric{desc: desc, callback: callback} - result.Init(result) // Initialize the SelfCollector. - return result -} - -// TODO: Come up with a better example. - -// CallbackMetric is an example for a user-defined Metric that exports the -// result of a function call as a metric of type "untyped" without any -// labels. It uses SelfCollector to turn the Metric into a Collector so that it -// can be registered with Prometheus. -// -// Note that this example is pretty much academic as the prometheus package -// already provides an UntypedFunc type. -type CallbackMetric struct { - prometheus.SelfCollector - - desc *prometheus.Desc - callback func() float64 -} - -func (cm *CallbackMetric) Desc() *prometheus.Desc { - return cm.desc -} - -func (cm *CallbackMetric) Write(m *dto.Metric) error { - m.Untyped = &dto.Untyped{Value: proto.Float64(cm.callback())} - return nil -} - -func ExampleSelfCollector() { - m := NewCallbackMetric( - prometheus.NewDesc( - "runtime_goroutines_count", - "Total number of goroutines that currently exist.", - nil, nil, // No labels, these must be nil. - ), - func() float64 { - return float64(runtime.NumGoroutine()) - }, - ) - prometheus.MustRegister(m) -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/examples_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/examples_test.go deleted file mode 100644 index 0344e465b..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/examples_test.go +++ /dev/null @@ -1,649 +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_test - -import ( - "flag" - "fmt" - "math" - "net/http" - "os" - "runtime" - "sort" - "time" - - dto "github.com/prometheus/client_model/go" - - "github.com/golang/protobuf/proto" - - "github.com/prometheus/client_golang/prometheus" -) - -func ExampleGauge() { - opsQueued := prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: "our_company", - Subsystem: "blob_storage", - Name: "ops_queued", - Help: "Number of blob storage operations waiting to be processed.", - }) - prometheus.MustRegister(opsQueued) - - // 10 operations queued by the goroutine managing incoming requests. - opsQueued.Add(10) - // A worker goroutine has picked up a waiting operation. - opsQueued.Dec() - // And once more... - opsQueued.Dec() -} - -func ExampleGaugeVec() { - binaryVersion := flag.String("binary_version", "debug", "Version of the binary: debug, canary, production.") - flag.Parse() - - opsQueued := prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Namespace: "our_company", - Subsystem: "blob_storage", - Name: "ops_queued", - Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", - ConstLabels: prometheus.Labels{"binary_version": *binaryVersion}, - }, - []string{ - // Which user has requested the operation? - "user", - // Of what type is the operation? - "type", - }, - ) - prometheus.MustRegister(opsQueued) - - // Increase a value using compact (but order-sensitive!) WithLabelValues(). - opsQueued.WithLabelValues("bob", "put").Add(4) - // Increase a value with a map using WithLabels. More verbose, but order - // doesn't matter anymore. - opsQueued.With(prometheus.Labels{"type": "delete", "user": "alice"}).Inc() -} - -func ExampleGaugeFunc() { - if err := prometheus.Register(prometheus.NewGaugeFunc( - prometheus.GaugeOpts{ - Subsystem: "runtime", - Name: "goroutines_count", - Help: "Number of goroutines that currently exist.", - }, - func() float64 { return float64(runtime.NumGoroutine()) }, - )); err == nil { - fmt.Println("GaugeFunc 'goroutines_count' registered.") - } - // Note that the count of goroutines is a gauge (and not a counter) as - // it can go up and down. - - // Output: - // GaugeFunc 'goroutines_count' registered. -} - -func ExampleCounter() { - pushCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "repository_pushes", // Note: No help string... - }) - err := prometheus.Register(pushCounter) // ... so this will return an error. - if err != nil { - fmt.Println("Push counter couldn't be registered, no counting will happen:", err) - return - } - - // Try it once more, this time with a help string. - pushCounter = prometheus.NewCounter(prometheus.CounterOpts{ - Name: "repository_pushes", - Help: "Number of pushes to external repository.", - }) - err = prometheus.Register(pushCounter) - if err != nil { - fmt.Println("Push counter couldn't be registered AGAIN, no counting will happen:", err) - return - } - - pushComplete := make(chan struct{}) - // TODO: Start a goroutine that performs repository pushes and reports - // each completion via the channel. - for _ = range pushComplete { - pushCounter.Inc() - } - // Output: - // Push counter couldn't be registered, no counting will happen: descriptor Desc{fqName: "repository_pushes", help: "", constLabels: {}, variableLabels: []} is invalid: empty help string -} - -func ExampleCounterVec() { - binaryVersion := flag.String("environment", "test", "Execution environment: test, staging, production.") - flag.Parse() - - httpReqs := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "http_requests_total", - Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", - ConstLabels: prometheus.Labels{"env": *binaryVersion}, - }, - []string{"code", "method"}, - ) - prometheus.MustRegister(httpReqs) - - httpReqs.WithLabelValues("404", "POST").Add(42) - - // If you have to access the same set of labels very frequently, it - // might be good to retrieve the metric only once and keep a handle to - // it. But beware of deletion of that metric, see below! - m := httpReqs.WithLabelValues("200", "GET") - for i := 0; i < 1000000; i++ { - m.Inc() - } - // Delete a metric from the vector. If you have previously kept a handle - // to that metric (as above), future updates via that handle will go - // unseen (even if you re-create a metric with the same label set - // later). - httpReqs.DeleteLabelValues("200", "GET") - // Same thing with the more verbose Labels syntax. - httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) -} - -func ExampleInstrumentHandler() { - // Handle the "/doc" endpoint with the standard http.FileServer handler. - // By wrapping the handler with InstrumentHandler, request count, - // request and response sizes, and request latency are automatically - // exported to Prometheus, partitioned by HTTP status code and method - // and by the handler name (here "fileserver"). - http.Handle("/doc", prometheus.InstrumentHandler( - "fileserver", http.FileServer(http.Dir("/usr/share/doc")), - )) - // The Prometheus handler still has to be registered to handle the - // "/metrics" endpoint. The handler returned by prometheus.Handler() is - // already instrumented - with "prometheus" as the handler name. In this - // example, we want the handler name to be "metrics", so we instrument - // the uninstrumented Prometheus handler ourselves. - http.Handle("/metrics", prometheus.InstrumentHandler( - "metrics", prometheus.UninstrumentedHandler(), - )) -} - -func ExampleLabelPairSorter() { - labelPairs := []*dto.LabelPair{ - &dto.LabelPair{Name: proto.String("status"), Value: proto.String("404")}, - &dto.LabelPair{Name: proto.String("method"), Value: proto.String("get")}, - } - - sort.Sort(prometheus.LabelPairSorter(labelPairs)) - - fmt.Println(labelPairs) - // Output: - // [name:"method" value:"get" name:"status" value:"404" ] -} - -func ExampleRegister() { - // Imagine you have a worker pool and want to count the tasks completed. - taskCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_total", - Help: "Total number of tasks completed.", - }) - // This will register fine. - if err := prometheus.Register(taskCounter); err != nil { - fmt.Println(err) - } else { - fmt.Println("taskCounter registered.") - } - // Don't forget to tell the HTTP server about the Prometheus handler. - // (In a real program, you still need to start the HTTP server...) - http.Handle("/metrics", prometheus.Handler()) - - // Now you can start workers and give every one of them a pointer to - // taskCounter and let it increment it whenever it completes a task. - taskCounter.Inc() // This has to happen somewhere in the worker code. - - // But wait, you want to see how individual workers perform. So you need - // a vector of counters, with one element for each worker. - taskCounterVec := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_total", - Help: "Total number of tasks completed.", - }, - []string{"worker_id"}, - ) - - // Registering will fail because we already have a metric of that name. - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - - // To fix, first unregister the old taskCounter. - if prometheus.Unregister(taskCounter) { - fmt.Println("taskCounter unregistered.") - } - - // Try registering taskCounterVec again. - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - // Bummer! Still doesn't work. - - // Prometheus will not allow you to ever export metrics with - // inconsistent help strings or label names. After unregistering, the - // unregistered metrics will cease to show up in the /metrics HTTP - // response, but the registry still remembers that those metrics had - // been exported before. For this example, we will now choose a - // different name. (In a real program, you would obviously not export - // the obsolete metric in the first place.) - taskCounterVec = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_by_id", - Help: "Total number of tasks completed.", - }, - []string{"worker_id"}, - ) - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - // Finally it worked! - - // The workers have to tell taskCounterVec their id to increment the - // right element in the metric vector. - taskCounterVec.WithLabelValues("42").Inc() // Code from worker 42. - - // Each worker could also keep a reference to their own counter element - // around. Pick the counter at initialization time of the worker. - myCounter := taskCounterVec.WithLabelValues("42") // From worker 42 initialization code. - myCounter.Inc() // Somewhere in the code of that worker. - - // Note that something like WithLabelValues("42", "spurious arg") would - // panic (because you have provided too many label values). If you want - // to get an error instead, use GetMetricWithLabelValues(...) instead. - notMyCounter, err := taskCounterVec.GetMetricWithLabelValues("42", "spurious arg") - if err != nil { - fmt.Println("Worker initialization failed:", err) - } - if notMyCounter == nil { - fmt.Println("notMyCounter is nil.") - } - - // A different (and somewhat tricky) approach is to use - // ConstLabels. ConstLabels are pairs of label names and label values - // that never change. You might ask what those labels are good for (and - // rightfully so - if they never change, they could as well be part of - // the metric name). There are essentially two use-cases: The first is - // if labels are constant throughout the lifetime of a binary execution, - // but they vary over time or between different instances of a running - // binary. The second is what we have here: Each worker creates and - // registers an own Counter instance where the only difference is in the - // value of the ConstLabels. Those Counters can all be registered - // because the different ConstLabel values guarantee that each worker - // will increment a different Counter metric. - counterOpts := prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks", - Help: "Total number of tasks completed.", - ConstLabels: prometheus.Labels{"worker_id": "42"}, - } - taskCounterForWorker42 := prometheus.NewCounter(counterOpts) - if err := prometheus.Register(taskCounterForWorker42); err != nil { - fmt.Println("taskCounterVForWorker42 not registered:", err) - } else { - fmt.Println("taskCounterForWorker42 registered.") - } - // Obviously, in real code, taskCounterForWorker42 would be a member - // variable of a worker struct, and the "42" would be retrieved with a - // GetId() method or something. The Counter would be created and - // registered in the initialization code of the worker. - - // For the creation of the next Counter, we can recycle - // counterOpts. Just change the ConstLabels. - counterOpts.ConstLabels = prometheus.Labels{"worker_id": "2001"} - taskCounterForWorker2001 := prometheus.NewCounter(counterOpts) - if err := prometheus.Register(taskCounterForWorker2001); err != nil { - fmt.Println("taskCounterVForWorker2001 not registered:", err) - } else { - fmt.Println("taskCounterForWorker2001 registered.") - } - - taskCounterForWorker2001.Inc() - taskCounterForWorker42.Inc() - taskCounterForWorker2001.Inc() - - // Yet another approach would be to turn the workers themselves into - // Collectors and register them. See the Collector example for details. - - // Output: - // taskCounter registered. - // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string - // taskCounter unregistered. - // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string - // taskCounterVec registered. - // Worker initialization failed: inconsistent label cardinality - // notMyCounter is nil. - // taskCounterForWorker42 registered. - // taskCounterForWorker2001 registered. -} - -func ExampleSummary() { - temps := prometheus.NewSummary(prometheus.SummaryOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - }) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - } - - // Just for demonstration, let's check the state of the summary by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - temps.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // summary: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // quantile: < - // quantile: 0.5 - // value: 31.1 - // > - // quantile: < - // quantile: 0.9 - // value: 41.3 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > -} - -func ExampleSummaryVec() { - temps := prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - }, - []string{"species"}, - ) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.WithLabelValues("litoria-caerulea").Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - temps.WithLabelValues("lithobates-catesbeianus").Observe(32 + math.Floor(100*math.Cos(float64(i)*0.11))/10) - } - - // Create a Summary without any observations. - temps.WithLabelValues("leiopelma-hochstetteri") - - // Just for demonstration, let's check the state of the summary vector - // by (ab)using its Collect method and the Write method of its elements - // (which is usually only used by Prometheus internally - code like the - // following will never appear in your own code). - metricChan := make(chan prometheus.Metric) - go func() { - defer close(metricChan) - temps.Collect(metricChan) - }() - - metricStrings := []string{} - for metric := range metricChan { - dtoMetric := &dto.Metric{} - metric.Write(dtoMetric) - metricStrings = append(metricStrings, proto.MarshalTextString(dtoMetric)) - } - sort.Strings(metricStrings) // For reproducible print order. - fmt.Println(metricStrings) - - // Output: - // [label: < - // name: "species" - // value: "leiopelma-hochstetteri" - // > - // summary: < - // sample_count: 0 - // sample_sum: 0 - // quantile: < - // quantile: 0.5 - // value: nan - // > - // quantile: < - // quantile: 0.9 - // value: nan - // > - // quantile: < - // quantile: 0.99 - // value: nan - // > - // > - // label: < - // name: "species" - // value: "lithobates-catesbeianus" - // > - // summary: < - // sample_count: 1000 - // sample_sum: 31956.100000000017 - // quantile: < - // quantile: 0.5 - // value: 32.4 - // > - // quantile: < - // quantile: 0.9 - // value: 41.4 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > - // label: < - // name: "species" - // value: "litoria-caerulea" - // > - // summary: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // quantile: < - // quantile: 0.5 - // value: 31.1 - // > - // quantile: < - // quantile: 0.9 - // value: 41.3 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > - // ] -} - -func ExampleConstSummary() { - desc := prometheus.NewDesc( - "http_request_duration_seconds", - "A summary of the HTTP request durations.", - []string{"code", "method"}, - prometheus.Labels{"owner": "example"}, - ) - - // Create a constant summary from values we got from a 3rd party telemetry system. - s := prometheus.MustNewConstSummary( - desc, - 4711, 403.34, - map[float64]float64{0.5: 42.3, 0.9: 323.3}, - "200", "get", - ) - - // Just for demonstration, let's check the state of the summary by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - s.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // label: < - // name: "code" - // value: "200" - // > - // label: < - // name: "method" - // value: "get" - // > - // label: < - // name: "owner" - // value: "example" - // > - // summary: < - // sample_count: 4711 - // sample_sum: 403.34 - // quantile: < - // quantile: 0.5 - // value: 42.3 - // > - // quantile: < - // quantile: 0.9 - // value: 323.3 - // > - // > -} - -func ExampleHistogram() { - temps := prometheus.NewHistogram(prometheus.HistogramOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. - }) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - } - - // Just for demonstration, let's check the state of the histogram by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - temps.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // histogram: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // bucket: < - // cumulative_count: 192 - // upper_bound: 20 - // > - // bucket: < - // cumulative_count: 366 - // upper_bound: 25 - // > - // bucket: < - // cumulative_count: 501 - // upper_bound: 30 - // > - // bucket: < - // cumulative_count: 638 - // upper_bound: 35 - // > - // bucket: < - // cumulative_count: 816 - // upper_bound: 40 - // > - // > -} - -func ExampleConstHistogram() { - desc := prometheus.NewDesc( - "http_request_duration_seconds", - "A histogram of the HTTP request durations.", - []string{"code", "method"}, - prometheus.Labels{"owner": "example"}, - ) - - // Create a constant histogram from values we got from a 3rd party telemetry system. - h := prometheus.MustNewConstHistogram( - desc, - 4711, 403.34, - map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, - "200", "get", - ) - - // Just for demonstration, let's check the state of the histogram by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - h.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // label: < - // name: "code" - // value: "200" - // > - // label: < - // name: "method" - // value: "get" - // > - // label: < - // name: "owner" - // value: "example" - // > - // histogram: < - // sample_count: 4711 - // sample_sum: 403.34 - // bucket: < - // cumulative_count: 121 - // upper_bound: 25 - // > - // bucket: < - // cumulative_count: 2403 - // upper_bound: 50 - // > - // bucket: < - // cumulative_count: 3221 - // upper_bound: 100 - // > - // bucket: < - // cumulative_count: 4233 - // upper_bound: 200 - // > - // > -} - -func ExamplePushCollectors() { - hostname, _ := os.Hostname() - completionTime := prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "db_backup_last_completion_time", - Help: "The timestamp of the last succesful completion of a DB backup.", - }) - completionTime.Set(float64(time.Now().Unix())) - if err := prometheus.PushCollectors( - "db_backup", hostname, - "http://pushgateway:9091", - completionTime, - ); err != nil { - fmt.Println("Could not push completion time to Pushgateway:", err) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/expvar_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/expvar_test.go deleted file mode 100644 index 5d3128fae..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/expvar_test.go +++ /dev/null @@ -1,97 +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_test - -import ( - "expvar" - "fmt" - "sort" - "strings" - - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus" -) - -func ExampleExpvarCollector() { - expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ - "memstats": prometheus.NewDesc( - "expvar_memstats", - "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", - []string{"type"}, nil, - ), - "lone-int": prometheus.NewDesc( - "expvar_lone_int", - "Just an expvar int as an example.", - nil, nil, - ), - "http-request-map": prometheus.NewDesc( - "expvar_http_request_total", - "How many http requests processed, partitioned by status code and http method.", - []string{"code", "method"}, nil, - ), - }) - prometheus.MustRegister(expvarCollector) - - // The Prometheus part is done here. But to show that this example is - // doing anything, we have to manually export something via expvar. In - // real-life use-cases, some library would already have exported via - // expvar what we want to re-export as Prometheus metrics. - expvar.NewInt("lone-int").Set(42) - expvarMap := expvar.NewMap("http-request-map") - var ( - expvarMap1, expvarMap2 expvar.Map - expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int - ) - expvarMap1.Init() - expvarMap2.Init() - expvarInt11.Set(3) - expvarInt12.Set(13) - expvarInt21.Set(11) - expvarInt22.Set(212) - expvarMap1.Set("POST", &expvarInt11) - expvarMap1.Set("GET", &expvarInt12) - expvarMap2.Set("POST", &expvarInt21) - expvarMap2.Set("GET", &expvarInt22) - expvarMap.Set("404", &expvarMap1) - expvarMap.Set("200", &expvarMap2) - // Results in the following expvar map: - // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} - - // Let's see what the scrape would yield, but exclude the memstats metrics. - metricStrings := []string{} - metric := dto.Metric{} - metricChan := make(chan prometheus.Metric) - go func() { - expvarCollector.Collect(metricChan) - close(metricChan) - }() - for m := range metricChan { - if strings.Index(m.Desc().String(), "expvar_memstats") == -1 { - metric.Reset() - m.Write(&metric) - metricStrings = append(metricStrings, metric.String()) - } - } - sort.Strings(metricStrings) - for _, s := range metricStrings { - fmt.Println(strings.TrimRight(s, " ")) - } - // Output: - // label: label: untyped: - // label: label: untyped: - // label: label: untyped: - // label: label: untyped: - // untyped: -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/gauge_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/gauge_test.go deleted file mode 100644 index 48cab4636..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/gauge_test.go +++ /dev/null @@ -1,182 +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" - "math/rand" - "sync" - "testing" - "testing/quick" - - dto "github.com/prometheus/client_model/go" -) - -func listenGaugeStream(vals, result chan float64, done chan struct{}) { - var sum float64 -outer: - for { - select { - case <-done: - close(vals) - for v := range vals { - sum += v - } - break outer - case v := <-vals: - sum += v - } - } - result <- sum - close(result) -} - -func TestGaugeConcurrency(t *testing.T) { - it := func(n uint32) bool { - mutations := int(n % 10000) - concLevel := int(n%15 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sStream := make(chan float64, mutations*concLevel) - result := make(chan float64) - done := make(chan struct{}) - - go listenGaugeStream(sStream, result, done) - go func() { - end.Wait() - close(done) - }() - - gge := NewGauge(GaugeOpts{ - Name: "test_gauge", - Help: "no help can be found here", - }) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - vals[j] = rand.Float64() - 0.5 - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sStream <- v - gge.Add(v) - } - end.Done() - }(vals) - } - start.Done() - - if expected, got := <-result, math.Float64frombits(gge.(*value).valBits); math.Abs(expected-got) > 0.000001 { - t.Fatalf("expected approx. %f, got %f", expected, got) - return false - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Fatal(err) - } -} - -func TestGaugeVecConcurrency(t *testing.T) { - it := func(n uint32) bool { - mutations := int(n % 10000) - concLevel := int(n%15 + 1) - vecLength := int(n%5 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sStreams := make([]chan float64, vecLength) - results := make([]chan float64, vecLength) - done := make(chan struct{}) - - for i := 0; i < vecLength; i++ { - sStreams[i] = make(chan float64, mutations*concLevel) - results[i] = make(chan float64) - go listenGaugeStream(sStreams[i], results[i], done) - } - - go func() { - end.Wait() - close(done) - }() - - gge := NewGaugeVec( - GaugeOpts{ - Name: "test_gauge", - Help: "no help can be found here", - }, - []string{"label"}, - ) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - pick := make([]int, mutations) - for j := 0; j < mutations; j++ { - vals[j] = rand.Float64() - 0.5 - pick[j] = rand.Intn(vecLength) - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - sStreams[pick[i]] <- v - gge.WithLabelValues(string('A' + pick[i])).Add(v) - } - end.Done() - }(vals) - } - start.Done() - - for i := range sStreams { - if expected, got := <-results[i], math.Float64frombits(gge.WithLabelValues(string('A'+i)).(*value).valBits); math.Abs(expected-got) > 0.000001 { - t.Fatalf("expected approx. %f, got %f", expected, got) - return false - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Fatal(err) - } -} - -func TestGaugeFunc(t *testing.T) { - gf := NewGaugeFunc( - GaugeOpts{ - Name: "test_name", - Help: "test help", - ConstLabels: Labels{"a": "1", "b": "2"}, - }, - func() float64 { return 3.1415 }, - ) - - if expected, got := `Desc{fqName: "test_name", help: "test help", constLabels: {a="1",b="2"}, variableLabels: []}`, gf.Desc().String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } - - m := &dto.Metric{} - gf.Write(m) - - if expected, got := `label: label: gauge: `, m.String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/go_collector_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/go_collector_test.go deleted file mode 100644 index 9a8858cbd..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/go_collector_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package prometheus - -import ( - "runtime" - "testing" - "time" - - dto "github.com/prometheus/client_model/go" -) - -func TestGoCollector(t *testing.T) { - var ( - c = NewGoCollector() - ch = make(chan Metric) - waitc = make(chan struct{}) - closec = make(chan struct{}) - old = -1 - ) - defer close(closec) - - go func() { - c.Collect(ch) - go func(c <-chan struct{}) { - <-c - }(closec) - <-waitc - c.Collect(ch) - }() - - for { - select { - case metric := <-ch: - switch m := metric.(type) { - // Attention, this also catches Counter... - case Gauge: - pb := &dto.Metric{} - m.Write(pb) - if pb.GetGauge() == nil { - continue - } - - if old == -1 { - old = int(pb.GetGauge().GetValue()) - close(waitc) - continue - } - - if diff := int(pb.GetGauge().GetValue()) - old; diff != 1 { - // TODO: This is flaky in highly concurrent situations. - t.Errorf("want 1 new goroutine, got %d", diff) - } - - // GoCollector performs two sends per call. - // On line 27 we need to receive the second send - // to shut down cleanly. - <-ch - return - } - case <-time.After(1 * time.Second): - t.Fatalf("expected collect timed out") - } - } -} - -func TestGCCollector(t *testing.T) { - var ( - c = NewGoCollector() - ch = make(chan Metric) - waitc = make(chan struct{}) - closec = make(chan struct{}) - oldGC uint64 - oldPause float64 - ) - defer close(closec) - - go func() { - c.Collect(ch) - // force GC - runtime.GC() - <-waitc - c.Collect(ch) - }() - - first := true - for { - select { - case metric := <-ch: - switch m := metric.(type) { - case *constSummary, *value: - pb := &dto.Metric{} - m.Write(pb) - if pb.GetSummary() == nil { - continue - } - - if len(pb.GetSummary().Quantile) != 5 { - t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) - } - for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { - if *pb.GetSummary().Quantile[idx].Quantile != want { - t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) - } - } - if first { - first = false - oldGC = *pb.GetSummary().SampleCount - oldPause = *pb.GetSummary().SampleSum - close(waitc) - continue - } - if diff := *pb.GetSummary().SampleCount - oldGC; diff != 1 { - t.Errorf("want 1 new garbage collection run, got %d", diff) - } - if diff := *pb.GetSummary().SampleSum - oldPause; diff <= 0 { - t.Errorf("want moar pause, got %f", diff) - } - return - } - case <-time.After(1 * time.Second): - t.Fatalf("expected collect timed out") - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/histogram_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/histogram_test.go deleted file mode 100644 index 11cf66b4f..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/histogram_test.go +++ /dev/null @@ -1,326 +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 ( - "math" - "math/rand" - "reflect" - "sort" - "sync" - "testing" - "testing/quick" - - dto "github.com/prometheus/client_model/go" -) - -func benchmarkHistogramObserve(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewHistogram(HistogramOpts{}) - - for i := 0; i < w; i++ { - go func() { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Observe(float64(i)) - } - - wg.Done() - }() - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkHistogramObserve1(b *testing.B) { - benchmarkHistogramObserve(1, b) -} - -func BenchmarkHistogramObserve2(b *testing.B) { - benchmarkHistogramObserve(2, b) -} - -func BenchmarkHistogramObserve4(b *testing.B) { - benchmarkHistogramObserve(4, b) -} - -func BenchmarkHistogramObserve8(b *testing.B) { - benchmarkHistogramObserve(8, b) -} - -func benchmarkHistogramWrite(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewHistogram(HistogramOpts{}) - - for i := 0; i < 1000000; i++ { - s.Observe(float64(i)) - } - - for j := 0; j < w; j++ { - outs := make([]dto.Metric, b.N) - - go func(o []dto.Metric) { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Write(&o[i]) - } - - wg.Done() - }(outs) - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkHistogramWrite1(b *testing.B) { - benchmarkHistogramWrite(1, b) -} - -func BenchmarkHistogramWrite2(b *testing.B) { - benchmarkHistogramWrite(2, b) -} - -func BenchmarkHistogramWrite4(b *testing.B) { - benchmarkHistogramWrite(4, b) -} - -func BenchmarkHistogramWrite8(b *testing.B) { - benchmarkHistogramWrite(8, b) -} - -// Intentionally adding +Inf here to test if that case is handled correctly. -// Also, getCumulativeCounts depends on it. -var testBuckets = []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)} - -func TestHistogramConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%5 + 1) - total := mutations * concLevel - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewHistogram(HistogramOpts{ - Name: "test_histogram", - Help: "helpless", - Buckets: testBuckets, - }) - - allVars := make([]float64, total) - var sampleSum float64 - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - allVars[i*mutations+j] = v - sampleSum += v - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sum.Observe(v) - } - end.Done() - }(vals) - } - sort.Float64s(allVars) - start.Done() - end.Wait() - - m := &dto.Metric{} - sum.Write(m) - if got, want := int(*m.Histogram.SampleCount), total; got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - wantCounts := getCumulativeCounts(allVars) - - if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { - t.Errorf("got %d buckets in protobuf, want %d", got, want) - } - for i, wantBound := range testBuckets { - if i == len(testBuckets)-1 { - break // No +Inf bucket in protobuf. - } - if gotBound := *m.Histogram.Bucket[i].UpperBound; gotBound != wantBound { - t.Errorf("got bound %f, want %f", gotBound, wantBound) - } - if gotCount, wantCount := *m.Histogram.Bucket[i].CumulativeCount, wantCounts[i]; gotCount != wantCount { - t.Errorf("got count %d, want %d", gotCount, wantCount) - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestHistogramVecConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%7 + 1) - vecLength := int(n%3 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - his := NewHistogramVec( - HistogramOpts{ - Name: "test_histogram", - Help: "helpless", - Buckets: []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)}, - }, - []string{"label"}, - ) - - allVars := make([][]float64, vecLength) - sampleSums := make([]float64, vecLength) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - picks := make([]int, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - pick := rand.Intn(vecLength) - picks[j] = pick - allVars[pick] = append(allVars[pick], v) - sampleSums[pick] += v - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - his.WithLabelValues(string('A' + picks[i])).Observe(v) - } - end.Done() - }(vals) - } - for _, vars := range allVars { - sort.Float64s(vars) - } - start.Done() - end.Wait() - - for i := 0; i < vecLength; i++ { - m := &dto.Metric{} - s := his.WithLabelValues(string('A' + i)) - s.Write(m) - - if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { - t.Errorf("got %d buckets in protobuf, want %d", got, want) - } - if got, want := int(*m.Histogram.SampleCount), len(allVars[i]); got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Histogram.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - wantCounts := getCumulativeCounts(allVars[i]) - - for j, wantBound := range testBuckets { - if j == len(testBuckets)-1 { - break // No +Inf bucket in protobuf. - } - if gotBound := *m.Histogram.Bucket[j].UpperBound; gotBound != wantBound { - t.Errorf("got bound %f, want %f", gotBound, wantBound) - } - if gotCount, wantCount := *m.Histogram.Bucket[j].CumulativeCount, wantCounts[j]; gotCount != wantCount { - t.Errorf("got count %d, want %d", gotCount, wantCount) - } - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func getCumulativeCounts(vars []float64) []uint64 { - counts := make([]uint64, len(testBuckets)) - for _, v := range vars { - for i := len(testBuckets) - 1; i >= 0; i-- { - if v > testBuckets[i] { - break - } - counts[i]++ - } - } - return counts -} - -func TestBuckets(t *testing.T) { - got := LinearBuckets(-15, 5, 6) - want := []float64{-15, -10, -5, 0, 5, 10} - if !reflect.DeepEqual(got, want) { - t.Errorf("linear buckets: got %v, want %v", got, want) - } - - got = ExponentialBuckets(100, 1.2, 3) - want = []float64{100, 120, 144} - if !reflect.DeepEqual(got, want) { - t.Errorf("linear buckets: got %v, want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/http_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/http_test.go deleted file mode 100644 index ffe0418cf..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/http_test.go +++ /dev/null @@ -1,121 +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 ( - "net/http" - "net/http/httptest" - "testing" - "time" - - dto "github.com/prometheus/client_model/go" -) - -type respBody string - -func (b respBody) ServeHTTP(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusTeapot) - w.Write([]byte(b)) -} - -func TestInstrumentHandler(t *testing.T) { - defer func(n nower) { - now = n.(nower) - }(now) - - instant := time.Now() - end := instant.Add(30 * time.Second) - now = nowSeries(instant, end) - respBody := respBody("Howdy there!") - - hndlr := InstrumentHandler("test-handler", respBody) - - opts := SummaryOpts{ - Subsystem: "http", - ConstLabels: Labels{"handler": "test-handler"}, - } - - reqCnt := MustRegisterOrGet(NewCounterVec( - CounterOpts{ - Namespace: opts.Namespace, - Subsystem: opts.Subsystem, - Name: "requests_total", - Help: "Total number of HTTP requests made.", - ConstLabels: opts.ConstLabels, - }, - instLabels, - )).(*CounterVec) - - opts.Name = "request_duration_microseconds" - opts.Help = "The HTTP request latencies in microseconds." - reqDur := MustRegisterOrGet(NewSummary(opts)).(Summary) - - opts.Name = "request_size_bytes" - opts.Help = "The HTTP request sizes in bytes." - MustRegisterOrGet(NewSummary(opts)) - - opts.Name = "response_size_bytes" - opts.Help = "The HTTP response sizes in bytes." - MustRegisterOrGet(NewSummary(opts)) - - reqCnt.Reset() - - resp := httptest.NewRecorder() - req := &http.Request{ - Method: "GET", - } - - hndlr.ServeHTTP(resp, req) - - if resp.Code != http.StatusTeapot { - t.Fatalf("expected status %d, got %d", http.StatusTeapot, resp.Code) - } - if string(resp.Body.Bytes()) != "Howdy there!" { - t.Fatalf("expected body %s, got %s", "Howdy there!", string(resp.Body.Bytes())) - } - - out := &dto.Metric{} - reqDur.Write(out) - if want, got := "test-handler", out.Label[0].GetValue(); want != got { - t.Errorf("want label value %q in reqDur, got %q", want, got) - } - if want, got := uint64(1), out.Summary.GetSampleCount(); want != got { - t.Errorf("want sample count %d in reqDur, got %d", want, got) - } - - out.Reset() - if want, got := 1, len(reqCnt.children); want != got { - t.Errorf("want %d children in reqCnt, got %d", want, got) - } - cnt, err := reqCnt.GetMetricWithLabelValues("get", "418") - if err != nil { - t.Fatal(err) - } - cnt.Write(out) - if want, got := "418", out.Label[0].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if want, got := "test-handler", out.Label[1].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if want, got := "get", out.Label[2].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if out.Counter == nil { - t.Fatal("expected non-nil counter in reqCnt") - } - if want, got := 1., out.Counter.GetValue(); want != got { - t.Errorf("want reqCnt of %f, got %f", want, got) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/metric_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/metric_test.go deleted file mode 100644 index 7145f5e53..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/metric_test.go +++ /dev/null @@ -1,35 +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 "testing" - -func TestBuildFQName(t *testing.T) { - scenarios := []struct{ namespace, subsystem, name, result string }{ - {"a", "b", "c", "a_b_c"}, - {"", "b", "c", "b_c"}, - {"a", "", "c", "a_c"}, - {"", "", "c", "c"}, - {"a", "b", "", ""}, - {"a", "", "", ""}, - {"", "b", "", ""}, - {" ", "", "", ""}, - } - - for i, s := range scenarios { - if want, got := s.result, BuildFQName(s.namespace, s.subsystem, s.name); want != got { - t.Errorf("%d. want %s, got %s", i, want, got) - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/process_collector_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/process_collector_test.go deleted file mode 100644 index 829715acd..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/process_collector_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package prometheus - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "regexp" - "testing" - - "github.com/prometheus/procfs" -) - -func TestProcessCollector(t *testing.T) { - if _, err := procfs.Self(); err != nil { - t.Skipf("skipping TestProcessCollector, procfs not available: %s", err) - } - - registry := newRegistry() - registry.Register(NewProcessCollector(os.Getpid(), "")) - registry.Register(NewProcessCollectorPIDFn( - func() (int, error) { return os.Getpid(), nil }, "foobar")) - - s := httptest.NewServer(InstrumentHandler("prometheus", registry)) - defer s.Close() - r, err := http.Get(s.URL) - if err != nil { - t.Fatal(err) - } - defer r.Body.Close() - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Fatal(err) - } - - for _, re := range []*regexp.Regexp{ - regexp.MustCompile("process_cpu_seconds_total [0-9]"), - regexp.MustCompile("process_max_fds [0-9]{2,}"), - regexp.MustCompile("process_open_fds [1-9]"), - regexp.MustCompile("process_virtual_memory_bytes [1-9]"), - regexp.MustCompile("process_resident_memory_bytes [1-9]"), - regexp.MustCompile("process_start_time_seconds [0-9.]{10,}"), - regexp.MustCompile("foobar_process_cpu_seconds_total [0-9]"), - regexp.MustCompile("foobar_process_max_fds [0-9]{2,}"), - regexp.MustCompile("foobar_process_open_fds [1-9]"), - regexp.MustCompile("foobar_process_virtual_memory_bytes [1-9]"), - regexp.MustCompile("foobar_process_resident_memory_bytes [1-9]"), - regexp.MustCompile("foobar_process_start_time_seconds [0-9.]{10,}"), - } { - if !re.Match(body) { - t.Errorf("want body to match %s\n%s", re, body) - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/registry_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/registry_test.go deleted file mode 100644 index f30c90c06..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/registry_test.go +++ /dev/null @@ -1,535 +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. - -// 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 prometheus - -import ( - "bytes" - "encoding/binary" - "net/http" - "testing" - - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" -) - -type fakeResponseWriter struct { - header http.Header - body bytes.Buffer -} - -func (r *fakeResponseWriter) Header() http.Header { - return r.header -} - -func (r *fakeResponseWriter) Write(d []byte) (l int, err error) { - return r.body.Write(d) -} - -func (r *fakeResponseWriter) WriteHeader(c int) { -} - -func testHandler(t testing.TB) { - - metricVec := NewCounterVec( - CounterOpts{ - Name: "name", - Help: "docstring", - ConstLabels: Labels{"constname": "constvalue"}, - }, - []string{"labelname"}, - ) - - metricVec.WithLabelValues("val1").Inc() - metricVec.WithLabelValues("val2").Inc() - - varintBuf := make([]byte, binary.MaxVarintLen32) - - externalMetricFamily := &dto.MetricFamily{ - Name: proto.String("externalname"), - Help: proto.String("externaldocstring"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("externalconstname"), - Value: proto.String("externalconstvalue"), - }, - { - Name: proto.String("externallabelname"), - Value: proto.String("externalval1"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - }, - } - marshaledExternalMetricFamily, err := proto.Marshal(externalMetricFamily) - if err != nil { - t.Fatal(err) - } - var externalBuf bytes.Buffer - l := binary.PutUvarint(varintBuf, uint64(len(marshaledExternalMetricFamily))) - _, err = externalBuf.Write(varintBuf[:l]) - if err != nil { - t.Fatal(err) - } - _, err = externalBuf.Write(marshaledExternalMetricFamily) - if err != nil { - t.Fatal(err) - } - externalMetricFamilyAsBytes := externalBuf.Bytes() - externalMetricFamilyAsText := []byte(`# HELP externalname externaldocstring -# TYPE externalname counter -externalname{externalconstname="externalconstvalue",externallabelname="externalval1"} 1 -`) - externalMetricFamilyAsProtoText := []byte(`name: "externalname" -help: "externaldocstring" -type: COUNTER -metric: < - label: < - name: "externalconstname" - value: "externalconstvalue" - > - label: < - name: "externallabelname" - value: "externalval1" - > - counter: < - value: 1 - > -> - -`) - externalMetricFamilyAsProtoCompactText := []byte(`name:"externalname" help:"externaldocstring" type:COUNTER metric: label: counter: > -`) - - expectedMetricFamily := &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("docstring"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - }, - } - marshaledExpectedMetricFamily, err := proto.Marshal(expectedMetricFamily) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - l = binary.PutUvarint(varintBuf, uint64(len(marshaledExpectedMetricFamily))) - _, err = buf.Write(varintBuf[:l]) - if err != nil { - t.Fatal(err) - } - _, err = buf.Write(marshaledExpectedMetricFamily) - if err != nil { - t.Fatal(err) - } - expectedMetricFamilyAsBytes := buf.Bytes() - expectedMetricFamilyAsText := []byte(`# HELP name docstring -# TYPE name counter -name{constname="constvalue",labelname="val1"} 1 -name{constname="constvalue",labelname="val2"} 1 -`) - expectedMetricFamilyAsProtoText := []byte(`name: "name" -help: "docstring" -type: COUNTER -metric: < - label: < - name: "constname" - value: "constvalue" - > - label: < - name: "labelname" - value: "val1" - > - counter: < - value: 1 - > -> -metric: < - label: < - name: "constname" - value: "constvalue" - > - label: < - name: "labelname" - value: "val2" - > - counter: < - value: 1 - > -> - -`) - expectedMetricFamilyAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > -`) - - externalMetricFamilyWithSameName := &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("inconsistent help string does not matter here"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("different_val"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(42), - }, - }, - }, - } - - expectedMetricFamilyMergedWithExternalAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > metric: label: counter: > -`) - - type output struct { - headers map[string]string - body []byte - } - - var scenarios = []struct { - headers map[string]string - out output - collector Collector - externalMF []*dto.MetricFamily - }{ - { // 0 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, dings/bums;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 1 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, application/quark;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 2 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 3 - headers: map[string]string{ - "Accept": "text/plain;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: []byte{}, - }, - }, - { // 4 - headers: map[string]string{ - "Accept": "application/json", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: expectedMetricFamilyAsText, - }, - collector: metricVec, - }, - { // 5 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: expectedMetricFamilyAsBytes, - }, - collector: metricVec, - }, - { // 6 - headers: map[string]string{ - "Accept": "application/json", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: externalMetricFamilyAsText, - }, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 7 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: externalMetricFamilyAsBytes, - }, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 8 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsBytes, - expectedMetricFamilyAsBytes, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 9 - headers: map[string]string{ - "Accept": "text/plain", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 10 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: expectedMetricFamilyAsText, - }, - collector: metricVec, - }, - { // 11 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5;version=0.0.4", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsText, - expectedMetricFamilyAsText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 12 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.2, text/plain;q=0.5;version=0.0.2", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsBytes, - expectedMetricFamilyAsBytes, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 13 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=text;q=0.5, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.4", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoText, - expectedMetricFamilyAsProtoText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 14 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoCompactText, - expectedMetricFamilyAsProtoCompactText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 15 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoCompactText, - expectedMetricFamilyMergedWithExternalAsProtoCompactText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{ - externalMetricFamily, - externalMetricFamilyWithSameName, - }, - }, - } - for i, scenario := range scenarios { - registry := newRegistry() - registry.collectChecksEnabled = true - - if scenario.collector != nil { - registry.Register(scenario.collector) - } - if scenario.externalMF != nil { - registry.metricFamilyInjectionHook = func() []*dto.MetricFamily { - return scenario.externalMF - } - } - writer := &fakeResponseWriter{ - header: http.Header{}, - } - handler := InstrumentHandler("prometheus", registry) - request, _ := http.NewRequest("GET", "/", nil) - for key, value := range scenario.headers { - request.Header.Add(key, value) - } - handler(writer, request) - - for key, value := range scenario.out.headers { - if writer.Header().Get(key) != value { - t.Errorf( - "%d. expected %q for header %q, got %q", - i, value, key, writer.Header().Get(key), - ) - } - } - - if !bytes.Equal(scenario.out.body, writer.body.Bytes()) { - t.Errorf( - "%d. expected %q for body, got %q", - i, scenario.out.body, writer.body.Bytes(), - ) - } - } -} - -func TestHandler(t *testing.T) { - testHandler(t) -} - -func BenchmarkHandler(b *testing.B) { - for i := 0; i < b.N; i++ { - testHandler(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/summary_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/summary_test.go deleted file mode 100644 index 0790cdfe7..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/summary_test.go +++ /dev/null @@ -1,347 +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" - "math/rand" - "sort" - "sync" - "testing" - "testing/quick" - "time" - - dto "github.com/prometheus/client_model/go" -) - -func benchmarkSummaryObserve(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewSummary(SummaryOpts{}) - - for i := 0; i < w; i++ { - go func() { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Observe(float64(i)) - } - - wg.Done() - }() - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkSummaryObserve1(b *testing.B) { - benchmarkSummaryObserve(1, b) -} - -func BenchmarkSummaryObserve2(b *testing.B) { - benchmarkSummaryObserve(2, b) -} - -func BenchmarkSummaryObserve4(b *testing.B) { - benchmarkSummaryObserve(4, b) -} - -func BenchmarkSummaryObserve8(b *testing.B) { - benchmarkSummaryObserve(8, b) -} - -func benchmarkSummaryWrite(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewSummary(SummaryOpts{}) - - for i := 0; i < 1000000; i++ { - s.Observe(float64(i)) - } - - for j := 0; j < w; j++ { - outs := make([]dto.Metric, b.N) - - go func(o []dto.Metric) { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Write(&o[i]) - } - - wg.Done() - }(outs) - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkSummaryWrite1(b *testing.B) { - benchmarkSummaryWrite(1, b) -} - -func BenchmarkSummaryWrite2(b *testing.B) { - benchmarkSummaryWrite(2, b) -} - -func BenchmarkSummaryWrite4(b *testing.B) { - benchmarkSummaryWrite(4, b) -} - -func BenchmarkSummaryWrite8(b *testing.B) { - benchmarkSummaryWrite(8, b) -} - -func TestSummaryConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%5 + 1) - total := mutations * concLevel - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewSummary(SummaryOpts{ - Name: "test_summary", - Help: "helpless", - }) - - allVars := make([]float64, total) - var sampleSum float64 - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - allVars[i*mutations+j] = v - sampleSum += v - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sum.Observe(v) - } - end.Done() - }(vals) - } - sort.Float64s(allVars) - start.Done() - end.Wait() - - m := &dto.Metric{} - sum.Write(m) - if got, want := int(*m.Summary.SampleCount), total; got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Summary.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - for i, wantQ := range objectives { - ε := DefObjectives[wantQ] - gotQ := *m.Summary.Quantile[i].Quantile - gotV := *m.Summary.Quantile[i].Value - min, max := getBounds(allVars, wantQ, ε) - if gotQ != wantQ { - t.Errorf("got quantile %f, want %f", gotQ, wantQ) - } - if gotV < min || gotV > max { - t.Errorf("got %f for quantile %f, want [%f,%f]", gotV, gotQ, min, max) - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestSummaryVecConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%7 + 1) - vecLength := int(n%3 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewSummaryVec( - SummaryOpts{ - Name: "test_summary", - Help: "helpless", - }, - []string{"label"}, - ) - - allVars := make([][]float64, vecLength) - sampleSums := make([]float64, vecLength) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - picks := make([]int, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - pick := rand.Intn(vecLength) - picks[j] = pick - allVars[pick] = append(allVars[pick], v) - sampleSums[pick] += v - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - sum.WithLabelValues(string('A' + picks[i])).Observe(v) - } - end.Done() - }(vals) - } - for _, vars := range allVars { - sort.Float64s(vars) - } - start.Done() - end.Wait() - - for i := 0; i < vecLength; i++ { - m := &dto.Metric{} - s := sum.WithLabelValues(string('A' + i)) - s.Write(m) - if got, want := int(*m.Summary.SampleCount), len(allVars[i]); got != want { - t.Errorf("got sample count %d for label %c, want %d", got, 'A'+i, want) - } - if got, want := *m.Summary.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f for label %c, want %f", got, 'A'+i, want) - } - for j, wantQ := range objectives { - ε := DefObjectives[wantQ] - gotQ := *m.Summary.Quantile[j].Quantile - gotV := *m.Summary.Quantile[j].Value - min, max := getBounds(allVars[i], wantQ, ε) - if gotQ != wantQ { - t.Errorf("got quantile %f for label %c, want %f", gotQ, 'A'+i, wantQ) - } - if gotV < min || gotV > max { - t.Errorf("got %f for quantile %f for label %c, want [%f,%f]", gotV, gotQ, 'A'+i, min, max) - } - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestSummaryDecay(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - // More because it depends on timing than because it is particularly long... - } - - sum := NewSummary(SummaryOpts{ - Name: "test_summary", - Help: "helpless", - MaxAge: 100 * time.Millisecond, - Objectives: map[float64]float64{0.1: 0.001}, - AgeBuckets: 10, - }) - - m := &dto.Metric{} - i := 0 - tick := time.NewTicker(time.Millisecond) - for _ = range tick.C { - i++ - sum.Observe(float64(i)) - if i%10 == 0 { - sum.Write(m) - if got, want := *m.Summary.Quantile[0].Value, math.Max(float64(i)/10, float64(i-90)); math.Abs(got-want) > 20 { - t.Errorf("%d. got %f, want %f", i, got, want) - } - m.Reset() - } - if i >= 1000 { - break - } - } - tick.Stop() - // Wait for MaxAge without observations and make sure quantiles are NaN. - time.Sleep(100 * time.Millisecond) - sum.Write(m) - if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) { - t.Errorf("got %f, want NaN after expiration", got) - } -} - -func getBounds(vars []float64, q, ε float64) (min, max float64) { - // TODO: This currently tolerates an error of up to 2*ε. The error must - // be at most ε, but for some reason, it's sometimes slightly - // higher. That's a bug. - n := float64(len(vars)) - lower := int((q - 2*ε) * n) - upper := int(math.Ceil((q + 2*ε) * n)) - min = vars[0] - if lower > 1 { - min = vars[lower-1] - } - max = vars[len(vars)-1] - if upper < len(vars) { - max = vars[upper-1] - } - return -} diff --git a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/vec_test.go b/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/vec_test.go deleted file mode 100644 index 0e9431e65..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus/vec_test.go +++ /dev/null @@ -1,91 +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 ( - "hash/fnv" - "testing" -) - -func TestDelete(t *testing.T) { - desc := NewDesc("test", "helpless", []string{"l1", "l2"}, nil) - vec := MetricVec{ - children: map[uint64]Metric{}, - desc: desc, - hash: fnv.New64a(), - newMetric: func(lvs ...string) Metric { - return newValue(desc, UntypedValue, 0, lvs...) - }, - } - - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l2": "v1", "l1": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l1": "v1"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -func TestDeleteLabelValues(t *testing.T) { - desc := NewDesc("test", "helpless", []string{"l1", "l2"}, nil) - vec := MetricVec{ - children: map[uint64]Metric{}, - desc: desc, - hash: fnv.New64a(), - newMetric: func(lvs ...string) Metric { - return newValue(desc, UntypedValue, 0, lvs...) - }, - } - - if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.DeleteLabelValues("v1", "v2"), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.DeleteLabelValues("v2", "v1"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.DeleteLabelValues("v1"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/bench_test.go b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/bench_test.go deleted file mode 100644 index 92b16a028..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/bench_test.go +++ /dev/null @@ -1,171 +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 expfmt - -import ( - "bytes" - "compress/gzip" - "io" - "io/ioutil" - "testing" - - "github.com/matttproud/golang_protobuf_extensions/pbutil" - - dto "github.com/prometheus/client_model/go" -) - -var parser TextParser - -// Benchmarks to show how much penalty text format parsing actually inflicts. -// -// Example results on Linux 3.13.0, Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz, go1.4. -// -// BenchmarkParseText 1000 1188535 ns/op 205085 B/op 6135 allocs/op -// BenchmarkParseTextGzip 1000 1376567 ns/op 246224 B/op 6151 allocs/op -// BenchmarkParseProto 10000 172790 ns/op 52258 B/op 1160 allocs/op -// BenchmarkParseProtoGzip 5000 324021 ns/op 94931 B/op 1211 allocs/op -// BenchmarkParseProtoMap 10000 187946 ns/op 58714 B/op 1203 allocs/op -// -// CONCLUSION: The overhead for the map is negligible. Text format needs ~5x more allocations. -// Without compression, it needs ~7x longer, but with compression (the more relevant scenario), -// the difference becomes less relevant, only ~4x. -// -// The test data contains 248 samples. -// -// BenchmarkProcessor002ParseOnly in the extraction package is not quite -// comparable to the benchmarks here, but it gives an idea: JSON parsing is even -// slower than text parsing and needs a comparable amount of allocs. - -// BenchmarkParseText benchmarks the parsing of a text-format scrape into metric -// family DTOs. -func BenchmarkParseText(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/text") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - if _, err := parser.TextToMetricFamilies(bytes.NewReader(data)); err != nil { - b.Fatal(err) - } - } -} - -// BenchmarkParseTextGzip benchmarks the parsing of a gzipped text-format scrape -// into metric family DTOs. -func BenchmarkParseTextGzip(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/text.gz") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - in, err := gzip.NewReader(bytes.NewReader(data)) - if err != nil { - b.Fatal(err) - } - if _, err := parser.TextToMetricFamilies(in); err != nil { - b.Fatal(err) - } - } -} - -// BenchmarkParseProto benchmarks the parsing of a protobuf-format scrape into -// metric family DTOs. Note that this does not build a map of metric families -// (as the text version does), because it is not required for Prometheus -// ingestion either. (However, it is required for the text-format parsing, as -// the metric family might be sprinkled all over the text, while the -// protobuf-format guarantees bundling at one place.) -func BenchmarkParseProto(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - family := &dto.MetricFamily{} - in := bytes.NewReader(data) - for { - family.Reset() - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - } - } -} - -// BenchmarkParseProtoGzip is like BenchmarkParseProto above, but parses gzipped -// protobuf format. -func BenchmarkParseProtoGzip(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf.gz") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - family := &dto.MetricFamily{} - in, err := gzip.NewReader(bytes.NewReader(data)) - if err != nil { - b.Fatal(err) - } - for { - family.Reset() - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - } - } -} - -// BenchmarkParseProtoMap is like BenchmarkParseProto but DOES put the parsed -// metric family DTOs into a map. This is not happening during Prometheus -// ingestion. It is just here to measure the overhead of that map creation and -// separate it from the overhead of the text format parsing. -func BenchmarkParseProtoMap(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - families := map[string]*dto.MetricFamily{} - in := bytes.NewReader(data) - for { - family := &dto.MetricFamily{} - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - families[family.GetName()] = family - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/decode_test.go b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/decode_test.go deleted file mode 100644 index 307fcd21f..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/decode_test.go +++ /dev/null @@ -1,373 +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 expfmt - -import ( - "errors" - "io" - "net/http" - "reflect" - "sort" - "strings" - "testing" - - "github.com/prometheus/common/model" -) - -func TestTextDecoder(t *testing.T) { - var ( - ts = model.Now() - in = ` -# Only a quite simple scenario with two metric families. -# More complicated tests of the parser itself can be found in the text package. -# TYPE mf2 counter -mf2 3 -mf1{label="value1"} -3.14 123456 -mf1{label="value2"} 42 -mf2 4 -` - out = model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf1", - "label": "value1", - }, - Value: -3.14, - Timestamp: 123456, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf1", - "label": "value2", - }, - Value: 42, - Timestamp: ts, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf2", - }, - Value: 3, - Timestamp: ts, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf2", - }, - Value: 4, - Timestamp: ts, - }, - } - ) - - dec := &SampleDecoder{ - Dec: &textDecoder{r: strings.NewReader(in)}, - Opts: &DecodeOptions{ - Timestamp: ts, - }, - } - var all model.Vector - for { - var smpls model.Vector - err := dec.Decode(&smpls) - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - all = append(all, smpls...) - } - sort.Sort(all) - sort.Sort(out) - if !reflect.DeepEqual(all, out) { - t.Fatalf("output does not match") - } -} - -func TestProtoDecoder(t *testing.T) { - - var testTime = model.Now() - - scenarios := []struct { - in string - expected model.Vector - }{ - { - in: "", - }, - { - in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_label_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - }, - Value: -42, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "another_label_name": "another_label_value", - }, - Value: 84, - Timestamp: testTime, - }, - }, - }, - { - in: "\xb9\x01\n\rrequest_count\x12\x12Number of requests\x18\x02\"O\n#\n\x0fsome_label_name\x12\x10some_label_value\"(\x1a\x12\t\xaeG\xe1z\x14\xae\xef?\x11\x00\x00\x00\x00\x00\x00E\xc0\x1a\x12\t+\x87\x16\xd9\xce\xf7\xef?\x11\x00\x00\x00\x00\x00\x00U\xc0\"A\n)\n\x12another_label_name\x12\x13another_label_value\"\x14\x1a\x12\t\x00\x00\x00\x00\x00\x00\xe0?\x11\x00\x00\x00\x00\x00\x00$@", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_count", - "some_label_name": "some_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_sum", - "some_label_name": "some_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - "quantile": "0.99", - }, - Value: -42, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - "quantile": "0.999", - }, - Value: -84, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_count", - "another_label_name": "another_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_sum", - "another_label_name": "another_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "another_label_name": "another_label_value", - "quantile": "0.5", - }, - Value: 10, - Timestamp: testTime, - }, - }, - }, - { - in: "\x8d\x01\n\x1drequest_duration_microseconds\x12\x15The response latency.\x18\x04\"S:Q\b\x85\x15\x11\xcd\xcc\xccL\x8f\xcb:A\x1a\v\b{\x11\x00\x00\x00\x00\x00\x00Y@\x1a\f\b\x9c\x03\x11\x00\x00\x00\x00\x00\x00^@\x1a\f\b\xd0\x04\x11\x00\x00\x00\x00\x00\x00b@\x1a\f\b\xf4\v\x11\x9a\x99\x99\x99\x99\x99e@\x1a\f\b\x85\x15\x11\x00\x00\x00\x00\x00\x00\xf0\u007f", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "100", - }, - Value: 123, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "120", - }, - Value: 412, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "144", - }, - Value: 592, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "172.8", - }, - Value: 1524, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "+Inf", - }, - Value: 2693, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_sum", - }, - Value: 1756047.3, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_count", - }, - Value: 2693, - Timestamp: testTime, - }, - }, - }, - { - // The metric type is unset in this protobuf, which needs to be handled - // correctly by the decoder. - in: "\x1c\n\rrequest_count\"\v\x1a\t\t\x00\x00\x00\x00\x00\x00\xf0?", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - }, - Value: 1, - Timestamp: testTime, - }, - }, - }, - } - - for i, scenario := range scenarios { - dec := &SampleDecoder{ - Dec: &protoDecoder{r: strings.NewReader(scenario.in)}, - Opts: &DecodeOptions{ - Timestamp: testTime, - }, - } - - var all model.Vector - for { - var smpls model.Vector - err := dec.Decode(&smpls) - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - all = append(all, smpls...) - } - sort.Sort(all) - sort.Sort(scenario.expected) - if !reflect.DeepEqual(all, scenario.expected) { - t.Fatalf("%d. output does not match, want: %#v, got %#v", i, scenario.expected, all) - } - } -} - -func testDiscriminatorHTTPHeader(t testing.TB) { - var scenarios = []struct { - input map[string]string - output Format - err error - }{ - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="delimited"`}, - output: FmtProtoDelim, - err: nil, - }, - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="illegal"; encoding="delimited"`}, - output: "", - err: errors.New("unrecognized protocol message illegal"), - }, - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="illegal"`}, - output: "", - err: errors.New("unsupported encoding illegal"), - }, - { - input: map[string]string{"Content-Type": `text/plain; version=0.0.4`}, - output: FmtText, - err: nil, - }, - { - input: map[string]string{"Content-Type": `text/plain`}, - output: FmtText, - err: nil, - }, - { - input: map[string]string{"Content-Type": `text/plain; version=0.0.3`}, - output: "", - err: errors.New("unrecognized protocol version 0.0.3"), - }, - } - - for i, scenario := range scenarios { - var header http.Header - - if len(scenario.input) > 0 { - header = http.Header{} - } - - for key, value := range scenario.input { - header.Add(key, value) - } - - actual, err := ResponseFormat(header) - - if scenario.err != err { - if scenario.err != nil && err != nil { - if scenario.err.Error() != err.Error() { - t.Errorf("%d. expected %s, got %s", i, scenario.err, err) - } - } else if scenario.err != nil || err != nil { - t.Errorf("%d. expected %s, got %s", i, scenario.err, err) - } - } - - if !reflect.DeepEqual(scenario.output, actual) { - t.Errorf("%d. expected %s, got %s", i, scenario.output, actual) - } - } -} - -func TestDiscriminatorHTTPHeader(t *testing.T) { - testDiscriminatorHTTPHeader(t) -} - -func BenchmarkDiscriminatorHTTPHeader(b *testing.B) { - for i := 0; i < b.N; i++ { - testDiscriminatorHTTPHeader(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 deleted file mode 100644 index 139597f9c..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_0 +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 deleted file mode 100644 index 2ae870679..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_1 +++ /dev/null @@ -1,6 +0,0 @@ - -minimal_metric 1.234 -another_metric -3e3 103948 -# Even that: -no_labels{} 3 -# HELP line for non-existing metric will be ignored. diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 deleted file mode 100644 index 5c351db36..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_2 +++ /dev/null @@ -1,12 +0,0 @@ - -# A normal comment. -# -# TYPE name counter -name{labelname="val1",basename="basevalue"} NaN -name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 -# HELP name two-line\n doc str\\ing - - # HELP name2 doc str"ing 2 - # TYPE name2 gauge -name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 -name2{ labelname = "val1" , }-Inf diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 deleted file mode 100644 index 0b3c345aa..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_3 +++ /dev/null @@ -1,22 +0,0 @@ - -# TYPE my_summary summary -my_summary{n1="val1",quantile="0.5"} 110 -decoy -1 -2 -my_summary{n1="val1",quantile="0.9"} 140 1 -my_summary_count{n1="val1"} 42 -# Latest timestamp wins in case of a summary. -my_summary_sum{n1="val1"} 4711 2 -fake_sum{n1="val1"} 2001 -# TYPE another_summary summary -another_summary_count{n2="val2",n1="val1"} 20 -my_summary_count{n2="val2",n1="val1"} 5 5 -another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 -my_summary_sum{n1="val2"} 08 15 -my_summary{n1="val3", quantile="0.2"} 4711 - my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN -# some -# funny comments -# HELP -# HELP -# HELP my_summary -# HELP my_summary diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 deleted file mode 100644 index bde0a387a..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_4 +++ /dev/null @@ -1,10 +0,0 @@ - -# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 deleted file mode 100644 index 4c67f9a19..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_0 +++ /dev/null @@ -1 +0,0 @@ -bla 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 deleted file mode 100644 index b853478ee..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_1 +++ /dev/null @@ -1 +0,0 @@ -metric{label="\t"} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 deleted file mode 100644 index b5fe5f5a6..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_10 +++ /dev/null @@ -1 +0,0 @@ -metric{label="bla"} 3.14 2 3 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 deleted file mode 100644 index 57c7fbc0b..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_11 +++ /dev/null @@ -1 +0,0 @@ -metric{label="bla"} blubb diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 deleted file mode 100644 index 0a9df79a1..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_12 +++ /dev/null @@ -1,3 +0,0 @@ - -# HELP metric one -# HELP metric two diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 deleted file mode 100644 index 5bc742781..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_13 +++ /dev/null @@ -1,3 +0,0 @@ - -# TYPE metric counter -# TYPE metric untyped diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 deleted file mode 100644 index a9a24265b..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_14 +++ /dev/null @@ -1,3 +0,0 @@ - -metric 4.12 -# TYPE metric counter diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 deleted file mode 100644 index 7e95ca8f4..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_15 +++ /dev/null @@ -1,2 +0,0 @@ - -# TYPE metric bla diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 deleted file mode 100644 index 7825f8887..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_16 +++ /dev/null @@ -1,2 +0,0 @@ - -# TYPE met-ric diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 deleted file mode 100644 index 8f35cae0c..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_17 +++ /dev/null @@ -1 +0,0 @@ -@invalidmetric{label="bla"} 3.14 2 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 deleted file mode 100644 index 7ca2cc268..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_18 +++ /dev/null @@ -1 +0,0 @@ -{label="bla"} 3.14 2 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 deleted file mode 100644 index 7a6ccc0dd..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_19 +++ /dev/null @@ -1,3 +0,0 @@ - -# TYPE metric histogram -metric_bucket{le="bla"} 3.14 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 deleted file mode 100644 index 726d0017c..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_2 +++ /dev/null @@ -1,3 +0,0 @@ - -metric{label="new -line"} 3.14 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 deleted file mode 100644 index 6aa9e3081..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_3 +++ /dev/null @@ -1 +0,0 @@ -metric{@="bla"} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 deleted file mode 100644 index d112cb902..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_4 +++ /dev/null @@ -1 +0,0 @@ -metric{__name__="bla"} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 deleted file mode 100644 index b34554a8d..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_5 +++ /dev/null @@ -1 +0,0 @@ -metric{label+="bla"} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 deleted file mode 100644 index c4d7df3d1..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_6 +++ /dev/null @@ -1 +0,0 @@ -metric{label=bla} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 deleted file mode 100644 index 97eafc4a6..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_7 +++ /dev/null @@ -1,3 +0,0 @@ - -# TYPE metric summary -metric{quantile="bla"} 3.14 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 deleted file mode 100644 index fc706496b..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_8 +++ /dev/null @@ -1 +0,0 @@ -metric{label="bla"+} 3.14 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 deleted file mode 100644 index 57b4879c0..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/from_test_parse_error_9 +++ /dev/null @@ -1 +0,0 @@ -metric{label="bla"} 3.14 2.72 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/minimal b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/minimal deleted file mode 100644 index be1e6a369..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/fuzz/corpus/minimal +++ /dev/null @@ -1 +0,0 @@ -m{} 0 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/json_decode_test.go b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/json_decode_test.go deleted file mode 100644 index c98ea29e1..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/json_decode_test.go +++ /dev/null @@ -1,124 +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 expfmt - -import ( - "os" - "reflect" - "testing" - - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" -) - -func TestJSON2Decode(t *testing.T) { - f, err := os.Open("testdata/json2") - if err != nil { - t.Fatal(err) - } - defer f.Close() - - dec := newJSON2Decoder(f) - - var v1 dto.MetricFamily - if err := dec.Decode(&v1); err != nil { - t.Fatal(err) - } - - exp1 := dto.MetricFamily{ - Type: dto.MetricType_UNTYPED.Enum(), - Help: proto.String("RPC calls."), - Name: proto.String("rpc_calls_total"), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("job"), - Value: proto.String("batch_job"), - }, { - Name: proto.String("service"), - Value: proto.String("zed"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(25), - }, - }, - { - Label: []*dto.LabelPair{ - { - Name: proto.String("job"), - Value: proto.String("batch_job"), - }, { - Name: proto.String("service"), - Value: proto.String("bar"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(24), - }, - }, - }, - } - - if !reflect.DeepEqual(v1, exp1) { - t.Fatalf("Expected %v, got %v", exp1, v1) - } - - var v2 dto.MetricFamily - if err := dec.Decode(&v2); err != nil { - t.Fatal(err) - } - - exp2 := dto.MetricFamily{ - Type: dto.MetricType_UNTYPED.Enum(), - Help: proto.String("RPC latency."), - Name: proto.String("rpc_latency_microseconds"), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("percentile"), - Value: proto.String("0.010000"), - }, { - Name: proto.String("service"), - Value: proto.String("foo"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(15), - }, - }, - { - Label: []*dto.LabelPair{ - { - Name: proto.String("percentile"), - Value: proto.String("0.990000"), - }, { - Name: proto.String("service"), - Value: proto.String("foo"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(17), - }, - }, - }, - } - - if !reflect.DeepEqual(v2, exp2) { - t.Fatalf("Expected %v, got %v", exp2, v2) - } - -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/json2 b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/json2 deleted file mode 100644 index b914c9386..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/json2 +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "baseLabels": { - "__name__": "rpc_calls_total", - "job": "batch_job" - }, - "docstring": "RPC calls.", - "metric": { - "type": "counter", - "value": [ - { - "labels": { - "service": "zed" - }, - "value": 25 - }, - { - "labels": { - "service": "bar" - }, - "value": 24 - } - ] - } - }, - { - "baseLabels": { - "__name__": "rpc_latency_microseconds" - }, - "docstring": "RPC latency.", - "metric": { - "type": "histogram", - "value": [ - { - "labels": { - "service": "foo" - }, - "value": { - "0.010000": 15, - "0.990000": 17 - } - } - ] - } - } -] diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf deleted file mode 100644 index d5aae5091..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf +++ /dev/null @@ -1,516 +0,0 @@ -fc08 0a22 6874 7470 5f72 6571 7565 7374 -5f64 7572 6174 696f 6e5f 6d69 6372 6f73 -6563 6f6e 6473 122b 5468 6520 4854 5450 -2072 6571 7565 7374 206c 6174 656e 6369 -6573 2069 6e20 6d69 6372 6f73 6563 6f6e -6473 2e18 0222 570a 0c0a 0768 616e 646c -6572 1201 2f22 4708 0011 0000 0000 0000 -0000 1a12 0900 0000 0000 00e0 3f11 0000 -0000 0000 0000 1a12 09cd cccc cccc ccec -3f11 0000 0000 0000 0000 1a12 09ae 47e1 -7a14 aeef 3f11 0000 0000 0000 0000 225d -0a12 0a07 6861 6e64 6c65 7212 072f 616c -6572 7473 2247 0800 1100 0000 0000 0000 -001a 1209 0000 0000 0000 e03f 1100 0000 -0000 0000 001a 1209 cdcc cccc cccc ec3f -1100 0000 0000 0000 001a 1209 ae47 e17a -14ae ef3f 1100 0000 0000 0000 0022 620a -170a 0768 616e 646c 6572 120c 2f61 7069 -2f6d 6574 7269 6373 2247 0800 1100 0000 -0000 0000 001a 1209 0000 0000 0000 e03f -1100 0000 0000 0000 001a 1209 cdcc cccc -cccc ec3f 1100 0000 0000 0000 001a 1209 -ae47 e17a 14ae ef3f 1100 0000 0000 0000 -0022 600a 150a 0768 616e 646c 6572 120a -2f61 7069 2f71 7565 7279 2247 0800 1100 -0000 0000 0000 001a 1209 0000 0000 0000 -e03f 1100 0000 0000 0000 001a 1209 cdcc -cccc cccc ec3f 1100 0000 0000 0000 001a -1209 ae47 e17a 14ae ef3f 1100 0000 0000 -0000 0022 660a 1b0a 0768 616e 646c 6572 -1210 2f61 7069 2f71 7565 7279 5f72 616e -6765 2247 0800 1100 0000 0000 0000 001a -1209 0000 0000 0000 e03f 1100 0000 0000 -0000 001a 1209 cdcc cccc cccc ec3f 1100 -0000 0000 0000 001a 1209 ae47 e17a 14ae -ef3f 1100 0000 0000 0000 0022 620a 170a -0768 616e 646c 6572 120c 2f61 7069 2f74 -6172 6765 7473 2247 0800 1100 0000 0000 -0000 001a 1209 0000 0000 0000 e03f 1100 -0000 0000 0000 001a 1209 cdcc cccc cccc -ec3f 1100 0000 0000 0000 001a 1209 ae47 -e17a 14ae ef3f 1100 0000 0000 0000 0022 -600a 150a 0768 616e 646c 6572 120a 2f63 -6f6e 736f 6c65 732f 2247 0800 1100 0000 -0000 0000 001a 1209 0000 0000 0000 e03f -1100 0000 0000 0000 001a 1209 cdcc cccc -cccc ec3f 1100 0000 0000 0000 001a 1209 -ae47 e17a 14ae ef3f 1100 0000 0000 0000 -0022 5c0a 110a 0768 616e 646c 6572 1206 -2f67 7261 7068 2247 0800 1100 0000 0000 -0000 001a 1209 0000 0000 0000 e03f 1100 -0000 0000 0000 001a 1209 cdcc cccc cccc -ec3f 1100 0000 0000 0000 001a 1209 ae47 -e17a 14ae ef3f 1100 0000 0000 0000 0022 -5b0a 100a 0768 616e 646c 6572 1205 2f68 -6561 7022 4708 0011 0000 0000 0000 0000 -1a12 0900 0000 0000 00e0 3f11 0000 0000 -0000 0000 1a12 09cd cccc cccc ccec 3f11 -0000 0000 0000 0000 1a12 09ae 47e1 7a14 -aeef 3f11 0000 0000 0000 0000 225e 0a13 -0a07 6861 6e64 6c65 7212 082f 7374 6174 -6963 2f22 4708 0011 0000 0000 0000 0000 -1a12 0900 0000 0000 00e0 3f11 0000 0000 -0000 0000 1a12 09cd cccc cccc ccec 3f11 -0000 0000 0000 0000 1a12 09ae 47e1 7a14 -aeef 3f11 0000 0000 0000 0000 2260 0a15 -0a07 6861 6e64 6c65 7212 0a70 726f 6d65 -7468 6575 7322 4708 3b11 5b8f c2f5 083f -f440 1a12 0900 0000 0000 00e0 3f11 e17a -14ae c7af 9340 1a12 09cd cccc cccc ccec -3f11 2fdd 2406 81f0 9640 1a12 09ae 47e1 -7a14 aeef 3f11 3d0a d7a3 b095 a740 e608 -0a17 6874 7470 5f72 6571 7565 7374 5f73 -697a 655f 6279 7465 7312 2054 6865 2048 -5454 5020 7265 7175 6573 7420 7369 7a65 -7320 696e 2062 7974 6573 2e18 0222 570a -0c0a 0768 616e 646c 6572 1201 2f22 4708 -0011 0000 0000 0000 0000 1a12 0900 0000 -0000 00e0 3f11 0000 0000 0000 0000 1a12 -09cd cccc cccc ccec 3f11 0000 0000 0000 -0000 1a12 09ae 47e1 7a14 aeef 3f11 0000 -0000 0000 0000 225d 0a12 0a07 6861 6e64 -6c65 7212 072f 616c 6572 7473 2247 0800 -1100 0000 0000 0000 001a 1209 0000 0000 -0000 e03f 1100 0000 0000 0000 001a 1209 -cdcc cccc cccc ec3f 1100 0000 0000 0000 -001a 1209 ae47 e17a 14ae ef3f 1100 0000 -0000 0000 0022 620a 170a 0768 616e 646c -6572 120c 2f61 7069 2f6d 6574 7269 6373 -2247 0800 1100 0000 0000 0000 001a 1209 -0000 0000 0000 e03f 1100 0000 0000 0000 -001a 1209 cdcc cccc cccc ec3f 1100 0000 -0000 0000 001a 1209 ae47 e17a 14ae ef3f -1100 0000 0000 0000 0022 600a 150a 0768 -616e 646c 6572 120a 2f61 7069 2f71 7565 -7279 2247 0800 1100 0000 0000 0000 001a -1209 0000 0000 0000 e03f 1100 0000 0000 -0000 001a 1209 cdcc cccc cccc ec3f 1100 -0000 0000 0000 001a 1209 ae47 e17a 14ae -ef3f 1100 0000 0000 0000 0022 660a 1b0a -0768 616e 646c 6572 1210 2f61 7069 2f71 -7565 7279 5f72 616e 6765 2247 0800 1100 -0000 0000 0000 001a 1209 0000 0000 0000 -e03f 1100 0000 0000 0000 001a 1209 cdcc -cccc cccc ec3f 1100 0000 0000 0000 001a -1209 ae47 e17a 14ae ef3f 1100 0000 0000 -0000 0022 620a 170a 0768 616e 646c 6572 -120c 2f61 7069 2f74 6172 6765 7473 2247 -0800 1100 0000 0000 0000 001a 1209 0000 -0000 0000 e03f 1100 0000 0000 0000 001a -1209 cdcc cccc cccc ec3f 1100 0000 0000 -0000 001a 1209 ae47 e17a 14ae ef3f 1100 -0000 0000 0000 0022 600a 150a 0768 616e -646c 6572 120a 2f63 6f6e 736f 6c65 732f -2247 0800 1100 0000 0000 0000 001a 1209 -0000 0000 0000 e03f 1100 0000 0000 0000 -001a 1209 cdcc cccc cccc ec3f 1100 0000 -0000 0000 001a 1209 ae47 e17a 14ae ef3f -1100 0000 0000 0000 0022 5c0a 110a 0768 -616e 646c 6572 1206 2f67 7261 7068 2247 -0800 1100 0000 0000 0000 001a 1209 0000 -0000 0000 e03f 1100 0000 0000 0000 001a -1209 cdcc cccc cccc ec3f 1100 0000 0000 -0000 001a 1209 ae47 e17a 14ae ef3f 1100 -0000 0000 0000 0022 5b0a 100a 0768 616e -646c 6572 1205 2f68 6561 7022 4708 0011 -0000 0000 0000 0000 1a12 0900 0000 0000 -00e0 3f11 0000 0000 0000 0000 1a12 09cd -cccc cccc ccec 3f11 0000 0000 0000 0000 -1a12 09ae 47e1 7a14 aeef 3f11 0000 0000 -0000 0000 225e 0a13 0a07 6861 6e64 6c65 -7212 082f 7374 6174 6963 2f22 4708 0011 -0000 0000 0000 0000 1a12 0900 0000 0000 -00e0 3f11 0000 0000 0000 0000 1a12 09cd -cccc cccc ccec 3f11 0000 0000 0000 0000 -1a12 09ae 47e1 7a14 aeef 3f11 0000 0000 -0000 0000 2260 0a15 0a07 6861 6e64 6c65 -7212 0a70 726f 6d65 7468 6575 7322 4708 -3b11 0000 0000 40c4 d040 1a12 0900 0000 -0000 00e0 3f11 0000 0000 0030 7240 1a12 -09cd cccc cccc ccec 3f11 0000 0000 0030 -7240 1a12 09ae 47e1 7a14 aeef 3f11 0000 -0000 0030 7240 7c0a 1368 7474 705f 7265 -7175 6573 7473 5f74 6f74 616c 1223 546f -7461 6c20 6e75 6d62 6572 206f 6620 4854 -5450 2072 6571 7565 7374 7320 6d61 6465 -2e18 0022 3e0a 0b0a 0463 6f64 6512 0332 -3030 0a15 0a07 6861 6e64 6c65 7212 0a70 -726f 6d65 7468 6575 730a 0d0a 066d 6574 -686f 6412 0367 6574 1a09 0900 0000 0000 -804d 40e8 080a 1868 7474 705f 7265 7370 -6f6e 7365 5f73 697a 655f 6279 7465 7312 -2154 6865 2048 5454 5020 7265 7370 6f6e -7365 2073 697a 6573 2069 6e20 6279 7465 -732e 1802 2257 0a0c 0a07 6861 6e64 6c65 -7212 012f 2247 0800 1100 0000 0000 0000 -001a 1209 0000 0000 0000 e03f 1100 0000 -0000 0000 001a 1209 cdcc cccc cccc ec3f -1100 0000 0000 0000 001a 1209 ae47 e17a -14ae ef3f 1100 0000 0000 0000 0022 5d0a -120a 0768 616e 646c 6572 1207 2f61 6c65 -7274 7322 4708 0011 0000 0000 0000 0000 -1a12 0900 0000 0000 00e0 3f11 0000 0000 -0000 0000 1a12 09cd cccc cccc ccec 3f11 -0000 0000 0000 0000 1a12 09ae 47e1 7a14 -aeef 3f11 0000 0000 0000 0000 2262 0a17 -0a07 6861 6e64 6c65 7212 0c2f 6170 692f -6d65 7472 6963 7322 4708 0011 0000 0000 -0000 0000 1a12 0900 0000 0000 00e0 3f11 -0000 0000 0000 0000 1a12 09cd cccc cccc -ccec 3f11 0000 0000 0000 0000 1a12 09ae -47e1 7a14 aeef 3f11 0000 0000 0000 0000 -2260 0a15 0a07 6861 6e64 6c65 7212 0a2f -6170 692f 7175 6572 7922 4708 0011 0000 -0000 0000 0000 1a12 0900 0000 0000 00e0 -3f11 0000 0000 0000 0000 1a12 09cd cccc -cccc ccec 3f11 0000 0000 0000 0000 1a12 -09ae 47e1 7a14 aeef 3f11 0000 0000 0000 -0000 2266 0a1b 0a07 6861 6e64 6c65 7212 -102f 6170 692f 7175 6572 795f 7261 6e67 -6522 4708 0011 0000 0000 0000 0000 1a12 -0900 0000 0000 00e0 3f11 0000 0000 0000 -0000 1a12 09cd cccc cccc ccec 3f11 0000 -0000 0000 0000 1a12 09ae 47e1 7a14 aeef -3f11 0000 0000 0000 0000 2262 0a17 0a07 -6861 6e64 6c65 7212 0c2f 6170 692f 7461 -7267 6574 7322 4708 0011 0000 0000 0000 -0000 1a12 0900 0000 0000 00e0 3f11 0000 -0000 0000 0000 1a12 09cd cccc cccc ccec -3f11 0000 0000 0000 0000 1a12 09ae 47e1 -7a14 aeef 3f11 0000 0000 0000 0000 2260 -0a15 0a07 6861 6e64 6c65 7212 0a2f 636f -6e73 6f6c 6573 2f22 4708 0011 0000 0000 -0000 0000 1a12 0900 0000 0000 00e0 3f11 -0000 0000 0000 0000 1a12 09cd cccc cccc -ccec 3f11 0000 0000 0000 0000 1a12 09ae -47e1 7a14 aeef 3f11 0000 0000 0000 0000 -225c 0a11 0a07 6861 6e64 6c65 7212 062f -6772 6170 6822 4708 0011 0000 0000 0000 -0000 1a12 0900 0000 0000 00e0 3f11 0000 -0000 0000 0000 1a12 09cd cccc cccc ccec -3f11 0000 0000 0000 0000 1a12 09ae 47e1 -7a14 aeef 3f11 0000 0000 0000 0000 225b -0a10 0a07 6861 6e64 6c65 7212 052f 6865 -6170 2247 0800 1100 0000 0000 0000 001a -1209 0000 0000 0000 e03f 1100 0000 0000 -0000 001a 1209 cdcc cccc cccc ec3f 1100 -0000 0000 0000 001a 1209 ae47 e17a 14ae -ef3f 1100 0000 0000 0000 0022 5e0a 130a -0768 616e 646c 6572 1208 2f73 7461 7469 -632f 2247 0800 1100 0000 0000 0000 001a -1209 0000 0000 0000 e03f 1100 0000 0000 -0000 001a 1209 cdcc cccc cccc ec3f 1100 -0000 0000 0000 001a 1209 ae47 e17a 14ae -ef3f 1100 0000 0000 0000 0022 600a 150a -0768 616e 646c 6572 120a 7072 6f6d 6574 -6865 7573 2247 083b 1100 0000 00e0 b4fc -401a 1209 0000 0000 0000 e03f 1100 0000 -0000 349f 401a 1209 cdcc cccc cccc ec3f -1100 0000 0000 08a0 401a 1209 ae47 e17a -14ae ef3f 1100 0000 0000 0aa0 405c 0a19 -7072 6f63 6573 735f 6370 755f 7365 636f -6e64 735f 746f 7461 6c12 3054 6f74 616c -2075 7365 7220 616e 6420 7379 7374 656d -2043 5055 2074 696d 6520 7370 656e 7420 -696e 2073 6563 6f6e 6473 2e18 0022 0b1a -0909 a470 3d0a d7a3 d03f 4f0a 1270 726f -6365 7373 5f67 6f72 6f75 7469 6e65 7312 -2a4e 756d 6265 7220 6f66 2067 6f72 6f75 -7469 6e65 7320 7468 6174 2063 7572 7265 -6e74 6c79 2065 7869 7374 2e18 0122 0b12 -0909 0000 0000 0000 5140 4a0a 0f70 726f -6365 7373 5f6d 6178 5f66 6473 1228 4d61 -7869 6d75 6d20 6e75 6d62 6572 206f 6620 -6f70 656e 2066 696c 6520 6465 7363 7269 -7074 6f72 732e 1801 220b 1209 0900 0000 -0000 00c0 4043 0a10 7072 6f63 6573 735f -6f70 656e 5f66 6473 1220 4e75 6d62 6572 -206f 6620 6f70 656e 2066 696c 6520 6465 -7363 7269 7074 6f72 732e 1801 220b 1209 -0900 0000 0000 003d 404e 0a1d 7072 6f63 -6573 735f 7265 7369 6465 6e74 5f6d 656d -6f72 795f 6279 7465 7312 1e52 6573 6964 -656e 7420 6d65 6d6f 7279 2073 697a 6520 -696e 2062 7974 6573 2e18 0122 0b12 0909 -0000 0000 004b 8841 630a 1a70 726f 6365 -7373 5f73 7461 7274 5f74 696d 655f 7365 -636f 6e64 7312 3653 7461 7274 2074 696d -6520 6f66 2074 6865 2070 726f 6365 7373 -2073 696e 6365 2075 6e69 7820 6570 6f63 -6820 696e 2073 6563 6f6e 6473 2e18 0122 -0b12 0909 3d0a 172d e831 d541 4c0a 1c70 -726f 6365 7373 5f76 6972 7475 616c 5f6d -656d 6f72 795f 6279 7465 7312 1d56 6972 -7475 616c 206d 656d 6f72 7920 7369 7a65 -2069 6e20 6279 7465 732e 1801 220b 1209 -0900 0000 0020 12c0 415f 0a27 7072 6f6d -6574 6865 7573 5f64 6e73 5f73 645f 6c6f -6f6b 7570 5f66 6169 6c75 7265 735f 746f -7461 6c12 2554 6865 206e 756d 6265 7220 -6f66 2044 4e53 2d53 4420 6c6f 6f6b 7570 -2066 6169 6c75 7265 732e 1800 220b 1a09 -0900 0000 0000 0000 004f 0a1f 7072 6f6d -6574 6865 7573 5f64 6e73 5f73 645f 6c6f -6f6b 7570 735f 746f 7461 6c12 1d54 6865 -206e 756d 6265 7220 6f66 2044 4e53 2d53 -4420 6c6f 6f6b 7570 732e 1800 220b 1a09 -0900 0000 0000 0008 40cf 010a 2a70 726f -6d65 7468 6575 735f 6576 616c 7561 746f -725f 6475 7261 7469 6f6e 5f6d 696c 6c69 -7365 636f 6e64 7312 2c54 6865 2064 7572 -6174 696f 6e20 666f 7220 616c 6c20 6576 -616c 7561 7469 6f6e 7320 746f 2065 7865 -6375 7465 2e18 0222 7122 6f08 0b11 0000 -0000 0000 2240 1a12 097b 14ae 47e1 7a84 -3f11 0000 0000 0000 0000 1a12 099a 9999 -9999 99a9 3f11 0000 0000 0000 0000 1a12 -0900 0000 0000 00e0 3f11 0000 0000 0000 -0000 1a12 09cd cccc cccc ccec 3f11 0000 -0000 0000 f03f 1a12 09ae 47e1 7a14 aeef -3f11 0000 0000 0000 f03f a301 0a39 7072 -6f6d 6574 6865 7573 5f6c 6f63 616c 5f73 -746f 7261 6765 5f63 6865 636b 706f 696e -745f 6475 7261 7469 6f6e 5f6d 696c 6c69 -7365 636f 6e64 7312 5754 6865 2064 7572 -6174 696f 6e20 2869 6e20 6d69 6c6c 6973 -6563 6f6e 6473 2920 6974 2074 6f6f 6b20 -746f 2063 6865 636b 706f 696e 7420 696e -2d6d 656d 6f72 7920 6d65 7472 6963 7320 -616e 6420 6865 6164 2063 6875 6e6b 732e -1801 220b 1209 0900 0000 0000 0000 00f2 -010a 2870 726f 6d65 7468 6575 735f 6c6f -6361 6c5f 7374 6f72 6167 655f 6368 756e -6b5f 6f70 735f 746f 7461 6c12 3354 6865 -2074 6f74 616c 206e 756d 6265 7220 6f66 -2063 6875 6e6b 206f 7065 7261 7469 6f6e -7320 6279 2074 6865 6972 2074 7970 652e -1800 221b 0a0e 0a04 7479 7065 1206 6372 -6561 7465 1a09 0900 0000 0000 b880 4022 -1c0a 0f0a 0474 7970 6512 0770 6572 7369 -7374 1a09 0900 0000 0000 c05b 4022 180a -0b0a 0474 7970 6512 0370 696e 1a09 0900 -0000 0000 807b 4022 1e0a 110a 0474 7970 -6512 0974 7261 6e73 636f 6465 1a09 0900 -0000 0000 a06b 4022 1a0a 0d0a 0474 7970 -6512 0575 6e70 696e 1a09 0900 0000 0000 -807b 40c4 010a 3c70 726f 6d65 7468 6575 -735f 6c6f 6361 6c5f 7374 6f72 6167 655f -696e 6465 7869 6e67 5f62 6174 6368 5f6c -6174 656e 6379 5f6d 696c 6c69 7365 636f -6e64 7312 3751 7561 6e74 696c 6573 2066 -6f72 2062 6174 6368 2069 6e64 6578 696e -6720 6c61 7465 6e63 6965 7320 696e 206d -696c 6c69 7365 636f 6e64 732e 1802 2249 -2247 0801 1100 0000 0000 0000 001a 1209 -0000 0000 0000 e03f 1100 0000 0000 0000 -001a 1209 cdcc cccc cccc ec3f 1100 0000 -0000 0000 001a 1209 ae47 e17a 14ae ef3f -1100 0000 0000 0000 00bf 010a 2d70 726f -6d65 7468 6575 735f 6c6f 6361 6c5f 7374 -6f72 6167 655f 696e 6465 7869 6e67 5f62 -6174 6368 5f73 697a 6573 1241 5175 616e -7469 6c65 7320 666f 7220 696e 6465 7869 -6e67 2062 6174 6368 2073 697a 6573 2028 -6e75 6d62 6572 206f 6620 6d65 7472 6963 -7320 7065 7220 6261 7463 6829 2e18 0222 -4922 4708 0111 0000 0000 0000 0040 1a12 -0900 0000 0000 00e0 3f11 0000 0000 0000 -0040 1a12 09cd cccc cccc ccec 3f11 0000 -0000 0000 0040 1a12 09ae 47e1 7a14 aeef -3f11 0000 0000 0000 0040 660a 3070 726f -6d65 7468 6575 735f 6c6f 6361 6c5f 7374 -6f72 6167 655f 696e 6465 7869 6e67 5f71 -7565 7565 5f63 6170 6163 6974 7912 2354 -6865 2063 6170 6163 6974 7920 6f66 2074 -6865 2069 6e64 6578 696e 6720 7175 6575 -652e 1801 220b 1209 0900 0000 0000 00d0 -406d 0a2e 7072 6f6d 6574 6865 7573 5f6c -6f63 616c 5f73 746f 7261 6765 5f69 6e64 -6578 696e 675f 7175 6575 655f 6c65 6e67 -7468 122c 5468 6520 6e75 6d62 6572 206f -6620 6d65 7472 6963 7320 7761 6974 696e -6720 746f 2062 6520 696e 6465 7865 642e -1801 220b 1209 0900 0000 0000 0000 0067 -0a2f 7072 6f6d 6574 6865 7573 5f6c 6f63 -616c 5f73 746f 7261 6765 5f69 6e67 6573 -7465 645f 7361 6d70 6c65 735f 746f 7461 -6c12 2554 6865 2074 6f74 616c 206e 756d -6265 7220 6f66 2073 616d 706c 6573 2069 -6e67 6573 7465 642e 1800 220b 1a09 0900 -0000 0080 27cd 40c3 010a 3770 726f 6d65 -7468 6575 735f 6c6f 6361 6c5f 7374 6f72 -6167 655f 696e 7661 6c69 645f 7072 656c -6f61 645f 7265 7175 6573 7473 5f74 6f74 -616c 1279 5468 6520 746f 7461 6c20 6e75 -6d62 6572 206f 6620 7072 656c 6f61 6420 -7265 7175 6573 7473 2072 6566 6572 7269 -6e67 2074 6f20 6120 6e6f 6e2d 6578 6973 -7465 6e74 2073 6572 6965 732e 2054 6869 -7320 6973 2061 6e20 696e 6469 6361 7469 -6f6e 206f 6620 6f75 7464 6174 6564 206c -6162 656c 2069 6e64 6578 6573 2e18 0022 -0b1a 0909 0000 0000 0000 0000 6f0a 2a70 -726f 6d65 7468 6575 735f 6c6f 6361 6c5f -7374 6f72 6167 655f 6d65 6d6f 7279 5f63 -6875 6e6b 6465 7363 7312 3254 6865 2063 -7572 7265 6e74 206e 756d 6265 7220 6f66 -2063 6875 6e6b 2064 6573 6372 6970 746f -7273 2069 6e20 6d65 6d6f 7279 2e18 0122 -0b12 0909 0000 0000 0020 8f40 9c01 0a26 -7072 6f6d 6574 6865 7573 5f6c 6f63 616c -5f73 746f 7261 6765 5f6d 656d 6f72 795f -6368 756e 6b73 1263 5468 6520 6375 7272 -656e 7420 6e75 6d62 6572 206f 6620 6368 -756e 6b73 2069 6e20 6d65 6d6f 7279 2c20 -6578 636c 7564 696e 6720 636c 6f6e 6564 -2063 6875 6e6b 7320 2869 2e65 2e20 6368 -756e 6b73 2077 6974 686f 7574 2061 2064 -6573 6372 6970 746f 7229 2e18 0122 0b12 -0909 0000 0000 00e8 8d40 600a 2670 726f -6d65 7468 6575 735f 6c6f 6361 6c5f 7374 -6f72 6167 655f 6d65 6d6f 7279 5f73 6572 -6965 7312 2754 6865 2063 7572 7265 6e74 -206e 756d 6265 7220 6f66 2073 6572 6965 -7320 696e 206d 656d 6f72 792e 1801 220b -1209 0900 0000 0000 807a 40b7 010a 3570 -726f 6d65 7468 6575 735f 6c6f 6361 6c5f -7374 6f72 6167 655f 7065 7273 6973 745f -6c61 7465 6e63 795f 6d69 6372 6f73 6563 -6f6e 6473 1231 4120 7375 6d6d 6172 7920 -6f66 206c 6174 656e 6369 6573 2066 6f72 -2070 6572 7369 7374 696e 6720 6561 6368 -2063 6875 6e6b 2e18 0222 4922 4708 6f11 -1c2f dd24 e68c cc40 1a12 0900 0000 0000 -00e0 3f11 8d97 6e12 8360 3e40 1a12 09cd -cccc cccc ccec 3f11 0ad7 a370 3d62 6b40 -1a12 09ae 47e1 7a14 aeef 3f11 7b14 ae47 -e1b6 7240 6a0a 2f70 726f 6d65 7468 6575 -735f 6c6f 6361 6c5f 7374 6f72 6167 655f -7065 7273 6973 745f 7175 6575 655f 6361 -7061 6369 7479 1228 5468 6520 746f 7461 -6c20 6361 7061 6369 7479 206f 6620 7468 -6520 7065 7273 6973 7420 7175 6575 652e -1801 220b 1209 0900 0000 0000 0090 407a -0a2d 7072 6f6d 6574 6865 7573 5f6c 6f63 -616c 5f73 746f 7261 6765 5f70 6572 7369 -7374 5f71 7565 7565 5f6c 656e 6774 6812 -3a54 6865 2063 7572 7265 6e74 206e 756d -6265 7220 6f66 2063 6875 6e6b 7320 7761 -6974 696e 6720 696e 2074 6865 2070 6572 -7369 7374 2071 7565 7565 2e18 0122 0b12 -0909 0000 0000 0000 0000 ac01 0a29 7072 -6f6d 6574 6865 7573 5f6c 6f63 616c 5f73 -746f 7261 6765 5f73 6572 6965 735f 6f70 -735f 746f 7461 6c12 3454 6865 2074 6f74 -616c 206e 756d 6265 7220 6f66 2073 6572 -6965 7320 6f70 6572 6174 696f 6e73 2062 -7920 7468 6569 7220 7479 7065 2e18 0022 -1b0a 0e0a 0474 7970 6512 0663 7265 6174 -651a 0909 0000 0000 0000 0040 222a 0a1d -0a04 7479 7065 1215 6d61 696e 7465 6e61 -6e63 655f 696e 5f6d 656d 6f72 791a 0909 -0000 0000 0000 1440 d601 0a2d 7072 6f6d -6574 6865 7573 5f6e 6f74 6966 6963 6174 -696f 6e73 5f6c 6174 656e 6379 5f6d 696c -6c69 7365 636f 6e64 7312 584c 6174 656e -6379 2071 7561 6e74 696c 6573 2066 6f72 -2073 656e 6469 6e67 2061 6c65 7274 206e -6f74 6966 6963 6174 696f 6e73 2028 6e6f -7420 696e 636c 7564 696e 6720 6472 6f70 -7065 6420 6e6f 7469 6669 6361 7469 6f6e -7329 2e18 0222 4922 4708 0011 0000 0000 -0000 0000 1a12 0900 0000 0000 00e0 3f11 -0000 0000 0000 0000 1a12 09cd cccc cccc -ccec 3f11 0000 0000 0000 0000 1a12 09ae -47e1 7a14 aeef 3f11 0000 0000 0000 0000 -680a 2770 726f 6d65 7468 6575 735f 6e6f -7469 6669 6361 7469 6f6e 735f 7175 6575 -655f 6361 7061 6369 7479 122e 5468 6520 -6361 7061 6369 7479 206f 6620 7468 6520 -616c 6572 7420 6e6f 7469 6669 6361 7469 -6f6e 7320 7175 6575 652e 1801 220b 1209 -0900 0000 0000 0059 4067 0a25 7072 6f6d -6574 6865 7573 5f6e 6f74 6966 6963 6174 -696f 6e73 5f71 7565 7565 5f6c 656e 6774 -6812 2f54 6865 206e 756d 6265 7220 6f66 -2061 6c65 7274 206e 6f74 6966 6963 6174 -696f 6e73 2069 6e20 7468 6520 7175 6575 -652e 1801 220b 1209 0900 0000 0000 0000 -009e 020a 3070 726f 6d65 7468 6575 735f -7275 6c65 5f65 7661 6c75 6174 696f 6e5f -6475 7261 7469 6f6e 5f6d 696c 6c69 7365 -636f 6e64 7312 2354 6865 2064 7572 6174 -696f 6e20 666f 7220 6120 7275 6c65 2074 -6f20 6578 6563 7574 652e 1802 2260 0a15 -0a09 7275 6c65 5f74 7970 6512 0861 6c65 -7274 696e 6722 4708 3711 0000 0000 0000 -2840 1a12 0900 0000 0000 00e0 3f11 0000 -0000 0000 0000 1a12 09cd cccc cccc ccec -3f11 0000 0000 0000 0000 1a12 09ae 47e1 -7a14 aeef 3f11 0000 0000 0000 0840 2261 -0a16 0a09 7275 6c65 5f74 7970 6512 0972 -6563 6f72 6469 6e67 2247 0837 1100 0000 -0000 002e 401a 1209 0000 0000 0000 e03f -1100 0000 0000 0000 001a 1209 cdcc cccc -cccc ec3f 1100 0000 0000 0000 001a 1209 -ae47 e17a 14ae ef3f 1100 0000 0000 0008 -4069 0a29 7072 6f6d 6574 6865 7573 5f72 -756c 655f 6576 616c 7561 7469 6f6e 5f66 -6169 6c75 7265 735f 746f 7461 6c12 2d54 -6865 2074 6f74 616c 206e 756d 6265 7220 -6f66 2072 756c 6520 6576 616c 7561 7469 -6f6e 2066 6169 6c75 7265 732e 1800 220b -1a09 0900 0000 0000 0000 0060 0a21 7072 -6f6d 6574 6865 7573 5f73 616d 706c 6573 -5f71 7565 7565 5f63 6170 6163 6974 7912 -2c43 6170 6163 6974 7920 6f66 2074 6865 -2071 7565 7565 2066 6f72 2075 6e77 7269 -7474 656e 2073 616d 706c 6573 2e18 0122 -0b12 0909 0000 0000 0000 b040 da01 0a1f -7072 6f6d 6574 6865 7573 5f73 616d 706c -6573 5f71 7565 7565 5f6c 656e 6774 6812 -a701 4375 7272 656e 7420 6e75 6d62 6572 -206f 6620 6974 656d 7320 696e 2074 6865 -2071 7565 7565 2066 6f72 2075 6e77 7269 -7474 656e 2073 616d 706c 6573 2e20 4561 -6368 2069 7465 6d20 636f 6d70 7269 7365 -7320 616c 6c20 7361 6d70 6c65 7320 6578 -706f 7365 6420 6279 206f 6e65 2074 6172 -6765 7420 6173 206f 6e65 206d 6574 7269 -6320 6661 6d69 6c79 2028 692e 652e 206d -6574 7269 6373 206f 6620 7468 6520 7361 -6d65 206e 616d 6529 2e18 0122 0b12 0909 -0000 0000 0000 0000 d902 0a29 7072 6f6d -6574 6865 7573 5f74 6172 6765 745f 696e -7465 7276 616c 5f6c 656e 6774 685f 7365 -636f 6e64 7312 2141 6374 7561 6c20 696e -7465 7276 616c 7320 6265 7477 6565 6e20 -7363 7261 7065 732e 1802 2282 010a 0f0a -0869 6e74 6572 7661 6c12 0331 3573 226f -0804 1100 0000 0000 804d 401a 1209 7b14 -ae47 e17a 843f 1100 0000 0000 002c 401a -1209 9a99 9999 9999 a93f 1100 0000 0000 -002c 401a 1209 0000 0000 0000 e03f 1100 -0000 0000 002e 401a 1209 cdcc cccc cccc -ec3f 1100 0000 0000 002e 401a 1209 ae47 -e17a 14ae ef3f 1100 0000 0000 002e 4022 -8101 0a0e 0a08 696e 7465 7276 616c 1202 -3173 226f 083a 1100 0000 0000 003c 401a -1209 7b14 ae47 e17a 843f 1100 0000 0000 -0000 001a 1209 9a99 9999 9999 a93f 1100 -0000 0000 0000 001a 1209 0000 0000 0000 -e03f 1100 0000 0000 0000 001a 1209 cdcc -cccc cccc ec3f 1100 0000 0000 00f0 3f1a -1209 ae47 e17a 14ae ef3f 1100 0000 0000 -00f0 3f \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf.gz b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf.gz deleted file mode 100644 index 62fccb616..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/protobuf.gz +++ /dev/null @@ -1,129 +0,0 @@ -1f8b 0808 efa0 c754 0003 7072 6f74 6f62 -7566 00ed 594d 8c1c c515 9eb1 8d3d 5b86 -6037 265e 8c4d ca03 c4bb ceee cc9a 9f58 -01cc f6ca 4424 041b 8837 21c8 24ed daee -9a99 cef6 1f55 d578 c7e4 b004 0e39 8088 -8448 048a 124b 4442 9110 e110 25b9 c54a -9072 01c5 9724 4a24 2472 413e 448a 8592 -1b87 bcea aeda eeea 99d9 3530 49a4 68e7 -b0bb 5355 fdde abf7 bef7 bdf7 7a3f 6ca0 -664f 88c4 61f4 8994 72e1 7829 23c2 8f23 -27f4 5d16 73ea c691 c7ad cf2d f628 fed2 -e2e2 c358 9dc3 0111 3472 7dca b11f e1f2 -d9d6 e496 e6a3 e86a b4a3 4722 2fa0 ccaa -b79b f737 6abb 6bea b3cf 9ac8 ff78 6fbe -bcf6 cedb f2f3 7763 ed8d fbff 766e cf1b -ff28 d69a df44 5621 7847 9bc0 2fc1 c727 -7e09 ed2d c45f dd26 89df 0ea9 60be 3b46 -1d67 d0f5 850e 94e9 008f b2fe f834 74d0 -8d85 865d 8506 8791 a84b ffa3 de12 8475 -e938 2352 f116 208c c701 e563 84d4 e368 -77a1 617b bbcb 48d2 1b9f f4d3 6857 21fd -aa76 8f92 647c c2bf 85ae 2b84 37da 5c40 -e6ba 6374 8de9 fc84 c590 0c3d 9aca f0de -bdfb f40b bffd 5763 fe9f 7659 8314 f0fb -9fbf 6897 35b4 dfbd 65fb d397 7f60 9735 -1c43 7f7e f5cd 975e b3df 6fa0 bd06 fb70 -ff1c 7596 fa82 720b 0f50 8edc cce8 263b -b0c9 339b 3cb3 c933 5afa ff2f cfc8 13f6 -5b17 ed01 0d73 cc1e d090 af99 1a60 ed3b -e8ba 32cd 7047 c482 04d6 cd8b f217 8ed2 -7089 321c 770c bae1 3824 1e6d 4dd6 9af7 -a29d 689b 1b7b d4da 7adb dcdc 085b d135 -68bb fc33 f6ac ad00 cd7d 13b9 b5ab 27ec -4b0d 34a9 b4f3 0470 45cb 2c77 b0c4 72f9 -ee26 cd7d 02ec 6cd2 dc26 cd7d 6ce1 ff73 -9a7b ef17 1f0e d2dc 1d3f 19a4 b9c6 f941 -9a43 e7ed c7d1 0d20 d5a5 9c3b 6e92 3a6a -2053 6437 9793 5dca 81ea c006 ccfb 5cd0 -101f 7ff8 6b58 f821 d04e 4223 2169 676d -8eab 3577 028d fd34 91dd dac5 f987 90a5 -8577 6316 a7c2 8f80 bf0e 9f5c 23cf 6215 -8b1e 11d8 4d19 0391 411f d315 9f8b d664 -bdb9 d352 b458 7bc4 7e00 5dab e585 64c5 -e9c0 9439 7582 acf8 611a 9618 3906 ab70 -c70f 28f6 2877 999f 8898 7153 d405 fb38 -daa5 45c9 f399 2c7c f2a3 c838 669f 4407 -b40c 6062 df03 cb9d 9086 31e4 79ce d437 -7d55 2de3 7c39 e3e9 124d 97c4 7de5 7b0b -2eda a7c5 018e 9870 a48f 7544 accf 9f92 -6bb9 dfc1 4040 0156 a741 6ae4 529c 46fe -0aa6 49ec f68c 88e4 3a8e a1bd b397 8efc -71e1 41b4 5feb 78d2 6722 2581 69f1 81af -e7ab 1b1a 8cad 0b0b 0e3a 5420 d2f1 22b0 -db73 8238 5e4e 13a7 43fc 2005 af28 24dd -2a6b 5611 a2fb 4e9e 9a3d 751f cecf 627d -56c3 47a3 ff21 f499 51f2 b5dc 03eb c8ad -c86b d87f a8a3 c325 81f4 4912 a404 025b -7e81 1104 bef6 f88c 94ad b770 2786 1c08 -02ac 9e82 25c0 6c0c 38a5 6e2a a82c b94f -34e3 c64e 95ba 4d99 6c4f ed91 e9f6 ac91 -e2af bc2c 3f3f 9bff 88f4 7079 7e90 1e2e -cfbf 5a47 5f28 5d28 885d 8827 871b 912e -75dc 1e75 9793 d88f c488 fb3d 6adc 6f2a -7b27 536c 4f63 1fd0 068e 94b7 2c64 0118 -6615 3654 5dce 9801 58d5 8353 69b4 5cc9 -925a ed83 3a9a 5ac7 4878 0432 50c7 f376 -6993 a8b4 58d9 2199 924c f97d a92f f1ef -332c fa49 d66e dd88 3e85 b6c9 2fd6 7697 -5122 a88e faaf 57ed e67e 74ad dadc 0122 -38f0 8ade bd70 da6e 4eca 4e2d dbdd 9af8 -d15a 0ff6 94dd bc09 ca52 be33 21a0 6e73 -d9ce e9fd f3cb 7673 1ff4 6ff9 fe55 6964 -3efb 561d dd33 f2ce 7ee4 01bb 455d 6789 -08b7 e7e4 6fc5 fa66 6c8e 3e92 9248 00ff -f00c 78d9 49ac 1fac be48 2b9e 9330 fc32 -d486 fa58 aacf 6fea 68f6 4a6f 9175 a0d6 -8269 f69a c1b9 fd79 973a 5504 5623 08c2 -921f 991e b8c0 6071 cbd7 aa17 182c 6eb0 -d641 731b db0f 8d59 0a40 2409 717d d187 -061f 10a8 bf69 a65d bb48 76d8 44f8 453b -44ad 2b55 13d0 a82b 7a39 b50c fae1 2cf1 -85d4 0219 b7a4 9452 af9a 4f5d d45e 475b -17c6 10ea 399c 8449 60b2 6f35 abd4 11ac -9f29 b3e5 eaa1 77ec dfd5 d1d1 7514 010d -fa9e 9330 1ac4 c4ab 4e49 fd61 0ad5 d962 -5862 b443 1953 1726 388a a3d9 acec cb82 -092d 07e0 bb85 177b 3e98 2849 46fa c377 -73b2 9215 3a15 1ea4 8107 c9b0 4403 e5ac -8112 121b 8c6f de41 15be 8c5d 6495 e7d6 -6d59 ecf3 1e64 807f 4a8d 4096 76d9 d346 -70f0 0bf6 8fea e8b3 57a4 905b ee3a ca4a -1a66 a0c4 b841 ea49 37b9 411c 51cd b3c0 -d82d dad2 5fce fa30 47a6 02dc 58d8 396d -5877 e979 fbcc c6c6 e57e b70e 0d37 2edf -1d71 fdd5 73f6 afea e8ce 911a 14f9 9608 -aff4 df82 230b 98a7 6148 5896 7305 c149 -1a51 0f4a 0f50 023c 925d 5933 45bc 7b7f -fbdd 5bde 7fee 6d83 299e ff61 643d 73e6 -5e83 29a0 254d 8e2d 2d1b 4c91 95e8 5f32 -fbdb eb24 95b6 bb42 1453 05c6 ab74 a19e -18c6 16df b7cf ad43 aaa6 2a45 1677 ad0b -14cd 1910 930d 54d7 6aaf d7d1 f448 dd79 -6c4b b5f8 8ea1 ac91 23e0 6315 6360 e4e6 -6174 406d 5e1f 12e8 2768 44a0 7905 3e51 -005c 3bbb c7fe 9359 7ea2 58f8 1d45 007c -78d5 fcc6 83f9 2adc be5c 8638 8db2 f4c9 -de55 6043 0e54 a358 f634 3ac3 3c16 2709 -a498 7168 ad2a 8d67 a8eb 196d b379 ad0a -c65a c38a d1b0 6b0c 09f7 6376 17dd ba81 -2285 b0b6 598e 8629 50f0 1a0a ab1f 6f31 -ea2c 4b03 ea14 6df2 88ee f3e6 c1ee 1acb -272b 4db5 1c80 2732 8919 681a 996d 1029 -88c6 51e5 d1a9 613d c215 46a3 6137 09fa -7459 c304 0303 9967 aa68 7d22 15be 9175 -55f7 5426 a5d9 6159 9739 a678 66e4 c474 -061d 2c69 d24d 4005 5433 c72b 80ca f6b3 -10a4 d159 e60b c821 dd1d 98a1 7ed3 fe6b -dd98 c94c 0d0a 4daf d58f 0f90 952f 6868 -8268 843e fc45 c9f0 f238 76e3 3061 8017 -9ecd 5dba 5da1 2b09 140d 4fd2 0e14 439c -bfee c284 67df f246 0adc 0350 ebab 02a9 -9b2b 7559 9003 5887 1fd3 5518 ff65 8b11 -a75c b223 398a 81e7 d5ed d6e6 f183 0b6e -3628 eb7d 2042 2ace 5279 1597 9124 7f0b -fbdd 3acc 1e0d 7dc4 da7a e44e 0e43 e2b6 -1c19 ab27 860c 8933 f6e0 9038 3304 7dad -214d 706b 4813 dcb2 9b4f d781 900b 23b6 -1c91 36dc a5f6 eff9 af0c aaff 06f1 48e5 -4433 2000 00 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/test.gz b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/test.gz deleted file mode 100644 index 3f8199dfb..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/test.gz +++ /dev/null @@ -1,163 +0,0 @@ -1f8b 0808 2aa1 c754 0003 7465 7874 00b5 -5b5d 939b 3816 7def 5fa1 ea79 99a9 4d3c -601b db3c f4c3 5426 55f3 309b ca6e 7ab7 -6a9e 281a d436 150c 04c4 a4bd 5df3 dff7 -4a88 361f 025d 094f 1e92 34e8 1cae 8ea4 -ab7b 04fd 03f9 ede3 ef9f c989 b122 28e9 -b79a 562c 88eb 3264 499e 05e7 242a f38a -4679 1657 e4f1 44c9 6f8f 8f9f 896c 46d2 -90d1 2c4a 6845 928c 749b aeee 7e20 8f7f -7cfe 8861 adea f339 2c2f 77fa a6af a730 -8b53 5a3e dcff 7cff ee5b 1d66 2c49 e9c3 -bdb3 f2ee ff22 ce12 027f 3101 9621 80ee -7659 90a8 28af 3366 8eeb 2042 f887 558b -7553 d158 a8a7 a4b1 d450 7259 2a69 84ee -e28a e4e7 3365 6512 dd40 d429 2e1b 6527 -b96c e5ed 10da 6a6c 4c31 0043 cbf2 7213 -9915 4c96 22ab 9816 48dc d02d 10d8 8440 -050d ca30 3bd2 db89 ace2 5b22 b592 6fa9 -e092 74a9 ec46 3403 0216 9647 7a8b cc3c -c565 29ba 9a6b 81e0 2de1 02b1 cd28 3a60 -f8b9 ca53 5a2d 2f1c 2698 2c44 9e62 b294 -f84a 6729 b029 4107 7a2c c3e2 b458 5a05 -8b85 ac2a 164b 491b 2a4b 394d c01d d889 -86c5 6225 c724 1642 2a48 2c75 144c 9632 -1a60 3ba8 8ac1 ed68 f96a 57f2 5868 a9e6 -b194 b325 b354 d40c 7e05 1665 0e45 dc89 -d68a bdca dd38 fbd5 7aef dd84 90cb e21e -bcc3 6ab7 59df 8690 336e 9cc3 7eb5 396c -8df5 eeb0 425c 7bff 70d8 ad3c 47fe 712d -46a0 4fe8 fa60 96c7 16bc 4afe 4783 a70b -a30a dfcd ef09 cf2d eeab cd76 07af 74d8 -d7fb 26b6 1a81 524c 6a0c 6a16 a675 cd9d -a67a abac 0c07 e98f d158 ac0c 5827 3c29 -c694 819d 9144 0fb1 34ba 6604 6889 4c2c -edb4 4e73 2674 4e2c 1cce cab1 9ac0 4dd4 -427a d359 ad26 fca4 4629 2d6a 81f5 3427 -31d6 0c6b 32f5 ca4d 5942 8c7e 7aac a587 -3423 3051 0fed 1667 959b f477 1ad5 1038 -2b33 6802 c7aa 6560 fb26 b59a b16a 334a -a150 c6ae 0e0b c5ea 83f4 6f93 da4c f8ae -195d b408 537b 8644 6215 c119 b149 41d4 -0e6a 460f 1dc0 c267 e1c1 5851 d08e 6a52 -9749 1f34 230d 0283 334c 6bdf b527 f017 -1368 1866 0cd0 66bb 3d1c b07a 619c 4e15 -b09c 8529 7914 7f67 f5f9 8996 247f ee39 -9e8a 9cc3 982a 8d4e 0b17 4fa6 e59d e2de -6b94 c7d0 edb5 e3dc bf53 4ac3 ff93 c70f -f7b0 8728 e3ac 0ac8 9c74 c292 3537 359e -6ccc 3030 65a3 0638 5786 87f9 96b0 79dc -8c31 1bb7 9d73 6673 1169 ad99 2918 ad85 -de9c e914 195b 2dbd 2e08 8cb1 3fb3 62c0 -eb84 7368 5ab1 d456 0ba1 1812 6868 d22c -f046 9269 6d1a 46b0 91e3 c2c9 a587 5939 -356b 1673 e1f4 5e0d 2ddf d870 1988 8800 -1bdb 352b 0623 0911 860d 239f c279 e1a4 -c300 0d3d 9b05 1e2d 19ca b5e9 0453 1a30 -bd5c 3898 8171 33c4 a245 d25a 379d 4023 -27a6 1747 0fc1 bb37 3328 5a16 9d7f d3a9 -32f4 637a 51b4 0823 0b67 8c46 2b83 3071 -3a71 148e 4caf 0f06 84f4 71ce d65f 4021 -7c98 e31d 9650 341c bb2d 52b1 9e27 5b6f -f79d 7758 5ae1 a6fc 1c5c 8f68 05cd 8b3a -685f 7a75 5d5d 5d81 a703 1252 5d2a 46cf -e4c3 e7ff 1096 9cc1 3515 3463 dc35 0d3f -1c9d 666c 8dde 740b 1819 6f18 d931 2ff3 -9a25 1938 af4f 6f16 b373 919d 4246 a2ba -2c21 9ef4 42e8 4b52 b151 309d f6c7 b03e -d23b c58d bd33 7cf4 397c 099e e38a fc33 -7c49 cef5 b963 7173 e83d 7986 7124 31ad -a232 2958 5e8e 2568 f1fd 47b6 570f aebf -1e3e 91f3 8a9b 9f0c 1ff5 06ec 3feb edf2 -7a34 e230 6992 1834 0bce f49c 432d d498 -db7f cbab a4b9 2acc f1d8 1bcf 73f4 4350 -b7f1 569b c3de f1fc 35fd 87b3 1f86 068b -bc64 019f 66ed fc20 5ff8 a566 e681 2630 -91db c610 6116 5152 67c9 0ba1 451e 9de6 -e6a4 82b8 1fac a281 bbda aed7 9bdd c1df -1e36 3b88 7624 e49f 49c9 ea30 edf7 efbf -cd45 9c8c 4a86 7e60 ca26 de6a eb6e f707 -dfe5 2a1e 3a71 c9a5 1ec4 1974 290e d23c -ff5a 17c1 7398 a435 0c47 bbc0 41c4 eb8c -fef5 d397 f75f 7e25 4d53 d236 ed86 8a22 -edac 7154 7b47 1735 225a 7d94 d8e8 da76 -7b45 54f4 cf30 ad43 587c dd4f 05d2 34e9 -7e63 dfde 21cf 3964 cd34 2512 0497 2051 -e590 9c68 5433 aa8a 5747 df9e 3ae1 21af -ddbd c671 c596 698b f696 a017 81c5 2725 -d660 5334 df70 89bb 3641 8839 45d6 1bc5 -9449 f308 966c 05d8 f048 83e8 44a3 af45 -9e64 0c33 837e 14bf 9871 bdfb 1349 20ff -c12c e5f3 e84a 0549 e5bd cc31 f218 45ec -d650 46c6 d0aa cebe 2a17 8761 606f a9c8 -12af 5ae4 430a 0815 76ab ee6a 6783 6365 -d186 6f87 a55c 504f 17be 1124 2561 9742 -b9a6 e69f a148 06b3 8057 fe98 87fb a8a4 -21e3 8706 9e7f 30c5 42ec 1594 27e2 6ba4 -ad31 38c9 00e8 af1d 5320 2bc3 ace2 27e9 -00df ba9e 29bc ceae 4fd6 8d63 92c5 5080 -65c7 e029 64d1 2968 7ecd e8d2 9f0d ff92 -0bb4 1259 5234 242d 6ef8 8b49 5798 7e7c -31cf 5664 5163 92f9 dcb6 8cce bf31 dd72 -3e91 1117 5234 29d2 359d 3dcd 8b99 fe74 -799b 28cd bc69 9afc 784d 126d 1284 95d6 -34f9 c978 e234 9ca6 3345 a046 5363 bd00 -ef2f c55b 1088 d136 c518 0fef b79a d690 -6dc2 228c 1276 11c9 feed 0759 ddbf 8db3 -686b 3086 036e cdd6 3505 7377 fc7b 53c3 -0ea5 343b b2d3 a052 6d27 e4f7 3061 bc3f -b07b 3fc9 eed1 d8b8 5ff2 1166 bd92 204c -f63e 5270 f971 5085 e722 a573 9bb1 6c41 -5a08 a627 4a72 ed2e 3c81 db38 dbbd bee6 -4a32 a8de 9238 284a 9ae6 613c 7a73 ade8 -996c 7a7d 815d d267 5a96 72ec 4292 e5d9 -7b71 c8c0 5d72 454b d8ab 5640 9480 16bc -f6e2 439b 444d 0dc7 dd7b cd62 4889 316c -6c4f 3495 e38e dacc 6603 47a8 368b d7cf -0569 3445 49c0 0f1e 9af2 549e b38c aab2 -ced1 84d8 b805 58df cbf1 4334 337b 0c70 -1dcf 37ea cc6c 473a d1bf 03b7 16a5 75cc -073e 4af3 8cb6 0535 94e6 2bba 6a7f f89e -b013 0c32 4c8c ab06 883d a71f 9141 af79 -8f11 8598 8434 f373 a2c7 f2a6 f978 4920 -2e6a d978 bbd6 e753 591e 778a 88ce 6f9b -ffd2 6ec9 3cf4 6b99 c88b 0289 e323 4543 -a80a 8450 fade cc3e 4ebb ffcf a147 75c0 -c659 6df6 fb1b 9035 47c6 9b95 b7f1 6fc1 -26e8 76eb dd6a bbdb d8f1 3515 8303 c3bb -9af5 16b3 1cb2 82d8 e3a7 88a2 8490 9971 -5048 4800 b68e 98e0 d74c f509 14ac 54d3 -1e75 6a88 c914 d596 12b0 7017 f710 5750 -2831 fa24 d42c 7d8d ad97 f9c1 ded7 8f9e -a2dd 1c87 88a1 b39f 2980 27a0 e730 8147 -6661 16f1 ad57 a63e f1a6 4521 5296 b3e4 -59d6 0895 daa7 fede 5c24 df7a e6a7 a299 -d88e c467 46a4 4703 1e28 e787 41ed 8e15 -9779 51c0 96d5 6ba4 dc97 10d1 2872 a11e -356f 930d f123 1f6b 8ab7 2018 3b5f 04a6 -c964 aaa5 d107 232c 906a 9427 d7f8 2cfb -6875 cfb6 761d 6cf8 4ac3 a30a 5b66 2aa3 -e8a7 32d3 4c5b 55dc 659d d2e0 7a0c 8f3e -bc27 1ca8 39b3 c771 2b56 0f0a f82a 5a35 -f945 880a eb5a f5ae fff6 bca3 c572 2bde -d189 048a 58bc 0557 91ff 3538 aac7 b135 -6fc6 27f8 fa25 8c71 bf4b b854 c67f c340 -4d10 2f1f a929 62f1 8bb7 8b87 eaca 0eda -9a4b 3b1e ab1e a1eb 2116 bce2 ade7 b004 -114b fd0a 997d fba9 a157 d41e 1a84 2a69 -b547 1d83 ccfc 61b0 4388 db22 5dd5 d9f7 -3261 b01f b507 33aa d027 5847 1976 a2dd -d6f1 77da 5865 26fe 30aa 5d13 46cf fd8d -6022 70f2 915b 38de 1cc4 3c17 25cc 854a -bc4b 6d8f 9ce8 4b01 c621 e665 22b8 72d2 -7c8e 48c2 4afc d41c b7c1 08c2 34ba 48a7 -de1e c149 d580 07f6 2bf8 4b59 0e29 bba3 -9168 66fb 69a2 0b78 7558 c214 904d df3e -2ef8 2512 5f09 b4b7 a1f6 a5ec 3be5 6a44 -6558 a887 5143 a9d8 6ee6 11af edf5 877b -d71b 7ca2 245e 1bbb db1b 9179 3724 f346 -19c5 9ecb bf25 9729 9948 997d 42fe 7ad0 -84a1 c992 238e b55d 8f54 53c0 b90d d568 -1fb4 a6ba 1dd3 e813 017b 2643 aae1 c8f3 -41f3 168d 7bf3 71df feee ff2d f9e8 431a -5200 00 \ No newline at end of file diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/text b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/text deleted file mode 100644 index f3d8c3784..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/testdata/text +++ /dev/null @@ -1,322 +0,0 @@ -# HELP http_request_duration_microseconds The HTTP request latencies in microseconds. -# TYPE http_request_duration_microseconds summary -http_request_duration_microseconds{handler="/",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/"} 0 -http_request_duration_microseconds_count{handler="/"} 0 -http_request_duration_microseconds{handler="/alerts",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/alerts",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/alerts",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/alerts"} 0 -http_request_duration_microseconds_count{handler="/alerts"} 0 -http_request_duration_microseconds{handler="/api/metrics",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/api/metrics",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/api/metrics",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/api/metrics"} 0 -http_request_duration_microseconds_count{handler="/api/metrics"} 0 -http_request_duration_microseconds{handler="/api/query",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/api/query",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/api/query",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/api/query"} 0 -http_request_duration_microseconds_count{handler="/api/query"} 0 -http_request_duration_microseconds{handler="/api/query_range",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/api/query_range",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/api/query_range",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/api/query_range"} 0 -http_request_duration_microseconds_count{handler="/api/query_range"} 0 -http_request_duration_microseconds{handler="/api/targets",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/api/targets",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/api/targets",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/api/targets"} 0 -http_request_duration_microseconds_count{handler="/api/targets"} 0 -http_request_duration_microseconds{handler="/consoles/",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/consoles/",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/consoles/",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/consoles/"} 0 -http_request_duration_microseconds_count{handler="/consoles/"} 0 -http_request_duration_microseconds{handler="/graph",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/graph",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/graph",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/graph"} 0 -http_request_duration_microseconds_count{handler="/graph"} 0 -http_request_duration_microseconds{handler="/heap",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/heap",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/heap",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/heap"} 0 -http_request_duration_microseconds_count{handler="/heap"} 0 -http_request_duration_microseconds{handler="/static/",quantile="0.5"} 0 -http_request_duration_microseconds{handler="/static/",quantile="0.9"} 0 -http_request_duration_microseconds{handler="/static/",quantile="0.99"} 0 -http_request_duration_microseconds_sum{handler="/static/"} 0 -http_request_duration_microseconds_count{handler="/static/"} 0 -http_request_duration_microseconds{handler="prometheus",quantile="0.5"} 1307.275 -http_request_duration_microseconds{handler="prometheus",quantile="0.9"} 1858.632 -http_request_duration_microseconds{handler="prometheus",quantile="0.99"} 3087.384 -http_request_duration_microseconds_sum{handler="prometheus"} 179886.5000000001 -http_request_duration_microseconds_count{handler="prometheus"} 119 -# HELP http_request_size_bytes The HTTP request sizes in bytes. -# TYPE http_request_size_bytes summary -http_request_size_bytes{handler="/",quantile="0.5"} 0 -http_request_size_bytes{handler="/",quantile="0.9"} 0 -http_request_size_bytes{handler="/",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/"} 0 -http_request_size_bytes_count{handler="/"} 0 -http_request_size_bytes{handler="/alerts",quantile="0.5"} 0 -http_request_size_bytes{handler="/alerts",quantile="0.9"} 0 -http_request_size_bytes{handler="/alerts",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/alerts"} 0 -http_request_size_bytes_count{handler="/alerts"} 0 -http_request_size_bytes{handler="/api/metrics",quantile="0.5"} 0 -http_request_size_bytes{handler="/api/metrics",quantile="0.9"} 0 -http_request_size_bytes{handler="/api/metrics",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/api/metrics"} 0 -http_request_size_bytes_count{handler="/api/metrics"} 0 -http_request_size_bytes{handler="/api/query",quantile="0.5"} 0 -http_request_size_bytes{handler="/api/query",quantile="0.9"} 0 -http_request_size_bytes{handler="/api/query",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/api/query"} 0 -http_request_size_bytes_count{handler="/api/query"} 0 -http_request_size_bytes{handler="/api/query_range",quantile="0.5"} 0 -http_request_size_bytes{handler="/api/query_range",quantile="0.9"} 0 -http_request_size_bytes{handler="/api/query_range",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/api/query_range"} 0 -http_request_size_bytes_count{handler="/api/query_range"} 0 -http_request_size_bytes{handler="/api/targets",quantile="0.5"} 0 -http_request_size_bytes{handler="/api/targets",quantile="0.9"} 0 -http_request_size_bytes{handler="/api/targets",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/api/targets"} 0 -http_request_size_bytes_count{handler="/api/targets"} 0 -http_request_size_bytes{handler="/consoles/",quantile="0.5"} 0 -http_request_size_bytes{handler="/consoles/",quantile="0.9"} 0 -http_request_size_bytes{handler="/consoles/",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/consoles/"} 0 -http_request_size_bytes_count{handler="/consoles/"} 0 -http_request_size_bytes{handler="/graph",quantile="0.5"} 0 -http_request_size_bytes{handler="/graph",quantile="0.9"} 0 -http_request_size_bytes{handler="/graph",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/graph"} 0 -http_request_size_bytes_count{handler="/graph"} 0 -http_request_size_bytes{handler="/heap",quantile="0.5"} 0 -http_request_size_bytes{handler="/heap",quantile="0.9"} 0 -http_request_size_bytes{handler="/heap",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/heap"} 0 -http_request_size_bytes_count{handler="/heap"} 0 -http_request_size_bytes{handler="/static/",quantile="0.5"} 0 -http_request_size_bytes{handler="/static/",quantile="0.9"} 0 -http_request_size_bytes{handler="/static/",quantile="0.99"} 0 -http_request_size_bytes_sum{handler="/static/"} 0 -http_request_size_bytes_count{handler="/static/"} 0 -http_request_size_bytes{handler="prometheus",quantile="0.5"} 291 -http_request_size_bytes{handler="prometheus",quantile="0.9"} 291 -http_request_size_bytes{handler="prometheus",quantile="0.99"} 291 -http_request_size_bytes_sum{handler="prometheus"} 34488 -http_request_size_bytes_count{handler="prometheus"} 119 -# HELP http_requests_total Total number of HTTP requests made. -# TYPE http_requests_total counter -http_requests_total{code="200",handler="prometheus",method="get"} 119 -# HELP http_response_size_bytes The HTTP response sizes in bytes. -# TYPE http_response_size_bytes summary -http_response_size_bytes{handler="/",quantile="0.5"} 0 -http_response_size_bytes{handler="/",quantile="0.9"} 0 -http_response_size_bytes{handler="/",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/"} 0 -http_response_size_bytes_count{handler="/"} 0 -http_response_size_bytes{handler="/alerts",quantile="0.5"} 0 -http_response_size_bytes{handler="/alerts",quantile="0.9"} 0 -http_response_size_bytes{handler="/alerts",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/alerts"} 0 -http_response_size_bytes_count{handler="/alerts"} 0 -http_response_size_bytes{handler="/api/metrics",quantile="0.5"} 0 -http_response_size_bytes{handler="/api/metrics",quantile="0.9"} 0 -http_response_size_bytes{handler="/api/metrics",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/api/metrics"} 0 -http_response_size_bytes_count{handler="/api/metrics"} 0 -http_response_size_bytes{handler="/api/query",quantile="0.5"} 0 -http_response_size_bytes{handler="/api/query",quantile="0.9"} 0 -http_response_size_bytes{handler="/api/query",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/api/query"} 0 -http_response_size_bytes_count{handler="/api/query"} 0 -http_response_size_bytes{handler="/api/query_range",quantile="0.5"} 0 -http_response_size_bytes{handler="/api/query_range",quantile="0.9"} 0 -http_response_size_bytes{handler="/api/query_range",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/api/query_range"} 0 -http_response_size_bytes_count{handler="/api/query_range"} 0 -http_response_size_bytes{handler="/api/targets",quantile="0.5"} 0 -http_response_size_bytes{handler="/api/targets",quantile="0.9"} 0 -http_response_size_bytes{handler="/api/targets",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/api/targets"} 0 -http_response_size_bytes_count{handler="/api/targets"} 0 -http_response_size_bytes{handler="/consoles/",quantile="0.5"} 0 -http_response_size_bytes{handler="/consoles/",quantile="0.9"} 0 -http_response_size_bytes{handler="/consoles/",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/consoles/"} 0 -http_response_size_bytes_count{handler="/consoles/"} 0 -http_response_size_bytes{handler="/graph",quantile="0.5"} 0 -http_response_size_bytes{handler="/graph",quantile="0.9"} 0 -http_response_size_bytes{handler="/graph",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/graph"} 0 -http_response_size_bytes_count{handler="/graph"} 0 -http_response_size_bytes{handler="/heap",quantile="0.5"} 0 -http_response_size_bytes{handler="/heap",quantile="0.9"} 0 -http_response_size_bytes{handler="/heap",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/heap"} 0 -http_response_size_bytes_count{handler="/heap"} 0 -http_response_size_bytes{handler="/static/",quantile="0.5"} 0 -http_response_size_bytes{handler="/static/",quantile="0.9"} 0 -http_response_size_bytes{handler="/static/",quantile="0.99"} 0 -http_response_size_bytes_sum{handler="/static/"} 0 -http_response_size_bytes_count{handler="/static/"} 0 -http_response_size_bytes{handler="prometheus",quantile="0.5"} 2049 -http_response_size_bytes{handler="prometheus",quantile="0.9"} 2058 -http_response_size_bytes{handler="prometheus",quantile="0.99"} 2064 -http_response_size_bytes_sum{handler="prometheus"} 247001 -http_response_size_bytes_count{handler="prometheus"} 119 -# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. -# TYPE process_cpu_seconds_total counter -process_cpu_seconds_total 0.55 -# HELP go_goroutines Number of goroutines that currently exist. -# TYPE go_goroutines gauge -go_goroutines 70 -# HELP process_max_fds Maximum number of open file descriptors. -# TYPE process_max_fds gauge -process_max_fds 8192 -# HELP process_open_fds Number of open file descriptors. -# TYPE process_open_fds gauge -process_open_fds 29 -# HELP process_resident_memory_bytes Resident memory size in bytes. -# TYPE process_resident_memory_bytes gauge -process_resident_memory_bytes 5.3870592e+07 -# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. -# TYPE process_start_time_seconds gauge -process_start_time_seconds 1.42236894836e+09 -# HELP process_virtual_memory_bytes Virtual memory size in bytes. -# TYPE process_virtual_memory_bytes gauge -process_virtual_memory_bytes 5.41478912e+08 -# HELP prometheus_dns_sd_lookup_failures_total The number of DNS-SD lookup failures. -# TYPE prometheus_dns_sd_lookup_failures_total counter -prometheus_dns_sd_lookup_failures_total 0 -# HELP prometheus_dns_sd_lookups_total The number of DNS-SD lookups. -# TYPE prometheus_dns_sd_lookups_total counter -prometheus_dns_sd_lookups_total 7 -# HELP prometheus_evaluator_duration_milliseconds The duration for all evaluations to execute. -# TYPE prometheus_evaluator_duration_milliseconds summary -prometheus_evaluator_duration_milliseconds{quantile="0.01"} 0 -prometheus_evaluator_duration_milliseconds{quantile="0.05"} 0 -prometheus_evaluator_duration_milliseconds{quantile="0.5"} 0 -prometheus_evaluator_duration_milliseconds{quantile="0.9"} 1 -prometheus_evaluator_duration_milliseconds{quantile="0.99"} 1 -prometheus_evaluator_duration_milliseconds_sum 12 -prometheus_evaluator_duration_milliseconds_count 23 -# HELP prometheus_local_storage_checkpoint_duration_milliseconds The duration (in milliseconds) it took to checkpoint in-memory metrics and head chunks. -# TYPE prometheus_local_storage_checkpoint_duration_milliseconds gauge -prometheus_local_storage_checkpoint_duration_milliseconds 0 -# HELP prometheus_local_storage_chunk_ops_total The total number of chunk operations by their type. -# TYPE prometheus_local_storage_chunk_ops_total counter -prometheus_local_storage_chunk_ops_total{type="create"} 598 -prometheus_local_storage_chunk_ops_total{type="persist"} 174 -prometheus_local_storage_chunk_ops_total{type="pin"} 920 -prometheus_local_storage_chunk_ops_total{type="transcode"} 415 -prometheus_local_storage_chunk_ops_total{type="unpin"} 920 -# HELP prometheus_local_storage_indexing_batch_latency_milliseconds Quantiles for batch indexing latencies in milliseconds. -# TYPE prometheus_local_storage_indexing_batch_latency_milliseconds summary -prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.5"} 0 -prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.9"} 0 -prometheus_local_storage_indexing_batch_latency_milliseconds{quantile="0.99"} 0 -prometheus_local_storage_indexing_batch_latency_milliseconds_sum 0 -prometheus_local_storage_indexing_batch_latency_milliseconds_count 1 -# HELP prometheus_local_storage_indexing_batch_sizes Quantiles for indexing batch sizes (number of metrics per batch). -# TYPE prometheus_local_storage_indexing_batch_sizes summary -prometheus_local_storage_indexing_batch_sizes{quantile="0.5"} 2 -prometheus_local_storage_indexing_batch_sizes{quantile="0.9"} 2 -prometheus_local_storage_indexing_batch_sizes{quantile="0.99"} 2 -prometheus_local_storage_indexing_batch_sizes_sum 2 -prometheus_local_storage_indexing_batch_sizes_count 1 -# HELP prometheus_local_storage_indexing_queue_capacity The capacity of the indexing queue. -# TYPE prometheus_local_storage_indexing_queue_capacity gauge -prometheus_local_storage_indexing_queue_capacity 16384 -# HELP prometheus_local_storage_indexing_queue_length The number of metrics waiting to be indexed. -# TYPE prometheus_local_storage_indexing_queue_length gauge -prometheus_local_storage_indexing_queue_length 0 -# HELP prometheus_local_storage_ingested_samples_total The total number of samples ingested. -# TYPE prometheus_local_storage_ingested_samples_total counter -prometheus_local_storage_ingested_samples_total 30473 -# HELP prometheus_local_storage_invalid_preload_requests_total The total number of preload requests referring to a non-existent series. This is an indication of outdated label indexes. -# TYPE prometheus_local_storage_invalid_preload_requests_total counter -prometheus_local_storage_invalid_preload_requests_total 0 -# HELP prometheus_local_storage_memory_chunkdescs The current number of chunk descriptors in memory. -# TYPE prometheus_local_storage_memory_chunkdescs gauge -prometheus_local_storage_memory_chunkdescs 1059 -# HELP prometheus_local_storage_memory_chunks The current number of chunks in memory, excluding cloned chunks (i.e. chunks without a descriptor). -# TYPE prometheus_local_storage_memory_chunks gauge -prometheus_local_storage_memory_chunks 1020 -# HELP prometheus_local_storage_memory_series The current number of series in memory. -# TYPE prometheus_local_storage_memory_series gauge -prometheus_local_storage_memory_series 424 -# HELP prometheus_local_storage_persist_latency_microseconds A summary of latencies for persisting each chunk. -# TYPE prometheus_local_storage_persist_latency_microseconds summary -prometheus_local_storage_persist_latency_microseconds{quantile="0.5"} 30.377 -prometheus_local_storage_persist_latency_microseconds{quantile="0.9"} 203.539 -prometheus_local_storage_persist_latency_microseconds{quantile="0.99"} 2626.463 -prometheus_local_storage_persist_latency_microseconds_sum 20424.415 -prometheus_local_storage_persist_latency_microseconds_count 174 -# HELP prometheus_local_storage_persist_queue_capacity The total capacity of the persist queue. -# TYPE prometheus_local_storage_persist_queue_capacity gauge -prometheus_local_storage_persist_queue_capacity 1024 -# HELP prometheus_local_storage_persist_queue_length The current number of chunks waiting in the persist queue. -# TYPE prometheus_local_storage_persist_queue_length gauge -prometheus_local_storage_persist_queue_length 0 -# HELP prometheus_local_storage_series_ops_total The total number of series operations by their type. -# TYPE prometheus_local_storage_series_ops_total counter -prometheus_local_storage_series_ops_total{type="create"} 2 -prometheus_local_storage_series_ops_total{type="maintenance_in_memory"} 11 -# HELP prometheus_notifications_latency_milliseconds Latency quantiles for sending alert notifications (not including dropped notifications). -# TYPE prometheus_notifications_latency_milliseconds summary -prometheus_notifications_latency_milliseconds{quantile="0.5"} 0 -prometheus_notifications_latency_milliseconds{quantile="0.9"} 0 -prometheus_notifications_latency_milliseconds{quantile="0.99"} 0 -prometheus_notifications_latency_milliseconds_sum 0 -prometheus_notifications_latency_milliseconds_count 0 -# HELP prometheus_notifications_queue_capacity The capacity of the alert notifications queue. -# TYPE prometheus_notifications_queue_capacity gauge -prometheus_notifications_queue_capacity 100 -# HELP prometheus_notifications_queue_length The number of alert notifications in the queue. -# TYPE prometheus_notifications_queue_length gauge -prometheus_notifications_queue_length 0 -# HELP prometheus_rule_evaluation_duration_milliseconds The duration for a rule to execute. -# TYPE prometheus_rule_evaluation_duration_milliseconds summary -prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.5"} 0 -prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.9"} 0 -prometheus_rule_evaluation_duration_milliseconds{rule_type="alerting",quantile="0.99"} 2 -prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="alerting"} 12 -prometheus_rule_evaluation_duration_milliseconds_count{rule_type="alerting"} 115 -prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.5"} 0 -prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.9"} 0 -prometheus_rule_evaluation_duration_milliseconds{rule_type="recording",quantile="0.99"} 3 -prometheus_rule_evaluation_duration_milliseconds_sum{rule_type="recording"} 15 -prometheus_rule_evaluation_duration_milliseconds_count{rule_type="recording"} 115 -# HELP prometheus_rule_evaluation_failures_total The total number of rule evaluation failures. -# TYPE prometheus_rule_evaluation_failures_total counter -prometheus_rule_evaluation_failures_total 0 -# HELP prometheus_samples_queue_capacity Capacity of the queue for unwritten samples. -# TYPE prometheus_samples_queue_capacity gauge -prometheus_samples_queue_capacity 4096 -# HELP prometheus_samples_queue_length Current number of items in the queue for unwritten samples. Each item comprises all samples exposed by one target as one metric family (i.e. metrics of the same name). -# TYPE prometheus_samples_queue_length gauge -prometheus_samples_queue_length 0 -# HELP prometheus_target_interval_length_seconds Actual intervals between scrapes. -# TYPE prometheus_target_interval_length_seconds summary -prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14 -prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14 -prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15 -prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15 -prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15 -prometheus_target_interval_length_seconds_sum{interval="15s"} 175 -prometheus_target_interval_length_seconds_count{interval="15s"} 12 -prometheus_target_interval_length_seconds{interval="1s",quantile="0.01"} 0 -prometheus_target_interval_length_seconds{interval="1s",quantile="0.05"} 0 -prometheus_target_interval_length_seconds{interval="1s",quantile="0.5"} 0 -prometheus_target_interval_length_seconds{interval="1s",quantile="0.9"} 1 -prometheus_target_interval_length_seconds{interval="1s",quantile="0.99"} 1 -prometheus_target_interval_length_seconds_sum{interval="1s"} 55 -prometheus_target_interval_length_seconds_count{interval="1s"} 117 diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_create_test.go b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_create_test.go deleted file mode 100644 index e4cc5d803..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_create_test.go +++ /dev/null @@ -1,443 +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" - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - - dto "github.com/prometheus/client_model/go" -) - -func testCreate(t testing.TB) { - var scenarios = []struct { - in *dto.MetricFamily - out string - }{ - // 0: Counter, NaN as value, timestamp given. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("two-line\n doc str\\ing"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(math.NaN()), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(.23), - }, - TimestampMs: proto.Int64(1234567890), - }, - }, - }, - out: `# HELP name two-line\n doc str\\ing -# TYPE name counter -name{labelname="val1",basename="basevalue"} NaN -name{labelname="val2",basename="basevalue"} 0.23 1234567890 -`, - }, - // 1: Gauge, some escaping required, +Inf as value, multi-byte characters in label values. - { - in: &dto.MetricFamily{ - Name: proto.String("gauge_name"), - Help: proto.String("gauge\ndoc\nstr\"ing"), - Type: dto.MetricType_GAUGE.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("val with\nnew line"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("val with \\backslash and \"quotes\""), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(+1)), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("Björn"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("佖佥"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(3.14E42), - }, - }, - }, - }, - out: `# HELP gauge_name gauge\ndoc\nstr"ing -# TYPE gauge_name gauge -gauge_name{name_1="val with\nnew line",name_2="val with \\backslash and \"quotes\""} +Inf -gauge_name{name_1="Björn",name_2="佖佥"} 3.14e+42 -`, - }, - // 2: Untyped, no help, one sample with no labels and -Inf as value, another sample with one label. - { - in: &dto.MetricFamily{ - Name: proto.String("untyped_name"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("value 1"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(-1.23e-45), - }, - }, - }, - }, - out: `# TYPE untyped_name untyped -untyped_name -Inf -untyped_name{name_1="value 1"} -1.23e-45 -`, - }, - // 3: Summary. - { - in: &dto.MetricFamily{ - Name: proto.String("summary_name"), - Help: proto.String("summary docstring"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Summary: &dto.Summary{ - SampleCount: proto.Uint64(42), - SampleSum: proto.Float64(-3.4567), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(-1.23), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(.2342354), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.99), - Value: proto.Float64(0), - }, - }, - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("value 1"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("value 2"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(4711), - SampleSum: proto.Float64(2010.1971), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(1), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(2), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.99), - Value: proto.Float64(3), - }, - }, - }, - }, - }, - }, - out: `# HELP summary_name summary docstring -# TYPE summary_name summary -summary_name{quantile="0.5"} -1.23 -summary_name{quantile="0.9"} 0.2342354 -summary_name{quantile="0.99"} 0 -summary_name_sum -3.4567 -summary_name_count 42 -summary_name{name_1="value 1",name_2="value 2",quantile="0.5"} 1 -summary_name{name_1="value 1",name_2="value 2",quantile="0.9"} 2 -summary_name{name_1="value 1",name_2="value 2",quantile="0.99"} 3 -summary_name_sum{name_1="value 1",name_2="value 2"} 2010.1971 -summary_name_count{name_1="value 1",name_2="value 2"} 4711 -`, - }, - // 4: Histogram - { - in: &dto.MetricFamily{ - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - &dto.Bucket{ - UpperBound: proto.Float64(math.Inf(+1)), - CumulativeCount: proto.Uint64(2693), - }, - }, - }, - }, - }, - }, - out: `# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - }, - // 5: Histogram with missing +Inf bucket. - { - in: &dto.MetricFamily{ - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - }, - }, - }, - }, - }, - out: `# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - }, - // 6: No metric type, should result in default type Counter. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Metric: []*dto.Metric{ - &dto.Metric{ - Counter: &dto.Counter{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - out: `# HELP name doc string -# TYPE name counter -name -Inf -`, - }, - } - - for i, scenario := range scenarios { - out := bytes.NewBuffer(make([]byte, 0, len(scenario.out))) - n, err := MetricFamilyToText(out, scenario.in) - if err != nil { - t.Errorf("%d. error: %s", i, err) - continue - } - if expected, got := len(scenario.out), n; expected != got { - t.Errorf( - "%d. expected %d bytes written, got %d", - i, expected, got, - ) - } - if expected, got := scenario.out, out.String(); expected != got { - t.Errorf( - "%d. expected out=%q, got %q", - i, expected, got, - ) - } - } - -} - -func TestCreate(t *testing.T) { - testCreate(t) -} - -func BenchmarkCreate(b *testing.B) { - for i := 0; i < b.N; i++ { - testCreate(b) - } -} - -func testCreateError(t testing.TB) { - var scenarios = []struct { - in *dto.MetricFamily - err string - }{ - // 0: No metric. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{}, - }, - err: "MetricFamily has no metrics", - }, - // 1: No metric name. - { - in: &dto.MetricFamily{ - Help: proto.String("doc string"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - err: "MetricFamily has no name", - }, - // 2: Wrong type. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - err: "expected counter in metric", - }, - } - - for i, scenario := range scenarios { - var out bytes.Buffer - _, err := MetricFamilyToText(&out, scenario.in) - if err == nil { - t.Errorf("%d. expected error, got nil", i) - continue - } - if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { - t.Errorf( - "%d. expected error starting with %q, got %q", - i, expected, got, - ) - } - } - -} - -func TestCreateError(t *testing.T) { - testCreateError(t) -} - -func BenchmarkCreateError(b *testing.B) { - for i := 0; i < b.N; i++ { - testCreateError(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_parse_test.go b/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_parse_test.go deleted file mode 100644 index 589c87a9d..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/expfmt/text_parse_test.go +++ /dev/null @@ -1,586 +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 ( - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" -) - -func testTextParse(t testing.TB) { - var scenarios = []struct { - in string - out []*dto.MetricFamily - }{ - // 0: Empty lines as input. - { - in: ` - -`, - out: []*dto.MetricFamily{}, - }, - // 1: Minimal case. - { - in: ` -minimal_metric 1.234 -another_metric -3e3 103948 -# Even that: -no_labels{} 3 -# HELP line for non-existing metric will be ignored. -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("minimal_metric"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(1.234), - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("another_metric"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(-3e3), - }, - TimestampMs: proto.Int64(103948), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("no_labels"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(3), - }, - }, - }, - }, - }, - }, - // 2: Counters & gauges, docstrings, various whitespace, escape sequences. - { - in: ` -# A normal comment. -# -# TYPE name counter -name{labelname="val1",basename="basevalue"} NaN -name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 -# HELP name two-line\n doc str\\ing - - # HELP name2 doc str"ing 2 - # TYPE name2 gauge -name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 -name2{ labelname = "val1" , }-Inf -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("two-line\n doc str\\ing"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(math.NaN()), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("base\"v\\al\nue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(.23), - }, - TimestampMs: proto.Int64(1234567890), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("name2"), - Help: proto.String("doc str\"ing 2"), - Type: dto.MetricType_GAUGE.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue2"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(+1)), - }, - TimestampMs: proto.Int64(54321), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - }, - }, - // 3: The evil summary, mixed with other types and funny comments. - { - in: ` -# TYPE my_summary summary -my_summary{n1="val1",quantile="0.5"} 110 -decoy -1 -2 -my_summary{n1="val1",quantile="0.9"} 140 1 -my_summary_count{n1="val1"} 42 -# Latest timestamp wins in case of a summary. -my_summary_sum{n1="val1"} 4711 2 -fake_sum{n1="val1"} 2001 -# TYPE another_summary summary -another_summary_count{n2="val2",n1="val1"} 20 -my_summary_count{n2="val2",n1="val1"} 5 5 -another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 -my_summary_sum{n1="val2"} 08 15 -my_summary{n1="val3", quantile="0.2"} 4711 - my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN -# some -# funny comments -# HELP -# HELP -# HELP my_summary -# HELP my_summary -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("fake_sum"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(2001), - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("decoy"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(-1), - }, - TimestampMs: proto.Int64(-2), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("my_summary"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(42), - SampleSum: proto.Float64(4711), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(110), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(140), - }, - }, - }, - TimestampMs: proto.Int64(2), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n2"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(5), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(-12.34), - Value: proto.Float64(math.NaN()), - }, - }, - }, - TimestampMs: proto.Int64(5), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val2"), - }, - }, - Summary: &dto.Summary{ - SampleSum: proto.Float64(8), - }, - TimestampMs: proto.Int64(15), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val3"), - }, - }, - Summary: &dto.Summary{ - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.2), - Value: proto.Float64(4711), - }, - }, - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("another_summary"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n2"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(20), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.3), - Value: proto.Float64(-1.2), - }, - }, - }, - }, - }, - }, - }, - }, - // 4: The histogram. - { - in: ` -# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - out: []*dto.MetricFamily{ - { - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - &dto.Bucket{ - UpperBound: proto.Float64(math.Inf(+1)), - CumulativeCount: proto.Uint64(2693), - }, - }, - }, - }, - }, - }, - }, - }, - } - - for i, scenario := range scenarios { - out, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) - if err != nil { - t.Errorf("%d. error: %s", i, err) - continue - } - if expected, got := len(scenario.out), len(out); expected != got { - t.Errorf( - "%d. expected %d MetricFamilies, got %d", - i, expected, got, - ) - } - for _, expected := range scenario.out { - got, ok := out[expected.GetName()] - if !ok { - t.Errorf( - "%d. expected MetricFamily %q, found none", - i, expected.GetName(), - ) - continue - } - if expected.String() != got.String() { - t.Errorf( - "%d. expected MetricFamily %s, got %s", - i, expected, got, - ) - } - } - } -} - -func TestTextParse(t *testing.T) { - testTextParse(t) -} - -func BenchmarkTextParse(b *testing.B) { - for i := 0; i < b.N; i++ { - testTextParse(b) - } -} - -func testTextParseError(t testing.TB) { - var scenarios = []struct { - in string - err string - }{ - // 0: No new-line at end of input. - { - in: `bla 3.14`, - err: "EOF", - }, - // 1: Invalid escape sequence in label value. - { - in: `metric{label="\t"} 3.14`, - err: "text format parsing error in line 1: invalid escape sequence", - }, - // 2: Newline in label value. - { - in: ` -metric{label="new -line"} 3.14 -`, - err: `text format parsing error in line 2: label value "new" contains unescaped new-line`, - }, - // 3: - { - in: `metric{@="bla"} 3.14`, - err: "text format parsing error in line 1: invalid label name for metric", - }, - // 4: - { - in: `metric{__name__="bla"} 3.14`, - err: `text format parsing error in line 1: label name "__name__" is reserved`, - }, - // 5: - { - in: `metric{label+="bla"} 3.14`, - err: "text format parsing error in line 1: expected '=' after label name", - }, - // 6: - { - in: `metric{label=bla} 3.14`, - err: "text format parsing error in line 1: expected '\"' at start of label value", - }, - // 7: - { - in: ` -# TYPE metric summary -metric{quantile="bla"} 3.14 -`, - err: "text format parsing error in line 3: expected float as value for 'quantile' label", - }, - // 8: - { - in: `metric{label="bla"+} 3.14`, - err: "text format parsing error in line 1: unexpected end of label value", - }, - // 9: - { - in: `metric{label="bla"} 3.14 2.72 -`, - err: "text format parsing error in line 1: expected integer as timestamp", - }, - // 10: - { - in: `metric{label="bla"} 3.14 2 3 -`, - err: "text format parsing error in line 1: spurious string after timestamp", - }, - // 11: - { - in: `metric{label="bla"} blubb -`, - err: "text format parsing error in line 1: expected float as value", - }, - // 12: - { - in: ` -# HELP metric one -# HELP metric two -`, - err: "text format parsing error in line 3: second HELP line for metric name", - }, - // 13: - { - in: ` -# TYPE metric counter -# TYPE metric untyped -`, - err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, - }, - // 14: - { - in: ` -metric 4.12 -# TYPE metric counter -`, - err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, - }, - // 14: - { - in: ` -# TYPE metric bla -`, - err: "text format parsing error in line 2: unknown metric type", - }, - // 15: - { - in: ` -# TYPE met-ric -`, - err: "text format parsing error in line 2: invalid metric name in comment", - }, - // 16: - { - in: `@invalidmetric{label="bla"} 3.14 2`, - err: "text format parsing error in line 1: invalid metric name", - }, - // 17: - { - in: `{label="bla"} 3.14 2`, - err: "text format parsing error in line 1: invalid metric name", - }, - // 18: - { - in: ` -# TYPE metric histogram -metric_bucket{le="bla"} 3.14 -`, - err: "text format parsing error in line 3: expected float as value for 'le' label", - }, - } - - for i, scenario := range scenarios { - _, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) - if err == nil { - t.Errorf("%d. expected error, got nil", i) - continue - } - if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { - t.Errorf( - "%d. expected error starting with %q, got %q", - i, expected, got, - ) - } - } - -} - -func TestTextParseError(t *testing.T) { - testTextParseError(t) -} - -func BenchmarkParseError(b *testing.B) { - for i := 0; i < b.N; i++ { - testTextParseError(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/model/labels_test.go b/Godeps/_workspace/src/github.com/prometheus/common/model/labels_test.go deleted file mode 100644 index ab17025c7..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/model/labels_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2013 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 model - -import ( - "sort" - "testing" -) - -func testLabelNames(t testing.TB) { - var scenarios = []struct { - in LabelNames - out LabelNames - }{ - { - in: LabelNames{"ZZZ", "zzz"}, - out: LabelNames{"ZZZ", "zzz"}, - }, - { - in: LabelNames{"aaa", "AAA"}, - out: LabelNames{"AAA", "aaa"}, - }, - } - - for i, scenario := range scenarios { - sort.Sort(scenario.in) - - for j, expected := range scenario.out { - if expected != scenario.in[j] { - t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) - } - } - } -} - -func TestLabelNames(t *testing.T) { - testLabelNames(t) -} - -func BenchmarkLabelNames(b *testing.B) { - for i := 0; i < b.N; i++ { - testLabelNames(b) - } -} - -func testLabelValues(t testing.TB) { - var scenarios = []struct { - in LabelValues - out LabelValues - }{ - { - in: LabelValues{"ZZZ", "zzz"}, - out: LabelValues{"ZZZ", "zzz"}, - }, - { - in: LabelValues{"aaa", "AAA"}, - out: LabelValues{"AAA", "aaa"}, - }, - } - - for i, scenario := range scenarios { - sort.Sort(scenario.in) - - for j, expected := range scenario.out { - if expected != scenario.in[j] { - t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) - } - } - } -} - -func TestLabelValues(t *testing.T) { - testLabelValues(t) -} - -func BenchmarkLabelValues(b *testing.B) { - for i := 0; i < b.N; i++ { - testLabelValues(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/model/metric_test.go b/Godeps/_workspace/src/github.com/prometheus/common/model/metric_test.go deleted file mode 100644 index 5c7cfceaf..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/model/metric_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2013 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 model - -import "testing" - -func testMetric(t testing.TB) { - var scenarios = []struct { - input LabelSet - fingerprint Fingerprint - fastFingerprint Fingerprint - }{ - { - input: LabelSet{}, - fingerprint: 14695981039346656037, - fastFingerprint: 14695981039346656037, - }, - { - input: LabelSet{ - "first_name": "electro", - "occupation": "robot", - "manufacturer": "westinghouse", - }, - fingerprint: 5911716720268894962, - fastFingerprint: 11310079640881077873, - }, - { - input: LabelSet{ - "x": "y", - }, - fingerprint: 8241431561484471700, - fastFingerprint: 13948396922932177635, - }, - { - input: LabelSet{ - "a": "bb", - "b": "c", - }, - fingerprint: 3016285359649981711, - fastFingerprint: 3198632812309449502, - }, - { - input: LabelSet{ - "a": "b", - "bb": "c", - }, - fingerprint: 7122421792099404749, - fastFingerprint: 5774953389407657638, - }, - } - - for i, scenario := range scenarios { - input := Metric(scenario.input) - - if scenario.fingerprint != input.Fingerprint() { - t.Errorf("%d. expected %d, got %d", i, scenario.fingerprint, input.Fingerprint()) - } - if scenario.fastFingerprint != input.FastFingerprint() { - t.Errorf("%d. expected %d, got %d", i, scenario.fastFingerprint, input.FastFingerprint()) - } - } -} - -func TestMetric(t *testing.T) { - testMetric(t) -} - -func BenchmarkMetric(b *testing.B) { - for i := 0; i < b.N; i++ { - testMetric(b) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/model/signature_test.go b/Godeps/_workspace/src/github.com/prometheus/common/model/signature_test.go deleted file mode 100644 index d9c665f8c..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/model/signature_test.go +++ /dev/null @@ -1,304 +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 model - -import ( - "runtime" - "sync" - "testing" -) - -func TestLabelsToSignature(t *testing.T) { - var scenarios = []struct { - in map[string]string - out uint64 - }{ - { - in: map[string]string{}, - out: 14695981039346656037, - }, - { - in: map[string]string{"name": "garland, briggs", "fear": "love is not enough"}, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := LabelsToSignature(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestMetricToFingerprint(t *testing.T) { - var scenarios = []struct { - in LabelSet - out Fingerprint - }{ - { - in: LabelSet{}, - out: 14695981039346656037, - }, - { - in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := labelSetToFingerprint(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestMetricToFastFingerprint(t *testing.T) { - var scenarios = []struct { - in LabelSet - out Fingerprint - }{ - { - in: LabelSet{}, - out: 14695981039346656037, - }, - { - in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, - out: 12952432476264840823, - }, - } - - for i, scenario := range scenarios { - actual := labelSetToFastFingerprint(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestSignatureForLabels(t *testing.T) { - var scenarios = []struct { - in Metric - labels LabelNames - out uint64 - }{ - { - in: Metric{}, - labels: nil, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: LabelNames{"fear", "name"}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, - labels: LabelNames{"fear", "name"}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: LabelNames{}, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: nil, - out: 14695981039346656037, - }, - } - - for i, scenario := range scenarios { - actual := SignatureForLabels(scenario.in, scenario.labels...) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestSignatureWithoutLabels(t *testing.T) { - var scenarios = []struct { - in Metric - labels map[LabelName]struct{} - out uint64 - }{ - { - in: Metric{}, - labels: nil, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: map[LabelName]struct{}{"fear": struct{}{}, "name": struct{}{}}, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, - labels: map[LabelName]struct{}{"foo": struct{}{}}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: map[LabelName]struct{}{}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: nil, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := SignatureWithoutLabels(scenario.in, scenario.labels) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func benchmarkLabelToSignature(b *testing.B, l map[string]string, e uint64) { - for i := 0; i < b.N; i++ { - if a := LabelsToSignature(l); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, l, a) - } - } -} - -func BenchmarkLabelToSignatureScalar(b *testing.B) { - benchmarkLabelToSignature(b, nil, 14695981039346656037) -} - -func BenchmarkLabelToSignatureSingle(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value"}, 5146282821936882169) -} - -func BenchmarkLabelToSignatureDouble(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) -} - -func BenchmarkLabelToSignatureTriple(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) -} - -func benchmarkMetricToFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { - for i := 0; i < b.N; i++ { - if a := labelSetToFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } -} - -func BenchmarkMetricToFingerprintScalar(b *testing.B) { - benchmarkMetricToFingerprint(b, nil, 14695981039346656037) -} - -func BenchmarkMetricToFingerprintSingle(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5146282821936882169) -} - -func BenchmarkMetricToFingerprintDouble(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) -} - -func BenchmarkMetricToFingerprintTriple(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) -} - -func benchmarkMetricToFastFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { - for i := 0; i < b.N; i++ { - if a := labelSetToFastFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } -} - -func BenchmarkMetricToFastFingerprintScalar(b *testing.B) { - benchmarkMetricToFastFingerprint(b, nil, 14695981039346656037) -} - -func BenchmarkMetricToFastFingerprintSingle(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5147259542624943964) -} - -func BenchmarkMetricToFastFingerprintDouble(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 18269973311206963528) -} - -func BenchmarkMetricToFastFingerprintTriple(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676) -} - -func BenchmarkEmptyLabelSignature(b *testing.B) { - input := []map[string]string{nil, {}} - - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - - alloc := ms.Alloc - - for _, labels := range input { - LabelsToSignature(labels) - } - - runtime.ReadMemStats(&ms) - - if got := ms.Alloc; alloc != got { - b.Fatal("expected LabelsToSignature with empty labels not to perform allocations") - } -} - -func benchmarkMetricToFastFingerprintConc(b *testing.B, ls LabelSet, e Fingerprint, concLevel int) { - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - for i := 0; i < concLevel; i++ { - go func() { - start.Wait() - for j := b.N / concLevel; j >= 0; j-- { - if a := labelSetToFastFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } - end.Done() - }() - } - b.ResetTimer() - start.Done() - end.Wait() -} - -func BenchmarkMetricToFastFingerprintTripleConc1(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 1) -} - -func BenchmarkMetricToFastFingerprintTripleConc2(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 2) -} - -func BenchmarkMetricToFastFingerprintTripleConc4(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 4) -} - -func BenchmarkMetricToFastFingerprintTripleConc8(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 8) -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/model/time_test.go b/Godeps/_workspace/src/github.com/prometheus/common/model/time_test.go deleted file mode 100644 index 9013a6277..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/model/time_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2013 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 model - -import ( - "testing" - "time" -) - -func TestComparators(t *testing.T) { - t1a := TimeFromUnix(0) - t1b := TimeFromUnix(0) - t2 := TimeFromUnix(2*second - 1) - - if !t1a.Equal(t1b) { - t.Fatalf("Expected %s to be equal to %s", t1a, t1b) - } - if t1a.Equal(t2) { - t.Fatalf("Expected %s to not be equal to %s", t1a, t2) - } - - if !t1a.Before(t2) { - t.Fatalf("Expected %s to be before %s", t1a, t2) - } - if t1a.Before(t1b) { - t.Fatalf("Expected %s to not be before %s", t1a, t1b) - } - - if !t2.After(t1a) { - t.Fatalf("Expected %s to be after %s", t2, t1a) - } - if t1b.After(t1a) { - t.Fatalf("Expected %s to not be after %s", t1b, t1a) - } -} - -func TestTimeConversions(t *testing.T) { - unixSecs := int64(1136239445) - unixNsecs := int64(123456789) - unixNano := unixSecs*1e9 + unixNsecs - - t1 := time.Unix(unixSecs, unixNsecs-unixNsecs%nanosPerTick) - t2 := time.Unix(unixSecs, unixNsecs) - - ts := TimeFromUnixNano(unixNano) - if !ts.Time().Equal(t1) { - t.Fatalf("Expected %s, got %s", t1, ts.Time()) - } - - // Test available precision. - ts = TimeFromUnixNano(t2.UnixNano()) - if !ts.Time().Equal(t1) { - t.Fatalf("Expected %s, got %s", t1, ts.Time()) - } - - if ts.UnixNano() != unixNano-unixNano%nanosPerTick { - t.Fatalf("Expected %d, got %d", unixNano, ts.UnixNano()) - } -} - -func TestDuration(t *testing.T) { - duration := time.Second + time.Minute + time.Hour - goTime := time.Unix(1136239445, 0) - - ts := TimeFromUnix(goTime.Unix()) - if !goTime.Add(duration).Equal(ts.Add(duration).Time()) { - t.Fatalf("Expected %s to be equal to %s", goTime.Add(duration), ts.Add(duration)) - } - - earlier := ts.Add(-duration) - delta := ts.Sub(earlier) - if delta != duration { - t.Fatalf("Expected %s to be equal to %s", delta, duration) - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/common/model/value_test.go b/Godeps/_workspace/src/github.com/prometheus/common/model/value_test.go deleted file mode 100644 index 2e9c7eb09..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/common/model/value_test.go +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2013 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 model - -import ( - "encoding/json" - "math" - "reflect" - "sort" - "testing" -) - -func TestSamplePairJSON(t *testing.T) { - input := []struct { - plain string - value SamplePair - }{ - { - plain: `[1234.567,"123.1"]`, - value: SamplePair{ - Value: 123.1, - Timestamp: 1234567, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sp SamplePair - err = json.Unmarshal(b, &sp) - if err != nil { - t.Error(err) - continue - } - - if sp != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sp) - } - } -} - -func TestSampleJSON(t *testing.T) { - input := []struct { - plain string - value Sample - }{ - { - plain: `{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}`, - value: Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv Sample - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if !reflect.DeepEqual(sv, test.value) { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestVectorJSON(t *testing.T) { - input := []struct { - plain string - value Vector - }{ - { - plain: `[]`, - value: Vector{}, - }, - { - plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}]`, - value: Vector{&Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }}, - }, - { - plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]},{"metric":{"foo":"bar"},"value":[1.234,"+Inf"]}]`, - value: Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }, - &Sample{ - Metric: Metric{ - "foo": "bar", - }, - Value: SampleValue(math.Inf(1)), - Timestamp: 1234, - }, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var vec Vector - err = json.Unmarshal(b, &vec) - if err != nil { - t.Error(err) - continue - } - - if !reflect.DeepEqual(vec, test.value) { - t.Errorf("decoding error: expected %v, got %v", test.value, vec) - } - } -} - -func TestScalarJSON(t *testing.T) { - input := []struct { - plain string - value Scalar - }{ - { - plain: `[123.456,"456"]`, - value: Scalar{ - Timestamp: 123456, - Value: 456, - }, - }, - { - plain: `[123123.456,"+Inf"]`, - value: Scalar{ - Timestamp: 123123456, - Value: SampleValue(math.Inf(1)), - }, - }, - { - plain: `[123123.456,"-Inf"]`, - value: Scalar{ - Timestamp: 123123456, - Value: SampleValue(math.Inf(-1)), - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv Scalar - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if sv != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestStringJSON(t *testing.T) { - input := []struct { - plain string - value String - }{ - { - plain: `[123.456,"test"]`, - value: String{ - Timestamp: 123456, - Value: "test", - }, - }, - { - plain: `[123123.456,"台北"]`, - value: String{ - Timestamp: 123123456, - Value: "台北", - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv String - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if sv != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestVectorSort(t *testing.T) { - input := Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 2, - }, - } - - expected := Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 2, - }, - } - - sort.Sort(input) - - for i, actual := range input { - actualFp := actual.Metric.Fingerprint() - expectedFp := expected[i].Metric.Fingerprint() - - if actualFp != expectedFp { - t.Fatalf("%d. Incorrect fingerprint. Got %s; want %s", i, actualFp.String(), expectedFp.String()) - } - - if actual.Timestamp != expected[i].Timestamp { - t.Fatalf("%d. Incorrect timestamp. Got %s; want %s", i, actual.Timestamp, expected[i].Timestamp) - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/cmdline b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/cmdline deleted file mode 100644 index d2d8ef88764f6c9f819285f534aa70835a54950c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 XcmXTR%w;G^EiTbZ&u7p!G++P#E?@+m diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/0 b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/0 deleted file mode 100644 index e69de29bb..000000000 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/1 b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/2 b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/3 b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/4 b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/fd/4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/limits b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/limits deleted file mode 100644 index 23c6b6898..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/limits +++ /dev/null @@ -1,17 +0,0 @@ -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 unlimited 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 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/stat b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/stat deleted file mode 100644 index 438aaa9dc..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/26231/stat +++ /dev/null @@ -1 +0,0 @@ -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 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/584/stat b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/584/stat deleted file mode 100644 index 65b9369d1..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/584/stat +++ /dev/null @@ -1,2 +0,0 @@ -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 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/stat b/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/stat deleted file mode 100644 index dabb96f74..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/fixtures/stat +++ /dev/null @@ -1,16 +0,0 @@ -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 0 -softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/fs_test.go b/Godeps/_workspace/src/github.com/prometheus/procfs/fs_test.go deleted file mode 100644 index 91f1c6c97..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/fs_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package procfs - -import "testing" - -func TestNewFS(t *testing.T) { - if _, err := NewFS("foobar"); err == nil { - t.Error("want NewFS to fail for non-existing mount point") - } - - if _, err := NewFS("procfs.go"); err == nil { - t.Error("want NewFS to fail if mount point is not a directory") - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_limits_test.go b/Godeps/_workspace/src/github.com/prometheus/procfs/proc_limits_test.go deleted file mode 100644 index ca7a254da..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_limits_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package procfs - -import "testing" - -func TestNewLimits(t *testing.T) { - fs, err := NewFS("fixtures") - if err != nil { - t.Fatal(err) - } - - p, err := fs.NewProc(26231) - if err != nil { - t.Fatal(err) - } - - l, err := p.NewLimits() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int - got int - }{ - {name: "cpu time", want: -1, got: l.CPUTime}, - {name: "open files", want: 2048, got: l.OpenFiles}, - {name: "msgqueue size", want: 819200, got: l.MsqqueueSize}, - {name: "nice priority", want: 0, got: l.NicePriority}, - {name: "address space", want: -1, got: l.AddressSpace}, - } { - if test.want != test.got { - t.Errorf("want %s %d, got %d", test.name, test.want, test.got) - } - } -} diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_stat_test.go b/Godeps/_workspace/src/github.com/prometheus/procfs/proc_stat_test.go deleted file mode 100644 index e4d5cacfa..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_stat_test.go +++ /dev/null @@ -1,112 +0,0 @@ -package procfs - -import "testing" - -func TestProcStat(t *testing.T) { - fs, err := NewFS("fixtures") - if err != nil { - t.Fatal(err) - } - - p, err := fs.NewProc(26231) - if err != nil { - t.Fatal(err) - } - - s, err := p.NewStat() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int - got int - }{ - {name: "pid", want: 26231, got: s.PID}, - {name: "user time", want: 1677, got: int(s.UTime)}, - {name: "system time", want: 44, got: int(s.STime)}, - {name: "start time", want: 82375, got: int(s.Starttime)}, - {name: "virtual memory size", want: 56274944, got: s.VSize}, - {name: "resident set size", want: 1981, got: s.RSS}, - } { - if test.want != test.got { - t.Errorf("want %s %d, got %d", test.name, test.want, test.got) - } - } -} - -func TestProcStatComm(t *testing.T) { - s1, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - if want, got := "vim", s1.Comm; want != got { - t.Errorf("want comm %s, got %s", want, got) - } - - s2, err := testProcStat(584) - if err != nil { - t.Fatal(err) - } - if want, got := "(a b ) ( c d) ", s2.Comm; want != got { - t.Errorf("want comm %s, got %s", want, got) - } -} - -func TestProcStatVirtualMemory(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, got := 56274944, s.VirtualMemory(); want != got { - t.Errorf("want virtual memory %d, got %d", want, got) - } -} - -func TestProcStatResidentMemory(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, got := 1981*4096, s.ResidentMemory(); want != got { - t.Errorf("want resident memory %d, got %d", want, got) - } -} - -func TestProcStatStartTime(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - time, err := s.StartTime() - if err != nil { - t.Fatal(err) - } - if want, got := 1418184099.75, time; want != got { - t.Errorf("want start time %f, got %f", want, got) - } -} - -func TestProcStatCPUTime(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, got := 17.21, s.CPUTime(); want != got { - t.Errorf("want cpu time %f, got %f", want, got) - } -} - -func testProcStat(pid int) (ProcStat, error) { - p, err := testProcess(pid) - if err != nil { - return ProcStat{}, err - } - - return p.NewStat() -} diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_test.go b/Godeps/_workspace/src/github.com/prometheus/procfs/proc_test.go deleted file mode 100644 index bd234a14c..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/proc_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package procfs - -import ( - "os" - "reflect" - "sort" - "testing" -) - -func TestSelf(t *testing.T) { - p1, err := NewProc(os.Getpid()) - if err != nil { - t.Fatal(err) - } - p2, err := Self() - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(p1, p2) { - t.Errorf("want process %v to equal %v", p1, p2) - } -} - -func TestAllProcs(t *testing.T) { - fs, err := NewFS("fixtures") - if err != nil { - t.Fatal(err) - } - procs, err := fs.AllProcs() - if err != nil { - t.Fatal(err) - } - sort.Sort(procs) - for i, p := range []*Proc{{PID: 584}, {PID: 26231}} { - if want, got := p.PID, procs[i].PID; want != got { - t.Errorf("want processes %d, got %d", want, got) - } - } -} - -func TestCmdLine(t *testing.T) { - p1, err := testProcess(26231) - if err != nil { - t.Fatal(err) - } - c, err := p1.CmdLine() - if err != nil { - t.Fatal(err) - } - if want := []string{"vim", "test.go", "+10"}; !reflect.DeepEqual(want, c) { - t.Errorf("want cmdline %v, got %v", want, c) - } -} - -func TestFileDescriptors(t *testing.T) { - p1, err := testProcess(26231) - if err != nil { - t.Fatal(err) - } - fds, err := p1.FileDescriptors() - if err != nil { - t.Fatal(err) - } - sort.Sort(byUintptr(fds)) - if want := []uintptr{0, 1, 2, 3, 4}; !reflect.DeepEqual(want, fds) { - t.Errorf("want fds %v, got %v", want, fds) - } - - p2, err := Self() - if err != nil { - t.Fatal(err) - } - - fdsBefore, err := p2.FileDescriptors() - if err != nil { - t.Fatal(err) - } - - s, err := os.Open("fixtures") - if err != nil { - t.Fatal(err) - } - defer s.Close() - - fdsAfter, err := p2.FileDescriptors() - if err != nil { - t.Fatal(err) - } - - if len(fdsBefore)+1 != len(fdsAfter) { - t.Errorf("want fds %v+1 to equal %v", fdsBefore, fdsAfter) - } -} - -func TestFileDescriptorsLen(t *testing.T) { - p1, err := testProcess(26231) - if err != nil { - t.Fatal(err) - } - l, err := p1.FileDescriptorsLen() - if err != nil { - t.Fatal(err) - } - if want, got := 5, l; want != got { - t.Errorf("want fds %d, got %d", want, got) - } -} - -func testProcess(pid int) (Proc, error) { - fs, err := NewFS("fixtures") - if err != nil { - return Proc{}, err - } - - return fs.NewProc(pid) -} - -type byUintptr []uintptr - -func (a byUintptr) Len() int { return len(a) } -func (a byUintptr) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byUintptr) Less(i, j int) bool { return a[i] < a[j] } diff --git a/Godeps/_workspace/src/github.com/prometheus/procfs/stat_test.go b/Godeps/_workspace/src/github.com/prometheus/procfs/stat_test.go deleted file mode 100644 index 24b5d61f8..000000000 --- a/Godeps/_workspace/src/github.com/prometheus/procfs/stat_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package procfs - -import "testing" - -func TestStat(t *testing.T) { - fs, err := NewFS("fixtures") - if err != nil { - t.Fatal(err) - } - - s, err := fs.NewStat() - if err != nil { - t.Fatal(err) - } - - if want, got := int64(1418183276), s.BootTime; want != got { - t.Errorf("want boot time %d, got %d", want, got) - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/bash_completions_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/bash_completions_test.go deleted file mode 100644 index 6957f8bd8..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/bash_completions_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package cobra - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "strings" - "testing" -) - -var _ = fmt.Println -var _ = os.Stderr - -func checkOmit(t *testing.T, found, unexpected string) { - if strings.Contains(found, unexpected) { - t.Errorf("Unexpected response.\nGot: %q\nBut should not have!\n", unexpected) - } -} - -func check(t *testing.T, found, expected string) { - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } -} - -func runShellCheck(s string) error { - excluded := []string{ - "SC2034", // PREFIX appears unused. Verify it or export it. - } - cmd := exec.Command("shellcheck", "-s", "bash", "-", "-e", strings.Join(excluded, ",")) - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - - stdin, err := cmd.StdinPipe() - if err != nil { - return err - } - go func() { - defer stdin.Close() - stdin.Write([]byte(s)) - }() - - return cmd.Run() -} - -// World worst custom function, just keep telling you to enter hello! -const ( - bashCompletionFunc = `__custom_func() { -COMPREPLY=( "hello" ) -} -` -) - -func TestBashCompletions(t *testing.T) { - c := initializeWithRootCmd() - cmdEcho.AddCommand(cmdTimes) - c.AddCommand(cmdEcho, cmdPrint, cmdDeprecated, cmdColon) - - // custom completion function - c.BashCompletionFunction = bashCompletionFunc - - // required flag - c.MarkFlagRequired("introot") - - // valid nouns - validArgs := []string{"pod", "node", "service", "replicationcontroller"} - c.ValidArgs = validArgs - - // noun aliases - argAliases := []string{"pods", "nodes", "services", "replicationcontrollers", "po", "no", "svc", "rc"} - c.ArgAliases = argAliases - - // filename - var flagval string - c.Flags().StringVar(&flagval, "filename", "", "Enter a filename") - c.MarkFlagFilename("filename", "json", "yaml", "yml") - - // persistent filename - var flagvalPersistent string - c.PersistentFlags().StringVar(&flagvalPersistent, "persistent-filename", "", "Enter a filename") - c.MarkPersistentFlagFilename("persistent-filename") - c.MarkPersistentFlagRequired("persistent-filename") - - // filename extensions - var flagvalExt string - c.Flags().StringVar(&flagvalExt, "filename-ext", "", "Enter a filename (extension limited)") - c.MarkFlagFilename("filename-ext") - - // filename extensions - var flagvalCustom string - c.Flags().StringVar(&flagvalCustom, "custom", "", "Enter a filename (extension limited)") - c.MarkFlagCustom("custom", "__complete_custom") - - // subdirectories in a given directory - var flagvalTheme string - c.Flags().StringVar(&flagvalTheme, "theme", "", "theme to use (located in /themes/THEMENAME/)") - c.Flags().SetAnnotation("theme", BashCompSubdirsInDir, []string{"themes"}) - - out := new(bytes.Buffer) - c.GenBashCompletion(out) - str := out.String() - - check(t, str, "_cobra-test") - check(t, str, "_cobra-test_echo") - check(t, str, "_cobra-test_echo_times") - check(t, str, "_cobra-test_print") - check(t, str, "_cobra-test_cmd__colon") - - // check for required flags - check(t, str, `must_have_one_flag+=("--introot=")`) - check(t, str, `must_have_one_flag+=("--persistent-filename=")`) - // check for custom completion function - check(t, str, `COMPREPLY=( "hello" )`) - // check for required nouns - check(t, str, `must_have_one_noun+=("pod")`) - // check for noun aliases - check(t, str, `noun_aliases+=("pods")`) - check(t, str, `noun_aliases+=("rc")`) - checkOmit(t, str, `must_have_one_noun+=("pods")`) - // check for filename extension flags - check(t, str, `flags_completion+=("_filedir")`) - // check for filename extension flags - check(t, str, `flags_completion+=("__handle_filename_extension_flag json|yaml|yml")`) - // check for custom flags - check(t, str, `flags_completion+=("__complete_custom")`) - // check for subdirs_in_dir flags - check(t, str, `flags_completion+=("__handle_subdirs_in_dir_flag themes")`) - - checkOmit(t, str, cmdDeprecated.Name()) - - // if available, run shellcheck against the script - if err := exec.Command("which", "shellcheck").Run(); err != nil { - return - } - err := runShellCheck(str) - if err != nil { - t.Fatalf("shellcheck failed: %v", err) - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go deleted file mode 100644 index b89d4c474..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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 cmd - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func init() { - RootCmd.AddCommand(addCmd) -} - -var pName string - -// initialize Command -var addCmd = &cobra.Command{ - Use: "add [command name]", - Aliases: []string{"command"}, - Short: "Add a command to a Cobra Application", - Long: `Add (cobra add) will create a new command, with a license and -the appropriate structure for a Cobra-based CLI application, -and register it to its parent (default RootCmd). - -If you want your command to be public, pass in the command name -with an initial uppercase letter. - -Example: cobra add server -> resulting in a new cmd/server.go - `, - - Run: func(cmd *cobra.Command, args []string) { - if len(args) != 1 { - er("add needs a name for the command") - } - guessProjectPath() - createCmdFile(args[0]) - }, -} - -func init() { - addCmd.Flags().StringVarP(&pName, "parent", "p", "RootCmd", "name of parent command for this command") -} - -func parentName() string { - if !strings.HasSuffix(strings.ToLower(pName), "cmd") { - return pName + "Cmd" - } - - return pName -} - -func createCmdFile(cmdName string) { - lic := getLicense() - - template := `{{ comment .copyright }} -{{ comment .license }} - -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -// {{.cmdName}}Cmd represents the {{.cmdName}} command -var {{ .cmdName }}Cmd = &cobra.Command{ - Use: "{{ .cmdName }}", - Short: "A brief description of your command", - Long: ` + "`" + `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.` + "`" + `, - Run: func(cmd *cobra.Command, args []string) { - // TODO: Work your own magic here - fmt.Println("{{ .cmdName }} called") - }, -} - -func init() { - {{ .parentName }}.AddCommand({{ .cmdName }}Cmd) - - // Here you will define your flags and configuration settings. - - // Cobra supports Persistent Flags which will work for this command - // and all subcommands, e.g.: - // {{.cmdName}}Cmd.PersistentFlags().String("foo", "", "A help for foo") - - // Cobra supports local flags which will only run when this command - // is called directly, e.g.: - // {{.cmdName}}Cmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - -} -` - - var data map[string]interface{} - data = make(map[string]interface{}) - - data["copyright"] = copyrightLine() - data["license"] = lic.Header - data["appName"] = projectName() - data["viper"] = viper.GetBool("useViper") - data["parentName"] = parentName() - data["cmdName"] = cmdName - - err := writeTemplateToFile(filepath.Join(ProjectPath(), guessCmdDir()), cmdName+".go", template, data) - if err != nil { - er(err) - } - fmt.Println(cmdName, "created at", filepath.Join(ProjectPath(), guessCmdDir(), cmdName+".go")) -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go deleted file mode 100644 index f8b79b1fc..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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 cmd - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "text/template" - "time" - - "github.com/spf13/viper" -) - -// var BaseDir = "" -// var AppName = "" -// var CommandDir = "" - -var funcMap template.FuncMap -var projectPath = "" -var inputPath = "" -var projectBase = "" - -// for testing only -var testWd = "" - -var cmdDirs = []string{"cmd", "cmds", "command", "commands"} - -func init() { - funcMap = template.FuncMap{ - "comment": commentifyString, - } -} - -func er(msg interface{}) { - fmt.Println("Error:", msg) - os.Exit(-1) -} - -// Check if a file or directory exists. -func exists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -func ProjectPath() string { - if projectPath == "" { - guessProjectPath() - } - - return projectPath -} - -// wrapper of the os package so we can test better -func getWd() (string, error) { - if testWd == "" { - return os.Getwd() - } - return testWd, nil -} - -func guessCmdDir() string { - guessProjectPath() - if b, _ := isEmpty(projectPath); b { - return "cmd" - } - - files, _ := filepath.Glob(projectPath + string(os.PathSeparator) + "c*") - for _, f := range files { - for _, c := range cmdDirs { - if f == c { - return c - } - } - } - - return "cmd" -} - -func guessImportPath() string { - guessProjectPath() - - if !strings.HasPrefix(projectPath, getSrcPath()) { - er("Cobra only supports project within $GOPATH") - } - - return filepath.ToSlash(filepath.Clean(strings.TrimPrefix(projectPath, getSrcPath()))) -} - -func getSrcPath() string { - return filepath.Join(os.Getenv("GOPATH"), "src") + string(os.PathSeparator) -} - -func projectName() string { - return filepath.Base(ProjectPath()) -} - -func guessProjectPath() { - // if no path is provided... assume CWD. - if inputPath == "" { - x, err := getWd() - if err != nil { - er(err) - } - - // inspect CWD - base := filepath.Base(x) - - // if we are in the cmd directory.. back up - for _, c := range cmdDirs { - if base == c { - projectPath = filepath.Dir(x) - return - } - } - - if projectPath == "" { - projectPath = filepath.Clean(x) - return - } - } - - srcPath := getSrcPath() - // if provided, inspect for logical locations - if strings.ContainsRune(inputPath, os.PathSeparator) { - if filepath.IsAbs(inputPath) || filepath.HasPrefix(inputPath, string(os.PathSeparator)) { - // if Absolute, use it - projectPath = filepath.Clean(inputPath) - return - } - // If not absolute but contains slashes, - // assuming it means create it from $GOPATH - count := strings.Count(inputPath, string(os.PathSeparator)) - - switch count { - // If only one directory deep, assume "github.com" - case 1: - projectPath = filepath.Join(srcPath, "github.com", inputPath) - return - case 2: - projectPath = filepath.Join(srcPath, inputPath) - return - default: - er("Unknown directory") - } - } else { - // hardest case.. just a word. - if projectBase == "" { - x, err := getWd() - if err == nil { - projectPath = filepath.Join(x, inputPath) - return - } - er(err) - } else { - projectPath = filepath.Join(srcPath, projectBase, inputPath) - return - } - } -} - -// isEmpty checks if a given path is empty. -func isEmpty(path string) (bool, error) { - if b, _ := exists(path); !b { - return false, fmt.Errorf("%q path does not exist", path) - } - fi, err := os.Stat(path) - if err != nil { - return false, err - } - if fi.IsDir() { - f, err := os.Open(path) - // FIX: Resource leak - f.close() should be called here by defer or is missed - // if the err != nil branch is taken. - defer f.Close() - if err != nil { - return false, err - } - list, _ := f.Readdir(-1) - // f.Close() - see bug fix above - return len(list) == 0, nil - } - return fi.Size() == 0, nil -} - -// isDir checks if a given path is a directory. -func isDir(path string) (bool, error) { - fi, err := os.Stat(path) - if err != nil { - return false, err - } - return fi.IsDir(), nil -} - -// dirExists checks if a path exists and is a directory. -func dirExists(path string) (bool, error) { - fi, err := os.Stat(path) - if err == nil && fi.IsDir() { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} - -func writeTemplateToFile(path string, file string, template string, data interface{}) error { - filename := filepath.Join(path, file) - - r, err := templateToReader(template, data) - - if err != nil { - return err - } - - err = safeWriteToDisk(filename, r) - - if err != nil { - return err - } - return nil -} - -func writeStringToFile(path, file, text string) error { - filename := filepath.Join(path, file) - - r := strings.NewReader(text) - err := safeWriteToDisk(filename, r) - - if err != nil { - return err - } - return nil -} - -func templateToReader(tpl string, data interface{}) (io.Reader, error) { - tmpl := template.New("") - tmpl.Funcs(funcMap) - tmpl, err := tmpl.Parse(tpl) - - if err != nil { - return nil, err - } - buf := new(bytes.Buffer) - err = tmpl.Execute(buf, data) - - return buf, err -} - -// Same as WriteToDisk but checks to see if file/directory already exists. -func safeWriteToDisk(inpath string, r io.Reader) (err error) { - dir, _ := filepath.Split(inpath) - ospath := filepath.FromSlash(dir) - - if ospath != "" { - err = os.MkdirAll(ospath, 0777) // rwx, rw, r - if err != nil { - return - } - } - - ex, err := exists(inpath) - if err != nil { - return - } - if ex { - return fmt.Errorf("%v already exists", inpath) - } - - file, err := os.Create(inpath) - if err != nil { - return - } - defer file.Close() - - _, err = io.Copy(file, r) - return -} - -func getLicense() License { - l := whichLicense() - if l != "" { - if x, ok := Licenses[l]; ok { - return x - } - } - - return Licenses["apache"] -} - -func whichLicense() string { - // if explicitly flagged, use that - if userLicense != "" { - return matchLicense(userLicense) - } - - // if already present in the project, use that - // TODO: Inspect project for existing license - - // default to viper's setting - - return matchLicense(viper.GetString("license")) -} - -func copyrightLine() string { - author := viper.GetString("author") - year := time.Now().Format("2006") - - return "Copyright © " + year + " " + author -} - -func commentifyString(in string) string { - var newlines []string - lines := strings.Split(in, "\n") - for _, x := range lines { - if !strings.HasPrefix(x, "//") { - if x != "" { - newlines = append(newlines, "// "+x) - } else { - newlines = append(newlines, "//") - } - } else { - newlines = append(newlines, x) - } - } - return strings.Join(newlines, "\n") -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers_test.go deleted file mode 100644 index bd0f75951..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package cmd - -import ( - "fmt" - "os" - "path/filepath" - "testing" -) - -var _ = fmt.Println -var _ = os.Stderr - -func checkGuess(t *testing.T, wd, input, expected string) { - testWd = wd - inputPath = input - guessProjectPath() - - if projectPath != expected { - t.Errorf("Unexpected Project Path. \n Got: %q\nExpected: %q\n", projectPath, expected) - } - - reset() -} - -func reset() { - testWd = "" - inputPath = "" - projectPath = "" -} - -func TestProjectPath(t *testing.T) { - checkGuess(t, "", filepath.Join("github.com", "spf13", "hugo"), filepath.Join(getSrcPath(), "github.com", "spf13", "hugo")) - checkGuess(t, "", filepath.Join("spf13", "hugo"), filepath.Join(getSrcPath(), "github.com", "spf13", "hugo")) - checkGuess(t, "", filepath.Join("/", "bar", "foo"), filepath.Join("/", "bar", "foo")) - checkGuess(t, "/bar/foo", "baz", filepath.Join("/", "bar", "foo", "baz")) - checkGuess(t, "/bar/foo/cmd", "", filepath.Join("/", "bar", "foo")) - checkGuess(t, "/bar/foo/command", "", filepath.Join("/", "bar", "foo")) - checkGuess(t, "/bar/foo/commands", "", filepath.Join("/", "bar", "foo")) - checkGuess(t, "github.com/spf13/hugo/../hugo", "", filepath.Join("github.com", "spf13", "hugo")) -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go deleted file mode 100644 index 342fb9ccd..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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 cmd - -import ( - "fmt" - "os" - "strings" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func init() { - RootCmd.AddCommand(initCmd) -} - -// initialize Command -var initCmd = &cobra.Command{ - Use: "init [name]", - Aliases: []string{"initialize", "initialise", "create"}, - Short: "Initialize a Cobra Application", - Long: `Initialize (cobra init) will create a new application, with a license -and the appropriate structure for a Cobra-based CLI application. - - * If a name is provided, it will be created in the current directory; - * If no name is provided, the current directory will be assumed; - * If a relative path is provided, it will be created inside $GOPATH - (e.g. github.com/spf13/hugo); - * If an absolute path is provided, it will be created; - * If the directory already exists but is empty, it will be used. - -Init will not use an existing directory with contents.`, - - Run: func(cmd *cobra.Command, args []string) { - switch len(args) { - case 0: - inputPath = "" - - case 1: - inputPath = args[0] - - default: - er("init doesn't support more than 1 parameter") - } - guessProjectPath() - initializePath(projectPath) - }, -} - -func initializePath(path string) { - b, err := exists(path) - if err != nil { - er(err) - } - - if !b { // If path doesn't yet exist, create it - err := os.MkdirAll(path, os.ModePerm) - if err != nil { - er(err) - } - } else { // If path exists and is not empty don't use it - empty, err := exists(path) - if err != nil { - er(err) - } - if !empty { - er("Cobra will not create a new project in a non empty directory") - } - } - // We have a directory and it's empty.. Time to initialize it. - - createLicenseFile() - createMainFile() - createRootCmdFile() -} - -func createLicenseFile() { - lic := getLicense() - - template := lic.Text - - var data map[string]interface{} - data = make(map[string]interface{}) - - // Try to remove the email address, if any - data["copyright"] = strings.Split(copyrightLine(), " <")[0] - - err := writeTemplateToFile(ProjectPath(), "LICENSE", template, data) - _ = err - // if err != nil { - // er(err) - // } -} - -func createMainFile() { - lic := getLicense() - - template := `{{ comment .copyright }} -{{ comment .license }} - -package main - -import "{{ .importpath }}" - -func main() { - cmd.Execute() -} -` - var data map[string]interface{} - data = make(map[string]interface{}) - - data["copyright"] = copyrightLine() - data["license"] = lic.Header - data["importpath"] = guessImportPath() + "/" + guessCmdDir() - - err := writeTemplateToFile(ProjectPath(), "main.go", template, data) - _ = err - // if err != nil { - // er(err) - // } -} - -func createRootCmdFile() { - lic := getLicense() - - template := `{{ comment .copyright }} -{{ comment .license }} - -package cmd - -import ( - "fmt" - "os" - - "github.com/spf13/cobra" -{{ if .viper }} "github.com/spf13/viper" -{{ end }}) -{{if .viper}} -var cfgFile string -{{ end }} -// RootCmd represents the base command when called without any subcommands -var RootCmd = &cobra.Command{ - Use: "{{ .appName }}", - Short: "A brief description of your application", - Long: ` + "`" + `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.` + "`" + `, -// Uncomment the following line if your bare application -// has an action associated with it: -// Run: func(cmd *cobra.Command, args []string) { }, -} - -// Execute adds all child commands to the root command sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := RootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(-1) - } -} - -func init() { -{{ if .viper }} cobra.OnInitialize(initConfig) - -{{ end }} // Here you will define your flags and configuration settings. - // Cobra supports Persistent Flags, which, if defined here, - // will be global for your application. -{{ if .viper }} - RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)") -{{ else }} - // RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)") -{{ end }} // Cobra also supports local flags, which will only run - // when this action is called directly. - RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} -{{ if .viper }} -// initConfig reads in config file and ENV variables if set. -func initConfig() { - if cfgFile != "" { // enable ability to specify config file via flag - viper.SetConfigFile(cfgFile) - } - - viper.SetConfigName(".{{ .appName }}") // name of config file (without extension) - viper.AddConfigPath("$HOME") // adding home directory as first search path - viper.AutomaticEnv() // read in environment variables that match - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} -{{ end }}` - - var data map[string]interface{} - data = make(map[string]interface{}) - - data["copyright"] = copyrightLine() - data["license"] = lic.Header - data["appName"] = projectName() - data["viper"] = viper.GetBool("useViper") - - err := writeTemplateToFile(ProjectPath()+string(os.PathSeparator)+guessCmdDir(), "root.go", template, data) - if err != nil { - er(err) - } - - fmt.Println("Your Cobra application is ready at") - fmt.Println(ProjectPath()) - fmt.Println("Give it a try by going there and running `go run main.go`") - fmt.Println("Add commands to it by running `cobra add [cmdname]`") -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go deleted file mode 100644 index 5ad9c96ef..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go +++ /dev/null @@ -1,1133 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -import "strings" - -//Licenses contains all possible licenses a user can chose from -var Licenses map[string]License - -//License represents a software license agreement, containing the Name of -// the license, its possible matches (on the command line as given to cobra) -// the header to be used with each file on the file's creating, and the text -// of the license -type License struct { - Name string // The type of license in use - PossibleMatches []string // Similar names to guess - Text string // License text data - Header string // License header for source files -} - -// given a license name (in), try to match the license indicated -func matchLicense(in string) string { - for key, lic := range Licenses { - for _, match := range lic.PossibleMatches { - if strings.EqualFold(in, match) { - return key - } - } - } - return "" -} - -func init() { - Licenses = make(map[string]License) - - Licenses["apache"] = License{ - Name: "Apache 2.0", - PossibleMatches: []string{"apache", "apache20", "apache 2.0", "apache2.0", "apache-2.0"}, - Header: ` -// 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.`, - Text: ` - 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. -`, - } - - Licenses["mit"] = License{ - Name: "Mit", - PossibleMatches: []string{"mit"}, - Header: ` -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.`, - Text: `The MIT License (MIT) - -{{ .copyright }} - -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. -`, - } - - Licenses["bsd"] = License{ - Name: "NewBSD", - PossibleMatches: []string{"bsd", "newbsd", "3 clause bsd"}, - Header: ` -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder 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 HOLDER 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.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder 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 HOLDER 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. -`, - } - - Licenses["freebsd"] = License{ - Name: "Simplified BSD License", - PossibleMatches: []string{"freebsd", "simpbsd", "simple bsd", "2 clause bsd"}, - Header: ` -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -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 HOLDER 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.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -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 HOLDER 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. -`, - } - - Licenses["gpl3"] = License{ - Name: "GNU General Public License 3.0", - PossibleMatches: []string{"gpl3", "gpl", "gnu gpl3", "gnu gpl"}, - Header: `{{ .copyright }} - - This file is part of {{ .appName }}. - - {{ .appName }} is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - {{ .appName }} is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with {{ .appName }}. If not, see . - `, - Text: ` GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. -`, - } - - // Licenses["apache20"] = License{ - // Name: "Apache 2.0", - // PossibleMatches: []string{"apache", "apache20", ""}, - // Header: ` - // `, - // Text: ` - // `, - // } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go deleted file mode 100644 index dbe607beb..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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 cmd - -import ( - "fmt" - "os" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var cfgFile string -var userLicense string - -// RootCmd represents the base command when called without any subcommands -var RootCmd = &cobra.Command{ - Use: "cobra", - Short: "A generator for Cobra based Applications", - Long: `Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, -} - -//Execute adds all child commands to the root command sets flags appropriately. -func Execute() { - if err := RootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(-1) - } -} - -func init() { - cobra.OnInitialize(initConfig) - RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") - RootCmd.PersistentFlags().StringVarP(&projectBase, "projectbase", "b", "", "base project directory, e.g. github.com/spf13/") - RootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "Author name for copyright attribution") - RootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "Name of license for the project (can provide `licensetext` in config)") - RootCmd.PersistentFlags().Bool("viper", true, "Use Viper for configuration") - viper.BindPFlag("author", RootCmd.PersistentFlags().Lookup("author")) - viper.BindPFlag("projectbase", RootCmd.PersistentFlags().Lookup("projectbase")) - viper.BindPFlag("useViper", RootCmd.PersistentFlags().Lookup("viper")) - viper.SetDefault("author", "NAME HERE ") - viper.SetDefault("license", "apache") - viper.SetDefault("licenseText", ` -// 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. -`) -} - -// Read in config file and ENV variables if set. -func initConfig() { - if cfgFile != "" { // enable ability to specify config file via flag - viper.SetConfigFile(cfgFile) - } - - viper.SetConfigName(".cobra") // name of config file (without extension) - viper.AddConfigPath("$HOME") // adding home directory as first search path - viper.AutomaticEnv() // read in environment variables that match - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go deleted file mode 100644 index c3a9d9cb0..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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 main - -import "github.com/spf13/cobra/cobra/cmd" - -func main() { - cmd.Execute() -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/cobra_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/cobra_test.go deleted file mode 100644 index 97090b107..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/cobra_test.go +++ /dev/null @@ -1,1188 +0,0 @@ -package cobra - -import ( - "bytes" - "fmt" - "os" - "reflect" - "runtime" - "strings" - "testing" - "text/template" - - "github.com/spf13/pflag" -) - -var _ = fmt.Println -var _ = os.Stderr - -var tp, te, tt, t1, tr []string -var rootPersPre, echoPre, echoPersPre, timesPersPre []string -var flagb1, flagb2, flagb3, flagbr, flagbp bool -var flags1, flags2a, flags2b, flags3, outs string -var flagi1, flagi2, flagi3, flagi4, flagir int -var globalFlag1 bool -var flagEcho, rootcalled bool -var versionUsed int - -const strtwoParentHelp = "help message for parent flag strtwo" -const strtwoChildHelp = "help message for child flag strtwo" - -var cmdHidden = &Command{ - Use: "hide [secret string to print]", - Short: "Print anything to screen (if command is known)", - Long: `an absolutely utterly useless command for testing.`, - Run: func(cmd *Command, args []string) { - outs = "hidden" - }, - Hidden: true, -} - -var cmdPrint = &Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `an absolutely utterly useless command for testing.`, - Run: func(cmd *Command, args []string) { - tp = args - }, -} - -var cmdEcho = &Command{ - Use: "echo [string to echo]", - Aliases: []string{"say"}, - Short: "Echo anything to the screen", - Long: `an utterly useless command for testing.`, - Example: "Just run cobra-test echo", - PersistentPreRun: func(cmd *Command, args []string) { - echoPersPre = args - }, - PreRun: func(cmd *Command, args []string) { - echoPre = args - }, - Run: func(cmd *Command, args []string) { - te = args - }, -} - -var cmdEchoSub = &Command{ - Use: "echosub [string to print]", - Short: "second sub command for echo", - Long: `an absolutely utterly useless command for testing gendocs!.`, - Run: func(cmd *Command, args []string) { - }, -} - -var cmdDeprecated = &Command{ - Use: "deprecated [can't do anything here]", - Short: "A command which is deprecated", - Long: `an absolutely utterly useless command for testing deprecation!.`, - Deprecated: "Please use echo instead", - Run: func(cmd *Command, args []string) { - }, -} - -var cmdTimes = &Command{ - Use: "times [# times] [string to echo]", - SuggestFor: []string{"counts"}, - Short: "Echo anything to the screen more times", - Long: `a slightly useless command for testing.`, - PersistentPreRun: func(cmd *Command, args []string) { - timesPersPre = args - }, - Run: func(cmd *Command, args []string) { - tt = args - }, -} - -var cmdRootNoRun = &Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", - PersistentPreRun: func(cmd *Command, args []string) { - rootPersPre = args - }, -} - -var cmdRootSameName = &Command{ - Use: "print", - Short: "Root with the same name as a subcommand", - Long: "The root description for help", -} - -var cmdRootWithRun = &Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", - Run: func(cmd *Command, args []string) { - tr = args - rootcalled = true - }, -} - -var cmdSubNoRun = &Command{ - Use: "subnorun", - Short: "A subcommand without a Run function", - Long: "A long output about a subcommand without a Run function", -} - -var cmdCustomFlags = &Command{ - Use: "customflags [flags] -- REMOTE_COMMAND", - Short: "A command that expects flags in a custom location", - Long: "A long output about a command that expects flags in a custom location", - Run: func(cmd *Command, args []string) { - }, -} - -var cmdVersion1 = &Command{ - Use: "version", - Short: "Print the version number", - Long: `First version of the version command`, - Run: func(cmd *Command, args []string) { - versionUsed = 1 - }, -} - -var cmdVersion2 = &Command{ - Use: "version", - Short: "Print the version number", - Long: `Second version of the version command`, - Run: func(cmd *Command, args []string) { - versionUsed = 2 - }, -} - -var cmdColon = &Command{ - Use: "cmd:colon", - Run: func(cmd *Command, args []string) { - }, -} - -func flagInit() { - cmdEcho.ResetFlags() - cmdPrint.ResetFlags() - cmdTimes.ResetFlags() - cmdRootNoRun.ResetFlags() - cmdRootSameName.ResetFlags() - cmdRootWithRun.ResetFlags() - cmdSubNoRun.ResetFlags() - cmdCustomFlags.ResetFlags() - cmdRootNoRun.PersistentFlags().StringVarP(&flags2a, "strtwo", "t", "two", strtwoParentHelp) - cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone") - cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo") - cmdPrint.Flags().IntVarP(&flagi3, "intthree", "i", 345, "help message for flag intthree") - cmdCustomFlags.Flags().IntVar(&flagi4, "intfour", 456, "help message for flag intfour") - cmdEcho.PersistentFlags().StringVarP(&flags1, "strone", "s", "one", "help message for flag strone") - cmdEcho.PersistentFlags().BoolVarP(&flagbp, "persistentbool", "p", false, "help message for flag persistentbool") - cmdTimes.PersistentFlags().StringVarP(&flags2b, "strtwo", "t", "2", strtwoChildHelp) - cmdPrint.PersistentFlags().StringVarP(&flags3, "strthree", "s", "three", "help message for flag strthree") - cmdEcho.Flags().BoolVarP(&flagb1, "boolone", "b", true, "help message for flag boolone") - cmdTimes.Flags().BoolVarP(&flagb2, "booltwo", "c", false, "help message for flag booltwo") - cmdPrint.Flags().BoolVarP(&flagb3, "boolthree", "b", true, "help message for flag boolthree") - cmdVersion1.ResetFlags() - cmdVersion2.ResetFlags() -} - -func commandInit() { - cmdEcho.ResetCommands() - cmdPrint.ResetCommands() - cmdTimes.ResetCommands() - cmdRootNoRun.ResetCommands() - cmdRootSameName.ResetCommands() - cmdRootWithRun.ResetCommands() - cmdSubNoRun.ResetCommands() - cmdCustomFlags.ResetCommands() -} - -func initialize() *Command { - tt, tp, te = nil, nil, nil - rootPersPre, echoPre, echoPersPre, timesPersPre = nil, nil, nil, nil - - var c = cmdRootNoRun - flagInit() - commandInit() - return c -} - -func initializeWithSameName() *Command { - tt, tp, te = nil, nil, nil - rootPersPre, echoPre, echoPersPre, timesPersPre = nil, nil, nil, nil - var c = cmdRootSameName - flagInit() - commandInit() - return c -} - -func initializeWithRootCmd() *Command { - cmdRootWithRun.ResetCommands() - tt, tp, te, tr, rootcalled = nil, nil, nil, nil, false - flagInit() - cmdRootWithRun.Flags().BoolVarP(&flagbr, "boolroot", "b", false, "help message for flag boolroot") - cmdRootWithRun.Flags().IntVarP(&flagir, "introot", "i", 321, "help message for flag introot") - commandInit() - return cmdRootWithRun -} - -type resulter struct { - Error error - Output string - Command *Command -} - -func fullSetupTest(input string) resulter { - c := initializeWithRootCmd() - - return fullTester(c, input) -} - -func noRRSetupTestSilenced(input string) resulter { - c := initialize() - c.SilenceErrors = true - c.SilenceUsage = true - return fullTester(c, input) -} - -func noRRSetupTest(input string) resulter { - c := initialize() - - return fullTester(c, input) -} - -func rootOnlySetupTest(input string) resulter { - c := initializeWithRootCmd() - - return simpleTester(c, input) -} - -func simpleTester(c *Command, input string) resulter { - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - c.SetArgs(strings.Split(input, " ")) - - err := c.Execute() - output := buf.String() - - return resulter{err, output, c} -} - -func simpleTesterC(c *Command, input string) resulter { - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - c.SetArgs(strings.Split(input, " ")) - - cmd, err := c.ExecuteC() - output := buf.String() - - return resulter{err, output, cmd} -} - -func fullTester(c *Command, input string) resulter { - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - cmdEcho.AddCommand(cmdTimes) - c.AddCommand(cmdPrint, cmdEcho, cmdSubNoRun, cmdCustomFlags, cmdDeprecated) - c.SetArgs(strings.Split(input, " ")) - - err := c.Execute() - output := buf.String() - - return resulter{err, output, c} -} - -func logErr(t *testing.T, found, expected string) { - out := new(bytes.Buffer) - - _, _, line, ok := runtime.Caller(2) - if ok { - fmt.Fprintf(out, "Line: %d ", line) - } - fmt.Fprintf(out, "Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - t.Errorf(out.String()) -} - -func checkStringContains(t *testing.T, found, expected string) { - if !strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func checkResultContains(t *testing.T, x resulter, check string) { - checkStringContains(t, x.Output, check) -} - -func checkStringOmits(t *testing.T, found, expected string) { - if strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func checkResultOmits(t *testing.T, x resulter, check string) { - checkStringOmits(t, x.Output, check) -} - -func checkOutputContains(t *testing.T, c *Command, check string) { - buf := new(bytes.Buffer) - c.SetOutput(buf) - c.Execute() - - if !strings.Contains(buf.String(), check) { - logErr(t, buf.String(), check) - } -} - -func TestSingleCommand(t *testing.T) { - noRRSetupTest("print one two") - - if te != nil || tt != nil { - t.Error("Wrong command called") - } - if tp == nil { - t.Error("Wrong command called") - } - if strings.Join(tp, " ") != "one two" { - t.Error("Command didn't parse correctly") - } -} - -func TestChildCommand(t *testing.T) { - noRRSetupTest("echo times one two") - - if te != nil || tp != nil { - t.Error("Wrong command called") - } - if tt == nil { - t.Error("Wrong command called") - } - if strings.Join(tt, " ") != "one two" { - t.Error("Command didn't parse correctly") - } -} - -func TestCommandAlias(t *testing.T) { - noRRSetupTest("say times one two") - - if te != nil || tp != nil { - t.Error("Wrong command called") - } - if tt == nil { - t.Error("Wrong command called") - } - if strings.Join(tt, " ") != "one two" { - t.Error("Command didn't parse correctly") - } -} - -func TestPrefixMatching(t *testing.T) { - EnablePrefixMatching = true - noRRSetupTest("ech times one two") - - if te != nil || tp != nil { - t.Error("Wrong command called") - } - if tt == nil { - t.Error("Wrong command called") - } - if strings.Join(tt, " ") != "one two" { - t.Error("Command didn't parse correctly") - } - - EnablePrefixMatching = false -} - -func TestNoPrefixMatching(t *testing.T) { - EnablePrefixMatching = false - - noRRSetupTest("ech times one two") - - if !(tt == nil && te == nil && tp == nil) { - t.Error("Wrong command called") - } -} - -func TestAliasPrefixMatching(t *testing.T) { - EnablePrefixMatching = true - noRRSetupTest("sa times one two") - - if te != nil || tp != nil { - t.Error("Wrong command called") - } - if tt == nil { - t.Error("Wrong command called") - } - if strings.Join(tt, " ") != "one two" { - t.Error("Command didn't parse correctly") - } - EnablePrefixMatching = false -} - -func TestChildSameName(t *testing.T) { - c := initializeWithSameName() - c.AddCommand(cmdPrint, cmdEcho) - c.SetArgs(strings.Split("print one two", " ")) - c.Execute() - - if te != nil || tt != nil { - t.Error("Wrong command called") - } - if tp == nil { - t.Error("Wrong command called") - } - if strings.Join(tp, " ") != "one two" { - t.Error("Command didn't parse correctly") - } -} - -func TestGrandChildSameName(t *testing.T) { - c := initializeWithSameName() - cmdTimes.AddCommand(cmdPrint) - c.AddCommand(cmdTimes) - c.SetArgs(strings.Split("times print one two", " ")) - c.Execute() - - if te != nil || tt != nil { - t.Error("Wrong command called") - } - if tp == nil { - t.Error("Wrong command called") - } - if strings.Join(tp, " ") != "one two" { - t.Error("Command didn't parse correctly") - } -} - -func TestUsage(t *testing.T) { - x := fullSetupTest("help") - checkResultContains(t, x, cmdRootWithRun.Use+" [flags]") - x = fullSetupTest("help customflags") - checkResultContains(t, x, cmdCustomFlags.Use) - checkResultOmits(t, x, cmdCustomFlags.Use+" [flags]") -} - -func TestFlagLong(t *testing.T) { - noRRSetupTest("echo --intone=13 something -- here") - - if cmdEcho.ArgsLenAtDash() != 1 { - t.Errorf("expected argsLenAtDash: %d but got %d", 1, cmdRootNoRun.ArgsLenAtDash()) - } - if strings.Join(te, " ") != "something here" { - t.Errorf("flags didn't leave proper args remaining..%s given", te) - } - if flagi1 != 13 { - t.Errorf("int flag didn't get correct value, had %d", flagi1) - } - if flagi2 != 234 { - t.Errorf("default flag value changed, 234 expected, %d given", flagi2) - } -} - -func TestFlagShort(t *testing.T) { - noRRSetupTest("echo -i13 -- something here") - - if cmdEcho.ArgsLenAtDash() != 0 { - t.Errorf("expected argsLenAtDash: %d but got %d", 0, cmdRootNoRun.ArgsLenAtDash()) - } - if strings.Join(te, " ") != "something here" { - t.Errorf("flags didn't leave proper args remaining..%s given", te) - } - if flagi1 != 13 { - t.Errorf("int flag didn't get correct value, had %d", flagi1) - } - if flagi2 != 234 { - t.Errorf("default flag value changed, 234 expected, %d given", flagi2) - } - - noRRSetupTest("echo -i 13 something here") - - if strings.Join(te, " ") != "something here" { - t.Errorf("flags didn't leave proper args remaining..%s given", te) - } - if flagi1 != 13 { - t.Errorf("int flag didn't get correct value, had %d", flagi1) - } - if flagi2 != 234 { - t.Errorf("default flag value changed, 234 expected, %d given", flagi2) - } - - noRRSetupTest("print -i99 one two") - - if strings.Join(tp, " ") != "one two" { - t.Errorf("flags didn't leave proper args remaining..%s given", tp) - } - if flagi3 != 99 { - t.Errorf("int flag didn't get correct value, had %d", flagi3) - } - if flagi1 != 123 { - t.Errorf("default flag value changed on different command with same shortname, 234 expected, %d given", flagi2) - } -} - -func TestChildCommandFlags(t *testing.T) { - noRRSetupTest("echo times -j 99 one two") - - if strings.Join(tt, " ") != "one two" { - t.Errorf("flags didn't leave proper args remaining..%s given", tt) - } - - // Testing with flag that shouldn't be persistent - r := noRRSetupTest("echo times -j 99 -i77 one two") - - if r.Error == nil { - t.Errorf("invalid flag should generate error") - } - - if !strings.Contains(r.Error.Error(), "unknown shorthand") { - t.Errorf("Wrong error message displayed, \n %s", r.Error) - } - - if flagi2 != 99 { - t.Errorf("flag value should be 99, %d given", flagi2) - } - - if flagi1 != 123 { - t.Errorf("unset flag should have default value, expecting 123, given %d", flagi1) - } - - // Testing with flag only existing on child - r = noRRSetupTest("echo -j 99 -i77 one two") - - if r.Error == nil { - t.Errorf("invalid flag should generate error") - } - if !strings.Contains(r.Error.Error(), "unknown shorthand flag") { - t.Errorf("Wrong error message displayed, \n %s", r.Error) - } - - // Testing with persistent flag overwritten by child - noRRSetupTest("echo times --strtwo=child one two") - - if flags2b != "child" { - t.Errorf("flag value should be child, %s given", flags2b) - } - - if flags2a != "two" { - t.Errorf("unset flag should have default value, expecting two, given %s", flags2a) - } - - // Testing flag with invalid input - r = noRRSetupTest("echo -i10E") - - if r.Error == nil { - t.Errorf("invalid input should generate error") - } - if !strings.Contains(r.Error.Error(), "invalid argument \"10E\" for i10E") { - t.Errorf("Wrong error message displayed, \n %s", r.Error) - } -} - -func TestTrailingCommandFlags(t *testing.T) { - x := fullSetupTest("echo two -x") - - if x.Error == nil { - t.Errorf("invalid flag should generate error") - } -} - -func TestInvalidSubcommandFlags(t *testing.T) { - cmd := initializeWithRootCmd() - cmd.AddCommand(cmdTimes) - - result := simpleTester(cmd, "times --inttwo=2 --badflag=bar") - // given that we are not checking here result.Error we check for - // stock usage message - checkResultContains(t, result, "cobra-test times [# times]") - if strings.Contains(result.Error.Error(), "unknown flag: --inttwo") { - t.Errorf("invalid --badflag flag shouldn't fail on 'unknown' --inttwo flag") - } - -} - -func TestSubcommandExecuteC(t *testing.T) { - cmd := initializeWithRootCmd() - double := &Command{ - Use: "double message", - Run: func(c *Command, args []string) { - msg := strings.Join(args, " ") - c.Println(msg, msg) - }, - } - - echo := &Command{ - Use: "echo message", - Run: func(c *Command, args []string) { - msg := strings.Join(args, " ") - c.Println(msg, msg) - }, - } - - cmd.AddCommand(double, echo) - - result := simpleTesterC(cmd, "double hello world") - checkResultContains(t, result, "hello world hello world") - - if result.Command.Name() != "double" { - t.Errorf("invalid cmd returned from ExecuteC: should be 'double' but got %s", result.Command.Name()) - } - - result = simpleTesterC(cmd, "echo msg to be echoed") - checkResultContains(t, result, "msg to be echoed") - - if result.Command.Name() != "echo" { - t.Errorf("invalid cmd returned from ExecuteC: should be 'echo' but got %s", result.Command.Name()) - } -} - -func TestSubcommandArgEvaluation(t *testing.T) { - cmd := initializeWithRootCmd() - - first := &Command{ - Use: "first", - Run: func(cmd *Command, args []string) { - }, - } - cmd.AddCommand(first) - - second := &Command{ - Use: "second", - Run: func(cmd *Command, args []string) { - fmt.Fprintf(cmd.Out(), "%v", args) - }, - } - first.AddCommand(second) - - result := simpleTester(cmd, "first second first third") - - expectedOutput := fmt.Sprintf("%v", []string{"first third"}) - if result.Output != expectedOutput { - t.Errorf("exptected %v, got %v", expectedOutput, result.Output) - } -} - -func TestPersistentFlags(t *testing.T) { - fullSetupTest("echo -s something -p more here") - - // persistentFlag should act like normal flag on its own command - if strings.Join(te, " ") != "more here" { - t.Errorf("flags didn't leave proper args remaining..%s given", te) - } - if flags1 != "something" { - t.Errorf("string flag didn't get correct value, had %v", flags1) - } - if !flagbp { - t.Errorf("persistent bool flag not parsed correctly. Expected true, had %v", flagbp) - } - - // persistentFlag should act like normal flag on its own command - fullSetupTest("echo times -s again -c -p test here") - - if strings.Join(tt, " ") != "test here" { - t.Errorf("flags didn't leave proper args remaining..%s given", tt) - } - - if flags1 != "again" { - t.Errorf("string flag didn't get correct value, had %v", flags1) - } - - if !flagb2 { - t.Errorf("local flag not parsed correctly. Expected true, had %v", flagb2) - } - if !flagbp { - t.Errorf("persistent bool flag not parsed correctly. Expected true, had %v", flagbp) - } -} - -func TestHelpCommand(t *testing.T) { - x := fullSetupTest("help") - checkResultContains(t, x, cmdRootWithRun.Long) - - x = fullSetupTest("help echo") - checkResultContains(t, x, cmdEcho.Long) - - x = fullSetupTest("help echo times") - checkResultContains(t, x, cmdTimes.Long) -} - -func TestChildCommandHelp(t *testing.T) { - c := noRRSetupTest("print --help") - checkResultContains(t, c, strtwoParentHelp) - r := noRRSetupTest("echo times --help") - checkResultContains(t, r, strtwoChildHelp) -} - -func TestNonRunChildHelp(t *testing.T) { - x := noRRSetupTest("subnorun") - checkResultContains(t, x, cmdSubNoRun.Long) -} - -func TestRunnableRootCommand(t *testing.T) { - x := fullSetupTest("") - - if rootcalled != true { - t.Errorf("Root Function was not called\n out:%v", x.Error) - } -} - -func TestVisitParents(t *testing.T) { - c := &Command{Use: "app"} - sub := &Command{Use: "sub"} - dsub := &Command{Use: "dsub"} - sub.AddCommand(dsub) - c.AddCommand(sub) - total := 0 - add := func(x *Command) { - total++ - } - sub.VisitParents(add) - if total != 1 { - t.Errorf("Should have visited 1 parent but visited %d", total) - } - - total = 0 - dsub.VisitParents(add) - if total != 2 { - t.Errorf("Should have visited 2 parent but visited %d", total) - } - - total = 0 - c.VisitParents(add) - if total != 0 { - t.Errorf("Should have not visited any parent but visited %d", total) - } -} - -func TestRunnableRootCommandNilInput(t *testing.T) { - var emptyArg []string - c := initializeWithRootCmd() - - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - cmdEcho.AddCommand(cmdTimes) - c.AddCommand(cmdPrint, cmdEcho) - c.SetArgs(emptyArg) - - err := c.Execute() - if err != nil { - t.Errorf("Execute() failed with %v", err) - } - - if rootcalled != true { - t.Errorf("Root Function was not called") - } -} - -func TestRunnableRootCommandEmptyInput(t *testing.T) { - args := make([]string, 3) - args[0] = "" - args[1] = "--introot=12" - args[2] = "" - c := initializeWithRootCmd() - - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - cmdEcho.AddCommand(cmdTimes) - c.AddCommand(cmdPrint, cmdEcho) - c.SetArgs(args) - - c.Execute() - - if rootcalled != true { - t.Errorf("Root Function was not called.\n\nOutput was:\n\n%s\n", buf) - } -} - -func TestInvalidSubcommandWhenArgsAllowed(t *testing.T) { - fullSetupTest("echo invalid-sub") - - if te[0] != "invalid-sub" { - t.Errorf("Subcommand didn't work...") - } -} - -func TestRootFlags(t *testing.T) { - fullSetupTest("-i 17 -b") - - if flagbr != true { - t.Errorf("flag value should be true, %v given", flagbr) - } - - if flagir != 17 { - t.Errorf("flag value should be 17, %d given", flagir) - } -} - -func TestRootHelp(t *testing.T) { - x := fullSetupTest("--help") - - checkResultContains(t, x, "Available Commands:") - checkResultContains(t, x, "for more information about a command") - - if strings.Contains(x.Output, "unknown flag: --help") { - t.Errorf("--help shouldn't trigger an error, Got: \n %s", x.Output) - } - - if strings.Contains(x.Output, cmdEcho.Use) { - t.Errorf("--help shouldn't display subcommand's usage, Got: \n %s", x.Output) - } - - x = fullSetupTest("echo --help") - - if strings.Contains(x.Output, cmdTimes.Use) { - t.Errorf("--help shouldn't display subsubcommand's usage, Got: \n %s", x.Output) - } - - checkResultContains(t, x, "Available Commands:") - checkResultContains(t, x, "for more information about a command") - - if strings.Contains(x.Output, "unknown flag: --help") { - t.Errorf("--help shouldn't trigger an error, Got: \n %s", x.Output) - } - -} - -func TestFlagAccess(t *testing.T) { - initialize() - - local := cmdTimes.LocalFlags() - inherited := cmdTimes.InheritedFlags() - - for _, f := range []string{"inttwo", "strtwo", "booltwo"} { - if local.Lookup(f) == nil { - t.Errorf("LocalFlags expected to contain %s, Got: nil", f) - } - } - if inherited.Lookup("strone") == nil { - t.Errorf("InheritedFlags expected to contain strone, Got: nil") - } - if inherited.Lookup("strtwo") != nil { - t.Errorf("InheritedFlags shouldn not contain overwritten flag strtwo") - - } -} - -func TestNoNRunnableRootCommandNilInput(t *testing.T) { - var args []string - c := initialize() - - buf := new(bytes.Buffer) - // Testing flag with invalid input - c.SetOutput(buf) - cmdEcho.AddCommand(cmdTimes) - c.AddCommand(cmdPrint, cmdEcho) - c.SetArgs(args) - - c.Execute() - - if !strings.Contains(buf.String(), cmdRootNoRun.Long) { - t.Errorf("Expected to get help output, Got: \n %s", buf) - } -} - -func TestRootNoCommandHelp(t *testing.T) { - x := rootOnlySetupTest("--help") - - checkResultOmits(t, x, "Available Commands:") - checkResultOmits(t, x, "for more information about a command") - - if strings.Contains(x.Output, "unknown flag: --help") { - t.Errorf("--help shouldn't trigger an error, Got: \n %s", x.Output) - } - - x = rootOnlySetupTest("echo --help") - - checkResultOmits(t, x, "Available Commands:") - checkResultOmits(t, x, "for more information about a command") - - if strings.Contains(x.Output, "unknown flag: --help") { - t.Errorf("--help shouldn't trigger an error, Got: \n %s", x.Output) - } -} - -func TestRootUnknownCommand(t *testing.T) { - r := noRRSetupTest("bogus") - s := "Error: unknown command \"bogus\" for \"cobra-test\"\nRun 'cobra-test --help' for usage.\n" - - if r.Output != s { - t.Errorf("Unexpected response.\nExpecting to be:\n %q\nGot:\n %q\n", s, r.Output) - } - - r = noRRSetupTest("--strtwo=a bogus") - if r.Output != s { - t.Errorf("Unexpected response.\nExpecting to be:\n %q\nGot:\n %q\n", s, r.Output) - } -} - -func TestRootUnknownCommandSilenced(t *testing.T) { - r := noRRSetupTestSilenced("bogus") - s := "Run 'cobra-test --help' for usage.\n" - - if r.Output != "" { - t.Errorf("Unexpected response.\nExpecting to be: \n\"\"\n Got:\n %q\n", s, r.Output) - } - - r = noRRSetupTestSilenced("--strtwo=a bogus") - if r.Output != "" { - t.Errorf("Unexpected response.\nExpecting to be:\n\"\"\nGot:\n %q\n", s, r.Output) - } -} - -func TestRootSuggestions(t *testing.T) { - outputWithSuggestions := "Error: unknown command \"%s\" for \"cobra-test\"\n\nDid you mean this?\n\t%s\n\nRun 'cobra-test --help' for usage.\n" - outputWithoutSuggestions := "Error: unknown command \"%s\" for \"cobra-test\"\nRun 'cobra-test --help' for usage.\n" - - cmd := initializeWithRootCmd() - cmd.AddCommand(cmdTimes) - - tests := map[string]string{ - "time": "times", - "tiems": "times", - "tims": "times", - "timeS": "times", - "rimes": "times", - "ti": "times", - "t": "times", - "timely": "times", - "ri": "", - "timezone": "", - "foo": "", - "counts": "times", - } - - for typo, suggestion := range tests { - for _, suggestionsDisabled := range []bool{false, true} { - cmd.DisableSuggestions = suggestionsDisabled - result := simpleTester(cmd, typo) - expected := "" - if len(suggestion) == 0 || suggestionsDisabled { - expected = fmt.Sprintf(outputWithoutSuggestions, typo) - } else { - expected = fmt.Sprintf(outputWithSuggestions, typo, suggestion) - } - if result.Output != expected { - t.Errorf("Unexpected response.\nExpecting to be:\n %q\nGot:\n %q\n", expected, result.Output) - } - } - } -} - -func TestFlagsBeforeCommand(t *testing.T) { - // short without space - x := fullSetupTest("-i10 echo") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - } - - // short (int) with equals - // It appears that pflags doesn't support this... - // Commenting out until support can be added - - //x = noRRSetupTest("echo -i=10") - //if x.Error != nil { - //t.Errorf("Valid Input shouldn't have errors, got:\n %s", x.Error) - //} - - // long with equals - x = noRRSetupTest("--intone=123 echo one two") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %s", x.Error) - } - - // With parsing error properly reported - x = fullSetupTest("-i10E echo") - if !strings.Contains(x.Error.Error(), "invalid argument \"10E\" for i10E") { - t.Errorf("Wrong error message displayed, \n %s", x.Error) - } - - //With quotes - x = fullSetupTest("-s=\"walking\" echo") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - } - - //With quotes and space - x = fullSetupTest("-s=\"walking fast\" echo") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - } - - //With inner quote - x = fullSetupTest("-s=\"walking \\\"Inner Quote\\\" fast\" echo") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - } - - //With quotes and space - x = fullSetupTest("-s=\"walking \\\"Inner Quote\\\" fast\" echo") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - } - -} - -func TestRemoveCommand(t *testing.T) { - versionUsed = 0 - c := initializeWithRootCmd() - c.AddCommand(cmdVersion1) - c.RemoveCommand(cmdVersion1) - x := fullTester(c, "version") - if x.Error == nil { - t.Errorf("Removed command should not have been called\n") - return - } -} - -func TestCommandWithoutSubcommands(t *testing.T) { - c := initializeWithRootCmd() - - x := simpleTester(c, "") - if x.Error != nil { - t.Errorf("Calling command without subcommands should not have error: %v", x.Error) - return - } -} - -func TestCommandWithoutSubcommandsWithArg(t *testing.T) { - c := initializeWithRootCmd() - expectedArgs := []string{"arg"} - - x := simpleTester(c, "arg") - if x.Error != nil { - t.Errorf("Calling command without subcommands but with arg should not have error: %v", x.Error) - return - } - if !reflect.DeepEqual(expectedArgs, tr) { - t.Errorf("Calling command without subcommands but with arg has wrong args: expected: %v, actual: %v", expectedArgs, tr) - return - } -} - -func TestReplaceCommandWithRemove(t *testing.T) { - versionUsed = 0 - c := initializeWithRootCmd() - c.AddCommand(cmdVersion1) - c.RemoveCommand(cmdVersion1) - c.AddCommand(cmdVersion2) - x := fullTester(c, "version") - if x.Error != nil { - t.Errorf("Valid Input shouldn't have errors, got:\n %q", x.Error) - return - } - if versionUsed == 1 { - t.Errorf("Removed command shouldn't be called\n") - } - if versionUsed != 2 { - t.Errorf("Replacing command should have been called but didn't\n") - } -} - -func TestDeprecatedSub(t *testing.T) { - c := fullSetupTest("deprecated") - - checkResultContains(t, c, cmdDeprecated.Deprecated) -} - -func TestPreRun(t *testing.T) { - noRRSetupTest("echo one two") - if echoPre == nil || echoPersPre == nil { - t.Error("PreRun or PersistentPreRun not called") - } - if rootPersPre != nil || timesPersPre != nil { - t.Error("Wrong *Pre functions called!") - } - - noRRSetupTest("echo times one two") - if timesPersPre == nil { - t.Error("PreRun or PersistentPreRun not called") - } - if echoPre != nil || echoPersPre != nil || rootPersPre != nil { - t.Error("Wrong *Pre functions called!") - } - - noRRSetupTest("print one two") - if rootPersPre == nil { - t.Error("Parent PersistentPreRun not called but should not have been") - } - if echoPre != nil || echoPersPre != nil || timesPersPre != nil { - t.Error("Wrong *Pre functions called!") - } -} - -// Check if cmdEchoSub gets PersistentPreRun from rootCmd even if is added last -func TestPeristentPreRunPropagation(t *testing.T) { - rootCmd := initialize() - - // First add the cmdEchoSub to cmdPrint - cmdPrint.AddCommand(cmdEchoSub) - // Now add cmdPrint to rootCmd - rootCmd.AddCommand(cmdPrint) - - rootCmd.SetArgs(strings.Split("print echosub lala", " ")) - rootCmd.Execute() - - if rootPersPre == nil || len(rootPersPre) == 0 || rootPersPre[0] != "lala" { - t.Error("RootCmd PersistentPreRun not called but should have been") - } -} - -func TestGlobalNormFuncPropagation(t *testing.T) { - normFunc := func(f *pflag.FlagSet, name string) pflag.NormalizedName { - return pflag.NormalizedName(name) - } - - rootCmd := initialize() - rootCmd.SetGlobalNormalizationFunc(normFunc) - if reflect.ValueOf(normFunc) != reflect.ValueOf(rootCmd.GlobalNormalizationFunc()) { - t.Error("rootCmd seems to have a wrong normalization function") - } - - // First add the cmdEchoSub to cmdPrint - cmdPrint.AddCommand(cmdEchoSub) - if cmdPrint.GlobalNormalizationFunc() != nil && cmdEchoSub.GlobalNormalizationFunc() != nil { - t.Error("cmdPrint and cmdEchoSub should had no normalization functions") - } - - // Now add cmdPrint to rootCmd - rootCmd.AddCommand(cmdPrint) - if reflect.ValueOf(cmdPrint.GlobalNormalizationFunc()).Pointer() != reflect.ValueOf(rootCmd.GlobalNormalizationFunc()).Pointer() || - reflect.ValueOf(cmdEchoSub.GlobalNormalizationFunc()).Pointer() != reflect.ValueOf(rootCmd.GlobalNormalizationFunc()).Pointer() { - t.Error("cmdPrint and cmdEchoSub should had the normalization function of rootCmd") - } -} - -func TestFlagOnPflagCommandLine(t *testing.T) { - flagName := "flagOnCommandLine" - pflag.CommandLine.String(flagName, "", "about my flag") - r := fullSetupTest("--help") - - checkResultContains(t, r, flagName) -} - -func TestAddTemplateFunctions(t *testing.T) { - AddTemplateFunc("t", func() bool { return true }) - AddTemplateFuncs(template.FuncMap{ - "f": func() bool { return false }, - "h": func() string { return "Hello," }, - "w": func() string { return "world." }}) - - const usage = "Hello, world." - - c := &Command{} - c.SetUsageTemplate(`{{if t}}{{h}}{{end}}{{if f}}{{h}}{{end}} {{w}}`) - - if us := c.UsageString(); us != usage { - t.Errorf("c.UsageString() != \"%s\", is \"%s\"", usage, us) - } -} - -func TestUsageIsNotPrintedTwice(t *testing.T) { - var cmd = &Command{Use: "root"} - var sub = &Command{Use: "sub"} - cmd.AddCommand(sub) - - r := simpleTester(cmd, "") - if strings.Count(r.Output, "Usage:") != 1 { - t.Error("Usage output is not printed exactly once") - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/command_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/command_test.go deleted file mode 100644 index 43ed7a34f..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/command_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package cobra - -import ( - "reflect" - "testing" -) - -// test to ensure hidden commands run as intended -func TestHiddenCommandExecutes(t *testing.T) { - - // ensure that outs does not already equal what the command will be setting it - // to, if it did this test would not actually be testing anything... - if outs == "hidden" { - t.Errorf("outs should NOT EQUAL hidden") - } - - cmdHidden.Execute() - - // upon running the command, the value of outs should now be 'hidden' - if outs != "hidden" { - t.Errorf("Hidden command failed to run!") - } -} - -// test to ensure hidden commands do not show up in usage/help text -func TestHiddenCommandIsHidden(t *testing.T) { - if cmdHidden.IsAvailableCommand() { - t.Errorf("Hidden command found!") - } -} - -func TestStripFlags(t *testing.T) { - tests := []struct { - input []string - output []string - }{ - { - []string{"foo", "bar"}, - []string{"foo", "bar"}, - }, - { - []string{"foo", "--bar", "-b"}, - []string{"foo"}, - }, - { - []string{"-b", "foo", "--bar", "bar"}, - []string{}, - }, - { - []string{"-i10", "echo"}, - []string{"echo"}, - }, - { - []string{"-i=10", "echo"}, - []string{"echo"}, - }, - { - []string{"--int=100", "echo"}, - []string{"echo"}, - }, - { - []string{"-ib", "echo", "-bfoo", "baz"}, - []string{"echo", "baz"}, - }, - { - []string{"-i=baz", "bar", "-i", "foo", "blah"}, - []string{"bar", "blah"}, - }, - { - []string{"--int=baz", "-bbar", "-i", "foo", "blah"}, - []string{"blah"}, - }, - { - []string{"--cat", "bar", "-i", "foo", "blah"}, - []string{"bar", "blah"}, - }, - { - []string{"-c", "bar", "-i", "foo", "blah"}, - []string{"bar", "blah"}, - }, - { - []string{"--persist", "bar"}, - []string{"bar"}, - }, - { - []string{"-p", "bar"}, - []string{"bar"}, - }, - } - - cmdPrint := &Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `an utterly useless command for testing.`, - Run: func(cmd *Command, args []string) { - tp = args - }, - } - - var flagi int - var flagstr string - var flagbool bool - cmdPrint.PersistentFlags().BoolVarP(&flagbool, "persist", "p", false, "help for persistent one") - cmdPrint.Flags().IntVarP(&flagi, "int", "i", 345, "help message for flag int") - cmdPrint.Flags().StringVarP(&flagstr, "bar", "b", "bar", "help message for flag string") - cmdPrint.Flags().BoolVarP(&flagbool, "cat", "c", false, "help message for flag bool") - - for _, test := range tests { - output := stripFlags(test.input, cmdPrint) - if !reflect.DeepEqual(test.output, output) { - t.Errorf("expected: %v, got: %v", test.output, output) - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/cmd_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/cmd_test.go deleted file mode 100644 index a4b5568fa..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/cmd_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package doc - -import ( - "bytes" - "fmt" - "runtime" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -var flagb1, flagb2, flagb3, flagbr, flagbp bool -var flags1, flags2a, flags2b, flags3 string -var flagi1, flagi2, flagi3, flagir int - -const strtwoParentHelp = "help message for parent flag strtwo" -const strtwoChildHelp = "help message for child flag strtwo" - -var cmdEcho = &cobra.Command{ - Use: "echo [string to echo]", - Aliases: []string{"say"}, - Short: "Echo anything to the screen", - Long: `an utterly useless command for testing.`, - Example: "Just run cobra-test echo", -} - -var cmdEchoSub = &cobra.Command{ - Use: "echosub [string to print]", - Short: "second sub command for echo", - Long: `an absolutely utterly useless command for testing gendocs!.`, - Run: func(cmd *cobra.Command, args []string) {}, -} - -var cmdDeprecated = &cobra.Command{ - Use: "deprecated [can't do anything here]", - Short: "A command which is deprecated", - Long: `an absolutely utterly useless command for testing deprecation!.`, - Deprecated: "Please use echo instead", -} - -var cmdTimes = &cobra.Command{ - Use: "times [# times] [string to echo]", - SuggestFor: []string{"counts"}, - Short: "Echo anything to the screen more times", - Long: `a slightly useless command for testing.`, - PersistentPreRun: func(cmd *cobra.Command, args []string) {}, - Run: func(cmd *cobra.Command, args []string) {}, -} - -var cmdPrint = &cobra.Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `an absolutely utterly useless command for testing.`, -} - -var cmdRootNoRun = &cobra.Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", -} - -var cmdRootSameName = &cobra.Command{ - Use: "print", - Short: "Root with the same name as a subcommand", - Long: "The root description for help", -} - -var cmdRootWithRun = &cobra.Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", -} - -var cmdSubNoRun = &cobra.Command{ - Use: "subnorun", - Short: "A subcommand without a Run function", - Long: "A long output about a subcommand without a Run function", -} - -var cmdVersion1 = &cobra.Command{ - Use: "version", - Short: "Print the version number", - Long: `First version of the version command`, -} - -var cmdVersion2 = &cobra.Command{ - Use: "version", - Short: "Print the version number", - Long: `Second version of the version command`, -} - -func flagInit() { - cmdEcho.ResetFlags() - cmdPrint.ResetFlags() - cmdTimes.ResetFlags() - cmdRootNoRun.ResetFlags() - cmdRootSameName.ResetFlags() - cmdRootWithRun.ResetFlags() - cmdSubNoRun.ResetFlags() - cmdRootNoRun.PersistentFlags().StringVarP(&flags2a, "strtwo", "t", "two", strtwoParentHelp) - cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone") - cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo") - cmdPrint.Flags().IntVarP(&flagi3, "intthree", "i", 345, "help message for flag intthree") - cmdEcho.PersistentFlags().StringVarP(&flags1, "strone", "s", "one", "help message for flag strone") - cmdEcho.PersistentFlags().BoolVarP(&flagbp, "persistentbool", "p", false, "help message for flag persistentbool") - cmdTimes.PersistentFlags().StringVarP(&flags2b, "strtwo", "t", "2", strtwoChildHelp) - cmdPrint.PersistentFlags().StringVarP(&flags3, "strthree", "s", "three", "help message for flag strthree") - cmdEcho.Flags().BoolVarP(&flagb1, "boolone", "b", true, "help message for flag boolone") - cmdTimes.Flags().BoolVarP(&flagb2, "booltwo", "c", false, "help message for flag booltwo") - cmdPrint.Flags().BoolVarP(&flagb3, "boolthree", "b", true, "help message for flag boolthree") - cmdVersion1.ResetFlags() - cmdVersion2.ResetFlags() -} - -func initializeWithRootCmd() *cobra.Command { - cmdRootWithRun.ResetCommands() - flagInit() - cmdRootWithRun.Flags().BoolVarP(&flagbr, "boolroot", "b", false, "help message for flag boolroot") - cmdRootWithRun.Flags().IntVarP(&flagir, "introot", "i", 321, "help message for flag introot") - return cmdRootWithRun -} - -func checkStringContains(t *testing.T, found, expected string) { - if !strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func checkStringOmits(t *testing.T, found, expected string) { - if strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func logErr(t *testing.T, found, expected string) { - out := new(bytes.Buffer) - - _, _, line, ok := runtime.Caller(2) - if ok { - fmt.Fprintf(out, "Line: %d ", line) - } - fmt.Fprintf(out, "Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - t.Errorf(out.String()) -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.go deleted file mode 100644 index a98674bf3..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2015 Red Hat Inc. All rights reserved. -// -// 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 doc - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - - mangen "github.com/cpuguy83/go-md2man/md2man" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -// GenManTree will generate a man page for this command and all decendants -// in the directory given. The header may be nil. This function may not work -// correctly if your command names have - in them. If you have `cmd` with two -// subcmds, `sub` and `sub-third`. And `sub` has a subcommand called `third` -// it is undefined which help output will be in the file `cmd-sub-third.1`. -func GenManTree(cmd *cobra.Command, header *GenManHeader, dir string) error { - if header == nil { - header = &GenManHeader{} - } - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { - continue - } - if err := GenManTree(c, header, dir); err != nil { - return err - } - } - needToResetTitle := header.Title == "" - - basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".1" - filename := filepath.Join(dir, basename) - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - if err := GenMan(cmd, header, f); err != nil { - return err - } - - if needToResetTitle { - header.Title = "" - } - return nil -} - -// GenManHeader is a lot like the .TH header at the start of man pages. These -// include the title, section, date, source, and manual. We will use the -// current time if Date if unset and will use "Auto generated by spf13/cobra" -// if the Source is unset. -type GenManHeader struct { - Title string - Section string - Date *time.Time - date string - Source string - Manual string -} - -// GenMan will generate a man page for the given command and write it to -// w. The header argument may be nil, however obviously w may not. -func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error { - if header == nil { - header = &GenManHeader{} - } - b := genMan(cmd, header) - final := mangen.Render(b) - _, err := w.Write(final) - return err -} - -func fillHeader(header *GenManHeader, name string) { - if header.Title == "" { - header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1)) - } - if header.Section == "" { - header.Section = "1" - } - if header.Date == nil { - now := time.Now() - header.Date = &now - } - header.date = (*header.Date).Format("Jan 2006") - if header.Source == "" { - header.Source = "Auto generated by spf13/cobra" - } -} - -func manPreamble(out io.Writer, header *GenManHeader, name, short, long string) { - dashName := strings.Replace(name, " ", "-", -1) - fmt.Fprintf(out, `%% %s(%s)%s -%% %s -%% %s -# NAME -`, header.Title, header.Section, header.date, header.Source, header.Manual) - fmt.Fprintf(out, "%s \\- %s\n\n", dashName, short) - fmt.Fprintf(out, "# SYNOPSIS\n") - fmt.Fprintf(out, "**%s** [OPTIONS]\n\n", name) - fmt.Fprintf(out, "# DESCRIPTION\n") - fmt.Fprintf(out, "%s\n\n", long) -} - -func manPrintFlags(out io.Writer, flags *pflag.FlagSet) { - flags.VisitAll(func(flag *pflag.Flag) { - if len(flag.Deprecated) > 0 || flag.Hidden { - return - } - format := "" - if len(flag.Shorthand) > 0 { - format = "**-%s**, **--%s**" - } else { - format = "%s**--%s**" - } - if len(flag.NoOptDefVal) > 0 { - format = format + "[" - } - if flag.Value.Type() == "string" { - // put quotes on the value - format = format + "=%q" - } else { - format = format + "=%s" - } - if len(flag.NoOptDefVal) > 0 { - format = format + "]" - } - format = format + "\n\t%s\n\n" - fmt.Fprintf(out, format, flag.Shorthand, flag.Name, flag.DefValue, flag.Usage) - }) -} - -func manPrintOptions(out io.Writer, command *cobra.Command) { - flags := command.NonInheritedFlags() - if flags.HasFlags() { - fmt.Fprintf(out, "# OPTIONS\n") - manPrintFlags(out, flags) - fmt.Fprintf(out, "\n") - } - flags = command.InheritedFlags() - if flags.HasFlags() { - fmt.Fprintf(out, "# OPTIONS INHERITED FROM PARENT COMMANDS\n") - manPrintFlags(out, flags) - fmt.Fprintf(out, "\n") - } -} - -func genMan(cmd *cobra.Command, header *GenManHeader) []byte { - // something like `rootcmd subcmd1 subcmd2` - commandName := cmd.CommandPath() - // something like `rootcmd-subcmd1-subcmd2` - dashCommandName := strings.Replace(commandName, " ", "-", -1) - - fillHeader(header, commandName) - - buf := new(bytes.Buffer) - - short := cmd.Short - long := cmd.Long - if len(long) == 0 { - long = short - } - - manPreamble(buf, header, commandName, short, long) - manPrintOptions(buf, cmd) - if len(cmd.Example) > 0 { - fmt.Fprintf(buf, "# EXAMPLE\n") - fmt.Fprintf(buf, "```\n%s\n```\n", cmd.Example) - } - if hasSeeAlso(cmd) { - fmt.Fprintf(buf, "# SEE ALSO\n") - seealsos := make([]string, 0) - if cmd.HasParent() { - parentPath := cmd.Parent().CommandPath() - dashParentPath := strings.Replace(parentPath, " ", "-", -1) - seealso := fmt.Sprintf("**%s(%s)**", dashParentPath, header.Section) - seealsos = append(seealsos, seealso) - cmd.VisitParents(func(c *cobra.Command) { - if c.DisableAutoGenTag { - cmd.DisableAutoGenTag = c.DisableAutoGenTag - } - }) - } - children := cmd.Commands() - sort.Sort(byName(children)) - for _, c := range children { - if !c.IsAvailableCommand() || c.IsHelpCommand() { - continue - } - seealso := fmt.Sprintf("**%s-%s(%s)**", dashCommandName, c.Name(), header.Section) - seealsos = append(seealsos, seealso) - } - fmt.Fprintf(buf, "%s\n", strings.Join(seealsos, ", ")) - } - if !cmd.DisableAutoGenTag { - fmt.Fprintf(buf, "# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006")) - } - return buf.Bytes() -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.md b/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.md deleted file mode 100644 index 5fe957a35..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs.md +++ /dev/null @@ -1,26 +0,0 @@ -# Generating Man Pages For Your Own cobra.Command - -Generating man pages from a cobra command is incredibly easy. An example is as follows: - -```go -package main - -import ( - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &cobra.GenManHeader{ - Title: "MINE", - Section: "3", - } - doc.GenManTree(cmd, header, "/tmp") -} -``` - -That will get you a man page `/tmp/test.1` diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs_test.go deleted file mode 100644 index e6e6263c2..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_docs_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package doc - -import ( - "bufio" - "bytes" - "fmt" - "os" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -var _ = fmt.Println -var _ = os.Stderr - -func translate(in string) string { - return strings.Replace(in, "-", "\\-", -1) -} - -func TestGenManDoc(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - - out := new(bytes.Buffer) - - header := &GenManHeader{ - Title: "Project", - Section: "2", - } - // We generate on a subcommand so we have both subcommands and parents - if err := GenMan(cmdEcho, header, out); err != nil { - t.Fatal(err) - } - found := out.String() - - // Make sure parent has - in CommandPath() in SEE ALSO: - parentPath := cmdEcho.Parent().CommandPath() - dashParentPath := strings.Replace(parentPath, " ", "-", -1) - expected := translate(dashParentPath) - expected = expected + "(" + header.Section + ")" - checkStringContains(t, found, expected) - - // Our description - expected = translate(cmdEcho.Name()) - checkStringContains(t, found, expected) - - // Better have our example - expected = translate(cmdEcho.Name()) - checkStringContains(t, found, expected) - - // A local flag - expected = "boolone" - checkStringContains(t, found, expected) - - // persistent flag on parent - expected = "rootflag" - checkStringContains(t, found, expected) - - // We better output info about our parent - expected = translate(cmdRootWithRun.Name()) - checkStringContains(t, found, expected) - - // And about subcommands - expected = translate(cmdEchoSub.Name()) - checkStringContains(t, found, expected) - - unexpected := translate(cmdDeprecated.Name()) - checkStringOmits(t, found, unexpected) - - // auto generated - expected = translate("Auto generated") - checkStringContains(t, found, expected) -} - -func TestGenManNoGenTag(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - cmdEcho.DisableAutoGenTag = true - out := new(bytes.Buffer) - - header := &GenManHeader{ - Title: "Project", - Section: "2", - } - // We generate on a subcommand so we have both subcommands and parents - if err := GenMan(cmdEcho, header, out); err != nil { - t.Fatal(err) - } - found := out.String() - - unexpected := translate("#HISTORY") - checkStringOmits(t, found, unexpected) -} - -func TestGenManSeeAlso(t *testing.T) { - noop := func(cmd *cobra.Command, args []string) {} - - top := &cobra.Command{Use: "top", Run: noop} - aaa := &cobra.Command{Use: "aaa", Run: noop, Hidden: true} // #229 - bbb := &cobra.Command{Use: "bbb", Run: noop} - ccc := &cobra.Command{Use: "ccc", Run: noop} - top.AddCommand(aaa, bbb, ccc) - - out := new(bytes.Buffer) - header := &GenManHeader{} - if err := GenMan(top, header, out); err != nil { - t.Fatal(err) - } - - scanner := bufio.NewScanner(out) - - if err := AssertLineFound(scanner, ".SH SEE ALSO"); err != nil { - t.Fatal(fmt.Errorf("Couldn't find SEE ALSO section header: %s", err.Error())) - } - - if err := AssertNextLineEquals(scanner, ".PP"); err != nil { - t.Fatal(fmt.Errorf("First line after SEE ALSO wasn't break-indent: %s", err.Error())) - } - - if err := AssertNextLineEquals(scanner, `\fBtop\-bbb(1)\fP, \fBtop\-ccc(1)\fP`); err != nil { - t.Fatal(fmt.Errorf("Second line after SEE ALSO wasn't correct: %s", err.Error())) - } -} - -func AssertLineFound(scanner *bufio.Scanner, expectedLine string) error { - for scanner.Scan() { - line := scanner.Text() - if line == expectedLine { - return nil - } - } - - if err := scanner.Err(); err != nil { - return fmt.Errorf("AssertLineFound: scan failed: %s", err.Error()) - } - - return fmt.Errorf("AssertLineFound: hit EOF before finding %#v", expectedLine) -} - -func AssertNextLineEquals(scanner *bufio.Scanner, expectedLine string) error { - if scanner.Scan() { - line := scanner.Text() - if line == expectedLine { - return nil - } - return fmt.Errorf("AssertNextLineEquals: got %#v, not %#v", line, expectedLine) - } - - if err := scanner.Err(); err != nil { - return fmt.Errorf("AssertNextLineEquals: scan failed: %s", err.Error()) - } - - return fmt.Errorf("AssertNextLineEquals: hit EOF before finding %#v", expectedLine) -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_examples_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_examples_test.go deleted file mode 100644 index 3593853b0..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/man_examples_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package doc_test - -import ( - "bytes" - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func ExampleCommand_GenManTree() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &doc.GenManHeader{ - Title: "MINE", - Section: "3", - } - doc.GenManTree(cmd, header, "/tmp") -} - -func ExampleCommand_GenMan() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &doc.GenManHeader{ - Title: "MINE", - Section: "3", - } - out := new(bytes.Buffer) - doc.GenMan(cmd, header, out) - fmt.Print(out.String()) -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.go deleted file mode 100644 index fa1363180..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.go +++ /dev/null @@ -1,175 +0,0 @@ -//Copyright 2015 Red Hat Inc. All rights reserved. -// -// 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 doc - -import ( - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/spf13/cobra" -) - -func printOptions(w io.Writer, cmd *cobra.Command, name string) error { - flags := cmd.NonInheritedFlags() - flags.SetOutput(w) - if flags.HasFlags() { - if _, err := fmt.Fprintf(w, "### Options\n\n```\n"); err != nil { - return err - } - flags.PrintDefaults() - if _, err := fmt.Fprintf(w, "```\n\n"); err != nil { - return err - } - } - - parentFlags := cmd.InheritedFlags() - parentFlags.SetOutput(w) - if parentFlags.HasFlags() { - if _, err := fmt.Fprintf(w, "### Options inherited from parent commands\n\n```\n"); err != nil { - return err - } - parentFlags.PrintDefaults() - if _, err := fmt.Fprintf(w, "```\n\n"); err != nil { - return err - } - } - return nil -} - -func GenMarkdown(cmd *cobra.Command, w io.Writer) error { - return GenMarkdownCustom(cmd, w, func(s string) string { return s }) -} - -func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { - name := cmd.CommandPath() - - short := cmd.Short - long := cmd.Long - if len(long) == 0 { - long = short - } - - if _, err := fmt.Fprintf(w, "## %s\n\n", name); err != nil { - return err - } - if _, err := fmt.Fprintf(w, "%s\n\n", short); err != nil { - return err - } - if _, err := fmt.Fprintf(w, "### Synopsis\n\n"); err != nil { - return err - } - if _, err := fmt.Fprintf(w, "\n%s\n\n", long); err != nil { - return err - } - - if cmd.Runnable() { - if _, err := fmt.Fprintf(w, "```\n%s\n```\n\n", cmd.UseLine()); err != nil { - return err - } - } - - if len(cmd.Example) > 0 { - if _, err := fmt.Fprintf(w, "### Examples\n\n"); err != nil { - return err - } - if _, err := fmt.Fprintf(w, "```\n%s\n```\n\n", cmd.Example); err != nil { - return err - } - } - - if err := printOptions(w, cmd, name); err != nil { - return err - } - if hasSeeAlso(cmd) { - if _, err := fmt.Fprintf(w, "### SEE ALSO\n"); err != nil { - return err - } - if cmd.HasParent() { - parent := cmd.Parent() - pname := parent.CommandPath() - link := pname + ".md" - link = strings.Replace(link, " ", "_", -1) - if _, err := fmt.Fprintf(w, "* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short); err != nil { - return err - } - cmd.VisitParents(func(c *cobra.Command) { - if c.DisableAutoGenTag { - cmd.DisableAutoGenTag = c.DisableAutoGenTag - } - }) - } - - children := cmd.Commands() - sort.Sort(byName(children)) - - for _, child := range children { - if !child.IsAvailableCommand() || child.IsHelpCommand() { - continue - } - cname := name + " " + child.Name() - link := cname + ".md" - link = strings.Replace(link, " ", "_", -1) - if _, err := fmt.Fprintf(w, "* [%s](%s)\t - %s\n", cname, linkHandler(link), child.Short); err != nil { - return err - } - } - if _, err := fmt.Fprintf(w, "\n"); err != nil { - return err - } - } - if !cmd.DisableAutoGenTag { - if _, err := fmt.Fprintf(w, "###### Auto generated by spf13/cobra on %s\n", time.Now().Format("2-Jan-2006")); err != nil { - return err - } - } - return nil -} - -func GenMarkdownTree(cmd *cobra.Command, dir string) error { - identity := func(s string) string { return s } - emptyStr := func(s string) string { return "" } - return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity) -} - -func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { - continue - } - if err := GenMarkdownTreeCustom(c, dir, filePrepender, linkHandler); err != nil { - return err - } - } - - basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".md" - filename := filepath.Join(dir, basename) - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - if _, err := io.WriteString(f, filePrepender(filename)); err != nil { - return err - } - if err := GenMarkdownCustom(cmd, f, linkHandler); err != nil { - return err - } - return nil -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.md b/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.md deleted file mode 100644 index 0c3b96e27..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs.md +++ /dev/null @@ -1,104 +0,0 @@ -# Generating Markdown Docs For Your Own cobra.Command - -Generating man pages from a cobra command is incredibly easy. An example is as follows: - -```go -package main - -import ( - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - doc.GenMarkdownTree(cmd, "/tmp") -} -``` - -That will get you a Markdown document `/tmp/test.md` - -## Generate markdown docs for the entire command tree - -This program can actually generate docs for the kubectl command in the kubernetes project - -```go -package main - -import ( - "io/ioutil" - "os" - - kubectlcmd "k8s.io/kubernetes/pkg/kubectl/cmd" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := kubectlcmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - doc.GenMarkdownTree(cmd, "./") -} -``` - -This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") - -## Generate markdown docs for a single command - -You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree` - -```go - out := new(bytes.Buffer) - doc.GenMarkdown(cmd, out) -``` - -This will write the markdown doc for ONLY "cmd" into the out, buffer. - -## Customize the output - -Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output: - -```go -func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error { - //... -} -``` - -```go -func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error { - //... -} -``` - -The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): - -```go -const fmTemplate = `--- -date: %s -title: "%s" -slug: %s -url: %s ---- -` - -filePrepender := func(filename string) string { - now := time.Now().Format(time.RFC3339) - name := filepath.Base(filename) - base := strings.TrimSuffix(name, path.Ext(name)) - url := "/commands/" + strings.ToLower(base) + "/" - return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) -} -``` - -The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename: - -```go -linkHandler := func(name string) string { - base := strings.TrimSuffix(name, path.Ext(name)) - return "/commands/" + strings.ToLower(base) + "/" -} -``` - diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs_test.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs_test.go deleted file mode 100644 index 86ee02930..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/md_docs_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package doc - -import ( - "bytes" - "fmt" - "os" - "strings" - "testing" -) - -var _ = fmt.Println -var _ = os.Stderr - -func TestGenMdDoc(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - - out := new(bytes.Buffer) - - // We generate on s subcommand so we have both subcommands and parents - if err := GenMarkdown(cmdEcho, out); err != nil { - t.Fatal(err) - } - found := out.String() - - // Our description - expected := cmdEcho.Long - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // Better have our example - expected = cmdEcho.Example - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // A local flag - expected = "boolone" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // persistent flag on parent - expected = "rootflag" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // We better output info about our parent - expected = cmdRootWithRun.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // And about subcommands - expected = cmdEchoSub.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - unexpected := cmdDeprecated.Short - if strings.Contains(found, unexpected) { - t.Errorf("Unexpected response.\nFound: %v\nBut should not have!!\n", unexpected) - } -} - -func TestGenMdNoTag(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - c.DisableAutoGenTag = true - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - out := new(bytes.Buffer) - - if err := GenMarkdown(c, out); err != nil { - t.Fatal(err) - } - found := out.String() - - unexpected := "Auto generated" - checkStringOmits(t, found, unexpected) - -} diff --git a/Godeps/_workspace/src/github.com/spf13/cobra/doc/util.go b/Godeps/_workspace/src/github.com/spf13/cobra/doc/util.go deleted file mode 100644 index a1c6b89ba..000000000 --- a/Godeps/_workspace/src/github.com/spf13/cobra/doc/util.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2015 Red Hat Inc. All rights reserved. -// -// 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 doc - -import "github.com/spf13/cobra" - -// Test to see if we have a reason to print See Also information in docs -// Basically this is a test for a parent commend or a subcommand which is -// both not deprecated and not the autogenerated help command. -func hasSeeAlso(cmd *cobra.Command) bool { - if cmd.HasParent() { - return true - } - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { - continue - } - return true - } - return false -} - -type byName []*cobra.Command - -func (s byName) Len() int { return len(s) } -func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/bool_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/bool_test.go deleted file mode 100644 index afd25ae2f..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/bool_test.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2009 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 pflag - -import ( - "bytes" - "fmt" - "strconv" - "testing" -) - -// This value can be a boolean ("true", "false") or "maybe" -type triStateValue int - -const ( - triStateFalse triStateValue = 0 - triStateTrue triStateValue = 1 - triStateMaybe triStateValue = 2 -) - -const strTriStateMaybe = "maybe" - -func (v *triStateValue) IsBoolFlag() bool { - return true -} - -func (v *triStateValue) Get() interface{} { - return triStateValue(*v) -} - -func (v *triStateValue) Set(s string) error { - if s == strTriStateMaybe { - *v = triStateMaybe - return nil - } - boolVal, err := strconv.ParseBool(s) - if boolVal { - *v = triStateTrue - } else { - *v = triStateFalse - } - return err -} - -func (v *triStateValue) String() string { - if *v == triStateMaybe { - return strTriStateMaybe - } - return fmt.Sprintf("%v", bool(*v == triStateTrue)) -} - -// The type of the flag as required by the pflag.Value interface -func (v *triStateValue) Type() string { - return "version" -} - -func setUpFlagSet(tristate *triStateValue) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - *tristate = triStateFalse - flag := f.VarPF(tristate, "tristate", "t", "tristate value (true, maybe or false)") - flag.NoOptDefVal = "true" - return f -} - -func TestExplicitTrue(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{"--tristate=true"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateTrue { - t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") - } -} - -func TestImplicitTrue(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{"--tristate"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateTrue { - t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") - } -} - -func TestShortFlag(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{"-t"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateTrue { - t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") - } -} - -func TestShortFlagExtraArgument(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - // The"maybe"turns into an arg, since short boolean options will only do true/false - err := f.Parse([]string{"-t", "maybe"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateTrue { - t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") - } - args := f.Args() - if len(args) != 1 || args[0] != "maybe" { - t.Fatal("expected an extra 'maybe' argument to stick around") - } -} - -func TestExplicitMaybe(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{"--tristate=maybe"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateMaybe { - t.Fatal("expected", triStateMaybe, "(triStateMaybe) but got", tristate, "instead") - } -} - -func TestExplicitFalse(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{"--tristate=false"}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateFalse { - t.Fatal("expected", triStateFalse, "(triStateFalse) but got", tristate, "instead") - } -} - -func TestImplicitFalse(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - err := f.Parse([]string{}) - if err != nil { - t.Fatal("expected no error; got", err) - } - if tristate != triStateFalse { - t.Fatal("expected", triStateFalse, "(triStateFalse) but got", tristate, "instead") - } -} - -func TestInvalidValue(t *testing.T) { - var tristate triStateValue - f := setUpFlagSet(&tristate) - var buf bytes.Buffer - f.SetOutput(&buf) - err := f.Parse([]string{"--tristate=invalid"}) - if err == nil { - t.Fatal("expected an error but did not get any, tristate has value", tristate) - } -} - -func TestBoolP(t *testing.T) { - b := BoolP("bool", "b", false, "bool value in CommandLine") - c := BoolP("c", "c", false, "other bool value") - args := []string{"--bool"} - if err := CommandLine.Parse(args); err != nil { - t.Error("expected no error, got ", err) - } - if *b != true { - t.Errorf("expected b=true got b=%s", b) - } - if *c != false { - t.Errorf("expect c=false got c=%s", c) - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/count_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/count_test.go deleted file mode 100644 index 716765cba..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/count_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package pflag - -import ( - "fmt" - "os" - "testing" -) - -var _ = fmt.Printf - -func setUpCount(c *int) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.CountVarP(c, "verbose", "v", "a counter") - return f -} - -func TestCount(t *testing.T) { - testCases := []struct { - input []string - success bool - expected int - }{ - {[]string{"-vvv"}, true, 3}, - {[]string{"-v", "-v", "-v"}, true, 3}, - {[]string{"-v", "--verbose", "-v"}, true, 3}, - {[]string{"-v=3", "-v"}, true, 4}, - {[]string{"-v=a"}, false, 0}, - } - - devnull, _ := os.Open(os.DevNull) - os.Stderr = devnull - for i := range testCases { - var count int - f := setUpCount(&count) - - tc := &testCases[i] - - err := f.Parse(tc.input) - if err != nil && tc.success == true { - t.Errorf("expected success, got %q", err) - continue - } else if err == nil && tc.success == false { - t.Errorf("expected failure, got success") - continue - } else if tc.success { - c, err := f.GetCount("verbose") - if err != nil { - t.Errorf("Got error trying to fetch the counter flag") - } - if c != tc.expected { - t.Errorf("expected %q, got %q", tc.expected, c) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/example_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/example_test.go deleted file mode 100644 index 9be7a49f2..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/example_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2012 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. - -// These examples demonstrate more intricate uses of the flag package. -package pflag_test - -import ( - "errors" - "fmt" - "strings" - "time" - - flag "github.com/spf13/pflag" -) - -// Example 1: A single string flag called "species" with default value "gopher". -var species = flag.String("species", "gopher", "the species we are studying") - -// Example 2: A flag with a shorthand letter. -var gopherType = flag.StringP("gopher_type", "g", "pocket", "the variety of gopher") - -// Example 3: A user-defined flag type, a slice of durations. -type interval []time.Duration - -// String is the method to format the flag's value, part of the flag.Value interface. -// The String method's output will be used in diagnostics. -func (i *interval) String() string { - return fmt.Sprint(*i) -} - -func (i *interval) Type() string { - return "interval" -} - -// Set is the method to set the flag value, part of the flag.Value interface. -// Set's argument is a string to be parsed to set the flag. -// It's a comma-separated list, so we split it. -func (i *interval) Set(value string) error { - // If we wanted to allow the flag to be set multiple times, - // accumulating values, we would delete this if statement. - // That would permit usages such as - // -deltaT 10s -deltaT 15s - // and other combinations. - if len(*i) > 0 { - return errors.New("interval flag already set") - } - for _, dt := range strings.Split(value, ",") { - duration, err := time.ParseDuration(dt) - if err != nil { - return err - } - *i = append(*i, duration) - } - return nil -} - -// Define a flag to accumulate durations. Because it has a special type, -// we need to use the Var function and therefore create the flag during -// init. - -var intervalFlag interval - -func init() { - // Tie the command-line flag to the intervalFlag variable and - // set a usage message. - flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events") -} - -func Example() { - // All the interesting pieces are with the variables declared above, but - // to enable the flag package to see the flags defined there, one must - // execute, typically at the start of main (not init!): - // flag.Parse() - // We don't run it here because this is not a main function and - // the testing suite has already parsed the flags. -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/export_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/export_test.go deleted file mode 100644 index 9318fee00..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/export_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2010 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 pflag - -import ( - "io/ioutil" - "os" -) - -// Additional routines compiled into the package only during testing. - -// ResetForTesting clears all flag state and sets the usage function as directed. -// After calling ResetForTesting, parse errors in flag handling will not -// exit the program. -func ResetForTesting(usage func()) { - CommandLine = &FlagSet{ - name: os.Args[0], - errorHandling: ContinueOnError, - output: ioutil.Discard, - } - Usage = usage -} - -// GetCommandLine returns the default FlagSet. -func GetCommandLine() *FlagSet { - return CommandLine -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/flag_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/flag_test.go deleted file mode 100644 index e17b2aad8..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/flag_test.go +++ /dev/null @@ -1,874 +0,0 @@ -// Copyright 2009 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 pflag - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "reflect" - "sort" - "strings" - "testing" - "time" -) - -var ( - testBool = Bool("test_bool", false, "bool value") - testInt = Int("test_int", 0, "int value") - testInt64 = Int64("test_int64", 0, "int64 value") - testUint = Uint("test_uint", 0, "uint value") - testUint64 = Uint64("test_uint64", 0, "uint64 value") - testString = String("test_string", "0", "string value") - testFloat = Float64("test_float64", 0, "float64 value") - testDuration = Duration("test_duration", 0, "time.Duration value") - testOptionalInt = Int("test_optional_int", 0, "optional int value") - normalizeFlagNameInvocations = 0 -) - -func boolString(s string) string { - if s == "0" { - return "false" - } - return "true" -} - -func TestEverything(t *testing.T) { - m := make(map[string]*Flag) - desired := "0" - visitor := func(f *Flag) { - if len(f.Name) > 5 && f.Name[0:5] == "test_" { - m[f.Name] = f - ok := false - switch { - case f.Value.String() == desired: - ok = true - case f.Name == "test_bool" && f.Value.String() == boolString(desired): - ok = true - case f.Name == "test_duration" && f.Value.String() == desired+"s": - ok = true - } - if !ok { - t.Error("Visit: bad value", f.Value.String(), "for", f.Name) - } - } - } - VisitAll(visitor) - if len(m) != 9 { - t.Error("VisitAll misses some flags") - for k, v := range m { - t.Log(k, *v) - } - } - m = make(map[string]*Flag) - Visit(visitor) - if len(m) != 0 { - t.Errorf("Visit sees unset flags") - for k, v := range m { - t.Log(k, *v) - } - } - // Now set all flags - Set("test_bool", "true") - Set("test_int", "1") - Set("test_int64", "1") - Set("test_uint", "1") - Set("test_uint64", "1") - Set("test_string", "1") - Set("test_float64", "1") - Set("test_duration", "1s") - Set("test_optional_int", "1") - desired = "1" - Visit(visitor) - if len(m) != 9 { - t.Error("Visit fails after set") - for k, v := range m { - t.Log(k, *v) - } - } - // Now test they're visited in sort order. - var flagNames []string - Visit(func(f *Flag) { flagNames = append(flagNames, f.Name) }) - if !sort.StringsAreSorted(flagNames) { - t.Errorf("flag names not sorted: %v", flagNames) - } -} - -func TestUsage(t *testing.T) { - called := false - ResetForTesting(func() { called = true }) - if GetCommandLine().Parse([]string{"--x"}) == nil { - t.Error("parse did not fail for unknown flag") - } - if !called { - t.Error("did not call Usage for unknown flag") - } -} - -func TestAddFlagSet(t *testing.T) { - oldSet := NewFlagSet("old", ContinueOnError) - newSet := NewFlagSet("new", ContinueOnError) - - oldSet.String("flag1", "flag1", "flag1") - oldSet.String("flag2", "flag2", "flag2") - - newSet.String("flag2", "flag2", "flag2") - newSet.String("flag3", "flag3", "flag3") - - oldSet.AddFlagSet(newSet) - - if len(oldSet.formal) != 3 { - t.Errorf("Unexpected result adding a FlagSet to a FlagSet %v", oldSet) - } -} - -func TestAnnotation(t *testing.T) { - f := NewFlagSet("shorthand", ContinueOnError) - - if err := f.SetAnnotation("missing-flag", "key", nil); err == nil { - t.Errorf("Expected error setting annotation on non-existent flag") - } - - f.StringP("stringa", "a", "", "string value") - if err := f.SetAnnotation("stringa", "key", nil); err != nil { - t.Errorf("Unexpected error setting new nil annotation: %v", err) - } - if annotation := f.Lookup("stringa").Annotations["key"]; annotation != nil { - t.Errorf("Unexpected annotation: %v", annotation) - } - - f.StringP("stringb", "b", "", "string2 value") - if err := f.SetAnnotation("stringb", "key", []string{"value1"}); err != nil { - t.Errorf("Unexpected error setting new annotation: %v", err) - } - if annotation := f.Lookup("stringb").Annotations["key"]; !reflect.DeepEqual(annotation, []string{"value1"}) { - t.Errorf("Unexpected annotation: %v", annotation) - } - - if err := f.SetAnnotation("stringb", "key", []string{"value2"}); err != nil { - t.Errorf("Unexpected error updating annotation: %v", err) - } - if annotation := f.Lookup("stringb").Annotations["key"]; !reflect.DeepEqual(annotation, []string{"value2"}) { - t.Errorf("Unexpected annotation: %v", annotation) - } -} - -func testParse(f *FlagSet, t *testing.T) { - if f.Parsed() { - t.Error("f.Parse() = true before Parse") - } - boolFlag := f.Bool("bool", false, "bool value") - bool2Flag := f.Bool("bool2", false, "bool2 value") - bool3Flag := f.Bool("bool3", false, "bool3 value") - intFlag := f.Int("int", 0, "int value") - int8Flag := f.Int8("int8", 0, "int value") - int32Flag := f.Int32("int32", 0, "int value") - int64Flag := f.Int64("int64", 0, "int64 value") - uintFlag := f.Uint("uint", 0, "uint value") - uint8Flag := f.Uint8("uint8", 0, "uint value") - uint16Flag := f.Uint16("uint16", 0, "uint value") - uint32Flag := f.Uint32("uint32", 0, "uint value") - uint64Flag := f.Uint64("uint64", 0, "uint64 value") - stringFlag := f.String("string", "0", "string value") - float32Flag := f.Float32("float32", 0, "float32 value") - float64Flag := f.Float64("float64", 0, "float64 value") - ipFlag := f.IP("ip", net.ParseIP("127.0.0.1"), "ip value") - maskFlag := f.IPMask("mask", ParseIPv4Mask("0.0.0.0"), "mask value") - durationFlag := f.Duration("duration", 5*time.Second, "time.Duration value") - optionalIntNoValueFlag := f.Int("optional-int-no-value", 0, "int value") - f.Lookup("optional-int-no-value").NoOptDefVal = "9" - optionalIntWithValueFlag := f.Int("optional-int-with-value", 0, "int value") - f.Lookup("optional-int-no-value").NoOptDefVal = "9" - extra := "one-extra-argument" - args := []string{ - "--bool", - "--bool2=true", - "--bool3=false", - "--int=22", - "--int8=-8", - "--int32=-32", - "--int64=0x23", - "--uint", "24", - "--uint8=8", - "--uint16=16", - "--uint32=32", - "--uint64=25", - "--string=hello", - "--float32=-172e12", - "--float64=2718e28", - "--ip=10.11.12.13", - "--mask=255.255.255.0", - "--duration=2m", - "--optional-int-no-value", - "--optional-int-with-value=42", - extra, - } - if err := f.Parse(args); err != nil { - t.Fatal(err) - } - if !f.Parsed() { - t.Error("f.Parse() = false after Parse") - } - if *boolFlag != true { - t.Error("bool flag should be true, is ", *boolFlag) - } - if v, err := f.GetBool("bool"); err != nil || v != *boolFlag { - t.Error("GetBool does not work.") - } - if *bool2Flag != true { - t.Error("bool2 flag should be true, is ", *bool2Flag) - } - if *bool3Flag != false { - t.Error("bool3 flag should be false, is ", *bool2Flag) - } - if *intFlag != 22 { - t.Error("int flag should be 22, is ", *intFlag) - } - if v, err := f.GetInt("int"); err != nil || v != *intFlag { - t.Error("GetInt does not work.") - } - if *int8Flag != -8 { - t.Error("int8 flag should be 0x23, is ", *int8Flag) - } - if v, err := f.GetInt8("int8"); err != nil || v != *int8Flag { - t.Error("GetInt8 does not work.") - } - if *int32Flag != -32 { - t.Error("int32 flag should be 0x23, is ", *int32Flag) - } - if v, err := f.GetInt32("int32"); err != nil || v != *int32Flag { - t.Error("GetInt32 does not work.") - } - if *int64Flag != 0x23 { - t.Error("int64 flag should be 0x23, is ", *int64Flag) - } - if v, err := f.GetInt64("int64"); err != nil || v != *int64Flag { - t.Error("GetInt64 does not work.") - } - if *uintFlag != 24 { - t.Error("uint flag should be 24, is ", *uintFlag) - } - if v, err := f.GetUint("uint"); err != nil || v != *uintFlag { - t.Error("GetUint does not work.") - } - if *uint8Flag != 8 { - t.Error("uint8 flag should be 8, is ", *uint8Flag) - } - if v, err := f.GetUint8("uint8"); err != nil || v != *uint8Flag { - t.Error("GetUint8 does not work.") - } - if *uint16Flag != 16 { - t.Error("uint16 flag should be 16, is ", *uint16Flag) - } - if v, err := f.GetUint16("uint16"); err != nil || v != *uint16Flag { - t.Error("GetUint16 does not work.") - } - if *uint32Flag != 32 { - t.Error("uint32 flag should be 32, is ", *uint32Flag) - } - if v, err := f.GetUint32("uint32"); err != nil || v != *uint32Flag { - t.Error("GetUint32 does not work.") - } - if *uint64Flag != 25 { - t.Error("uint64 flag should be 25, is ", *uint64Flag) - } - if v, err := f.GetUint64("uint64"); err != nil || v != *uint64Flag { - t.Error("GetUint64 does not work.") - } - if *stringFlag != "hello" { - t.Error("string flag should be `hello`, is ", *stringFlag) - } - if v, err := f.GetString("string"); err != nil || v != *stringFlag { - t.Error("GetString does not work.") - } - if *float32Flag != -172e12 { - t.Error("float32 flag should be -172e12, is ", *float32Flag) - } - if v, err := f.GetFloat32("float32"); err != nil || v != *float32Flag { - t.Errorf("GetFloat32 returned %v but float32Flag was %v", v, *float32Flag) - } - if *float64Flag != 2718e28 { - t.Error("float64 flag should be 2718e28, is ", *float64Flag) - } - if v, err := f.GetFloat64("float64"); err != nil || v != *float64Flag { - t.Errorf("GetFloat64 returned %v but float64Flag was %v", v, *float64Flag) - } - if !(*ipFlag).Equal(net.ParseIP("10.11.12.13")) { - t.Error("ip flag should be 10.11.12.13, is ", *ipFlag) - } - if v, err := f.GetIP("ip"); err != nil || !v.Equal(*ipFlag) { - t.Errorf("GetIP returned %v but ipFlag was %v", v, *ipFlag) - } - if (*maskFlag).String() != ParseIPv4Mask("255.255.255.0").String() { - t.Error("mask flag should be 255.255.255.0, is ", (*maskFlag).String()) - } - if v, err := f.GetIPv4Mask("mask"); err != nil || v.String() != (*maskFlag).String() { - t.Errorf("GetIP returned %v maskFlag was %v error was %v", v, *maskFlag, err) - } - if *durationFlag != 2*time.Minute { - t.Error("duration flag should be 2m, is ", *durationFlag) - } - if v, err := f.GetDuration("duration"); err != nil || v != *durationFlag { - t.Error("GetDuration does not work.") - } - if _, err := f.GetInt("duration"); err == nil { - t.Error("GetInt parsed a time.Duration?!?!") - } - if *optionalIntNoValueFlag != 9 { - t.Error("optional int flag should be the default value, is ", *optionalIntNoValueFlag) - } - if *optionalIntWithValueFlag != 42 { - t.Error("optional int flag should be 42, is ", *optionalIntWithValueFlag) - } - if len(f.Args()) != 1 { - t.Error("expected one argument, got", len(f.Args())) - } else if f.Args()[0] != extra { - t.Errorf("expected argument %q got %q", extra, f.Args()[0]) - } -} - -func TestShorthand(t *testing.T) { - f := NewFlagSet("shorthand", ContinueOnError) - if f.Parsed() { - t.Error("f.Parse() = true before Parse") - } - boolaFlag := f.BoolP("boola", "a", false, "bool value") - boolbFlag := f.BoolP("boolb", "b", false, "bool2 value") - boolcFlag := f.BoolP("boolc", "c", false, "bool3 value") - booldFlag := f.BoolP("boold", "d", false, "bool4 value") - stringaFlag := f.StringP("stringa", "s", "0", "string value") - stringzFlag := f.StringP("stringz", "z", "0", "string value") - extra := "interspersed-argument" - notaflag := "--i-look-like-a-flag" - args := []string{ - "-ab", - extra, - "-cs", - "hello", - "-z=something", - "-d=true", - "--", - notaflag, - } - f.SetOutput(ioutil.Discard) - if err := f.Parse(args); err != nil { - t.Error("expected no error, got ", err) - } - if !f.Parsed() { - t.Error("f.Parse() = false after Parse") - } - if *boolaFlag != true { - t.Error("boola flag should be true, is ", *boolaFlag) - } - if *boolbFlag != true { - t.Error("boolb flag should be true, is ", *boolbFlag) - } - if *boolcFlag != true { - t.Error("boolc flag should be true, is ", *boolcFlag) - } - if *booldFlag != true { - t.Error("boold flag should be true, is ", *booldFlag) - } - if *stringaFlag != "hello" { - t.Error("stringa flag should be `hello`, is ", *stringaFlag) - } - if *stringzFlag != "something" { - t.Error("stringz flag should be `something`, is ", *stringzFlag) - } - if len(f.Args()) != 2 { - t.Error("expected one argument, got", len(f.Args())) - } else if f.Args()[0] != extra { - t.Errorf("expected argument %q got %q", extra, f.Args()[0]) - } else if f.Args()[1] != notaflag { - t.Errorf("expected argument %q got %q", notaflag, f.Args()[1]) - } - if f.ArgsLenAtDash() != 1 { - t.Errorf("expected argsLenAtDash %d got %d", f.ArgsLenAtDash(), 1) - } -} - -func TestParse(t *testing.T) { - ResetForTesting(func() { t.Error("bad parse") }) - testParse(GetCommandLine(), t) -} - -func TestFlagSetParse(t *testing.T) { - testParse(NewFlagSet("test", ContinueOnError), t) -} - -func TestChangedHelper(t *testing.T) { - f := NewFlagSet("changedtest", ContinueOnError) - _ = f.Bool("changed", false, "changed bool") - _ = f.Bool("settrue", true, "true to true") - _ = f.Bool("setfalse", false, "false to false") - _ = f.Bool("unchanged", false, "unchanged bool") - - args := []string{"--changed", "--settrue", "--setfalse=false"} - if err := f.Parse(args); err != nil { - t.Error("f.Parse() = false after Parse") - } - if !f.Changed("changed") { - t.Errorf("--changed wasn't changed!") - } - if !f.Changed("settrue") { - t.Errorf("--settrue wasn't changed!") - } - if !f.Changed("setfalse") { - t.Errorf("--setfalse wasn't changed!") - } - if f.Changed("unchanged") { - t.Errorf("--unchanged was changed!") - } - if f.Changed("invalid") { - t.Errorf("--invalid was changed!") - } - if f.ArgsLenAtDash() != -1 { - t.Errorf("Expected argsLenAtDash: %d but got %d", -1, f.ArgsLenAtDash()) - } -} - -func replaceSeparators(name string, from []string, to string) string { - result := name - for _, sep := range from { - result = strings.Replace(result, sep, to, -1) - } - // Type convert to indicate normalization has been done. - return result -} - -func wordSepNormalizeFunc(f *FlagSet, name string) NormalizedName { - seps := []string{"-", "_"} - name = replaceSeparators(name, seps, ".") - normalizeFlagNameInvocations++ - - return NormalizedName(name) -} - -func testWordSepNormalizedNames(args []string, t *testing.T) { - f := NewFlagSet("normalized", ContinueOnError) - if f.Parsed() { - t.Error("f.Parse() = true before Parse") - } - withDashFlag := f.Bool("with-dash-flag", false, "bool value") - // Set this after some flags have been added and before others. - f.SetNormalizeFunc(wordSepNormalizeFunc) - withUnderFlag := f.Bool("with_under_flag", false, "bool value") - withBothFlag := f.Bool("with-both_flag", false, "bool value") - if err := f.Parse(args); err != nil { - t.Fatal(err) - } - if !f.Parsed() { - t.Error("f.Parse() = false after Parse") - } - if *withDashFlag != true { - t.Error("withDashFlag flag should be true, is ", *withDashFlag) - } - if *withUnderFlag != true { - t.Error("withUnderFlag flag should be true, is ", *withUnderFlag) - } - if *withBothFlag != true { - t.Error("withBothFlag flag should be true, is ", *withBothFlag) - } -} - -func TestWordSepNormalizedNames(t *testing.T) { - args := []string{ - "--with-dash-flag", - "--with-under-flag", - "--with-both-flag", - } - testWordSepNormalizedNames(args, t) - - args = []string{ - "--with_dash_flag", - "--with_under_flag", - "--with_both_flag", - } - testWordSepNormalizedNames(args, t) - - args = []string{ - "--with-dash_flag", - "--with-under_flag", - "--with-both_flag", - } - testWordSepNormalizedNames(args, t) -} - -func aliasAndWordSepFlagNames(f *FlagSet, name string) NormalizedName { - seps := []string{"-", "_"} - - oldName := replaceSeparators("old-valid_flag", seps, ".") - newName := replaceSeparators("valid-flag", seps, ".") - - name = replaceSeparators(name, seps, ".") - switch name { - case oldName: - name = newName - break - } - - return NormalizedName(name) -} - -func TestCustomNormalizedNames(t *testing.T) { - f := NewFlagSet("normalized", ContinueOnError) - if f.Parsed() { - t.Error("f.Parse() = true before Parse") - } - - validFlag := f.Bool("valid-flag", false, "bool value") - f.SetNormalizeFunc(aliasAndWordSepFlagNames) - someOtherFlag := f.Bool("some-other-flag", false, "bool value") - - args := []string{"--old_valid_flag", "--some-other_flag"} - if err := f.Parse(args); err != nil { - t.Fatal(err) - } - - if *validFlag != true { - t.Errorf("validFlag is %v even though we set the alias --old_valid_falg", *validFlag) - } - if *someOtherFlag != true { - t.Error("someOtherFlag should be true, is ", *someOtherFlag) - } -} - -// Every flag we add, the name (displayed also in usage) should normalized -func TestNormalizationFuncShouldChangeFlagName(t *testing.T) { - // Test normalization after addition - f := NewFlagSet("normalized", ContinueOnError) - - f.Bool("valid_flag", false, "bool value") - if f.Lookup("valid_flag").Name != "valid_flag" { - t.Error("The new flag should have the name 'valid_flag' instead of ", f.Lookup("valid_flag").Name) - } - - f.SetNormalizeFunc(wordSepNormalizeFunc) - if f.Lookup("valid_flag").Name != "valid.flag" { - t.Error("The new flag should have the name 'valid.flag' instead of ", f.Lookup("valid_flag").Name) - } - - // Test normalization before addition - f = NewFlagSet("normalized", ContinueOnError) - f.SetNormalizeFunc(wordSepNormalizeFunc) - - f.Bool("valid_flag", false, "bool value") - if f.Lookup("valid_flag").Name != "valid.flag" { - t.Error("The new flag should have the name 'valid.flag' instead of ", f.Lookup("valid_flag").Name) - } -} - -// Declare a user-defined flag type. -type flagVar []string - -func (f *flagVar) String() string { - return fmt.Sprint([]string(*f)) -} - -func (f *flagVar) Set(value string) error { - *f = append(*f, value) - return nil -} - -func (f *flagVar) Type() string { - return "flagVar" -} - -func TestUserDefined(t *testing.T) { - var flags FlagSet - flags.Init("test", ContinueOnError) - var v flagVar - flags.VarP(&v, "v", "v", "usage") - if err := flags.Parse([]string{"--v=1", "-v2", "-v", "3"}); err != nil { - t.Error(err) - } - if len(v) != 3 { - t.Fatal("expected 3 args; got ", len(v)) - } - expect := "[1 2 3]" - if v.String() != expect { - t.Errorf("expected value %q got %q", expect, v.String()) - } -} - -func TestSetOutput(t *testing.T) { - var flags FlagSet - var buf bytes.Buffer - flags.SetOutput(&buf) - flags.Init("test", ContinueOnError) - flags.Parse([]string{"--unknown"}) - if out := buf.String(); !strings.Contains(out, "--unknown") { - t.Logf("expected output mentioning unknown; got %q", out) - } -} - -// This tests that one can reset the flags. This still works but not well, and is -// superseded by FlagSet. -func TestChangingArgs(t *testing.T) { - ResetForTesting(func() { t.Fatal("bad parse") }) - oldArgs := os.Args - defer func() { os.Args = oldArgs }() - os.Args = []string{"cmd", "--before", "subcmd"} - before := Bool("before", false, "") - if err := GetCommandLine().Parse(os.Args[1:]); err != nil { - t.Fatal(err) - } - cmd := Arg(0) - os.Args = []string{"subcmd", "--after", "args"} - after := Bool("after", false, "") - Parse() - args := Args() - - if !*before || cmd != "subcmd" || !*after || len(args) != 1 || args[0] != "args" { - t.Fatalf("expected true subcmd true [args] got %v %v %v %v", *before, cmd, *after, args) - } -} - -// Test that -help invokes the usage message and returns ErrHelp. -func TestHelp(t *testing.T) { - var helpCalled = false - fs := NewFlagSet("help test", ContinueOnError) - fs.Usage = func() { helpCalled = true } - var flag bool - fs.BoolVar(&flag, "flag", false, "regular flag") - // Regular flag invocation should work - err := fs.Parse([]string{"--flag=true"}) - if err != nil { - t.Fatal("expected no error; got ", err) - } - if !flag { - t.Error("flag was not set by --flag") - } - if helpCalled { - t.Error("help called for regular flag") - helpCalled = false // reset for next test - } - // Help flag should work as expected. - err = fs.Parse([]string{"--help"}) - if err == nil { - t.Fatal("error expected") - } - if err != ErrHelp { - t.Fatal("expected ErrHelp; got ", err) - } - if !helpCalled { - t.Fatal("help was not called") - } - // If we define a help flag, that should override. - var help bool - fs.BoolVar(&help, "help", false, "help flag") - helpCalled = false - err = fs.Parse([]string{"--help"}) - if err != nil { - t.Fatal("expected no error for defined --help; got ", err) - } - if helpCalled { - t.Fatal("help was called; should not have been for defined help flag") - } -} - -func TestNoInterspersed(t *testing.T) { - f := NewFlagSet("test", ContinueOnError) - f.SetInterspersed(false) - f.Bool("true", true, "always true") - f.Bool("false", false, "always false") - err := f.Parse([]string{"--true", "break", "--false"}) - if err != nil { - t.Fatal("expected no error; got ", err) - } - args := f.Args() - if len(args) != 2 || args[0] != "break" || args[1] != "--false" { - t.Fatal("expected interspersed options/non-options to fail") - } -} - -func TestTermination(t *testing.T) { - f := NewFlagSet("termination", ContinueOnError) - boolFlag := f.BoolP("bool", "l", false, "bool value") - if f.Parsed() { - t.Error("f.Parse() = true before Parse") - } - arg1 := "ls" - arg2 := "-l" - args := []string{ - "--", - arg1, - arg2, - } - f.SetOutput(ioutil.Discard) - if err := f.Parse(args); err != nil { - t.Fatal("expected no error; got ", err) - } - if !f.Parsed() { - t.Error("f.Parse() = false after Parse") - } - if *boolFlag { - t.Error("expected boolFlag=false, got true") - } - if len(f.Args()) != 2 { - t.Errorf("expected 2 arguments, got %d: %v", len(f.Args()), f.Args()) - } - if f.Args()[0] != arg1 { - t.Errorf("expected argument %q got %q", arg1, f.Args()[0]) - } - if f.Args()[1] != arg2 { - t.Errorf("expected argument %q got %q", arg2, f.Args()[1]) - } - if f.ArgsLenAtDash() != 0 { - t.Errorf("expected argsLenAtDash %d got %d", 0, f.ArgsLenAtDash()) - } -} - -func TestDeprecatedFlagInDocs(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - f.Bool("badflag", true, "always true") - f.MarkDeprecated("badflag", "use --good-flag instead") - - out := new(bytes.Buffer) - f.SetOutput(out) - f.PrintDefaults() - - if strings.Contains(out.String(), "badflag") { - t.Errorf("found deprecated flag in usage!") - } -} - -func TestDeprecatedFlagShorthandInDocs(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - name := "noshorthandflag" - f.BoolP(name, "n", true, "always true") - f.MarkShorthandDeprecated("noshorthandflag", fmt.Sprintf("use --%s instead", name)) - - out := new(bytes.Buffer) - f.SetOutput(out) - f.PrintDefaults() - - if strings.Contains(out.String(), "-n,") { - t.Errorf("found deprecated flag shorthand in usage!") - } -} - -func parseReturnStderr(t *testing.T, f *FlagSet, args []string) (string, error) { - oldStderr := os.Stderr - r, w, _ := os.Pipe() - os.Stderr = w - - err := f.Parse(args) - - outC := make(chan string) - // copy the output in a separate goroutine so printing can't block indefinitely - go func() { - var buf bytes.Buffer - io.Copy(&buf, r) - outC <- buf.String() - }() - - w.Close() - os.Stderr = oldStderr - out := <-outC - - return out, err -} - -func TestDeprecatedFlagUsage(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - f.Bool("badflag", true, "always true") - usageMsg := "use --good-flag instead" - f.MarkDeprecated("badflag", usageMsg) - - args := []string{"--badflag"} - out, err := parseReturnStderr(t, f, args) - if err != nil { - t.Fatal("expected no error; got ", err) - } - - if !strings.Contains(out, usageMsg) { - t.Errorf("usageMsg not printed when using a deprecated flag!") - } -} - -func TestDeprecatedFlagShorthandUsage(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - name := "noshorthandflag" - f.BoolP(name, "n", true, "always true") - usageMsg := fmt.Sprintf("use --%s instead", name) - f.MarkShorthandDeprecated(name, usageMsg) - - args := []string{"-n"} - out, err := parseReturnStderr(t, f, args) - if err != nil { - t.Fatal("expected no error; got ", err) - } - - if !strings.Contains(out, usageMsg) { - t.Errorf("usageMsg not printed when using a deprecated flag!") - } -} - -func TestDeprecatedFlagUsageNormalized(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - f.Bool("bad-double_flag", true, "always true") - f.SetNormalizeFunc(wordSepNormalizeFunc) - usageMsg := "use --good-flag instead" - f.MarkDeprecated("bad_double-flag", usageMsg) - - args := []string{"--bad_double_flag"} - out, err := parseReturnStderr(t, f, args) - if err != nil { - t.Fatal("expected no error; got ", err) - } - - if !strings.Contains(out, usageMsg) { - t.Errorf("usageMsg not printed when using a deprecated flag!") - } -} - -// Name normalization function should be called only once on flag addition -func TestMultipleNormalizeFlagNameInvocations(t *testing.T) { - normalizeFlagNameInvocations = 0 - - f := NewFlagSet("normalized", ContinueOnError) - f.SetNormalizeFunc(wordSepNormalizeFunc) - f.Bool("with_under_flag", false, "bool value") - - if normalizeFlagNameInvocations != 1 { - t.Fatal("Expected normalizeFlagNameInvocations to be 1; got ", normalizeFlagNameInvocations) - } -} - -// -func TestHiddenFlagInUsage(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - f.Bool("secretFlag", true, "shhh") - f.MarkHidden("secretFlag") - - out := new(bytes.Buffer) - f.SetOutput(out) - f.PrintDefaults() - - if strings.Contains(out.String(), "secretFlag") { - t.Errorf("found hidden flag in usage!") - } -} - -// -func TestHiddenFlagUsage(t *testing.T) { - f := NewFlagSet("bob", ContinueOnError) - f.Bool("secretFlag", true, "shhh") - f.MarkHidden("secretFlag") - - args := []string{"--secretFlag"} - out, err := parseReturnStderr(t, f, args) - if err != nil { - t.Fatal("expected no error; got ", err) - } - - if strings.Contains(out, "shhh") { - t.Errorf("usage message printed when using a hidden flag!") - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/golangflag_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/golangflag_test.go deleted file mode 100644 index 77e2d7d80..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/golangflag_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2009 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 pflag - -import ( - goflag "flag" - "testing" -) - -func TestGoflags(t *testing.T) { - goflag.String("stringFlag", "stringFlag", "stringFlag") - goflag.Bool("boolFlag", false, "boolFlag") - - f := NewFlagSet("test", ContinueOnError) - - f.AddGoFlagSet(goflag.CommandLine) - err := f.Parse([]string{"--stringFlag=bob", "--boolFlag"}) - if err != nil { - t.Fatal("expected no error; get", err) - } - - getString, err := f.GetString("stringFlag") - if err != nil { - t.Fatal("expected no error; get", err) - } - if getString != "bob" { - t.Fatalf("expected getString=bob but got getString=%s", getString) - } - - getBool, err := f.GetBool("boolFlag") - if err != nil { - t.Fatal("expected no error; get", err) - } - if getBool != true { - t.Fatalf("expected getBool=true but got getBool=%v", getBool) - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/int_slice_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/int_slice_test.go deleted file mode 100644 index 5f2eee66a..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/int_slice_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2009 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 pflag - -import ( - "fmt" - "strconv" - "strings" - "testing" -) - -func setUpISFlagSet(isp *[]int) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.IntSliceVar(isp, "is", []int{}, "Command separated list!") - return f -} - -func setUpISFlagSetWithDefault(isp *[]int) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.IntSliceVar(isp, "is", []int{0, 1}, "Command separated list!") - return f -} - -func TestEmptyIS(t *testing.T) { - var is []int - f := setUpISFlagSet(&is) - err := f.Parse([]string{}) - if err != nil { - t.Fatal("expected no error; got", err) - } - - getIS, err := f.GetIntSlice("is") - if err != nil { - t.Fatal("got an error from GetIntSlice():", err) - } - if len(getIS) != 0 { - t.Fatalf("got is %v with len=%d but expected length=0", getIS, len(getIS)) - } -} - -func TestIS(t *testing.T) { - var is []int - f := setUpISFlagSet(&is) - - vals := []string{"1", "2", "4", "3"} - arg := fmt.Sprintf("--is=%s", strings.Join(vals, ",")) - err := f.Parse([]string{arg}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range is { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatalf("got error: %v", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %s but got: %d", i, vals[i], v) - } - } - getIS, err := f.GetIntSlice("is") - for i, v := range getIS { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatalf("got error: %v", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %s but got: %d from GetIntSlice", i, vals[i], v) - } - } -} - -func TestISDefault(t *testing.T) { - var is []int - f := setUpISFlagSetWithDefault(&is) - - vals := []string{"0", "1"} - - err := f.Parse([]string{}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range is { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatalf("got error: %v", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %d but got: %d", i, d, v) - } - } - - getIS, err := f.GetIntSlice("is") - if err != nil { - t.Fatal("got an error from GetIntSlice():", err) - } - for i, v := range getIS { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatal("got an error from GetIntSlice():", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %d from GetIntSlice but got: %d", i, d, v) - } - } -} - -func TestISWithDefault(t *testing.T) { - var is []int - f := setUpISFlagSetWithDefault(&is) - - vals := []string{"1", "2"} - arg := fmt.Sprintf("--is=%s", strings.Join(vals, ",")) - err := f.Parse([]string{arg}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range is { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatalf("got error: %v", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %d but got: %d", i, d, v) - } - } - - getIS, err := f.GetIntSlice("is") - if err != nil { - t.Fatal("got an error from GetIntSlice():", err) - } - for i, v := range getIS { - d, err := strconv.Atoi(vals[i]) - if err != nil { - t.Fatalf("got error: %v", err) - } - if d != v { - t.Fatalf("expected is[%d] to be %d from GetIntSlice but got: %d", i, d, v) - } - } -} - -func TestISCalledTwice(t *testing.T) { - var is []int - f := setUpISFlagSet(&is) - - in := []string{"1,2", "3"} - expected := []int{1, 2, 3} - argfmt := "--is=%s" - arg1 := fmt.Sprintf(argfmt, in[0]) - arg2 := fmt.Sprintf(argfmt, in[1]) - err := f.Parse([]string{arg1, arg2}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range is { - if expected[i] != v { - t.Fatalf("expected is[%d] to be %d but got: %d", i, expected[i], v) - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/ip_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/ip_test.go deleted file mode 100644 index 1fec50e42..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/ip_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package pflag - -import ( - "fmt" - "net" - "os" - "testing" -) - -func setUpIP(ip *net.IP) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.IPVar(ip, "address", net.ParseIP("0.0.0.0"), "IP Address") - return f -} - -func TestIP(t *testing.T) { - testCases := []struct { - input string - success bool - expected string - }{ - {"0.0.0.0", true, "0.0.0.0"}, - {" 0.0.0.0 ", true, "0.0.0.0"}, - {"1.2.3.4", true, "1.2.3.4"}, - {"127.0.0.1", true, "127.0.0.1"}, - {"255.255.255.255", true, "255.255.255.255"}, - {"", false, ""}, - {"0", false, ""}, - {"localhost", false, ""}, - {"0.0.0", false, ""}, - {"0.0.0.", false, ""}, - {"0.0.0.0.", false, ""}, - {"0.0.0.256", false, ""}, - {"0 . 0 . 0 . 0", false, ""}, - } - - devnull, _ := os.Open(os.DevNull) - os.Stderr = devnull - for i := range testCases { - var addr net.IP - f := setUpIP(&addr) - - tc := &testCases[i] - - arg := fmt.Sprintf("--address=%s", tc.input) - err := f.Parse([]string{arg}) - if err != nil && tc.success == true { - t.Errorf("expected success, got %q", err) - continue - } else if err == nil && tc.success == false { - t.Errorf("expected failure") - continue - } else if tc.success { - ip, err := f.GetIP("address") - if err != nil { - t.Errorf("Got error trying to fetch the IP flag: %v", err) - } - if ip.String() != tc.expected { - t.Errorf("expected %q, got %q", tc.expected, ip.String()) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/ipnet_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/ipnet_test.go deleted file mode 100644 index 335b6fa15..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/ipnet_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package pflag - -import ( - "fmt" - "net" - "os" - "testing" -) - -func setUpIPNet(ip *net.IPNet) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - _, def, _ := net.ParseCIDR("0.0.0.0/0") - f.IPNetVar(ip, "address", *def, "IP Address") - return f -} - -func TestIPNet(t *testing.T) { - testCases := []struct { - input string - success bool - expected string - }{ - {"0.0.0.0/0", true, "0.0.0.0/0"}, - {" 0.0.0.0/0 ", true, "0.0.0.0/0"}, - {"1.2.3.4/8", true, "1.0.0.0/8"}, - {"127.0.0.1/16", true, "127.0.0.0/16"}, - {"255.255.255.255/19", true, "255.255.224.0/19"}, - {"255.255.255.255/32", true, "255.255.255.255/32"}, - {"", false, ""}, - {"/0", false, ""}, - {"0", false, ""}, - {"0/0", false, ""}, - {"localhost/0", false, ""}, - {"0.0.0/4", false, ""}, - {"0.0.0./8", false, ""}, - {"0.0.0.0./12", false, ""}, - {"0.0.0.256/16", false, ""}, - {"0.0.0.0 /20", false, ""}, - {"0.0.0.0/ 24", false, ""}, - {"0 . 0 . 0 . 0 / 28", false, ""}, - {"0.0.0.0/33", false, ""}, - } - - devnull, _ := os.Open(os.DevNull) - os.Stderr = devnull - for i := range testCases { - var addr net.IPNet - f := setUpIPNet(&addr) - - tc := &testCases[i] - - arg := fmt.Sprintf("--address=%s", tc.input) - err := f.Parse([]string{arg}) - if err != nil && tc.success == true { - t.Errorf("expected success, got %q", err) - continue - } else if err == nil && tc.success == false { - t.Errorf("expected failure") - continue - } else if tc.success { - ip, err := f.GetIPNet("address") - if err != nil { - t.Errorf("Got error trying to fetch the IP flag: %v", err) - } - if ip.String() != tc.expected { - t.Errorf("expected %q, got %q", tc.expected, ip.String()) - } - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/string_slice_test.go b/Godeps/_workspace/src/github.com/spf13/pflag/string_slice_test.go deleted file mode 100644 index c7fdc70b4..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/string_slice_test.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2009 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 pflag - -import ( - "fmt" - "strings" - "testing" -) - -func setUpSSFlagSet(ssp *[]string) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.StringSliceVar(ssp, "ss", []string{}, "Command separated list!") - return f -} - -func setUpSSFlagSetWithDefault(ssp *[]string) *FlagSet { - f := NewFlagSet("test", ContinueOnError) - f.StringSliceVar(ssp, "ss", []string{"default", "values"}, "Command separated list!") - return f -} - -func TestEmptySS(t *testing.T) { - var ss []string - f := setUpSSFlagSet(&ss) - err := f.Parse([]string{}) - if err != nil { - t.Fatal("expected no error; got", err) - } - - getSS, err := f.GetStringSlice("ss") - if err != nil { - t.Fatal("got an error from GetStringSlice():", err) - } - if len(getSS) != 0 { - t.Fatalf("got ss %v with len=%d but expected length=0", getSS, len(getSS)) - } -} - -func TestSS(t *testing.T) { - var ss []string - f := setUpSSFlagSet(&ss) - - vals := []string{"one", "two", "4", "3"} - arg := fmt.Sprintf("--ss=%s", strings.Join(vals, ",")) - err := f.Parse([]string{arg}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range ss { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s but got: %s", i, vals[i], v) - } - } - - getSS, err := f.GetStringSlice("ss") - if err != nil { - t.Fatal("got an error from GetStringSlice():", err) - } - for i, v := range getSS { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s from GetStringSlice but got: %s", i, vals[i], v) - } - } -} - -func TestSSDefault(t *testing.T) { - var ss []string - f := setUpSSFlagSetWithDefault(&ss) - - vals := []string{"default", "values"} - - err := f.Parse([]string{}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range ss { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s but got: %s", i, vals[i], v) - } - } - - getSS, err := f.GetStringSlice("ss") - if err != nil { - t.Fatal("got an error from GetStringSlice():", err) - } - for i, v := range getSS { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s from GetStringSlice but got: %s", i, vals[i], v) - } - } -} - -func TestSSWithDefault(t *testing.T) { - var ss []string - f := setUpSSFlagSetWithDefault(&ss) - - vals := []string{"one", "two", "4", "3"} - arg := fmt.Sprintf("--ss=%s", strings.Join(vals, ",")) - err := f.Parse([]string{arg}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range ss { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s but got: %s", i, vals[i], v) - } - } - - getSS, err := f.GetStringSlice("ss") - if err != nil { - t.Fatal("got an error from GetStringSlice():", err) - } - for i, v := range getSS { - if vals[i] != v { - t.Fatalf("expected ss[%d] to be %s from GetStringSlice but got: %s", i, vals[i], v) - } - } -} - -func TestSSCalledTwice(t *testing.T) { - var ss []string - f := setUpSSFlagSet(&ss) - - in := []string{"one,two", "three"} - expected := []string{"one", "two", "three"} - argfmt := "--ss=%s" - arg1 := fmt.Sprintf(argfmt, in[0]) - arg2 := fmt.Sprintf(argfmt, in[1]) - err := f.Parse([]string{arg1, arg2}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range ss { - if expected[i] != v { - t.Fatalf("expected ss[%d] to be %s but got: %s", i, expected[i], v) - } - } -} - -func TestSSWithComma(t *testing.T) { - var ss []string - f := setUpSSFlagSet(&ss) - - in := []string{`"one,two"`, `"three"`} - expected := []string{"one,two", "three"} - argfmt := "--ss=%s" - arg1 := fmt.Sprintf(argfmt, in[0]) - arg2 := fmt.Sprintf(argfmt, in[1]) - err := f.Parse([]string{arg1, arg2}) - if err != nil { - t.Fatal("expected no error; got", err) - } - for i, v := range ss { - if expected[i] != v { - t.Fatalf("expected ss[%d] to be %s but got: %s", i, expected[i], v) - } - } -} diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/verify/all.sh b/Godeps/_workspace/src/github.com/spf13/pflag/verify/all.sh deleted file mode 100644 index 739f89c0b..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/verify/all.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -ROOT=$(dirname "${BASH_SOURCE}")/.. - -# Some useful colors. -if [[ -z "${color_start-}" ]]; then - declare -r color_start="\033[" - declare -r color_red="${color_start}0;31m" - declare -r color_yellow="${color_start}0;33m" - declare -r color_green="${color_start}0;32m" - declare -r color_norm="${color_start}0m" -fi - -SILENT=true - -function is-excluded { - for e in $EXCLUDE; do - if [[ $1 -ef ${BASH_SOURCE} ]]; then - return - fi - if [[ $1 -ef "$ROOT/hack/$e" ]]; then - return - fi - done - return 1 -} - -while getopts ":v" opt; do - case $opt in - v) - SILENT=false - ;; - \?) - echo "Invalid flag: -$OPTARG" >&2 - exit 1 - ;; - esac -done - -if $SILENT ; then - echo "Running in the silent mode, run with -v if you want to see script logs." -fi - -EXCLUDE="all.sh" - -ret=0 -for t in `ls $ROOT/verify/*.sh` -do - if is-excluded $t ; then - echo "Skipping $t" - continue - fi - if $SILENT ; then - echo -e "Verifying $t" - if bash "$t" &> /dev/null; then - echo -e "${color_green}SUCCESS${color_norm}" - else - echo -e "${color_red}FAILED${color_norm}" - ret=1 - fi - else - bash "$t" || ret=1 - fi -done -exit $ret diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/verify/gofmt.sh b/Godeps/_workspace/src/github.com/spf13/pflag/verify/gofmt.sh deleted file mode 100644 index f66acf803..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/verify/gofmt.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -ROOT=$(dirname "${BASH_SOURCE}")/.. - -pushd "${ROOT}" > /dev/null - -GOFMT=${GOFMT:-"gofmt"} -bad_files=$(find . -name '*.go' | xargs $GOFMT -s -l) -if [[ -n "${bad_files}" ]]; then - echo "!!! '$GOFMT' needs to be run on the following files: " - echo "${bad_files}" - exit 1 -fi - -# ex: ts=2 sw=2 et filetype=sh diff --git a/Godeps/_workspace/src/github.com/spf13/pflag/verify/golint.sh b/Godeps/_workspace/src/github.com/spf13/pflag/verify/golint.sh deleted file mode 100644 index 685c1778e..000000000 --- a/Godeps/_workspace/src/github.com/spf13/pflag/verify/golint.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -ROOT=$(dirname "${BASH_SOURCE}")/.. -GOLINT=${GOLINT:-"golint"} - -pushd "${ROOT}" > /dev/null - bad_files=$($GOLINT -min_confidence=0.9 ./...) - if [[ -n "${bad_files}" ]]; then - echo "!!! '$GOLINT' problems: " - echo "${bad_files}" - exit 1 - fi -popd > /dev/null - -# ex: ts=2 sw=2 et filetype=sh diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/cbor_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/cbor_test.go deleted file mode 100644 index 205dffa7d..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/cbor_test.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "bufio" - "bytes" - "encoding/hex" - "math" - "os" - "regexp" - "strings" - "testing" -) - -func TestCborIndefiniteLength(t *testing.T) { - oldMapType := testCborH.MapType - defer func() { - testCborH.MapType = oldMapType - }() - testCborH.MapType = testMapStrIntfTyp - // var ( - // M1 map[string][]byte - // M2 map[uint64]bool - // L1 []interface{} - // S1 []string - // B1 []byte - // ) - var v, vv interface{} - // define it (v), encode it using indefinite lengths, decode it (vv), compare v to vv - v = map[string]interface{}{ - "one-byte-key": []byte{1, 2, 3, 4, 5, 6}, - "two-string-key": "two-value", - "three-list-key": []interface{}{true, false, uint64(1), int64(-1)}, - } - var buf bytes.Buffer - // buf.Reset() - e := NewEncoder(&buf, testCborH) - buf.WriteByte(cborBdIndefiniteMap) - //---- - buf.WriteByte(cborBdIndefiniteString) - e.MustEncode("one-") - e.MustEncode("byte-") - e.MustEncode("key") - buf.WriteByte(cborBdBreak) - - buf.WriteByte(cborBdIndefiniteBytes) - e.MustEncode([]byte{1, 2, 3}) - e.MustEncode([]byte{4, 5, 6}) - buf.WriteByte(cborBdBreak) - - //---- - buf.WriteByte(cborBdIndefiniteString) - e.MustEncode("two-") - e.MustEncode("string-") - e.MustEncode("key") - buf.WriteByte(cborBdBreak) - - buf.WriteByte(cborBdIndefiniteString) - e.MustEncode([]byte("two-")) // encode as bytes, to check robustness of code - e.MustEncode([]byte("value")) - buf.WriteByte(cborBdBreak) - - //---- - buf.WriteByte(cborBdIndefiniteString) - e.MustEncode("three-") - e.MustEncode("list-") - e.MustEncode("key") - buf.WriteByte(cborBdBreak) - - buf.WriteByte(cborBdIndefiniteArray) - e.MustEncode(true) - e.MustEncode(false) - e.MustEncode(uint64(1)) - e.MustEncode(int64(-1)) - buf.WriteByte(cborBdBreak) - - buf.WriteByte(cborBdBreak) // close map - - NewDecoderBytes(buf.Bytes(), testCborH).MustDecode(&vv) - if err := deepEqual(v, vv); err != nil { - logT(t, "-------- Before and After marshal do not match: Error: %v", err) - logT(t, " ....... GOLDEN: (%T) %#v", v, v) - logT(t, " ....... DECODED: (%T) %#v", vv, vv) - failT(t) - } -} - -type testCborGolden struct { - Base64 string `codec:"cbor"` - Hex string `codec:"hex"` - Roundtrip bool `codec:"roundtrip"` - Decoded interface{} `codec:"decoded"` - Diagnostic string `codec:"diagnostic"` - Skip bool `codec:"skip"` -} - -// Some tests are skipped because they include numbers outside the range of int64/uint64 -func doTestCborGoldens(t *testing.T) { - oldMapType := testCborH.MapType - defer func() { - testCborH.MapType = oldMapType - }() - testCborH.MapType = testMapStrIntfTyp - // decode test-cbor-goldens.json into a list of []*testCborGolden - // for each one, - // - decode hex into []byte bs - // - decode bs into interface{} v - // - compare both using deepequal - // - for any miss, record it - var gs []*testCborGolden - f, err := os.Open("test-cbor-goldens.json") - if err != nil { - logT(t, "error opening test-cbor-goldens.json: %v", err) - failT(t) - } - defer f.Close() - jh := new(JsonHandle) - jh.MapType = testMapStrIntfTyp - // d := NewDecoder(f, jh) - d := NewDecoder(bufio.NewReader(f), jh) - // err = d.Decode(&gs) - d.MustDecode(&gs) - if err != nil { - logT(t, "error json decoding test-cbor-goldens.json: %v", err) - failT(t) - } - - tagregex := regexp.MustCompile(`[\d]+\(.+?\)`) - hexregex := regexp.MustCompile(`h'([0-9a-fA-F]*)'`) - for i, g := range gs { - // fmt.Printf("%v, skip: %v, isTag: %v, %s\n", i, g.Skip, tagregex.MatchString(g.Diagnostic), g.Diagnostic) - // skip tags or simple or those with prefix, as we can't verify them. - if g.Skip || strings.HasPrefix(g.Diagnostic, "simple(") || tagregex.MatchString(g.Diagnostic) { - // fmt.Printf("%v: skipped\n", i) - logT(t, "[%v] skipping because skip=true OR unsupported simple value or Tag Value", i) - continue - } - // println("++++++++++++", i, "g.Diagnostic", g.Diagnostic) - if hexregex.MatchString(g.Diagnostic) { - // println(i, "g.Diagnostic matched hex") - if s2 := g.Diagnostic[2 : len(g.Diagnostic)-1]; s2 == "" { - g.Decoded = zeroByteSlice - } else if bs2, err2 := hex.DecodeString(s2); err2 == nil { - g.Decoded = bs2 - } - // fmt.Printf("%v: hex: %v\n", i, g.Decoded) - } - bs, err := hex.DecodeString(g.Hex) - if err != nil { - logT(t, "[%v] error hex decoding %s [%v]: %v", i, g.Hex, err) - failT(t) - } - var v interface{} - NewDecoderBytes(bs, testCborH).MustDecode(&v) - if _, ok := v.(RawExt); ok { - continue - } - // check the diagnostics to compare - switch g.Diagnostic { - case "Infinity": - b := math.IsInf(v.(float64), 1) - testCborError(t, i, math.Inf(1), v, nil, &b) - case "-Infinity": - b := math.IsInf(v.(float64), -1) - testCborError(t, i, math.Inf(-1), v, nil, &b) - case "NaN": - // println(i, "checking NaN") - b := math.IsNaN(v.(float64)) - testCborError(t, i, math.NaN(), v, nil, &b) - case "undefined": - b := v == nil - testCborError(t, i, nil, v, nil, &b) - default: - v0 := g.Decoded - // testCborCoerceJsonNumber(reflect.ValueOf(&v0)) - testCborError(t, i, v0, v, deepEqual(v0, v), nil) - } - } -} - -func testCborError(t *testing.T, i int, v0, v1 interface{}, err error, equal *bool) { - if err == nil && equal == nil { - // fmt.Printf("%v testCborError passed (err and equal nil)\n", i) - return - } - if err != nil { - logT(t, "[%v] deepEqual error: %v", i, err) - logT(t, " ....... GOLDEN: (%T) %#v", v0, v0) - logT(t, " ....... DECODED: (%T) %#v", v1, v1) - failT(t) - } - if equal != nil && !*equal { - logT(t, "[%v] values not equal", i) - logT(t, " ....... GOLDEN: (%T) %#v", v0, v0) - logT(t, " ....... DECODED: (%T) %#v", v1, v1) - failT(t) - } - // fmt.Printf("%v testCborError passed (checks passed)\n", i) -} - -func TestCborGoldens(t *testing.T) { - doTestCborGoldens(t) -} diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/codec_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/codec_test.go deleted file mode 100644 index 33bbed723..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/codec_test.go +++ /dev/null @@ -1,1459 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// Test works by using a slice of interfaces. -// It can test for encoding/decoding into/from a nil interface{} -// or passing the object to encode/decode into. -// -// There are basically 2 main tests here. -// First test internally encodes and decodes things and verifies that -// the artifact was as expected. -// Second test will use python msgpack to create a bunch of golden files, -// read those files, and compare them to what it should be. It then -// writes those files back out and compares the byte streams. -// -// Taken together, the tests are pretty extensive. -// -// The following manual tests must be done: -// - TestCodecUnderlyingType - -import ( - "bytes" - "encoding/gob" - "flag" - "fmt" - "io/ioutil" - "math" - "math/rand" - "net" - "net/rpc" - "os" - "os/exec" - "path/filepath" - "reflect" - "runtime" - "strconv" - "strings" - "sync/atomic" - "testing" - "time" -) - -func init() { - testInitFlags() - testPreInitFns = append(testPreInitFns, testInit) -} - -// make this a mapbyslice -type testMbsT []interface{} - -func (_ testMbsT) MapBySlice() {} - -type testVerifyArg int - -const ( - testVerifyMapTypeSame testVerifyArg = iota - testVerifyMapTypeStrIntf - testVerifyMapTypeIntfIntf - // testVerifySliceIntf - testVerifyForPython -) - -const testSkipRPCTests = false - -var ( - testTableNumPrimitives int - testTableIdxTime int - testTableNumMaps int -) - -var ( - testVerbose bool - testInitDebug bool - testUseIoEncDec bool - testStructToArray bool - testCanonical bool - testUseReset bool - testWriteNoSymbols bool - testSkipIntf bool - testInternStr bool - testUseMust bool - testCheckCircRef bool - testJsonIndent int - - skipVerifyVal interface{} = &(struct{}{}) - - testMapStrIntfTyp = reflect.TypeOf(map[string]interface{}(nil)) - - // For Go Time, do not use a descriptive timezone. - // It's unnecessary, and makes it harder to do a reflect.DeepEqual. - // The Offset already tells what the offset should be, if not on UTC and unknown zone name. - timeLoc = time.FixedZone("", -8*60*60) // UTC-08:00 //time.UTC-8 - timeToCompare1 = time.Date(2012, 2, 2, 2, 2, 2, 2000, timeLoc).UTC() - timeToCompare2 = time.Date(1900, 2, 2, 2, 2, 2, 2000, timeLoc).UTC() - timeToCompare3 = time.Unix(0, 270).UTC() // use value that must be encoded as uint64 for nanoseconds (for cbor/msgpack comparison) - //timeToCompare4 = time.Time{}.UTC() // does not work well with simple cbor time encoding (overflow) - timeToCompare4 = time.Unix(-2013855848, 4223).UTC() - - table []interface{} // main items we encode - tableVerify []interface{} // we verify encoded things against this after decode - tableTestNilVerify []interface{} // for nil interface, use this to verify (rules are different) - tablePythonVerify []interface{} // for verifying for python, since Python sometimes - // will encode a float32 as float64, or large int as uint - testRpcInt = new(TestRpcInt) -) - -func testInitFlags() { - // delete(testDecOpts.ExtFuncs, timeTyp) - flag.BoolVar(&testVerbose, "tv", false, "Test Verbose") - flag.BoolVar(&testInitDebug, "tg", false, "Test Init Debug") - flag.BoolVar(&testUseIoEncDec, "ti", false, "Use IO Reader/Writer for Marshal/Unmarshal") - flag.BoolVar(&testStructToArray, "ts", false, "Set StructToArray option") - flag.BoolVar(&testWriteNoSymbols, "tn", false, "Set NoSymbols option") - flag.BoolVar(&testCanonical, "tc", false, "Set Canonical option") - flag.BoolVar(&testInternStr, "te", false, "Set InternStr option") - flag.BoolVar(&testSkipIntf, "tf", false, "Skip Interfaces") - flag.BoolVar(&testUseReset, "tr", false, "Use Reset") - flag.IntVar(&testJsonIndent, "td", 0, "Use JSON Indent") - flag.BoolVar(&testUseMust, "tm", true, "Use Must(En|De)code") - flag.BoolVar(&testCheckCircRef, "tl", false, "Use Check Circular Ref") -} - -func testByteBuf(in []byte) *bytes.Buffer { - return bytes.NewBuffer(in) -} - -type TestABC struct { - A, B, C string -} - -func (x *TestABC) MarshalBinary() ([]byte, error) { - return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil -} -func (x *TestABC) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil -} -func (x *TestABC) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s %s %s"`, x.A, x.B, x.C)), nil -} - -func (x *TestABC) UnmarshalBinary(data []byte) (err error) { - ss := strings.Split(string(data), " ") - x.A, x.B, x.C = ss[0], ss[1], ss[2] - return -} -func (x *TestABC) UnmarshalText(data []byte) (err error) { - return x.UnmarshalBinary(data) -} -func (x *TestABC) UnmarshalJSON(data []byte) (err error) { - return x.UnmarshalBinary(data[1 : len(data)-1]) -} - -type TestABC2 struct { - A, B, C string -} - -func (x TestABC2) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil -} -func (x *TestABC2) UnmarshalText(data []byte) (err error) { - ss := strings.Split(string(data), " ") - x.A, x.B, x.C = ss[0], ss[1], ss[2] - return - // _, err = fmt.Sscanf(string(data), "%s %s %s", &x.A, &x.B, &x.C) -} - -type TestRpcABC struct { - A, B, C string -} - -type TestRpcInt struct { - i int -} - -func (r *TestRpcInt) Update(n int, res *int) error { r.i = n; *res = r.i; return nil } -func (r *TestRpcInt) Square(ignore int, res *int) error { *res = r.i * r.i; return nil } -func (r *TestRpcInt) Mult(n int, res *int) error { *res = r.i * n; return nil } -func (r *TestRpcInt) EchoStruct(arg TestRpcABC, res *string) error { - *res = fmt.Sprintf("%#v", arg) - return nil -} -func (r *TestRpcInt) Echo123(args []string, res *string) error { - *res = fmt.Sprintf("%#v", args) - return nil -} - -type testUnixNanoTimeExt struct { - // keep timestamp here, so that do not incur interface-conversion costs - ts int64 -} - -// func (x *testUnixNanoTimeExt) WriteExt(interface{}) []byte { panic("unsupported") } -// func (x *testUnixNanoTimeExt) ReadExt(interface{}, []byte) { panic("unsupported") } -func (x *testUnixNanoTimeExt) ConvertExt(v interface{}) interface{} { - switch v2 := v.(type) { - case time.Time: - x.ts = v2.UTC().UnixNano() - case *time.Time: - x.ts = v2.UTC().UnixNano() - default: - panic(fmt.Sprintf("unsupported format for time conversion: expecting time.Time; got %T", v)) - } - return &x.ts -} -func (x *testUnixNanoTimeExt) UpdateExt(dest interface{}, v interface{}) { - // fmt.Printf("testUnixNanoTimeExt.UpdateExt: v: %v\n", v) - tt := dest.(*time.Time) - switch v2 := v.(type) { - case int64: - *tt = time.Unix(0, v2).UTC() - case *int64: - *tt = time.Unix(0, *v2).UTC() - case uint64: - *tt = time.Unix(0, int64(v2)).UTC() - case *uint64: - *tt = time.Unix(0, int64(*v2)).UTC() - //case float64: - //case string: - default: - panic(fmt.Sprintf("unsupported format for time conversion: expecting int64/uint64; got %T", v)) - } - // fmt.Printf("testUnixNanoTimeExt.UpdateExt: v: %v, tt: %#v\n", v, tt) -} - -func testVerifyVal(v interface{}, arg testVerifyArg) (v2 interface{}) { - //for python msgpack, - // - all positive integers are unsigned 64-bit ints - // - all floats are float64 - switch iv := v.(type) { - case int8: - if iv >= 0 { - v2 = uint64(iv) - } else { - v2 = int64(iv) - } - case int16: - if iv >= 0 { - v2 = uint64(iv) - } else { - v2 = int64(iv) - } - case int32: - if iv >= 0 { - v2 = uint64(iv) - } else { - v2 = int64(iv) - } - case int64: - if iv >= 0 { - v2 = uint64(iv) - } else { - v2 = int64(iv) - } - case uint8: - v2 = uint64(iv) - case uint16: - v2 = uint64(iv) - case uint32: - v2 = uint64(iv) - case uint64: - v2 = uint64(iv) - case float32: - v2 = float64(iv) - case float64: - v2 = float64(iv) - case []interface{}: - m2 := make([]interface{}, len(iv)) - for j, vj := range iv { - m2[j] = testVerifyVal(vj, arg) - } - v2 = m2 - case testMbsT: - m2 := make([]interface{}, len(iv)) - for j, vj := range iv { - m2[j] = testVerifyVal(vj, arg) - } - v2 = testMbsT(m2) - case map[string]bool: - switch arg { - case testVerifyMapTypeSame: - m2 := make(map[string]bool) - for kj, kv := range iv { - m2[kj] = kv - } - v2 = m2 - case testVerifyMapTypeStrIntf, testVerifyForPython: - m2 := make(map[string]interface{}) - for kj, kv := range iv { - m2[kj] = kv - } - v2 = m2 - case testVerifyMapTypeIntfIntf: - m2 := make(map[interface{}]interface{}) - for kj, kv := range iv { - m2[kj] = kv - } - v2 = m2 - } - case map[string]interface{}: - switch arg { - case testVerifyMapTypeSame: - m2 := make(map[string]interface{}) - for kj, kv := range iv { - m2[kj] = testVerifyVal(kv, arg) - } - v2 = m2 - case testVerifyMapTypeStrIntf, testVerifyForPython: - m2 := make(map[string]interface{}) - for kj, kv := range iv { - m2[kj] = testVerifyVal(kv, arg) - } - v2 = m2 - case testVerifyMapTypeIntfIntf: - m2 := make(map[interface{}]interface{}) - for kj, kv := range iv { - m2[kj] = testVerifyVal(kv, arg) - } - v2 = m2 - } - case map[interface{}]interface{}: - m2 := make(map[interface{}]interface{}) - for kj, kv := range iv { - m2[testVerifyVal(kj, arg)] = testVerifyVal(kv, arg) - } - v2 = m2 - case time.Time: - switch arg { - case testVerifyForPython: - if iv2 := iv.UnixNano(); iv2 >= 0 { - v2 = uint64(iv2) - } else { - v2 = int64(iv2) - } - default: - v2 = v - } - default: - v2 = v - } - return -} - -func testInit() { - gob.Register(new(TestStruc)) - if testInitDebug { - ts0 := newTestStruc(2, false, !testSkipIntf, false) - fmt.Printf("====> depth: %v, ts: %#v\n", 2, ts0) - } - - for _, v := range testHandles { - bh := v.getBasicHandle() - bh.InternString = testInternStr - bh.Canonical = testCanonical - bh.CheckCircularRef = testCheckCircRef - bh.StructToArray = testStructToArray - // mostly doing this for binc - if testWriteNoSymbols { - bh.AsSymbols = AsSymbolNone - } else { - bh.AsSymbols = AsSymbolAll - } - } - - testJsonH.Indent = int8(testJsonIndent) - testMsgpackH.RawToString = true - - // testMsgpackH.AddExt(byteSliceTyp, 0, testMsgpackH.BinaryEncodeExt, testMsgpackH.BinaryDecodeExt) - // testMsgpackH.AddExt(timeTyp, 1, testMsgpackH.TimeEncodeExt, testMsgpackH.TimeDecodeExt) - - // add extensions for msgpack, simple for time.Time, so we can encode/decode same way. - // use different flavors of XXXExt calls, including deprecated ones. - // NOTE: - // DO NOT set extensions for JsonH, so we can test json(M|Unm)arshal support. - testSimpleH.AddExt(timeTyp, 1, timeExtEncFn, timeExtDecFn) - testMsgpackH.SetBytesExt(timeTyp, 1, timeExt{}) - testCborH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{}) - // testJsonH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{}) - - // primitives MUST be an even number, so it can be used as a mapBySlice also. - primitives := []interface{}{ - int8(-8), - int16(-1616), - int32(-32323232), - int64(-6464646464646464), - uint8(192), - uint16(1616), - uint32(32323232), - uint64(6464646464646464), - byte(192), - float32(-3232.0), - float64(-6464646464.0), - float32(3232.0), - float64(6464.0), - float64(6464646464.0), - false, - true, - "null", - nil, - "someday", - timeToCompare1, - "", - timeToCompare2, - "bytestring", - timeToCompare3, - "none", - timeToCompare4, - } - - maps := []interface{}{ - map[string]bool{ - "true": true, - "false": false, - }, - map[string]interface{}{ - "true": "True", - "false": false, - "uint16(1616)": uint16(1616), - }, - //add a complex combo map in here. (map has list which has map) - //note that after the first thing, everything else should be generic. - map[string]interface{}{ - "list": []interface{}{ - int16(1616), - int32(32323232), - true, - float32(-3232.0), - map[string]interface{}{ - "TRUE": true, - "FALSE": false, - }, - []interface{}{true, false}, - }, - "int32": int32(32323232), - "bool": true, - "LONG STRING": "123456789012345678901234567890123456789012345678901234567890", - "SHORT STRING": "1234567890", - }, - map[interface{}]interface{}{ - true: "true", - uint8(138): false, - "false": uint8(200), - }, - } - - testTableNumPrimitives = len(primitives) - testTableIdxTime = testTableNumPrimitives - 8 - testTableNumMaps = len(maps) - - table = []interface{}{} - table = append(table, primitives...) - table = append(table, primitives) - table = append(table, testMbsT(primitives)) - table = append(table, maps...) - table = append(table, newTestStruc(0, false, !testSkipIntf, false)) - - tableVerify = make([]interface{}, len(table)) - tableTestNilVerify = make([]interface{}, len(table)) - tablePythonVerify = make([]interface{}, len(table)) - - lp := testTableNumPrimitives + 4 - av := tableVerify - for i, v := range table { - if i == lp { - av[i] = skipVerifyVal - continue - } - //av[i] = testVerifyVal(v, testVerifyMapTypeSame) - switch v.(type) { - case []interface{}: - av[i] = testVerifyVal(v, testVerifyMapTypeSame) - case testMbsT: - av[i] = testVerifyVal(v, testVerifyMapTypeSame) - case map[string]interface{}: - av[i] = testVerifyVal(v, testVerifyMapTypeSame) - case map[interface{}]interface{}: - av[i] = testVerifyVal(v, testVerifyMapTypeSame) - default: - av[i] = v - } - } - - av = tableTestNilVerify - for i, v := range table { - if i > lp { - av[i] = skipVerifyVal - continue - } - av[i] = testVerifyVal(v, testVerifyMapTypeStrIntf) - } - - av = tablePythonVerify - for i, v := range table { - if i == testTableNumPrimitives+1 || i > lp { // testTableNumPrimitives+1 is the mapBySlice - av[i] = skipVerifyVal - continue - } - av[i] = testVerifyVal(v, testVerifyForPython) - } - - // only do the python verify up to the maps, skipping the last 2 maps. - tablePythonVerify = tablePythonVerify[:testTableNumPrimitives+2+testTableNumMaps-2] -} - -func testUnmarshal(v interface{}, data []byte, h Handle) (err error) { - return testCodecDecode(data, v, h) -} - -func testMarshal(v interface{}, h Handle) (bs []byte, err error) { - return testCodecEncode(v, nil, testByteBuf, h) -} - -func testMarshalErr(v interface{}, h Handle, t *testing.T, name string) (bs []byte, err error) { - if bs, err = testMarshal(v, h); err != nil { - logT(t, "Error encoding %s: %v, Err: %v", name, v, err) - t.FailNow() - } - return -} - -func testUnmarshalErr(v interface{}, data []byte, h Handle, t *testing.T, name string) (err error) { - if err = testUnmarshal(v, data, h); err != nil { - logT(t, "Error Decoding into %s: %v, Err: %v", name, v, err) - t.FailNow() - } - return -} - -// doTestCodecTableOne allows us test for different variations based on arguments passed. -func doTestCodecTableOne(t *testing.T, testNil bool, h Handle, - vs []interface{}, vsVerify []interface{}) { - //if testNil, then just test for when a pointer to a nil interface{} is passed. It should work. - //Current setup allows us test (at least manually) the nil interface or typed interface. - logT(t, "================ TestNil: %v ================\n", testNil) - for i, v0 := range vs { - logT(t, "..............................................") - logT(t, " Testing: #%d:, %T, %#v\n", i, v0, v0) - b0, err := testMarshalErr(v0, h, t, "v0") - if err != nil { - continue - } - if h.isBinary() { - logT(t, " Encoded bytes: len: %v, %v\n", len(b0), b0) - } else { - logT(t, " Encoded string: len: %v, %v\n", len(string(b0)), string(b0)) - // println("########### encoded string: " + string(b0)) - } - var v1 interface{} - - if testNil { - err = testUnmarshal(&v1, b0, h) - } else { - if v0 != nil { - v0rt := reflect.TypeOf(v0) // ptr - rv1 := reflect.New(v0rt) - err = testUnmarshal(rv1.Interface(), b0, h) - v1 = rv1.Elem().Interface() - // v1 = reflect.Indirect(reflect.ValueOf(v1)).Interface() - } - } - - logT(t, " v1 returned: %T, %#v", v1, v1) - // if v1 != nil { - // logT(t, " v1 returned: %T, %#v", v1, v1) - // //we always indirect, because ptr to typed value may be passed (if not testNil) - // v1 = reflect.Indirect(reflect.ValueOf(v1)).Interface() - // } - if err != nil { - logT(t, "-------- Error: %v. Partial return: %v", err, v1) - failT(t) - continue - } - v0check := vsVerify[i] - if v0check == skipVerifyVal { - logT(t, " Nil Check skipped: Decoded: %T, %#v\n", v1, v1) - continue - } - - if err = deepEqual(v0check, v1); err == nil { - logT(t, "++++++++ Before and After marshal matched\n") - } else { - // logT(t, "-------- Before and After marshal do not match: Error: %v"+ - // " ====> GOLDEN: (%T) %#v, DECODED: (%T) %#v\n", err, v0check, v0check, v1, v1) - logT(t, "-------- Before and After marshal do not match: Error: %v", err) - logT(t, " ....... GOLDEN: (%T) %#v", v0check, v0check) - logT(t, " ....... DECODED: (%T) %#v", v1, v1) - failT(t) - } - } -} - -func testCodecTableOne(t *testing.T, h Handle) { - testOnce.Do(testInitAll) - // func TestMsgpackAllExperimental(t *testing.T) { - // dopts := testDecOpts(nil, nil, false, true, true), - - numPrim, numMap, idxTime, idxMap := testTableNumPrimitives, testTableNumMaps, testTableIdxTime, testTableNumPrimitives+2 - - //println("#################") - switch v := h.(type) { - case *MsgpackHandle: - var oldWriteExt, oldRawToString bool - oldWriteExt, v.WriteExt = v.WriteExt, true - oldRawToString, v.RawToString = v.RawToString, true - doTestCodecTableOne(t, false, h, table, tableVerify) - v.WriteExt, v.RawToString = oldWriteExt, oldRawToString - case *JsonHandle: - //skip []interface{} containing time.Time, as it encodes as a number, but cannot decode back to time.Time. - //As there is no real support for extension tags in json, this must be skipped. - doTestCodecTableOne(t, false, h, table[:numPrim], tableVerify[:numPrim]) - doTestCodecTableOne(t, false, h, table[idxMap:], tableVerify[idxMap:]) - default: - doTestCodecTableOne(t, false, h, table, tableVerify) - } - // func TestMsgpackAll(t *testing.T) { - - // //skip []interface{} containing time.Time - // doTestCodecTableOne(t, false, h, table[:numPrim], tableVerify[:numPrim]) - // doTestCodecTableOne(t, false, h, table[numPrim+1:], tableVerify[numPrim+1:]) - // func TestMsgpackNilStringMap(t *testing.T) { - var oldMapType reflect.Type - v := h.getBasicHandle() - - oldMapType, v.MapType = v.MapType, testMapStrIntfTyp - - //skip time.Time, []interface{} containing time.Time, last map, and newStruc - doTestCodecTableOne(t, true, h, table[:idxTime], tableTestNilVerify[:idxTime]) - doTestCodecTableOne(t, true, h, table[idxMap:idxMap+numMap-1], tableTestNilVerify[idxMap:idxMap+numMap-1]) - - v.MapType = oldMapType - - // func TestMsgpackNilIntf(t *testing.T) { - - //do last map and newStruc - idx2 := idxMap + numMap - 1 - doTestCodecTableOne(t, true, h, table[idx2:], tableTestNilVerify[idx2:]) - //TODO? What is this one? - //doTestCodecTableOne(t, true, h, table[17:18], tableTestNilVerify[17:18]) -} - -func testCodecMiscOne(t *testing.T, h Handle) { - testOnce.Do(testInitAll) - b, err := testMarshalErr(32, h, t, "32") - // Cannot do this nil one, because faster type assertion decoding will panic - // var i *int32 - // if err = testUnmarshal(b, i, nil); err == nil { - // logT(t, "------- Expecting error because we cannot unmarshal to int32 nil ptr") - // t.FailNow() - // } - var i2 int32 = 0 - err = testUnmarshalErr(&i2, b, h, t, "int32-ptr") - if i2 != int32(32) { - logT(t, "------- didn't unmarshal to 32: Received: %d", i2) - t.FailNow() - } - - // func TestMsgpackDecodePtr(t *testing.T) { - ts := newTestStruc(0, false, !testSkipIntf, false) - b, err = testMarshalErr(ts, h, t, "pointer-to-struct") - if len(b) < 40 { - logT(t, "------- Size must be > 40. Size: %d", len(b)) - t.FailNow() - } - if h.isBinary() { - logT(t, "------- b: %v", b) - } else { - logT(t, "------- b: %s", b) - } - ts2 := new(TestStruc) - err = testUnmarshalErr(ts2, b, h, t, "pointer-to-struct") - if ts2.I64 != math.MaxInt64*2/3 { - logT(t, "------- Unmarshal wrong. Expect I64 = 64. Got: %v", ts2.I64) - t.FailNow() - } - - // func TestMsgpackIntfDecode(t *testing.T) { - m := map[string]int{"A": 2, "B": 3} - p := []interface{}{m} - bs, err := testMarshalErr(p, h, t, "p") - - m2 := map[string]int{} - p2 := []interface{}{m2} - err = testUnmarshalErr(&p2, bs, h, t, "&p2") - - if m2["A"] != 2 || m2["B"] != 3 { - logT(t, "m2 not as expected: expecting: %v, got: %v", m, m2) - t.FailNow() - } - // log("m: %v, m2: %v, p: %v, p2: %v", m, m2, p, p2) - checkEqualT(t, p, p2, "p=p2") - checkEqualT(t, m, m2, "m=m2") - if err = deepEqual(p, p2); err == nil { - logT(t, "p and p2 match") - } else { - logT(t, "Not Equal: %v. p: %v, p2: %v", err, p, p2) - t.FailNow() - } - if err = deepEqual(m, m2); err == nil { - logT(t, "m and m2 match") - } else { - logT(t, "Not Equal: %v. m: %v, m2: %v", err, m, m2) - t.FailNow() - } - - // func TestMsgpackDecodeStructSubset(t *testing.T) { - // test that we can decode a subset of the stream - mm := map[string]interface{}{"A": 5, "B": 99, "C": 333} - bs, err = testMarshalErr(mm, h, t, "mm") - type ttt struct { - A uint8 - C int32 - } - var t2 ttt - testUnmarshalErr(&t2, bs, h, t, "t2") - t3 := ttt{5, 333} - checkEqualT(t, t2, t3, "t2=t3") - - // println(">>>>>") - // test simple arrays, non-addressable arrays, slices - type tarr struct { - A int64 - B [3]int64 - C []byte - D [3]byte - } - var tarr0 = tarr{1, [3]int64{2, 3, 4}, []byte{4, 5, 6}, [3]byte{7, 8, 9}} - // test both pointer and non-pointer (value) - for _, tarr1 := range []interface{}{tarr0, &tarr0} { - bs, err = testMarshalErr(tarr1, h, t, "tarr1") - if err != nil { - logT(t, "Error marshalling: %v", err) - t.FailNow() - } - if _, ok := h.(*JsonHandle); ok { - logT(t, "Marshal as: %s", bs) - } - var tarr2 tarr - testUnmarshalErr(&tarr2, bs, h, t, "tarr2") - checkEqualT(t, tarr0, tarr2, "tarr0=tarr2") - // fmt.Printf(">>>> err: %v. tarr1: %v, tarr2: %v\n", err, tarr0, tarr2) - } - - // test byte array, even if empty (msgpack only) - if h == testMsgpackH { - type ystruct struct { - Anarray []byte - } - var ya = ystruct{} - testUnmarshalErr(&ya, []byte{0x91, 0x90}, h, t, "ya") - } -} - -func testCodecEmbeddedPointer(t *testing.T, h Handle) { - testOnce.Do(testInitAll) - type Z int - type A struct { - AnInt int - } - type B struct { - *Z - *A - MoreInt int - } - var z Z = 4 - x1 := &B{&z, &A{5}, 6} - bs, err := testMarshalErr(x1, h, t, "x1") - // fmt.Printf("buf: len(%v): %x\n", buf.Len(), buf.Bytes()) - var x2 = new(B) - err = testUnmarshalErr(x2, bs, h, t, "x2") - err = checkEqualT(t, x1, x2, "x1=x2") - _ = err -} - -func testCodecUnderlyingType(t *testing.T, h Handle) { - testOnce.Do(testInitAll) - // Manual Test. - // Run by hand, with accompanying print statements in fast-path.go - // to ensure that the fast functions are called. - type T1 map[string]string - v := T1{"1": "1s", "2": "2s"} - var bs []byte - var err error - NewEncoderBytes(&bs, h).MustEncode(v) - if err != nil { - logT(t, "Error during encode: %v", err) - failT(t) - } - var v2 T1 - NewDecoderBytes(bs, h).MustDecode(&v2) - if err != nil { - logT(t, "Error during decode: %v", err) - failT(t) - } -} - -func testCodecChan(t *testing.T, h Handle) { - // - send a slice []*int64 (sl1) into an chan (ch1) with cap > len(s1) - // - encode ch1 as a stream array - // - decode a chan (ch2), with cap > len(s1) from the stream array - // - receive from ch2 into slice sl2 - // - compare sl1 and sl2 - // - do this for codecs: json, cbor (covers all types) - sl1 := make([]*int64, 4) - for i := range sl1 { - var j int64 = int64(i) - sl1[i] = &j - } - ch1 := make(chan *int64, 4) - for _, j := range sl1 { - ch1 <- j - } - var bs []byte - NewEncoderBytes(&bs, h).MustEncode(ch1) - // if !h.isBinary() { - // fmt.Printf("before: len(ch1): %v, bs: %s\n", len(ch1), bs) - // } - // var ch2 chan *int64 // this will block if json, etc. - ch2 := make(chan *int64, 8) - NewDecoderBytes(bs, h).MustDecode(&ch2) - // logT(t, "Len(ch2): %v", len(ch2)) - // fmt.Printf("after: len(ch2): %v, ch2: %v\n", len(ch2), ch2) - close(ch2) - var sl2 []*int64 - for j := range ch2 { - sl2 = append(sl2, j) - } - if err := deepEqual(sl1, sl2); err != nil { - logT(t, "Not Match: %v; len: %v, %v", err, len(sl1), len(sl2)) - failT(t) - } -} - -func testCodecRpcOne(t *testing.T, rr Rpc, h Handle, doRequest bool, exitSleepMs time.Duration, -) (port int) { - testOnce.Do(testInitAll) - if testSkipRPCTests { - return - } - // rpc needs EOF, which is sent via a panic, and so must be recovered. - if !recoverPanicToErr { - logT(t, "EXPECTED. set recoverPanicToErr=true, since rpc needs EOF") - t.FailNow() - } - srv := rpc.NewServer() - srv.Register(testRpcInt) - ln, err := net.Listen("tcp", "127.0.0.1:0") - // log("listener: %v", ln.Addr()) - checkErrT(t, err) - port = (ln.Addr().(*net.TCPAddr)).Port - // var opts *DecoderOptions - // opts := testDecOpts - // opts.MapType = mapStrIntfTyp - // opts.RawToString = false - serverExitChan := make(chan bool, 1) - var serverExitFlag uint64 = 0 - serverFn := func() { - for { - conn1, err1 := ln.Accept() - // if err1 != nil { - // //fmt.Printf("accept err1: %v\n", err1) - // continue - // } - if atomic.LoadUint64(&serverExitFlag) == 1 { - serverExitChan <- true - conn1.Close() - return // exit serverFn goroutine - } - if err1 == nil { - var sc rpc.ServerCodec = rr.ServerCodec(conn1, h) - srv.ServeCodec(sc) - } - } - } - - clientFn := func(cc rpc.ClientCodec) { - cl := rpc.NewClientWithCodec(cc) - defer cl.Close() - // defer func() { println("##### client closing"); cl.Close() }() - var up, sq, mult int - var rstr string - // log("Calling client") - checkErrT(t, cl.Call("TestRpcInt.Update", 5, &up)) - // log("Called TestRpcInt.Update") - checkEqualT(t, testRpcInt.i, 5, "testRpcInt.i=5") - checkEqualT(t, up, 5, "up=5") - checkErrT(t, cl.Call("TestRpcInt.Square", 1, &sq)) - checkEqualT(t, sq, 25, "sq=25") - checkErrT(t, cl.Call("TestRpcInt.Mult", 20, &mult)) - checkEqualT(t, mult, 100, "mult=100") - checkErrT(t, cl.Call("TestRpcInt.EchoStruct", TestRpcABC{"Aa", "Bb", "Cc"}, &rstr)) - checkEqualT(t, rstr, fmt.Sprintf("%#v", TestRpcABC{"Aa", "Bb", "Cc"}), "rstr=") - checkErrT(t, cl.Call("TestRpcInt.Echo123", []string{"A1", "B2", "C3"}, &rstr)) - checkEqualT(t, rstr, fmt.Sprintf("%#v", []string{"A1", "B2", "C3"}), "rstr=") - } - - connFn := func() (bs net.Conn) { - // log("calling f1") - bs, err2 := net.Dial(ln.Addr().Network(), ln.Addr().String()) - //fmt.Printf("f1. bs: %v, err2: %v\n", bs, err2) - checkErrT(t, err2) - return - } - - exitFn := func() { - atomic.StoreUint64(&serverExitFlag, 1) - bs := connFn() - <-serverExitChan - bs.Close() - // serverExitChan <- true - } - - go serverFn() - runtime.Gosched() - //time.Sleep(100 * time.Millisecond) - if exitSleepMs == 0 { - defer ln.Close() - defer exitFn() - } - if doRequest { - bs := connFn() - cc := rr.ClientCodec(bs, h) - clientFn(cc) - } - if exitSleepMs != 0 { - go func() { - defer ln.Close() - time.Sleep(exitSleepMs) - exitFn() - }() - } - return -} - -func doTestMapEncodeForCanonical(t *testing.T, name string, h Handle) { - v1 := map[string]interface{}{ - "a": 1, - "b": "hello", - "c": map[string]interface{}{ - "c/a": 1, - "c/b": "world", - "c/c": []int{1, 2, 3, 4}, - "c/d": map[string]interface{}{ - "c/d/a": "fdisajfoidsajfopdjsaopfjdsapofda", - "c/d/b": "fdsafjdposakfodpsakfopdsakfpodsakfpodksaopfkdsopafkdopsa", - "c/d/c": "poir02 ir30qif4p03qir0pogjfpoaerfgjp ofke[padfk[ewapf kdp[afep[aw", - "c/d/d": "fdsopafkd[sa f-32qor-=4qeof -afo-erfo r-eafo 4e- o r4-qwo ag", - "c/d/e": "kfep[a sfkr0[paf[a foe-[wq ewpfao-q ro3-q ro-4qof4-qor 3-e orfkropzjbvoisdb", - "c/d/f": "", - }, - "c/e": map[int]string{ - 1: "1", - 22: "22", - 333: "333", - 4444: "4444", - 55555: "55555", - }, - "c/f": map[string]int{ - "1": 1, - "22": 22, - "333": 333, - "4444": 4444, - "55555": 55555, - }, - }, - } - var v2 map[string]interface{} - var b1, b2 []byte - - // encode v1 into b1, decode b1 into v2, encode v2 into b2, compare b1 and b2 - - bh := h.getBasicHandle() - if !bh.Canonical { - bh.Canonical = true - defer func() { bh.Canonical = false }() - } - - e1 := NewEncoderBytes(&b1, h) - e1.MustEncode(v1) - d1 := NewDecoderBytes(b1, h) - d1.MustDecode(&v2) - e2 := NewEncoderBytes(&b2, h) - e2.MustEncode(v2) - if !bytes.Equal(b1, b2) { - logT(t, "Unequal bytes: %v VS %v", b1, b2) - t.FailNow() - } -} - -func doTestStdEncIntf(t *testing.T, name string, h Handle) { - args := [][2]interface{}{ - {&TestABC{"A", "BB", "CCC"}, new(TestABC)}, - {&TestABC2{"AAA", "BB", "C"}, new(TestABC2)}, - } - for _, a := range args { - var b []byte - e := NewEncoderBytes(&b, h) - e.MustEncode(a[0]) - d := NewDecoderBytes(b, h) - d.MustDecode(a[1]) - if err := deepEqual(a[0], a[1]); err == nil { - logT(t, "++++ Objects match") - } else { - logT(t, "---- Objects do not match: y1: %v, err: %v", a[1], err) - failT(t) - } - } -} - -func doTestEncCircularRef(t *testing.T, name string, h Handle) { - type T1 struct { - S string - B bool - T interface{} - } - type T2 struct { - S string - T *T1 - } - type T3 struct { - S string - T *T2 - } - t1 := T1{"t1", true, nil} - t2 := T2{"t2", &t1} - t3 := T3{"t3", &t2} - t1.T = &t3 - - var bs []byte - var err error - - bh := h.getBasicHandle() - if !bh.CheckCircularRef { - bh.CheckCircularRef = true - defer func() { bh.CheckCircularRef = false }() - } - err = NewEncoderBytes(&bs, h).Encode(&t3) - if err == nil { - logT(t, "expecting error due to circular reference. found none") - t.FailNow() - } - if x := err.Error(); strings.Contains(x, "circular") || strings.Contains(x, "cyclic") { - logT(t, "error detected as expected: %v", x) - } else { - logT(t, "error detected was not as expected: %v", x) - t.FailNow() - } -} - -// TestAnonCycleT{1,2,3} types are used to test anonymous cycles. -// They are top-level, so that they can have circular references. -type ( - TestAnonCycleT1 struct { - S string - TestAnonCycleT2 - } - TestAnonCycleT2 struct { - S2 string - TestAnonCycleT3 - } - TestAnonCycleT3 struct { - *TestAnonCycleT1 - } -) - -func doTestAnonCycle(t *testing.T, name string, h Handle) { - var x TestAnonCycleT1 - x.S = "hello" - x.TestAnonCycleT2.S2 = "hello.2" - x.TestAnonCycleT2.TestAnonCycleT3.TestAnonCycleT1 = &x - - // just check that you can get typeInfo for T1 - rt := reflect.TypeOf((*TestAnonCycleT1)(nil)).Elem() - rtid := reflect.ValueOf(rt).Pointer() - pti := h.getBasicHandle().getTypeInfo(rtid, rt) - logT(t, "pti: %v", pti) -} - -func doTestJsonLargeInteger(t *testing.T, v interface{}, ias uint8) { - logT(t, "Running doTestJsonLargeInteger: v: %#v, ias: %c", v, ias) - oldIAS := testJsonH.IntegerAsString - defer func() { testJsonH.IntegerAsString = oldIAS }() - testJsonH.IntegerAsString = ias - - var vu uint - var vi int - var vb bool - var b []byte - e := NewEncoderBytes(&b, testJsonH) - e.MustEncode(v) - e.MustEncode(true) - d := NewDecoderBytes(b, testJsonH) - // below, we validate that the json string or number was encoded, - // then decode, and validate that the correct value was decoded. - fnStrChk := func() { - // check that output started with ", and ended with "true - if !(b[0] == '"' && string(b[len(b)-5:]) == `"true`) { - logT(t, "Expecting a JSON string, got: %s", b) - failT(t) - } - } - - switch ias { - case 'L': - switch v2 := v.(type) { - case int: - if v2 > 1<<53 || (v2 < 0 && -v2 > 1<<53) { - fnStrChk() - } - case uint: - if v2 > 1<<53 { - fnStrChk() - } - } - case 'A': - fnStrChk() - default: - // check that output doesn't contain " at all - for _, i := range b { - if i == '"' { - logT(t, "Expecting a JSON Number without quotation: got: %s", b) - failT(t) - } - } - } - switch v2 := v.(type) { - case int: - d.MustDecode(&vi) - d.MustDecode(&vb) - // check that vb = true, and vi == v2 - if !(vb && vi == v2) { - logT(t, "Expecting equal values from %s: got golden: %v, decoded: %v", b, v2, vi) - failT(t) - } - case uint: - d.MustDecode(&vu) - d.MustDecode(&vb) - // check that vb = true, and vi == v2 - if !(vb && vu == v2) { - logT(t, "Expecting equal values from %s: got golden: %v, decoded: %v", b, v2, vu) - failT(t) - } - // fmt.Printf("%v: %s, decode: %d, bool: %v, equal_on_decode: %v\n", v, b, vu, vb, vu == v.(uint)) - } -} - -// Comprehensive testing that generates data encoded from python handle (cbor, msgpack), -// and validates that our code can read and write it out accordingly. -// We keep this unexported here, and put actual test in ext_dep_test.go. -// This way, it can be excluded by excluding file completely. -func doTestPythonGenStreams(t *testing.T, name string, h Handle) { - logT(t, "TestPythonGenStreams-%v", name) - tmpdir, err := ioutil.TempDir("", "golang-"+name+"-test") - if err != nil { - logT(t, "-------- Unable to create temp directory\n") - t.FailNow() - } - defer os.RemoveAll(tmpdir) - logT(t, "tmpdir: %v", tmpdir) - cmd := exec.Command("python", "test.py", "testdata", tmpdir) - //cmd.Stdin = strings.NewReader("some input") - //cmd.Stdout = &out - var cmdout []byte - if cmdout, err = cmd.CombinedOutput(); err != nil { - logT(t, "-------- Error running test.py testdata. Err: %v", err) - logT(t, " %v", string(cmdout)) - t.FailNow() - } - - bh := h.getBasicHandle() - - oldMapType := bh.MapType - for i, v := range tablePythonVerify { - // if v == uint64(0) && h == testMsgpackH { - // v = int64(0) - // } - bh.MapType = oldMapType - //load up the golden file based on number - //decode it - //compare to in-mem object - //encode it again - //compare to output stream - logT(t, "..............................................") - logT(t, " Testing: #%d: %T, %#v\n", i, v, v) - var bss []byte - bss, err = ioutil.ReadFile(filepath.Join(tmpdir, strconv.Itoa(i)+"."+name+".golden")) - if err != nil { - logT(t, "-------- Error reading golden file: %d. Err: %v", i, err) - failT(t) - continue - } - bh.MapType = testMapStrIntfTyp - - var v1 interface{} - if err = testUnmarshal(&v1, bss, h); err != nil { - logT(t, "-------- Error decoding stream: %d: Err: %v", i, err) - failT(t) - continue - } - if v == skipVerifyVal { - continue - } - //no need to indirect, because we pass a nil ptr, so we already have the value - //if v1 != nil { v1 = reflect.Indirect(reflect.ValueOf(v1)).Interface() } - if err = deepEqual(v, v1); err == nil { - logT(t, "++++++++ Objects match: %T, %v", v, v) - } else { - logT(t, "-------- Objects do not match: %v. Source: %T. Decoded: %T", err, v, v1) - logT(t, "-------- GOLDEN: %#v", v) - // logT(t, "-------- DECODED: %#v <====> %#v", v1, reflect.Indirect(reflect.ValueOf(v1)).Interface()) - logT(t, "-------- DECODED: %#v <====> %#v", v1, reflect.Indirect(reflect.ValueOf(v1)).Interface()) - failT(t) - } - bsb, err := testMarshal(v1, h) - if err != nil { - logT(t, "Error encoding to stream: %d: Err: %v", i, err) - failT(t) - continue - } - if err = deepEqual(bsb, bss); err == nil { - logT(t, "++++++++ Bytes match") - } else { - logT(t, "???????? Bytes do not match. %v.", err) - xs := "--------" - if reflect.ValueOf(v).Kind() == reflect.Map { - xs = " " - logT(t, "%s It's a map. Ok that they don't match (dependent on ordering).", xs) - } else { - logT(t, "%s It's not a map. They should match.", xs) - failT(t) - } - logT(t, "%s FROM_FILE: %4d] %v", xs, len(bss), bss) - logT(t, "%s ENCODED: %4d] %v", xs, len(bsb), bsb) - } - } - bh.MapType = oldMapType -} - -// To test MsgpackSpecRpc, we test 3 scenarios: -// - Go Client to Go RPC Service (contained within TestMsgpackRpcSpec) -// - Go client to Python RPC Service (contained within doTestMsgpackRpcSpecGoClientToPythonSvc) -// - Python Client to Go RPC Service (contained within doTestMsgpackRpcSpecPythonClientToGoSvc) -// -// This allows us test the different calling conventions -// - Go Service requires only one argument -// - Python Service allows multiple arguments - -func doTestMsgpackRpcSpecGoClientToPythonSvc(t *testing.T) { - if testSkipRPCTests { - return - } - // openPorts are between 6700 and 6800 - r := rand.New(rand.NewSource(time.Now().UnixNano())) - openPort := strconv.FormatInt(6700+r.Int63n(99), 10) - // openPort := "6792" - cmd := exec.Command("python", "test.py", "rpc-server", openPort, "4") - checkErrT(t, cmd.Start()) - bs, err2 := net.Dial("tcp", ":"+openPort) - for i := 0; i < 10 && err2 != nil; i++ { - time.Sleep(50 * time.Millisecond) // time for python rpc server to start - bs, err2 = net.Dial("tcp", ":"+openPort) - } - checkErrT(t, err2) - cc := MsgpackSpecRpc.ClientCodec(bs, testMsgpackH) - cl := rpc.NewClientWithCodec(cc) - defer cl.Close() - var rstr string - checkErrT(t, cl.Call("EchoStruct", TestRpcABC{"Aa", "Bb", "Cc"}, &rstr)) - //checkEqualT(t, rstr, "{'A': 'Aa', 'B': 'Bb', 'C': 'Cc'}") - var mArgs MsgpackSpecRpcMultiArgs = []interface{}{"A1", "B2", "C3"} - checkErrT(t, cl.Call("Echo123", mArgs, &rstr)) - checkEqualT(t, rstr, "1:A1 2:B2 3:C3", "rstr=") - cmd.Process.Kill() -} - -func doTestMsgpackRpcSpecPythonClientToGoSvc(t *testing.T) { - if testSkipRPCTests { - return - } - port := testCodecRpcOne(t, MsgpackSpecRpc, testMsgpackH, false, 1*time.Second) - //time.Sleep(1000 * time.Millisecond) - cmd := exec.Command("python", "test.py", "rpc-client-go-service", strconv.Itoa(port)) - var cmdout []byte - var err error - if cmdout, err = cmd.CombinedOutput(); err != nil { - logT(t, "-------- Error running test.py rpc-client-go-service. Err: %v", err) - logT(t, " %v", string(cmdout)) - t.FailNow() - } - checkEqualT(t, string(cmdout), - fmt.Sprintf("%#v\n%#v\n", []string{"A1", "B2", "C3"}, TestRpcABC{"Aa", "Bb", "Cc"}), "cmdout=") -} - -func TestBincCodecsTable(t *testing.T) { - testCodecTableOne(t, testBincH) -} - -func TestBincCodecsMisc(t *testing.T) { - testCodecMiscOne(t, testBincH) -} - -func TestBincCodecsEmbeddedPointer(t *testing.T) { - testCodecEmbeddedPointer(t, testBincH) -} - -func TestBincStdEncIntf(t *testing.T) { - doTestStdEncIntf(t, "binc", testBincH) -} - -func TestSimpleCodecsTable(t *testing.T) { - testCodecTableOne(t, testSimpleH) -} - -func TestSimpleCodecsMisc(t *testing.T) { - testCodecMiscOne(t, testSimpleH) -} - -func TestSimpleCodecsEmbeddedPointer(t *testing.T) { - testCodecEmbeddedPointer(t, testSimpleH) -} - -func TestSimpleStdEncIntf(t *testing.T) { - doTestStdEncIntf(t, "simple", testSimpleH) -} - -func TestMsgpackCodecsTable(t *testing.T) { - testCodecTableOne(t, testMsgpackH) -} - -func TestMsgpackCodecsMisc(t *testing.T) { - testCodecMiscOne(t, testMsgpackH) -} - -func TestMsgpackCodecsEmbeddedPointer(t *testing.T) { - testCodecEmbeddedPointer(t, testMsgpackH) -} - -func TestMsgpackStdEncIntf(t *testing.T) { - doTestStdEncIntf(t, "msgpack", testMsgpackH) -} - -func TestCborCodecsTable(t *testing.T) { - testCodecTableOne(t, testCborH) -} - -func TestCborCodecsMisc(t *testing.T) { - testCodecMiscOne(t, testCborH) -} - -func TestCborCodecsEmbeddedPointer(t *testing.T) { - testCodecEmbeddedPointer(t, testCborH) -} - -func TestCborMapEncodeForCanonical(t *testing.T) { - doTestMapEncodeForCanonical(t, "cbor", testCborH) -} - -func TestCborCodecChan(t *testing.T) { - testCodecChan(t, testCborH) -} - -func TestCborStdEncIntf(t *testing.T) { - doTestStdEncIntf(t, "cbor", testCborH) -} - -func TestJsonCodecsTable(t *testing.T) { - testCodecTableOne(t, testJsonH) -} - -func TestJsonCodecsMisc(t *testing.T) { - testCodecMiscOne(t, testJsonH) -} - -func TestJsonCodecsEmbeddedPointer(t *testing.T) { - testCodecEmbeddedPointer(t, testJsonH) -} - -func TestJsonCodecChan(t *testing.T) { - testCodecChan(t, testJsonH) -} - -func TestJsonStdEncIntf(t *testing.T) { - doTestStdEncIntf(t, "json", testJsonH) -} - -// ----- ALL (framework based) ----- - -func TestAllEncCircularRef(t *testing.T) { - doTestEncCircularRef(t, "cbor", testCborH) -} - -func TestAllAnonCycle(t *testing.T) { - doTestAnonCycle(t, "cbor", testCborH) -} - -// ----- RPC ----- - -func TestBincRpcGo(t *testing.T) { - testCodecRpcOne(t, GoRpc, testBincH, true, 0) -} - -func TestSimpleRpcGo(t *testing.T) { - testCodecRpcOne(t, GoRpc, testSimpleH, true, 0) -} - -func TestMsgpackRpcGo(t *testing.T) { - testCodecRpcOne(t, GoRpc, testMsgpackH, true, 0) -} - -func TestCborRpcGo(t *testing.T) { - testCodecRpcOne(t, GoRpc, testCborH, true, 0) -} - -func TestJsonRpcGo(t *testing.T) { - testCodecRpcOne(t, GoRpc, testJsonH, true, 0) -} - -func TestMsgpackRpcSpec(t *testing.T) { - testCodecRpcOne(t, MsgpackSpecRpc, testMsgpackH, true, 0) -} - -func TestBincUnderlyingType(t *testing.T) { - testCodecUnderlyingType(t, testBincH) -} - -func TestJsonLargeInteger(t *testing.T) { - for _, i := range []uint8{'L', 'A', 0} { - for _, j := range []interface{}{ - 1 << 60, - -(1 << 60), - 0, - 1 << 20, - -(1 << 20), - uint(1 << 60), - uint(0), - uint(1 << 20), - } { - doTestJsonLargeInteger(t, j, i) - } - } -} - -// TODO: -// Add Tests for: -// - decoding empty list/map in stream into a nil slice/map -// - binary(M|Unm)arsher support for time.Time (e.g. cbor encoding) -// - text(M|Unm)arshaler support for time.Time (e.g. json encoding) -// - non fast-path scenarios e.g. map[string]uint16, []customStruct. -// Expand cbor to include indefinite length stuff for this non-fast-path types. -// This may not be necessary, since we have the manual tests (fastpathEnabled=false) to test/validate with. -// - CodecSelfer -// Ensure it is called when (en|de)coding interface{} or reflect.Value (2 different codepaths). -// - interfaces: textMarshaler, binaryMarshaler, codecSelfer -// - struct tags: -// on anonymous fields, _struct (all fields), etc -// - codecgen of struct containing channels. -// - bad input with large array length prefix -// -// Cleanup tests: -// - The are brittle in their handling of validation and skipping diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/README.md b/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/README.md deleted file mode 100644 index 3ae8a056f..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# codecgen tool - -Generate is given a list of *.go files to parse, and an output file (fout), -codecgen will create an output file __file.go__ which -contains `codec.Selfer` implementations for the named types found -in the files parsed. - -Using codecgen is very straightforward. - -**Download and install the tool** - -`go get -u github.com/ugorji/go/codec/codecgen` - -**Run the tool on your files** - -The command line format is: - -`codecgen [options] (-o outfile) (infile ...)` - -```sh -% codecgen -? -Usage of codecgen: - -c="github.com/ugorji/go/codec": codec path - -o="": out file - -r=".*": regex for type name to match - -rt="": tags for go run - -t="": build tag to put in file - -u=false: Use unsafe, e.g. to avoid unnecessary allocation on []byte->string - -x=false: keep temp file - -% codecgen -o values_codecgen.go values.go values2.go moretypedefs.go -``` - -Please see the [blog article](http://ugorji.net/blog/go-codecgen) -for more information on how to use the tool. - diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/gen.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/gen.go deleted file mode 100644 index f370b4c79..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/gen.go +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// codecgen generates codec.Selfer implementations for a set of types. -package main - -import ( - "bufio" - "bytes" - "errors" - "flag" - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "math/rand" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "text/template" - "time" -) - -const genCodecPkg = "codec1978" // keep this in sync with codec.genCodecPkg - -const genFrunMainTmpl = `//+build ignore - -package main -{{ if .Types }}import "{{ .ImportPath }}"{{ end }} -func main() { - {{ $.PackageName }}.CodecGenTempWrite{{ .RandString }}() -} -` - -// const genFrunPkgTmpl = `//+build codecgen -const genFrunPkgTmpl = ` -package {{ $.PackageName }} - -import ( - {{ if not .CodecPkgFiles }}{{ .CodecPkgName }} "{{ .CodecImportPath }}"{{ end }} - "os" - "reflect" - "bytes" - "strings" - "go/format" -) - -func CodecGenTempWrite{{ .RandString }}() { - fout, err := os.Create("{{ .OutFile }}") - if err != nil { - panic(err) - } - defer fout.Close() - var out bytes.Buffer - - var typs []reflect.Type -{{ range $index, $element := .Types }} - var t{{ $index }} {{ . }} - typs = append(typs, reflect.TypeOf(t{{ $index }})) -{{ end }} - {{ if not .CodecPkgFiles }}{{ .CodecPkgName }}.{{ end }}Gen(&out, "{{ .BuildTag }}", "{{ .PackageName }}", "{{ .RandString }}", {{ .UseUnsafe }}, {{ if not .CodecPkgFiles }}{{ .CodecPkgName }}.{{ end }}NewTypeInfos(strings.Split("{{ .StructTags }}", ",")), typs...) - bout, err := format.Source(out.Bytes()) - if err != nil { - fout.Write(out.Bytes()) - panic(err) - } - fout.Write(bout) -} - -` - -// Generate is given a list of *.go files to parse, and an output file (fout). -// -// It finds all types T in the files, and it creates 2 tmp files (frun). -// - main package file passed to 'go run' -// - package level file which calls *genRunner.Selfer to write Selfer impls for each T. -// We use a package level file so that it can reference unexported types in the package being worked on. -// Tool then executes: "go run __frun__" which creates fout. -// fout contains Codec(En|De)codeSelf implementations for every type T. -// -func Generate(outfile, buildTag, codecPkgPath string, uid int64, useUnsafe bool, goRunTag string, - st string, regexName *regexp.Regexp, deleteTempFile bool, infiles ...string) (err error) { - // For each file, grab AST, find each type, and write a call to it. - if len(infiles) == 0 { - return - } - if outfile == "" || codecPkgPath == "" { - err = errors.New("outfile and codec package path cannot be blank") - return - } - if uid < 0 { - uid = -uid - } - if uid == 0 { - rr := rand.New(rand.NewSource(time.Now().UnixNano())) - uid = 101 + rr.Int63n(9777) - } - // We have to parse dir for package, before opening the temp file for writing (else ImportDir fails). - // Also, ImportDir(...) must take an absolute path. - lastdir := filepath.Dir(outfile) - absdir, err := filepath.Abs(lastdir) - if err != nil { - return - } - pkg, err := build.Default.ImportDir(absdir, build.AllowBinary) - if err != nil { - return - } - type tmplT struct { - CodecPkgName string - CodecImportPath string - ImportPath string - OutFile string - PackageName string - RandString string - BuildTag string - StructTags string - Types []string - CodecPkgFiles bool - UseUnsafe bool - } - tv := tmplT{ - CodecPkgName: genCodecPkg, - OutFile: outfile, - CodecImportPath: codecPkgPath, - BuildTag: buildTag, - UseUnsafe: useUnsafe, - RandString: strconv.FormatInt(uid, 10), - StructTags: st, - } - tv.ImportPath = pkg.ImportPath - if tv.ImportPath == tv.CodecImportPath { - tv.CodecPkgFiles = true - tv.CodecPkgName = "codec" - } - astfiles := make([]*ast.File, len(infiles)) - for i, infile := range infiles { - if filepath.Dir(infile) != lastdir { - err = errors.New("in files must all be in same directory as outfile") - return - } - fset := token.NewFileSet() - astfiles[i], err = parser.ParseFile(fset, infile, nil, 0) - if err != nil { - return - } - if i == 0 { - tv.PackageName = astfiles[i].Name.Name - if tv.PackageName == "main" { - // codecgen cannot be run on types in the 'main' package. - // A temporary 'main' package must be created, and should reference the fully built - // package containing the types. - // Also, the temporary main package will conflict with the main package which already has a main method. - err = errors.New("codecgen cannot be run on types in the 'main' package") - return - } - } - } - - for _, f := range astfiles { - for _, d := range f.Decls { - if gd, ok := d.(*ast.GenDecl); ok { - for _, dd := range gd.Specs { - if td, ok := dd.(*ast.TypeSpec); ok { - // if len(td.Name.Name) == 0 || td.Name.Name[0] > 'Z' || td.Name.Name[0] < 'A' { - if len(td.Name.Name) == 0 { - continue - } - - // only generate for: - // struct: StructType - // primitives (numbers, bool, string): Ident - // map: MapType - // slice, array: ArrayType - // chan: ChanType - // do not generate: - // FuncType, InterfaceType, StarExpr (ptr), etc - switch td.Type.(type) { - case *ast.StructType, *ast.Ident, *ast.MapType, *ast.ArrayType, *ast.ChanType: - if regexName.FindStringIndex(td.Name.Name) != nil { - tv.Types = append(tv.Types, td.Name.Name) - } - } - } - } - } - } - } - - if len(tv.Types) == 0 { - return - } - - // we cannot use ioutil.TempFile, because we cannot guarantee the file suffix (.go). - // Also, we cannot create file in temp directory, - // because go run will not work (as it needs to see the types here). - // Consequently, create the temp file in the current directory, and remove when done. - - // frun, err = ioutil.TempFile("", "codecgen-") - // frunName := filepath.Join(os.TempDir(), "codecgen-"+strconv.FormatInt(time.Now().UnixNano(), 10)+".go") - - frunMainName := "codecgen-main-" + tv.RandString + ".generated.go" - frunPkgName := "codecgen-pkg-" + tv.RandString + ".generated.go" - if deleteTempFile { - defer os.Remove(frunMainName) - defer os.Remove(frunPkgName) - } - // var frunMain, frunPkg *os.File - if _, err = gen1(frunMainName, genFrunMainTmpl, &tv); err != nil { - return - } - if _, err = gen1(frunPkgName, genFrunPkgTmpl, &tv); err != nil { - return - } - - // remove outfile, so "go run ..." will not think that types in outfile already exist. - os.Remove(outfile) - - // execute go run frun - cmd := exec.Command("go", "run", "-tags="+goRunTag, frunMainName) //, frunPkg.Name()) - var buf bytes.Buffer - cmd.Stdout = &buf - cmd.Stderr = &buf - if err = cmd.Run(); err != nil { - err = fmt.Errorf("error running 'go run %s': %v, console: %s", - frunMainName, err, buf.Bytes()) - return - } - os.Stdout.Write(buf.Bytes()) - return -} - -func gen1(frunName, tmplStr string, tv interface{}) (frun *os.File, err error) { - os.Remove(frunName) - if frun, err = os.Create(frunName); err != nil { - return - } - defer frun.Close() - - t := template.New("") - if t, err = t.Parse(tmplStr); err != nil { - return - } - bw := bufio.NewWriter(frun) - if err = t.Execute(bw, tv); err != nil { - return - } - if err = bw.Flush(); err != nil { - return - } - return -} - -func main() { - o := flag.String("o", "", "out file") - c := flag.String("c", genCodecPath, "codec path") - t := flag.String("t", "", "build tag to put in file") - r := flag.String("r", ".*", "regex for type name to match") - rt := flag.String("rt", "", "tags for go run") - st := flag.String("st", "codec,json", "struct tag keys to introspect") - x := flag.Bool("x", false, "keep temp file") - u := flag.Bool("u", false, "Use unsafe, e.g. to avoid unnecessary allocation on []byte->string") - d := flag.Int64("d", 0, "random identifier for use in generated code") - flag.Parse() - if err := Generate(*o, *t, *c, *d, *u, *rt, *st, - regexp.MustCompile(*r), !*x, flag.Args()...); err != nil { - fmt.Fprintf(os.Stderr, "codecgen error: %v\n", err) - os.Exit(1) - } -} diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/z.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/z.go deleted file mode 100644 index e120a4eb9..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen/z.go +++ /dev/null @@ -1,3 +0,0 @@ -package main - -const genCodecPath = "github.com/ugorji/go/codec" diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen_test.go deleted file mode 100644 index a73497e91..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/codecgen_test.go +++ /dev/null @@ -1,24 +0,0 @@ -//+build x,codecgen - -package codec - -import ( - "fmt" - "testing" -) - -func _TestCodecgenJson1(t *testing.T) { - // This is just a simplistic test for codecgen. - // It is typically disabled. We only enable it for debugging purposes. - const callCodecgenDirect bool = true - v := newTestStruc(2, false, !testSkipIntf, false) - var bs []byte - e := NewEncoderBytes(&bs, testJsonH) - if callCodecgenDirect { - v.CodecEncodeSelf(e) - e.w.atEndOfEncode() - } else { - e.MustEncode(v) - } - fmt.Printf("%s\n", bs) -} diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/helper_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/helper_test.go deleted file mode 100644 index e1dea52f4..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/helper_test.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// All non-std package dependencies related to testing live in this file, -// so porting to different environment is easy (just update functions). -// -// This file sets up the variables used, including testInitFns. -// Each file should add initialization that should be performed -// after flags are parsed. -// -// init is a multi-step process: -// - setup vars (handled by init functions in each file) -// - parse flags -// - setup derived vars (handled by pre-init registered functions - registered in init function) -// - post init (handled by post-init registered functions - registered in init function) -// This way, no one has to manage carefully control the initialization -// using file names, etc. -// -// Tests which require external dependencies need the -tag=x parameter. -// They should be run as: -// go test -tags=x -run=. -// Benchmarks should also take this parameter, to include the sereal, xdr, etc. -// To run against codecgen, etc, make sure you pass extra parameters. -// Example usage: -// go test "-tags=x codecgen unsafe" -bench=. -// -// To fully test everything: -// go test -tags=x -benchtime=100ms -tv -bg -bi -brw -bu -v -run=. -bench=. - -// Handling flags -// codec_test.go will define a set of global flags for testing, including: -// - Use Reset -// - Use IO reader/writer (vs direct bytes) -// - Set Canonical -// - Set InternStrings -// - Use Symbols -// -// This way, we can test them all by running same set of tests with a different -// set of flags. -// -// Following this, all the benchmarks will utilize flags set by codec_test.go -// and will not redefine these "global" flags. - -import ( - "bytes" - "errors" - "flag" - "fmt" - "reflect" - "sync" - "testing" -) - -type testHED struct { - H Handle - E *Encoder - D *Decoder -} - -var ( - testNoopH = NoopHandle(8) - testMsgpackH = &MsgpackHandle{} - testBincH = &BincHandle{} - testSimpleH = &SimpleHandle{} - testCborH = &CborHandle{} - testJsonH = &JsonHandle{} - - testHandles []Handle - testPreInitFns []func() - testPostInitFns []func() - - testOnce sync.Once - - testHEDs []testHED -) - -func init() { - testHEDs = make([]testHED, 0, 32) - testHandles = append(testHandles, - testNoopH, testMsgpackH, testBincH, testSimpleH, - testCborH, testJsonH) -} - -func testHEDGet(h Handle) *testHED { - for i := range testHEDs { - v := &testHEDs[i] - if v.H == h { - return v - } - } - testHEDs = append(testHEDs, testHED{h, NewEncoder(nil, h), NewDecoder(nil, h)}) - return &testHEDs[len(testHEDs)-1] -} - -func testInitAll() { - flag.Parse() - for _, f := range testPreInitFns { - f() - } - for _, f := range testPostInitFns { - f() - } -} - -func testCodecEncode(ts interface{}, bsIn []byte, - fn func([]byte) *bytes.Buffer, h Handle) (bs []byte, err error) { - // bs = make([]byte, 0, approxSize) - var e *Encoder - var buf *bytes.Buffer - if testUseReset { - e = testHEDGet(h).E - } else { - e = NewEncoder(nil, h) - } - if testUseIoEncDec { - buf = fn(bsIn) - e.Reset(buf) - } else { - bs = bsIn - e.ResetBytes(&bs) - } - if testUseMust { - e.MustEncode(ts) - } else { - err = e.Encode(ts) - } - if testUseIoEncDec { - bs = buf.Bytes() - } - return -} - -func testCodecDecode(bs []byte, ts interface{}, h Handle) (err error) { - var d *Decoder - var buf *bytes.Reader - if testUseReset { - d = testHEDGet(h).D - } else { - d = NewDecoder(nil, h) - } - if testUseIoEncDec { - buf = bytes.NewReader(bs) - d.Reset(buf) - } else { - d.ResetBytes(bs) - } - if testUseMust { - d.MustDecode(ts) - } else { - err = d.Decode(ts) - } - return -} - -// ----- functions below are used only by tests (not benchmarks) - -const ( - testLogToT = true - failNowOnFail = true -) - -func checkErrT(t *testing.T, err error) { - if err != nil { - logT(t, err.Error()) - failT(t) - } -} - -func checkEqualT(t *testing.T, v1 interface{}, v2 interface{}, desc string) (err error) { - if err = deepEqual(v1, v2); err != nil { - logT(t, "Not Equal: %s: %v. v1: %v, v2: %v", desc, err, v1, v2) - failT(t) - } - return -} - -func failT(t *testing.T) { - if failNowOnFail { - t.FailNow() - } else { - t.Fail() - } -} - -// --- these functions are used by both benchmarks and tests - -func deepEqual(v1, v2 interface{}) (err error) { - if !reflect.DeepEqual(v1, v2) { - err = errors.New("Not Match") - } - return -} - -func logT(x interface{}, format string, args ...interface{}) { - if t, ok := x.(*testing.T); ok && t != nil && testLogToT { - if testVerbose { - t.Logf(format, args...) - } - } else if b, ok := x.(*testing.B); ok && b != nil && testLogToT { - b.Logf(format, args...) - } else { - if len(format) == 0 || format[len(format)-1] != '\n' { - format = format + "\n" - } - fmt.Printf(format, args...) - } -} - -func approxDataSize(rv reflect.Value) (sum int) { - switch rk := rv.Kind(); rk { - case reflect.Invalid: - case reflect.Ptr, reflect.Interface: - sum += int(rv.Type().Size()) - sum += approxDataSize(rv.Elem()) - case reflect.Slice: - sum += int(rv.Type().Size()) - for j := 0; j < rv.Len(); j++ { - sum += approxDataSize(rv.Index(j)) - } - case reflect.String: - sum += int(rv.Type().Size()) - sum += rv.Len() - case reflect.Map: - sum += int(rv.Type().Size()) - for _, mk := range rv.MapKeys() { - sum += approxDataSize(mk) - sum += approxDataSize(rv.MapIndex(mk)) - } - case reflect.Struct: - //struct size already includes the full data size. - //sum += int(rv.Type().Size()) - for j := 0; j < rv.NumField(); j++ { - sum += approxDataSize(rv.Field(j)) - } - default: - //pure value types - sum += int(rv.Type().Size()) - } - return -} diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/py_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/py_test.go deleted file mode 100644 index bedd7b0dc..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/py_test.go +++ /dev/null @@ -1,30 +0,0 @@ -//+build x - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// These tests are used to verify msgpack and cbor implementations against their python libraries. -// If you have the library installed, you can enable the tests back by running: go test -tags=x . -// Look at test.py for how to setup your environment. - -import ( - "testing" -) - -func TestMsgpackPythonGenStreams(t *testing.T) { - doTestPythonGenStreams(t, "msgpack", testMsgpackH) -} - -func TestCborPythonGenStreams(t *testing.T) { - doTestPythonGenStreams(t, "cbor", testCborH) -} - -func TestMsgpackRpcSpecGoClientToPythonSvc(t *testing.T) { - doTestMsgpackRpcSpecGoClientToPythonSvc(t) -} - -func TestMsgpackRpcSpecPythonClientToGoSvc(t *testing.T) { - doTestMsgpackRpcSpecPythonClientToGoSvc(t) -} diff --git a/Godeps/_workspace/src/github.com/ugorji/go/codec/values_test.go b/Godeps/_workspace/src/github.com/ugorji/go/codec/values_test.go deleted file mode 100644 index 4ec28e131..000000000 --- a/Godeps/_workspace/src/github.com/ugorji/go/codec/values_test.go +++ /dev/null @@ -1,203 +0,0 @@ -// // +build testing - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// This file contains values used by tests and benchmarks. -// JSON/BSON do not like maps with keys that are not strings, -// so we only use maps with string keys here. - -import ( - "math" - "time" -) - -var testStrucTime = time.Date(2012, 2, 2, 2, 2, 2, 2000, time.UTC).UTC() - -type AnonInTestStruc struct { - AS string - AI64 int64 - AI16 int16 - AUi64 uint64 - ASslice []string - AI64slice []int64 - AF64slice []float64 - // AMI32U32 map[int32]uint32 - // AMU32F64 map[uint32]float64 // json/bson do not like it - AMSU16 map[string]uint16 -} - -type AnonInTestStrucIntf struct { - Islice []interface{} - Ms map[string]interface{} - Nintf interface{} //don't set this, so we can test for nil - T time.Time -} - -type TestStruc struct { - _struct struct{} `codec:",omitempty"` //set omitempty for every field - - S string - I64 int64 - I16 int16 - Ui64 uint64 - Ui8 uint8 - B bool - By uint8 // byte: msgp doesn't like byte - - Sslice []string - I64slice []int64 - I16slice []int16 - Ui64slice []uint64 - Ui8slice []uint8 - Bslice []bool - Byslice []byte - - Iptrslice []*int64 - - // TODO: test these separately, specifically for reflection and codecgen. - // Unfortunately, ffjson doesn't support these. Its compilation even fails. - // Ui64array [4]uint64 - // Ui64slicearray [][4]uint64 - - AnonInTestStruc - - //M map[interface{}]interface{} `json:"-",bson:"-"` - Msi64 map[string]int64 - - // make this a ptr, so that it could be set or not. - // for comparison (e.g. with msgp), give it a struct tag (so it is not inlined), - // make this one omitempty (so it is included if nil). - *AnonInTestStrucIntf `codec:",omitempty"` - - Nmap map[string]bool //don't set this, so we can test for nil - Nslice []byte //don't set this, so we can test for nil - Nint64 *int64 //don't set this, so we can test for nil - Mtsptr map[string]*TestStruc - Mts map[string]TestStruc - Its []*TestStruc - Nteststruc *TestStruc -} - -// small struct for testing that codecgen works for unexported types -type tLowerFirstLetter struct { - I int - u uint64 - S string - b []byte -} - -func newTestStruc(depth int, bench bool, useInterface, useStringKeyOnly bool) (ts *TestStruc) { - var i64a, i64b, i64c, i64d int64 = 64, 6464, 646464, 64646464 - - ts = &TestStruc{ - S: "some string", - I64: math.MaxInt64 * 2 / 3, // 64, - I16: 1616, - Ui64: uint64(int64(math.MaxInt64 * 2 / 3)), // 64, //don't use MaxUint64, as bson can't write it - Ui8: 160, - B: true, - By: 5, - - Sslice: []string{"one", "two", "three"}, - I64slice: []int64{1111, 2222, 3333}, - I16slice: []int16{44, 55, 66}, - Ui64slice: []uint64{12121212, 34343434, 56565656}, - Ui8slice: []uint8{210, 211, 212}, - Bslice: []bool{true, false, true, false}, - Byslice: []byte{13, 14, 15}, - - Msi64: map[string]int64{ - "one": 1, - "two": 2, - }, - AnonInTestStruc: AnonInTestStruc{ - // There's more leeway in altering this. - AS: "A-String", - AI64: -64646464, - AI16: 1616, - AUi64: 64646464, - // (U+1D11E)G-clef character may be represented in json as "\uD834\uDD1E". - // single reverse solidus character may be represented in json as "\u005C". - // include these in ASslice below. - ASslice: []string{"Aone", "Atwo", "Athree", - "Afour.reverse_solidus.\u005c", "Afive.Gclef.\U0001d11E"}, - AI64slice: []int64{1, -22, 333, -4444, 55555, -666666}, - AMSU16: map[string]uint16{"1": 1, "22": 2, "333": 3, "4444": 4}, - AF64slice: []float64{11.11e-11, 22.22E+22, 33.33E-33, 44.44e+44, 555.55E-6, 666.66E6}, - }, - } - if useInterface { - ts.AnonInTestStrucIntf = &AnonInTestStrucIntf{ - Islice: []interface{}{"true", true, "no", false, uint64(288), float64(0.4)}, - Ms: map[string]interface{}{ - "true": "true", - "int64(9)": false, - }, - T: testStrucTime, - } - } - - //For benchmarks, some things will not work. - if !bench { - //json and bson require string keys in maps - //ts.M = map[interface{}]interface{}{ - // true: "true", - // int8(9): false, - //} - //gob cannot encode nil in element in array (encodeArray: nil element) - ts.Iptrslice = []*int64{nil, &i64a, nil, &i64b, nil, &i64c, nil, &i64d, nil} - // ts.Iptrslice = nil - } - if !useStringKeyOnly { - // ts.AnonInTestStruc.AMU32F64 = map[uint32]float64{1: 1, 2: 2, 3: 3} // Json/Bson barf - } - if depth > 0 { - depth-- - if ts.Mtsptr == nil { - ts.Mtsptr = make(map[string]*TestStruc) - } - if ts.Mts == nil { - ts.Mts = make(map[string]TestStruc) - } - ts.Mtsptr["0"] = newTestStruc(depth, bench, useInterface, useStringKeyOnly) - ts.Mts["0"] = *(ts.Mtsptr["0"]) - ts.Its = append(ts.Its, ts.Mtsptr["0"]) - } - return -} - -// Some other types - -type Sstring string -type Bbool bool -type Sstructsmall struct { - A int -} - -type Sstructbig struct { - A int - B bool - c string - // Sval Sstruct - Ssmallptr *Sstructsmall - Ssmall *Sstructsmall - Sptr *Sstructbig -} - -type SstructbigMapBySlice struct { - _struct struct{} `codec:",toarray"` - A int - B bool - c string - // Sval Sstruct - Ssmallptr *Sstructsmall - Ssmall *Sstructsmall - Sptr *Sstructbig -} - -type Sinterface interface { - Noop() -} diff --git a/Godeps/_workspace/src/golang.org/x/net/context/context_test.go b/Godeps/_workspace/src/golang.org/x/net/context/context_test.go deleted file mode 100644 index e64afa64c..000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/context_test.go +++ /dev/null @@ -1,575 +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 - -import ( - "fmt" - "math/rand" - "runtime" - "strings" - "sync" - "testing" - "time" -) - -// otherContext is a Context that's not one of the types defined in context.go. -// This lets us test code paths that differ based on the underlying type of the -// Context. -type otherContext struct { - Context -} - -func TestBackground(t *testing.T) { - c := Background() - if c == nil { - t.Fatalf("Background returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.Background"; got != want { - t.Errorf("Background().String() = %q want %q", got, want) - } -} - -func TestTODO(t *testing.T) { - c := TODO() - if c == nil { - t.Fatalf("TODO returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.TODO"; got != want { - t.Errorf("TODO().String() = %q want %q", got, want) - } -} - -func TestWithCancel(t *testing.T) { - c1, cancel := WithCancel(Background()) - - if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want { - t.Errorf("c1.String() = %q want %q", got, want) - } - - o := otherContext{c1} - c2, _ := WithCancel(o) - contexts := []Context{c1, o, c2} - - for i, c := range contexts { - if d := c.Done(); d == nil { - t.Errorf("c[%d].Done() == %v want non-nil", i, d) - } - if e := c.Err(); e != nil { - t.Errorf("c[%d].Err() == %v want nil", i, e) - } - - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - } - - cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate - - for i, c := range contexts { - select { - case <-c.Done(): - default: - t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i) - } - if e := c.Err(); e != Canceled { - t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled) - } - } -} - -func TestParentFinishesChild(t *testing.T) { - // Context tree: - // parent -> cancelChild - // parent -> valueChild -> timerChild - parent, cancel := WithCancel(Background()) - cancelChild, stop := WithCancel(parent) - defer stop() - valueChild := WithValue(parent, "key", "value") - timerChild, stop := WithTimeout(valueChild, 10000*time.Hour) - defer stop() - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-cancelChild.Done(): - t.Errorf("<-cancelChild.Done() == %v want nothing (it should block)", x) - case x := <-timerChild.Done(): - t.Errorf("<-timerChild.Done() == %v want nothing (it should block)", x) - case x := <-valueChild.Done(): - t.Errorf("<-valueChild.Done() == %v want nothing (it should block)", x) - default: - } - - // The parent's children should contain the two cancelable children. - pc := parent.(*cancelCtx) - cc := cancelChild.(*cancelCtx) - tc := timerChild.(*timerCtx) - pc.mu.Lock() - if len(pc.children) != 2 || !pc.children[cc] || !pc.children[tc] { - t.Errorf("bad linkage: pc.children = %v, want %v and %v", - pc.children, cc, tc) - } - pc.mu.Unlock() - - if p, ok := parentCancelCtx(cc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(cancelChild.Context) = %v, %v want %v, true", p, ok, pc) - } - if p, ok := parentCancelCtx(tc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc) - } - - cancel() - - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("pc.cancel didn't clear pc.children = %v", pc.children) - } - pc.mu.Unlock() - - // parent and children should all be finished. - check := func(ctx Context, name string) { - select { - case <-ctx.Done(): - default: - t.Errorf("<-%s.Done() blocked, but shouldn't have", name) - } - if e := ctx.Err(); e != Canceled { - t.Errorf("%s.Err() == %v want %v", name, e, Canceled) - } - } - check(parent, "parent") - check(cancelChild, "cancelChild") - check(valueChild, "valueChild") - check(timerChild, "timerChild") - - // WithCancel should return a canceled context on a canceled parent. - precanceledChild := WithValue(parent, "key", "value") - select { - case <-precanceledChild.Done(): - default: - t.Errorf("<-precanceledChild.Done() blocked, but shouldn't have") - } - if e := precanceledChild.Err(); e != Canceled { - t.Errorf("precanceledChild.Err() == %v want %v", e, Canceled) - } -} - -func TestChildFinishesFirst(t *testing.T) { - cancelable, stop := WithCancel(Background()) - defer stop() - for _, parent := range []Context{Background(), cancelable} { - child, cancel := WithCancel(parent) - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-child.Done(): - t.Errorf("<-child.Done() == %v want nothing (it should block)", x) - default: - } - - cc := child.(*cancelCtx) - pc, pcok := parent.(*cancelCtx) // pcok == false when parent == Background() - if p, ok := parentCancelCtx(cc.Context); ok != pcok || (ok && pc != p) { - t.Errorf("bad linkage: parentCancelCtx(cc.Context) = %v, %v want %v, %v", p, ok, pc, pcok) - } - - if pcok { - pc.mu.Lock() - if len(pc.children) != 1 || !pc.children[cc] { - t.Errorf("bad linkage: pc.children = %v, cc = %v", pc.children, cc) - } - pc.mu.Unlock() - } - - cancel() - - if pcok { - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("child's cancel didn't remove self from pc.children = %v", pc.children) - } - pc.mu.Unlock() - } - - // child should be finished. - select { - case <-child.Done(): - default: - t.Errorf("<-child.Done() blocked, but shouldn't have") - } - if e := child.Err(); e != Canceled { - t.Errorf("child.Err() == %v want %v", e, Canceled) - } - - // parent should not be finished. - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - default: - } - if e := parent.Err(); e != nil { - t.Errorf("parent.Err() == %v want nil", e) - } - } -} - -func testDeadline(c Context, wait time.Duration, t *testing.T) { - select { - case <-time.After(wait): - t.Fatalf("context should have timed out") - case <-c.Done(): - } - if e := c.Err(); e != DeadlineExceeded { - t.Errorf("c.Err() == %v want %v", e, DeadlineExceeded) - } -} - -func TestDeadline(t *testing.T) { - c, _ := WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 200*time.Millisecond, t) - - c, _ = WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - o := otherContext{c} - testDeadline(o, 200*time.Millisecond, t) - - c, _ = WithDeadline(Background(), time.Now().Add(100*time.Millisecond)) - o = otherContext{c} - c, _ = WithDeadline(o, time.Now().Add(300*time.Millisecond)) - testDeadline(c, 200*time.Millisecond, t) -} - -func TestTimeout(t *testing.T) { - c, _ := WithTimeout(Background(), 100*time.Millisecond) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 200*time.Millisecond, t) - - c, _ = WithTimeout(Background(), 100*time.Millisecond) - o := otherContext{c} - testDeadline(o, 200*time.Millisecond, t) - - c, _ = WithTimeout(Background(), 100*time.Millisecond) - o = otherContext{c} - c, _ = WithTimeout(o, 300*time.Millisecond) - testDeadline(c, 200*time.Millisecond, t) -} - -func TestCanceledTimeout(t *testing.T) { - c, _ := WithTimeout(Background(), 200*time.Millisecond) - o := otherContext{c} - c, cancel := WithTimeout(o, 400*time.Millisecond) - cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate - select { - case <-c.Done(): - default: - t.Errorf("<-c.Done() blocked, but shouldn't have") - } - if e := c.Err(); e != Canceled { - t.Errorf("c.Err() == %v want %v", e, Canceled) - } -} - -type key1 int -type key2 int - -var k1 = key1(1) -var k2 = key2(1) // same int as k1, different type -var k3 = key2(3) // same type as k2, different int - -func TestValues(t *testing.T) { - check := func(c Context, nm, v1, v2, v3 string) { - if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { - t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) - } - if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { - t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) - } - if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { - t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) - } - } - - c0 := Background() - check(c0, "c0", "", "", "") - - c1 := WithValue(Background(), k1, "c1k1") - check(c1, "c1", "c1k1", "", "") - - if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { - t.Errorf("c.String() = %q want %q", got, want) - } - - c2 := WithValue(c1, k2, "c2k2") - check(c2, "c2", "c1k1", "c2k2", "") - - c3 := WithValue(c2, k3, "c3k3") - check(c3, "c2", "c1k1", "c2k2", "c3k3") - - c4 := WithValue(c3, k1, nil) - check(c4, "c4", "", "c2k2", "c3k3") - - o0 := otherContext{Background()} - check(o0, "o0", "", "", "") - - o1 := otherContext{WithValue(Background(), k1, "c1k1")} - check(o1, "o1", "c1k1", "", "") - - o2 := WithValue(o1, k2, "o2k2") - check(o2, "o2", "c1k1", "o2k2", "") - - o3 := otherContext{c4} - check(o3, "o3", "", "c2k2", "c3k3") - - o4 := WithValue(o3, k3, nil) - check(o4, "o4", "", "c2k2", "") -} - -func TestAllocs(t *testing.T) { - bg := Background() - for _, test := range []struct { - desc string - f func() - limit float64 - gccgoLimit float64 - }{ - { - desc: "Background()", - f: func() { Background() }, - limit: 0, - gccgoLimit: 0, - }, - { - desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1), - f: func() { - c := WithValue(bg, k1, nil) - c.Value(k1) - }, - limit: 3, - gccgoLimit: 3, - }, - { - desc: "WithTimeout(bg, 15*time.Millisecond)", - f: func() { - c, _ := WithTimeout(bg, 15*time.Millisecond) - <-c.Done() - }, - limit: 8, - gccgoLimit: 15, - }, - { - desc: "WithCancel(bg)", - f: func() { - c, cancel := WithCancel(bg) - cancel() - <-c.Done() - }, - limit: 5, - gccgoLimit: 8, - }, - { - desc: "WithTimeout(bg, 100*time.Millisecond)", - f: func() { - c, cancel := WithTimeout(bg, 100*time.Millisecond) - cancel() - <-c.Done() - }, - limit: 8, - gccgoLimit: 25, - }, - } { - limit := test.limit - if runtime.Compiler == "gccgo" { - // gccgo does not yet do escape analysis. - // TOOD(iant): Remove this when gccgo does do escape analysis. - limit = test.gccgoLimit - } - if n := testing.AllocsPerRun(100, test.f); n > limit { - t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit)) - } - } -} - -func TestSimultaneousCancels(t *testing.T) { - root, cancel := WithCancel(Background()) - m := map[Context]CancelFunc{root: cancel} - q := []Context{root} - // Create a tree of contexts. - for len(q) != 0 && len(m) < 100 { - parent := q[0] - q = q[1:] - for i := 0; i < 4; i++ { - ctx, cancel := WithCancel(parent) - m[ctx] = cancel - q = append(q, ctx) - } - } - // Start all the cancels in a random order. - var wg sync.WaitGroup - wg.Add(len(m)) - for _, cancel := range m { - go func(cancel CancelFunc) { - cancel() - wg.Done() - }(cancel) - } - // Wait on all the contexts in a random order. - for ctx := range m { - select { - case <-ctx.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for <-ctx.Done(); stacks:\n%s", buf[:n]) - } - } - // Wait for all the cancel functions to return. - done := make(chan struct{}) - go func() { - wg.Wait() - close(done) - }() - select { - case <-done: - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for cancel functions; stacks:\n%s", buf[:n]) - } -} - -func TestInterlockedCancels(t *testing.T) { - parent, cancelParent := WithCancel(Background()) - child, cancelChild := WithCancel(parent) - go func() { - parent.Done() - cancelChild() - }() - cancelParent() - select { - case <-child.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for child.Done(); stacks:\n%s", buf[:n]) - } -} - -func TestLayersCancel(t *testing.T) { - testLayers(t, time.Now().UnixNano(), false) -} - -func TestLayersTimeout(t *testing.T) { - testLayers(t, time.Now().UnixNano(), true) -} - -func testLayers(t *testing.T, seed int64, testTimeout bool) { - rand.Seed(seed) - errorf := func(format string, a ...interface{}) { - t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...) - } - const ( - timeout = 200 * time.Millisecond - minLayers = 30 - ) - type value int - var ( - vals []*value - cancels []CancelFunc - numTimers int - ctx = Background() - ) - for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ { - switch rand.Intn(3) { - case 0: - v := new(value) - ctx = WithValue(ctx, v, v) - vals = append(vals, v) - case 1: - var cancel CancelFunc - ctx, cancel = WithCancel(ctx) - cancels = append(cancels, cancel) - case 2: - var cancel CancelFunc - ctx, cancel = WithTimeout(ctx, timeout) - cancels = append(cancels, cancel) - numTimers++ - } - } - checkValues := func(when string) { - for _, key := range vals { - if val := ctx.Value(key).(*value); key != val { - errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key) - } - } - } - select { - case <-ctx.Done(): - errorf("ctx should not be canceled yet") - default: - } - if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) { - t.Errorf("ctx.String() = %q want prefix %q", s, prefix) - } - t.Log(ctx) - checkValues("before cancel") - if testTimeout { - select { - case <-ctx.Done(): - case <-time.After(timeout + timeout/10): - errorf("ctx should have timed out") - } - checkValues("after timeout") - } else { - cancel := cancels[rand.Intn(len(cancels))] - cancel() - select { - case <-ctx.Done(): - default: - errorf("ctx should be canceled") - } - checkValues("after cancel") - } -} - -func TestCancelRemoves(t *testing.T) { - checkChildren := func(when string, ctx Context, want int) { - if got := len(ctx.(*cancelCtx).children); got != want { - t.Errorf("%s: context has %d children, want %d", when, got, want) - } - } - - ctx, _ := WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel := WithCancel(ctx) - checkChildren("with WithCancel child ", ctx, 1) - cancel() - checkChildren("after cancelling WithCancel child", ctx, 0) - - ctx, _ = WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel = WithTimeout(ctx, 60*time.Minute) - checkChildren("with WithTimeout child ", ctx, 1) - cancel() - checkChildren("after cancelling WithTimeout child", ctx, 0) -} diff --git a/Godeps/_workspace/src/golang.org/x/net/context/ctxhttp/ctxhttp_test.go b/Godeps/_workspace/src/golang.org/x/net/context/ctxhttp/ctxhttp_test.go deleted file mode 100644 index 47b53d7f1..000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/ctxhttp/ctxhttp_test.go +++ /dev/null @@ -1,72 +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 ctxhttp - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - "time" - - "golang.org/x/net/context" -) - -const ( - requestDuration = 100 * time.Millisecond - requestBody = "ok" -) - -func TestNoTimeout(t *testing.T) { - ctx := context.Background() - resp, err := doRequest(ctx) - - if resp == nil || err != nil { - t.Fatalf("error received from client: %v %v", err, resp) - } -} -func TestCancel(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - time.Sleep(requestDuration / 2) - cancel() - }() - - resp, err := doRequest(ctx) - - if resp != nil || err == nil { - t.Fatalf("expected error, didn't get one. resp: %v", resp) - } - if err != ctx.Err() { - t.Fatalf("expected error from context but got: %v", err) - } -} - -func TestCancelAfterRequest(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - - resp, err := doRequest(ctx) - - // Cancel before reading the body. - // Request.Body should still be readable after the context is canceled. - cancel() - - b, err := ioutil.ReadAll(resp.Body) - if err != nil || string(b) != requestBody { - t.Fatalf("could not read body: %q %v", b, err) - } -} - -func doRequest(ctx context.Context) (*http.Response, error) { - var okHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(requestDuration) - w.Write([]byte(requestBody)) - }) - - serv := httptest.NewServer(okHandler) - defer serv.Close() - - return Get(ctx, nil, serv.URL) -} diff --git a/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go b/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go deleted file mode 100644 index a6754dc36..000000000 --- a/Godeps/_workspace/src/golang.org/x/net/context/withtimeout_test.go +++ /dev/null @@ -1,26 +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_test - -import ( - "fmt" - "time" - - "golang.org/x/net/context" -) - -func ExampleWithTimeout() { - // Pass a context with a timeout to tell a blocking function that it - // should abandon its work after the timeout elapses. - ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond) - select { - case <-time.After(200 * time.Millisecond): - fmt.Println("overslept") - case <-ctx.Done(): - fmt.Println(ctx.Err()) // prints "context deadline exceeded" - } - // Output: - // context deadline exceeded -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials.go b/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials.go deleted file mode 100644 index 452fb8c12..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2014 The oauth2 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 clientcredentials implements the OAuth2.0 "client credentials" token flow, -// also known as the "two-legged OAuth 2.0". -// -// This should be used when the client is acting on its own behalf or when the client -// is the resource owner. It may also be used when requesting access to protected -// resources based on an authorization previously arranged with the authorization -// server. -// -// See http://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-4.4 -package clientcredentials - -import ( - "net/http" - "net/url" - "strings" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" -) - -// tokenFromInternal maps an *internal.Token struct into -// an *oauth2.Token struct. -func tokenFromInternal(t *internal.Token) *oauth2.Token { - if t == nil { - return nil - } - tk := &oauth2.Token{ - AccessToken: t.AccessToken, - TokenType: t.TokenType, - RefreshToken: t.RefreshToken, - Expiry: t.Expiry, - } - return tk.WithExtra(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) (*oauth2.Token, error) { - tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.TokenURL, v) - if err != nil { - return nil, err - } - return tokenFromInternal(tk), nil -} - -// Client Credentials Config describes a 2-legged OAuth2 flow, with both the -// client application information and the server's endpoint URLs. -type Config struct { - // ClientID is the application's ID. - ClientID string - - // ClientSecret is the application's secret. - ClientSecret string - - // TokenURL is the resource server's token endpoint - // URL. This is a constant specific to each server. - TokenURL string - - // Scope specifies optional requested permissions. - Scopes []string -} - -// Token uses client credentials to retreive a token. -// The HTTP client to use is derived from the context. -// If nil, http.DefaultClient is used. -func (c *Config) Token(ctx context.Context) (*oauth2.Token, error) { - return retrieveToken(ctx, c, url.Values{ - "grant_type": {"client_credentials"}, - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) -} - -// 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) *http.Client { - return oauth2.NewClient(ctx, c.TokenSource(ctx)) -} - -// TokenSource returns a TokenSource that returns t until t expires, -// automatically refreshing it as necessary using the provided context and the -// client ID and client secret. -// -// Most users will use Config.Client instead. -func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { - source := &tokenSource{ - ctx: ctx, - conf: c, - } - return oauth2.ReuseTokenSource(nil, source) -} - -type tokenSource struct { - ctx context.Context - conf *Config -} - -// Token refreshes the token by using a new client credentials request. -// tokens received this way do not include a refresh token -func (c *tokenSource) Token() (*oauth2.Token, error) { - return retrieveToken(c.ctx, c.conf, url.Values{ - "grant_type": {"client_credentials"}, - "scope": internal.CondVal(strings.Join(c.conf.Scopes, " ")), - }) -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go deleted file mode 100644 index ab319e082..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2014 The oauth2 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 clientcredentials - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "golang.org/x/oauth2" -) - -func newConf(url string) *Config { - return &Config{ - ClientID: "CLIENT_ID", - ClientSecret: "CLIENT_SECRET", - Scopes: []string{"scope1", "scope2"}, - TokenURL: url + "/token", - } -} - -type mockTransport struct { - rt func(req *http.Request) (resp *http.Response, err error) -} - -func (t *mockTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.rt(req) -} - -func TestTokenRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("authenticate client request URL = %q; want %q", r.URL, "/token") - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - if got, want := r.Header.Get("Content-Type"), "application/x-www-form-urlencoded"; got != want { - t.Errorf("Content-Type header = %q; want %q", got, want) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - r.Body.Close() - } - if err != nil { - t.Errorf("failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2" { - t.Errorf("payload = %q; want %q", string(body), "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2") - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Token(oauth2.NoContext) - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("token invalid. got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Access token = %q; want %q", tok.AccessToken, "90d64460d14870c08c81352a05dedd3465940a7c") - } - if tok.TokenType != "bearer" { - t.Errorf("token type = %q; want %q", tok.TokenType, "bearer") - } -} - -func TestTokenRefreshRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(oauth2.NoContext) - c.Get(ts.URL + "/somethingelse") -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/example_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/example_test.go deleted file mode 100644 index 8be278855..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/example_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 The oauth2 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_test - -import ( - "fmt" - "log" - - "golang.org/x/oauth2" -) - -func ExampleConfig() { - conf := &oauth2.Config{ - ClientID: "YOUR_CLIENT_ID", - ClientSecret: "YOUR_CLIENT_SECRET", - Scopes: []string{"SCOPE1", "SCOPE2"}, - Endpoint: oauth2.Endpoint{ - AuthURL: "https://provider.com/o/oauth2/auth", - TokenURL: "https://provider.com/o/oauth2/token", - }, - } - - // Redirect user to consent page to ask for permission - // for the scopes specified above. - url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) - fmt.Printf("Visit the URL for the auth dialog: %v", url) - - // Use the authorization code that is pushed to the redirect URL. - // NewTransportWithCode will do the handshake to retrieve - // an access token and initiate a Transport that is - // authorized and authenticated by the retrieved token. - var code string - if _, err := fmt.Scan(&code); err != nil { - log.Fatal(err) - } - tok, err := conf.Exchange(oauth2.NoContext, code) - if err != nil { - log.Fatal(err) - } - - client := conf.Client(oauth2.NoContext, tok) - client.Get("...") -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/facebook/facebook.go b/Godeps/_workspace/src/golang.org/x/oauth2/facebook/facebook.go deleted file mode 100644 index 9c816ff80..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/facebook/facebook.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The oauth2 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 facebook provides constants for using OAuth2 to access Facebook. -package facebook - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Facebook's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.facebook.com/dialog/oauth", - TokenURL: "https://graph.facebook.com/oauth/access_token", -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/github/github.go b/Godeps/_workspace/src/golang.org/x/oauth2/github/github.go deleted file mode 100644 index 82ca623dd..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/github/github.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 The oauth2 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 github provides constants for using OAuth2 to access Github. -package github - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Github's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://github.com/login/oauth/authorize", - TokenURL: "https://github.com/login/oauth/access_token", -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/google/example_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/google/example_test.go deleted file mode 100644 index 17262802a..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/google/example_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2014 The oauth2 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 appenginevm !appengine - -package google_test - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "google.golang.org/appengine" - "google.golang.org/appengine/urlfetch" -) - -func ExampleDefaultClient() { - client, err := google.DefaultClient(oauth2.NoContext, - "https://www.googleapis.com/auth/devstorage.full_control") - if err != nil { - log.Fatal(err) - } - client.Get("...") -} - -func Example_webServer() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - conf := &oauth2.Config{ - ClientID: "YOUR_CLIENT_ID", - ClientSecret: "YOUR_CLIENT_SECRET", - RedirectURL: "YOUR_REDIRECT_URL", - Scopes: []string{ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/blogger", - }, - Endpoint: google.Endpoint, - } - // Redirect user to Google's consent page to ask for permission - // for the scopes specified above. - url := conf.AuthCodeURL("state") - fmt.Printf("Visit the URL for the auth dialog: %v", url) - - // Handle the exchange code to initiate a transport. - tok, err := conf.Exchange(oauth2.NoContext, "authorization-code") - if err != nil { - log.Fatal(err) - } - client := conf.Client(oauth2.NoContext, tok) - client.Get("...") -} - -func ExampleJWTConfigFromJSON() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - // Navigate to your project, then see the "Credentials" page - // under "APIs & Auth". - // To create a service account client, click "Create new Client ID", - // select "Service Account", and click "Create Client ID". A JSON - // key file will then be downloaded to your computer. - data, err := ioutil.ReadFile("/path/to/your-project-key.json") - if err != nil { - log.Fatal(err) - } - conf, err := google.JWTConfigFromJSON(data, "https://www.googleapis.com/auth/bigquery") - if err != nil { - log.Fatal(err) - } - // Initiate an http.Client. The following GET request will be - // authorized and authenticated on the behalf of - // your service account. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func ExampleSDKConfig() { - // The credentials will be obtained from the first account that - // has been authorized with `gcloud auth login`. - conf, err := google.NewSDKConfig("") - if err != nil { - log.Fatal(err) - } - // Initiate an http.Client. The following GET request will be - // authorized and authenticated on the behalf of the SDK user. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func Example_serviceAccount() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - conf := &jwt.Config{ - Email: "xxx@developer.gserviceaccount.com", - // The contents of your RSA private key or your PEM file - // that contains a private key. - // If you have a p12 file instead, you - // can use `openssl` to export the private key into a pem file. - // - // $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes - // - // The field only supports PEM containers with no passphrase. - // The openssl command will convert p12 keys to passphrase-less PEM containers. - PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."), - Scopes: []string{ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/blogger", - }, - TokenURL: google.JWTTokenURL, - // If you would like to impersonate a user, you can - // create a transport with a subject. The following GET - // request will be made on the behalf of user@example.com. - // Optional. - Subject: "user@example.com", - } - // Initiate an http.Client, the following GET request will be - // authorized and authenticated on the behalf of user@example.com. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func ExampleAppEngineTokenSource() { - var req *http.Request // from the ServeHTTP handler - ctx := appengine.NewContext(req) - client := &http.Client{ - Transport: &oauth2.Transport{ - Source: google.AppEngineTokenSource(ctx, "https://www.googleapis.com/auth/bigquery"), - Base: &urlfetch.Transport{ - Context: ctx, - }, - }, - } - client.Get("...") -} - -func ExampleComputeTokenSource() { - client := &http.Client{ - Transport: &oauth2.Transport{ - // Fetch from Google Compute Engine's metadata server to retrieve - // an access token for the provided account. - // If no account is specified, "default" is used. - Source: google.ComputeTokenSource(""), - }, - } - client.Get("...") -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/google/google_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/google/google_test.go deleted file mode 100644 index 4cc01884b..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/google/google_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 The oauth2 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 ( - "strings" - "testing" -) - -var webJSONKey = []byte(` -{ - "web": { - "auth_uri": "https://google.com/o/oauth2/auth", - "client_secret": "3Oknc4jS_wA2r9i", - "token_uri": "https://google.com/o/oauth2/token", - "client_email": "222-nprqovg5k43uum874cs9osjt2koe97g8@developer.gserviceaccount.com", - "redirect_uris": ["https://www.example.com/oauth2callback"], - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/222-nprqovg5k43uum874cs9osjt2koe97g8@developer.gserviceaccount.com", - "client_id": "222-nprqovg5k43uum874cs9osjt2koe97g8.apps.googleusercontent.com", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "javascript_origins": ["https://www.example.com"] - } -}`) - -var installedJSONKey = []byte(`{ - "installed": { - "client_id": "222-installed.apps.googleusercontent.com", - "redirect_uris": ["https://www.example.com/oauth2callback"] - } -}`) - -func TestConfigFromJSON(t *testing.T) { - conf, err := ConfigFromJSON(webJSONKey, "scope1", "scope2") - if err != nil { - t.Error(err) - } - if got, want := conf.ClientID, "222-nprqovg5k43uum874cs9osjt2koe97g8.apps.googleusercontent.com"; got != want { - t.Errorf("ClientID = %q; want %q", got, want) - } - if got, want := conf.ClientSecret, "3Oknc4jS_wA2r9i"; got != want { - t.Errorf("ClientSecret = %q; want %q", got, want) - } - if got, want := conf.RedirectURL, "https://www.example.com/oauth2callback"; got != want { - t.Errorf("RedictURL = %q; want %q", got, want) - } - if got, want := strings.Join(conf.Scopes, ","), "scope1,scope2"; got != want { - t.Errorf("Scopes = %q; want %q", got, want) - } - if got, want := conf.Endpoint.AuthURL, "https://google.com/o/oauth2/auth"; got != want { - t.Errorf("AuthURL = %q; want %q", got, want) - } - if got, want := conf.Endpoint.TokenURL, "https://google.com/o/oauth2/token"; got != want { - t.Errorf("TokenURL = %q; want %q", got, want) - } -} - -func TestConfigFromJSON_Installed(t *testing.T) { - conf, err := ConfigFromJSON(installedJSONKey) - if err != nil { - t.Error(err) - } - if got, want := conf.ClientID, "222-installed.apps.googleusercontent.com"; got != want { - t.Errorf("ClientID = %q; want %q", got, want) - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/google/sdk_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/google/sdk_test.go deleted file mode 100644 index 79df88964..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/google/sdk_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015 The oauth2 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 "testing" - -func TestSDKConfig(t *testing.T) { - sdkConfigPath = func() (string, error) { - return "testdata/gcloud", nil - } - - tests := []struct { - account string - accessToken string - err bool - }{ - {"", "bar_access_token", false}, - {"foo@example.com", "foo_access_token", false}, - {"bar@example.com", "bar_access_token", false}, - {"baz@serviceaccount.example.com", "", true}, - } - for _, tt := range tests { - c, err := NewSDKConfig(tt.account) - if got, want := err != nil, tt.err; got != want { - if !tt.err { - t.Errorf("expected no error, got error: %v", tt.err, err) - } else { - t.Errorf("expected error, got none") - } - continue - } - if err != nil { - continue - } - tok := c.initialToken - if tok == nil { - t.Errorf("expected token %q, got: nil", tt.accessToken) - continue - } - if tok.AccessToken != tt.accessToken { - t.Errorf("expected token %q, got: %q", tt.accessToken, tok.AccessToken) - } - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/credentials b/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/credentials deleted file mode 100644 index ff5eefbd0..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/credentials +++ /dev/null @@ -1,122 +0,0 @@ -{ - "data": [ - { - "credential": { - "_class": "OAuth2Credentials", - "_module": "oauth2client.client", - "access_token": "foo_access_token", - "client_id": "foo_client_id", - "client_secret": "foo_client_secret", - "id_token": { - "at_hash": "foo_at_hash", - "aud": "foo_aud", - "azp": "foo_azp", - "cid": "foo_cid", - "email": "foo@example.com", - "email_verified": true, - "exp": 1420573614, - "iat": 1420569714, - "id": "1337", - "iss": "accounts.google.com", - "sub": "1337", - "token_hash": "foo_token_hash", - "verified_email": true - }, - "invalid": false, - "refresh_token": "foo_refresh_token", - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "token_expiry": "2015-01-09T00:51:51Z", - "token_response": { - "access_token": "foo_access_token", - "expires_in": 3600, - "id_token": "foo_id_token", - "token_type": "Bearer" - }, - "token_uri": "https://accounts.google.com/o/oauth2/token", - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "foo@example.com", - "clientId": "foo_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - }, - { - "credential": { - "_class": "OAuth2Credentials", - "_module": "oauth2client.client", - "access_token": "bar_access_token", - "client_id": "bar_client_id", - "client_secret": "bar_client_secret", - "id_token": { - "at_hash": "bar_at_hash", - "aud": "bar_aud", - "azp": "bar_azp", - "cid": "bar_cid", - "email": "bar@example.com", - "email_verified": true, - "exp": 1420573614, - "iat": 1420569714, - "id": "1337", - "iss": "accounts.google.com", - "sub": "1337", - "token_hash": "bar_token_hash", - "verified_email": true - }, - "invalid": false, - "refresh_token": "bar_refresh_token", - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "token_expiry": "2015-01-09T00:51:51Z", - "token_response": { - "access_token": "bar_access_token", - "expires_in": 3600, - "id_token": "bar_id_token", - "token_type": "Bearer" - }, - "token_uri": "https://accounts.google.com/o/oauth2/token", - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "bar@example.com", - "clientId": "bar_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - }, - { - "credential": { - "_class": "ServiceAccountCredentials", - "_kwargs": {}, - "_module": "oauth2client.client", - "_private_key_id": "00000000000000000000000000000000", - "_private_key_pkcs8_text": "-----BEGIN RSA PRIVATE KEY-----\nMIICWwIBAAKBgQCt3fpiynPSaUhWSIKMGV331zudwJ6GkGmvQtwsoK2S2LbvnSwU\nNxgj4fp08kIDR5p26wF4+t/HrKydMwzftXBfZ9UmLVJgRdSswmS5SmChCrfDS5OE\nvFFcN5+6w1w8/Nu657PF/dse8T0bV95YrqyoR0Osy8WHrUOMSIIbC3hRuwIDAQAB\nAoGAJrGE/KFjn0sQ7yrZ6sXmdLawrM3mObo/2uI9T60+k7SpGbBX0/Pi6nFrJMWZ\nTVONG7P3Mu5aCPzzuVRYJB0j8aldSfzABTY3HKoWCczqw1OztJiEseXGiYz4QOyr\nYU3qDyEpdhS6q6wcoLKGH+hqRmz6pcSEsc8XzOOu7s4xW8kCQQDkc75HjhbarCnd\nJJGMe3U76+6UGmdK67ltZj6k6xoB5WbTNChY9TAyI2JC+ppYV89zv3ssj4L+02u3\nHIHFGxsHAkEAwtU1qYb1tScpchPobnYUFiVKJ7KA8EZaHVaJJODW/cghTCV7BxcJ\nbgVvlmk4lFKn3lPKAgWw7PdQsBTVBUcCrQJATPwoIirizrv3u5soJUQxZIkENAqV\nxmybZx9uetrzP7JTrVbFRf0SScMcyN90hdLJiQL8+i4+gaszgFht7sNMnwJAAbfj\nq0UXcauQwALQ7/h2oONfTg5S+MuGC/AxcXPSMZbMRGGoPh3D5YaCv27aIuS/ukQ+\n6dmm/9AGlCb64fsIWQJAPaokbjIifo+LwC5gyK73Mc4t8nAOSZDenzd/2f6TCq76\nS1dcnKiPxaED7W/y6LJiuBT2rbZiQ2L93NJpFZD/UA==\n-----END RSA PRIVATE KEY-----\n", - "_revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "_scopes": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "_service_account_email": "baz@serviceaccount.example.com", - "_service_account_id": "baz.serviceaccount.example.com", - "_token_uri": "https://accounts.google.com/o/oauth2/token", - "_user_agent": "Cloud SDK Command Line Tool", - "access_token": null, - "assertion_type": null, - "client_id": null, - "client_secret": null, - "id_token": null, - "invalid": false, - "refresh_token": null, - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "service_account_name": "baz@serviceaccount.example.com", - "token_expiry": null, - "token_response": null, - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "baz@serviceaccount.example.com", - "clientId": "baz_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - } - ], - "file_version": 1 -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/properties b/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/properties deleted file mode 100644 index 025de886c..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/google/testdata/gcloud/properties +++ /dev/null @@ -1,2 +0,0 @@ -[core] -account = bar@example.com \ No newline at end of file diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/internal/oauth2_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/internal/oauth2_test.go deleted file mode 100644 index 014a351e0..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/internal/oauth2_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2014 The oauth2 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 - -import ( - "reflect" - "strings" - "testing" -) - -func TestParseINI(t *testing.T) { - tests := []struct { - ini string - want map[string]map[string]string - }{ - { - `root = toor -[foo] -bar = hop -ini = nin -`, - map[string]map[string]string{ - "": map[string]string{"root": "toor"}, - "foo": map[string]string{"bar": "hop", "ini": "nin"}, - }, - }, - { - `[empty] -[section] -empty= -`, - map[string]map[string]string{ - "": map[string]string{}, - "empty": map[string]string{}, - "section": map[string]string{"empty": ""}, - }, - }, - { - `ignore -[invalid -=stuff -;comment=true -`, - map[string]map[string]string{ - "": map[string]string{}, - }, - }, - } - for _, tt := range tests { - result, err := ParseINI(strings.NewReader(tt.ini)) - if err != nil { - t.Errorf("ParseINI(%q) error %v, want: no error", tt.ini, err) - continue - } - if !reflect.DeepEqual(result, tt.want) { - t.Errorf("ParseINI(%q) = %#v, want: %#v", tt.ini, result, tt.want) - } - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/internal/token_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/internal/token_test.go deleted file mode 100644 index 864f6fa07..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/internal/token_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 The oauth2 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 - -import ( - "fmt" - "testing" -) - -func Test_providerAuthHeaderWorks(t *testing.T) { - for _, p := range brokenAuthHeaderProviders { - if providerAuthHeaderWorks(p) { - t.Errorf("URL: %s not found in list", p) - } - p := fmt.Sprintf("%ssomesuffix", p) - if providerAuthHeaderWorks(p) { - t.Errorf("URL: %s not found in list", p) - } - } - p := "https://api.not-in-the-list-example.com/" - if !providerAuthHeaderWorks(p) { - t.Errorf("URL: %s found in list", p) - } - -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/jwt/example_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/jwt/example_test.go deleted file mode 100644 index 6d618836e..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/jwt/example_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The oauth2 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_test - -import ( - "golang.org/x/oauth2" - "golang.org/x/oauth2/jwt" -) - -func ExampleJWTConfig() { - conf := &jwt.Config{ - Email: "xxx@developer.com", - // The contents of your RSA private key or your PEM file - // that contains a private key. - // If you have a p12 file instead, you - // can use `openssl` to export the private key into a pem file. - // - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - // - // It only supports PEM containers with no passphrase. - PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."), - Subject: "user@example.com", - TokenURL: "https://provider.com/o/oauth2/token", - } - // Initiate an http.Client, the following GET request will be - // authorized and authenticated on the behalf of user@example.com. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/jwt/jwt_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/jwt/jwt_test.go deleted file mode 100644 index da922c3d0..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/jwt/jwt_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2014 The oauth2 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 - -import ( - "net/http" - "net/http/httptest" - "testing" - - "golang.org/x/oauth2" -) - -var dummyPrivateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAx4fm7dngEmOULNmAs1IGZ9Apfzh+BkaQ1dzkmbUgpcoghucE -DZRnAGd2aPyB6skGMXUytWQvNYav0WTR00wFtX1ohWTfv68HGXJ8QXCpyoSKSSFY -fuP9X36wBSkSX9J5DVgiuzD5VBdzUISSmapjKm+DcbRALjz6OUIPEWi1Tjl6p5RK -1w41qdbmt7E5/kGhKLDuT7+M83g4VWhgIvaAXtnhklDAggilPPa8ZJ1IFe31lNlr -k4DRk38nc6sEutdf3RL7QoH7FBusI7uXV03DC6dwN1kP4GE7bjJhcRb/7jYt7CQ9 -/E9Exz3c0yAp0yrTg0Fwh+qxfH9dKwN52S7SBwIDAQABAoIBAQCaCs26K07WY5Jt -3a2Cw3y2gPrIgTCqX6hJs7O5ByEhXZ8nBwsWANBUe4vrGaajQHdLj5OKfsIDrOvn -2NI1MqflqeAbu/kR32q3tq8/Rl+PPiwUsW3E6Pcf1orGMSNCXxeducF2iySySzh3 -nSIhCG5uwJDWI7a4+9KiieFgK1pt/Iv30q1SQS8IEntTfXYwANQrfKUVMmVF9aIK -6/WZE2yd5+q3wVVIJ6jsmTzoDCX6QQkkJICIYwCkglmVy5AeTckOVwcXL0jqw5Kf -5/soZJQwLEyBoQq7Kbpa26QHq+CJONetPP8Ssy8MJJXBT+u/bSseMb3Zsr5cr43e -DJOhwsThAoGBAPY6rPKl2NT/K7XfRCGm1sbWjUQyDShscwuWJ5+kD0yudnT/ZEJ1 -M3+KS/iOOAoHDdEDi9crRvMl0UfNa8MAcDKHflzxg2jg/QI+fTBjPP5GOX0lkZ9g -z6VePoVoQw2gpPFVNPPTxKfk27tEzbaffvOLGBEih0Kb7HTINkW8rIlzAoGBAM9y -1yr+jvfS1cGFtNU+Gotoihw2eMKtIqR03Yn3n0PK1nVCDKqwdUqCypz4+ml6cxRK -J8+Pfdh7D+ZJd4LEG6Y4QRDLuv5OA700tUoSHxMSNn3q9As4+T3MUyYxWKvTeu3U -f2NWP9ePU0lV8ttk7YlpVRaPQmc1qwooBA/z/8AdAoGAW9x0HWqmRICWTBnpjyxx -QGlW9rQ9mHEtUotIaRSJ6K/F3cxSGUEkX1a3FRnp6kPLcckC6NlqdNgNBd6rb2rA -cPl/uSkZP42Als+9YMoFPU/xrrDPbUhu72EDrj3Bllnyb168jKLa4VBOccUvggxr -Dm08I1hgYgdN5huzs7y6GeUCgYEAj+AZJSOJ6o1aXS6rfV3mMRve9bQ9yt8jcKXw -5HhOCEmMtaSKfnOF1Ziih34Sxsb7O2428DiX0mV/YHtBnPsAJidL0SdLWIapBzeg -KHArByIRkwE6IvJvwpGMdaex1PIGhx5i/3VZL9qiq/ElT05PhIb+UXgoWMabCp84 -OgxDK20CgYAeaFo8BdQ7FmVX2+EEejF+8xSge6WVLtkaon8bqcn6P0O8lLypoOhd -mJAYH8WU+UAy9pecUnDZj14LAGNVmYcse8HFX71MoshnvCTFEPVo4rZxIAGwMpeJ -5jgQ3slYLpqrGlcbLgUXBUgzEO684Wk/UV9DFPlHALVqCfXQ9dpJPg== ------END RSA PRIVATE KEY-----`) - -func TestJWTFetch_JSONResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{ - "access_token": "90d64460d14870c08c81352a05dedd3465940a7c", - "scope": "user", - "token_type": "bearer", - "expires_in": 3600 - }`)) - })) - defer ts.Close() - - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err != nil { - t.Fatal(err) - } - if !tok.Valid() { - t.Errorf("Token invalid") - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v", tok.TokenType) - } - if tok.Expiry.IsZero() { - t.Errorf("Unexpected token expiry, %#v", tok.Expiry) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } -} - -func TestJWTFetch_BadResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err != nil { - t.Fatal(err) - } - if tok == nil { - t.Fatalf("token is nil") - } - if tok.Valid() { - t.Errorf("token is valid. want invalid.") - } - if tok.AccessToken != "" { - t.Errorf("Unexpected non-empty access token %q.", tok.AccessToken) - } - if want := "bearer"; tok.TokenType != want { - t.Errorf("TokenType = %q; want %q", tok.TokenType, want) - } - scope := tok.Extra("scope") - if want := "user"; scope != want { - t.Errorf("token scope = %q; want %q", scope, want) - } -} - -func TestJWTFetch_BadResponseType(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":123, "scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err == nil { - t.Error("got a token; expected error") - if tok.AccessToken != "" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/linkedin/linkedin.go b/Godeps/_workspace/src/golang.org/x/oauth2/linkedin/linkedin.go deleted file mode 100644 index d93fded6a..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/linkedin/linkedin.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The oauth2 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 linkedin provides constants for using OAuth2 to access LinkedIn. -package linkedin - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is LinkedIn's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.linkedin.com/uas/oauth2/authorization", - TokenURL: "https://www.linkedin.com/uas/oauth2/accessToken", -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/oauth2_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/oauth2_test.go deleted file mode 100644 index 2f7d731c1..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/oauth2_test.go +++ /dev/null @@ -1,422 +0,0 @@ -// Copyright 2014 The oauth2 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 ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "reflect" - "strconv" - "testing" - "time" - - "golang.org/x/net/context" -) - -type mockTransport struct { - rt func(req *http.Request) (resp *http.Response, err error) -} - -func (t *mockTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.rt(req) -} - -type mockCache struct { - token *Token - readErr error -} - -func (c *mockCache) ReadToken() (*Token, error) { - return c.token, c.readErr -} - -func (c *mockCache) WriteToken(*Token) { - // do nothing -} - -func newConf(url string) *Config { - return &Config{ - ClientID: "CLIENT_ID", - ClientSecret: "CLIENT_SECRET", - RedirectURL: "REDIRECT_URL", - Scopes: []string{"scope1", "scope2"}, - Endpoint: Endpoint{ - AuthURL: url + "/auth", - TokenURL: url + "/token", - }, - } -} - -func TestAuthCodeURL(t *testing.T) { - conf := newConf("server") - url := conf.AuthCodeURL("foo", AccessTypeOffline, ApprovalForce) - if url != "server/auth?access_type=offline&approval_prompt=force&client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&response_type=code&scope=scope1+scope2&state=foo" { - t.Errorf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestAuthCodeURL_CustomParam(t *testing.T) { - conf := newConf("server") - param := SetAuthURLParam("foo", "bar") - url := conf.AuthCodeURL("baz", param) - if url != "server/auth?client_id=CLIENT_ID&foo=bar&redirect_uri=REDIRECT_URL&response_type=code&scope=scope1+scope2&state=baz" { - t.Errorf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestAuthCodeURL_Optional(t *testing.T) { - conf := &Config{ - ClientID: "CLIENT_ID", - Endpoint: Endpoint{ - AuthURL: "/auth-url", - TokenURL: "/token-url", - }, - } - url := conf.AuthCodeURL("") - if url != "/auth-url?client_id=CLIENT_ID&response_type=code" { - t.Fatalf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestExchangeRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("Unexpected exchange request URL, %v is found.", r.URL) - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&code=exchange-code&grant_type=authorization_code&redirect_uri=REDIRECT_URL&scope=scope1+scope2" { - t.Errorf("Unexpected exchange payload, %v is found.", string(body)) - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&scope=user&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "exchange-code") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v.", tok.TokenType) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } -} - -func TestExchangeRequest_JSONResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("Unexpected exchange request URL, %v is found.", r.URL) - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&code=exchange-code&grant_type=authorization_code&redirect_uri=REDIRECT_URL&scope=scope1+scope2" { - t.Errorf("Unexpected exchange payload, %v is found.", string(body)) - } - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token": "90d64460d14870c08c81352a05dedd3465940a7c", "scope": "user", "token_type": "bearer", "expires_in": 86400}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "exchange-code") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v.", tok.TokenType) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } -} - -const day = 24 * time.Hour - -func TestExchangeRequest_JSONResponse_Expiry(t *testing.T) { - seconds := int32(day.Seconds()) - jsonNumberType := reflect.TypeOf(json.Number("0")) - for _, c := range []struct { - expires string - expect error - }{ - {fmt.Sprintf(`"expires_in": %d`, seconds), nil}, - {fmt.Sprintf(`"expires_in": "%d"`, seconds), nil}, // PayPal case - {fmt.Sprintf(`"expires": %d`, seconds), nil}, // Facebook case - {`"expires": false`, &json.UnmarshalTypeError{Value: "bool", Type: jsonNumberType}}, // wrong type - {`"expires": {}`, &json.UnmarshalTypeError{Value: "object", Type: jsonNumberType}}, // wrong type - {`"expires": "zzz"`, &strconv.NumError{Func: "ParseInt", Num: "zzz", Err: strconv.ErrSyntax}}, // wrong value - } { - testExchangeRequest_JSONResponse_expiry(t, c.expires, c.expect) - } -} - -func testExchangeRequest_JSONResponse_expiry(t *testing.T, exp string, expect error) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(fmt.Sprintf(`{"access_token": "90d", "scope": "user", "token_type": "bearer", %s}`, exp))) - })) - defer ts.Close() - conf := newConf(ts.URL) - t1 := time.Now().Add(day) - tok, err := conf.Exchange(NoContext, "exchange-code") - t2 := time.Now().Add(day) - // Do a fmt.Sprint comparison so either side can be - // nil. fmt.Sprint just stringifies them to "", and no - // non-nil expected error ever stringifies as "", so this - // isn't terribly disgusting. We do this because Go 1.4 and - // Go 1.5 return a different deep value for - // json.UnmarshalTypeError. In Go 1.5, the - // json.UnmarshalTypeError contains a new field with a new - // non-zero value. Rather than ignore it here with reflect or - // add new files and +build tags, just look at the strings. - if fmt.Sprint(err) != fmt.Sprint(expect) { - t.Errorf("Error = %v; want %v", err, expect) - } - if err != nil { - return - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - expiry := tok.Expiry - if expiry.Before(t1) || expiry.After(t2) { - t.Errorf("Unexpected value for Expiry: %v (shold be between %v and %v)", expiry, t1, t2) - } -} - -func TestExchangeRequest_BadResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "code") - if err != nil { - t.Fatal(err) - } - if tok.AccessToken != "" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } -} - -func TestExchangeRequest_BadResponseType(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":123, "scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - _, err := conf.Exchange(NoContext, "exchange-code") - if err == nil { - t.Error("expected error from invalid access_token type") - } -} - -func TestExchangeRequest_NonBasicAuth(t *testing.T) { - tr := &mockTransport{ - rt: func(r *http.Request) (w *http.Response, err error) { - headerAuth := r.Header.Get("Authorization") - if headerAuth != "" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - return nil, errors.New("no response") - }, - } - c := &http.Client{Transport: tr} - conf := &Config{ - ClientID: "CLIENT_ID", - Endpoint: Endpoint{ - AuthURL: "https://accounts.google.com/auth", - TokenURL: "https://accounts.google.com/token", - }, - } - - ctx := context.WithValue(context.Background(), HTTPClient, c) - conf.Exchange(ctx, "code") -} - -func TestPasswordCredentialsTokenRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - expected := "/token" - if r.URL.String() != expected { - t.Errorf("URL = %q; want %q", r.URL, expected) - } - headerAuth := r.Header.Get("Authorization") - expected = "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" - if headerAuth != expected { - t.Errorf("Authorization header = %q; want %q", headerAuth, expected) - } - headerContentType := r.Header.Get("Content-Type") - expected = "application/x-www-form-urlencoded" - if headerContentType != expected { - t.Errorf("Content-Type header = %q; want %q", headerContentType, expected) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - expected = "client_id=CLIENT_ID&grant_type=password&password=password1&scope=scope1+scope2&username=user1" - if string(body) != expected { - t.Errorf("res.Body = %q; want %q", string(body), expected) - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&scope=user&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.PasswordCredentialsToken(NoContext, "user1", "password1") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - expected := "90d64460d14870c08c81352a05dedd3465940a7c" - if tok.AccessToken != expected { - t.Errorf("AccessToken = %q; want %q", tok.AccessToken, expected) - } - expected = "bearer" - if tok.TokenType != expected { - t.Errorf("TokenType = %q; want %q", tok.TokenType, expected) - } -} - -func TestTokenRefreshRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(NoContext, &Token{RefreshToken: "REFRESH_TOKEN"}) - c.Get(ts.URL + "/somethingelse") -} - -func TestFetchWithNoRefreshToken(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(NoContext, nil) - _, err := c.Get(ts.URL + "/somethingelse") - if err == nil { - t.Errorf("Fetch should return an error if no refresh token is set") - } -} - -func TestRefreshToken_RefreshTokenReplacement(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":"ACCESS TOKEN", "scope": "user", "token_type": "bearer", "refresh_token": "NEW REFRESH TOKEN"}`)) - return - })) - defer ts.Close() - conf := newConf(ts.URL) - tkr := tokenRefresher{ - conf: conf, - ctx: NoContext, - refreshToken: "OLD REFRESH TOKEN", - } - tk, err := tkr.Token() - if err != nil { - t.Errorf("Unexpected refreshToken error returned: %v", err) - return - } - if tk.RefreshToken != tkr.refreshToken { - t.Errorf("tokenRefresher.refresh_token = %s; want %s", tkr.refreshToken, tk.RefreshToken) - } -} - -func TestConfigClientWithToken(t *testing.T) { - tok := &Token{ - AccessToken: "abc123", - } - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if got, want := r.Header.Get("Authorization"), fmt.Sprintf("Bearer %s", tok.AccessToken); got != want { - t.Errorf("Authorization header = %q; want %q", got, want) - } - return - })) - defer ts.Close() - conf := newConf(ts.URL) - - c := conf.Client(NoContext, tok) - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Error(err) - } - _, err = c.Do(req) - if err != nil { - t.Error(err) - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go b/Godeps/_workspace/src/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go deleted file mode 100644 index f0b66f97d..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The oauth2 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 odnoklassniki provides constants for using OAuth2 to access Odnoklassniki. -package odnoklassniki - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Odnoklassniki's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.odnoklassniki.ru/oauth/authorize", - TokenURL: "https://api.odnoklassniki.ru/oauth/token.do", -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/paypal/paypal.go b/Godeps/_workspace/src/golang.org/x/oauth2/paypal/paypal.go deleted file mode 100644 index a99366b6e..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/paypal/paypal.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The oauth2 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 paypal provides constants for using OAuth2 to access PayPal. -package paypal - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is PayPal's OAuth 2.0 endpoint in live (production) environment. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize", - TokenURL: "https://api.paypal.com/v1/identity/openidconnect/tokenservice", -} - -// SandboxEndpoint is PayPal's OAuth 2.0 endpoint in sandbox (testing) environment. -var SandboxEndpoint = oauth2.Endpoint{ - AuthURL: "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize", - TokenURL: "https://api.sandbox.paypal.com/v1/identity/openidconnect/tokenservice", -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/token_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/token_test.go deleted file mode 100644 index 739eeb2a2..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/token_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 The oauth2 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 ( - "testing" - "time" -) - -func TestTokenExtra(t *testing.T) { - type testCase struct { - key string - val interface{} - want interface{} - } - const key = "extra-key" - cases := []testCase{ - {key: key, val: "abc", want: "abc"}, - {key: key, val: 123, want: 123}, - {key: key, val: "", want: ""}, - {key: "other-key", val: "def", want: nil}, - } - for _, tc := range cases { - extra := make(map[string]interface{}) - extra[tc.key] = tc.val - tok := &Token{raw: extra} - if got, want := tok.Extra(key), tc.want; got != want { - t.Errorf("Extra(%q) = %q; want %q", key, got, want) - } - } -} - -func TestTokenExpiry(t *testing.T) { - now := time.Now() - cases := []struct { - name string - tok *Token - want bool - }{ - {name: "12 seconds", tok: &Token{Expiry: now.Add(12 * time.Second)}, want: false}, - {name: "10 seconds", tok: &Token{Expiry: now.Add(expiryDelta)}, want: true}, - } - for _, tc := range cases { - if got, want := tc.tok.expired(), tc.want; got != want { - t.Errorf("expired (%q) = %v; want %v", tc.name, got, want) - } - } -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/transport_test.go b/Godeps/_workspace/src/golang.org/x/oauth2/transport_test.go deleted file mode 100644 index 35cb25ed5..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/transport_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package oauth2 - -import ( - "net/http" - "net/http/httptest" - "testing" - "time" -) - -type tokenSource struct{ token *Token } - -func (t *tokenSource) Token() (*Token, error) { - return t.token, nil -} - -func TestTransportTokenSource(t *testing.T) { - ts := &tokenSource{ - token: &Token{ - AccessToken: "abc", - }, - } - tr := &Transport{ - Source: ts, - } - server := newMockServer(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") != "Bearer abc" { - t.Errorf("Transport doesn't set the Authorization header from the fetched token") - } - }) - defer server.Close() - client := http.Client{Transport: tr} - client.Get(server.URL) -} - -// Test for case-sensitive token types, per https://github.com/golang/oauth2/issues/113 -func TestTransportTokenSourceTypes(t *testing.T) { - const val = "abc" - tests := []struct { - key string - val string - want string - }{ - {key: "bearer", val: val, want: "Bearer abc"}, - {key: "mac", val: val, want: "MAC abc"}, - {key: "basic", val: val, want: "Basic abc"}, - } - for _, tc := range tests { - ts := &tokenSource{ - token: &Token{ - AccessToken: tc.val, - TokenType: tc.key, - }, - } - tr := &Transport{ - Source: ts, - } - server := newMockServer(func(w http.ResponseWriter, r *http.Request) { - if got, want := r.Header.Get("Authorization"), tc.want; got != want { - t.Errorf("Authorization header (%q) = %q; want %q", val, got, want) - } - }) - defer server.Close() - client := http.Client{Transport: tr} - client.Get(server.URL) - } -} - -func TestTokenValidNoAccessToken(t *testing.T) { - token := &Token{} - if token.Valid() { - t.Errorf("Token should not be valid with no access token") - } -} - -func TestExpiredWithExpiry(t *testing.T) { - token := &Token{ - Expiry: time.Now().Add(-5 * time.Hour), - } - if token.Valid() { - t.Errorf("Token should not be valid if it expired in the past") - } -} - -func newMockServer(handler func(w http.ResponseWriter, r *http.Request)) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(handler)) -} diff --git a/Godeps/_workspace/src/golang.org/x/oauth2/vk/vk.go b/Godeps/_workspace/src/golang.org/x/oauth2/vk/vk.go deleted file mode 100644 index 00e929357..000000000 --- a/Godeps/_workspace/src/golang.org/x/oauth2/vk/vk.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The oauth2 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 vk provides constants for using OAuth2 to access VK.com. -package vk - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is VK's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://oauth.vk.com/authorize", - TokenURL: "https://oauth.vk.com/access_token", -} diff --git a/Godeps/_workspace/src/google.golang.org/api/gensupport/json_test.go b/Godeps/_workspace/src/google.golang.org/api/gensupport/json_test.go deleted file mode 100644 index b2f921913..000000000 --- a/Godeps/_workspace/src/google.golang.org/api/gensupport/json_test.go +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright 2015 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 gensupport - -import ( - "encoding/json" - "reflect" - "testing" - - "google.golang.org/api/googleapi" -) - -type schema struct { - // Basic types - B bool `json:"b,omitempty"` - F float64 `json:"f,omitempty"` - I int64 `json:"i,omitempty"` - Istr int64 `json:"istr,omitempty,string"` - Str string `json:"str,omitempty"` - - // Pointers to basic types - PB *bool `json:"pb,omitempty"` - PF *float64 `json:"pf,omitempty"` - PI *int64 `json:"pi,omitempty"` - PIStr *int64 `json:"pistr,omitempty,string"` - PStr *string `json:"pstr,omitempty"` - - // Other types - Int64s googleapi.Int64s `json:"i64s,omitempty"` - S []int `json:"s,omitempty"` - M map[string]string `json:"m,omitempty"` - Any interface{} `json:"any,omitempty"` - Child *child `json:"child,omitempty"` - - ForceSendFields []string `json:"-"` -} - -type child struct { - B bool `json:"childbool,omitempty"` -} - -type testCase struct { - s schema - want string -} - -func TestBasics(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{ - ForceSendFields: []string{"B", "F", "I", "Istr", "Str", "PB", "PF", "PI", "PIStr", "PStr"}, - }, - want: `{"b":false,"f":0.0,"i":0,"istr":"0","str":""}`, - }, - { - s: schema{ - B: true, - F: 1.2, - I: 1, - Istr: 2, - Str: "a", - PB: googleapi.Bool(true), - PF: googleapi.Float64(1.2), - PI: googleapi.Int64(int64(1)), - PIStr: googleapi.Int64(int64(2)), - PStr: googleapi.String("a"), - }, - want: `{"b":true,"f":1.2,"i":1,"istr":"2","str":"a","pb":true,"pf":1.2,"pi":1,"pistr":"2","pstr":"a"}`, - }, - { - s: schema{ - B: false, - F: 0.0, - I: 0, - Istr: 0, - Str: "", - PB: googleapi.Bool(false), - PF: googleapi.Float64(0.0), - PI: googleapi.Int64(int64(0)), - PIStr: googleapi.Int64(int64(0)), - PStr: googleapi.String(""), - }, - want: `{"pb":false,"pf":0.0,"pi":0,"pistr":"0","pstr":""}`, - }, - { - s: schema{ - B: false, - F: 0.0, - I: 0, - Istr: 0, - Str: "", - PB: googleapi.Bool(false), - PF: googleapi.Float64(0.0), - PI: googleapi.Int64(int64(0)), - PIStr: googleapi.Int64(int64(0)), - PStr: googleapi.String(""), - ForceSendFields: []string{"B", "F", "I", "Istr", "Str", "PB", "PF", "PI", "PIStr", "PStr"}, - }, - want: `{"b":false,"f":0.0,"i":0,"istr":"0","str":"","pb":false,"pf":0.0,"pi":0,"pistr":"0","pstr":""}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestSliceFields(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{S: []int{}, Int64s: googleapi.Int64s{}}, - want: `{}`, - }, - { - s: schema{S: []int{1}, Int64s: googleapi.Int64s{1}}, - want: `{"s":[1],"i64s":["1"]}`, - }, - { - s: schema{ - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[],"i64s":[]}`, - }, - { - s: schema{ - S: []int{}, - Int64s: googleapi.Int64s{}, - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[],"i64s":[]}`, - }, - { - s: schema{ - S: []int{1}, - Int64s: googleapi.Int64s{1}, - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[1],"i64s":["1"]}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestMapField(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{M: make(map[string]string)}, - want: `{}`, - }, - { - s: schema{M: map[string]string{"a": "b"}}, - want: `{"m":{"a":"b"}}`, - }, - { - s: schema{ - ForceSendFields: []string{"M"}, - }, - want: `{"m":{}}`, - }, - { - s: schema{ - M: make(map[string]string), - ForceSendFields: []string{"M"}, - }, - want: `{"m":{}}`, - }, - { - s: schema{ - M: map[string]string{"a": "b"}, - ForceSendFields: []string{"M"}, - }, - want: `{"m":{"a":"b"}}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -type anyType struct { - Field int -} - -func (a anyType) MarshalJSON() ([]byte, error) { - return []byte(`"anyType value"`), nil -} - -func TestAnyField(t *testing.T) { - // ForceSendFields has no effect on nil interfaces and interfaces that contain nil pointers. - var nilAny *anyType - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{Any: nilAny}, - want: `{"any": null}`, - }, - { - s: schema{Any: &anyType{}}, - want: `{"any":"anyType value"}`, - }, - { - s: schema{Any: anyType{}}, - want: `{"any":"anyType value"}`, - }, - { - s: schema{ - ForceSendFields: []string{"Any"}, - }, - want: `{}`, - }, - { - s: schema{ - Any: nilAny, - ForceSendFields: []string{"Any"}, - }, - want: `{"any": null}`, - }, - { - s: schema{ - Any: &anyType{}, - ForceSendFields: []string{"Any"}, - }, - want: `{"any":"anyType value"}`, - }, - { - s: schema{ - Any: anyType{}, - ForceSendFields: []string{"Any"}, - }, - want: `{"any":"anyType value"}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestSubschema(t *testing.T) { - // Subschemas are always stored as pointers, so ForceSendFields has no effect on them. - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{ - ForceSendFields: []string{"Child"}, - }, - want: `{}`, - }, - { - s: schema{Child: &child{}}, - want: `{"child":{}}`, - }, - { - s: schema{ - Child: &child{}, - ForceSendFields: []string{"Child"}, - }, - want: `{"child":{}}`, - }, - { - s: schema{Child: &child{B: true}}, - want: `{"child":{"childbool":true}}`, - }, - - { - s: schema{ - Child: &child{B: true}, - ForceSendFields: []string{"Child"}, - }, - want: `{"child":{"childbool":true}}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -// checkMarshalJSON verifies that calling schemaToMap on tc.s yields a result which is equivalent to tc.want. -func checkMarshalJSON(t *testing.T, tc testCase) { - doCheckMarshalJSON(t, tc.s, tc.s.ForceSendFields, tc.want) - if len(tc.s.ForceSendFields) == 0 { - // verify that the code path used when ForceSendFields - // is non-empty produces the same output as the fast - // path that is used when it is empty. - doCheckMarshalJSON(t, tc.s, []string{"dummy"}, tc.want) - } -} - -func doCheckMarshalJSON(t *testing.T, s schema, forceSendFields []string, wantJSON string) { - encoded, err := MarshalJSON(s, forceSendFields) - if err != nil { - t.Fatalf("encoding json:\n got err: %v", err) - } - - // The expected and obtained JSON can differ in field ordering, so unmarshal before comparing. - var got interface{} - var want interface{} - err = json.Unmarshal(encoded, &got) - if err != nil { - t.Fatalf("decoding json:\n got err: %v", err) - } - err = json.Unmarshal([]byte(wantJSON), &want) - if err != nil { - t.Fatalf("decoding json:\n got err: %v", err) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("schemaToMap:\ngot :%s\nwant:%s", got, want) - } -} - -func TestParseJSONTag(t *testing.T) { - for _, tc := range []struct { - tag string - want jsonTag - }{ - { - tag: "-", - want: jsonTag{ignore: true}, - }, { - tag: "name,omitempty", - want: jsonTag{apiName: "name"}, - }, { - tag: "name,omitempty,string", - want: jsonTag{apiName: "name", stringFormat: true}, - }, - } { - got, err := parseJSONTag(tc.tag) - if err != nil { - t.Fatalf("parsing json:\n got err: %v\ntag: %q", err, tc.tag) - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("parseJSONTage:\ngot :%s\nwant:%s", got, tc.want) - } - } -} -func TestParseMalformedJSONTag(t *testing.T) { - for _, tag := range []string{ - "", - "name", - "name,", - "name,blah", - "name,blah,string", - ",omitempty", - ",omitempty,string", - "name,omitempty,string,blah", - } { - _, err := parseJSONTag(tag) - if err == nil { - t.Fatalf("parsing json: expected err, got nil for tag: %v", tag) - } - } -} diff --git a/Godeps/_workspace/src/google.golang.org/api/gensupport/media_test.go b/Godeps/_workspace/src/google.golang.org/api/gensupport/media_test.go deleted file mode 100644 index 72edb453e..000000000 --- a/Godeps/_workspace/src/google.golang.org/api/gensupport/media_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015 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 gensupport - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "reflect" - "testing" -) - -// errReader reads out of a buffer until it is empty, then returns the specified error. -type errReader struct { - buf []byte - err error -} - -var errBang error = errors.New("bang") - -func (er *errReader) Read(p []byte) (int, error) { - if len(er.buf) == 0 { - if er.err == nil { - return 0, io.EOF - } - return 0, er.err - } - n := copy(p, er.buf) - er.buf = er.buf[n:] - return n, nil -} - -func TestAll(t *testing.T) { - type testCase struct { - data []byte // the data to read from the Reader - finalErr error // error to return after data has been read - - wantContentType string - wantContentTypeResult bool - } - - for _, tc := range []testCase{ - { - data: []byte{0, 0, 0, 0}, - finalErr: nil, - wantContentType: "application/octet-stream", - wantContentTypeResult: true, - }, - { - data: []byte(""), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: []byte(""), - finalErr: errBang, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: false, - }, - { - data: []byte("abc"), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: []byte("abc"), - finalErr: errBang, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: false, - }, - // The following examples contain more bytes than are buffered for sniffing. - { - data: bytes.Repeat([]byte("a"), 513), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: bytes.Repeat([]byte("a"), 513), - finalErr: errBang, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, // true because error is after first 512 bytes. - }, - } { - er := &errReader{buf: tc.data, err: tc.finalErr} - - sct := NewContentSniffer(er) - - // Even if was an error during the first 512 bytes, we should still be able to read those bytes. - buf, err := ioutil.ReadAll(sct) - - if !reflect.DeepEqual(buf, tc.data) { - t.Fatalf("Failed reading buffer: got: %q; want:%q", buf, tc.data) - } - - if err != tc.finalErr { - t.Fatalf("Reading buffer error: got: %v; want: %v", err, tc.finalErr) - } - - ct, ok := sct.ContentType() - if ok != tc.wantContentTypeResult { - t.Fatalf("Content type result got: %v; want: %v", ok, tc.wantContentTypeResult) - } - if ok && ct != tc.wantContentType { - t.Fatalf("Content type got: %q; want: %q", ct, tc.wantContentType) - } - } -} diff --git a/Godeps/_workspace/src/google.golang.org/api/googleapi/googleapi_test.go b/Godeps/_workspace/src/google.golang.org/api/googleapi/googleapi_test.go deleted file mode 100644 index 75d33ea09..000000000 --- a/Godeps/_workspace/src/google.golang.org/api/googleapi/googleapi_test.go +++ /dev/null @@ -1,599 +0,0 @@ -// Copyright 2011 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 googleapi - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "os" - "reflect" - "regexp" - "strconv" - "strings" - "testing" - "time" - - "golang.org/x/net/context" -) - -type SetOpaqueTest struct { - in *url.URL - wantRequestURI string -} - -var setOpaqueTests = []SetOpaqueTest{ - // no path - { - &url.URL{ - Scheme: "http", - Host: "www.golang.org", - }, - "http://www.golang.org", - }, - // path - { - &url.URL{ - Scheme: "http", - Host: "www.golang.org", - Path: "/", - }, - "http://www.golang.org/", - }, - // file with hex escaping - { - &url.URL{ - Scheme: "https", - Host: "www.golang.org", - Path: "/file%20one&two", - }, - "https://www.golang.org/file%20one&two", - }, - // query - { - &url.URL{ - Scheme: "http", - Host: "www.golang.org", - Path: "/", - RawQuery: "q=go+language", - }, - "http://www.golang.org/?q=go+language", - }, - // file with hex escaping in path plus query - { - &url.URL{ - Scheme: "https", - Host: "www.golang.org", - Path: "/file%20one&two", - RawQuery: "q=go+language", - }, - "https://www.golang.org/file%20one&two?q=go+language", - }, - // query with hex escaping - { - &url.URL{ - Scheme: "http", - Host: "www.golang.org", - Path: "/", - RawQuery: "q=go%20language", - }, - "http://www.golang.org/?q=go%20language", - }, -} - -// prefixTmpl is a template for the expected prefix of the output of writing -// an HTTP request. -const prefixTmpl = "GET %v HTTP/1.1\r\nHost: %v\r\n" - -func TestSetOpaque(t *testing.T) { - for _, test := range setOpaqueTests { - u := *test.in - SetOpaque(&u) - - w := &bytes.Buffer{} - r := &http.Request{URL: &u} - if err := r.Write(w); err != nil { - t.Errorf("write request: %v", err) - continue - } - - prefix := fmt.Sprintf(prefixTmpl, test.wantRequestURI, test.in.Host) - if got := string(w.Bytes()); !strings.HasPrefix(got, prefix) { - t.Errorf("got %q expected prefix %q", got, prefix) - } - } -} - -type ExpandTest struct { - in string - expansions map[string]string - want string -} - -var expandTests = []ExpandTest{ - // no expansions - { - "http://www.golang.org/", - map[string]string{}, - "http://www.golang.org/", - }, - // one expansion, no escaping - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red", - }, - "http://www.golang.org/red/delete", - }, - // one expansion, with hex escapes - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red/blue", - }, - "http://www.golang.org/red%2Fblue/delete", - }, - // one expansion, with space - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red or blue", - }, - "http://www.golang.org/red%20or%20blue/delete", - }, - // expansion not found - { - "http://www.golang.org/{object}/delete", - map[string]string{ - "bucket": "red or blue", - }, - "http://www.golang.org//delete", - }, - // multiple expansions - { - "http://www.golang.org/{one}/{two}/{three}/get", - map[string]string{ - "one": "ONE", - "two": "TWO", - "three": "THREE", - }, - "http://www.golang.org/ONE/TWO/THREE/get", - }, - // utf-8 characters - { - "http://www.golang.org/{bucket}/get", - map[string]string{ - "bucket": "£100", - }, - "http://www.golang.org/%C2%A3100/get", - }, - // punctuations - { - "http://www.golang.org/{bucket}/get", - map[string]string{ - "bucket": `/\@:,.`, - }, - "http://www.golang.org/%2F%5C%40%3A%2C./get", - }, - // mis-matched brackets - { - "http://www.golang.org/{bucket/get", - map[string]string{ - "bucket": "red", - }, - "http://www.golang.org/{bucket/get", - }, - // "+" prefix for suppressing escape - // See also: http://tools.ietf.org/html/rfc6570#section-3.2.3 - { - "http://www.golang.org/{+topic}", - map[string]string{ - "topic": "/topics/myproject/mytopic", - }, - // The double slashes here look weird, but it's intentional - "http://www.golang.org//topics/myproject/mytopic", - }, -} - -func TestExpand(t *testing.T) { - for i, test := range expandTests { - u := url.URL{ - Path: test.in, - } - Expand(&u, test.expansions) - got := u.Path - if got != test.want { - t.Errorf("got %q expected %q in test %d", got, test.want, i+1) - } - } -} - -type CheckResponseTest struct { - in *http.Response - bodyText string - want error - errText string -} - -var checkResponseTests = []CheckResponseTest{ - { - &http.Response{ - StatusCode: http.StatusOK, - }, - "", - nil, - "", - }, - { - &http.Response{ - StatusCode: http.StatusInternalServerError, - }, - `{"error":{}}`, - &Error{ - Code: http.StatusInternalServerError, - Body: `{"error":{}}`, - }, - `googleapi: got HTTP response code 500 with body: {"error":{}}`, - }, - { - &http.Response{ - StatusCode: http.StatusNotFound, - }, - `{"error":{"message":"Error message for StatusNotFound."}}`, - &Error{ - Code: http.StatusNotFound, - Message: "Error message for StatusNotFound.", - Body: `{"error":{"message":"Error message for StatusNotFound."}}`, - }, - "googleapi: Error 404: Error message for StatusNotFound.", - }, - { - &http.Response{ - StatusCode: http.StatusBadRequest, - }, - `{"error":"invalid_token","error_description":"Invalid Value"}`, - &Error{ - Code: http.StatusBadRequest, - Body: `{"error":"invalid_token","error_description":"Invalid Value"}`, - }, - `googleapi: got HTTP response code 400 with body: {"error":"invalid_token","error_description":"Invalid Value"}`, - }, - { - &http.Response{ - StatusCode: http.StatusBadRequest, - }, - `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`, - &Error{ - Code: http.StatusBadRequest, - Errors: []ErrorItem{ - { - Reason: "keyInvalid", - Message: "Bad Request", - }, - }, - Body: `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`, - Message: "Bad Request", - }, - "googleapi: Error 400: Bad Request, keyInvalid", - }, -} - -func TestCheckResponse(t *testing.T) { - for _, test := range checkResponseTests { - res := test.in - if test.bodyText != "" { - res.Body = ioutil.NopCloser(strings.NewReader(test.bodyText)) - } - g := CheckResponse(res) - if !reflect.DeepEqual(g, test.want) { - t.Errorf("CheckResponse: got %v, want %v", g, test.want) - gotJson, err := json.Marshal(g) - if err != nil { - t.Error(err) - } - wantJson, err := json.Marshal(test.want) - if err != nil { - t.Error(err) - } - t.Errorf("json(got): %q\njson(want): %q", string(gotJson), string(wantJson)) - } - if g != nil && g.Error() != test.errText { - t.Errorf("CheckResponse: unexpected error message.\nGot: %q\nwant: %q", g, test.errText) - } - } -} - -type VariantPoint struct { - Type string - Coordinates []float64 -} - -type VariantTest struct { - in map[string]interface{} - result bool - want VariantPoint -} - -var coords = []interface{}{1.0, 2.0} - -var variantTests = []VariantTest{ - { - in: map[string]interface{}{ - "type": "Point", - "coordinates": coords, - }, - result: true, - want: VariantPoint{ - Type: "Point", - Coordinates: []float64{1.0, 2.0}, - }, - }, - { - in: map[string]interface{}{ - "type": "Point", - "bogus": coords, - }, - result: true, - want: VariantPoint{ - Type: "Point", - }, - }, -} - -func TestVariantType(t *testing.T) { - for _, test := range variantTests { - if g := VariantType(test.in); g != test.want.Type { - t.Errorf("VariantType(%v): got %v, want %v", test.in, g, test.want.Type) - } - } -} - -func TestConvertVariant(t *testing.T) { - for _, test := range variantTests { - g := VariantPoint{} - r := ConvertVariant(test.in, &g) - if r != test.result { - t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, r, test.result) - } - if !reflect.DeepEqual(g, test.want) { - t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, g, test.want) - } - } -} - -type unexpectedReader struct{} - -func (unexpectedReader) Read([]byte) (int, error) { - return 0, fmt.Errorf("unexpected read in test.") -} - -var contentRangeRE = regexp.MustCompile(`^bytes (\d+)\-(\d+)/(\d+)$`) - -func (t *testTransport) RoundTrip(req *http.Request) (*http.Response, error) { - t.req = req - if rng := req.Header.Get("Content-Range"); rng != "" && !strings.HasPrefix(rng, "bytes */") { // Read the data - m := contentRangeRE.FindStringSubmatch(rng) - if len(m) != 4 { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - start, err := strconv.ParseInt(m[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - end, err := strconv.ParseInt(m[2], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - totalSize, err := strconv.ParseInt(m[3], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - partialSize := end - start + 1 - t.buf, err = ioutil.ReadAll(req.Body) - if err != nil || int64(len(t.buf)) != partialSize { - return nil, fmt.Errorf("unable to read %v bytes from request data, n=%v: %v", partialSize, len(t.buf), err) - } - if totalSize == end+1 { - t.statusCode = 200 // signify completion of transfer - } - } - f := ioutil.NopCloser(unexpectedReader{}) - res := &http.Response{ - Body: f, - StatusCode: t.statusCode, - Header: http.Header{}, - } - if t.rangeVal != "" { - res.Header.Set("Range", t.rangeVal) - } - return res, nil -} - -type testTransport struct { - req *http.Request - statusCode int - rangeVal string - want int64 - buf []byte -} - -var statusTests = []*testTransport{ - &testTransport{statusCode: 308, want: 0}, - &testTransport{statusCode: 308, rangeVal: "bytes=0-0", want: 1}, - &testTransport{statusCode: 308, rangeVal: "bytes=0-42", want: 43}, -} - -func TestTransferStatus(t *testing.T) { - ctx := context.Background() - for _, tr := range statusTests { - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - } - g, _, err := rx.transferStatus(ctx) - if err != nil { - t.Error(err) - } - if g != tr.want { - t.Errorf("transferStatus got %v, want %v", g, tr.want) - } - } -} - -func (t *interruptedTransport) RoundTrip(req *http.Request) (*http.Response, error) { - t.req = req - if rng := req.Header.Get("Content-Range"); rng != "" && !strings.HasPrefix(rng, "bytes */") { - t.interruptCount += 1 - if t.interruptCount%7 == 0 { // Respond with a "service unavailable" error - res := &http.Response{ - StatusCode: http.StatusServiceUnavailable, - Header: http.Header{}, - } - t.rangeVal = fmt.Sprintf("bytes=0-%v", len(t.buf)-1) // Set the response for next time - return res, nil - } - m := contentRangeRE.FindStringSubmatch(rng) - if len(m) != 4 { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - start, err := strconv.ParseInt(m[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - end, err := strconv.ParseInt(m[2], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - totalSize, err := strconv.ParseInt(m[3], 10, 64) - if err != nil { - return nil, fmt.Errorf("unable to parse content range: %v", rng) - } - partialSize := end - start + 1 - buf, err := ioutil.ReadAll(req.Body) - if err != nil || int64(len(buf)) != partialSize { - return nil, fmt.Errorf("unable to read %v bytes from request data, n=%v: %v", partialSize, len(buf), err) - } - t.buf = append(t.buf, buf...) - if totalSize == end+1 { - t.statusCode = 200 // signify completion of transfer - } - } - f := ioutil.NopCloser(unexpectedReader{}) - res := &http.Response{ - Body: f, - StatusCode: t.statusCode, - Header: http.Header{}, - } - if t.rangeVal != "" { - res.Header.Set("Range", t.rangeVal) - } - return res, nil -} - -type interruptedTransport struct { - req *http.Request - statusCode int - rangeVal string - interruptCount int - buf []byte - progressUpdates []int64 -} - -func (tr *interruptedTransport) ProgressUpdate(current int64) { - tr.progressUpdates = append(tr.progressUpdates, current) -} - -func TestInterruptedTransferChunks(t *testing.T) { - f, err := os.Open("googleapi.go") - if err != nil { - t.Fatalf("unable to open googleapi.go: %v", err) - } - defer f.Close() - slurp, err := ioutil.ReadAll(f) - if err != nil { - t.Fatalf("unable to slurp file: %v", err) - } - st, err := f.Stat() - if err != nil { - t.Fatalf("unable to stat googleapi.go: %v", err) - } - tr := &interruptedTransport{ - statusCode: 308, - buf: make([]byte, 0, st.Size()), - } - oldChunkSize := chunkSize - defer func() { chunkSize = oldChunkSize }() - chunkSize = 100 // override to process small chunks for test. - - sleep = func(time.Duration) {} // override time.Sleep - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - Media: f, - MediaType: "text/plain", - ContentLength: st.Size(), - Callback: tr.ProgressUpdate, - } - res, err := rx.Upload(context.Background()) - if err != nil || res == nil || res.StatusCode != http.StatusOK { - if res == nil { - t.Errorf("transferChunks not successful, res=nil: %v", err) - } else { - t.Errorf("transferChunks not successful, statusCode=%v: %v", res.StatusCode, err) - } - } - if len(tr.buf) != len(slurp) || bytes.Compare(tr.buf, slurp) != 0 { - t.Errorf("transferred file corrupted:\ngot %s\nwant %s", tr.buf, slurp) - } - want := []int64{} - for i := chunkSize; i <= st.Size(); i += chunkSize { - want = append(want, i) - } - if st.Size()%chunkSize != 0 { - want = append(want, st.Size()) - } - if !reflect.DeepEqual(tr.progressUpdates, want) { - t.Errorf("progress update error, got %v, want %v", tr.progressUpdates, want) - } -} - -func TestCancelUpload(t *testing.T) { - f, err := os.Open("googleapi.go") - if err != nil { - t.Fatalf("unable to open googleapi.go: %v", err) - } - defer f.Close() - st, err := f.Stat() - if err != nil { - t.Fatalf("unable to stat googleapi.go: %v", err) - } - tr := &interruptedTransport{ - statusCode: 308, - buf: make([]byte, 0, st.Size()), - } - oldChunkSize := chunkSize - defer func() { chunkSize = oldChunkSize }() - chunkSize = 100 // override to process small chunks for test. - - sleep = func(time.Duration) {} // override time.Sleep - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - Media: f, - MediaType: "text/plain", - ContentLength: st.Size(), - Callback: tr.ProgressUpdate, - } - ctx, cancelFunc := context.WithCancel(context.Background()) - cancelFunc() // stop the upload that hasn't started yet - res, err := rx.Upload(ctx) - if err == nil || res == nil || res.StatusCode != http.StatusRequestTimeout { - if res == nil { - t.Errorf("transferChunks not successful, got res=nil, err=%v, want StatusRequestTimeout", err) - } else { - t.Errorf("transferChunks not successful, got statusCode=%v, err=%v, want StatusRequestTimeout", res.StatusCode, err) - } - } -} diff --git a/Godeps/_workspace/src/google.golang.org/api/googleapi/transport/apikey.go b/Godeps/_workspace/src/google.golang.org/api/googleapi/transport/apikey.go deleted file mode 100644 index eca1ea250..000000000 --- a/Godeps/_workspace/src/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/Godeps/_workspace/src/google.golang.org/api/googleapi/types_test.go b/Godeps/_workspace/src/google.golang.org/api/googleapi/types_test.go deleted file mode 100644 index a6b204515..000000000 --- a/Godeps/_workspace/src/google.golang.org/api/googleapi/types_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 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 googleapi - -import ( - "encoding/json" - "reflect" - "testing" -) - -func TestTypes(t *testing.T) { - type T struct { - I32 Int32s - I64 Int64s - U32 Uint32s - U64 Uint64s - F64 Float64s - } - v := &T{ - I32: Int32s{-1, 2, 3}, - I64: Int64s{-1, 2, 1 << 33}, - U32: Uint32s{1, 2}, - U64: Uint64s{1, 2, 1 << 33}, - F64: Float64s{1.5, 3.33}, - } - got, err := json.Marshal(v) - if err != nil { - t.Fatal(err) - } - want := `{"I32":["-1","2","3"],"I64":["-1","2","8589934592"],"U32":["1","2"],"U64":["1","2","8589934592"],"F64":["1.5","3.33"]}` - if string(got) != want { - t.Fatalf("Marshal mismatch.\n got: %s\nwant: %s\n", got, want) - } - - v2 := new(T) - if err := json.Unmarshal(got, v2); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !reflect.DeepEqual(v, v2) { - t.Fatalf("Unmarshal didn't produce same results.\n got: %#v\nwant: %#v\n", v, v2) - } -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.pb.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.pb.go deleted file mode 100644 index 9cb9be528..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.pb.go +++ /dev/null @@ -1,1633 +0,0 @@ -// Code generated by protoc-gen-go. -// source: datastore_v1.proto -// DO NOT EDIT! - -/* -Package datastore is a generated protocol buffer package. - -It is generated from these files: - datastore_v1.proto - -It has these top-level messages: - PartitionId - Key - Value - Property - Entity - EntityResult - Query - KindExpression - PropertyReference - PropertyExpression - PropertyOrder - Filter - CompositeFilter - PropertyFilter - GqlQuery - GqlQueryArg - QueryResultBatch - Mutation - MutationResult - ReadOptions - LookupRequest - LookupResponse - RunQueryRequest - RunQueryResponse - BeginTransactionRequest - BeginTransactionResponse - RollbackRequest - RollbackResponse - CommitRequest - CommitResponse - AllocateIdsRequest - AllocateIdsResponse -*/ -package datastore - -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 - -// Specifies what data the 'entity' field contains. -// A ResultType is either implied (for example, in LookupResponse.found it -// is always FULL) or specified by context (for example, in message -// QueryResultBatch, field 'entity_result_type' specifies a ResultType -// for all the values in field 'entity_result'). -type EntityResult_ResultType int32 - -const ( - EntityResult_FULL EntityResult_ResultType = 1 - EntityResult_PROJECTION EntityResult_ResultType = 2 - // The entity may have no key. - // A property value may have meaning 18. - EntityResult_KEY_ONLY EntityResult_ResultType = 3 -) - -var EntityResult_ResultType_name = map[int32]string{ - 1: "FULL", - 2: "PROJECTION", - 3: "KEY_ONLY", -} -var EntityResult_ResultType_value = map[string]int32{ - "FULL": 1, - "PROJECTION": 2, - "KEY_ONLY": 3, -} - -func (x EntityResult_ResultType) Enum() *EntityResult_ResultType { - p := new(EntityResult_ResultType) - *p = x - return p -} -func (x EntityResult_ResultType) String() string { - return proto.EnumName(EntityResult_ResultType_name, int32(x)) -} -func (x *EntityResult_ResultType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(EntityResult_ResultType_value, data, "EntityResult_ResultType") - if err != nil { - return err - } - *x = EntityResult_ResultType(value) - return nil -} - -type PropertyExpression_AggregationFunction int32 - -const ( - PropertyExpression_FIRST PropertyExpression_AggregationFunction = 1 -) - -var PropertyExpression_AggregationFunction_name = map[int32]string{ - 1: "FIRST", -} -var PropertyExpression_AggregationFunction_value = map[string]int32{ - "FIRST": 1, -} - -func (x PropertyExpression_AggregationFunction) Enum() *PropertyExpression_AggregationFunction { - p := new(PropertyExpression_AggregationFunction) - *p = x - return p -} -func (x PropertyExpression_AggregationFunction) String() string { - return proto.EnumName(PropertyExpression_AggregationFunction_name, int32(x)) -} -func (x *PropertyExpression_AggregationFunction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PropertyExpression_AggregationFunction_value, data, "PropertyExpression_AggregationFunction") - if err != nil { - return err - } - *x = PropertyExpression_AggregationFunction(value) - return nil -} - -type PropertyOrder_Direction int32 - -const ( - PropertyOrder_ASCENDING PropertyOrder_Direction = 1 - PropertyOrder_DESCENDING PropertyOrder_Direction = 2 -) - -var PropertyOrder_Direction_name = map[int32]string{ - 1: "ASCENDING", - 2: "DESCENDING", -} -var PropertyOrder_Direction_value = map[string]int32{ - "ASCENDING": 1, - "DESCENDING": 2, -} - -func (x PropertyOrder_Direction) Enum() *PropertyOrder_Direction { - p := new(PropertyOrder_Direction) - *p = x - return p -} -func (x PropertyOrder_Direction) String() string { - return proto.EnumName(PropertyOrder_Direction_name, int32(x)) -} -func (x *PropertyOrder_Direction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PropertyOrder_Direction_value, data, "PropertyOrder_Direction") - if err != nil { - return err - } - *x = PropertyOrder_Direction(value) - return nil -} - -type CompositeFilter_Operator int32 - -const ( - CompositeFilter_AND CompositeFilter_Operator = 1 -) - -var CompositeFilter_Operator_name = map[int32]string{ - 1: "AND", -} -var CompositeFilter_Operator_value = map[string]int32{ - "AND": 1, -} - -func (x CompositeFilter_Operator) Enum() *CompositeFilter_Operator { - p := new(CompositeFilter_Operator) - *p = x - return p -} -func (x CompositeFilter_Operator) String() string { - return proto.EnumName(CompositeFilter_Operator_name, int32(x)) -} -func (x *CompositeFilter_Operator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CompositeFilter_Operator_value, data, "CompositeFilter_Operator") - if err != nil { - return err - } - *x = CompositeFilter_Operator(value) - return nil -} - -type PropertyFilter_Operator int32 - -const ( - PropertyFilter_LESS_THAN PropertyFilter_Operator = 1 - PropertyFilter_LESS_THAN_OR_EQUAL PropertyFilter_Operator = 2 - PropertyFilter_GREATER_THAN PropertyFilter_Operator = 3 - PropertyFilter_GREATER_THAN_OR_EQUAL PropertyFilter_Operator = 4 - PropertyFilter_EQUAL PropertyFilter_Operator = 5 - PropertyFilter_HAS_ANCESTOR PropertyFilter_Operator = 11 -) - -var PropertyFilter_Operator_name = map[int32]string{ - 1: "LESS_THAN", - 2: "LESS_THAN_OR_EQUAL", - 3: "GREATER_THAN", - 4: "GREATER_THAN_OR_EQUAL", - 5: "EQUAL", - 11: "HAS_ANCESTOR", -} -var PropertyFilter_Operator_value = map[string]int32{ - "LESS_THAN": 1, - "LESS_THAN_OR_EQUAL": 2, - "GREATER_THAN": 3, - "GREATER_THAN_OR_EQUAL": 4, - "EQUAL": 5, - "HAS_ANCESTOR": 11, -} - -func (x PropertyFilter_Operator) Enum() *PropertyFilter_Operator { - p := new(PropertyFilter_Operator) - *p = x - return p -} -func (x PropertyFilter_Operator) String() string { - return proto.EnumName(PropertyFilter_Operator_name, int32(x)) -} -func (x *PropertyFilter_Operator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PropertyFilter_Operator_value, data, "PropertyFilter_Operator") - if err != nil { - return err - } - *x = PropertyFilter_Operator(value) - return nil -} - -// The possible values for the 'more_results' field. -type QueryResultBatch_MoreResultsType int32 - -const ( - QueryResultBatch_NOT_FINISHED QueryResultBatch_MoreResultsType = 1 - QueryResultBatch_MORE_RESULTS_AFTER_LIMIT QueryResultBatch_MoreResultsType = 2 - // results after the limit. - QueryResultBatch_NO_MORE_RESULTS QueryResultBatch_MoreResultsType = 3 -) - -var QueryResultBatch_MoreResultsType_name = map[int32]string{ - 1: "NOT_FINISHED", - 2: "MORE_RESULTS_AFTER_LIMIT", - 3: "NO_MORE_RESULTS", -} -var QueryResultBatch_MoreResultsType_value = map[string]int32{ - "NOT_FINISHED": 1, - "MORE_RESULTS_AFTER_LIMIT": 2, - "NO_MORE_RESULTS": 3, -} - -func (x QueryResultBatch_MoreResultsType) Enum() *QueryResultBatch_MoreResultsType { - p := new(QueryResultBatch_MoreResultsType) - *p = x - return p -} -func (x QueryResultBatch_MoreResultsType) String() string { - return proto.EnumName(QueryResultBatch_MoreResultsType_name, int32(x)) -} -func (x *QueryResultBatch_MoreResultsType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(QueryResultBatch_MoreResultsType_value, data, "QueryResultBatch_MoreResultsType") - if err != nil { - return err - } - *x = QueryResultBatch_MoreResultsType(value) - return nil -} - -type ReadOptions_ReadConsistency int32 - -const ( - ReadOptions_DEFAULT ReadOptions_ReadConsistency = 0 - ReadOptions_STRONG ReadOptions_ReadConsistency = 1 - ReadOptions_EVENTUAL ReadOptions_ReadConsistency = 2 -) - -var ReadOptions_ReadConsistency_name = map[int32]string{ - 0: "DEFAULT", - 1: "STRONG", - 2: "EVENTUAL", -} -var ReadOptions_ReadConsistency_value = map[string]int32{ - "DEFAULT": 0, - "STRONG": 1, - "EVENTUAL": 2, -} - -func (x ReadOptions_ReadConsistency) Enum() *ReadOptions_ReadConsistency { - p := new(ReadOptions_ReadConsistency) - *p = x - return p -} -func (x ReadOptions_ReadConsistency) String() string { - return proto.EnumName(ReadOptions_ReadConsistency_name, int32(x)) -} -func (x *ReadOptions_ReadConsistency) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ReadOptions_ReadConsistency_value, data, "ReadOptions_ReadConsistency") - if err != nil { - return err - } - *x = ReadOptions_ReadConsistency(value) - return nil -} - -type BeginTransactionRequest_IsolationLevel int32 - -const ( - BeginTransactionRequest_SNAPSHOT BeginTransactionRequest_IsolationLevel = 0 - // conflict if their mutations conflict. For example: - // Read(A),Write(B) may not conflict with Read(B),Write(A), - // but Read(B),Write(B) does conflict with Read(B),Write(B). - BeginTransactionRequest_SERIALIZABLE BeginTransactionRequest_IsolationLevel = 1 -) - -var BeginTransactionRequest_IsolationLevel_name = map[int32]string{ - 0: "SNAPSHOT", - 1: "SERIALIZABLE", -} -var BeginTransactionRequest_IsolationLevel_value = map[string]int32{ - "SNAPSHOT": 0, - "SERIALIZABLE": 1, -} - -func (x BeginTransactionRequest_IsolationLevel) Enum() *BeginTransactionRequest_IsolationLevel { - p := new(BeginTransactionRequest_IsolationLevel) - *p = x - return p -} -func (x BeginTransactionRequest_IsolationLevel) String() string { - return proto.EnumName(BeginTransactionRequest_IsolationLevel_name, int32(x)) -} -func (x *BeginTransactionRequest_IsolationLevel) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(BeginTransactionRequest_IsolationLevel_value, data, "BeginTransactionRequest_IsolationLevel") - if err != nil { - return err - } - *x = BeginTransactionRequest_IsolationLevel(value) - return nil -} - -type CommitRequest_Mode int32 - -const ( - CommitRequest_TRANSACTIONAL CommitRequest_Mode = 1 - CommitRequest_NON_TRANSACTIONAL CommitRequest_Mode = 2 -) - -var CommitRequest_Mode_name = map[int32]string{ - 1: "TRANSACTIONAL", - 2: "NON_TRANSACTIONAL", -} -var CommitRequest_Mode_value = map[string]int32{ - "TRANSACTIONAL": 1, - "NON_TRANSACTIONAL": 2, -} - -func (x CommitRequest_Mode) Enum() *CommitRequest_Mode { - p := new(CommitRequest_Mode) - *p = x - return p -} -func (x CommitRequest_Mode) String() string { - return proto.EnumName(CommitRequest_Mode_name, int32(x)) -} -func (x *CommitRequest_Mode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CommitRequest_Mode_value, data, "CommitRequest_Mode") - if err != nil { - return err - } - *x = CommitRequest_Mode(value) - return nil -} - -// An identifier for a particular subset of entities. -// -// Entities are partitioned into various subsets, each used by different -// datasets and different namespaces within a dataset and so forth. -// -// All input partition IDs are normalized before use. -// A partition ID is normalized as follows: -// If the partition ID is unset or is set to an empty partition ID, replace it -// with the context partition ID. -// Otherwise, if the partition ID has no dataset ID, assign it the context -// partition ID's dataset ID. -// Unless otherwise documented, the context partition ID has the dataset ID set -// to the context dataset ID and no other partition dimension set. -// -// A partition ID is empty if all of its fields are unset. -// -// Partition dimension: -// A dimension may be unset. -// A dimension's value must never be "". -// A dimension's value must match [A-Za-z\d\.\-_]{1,100} -// If the value of any dimension matches regex "__.*__", -// the partition is reserved/read-only. -// A reserved/read-only partition ID is forbidden in certain documented contexts. -// -// Dataset ID: -// A dataset id's value must never be "". -// A dataset id's value must match -// ([a-z\d\-]{1,100}~)?([a-z\d][a-z\d\-\.]{0,99}:)?([a-z\d][a-z\d\-]{0,99} -type PartitionId struct { - // The dataset ID. - DatasetId *string `protobuf:"bytes,3,opt,name=dataset_id" json:"dataset_id,omitempty"` - // The namespace. - Namespace *string `protobuf:"bytes,4,opt,name=namespace" json:"namespace,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PartitionId) Reset() { *m = PartitionId{} } -func (m *PartitionId) String() string { return proto.CompactTextString(m) } -func (*PartitionId) ProtoMessage() {} - -func (m *PartitionId) GetDatasetId() string { - if m != nil && m.DatasetId != nil { - return *m.DatasetId - } - return "" -} - -func (m *PartitionId) GetNamespace() string { - if m != nil && m.Namespace != nil { - return *m.Namespace - } - return "" -} - -// A unique identifier for an entity. -// If a key's partition id or any of its path kinds or names are -// reserved/read-only, the key is reserved/read-only. -// A reserved/read-only key is forbidden in certain documented contexts. -type Key struct { - // Entities are partitioned into subsets, currently identified by a dataset - // (usually implicitly specified by the project) and namespace ID. - // Queries are scoped to a single partition. - PartitionId *PartitionId `protobuf:"bytes,1,opt,name=partition_id" json:"partition_id,omitempty"` - // The entity path. - // An entity path consists of one or more elements composed of a kind and a - // string or numerical identifier, which identify entities. The first - // element identifies a root entity, the second element identifies - // a child of the root entity, the third element a child of the - // second entity, and so forth. The entities identified by all prefixes of - // the path are called the element's ancestors. - // An entity path is always fully complete: ALL of the entity's ancestors - // are required to be in the path along with the entity identifier itself. - // The only exception is that in some documented cases, the identifier in the - // last path element (for the entity) itself may be omitted. A path can never - // be empty. - PathElement []*Key_PathElement `protobuf:"bytes,2,rep,name=path_element" json:"path_element,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Key) Reset() { *m = Key{} } -func (m *Key) String() string { return proto.CompactTextString(m) } -func (*Key) ProtoMessage() {} - -func (m *Key) GetPartitionId() *PartitionId { - if m != nil { - return m.PartitionId - } - return nil -} - -func (m *Key) GetPathElement() []*Key_PathElement { - if m != nil { - return m.PathElement - } - return nil -} - -// A (kind, ID/name) pair used to construct a key path. -// -// At most one of name or ID may be set. -// If either is set, the element is complete. -// If neither is set, the element is incomplete. -type Key_PathElement struct { - // The kind of the entity. - // A kind matching regex "__.*__" is reserved/read-only. - // A kind must not contain more than 500 characters. - // Cannot be "". - Kind *string `protobuf:"bytes,1,req,name=kind" json:"kind,omitempty"` - // The ID of the entity. - // Never equal to zero. Values less than zero are discouraged and will not - // be supported in the future. - Id *int64 `protobuf:"varint,2,opt,name=id" json:"id,omitempty"` - // The name of the entity. - // A name matching regex "__.*__" is reserved/read-only. - // A name must not be more than 500 characters. - // Cannot be "". - Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Key_PathElement) Reset() { *m = Key_PathElement{} } -func (m *Key_PathElement) String() string { return proto.CompactTextString(m) } -func (*Key_PathElement) ProtoMessage() {} - -func (m *Key_PathElement) GetKind() string { - if m != nil && m.Kind != nil { - return *m.Kind - } - return "" -} - -func (m *Key_PathElement) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *Key_PathElement) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// A message that can hold any of the supported value types and associated -// metadata. -// -// At most one of the Value fields may be set. -// If none are set the value is "null". -// -type Value struct { - // A boolean value. - BooleanValue *bool `protobuf:"varint,1,opt,name=boolean_value" json:"boolean_value,omitempty"` - // An integer value. - IntegerValue *int64 `protobuf:"varint,2,opt,name=integer_value" json:"integer_value,omitempty"` - // A double value. - DoubleValue *float64 `protobuf:"fixed64,3,opt,name=double_value" json:"double_value,omitempty"` - // A timestamp value. - TimestampMicrosecondsValue *int64 `protobuf:"varint,4,opt,name=timestamp_microseconds_value" json:"timestamp_microseconds_value,omitempty"` - // A key value. - KeyValue *Key `protobuf:"bytes,5,opt,name=key_value" json:"key_value,omitempty"` - // A blob key value. - BlobKeyValue *string `protobuf:"bytes,16,opt,name=blob_key_value" json:"blob_key_value,omitempty"` - // A UTF-8 encoded string value. - StringValue *string `protobuf:"bytes,17,opt,name=string_value" json:"string_value,omitempty"` - // A blob value. - BlobValue []byte `protobuf:"bytes,18,opt,name=blob_value" json:"blob_value,omitempty"` - // An entity value. - // May have no key. - // May have a key with an incomplete key path. - // May have a reserved/read-only key. - EntityValue *Entity `protobuf:"bytes,6,opt,name=entity_value" json:"entity_value,omitempty"` - // A list value. - // Cannot contain another list value. - // Cannot also have a meaning and indexing set. - ListValue []*Value `protobuf:"bytes,7,rep,name=list_value" json:"list_value,omitempty"` - // The meaning field is reserved and should not be used. - Meaning *int32 `protobuf:"varint,14,opt,name=meaning" json:"meaning,omitempty"` - // If the value should be indexed. - // - // The indexed property may be set for a - // null value. - // When indexed is true, stringValue - // is limited to 500 characters and the blob value is limited to 500 bytes. - // Exception: If meaning is set to 2, string_value is limited to 2038 - // characters regardless of indexed. - // When indexed is true, meaning 15 and 22 are not allowed, and meaning 16 - // will be ignored on input (and will never be set on output). - // Input values by default have indexed set to - // true; however, you can explicitly set indexed to - // true if you want. (An output value never has - // indexed explicitly set to true.) If a value is - // itself an entity, it cannot have indexed set to - // true. - // Exception: An entity value with meaning 9, 20 or 21 may be indexed. - Indexed *bool `protobuf:"varint,15,opt,name=indexed,def=1" json:"indexed,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Value) Reset() { *m = Value{} } -func (m *Value) String() string { return proto.CompactTextString(m) } -func (*Value) ProtoMessage() {} - -const Default_Value_Indexed bool = true - -func (m *Value) GetBooleanValue() bool { - if m != nil && m.BooleanValue != nil { - return *m.BooleanValue - } - return false -} - -func (m *Value) GetIntegerValue() int64 { - if m != nil && m.IntegerValue != nil { - return *m.IntegerValue - } - return 0 -} - -func (m *Value) GetDoubleValue() float64 { - if m != nil && m.DoubleValue != nil { - return *m.DoubleValue - } - return 0 -} - -func (m *Value) GetTimestampMicrosecondsValue() int64 { - if m != nil && m.TimestampMicrosecondsValue != nil { - return *m.TimestampMicrosecondsValue - } - return 0 -} - -func (m *Value) GetKeyValue() *Key { - if m != nil { - return m.KeyValue - } - return nil -} - -func (m *Value) GetBlobKeyValue() string { - if m != nil && m.BlobKeyValue != nil { - return *m.BlobKeyValue - } - return "" -} - -func (m *Value) GetStringValue() string { - if m != nil && m.StringValue != nil { - return *m.StringValue - } - return "" -} - -func (m *Value) GetBlobValue() []byte { - if m != nil { - return m.BlobValue - } - return nil -} - -func (m *Value) GetEntityValue() *Entity { - if m != nil { - return m.EntityValue - } - return nil -} - -func (m *Value) GetListValue() []*Value { - if m != nil { - return m.ListValue - } - return nil -} - -func (m *Value) GetMeaning() int32 { - if m != nil && m.Meaning != nil { - return *m.Meaning - } - return 0 -} - -func (m *Value) GetIndexed() bool { - if m != nil && m.Indexed != nil { - return *m.Indexed - } - return Default_Value_Indexed -} - -// An entity property. -type Property struct { - // The name of the property. - // A property name matching regex "__.*__" is reserved. - // A reserved property name is forbidden in certain documented contexts. - // The name must not contain more than 500 characters. - // Cannot be "". - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - // The value(s) of the property. - // Each value can have only one value property populated. For example, - // you cannot have a values list of { value: { integerValue: 22, - // stringValue: "a" } }, but you can have { value: { listValue: - // [ { integerValue: 22 }, { stringValue: "a" } ] }. - Value *Value `protobuf:"bytes,4,req,name=value" json:"value,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Property) Reset() { *m = Property{} } -func (m *Property) String() string { return proto.CompactTextString(m) } -func (*Property) ProtoMessage() {} - -func (m *Property) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Property) GetValue() *Value { - if m != nil { - return m.Value - } - return nil -} - -// An entity. -// -// An entity is limited to 1 megabyte when stored. That roughly -// corresponds to a limit of 1 megabyte for the serialized form of this -// message. -type Entity struct { - // The entity's key. - // - // An entity must have a key, unless otherwise documented (for example, - // an entity in Value.entityValue may have no key). - // An entity's kind is its key's path's last element's kind, - // or null if it has no key. - Key *Key `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - // The entity's properties. - // Each property's name must be unique for its entity. - Property []*Property `protobuf:"bytes,2,rep,name=property" json:"property,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Entity) Reset() { *m = Entity{} } -func (m *Entity) String() string { return proto.CompactTextString(m) } -func (*Entity) ProtoMessage() {} - -func (m *Entity) GetKey() *Key { - if m != nil { - return m.Key - } - return nil -} - -func (m *Entity) GetProperty() []*Property { - if m != nil { - return m.Property - } - return nil -} - -// The result of fetching an entity from the datastore. -type EntityResult struct { - // The resulting entity. - Entity *Entity `protobuf:"bytes,1,req,name=entity" json:"entity,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *EntityResult) Reset() { *m = EntityResult{} } -func (m *EntityResult) String() string { return proto.CompactTextString(m) } -func (*EntityResult) ProtoMessage() {} - -func (m *EntityResult) GetEntity() *Entity { - if m != nil { - return m.Entity - } - return nil -} - -// A query. -type Query struct { - // The projection to return. If not set the entire entity is returned. - Projection []*PropertyExpression `protobuf:"bytes,2,rep,name=projection" json:"projection,omitempty"` - // The kinds to query (if empty, returns entities from all kinds). - Kind []*KindExpression `protobuf:"bytes,3,rep,name=kind" json:"kind,omitempty"` - // The filter to apply (optional). - Filter *Filter `protobuf:"bytes,4,opt,name=filter" json:"filter,omitempty"` - // The order to apply to the query results (if empty, order is unspecified). - Order []*PropertyOrder `protobuf:"bytes,5,rep,name=order" json:"order,omitempty"` - // The properties to group by (if empty, no grouping is applied to the - // result set). - GroupBy []*PropertyReference `protobuf:"bytes,6,rep,name=group_by" json:"group_by,omitempty"` - // A starting point for the query results. Optional. Query cursors are - // returned in query result batches. - StartCursor []byte `protobuf:"bytes,7,opt,name=start_cursor" json:"start_cursor,omitempty"` - // An ending point for the query results. Optional. Query cursors are - // returned in query result batches. - EndCursor []byte `protobuf:"bytes,8,opt,name=end_cursor" json:"end_cursor,omitempty"` - // The number of results to skip. Applies before limit, but after all other - // constraints (optional, defaults to 0). - Offset *int32 `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"` - // The maximum number of results to return. Applies after all other - // constraints. Optional. - Limit *int32 `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Query) Reset() { *m = Query{} } -func (m *Query) String() string { return proto.CompactTextString(m) } -func (*Query) ProtoMessage() {} - -const Default_Query_Offset int32 = 0 - -func (m *Query) GetProjection() []*PropertyExpression { - if m != nil { - return m.Projection - } - return nil -} - -func (m *Query) GetKind() []*KindExpression { - if m != nil { - return m.Kind - } - return nil -} - -func (m *Query) GetFilter() *Filter { - if m != nil { - return m.Filter - } - return nil -} - -func (m *Query) GetOrder() []*PropertyOrder { - if m != nil { - return m.Order - } - return nil -} - -func (m *Query) GetGroupBy() []*PropertyReference { - if m != nil { - return m.GroupBy - } - return nil -} - -func (m *Query) GetStartCursor() []byte { - if m != nil { - return m.StartCursor - } - return nil -} - -func (m *Query) GetEndCursor() []byte { - if m != nil { - return m.EndCursor - } - return nil -} - -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 -} - -// A representation of a kind. -type KindExpression struct { - // The name of the kind. - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *KindExpression) Reset() { *m = KindExpression{} } -func (m *KindExpression) String() string { return proto.CompactTextString(m) } -func (*KindExpression) ProtoMessage() {} - -func (m *KindExpression) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// A reference to a property relative to the kind expressions. -// exactly. -type PropertyReference struct { - // The name of the property. - Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PropertyReference) Reset() { *m = PropertyReference{} } -func (m *PropertyReference) String() string { return proto.CompactTextString(m) } -func (*PropertyReference) ProtoMessage() {} - -func (m *PropertyReference) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -// A representation of a property in a projection. -type PropertyExpression struct { - // The property to project. - Property *PropertyReference `protobuf:"bytes,1,req,name=property" json:"property,omitempty"` - // The aggregation function to apply to the property. Optional. - // Can only be used when grouping by at least one property. Must - // then be set on all properties in the projection that are not - // being grouped by. - AggregationFunction *PropertyExpression_AggregationFunction `protobuf:"varint,2,opt,name=aggregation_function,enum=datastore.PropertyExpression_AggregationFunction" json:"aggregation_function,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PropertyExpression) Reset() { *m = PropertyExpression{} } -func (m *PropertyExpression) String() string { return proto.CompactTextString(m) } -func (*PropertyExpression) ProtoMessage() {} - -func (m *PropertyExpression) GetProperty() *PropertyReference { - if m != nil { - return m.Property - } - return nil -} - -func (m *PropertyExpression) GetAggregationFunction() PropertyExpression_AggregationFunction { - if m != nil && m.AggregationFunction != nil { - return *m.AggregationFunction - } - return PropertyExpression_FIRST -} - -// The desired order for a specific property. -type PropertyOrder struct { - // The property to order by. - Property *PropertyReference `protobuf:"bytes,1,req,name=property" json:"property,omitempty"` - // The direction to order by. - Direction *PropertyOrder_Direction `protobuf:"varint,2,opt,name=direction,enum=datastore.PropertyOrder_Direction,def=1" json:"direction,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PropertyOrder) Reset() { *m = PropertyOrder{} } -func (m *PropertyOrder) String() string { return proto.CompactTextString(m) } -func (*PropertyOrder) ProtoMessage() {} - -const Default_PropertyOrder_Direction PropertyOrder_Direction = PropertyOrder_ASCENDING - -func (m *PropertyOrder) GetProperty() *PropertyReference { - if m != nil { - return m.Property - } - return nil -} - -func (m *PropertyOrder) GetDirection() PropertyOrder_Direction { - if m != nil && m.Direction != nil { - return *m.Direction - } - return Default_PropertyOrder_Direction -} - -// A holder for any type of filter. Exactly one field should be specified. -type Filter struct { - // A composite filter. - CompositeFilter *CompositeFilter `protobuf:"bytes,1,opt,name=composite_filter" json:"composite_filter,omitempty"` - // A filter on a property. - PropertyFilter *PropertyFilter `protobuf:"bytes,2,opt,name=property_filter" json:"property_filter,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Filter) Reset() { *m = Filter{} } -func (m *Filter) String() string { return proto.CompactTextString(m) } -func (*Filter) ProtoMessage() {} - -func (m *Filter) GetCompositeFilter() *CompositeFilter { - if m != nil { - return m.CompositeFilter - } - return nil -} - -func (m *Filter) GetPropertyFilter() *PropertyFilter { - if m != nil { - return m.PropertyFilter - } - return nil -} - -// A filter that merges the multiple other filters using the given operation. -type CompositeFilter struct { - // The operator for combining multiple filters. - Operator *CompositeFilter_Operator `protobuf:"varint,1,req,name=operator,enum=datastore.CompositeFilter_Operator" json:"operator,omitempty"` - // The list of filters to combine. - // Must contain at least one filter. - Filter []*Filter `protobuf:"bytes,2,rep,name=filter" json:"filter,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CompositeFilter) Reset() { *m = CompositeFilter{} } -func (m *CompositeFilter) String() string { return proto.CompactTextString(m) } -func (*CompositeFilter) ProtoMessage() {} - -func (m *CompositeFilter) GetOperator() CompositeFilter_Operator { - if m != nil && m.Operator != nil { - return *m.Operator - } - return CompositeFilter_AND -} - -func (m *CompositeFilter) GetFilter() []*Filter { - if m != nil { - return m.Filter - } - return nil -} - -// A filter on a specific property. -type PropertyFilter struct { - // The property to filter by. - Property *PropertyReference `protobuf:"bytes,1,req,name=property" json:"property,omitempty"` - // The operator to filter by. - Operator *PropertyFilter_Operator `protobuf:"varint,2,req,name=operator,enum=datastore.PropertyFilter_Operator" json:"operator,omitempty"` - // The value to compare the property to. - Value *Value `protobuf:"bytes,3,req,name=value" json:"value,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PropertyFilter) Reset() { *m = PropertyFilter{} } -func (m *PropertyFilter) String() string { return proto.CompactTextString(m) } -func (*PropertyFilter) ProtoMessage() {} - -func (m *PropertyFilter) GetProperty() *PropertyReference { - if m != nil { - return m.Property - } - return nil -} - -func (m *PropertyFilter) GetOperator() PropertyFilter_Operator { - if m != nil && m.Operator != nil { - return *m.Operator - } - return PropertyFilter_LESS_THAN -} - -func (m *PropertyFilter) GetValue() *Value { - if m != nil { - return m.Value - } - return nil -} - -// A GQL query. -type GqlQuery struct { - QueryString *string `protobuf:"bytes,1,req,name=query_string" json:"query_string,omitempty"` - // When false, the query string must not contain a literal. - AllowLiteral *bool `protobuf:"varint,2,opt,name=allow_literal,def=0" json:"allow_literal,omitempty"` - // A named argument must set field GqlQueryArg.name. - // No two named arguments may have the same name. - // For each non-reserved named binding site in the query string, - // there must be a named argument with that name, - // but not necessarily the inverse. - NameArg []*GqlQueryArg `protobuf:"bytes,3,rep,name=name_arg" json:"name_arg,omitempty"` - // Numbered binding site @1 references the first numbered argument, - // effectively using 1-based indexing, rather than the usual 0. - // A numbered argument must NOT set field GqlQueryArg.name. - // For each binding site numbered i in query_string, - // there must be an ith numbered argument. - // The inverse must also be true. - NumberArg []*GqlQueryArg `protobuf:"bytes,4,rep,name=number_arg" json:"number_arg,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GqlQuery) Reset() { *m = GqlQuery{} } -func (m *GqlQuery) String() string { return proto.CompactTextString(m) } -func (*GqlQuery) ProtoMessage() {} - -const Default_GqlQuery_AllowLiteral bool = false - -func (m *GqlQuery) GetQueryString() string { - if m != nil && m.QueryString != nil { - return *m.QueryString - } - return "" -} - -func (m *GqlQuery) GetAllowLiteral() bool { - if m != nil && m.AllowLiteral != nil { - return *m.AllowLiteral - } - return Default_GqlQuery_AllowLiteral -} - -func (m *GqlQuery) GetNameArg() []*GqlQueryArg { - if m != nil { - return m.NameArg - } - return nil -} - -func (m *GqlQuery) GetNumberArg() []*GqlQueryArg { - if m != nil { - return m.NumberArg - } - return nil -} - -// A binding argument for a GQL query. -// Exactly one of fields value and cursor must be set. -type GqlQueryArg struct { - // Must match regex "[A-Za-z_$][A-Za-z_$0-9]*". - // Must not match regex "__.*__". - // Must not be "". - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value *Value `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - Cursor []byte `protobuf:"bytes,3,opt,name=cursor" json:"cursor,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *GqlQueryArg) Reset() { *m = GqlQueryArg{} } -func (m *GqlQueryArg) String() string { return proto.CompactTextString(m) } -func (*GqlQueryArg) ProtoMessage() {} - -func (m *GqlQueryArg) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *GqlQueryArg) GetValue() *Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *GqlQueryArg) GetCursor() []byte { - if m != nil { - return m.Cursor - } - return nil -} - -// A batch of results produced by a query. -type QueryResultBatch struct { - // The result type for every entity in entityResults. - EntityResultType *EntityResult_ResultType `protobuf:"varint,1,req,name=entity_result_type,enum=datastore.EntityResult_ResultType" json:"entity_result_type,omitempty"` - // The results for this batch. - EntityResult []*EntityResult `protobuf:"bytes,2,rep,name=entity_result" json:"entity_result,omitempty"` - // A cursor that points to the position after the last result in the batch. - // May be absent. - EndCursor []byte `protobuf:"bytes,4,opt,name=end_cursor" json:"end_cursor,omitempty"` - // The state of the query after the current batch. - MoreResults *QueryResultBatch_MoreResultsType `protobuf:"varint,5,req,name=more_results,enum=datastore.QueryResultBatch_MoreResultsType" json:"more_results,omitempty"` - // The number of results skipped because of Query.offset. - SkippedResults *int32 `protobuf:"varint,6,opt,name=skipped_results" json:"skipped_results,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *QueryResultBatch) Reset() { *m = QueryResultBatch{} } -func (m *QueryResultBatch) String() string { return proto.CompactTextString(m) } -func (*QueryResultBatch) ProtoMessage() {} - -func (m *QueryResultBatch) GetEntityResultType() EntityResult_ResultType { - if m != nil && m.EntityResultType != nil { - return *m.EntityResultType - } - return EntityResult_FULL -} - -func (m *QueryResultBatch) GetEntityResult() []*EntityResult { - if m != nil { - return m.EntityResult - } - return nil -} - -func (m *QueryResultBatch) GetEndCursor() []byte { - if m != nil { - return m.EndCursor - } - return nil -} - -func (m *QueryResultBatch) GetMoreResults() QueryResultBatch_MoreResultsType { - if m != nil && m.MoreResults != nil { - return *m.MoreResults - } - return QueryResultBatch_NOT_FINISHED -} - -func (m *QueryResultBatch) GetSkippedResults() int32 { - if m != nil && m.SkippedResults != nil { - return *m.SkippedResults - } - return 0 -} - -// A set of changes to apply. -// -// No entity in this message may have a reserved property name, -// not even a property in an entity in a value. -// No value in this message may have meaning 18, -// not even a value in an entity in another value. -// -// If entities with duplicate keys are present, an arbitrary choice will -// be made as to which is written. -type Mutation struct { - // Entities to upsert. - // Each upserted entity's key must have a complete path and - // must not be reserved/read-only. - Upsert []*Entity `protobuf:"bytes,1,rep,name=upsert" json:"upsert,omitempty"` - // Entities to update. - // Each updated entity's key must have a complete path and - // must not be reserved/read-only. - Update []*Entity `protobuf:"bytes,2,rep,name=update" json:"update,omitempty"` - // Entities to insert. - // Each inserted entity's key must have a complete path and - // must not be reserved/read-only. - Insert []*Entity `protobuf:"bytes,3,rep,name=insert" json:"insert,omitempty"` - // Insert entities with a newly allocated ID. - // Each inserted entity's key must omit the final identifier in its path and - // must not be reserved/read-only. - InsertAutoId []*Entity `protobuf:"bytes,4,rep,name=insert_auto_id" json:"insert_auto_id,omitempty"` - // Keys of entities to delete. - // Each key must have a complete key path and must not be reserved/read-only. - Delete []*Key `protobuf:"bytes,5,rep,name=delete" json:"delete,omitempty"` - // Ignore a user specified read-only period. Optional. - Force *bool `protobuf:"varint,6,opt,name=force" json:"force,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Mutation) Reset() { *m = Mutation{} } -func (m *Mutation) String() string { return proto.CompactTextString(m) } -func (*Mutation) ProtoMessage() {} - -func (m *Mutation) GetUpsert() []*Entity { - if m != nil { - return m.Upsert - } - return nil -} - -func (m *Mutation) GetUpdate() []*Entity { - if m != nil { - return m.Update - } - return nil -} - -func (m *Mutation) GetInsert() []*Entity { - if m != nil { - return m.Insert - } - return nil -} - -func (m *Mutation) GetInsertAutoId() []*Entity { - if m != nil { - return m.InsertAutoId - } - return nil -} - -func (m *Mutation) GetDelete() []*Key { - if m != nil { - return m.Delete - } - return nil -} - -func (m *Mutation) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return false -} - -// The result of applying a mutation. -type MutationResult struct { - // Number of index writes. - IndexUpdates *int32 `protobuf:"varint,1,req,name=index_updates" json:"index_updates,omitempty"` - // Keys for insertAutoId entities. One per entity from the - // request, in the same order. - InsertAutoIdKey []*Key `protobuf:"bytes,2,rep,name=insert_auto_id_key" json:"insert_auto_id_key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *MutationResult) Reset() { *m = MutationResult{} } -func (m *MutationResult) String() string { return proto.CompactTextString(m) } -func (*MutationResult) ProtoMessage() {} - -func (m *MutationResult) GetIndexUpdates() int32 { - if m != nil && m.IndexUpdates != nil { - return *m.IndexUpdates - } - return 0 -} - -func (m *MutationResult) GetInsertAutoIdKey() []*Key { - if m != nil { - return m.InsertAutoIdKey - } - return nil -} - -// Options shared by read requests. -type ReadOptions struct { - // The read consistency to use. - // Cannot be set when transaction is set. - // Lookup and ancestor queries default to STRONG, global queries default to - // EVENTUAL and cannot be set to STRONG. - ReadConsistency *ReadOptions_ReadConsistency `protobuf:"varint,1,opt,name=read_consistency,enum=datastore.ReadOptions_ReadConsistency,def=0" json:"read_consistency,omitempty"` - // The transaction to use. Optional. - Transaction []byte `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *ReadOptions) Reset() { *m = ReadOptions{} } -func (m *ReadOptions) String() string { return proto.CompactTextString(m) } -func (*ReadOptions) ProtoMessage() {} - -const Default_ReadOptions_ReadConsistency ReadOptions_ReadConsistency = ReadOptions_DEFAULT - -func (m *ReadOptions) GetReadConsistency() ReadOptions_ReadConsistency { - if m != nil && m.ReadConsistency != nil { - return *m.ReadConsistency - } - return Default_ReadOptions_ReadConsistency -} - -func (m *ReadOptions) GetTransaction() []byte { - if m != nil { - return m.Transaction - } - return nil -} - -// The request for Lookup. -type LookupRequest struct { - // Options for this lookup request. Optional. - ReadOptions *ReadOptions `protobuf:"bytes,1,opt,name=read_options" json:"read_options,omitempty"` - // Keys of entities to look up from the datastore. - Key []*Key `protobuf:"bytes,3,rep,name=key" json:"key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *LookupRequest) Reset() { *m = LookupRequest{} } -func (m *LookupRequest) String() string { return proto.CompactTextString(m) } -func (*LookupRequest) ProtoMessage() {} - -func (m *LookupRequest) GetReadOptions() *ReadOptions { - if m != nil { - return m.ReadOptions - } - return nil -} - -func (m *LookupRequest) GetKey() []*Key { - if m != nil { - return m.Key - } - return nil -} - -// The response for Lookup. -type LookupResponse struct { - // Entities found as ResultType.FULL entities. - Found []*EntityResult `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` - // Entities not found as ResultType.KEY_ONLY entities. - Missing []*EntityResult `protobuf:"bytes,2,rep,name=missing" json:"missing,omitempty"` - // A list of keys that were not looked up due to resource constraints. - Deferred []*Key `protobuf:"bytes,3,rep,name=deferred" json:"deferred,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *LookupResponse) Reset() { *m = LookupResponse{} } -func (m *LookupResponse) String() string { return proto.CompactTextString(m) } -func (*LookupResponse) ProtoMessage() {} - -func (m *LookupResponse) GetFound() []*EntityResult { - if m != nil { - return m.Found - } - return nil -} - -func (m *LookupResponse) GetMissing() []*EntityResult { - if m != nil { - return m.Missing - } - return nil -} - -func (m *LookupResponse) GetDeferred() []*Key { - if m != nil { - return m.Deferred - } - return nil -} - -// The request for RunQuery. -type RunQueryRequest struct { - // The options for this query. - ReadOptions *ReadOptions `protobuf:"bytes,1,opt,name=read_options" json:"read_options,omitempty"` - // Entities are partitioned into subsets, identified by a dataset (usually - // implicitly specified by the project) and namespace ID. Queries are scoped - // to a single partition. - // This partition ID is normalized with the standard default context - // partition ID, but all other partition IDs in RunQueryRequest are - // normalized with this partition ID as the context partition ID. - PartitionId *PartitionId `protobuf:"bytes,2,opt,name=partition_id" json:"partition_id,omitempty"` - // The query to run. - // Either this field or field gql_query must be set, but not both. - Query *Query `protobuf:"bytes,3,opt,name=query" json:"query,omitempty"` - // The GQL query to run. - // Either this field or field query must be set, but not both. - GqlQuery *GqlQuery `protobuf:"bytes,7,opt,name=gql_query" json:"gql_query,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RunQueryRequest) Reset() { *m = RunQueryRequest{} } -func (m *RunQueryRequest) String() string { return proto.CompactTextString(m) } -func (*RunQueryRequest) ProtoMessage() {} - -func (m *RunQueryRequest) GetReadOptions() *ReadOptions { - if m != nil { - return m.ReadOptions - } - return nil -} - -func (m *RunQueryRequest) GetPartitionId() *PartitionId { - if m != nil { - return m.PartitionId - } - return nil -} - -func (m *RunQueryRequest) GetQuery() *Query { - if m != nil { - return m.Query - } - return nil -} - -func (m *RunQueryRequest) GetGqlQuery() *GqlQuery { - if m != nil { - return m.GqlQuery - } - return nil -} - -// The response for RunQuery. -type RunQueryResponse struct { - // A batch of query results (always present). - Batch *QueryResultBatch `protobuf:"bytes,1,opt,name=batch" json:"batch,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RunQueryResponse) Reset() { *m = RunQueryResponse{} } -func (m *RunQueryResponse) String() string { return proto.CompactTextString(m) } -func (*RunQueryResponse) ProtoMessage() {} - -func (m *RunQueryResponse) GetBatch() *QueryResultBatch { - if m != nil { - return m.Batch - } - return nil -} - -// The request for BeginTransaction. -type BeginTransactionRequest struct { - // The transaction isolation level. - IsolationLevel *BeginTransactionRequest_IsolationLevel `protobuf:"varint,1,opt,name=isolation_level,enum=datastore.BeginTransactionRequest_IsolationLevel,def=0" json:"isolation_level,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest{} } -func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } -func (*BeginTransactionRequest) ProtoMessage() {} - -const Default_BeginTransactionRequest_IsolationLevel BeginTransactionRequest_IsolationLevel = BeginTransactionRequest_SNAPSHOT - -func (m *BeginTransactionRequest) GetIsolationLevel() BeginTransactionRequest_IsolationLevel { - if m != nil && m.IsolationLevel != nil { - return *m.IsolationLevel - } - return Default_BeginTransactionRequest_IsolationLevel -} - -// The response for BeginTransaction. -type BeginTransactionResponse struct { - // The transaction identifier (always present). - Transaction []byte `protobuf:"bytes,1,opt,name=transaction" json:"transaction,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *BeginTransactionResponse) Reset() { *m = BeginTransactionResponse{} } -func (m *BeginTransactionResponse) String() string { return proto.CompactTextString(m) } -func (*BeginTransactionResponse) ProtoMessage() {} - -func (m *BeginTransactionResponse) GetTransaction() []byte { - if m != nil { - return m.Transaction - } - return nil -} - -// The request for Rollback. -type RollbackRequest struct { - // The transaction identifier, returned by a call to - // beginTransaction. - Transaction []byte `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *RollbackRequest) Reset() { *m = RollbackRequest{} } -func (m *RollbackRequest) String() string { return proto.CompactTextString(m) } -func (*RollbackRequest) ProtoMessage() {} - -func (m *RollbackRequest) GetTransaction() []byte { - if m != nil { - return m.Transaction - } - return nil -} - -// The response for Rollback. -type RollbackResponse struct { - XXX_unrecognized []byte `json:"-"` -} - -func (m *RollbackResponse) Reset() { *m = RollbackResponse{} } -func (m *RollbackResponse) String() string { return proto.CompactTextString(m) } -func (*RollbackResponse) ProtoMessage() {} - -// The request for Commit. -type CommitRequest struct { - // The transaction identifier, returned by a call to - // beginTransaction. Must be set when mode is TRANSACTIONAL. - Transaction []byte `protobuf:"bytes,1,opt,name=transaction" json:"transaction,omitempty"` - // The mutation to perform. Optional. - Mutation *Mutation `protobuf:"bytes,2,opt,name=mutation" json:"mutation,omitempty"` - // The type of commit to perform. Either TRANSACTIONAL or NON_TRANSACTIONAL. - Mode *CommitRequest_Mode `protobuf:"varint,5,opt,name=mode,enum=datastore.CommitRequest_Mode,def=1" json:"mode,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CommitRequest) Reset() { *m = CommitRequest{} } -func (m *CommitRequest) String() string { return proto.CompactTextString(m) } -func (*CommitRequest) ProtoMessage() {} - -const Default_CommitRequest_Mode CommitRequest_Mode = CommitRequest_TRANSACTIONAL - -func (m *CommitRequest) GetTransaction() []byte { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *CommitRequest) GetMutation() *Mutation { - if m != nil { - return m.Mutation - } - return nil -} - -func (m *CommitRequest) GetMode() CommitRequest_Mode { - if m != nil && m.Mode != nil { - return *m.Mode - } - return Default_CommitRequest_Mode -} - -// The response for Commit. -type CommitResponse struct { - // The result of performing the mutation (if any). - MutationResult *MutationResult `protobuf:"bytes,1,opt,name=mutation_result" json:"mutation_result,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *CommitResponse) Reset() { *m = CommitResponse{} } -func (m *CommitResponse) String() string { return proto.CompactTextString(m) } -func (*CommitResponse) ProtoMessage() {} - -func (m *CommitResponse) GetMutationResult() *MutationResult { - if m != nil { - return m.MutationResult - } - return nil -} - -// The request for AllocateIds. -type AllocateIdsRequest struct { - // A list of keys with incomplete key paths to allocate IDs for. - // No key may be reserved/read-only. - Key []*Key `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *AllocateIdsRequest) Reset() { *m = AllocateIdsRequest{} } -func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsRequest) ProtoMessage() {} - -func (m *AllocateIdsRequest) GetKey() []*Key { - if m != nil { - return m.Key - } - return nil -} - -// The response for AllocateIds. -type AllocateIdsResponse struct { - // The keys specified in the request (in the same order), each with - // its key path completed with a newly allocated ID. - Key []*Key `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *AllocateIdsResponse) Reset() { *m = AllocateIdsResponse{} } -func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsResponse) ProtoMessage() {} - -func (m *AllocateIdsResponse) GetKey() []*Key { - if m != nil { - return m.Key - } - return nil -} - -func init() { - proto.RegisterEnum("datastore.EntityResult_ResultType", EntityResult_ResultType_name, EntityResult_ResultType_value) - proto.RegisterEnum("datastore.PropertyExpression_AggregationFunction", PropertyExpression_AggregationFunction_name, PropertyExpression_AggregationFunction_value) - proto.RegisterEnum("datastore.PropertyOrder_Direction", PropertyOrder_Direction_name, PropertyOrder_Direction_value) - proto.RegisterEnum("datastore.CompositeFilter_Operator", CompositeFilter_Operator_name, CompositeFilter_Operator_value) - proto.RegisterEnum("datastore.PropertyFilter_Operator", PropertyFilter_Operator_name, PropertyFilter_Operator_value) - proto.RegisterEnum("datastore.QueryResultBatch_MoreResultsType", QueryResultBatch_MoreResultsType_name, QueryResultBatch_MoreResultsType_value) - proto.RegisterEnum("datastore.ReadOptions_ReadConsistency", ReadOptions_ReadConsistency_name, ReadOptions_ReadConsistency_value) - proto.RegisterEnum("datastore.BeginTransactionRequest_IsolationLevel", BeginTransactionRequest_IsolationLevel_name, BeginTransactionRequest_IsolationLevel_value) - proto.RegisterEnum("datastore.CommitRequest_Mode", CommitRequest_Mode_name, CommitRequest_Mode_value) -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.proto b/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.proto deleted file mode 100644 index d752beaa5..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/datastore/datastore_v1.proto +++ /dev/null @@ -1,606 +0,0 @@ -// Copyright 2013 Google Inc. All Rights Reserved. -// -// 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. -// -// The datastore v1 service proto definitions - -syntax = "proto2"; - -package datastore; -option java_package = "com.google.api.services.datastore"; - - -// An identifier for a particular subset of entities. -// -// Entities are partitioned into various subsets, each used by different -// datasets and different namespaces within a dataset and so forth. -// -// All input partition IDs are normalized before use. -// A partition ID is normalized as follows: -// If the partition ID is unset or is set to an empty partition ID, replace it -// with the context partition ID. -// Otherwise, if the partition ID has no dataset ID, assign it the context -// partition ID's dataset ID. -// Unless otherwise documented, the context partition ID has the dataset ID set -// to the context dataset ID and no other partition dimension set. -// -// A partition ID is empty if all of its fields are unset. -// -// Partition dimension: -// A dimension may be unset. -// A dimension's value must never be "". -// A dimension's value must match [A-Za-z\d\.\-_]{1,100} -// If the value of any dimension matches regex "__.*__", -// the partition is reserved/read-only. -// A reserved/read-only partition ID is forbidden in certain documented contexts. -// -// Dataset ID: -// A dataset id's value must never be "". -// A dataset id's value must match -// ([a-z\d\-]{1,100}~)?([a-z\d][a-z\d\-\.]{0,99}:)?([a-z\d][a-z\d\-]{0,99} -message PartitionId { - // The dataset ID. - optional string dataset_id = 3; - // The namespace. - optional string namespace = 4; -} - -// A unique identifier for an entity. -// If a key's partition id or any of its path kinds or names are -// reserved/read-only, the key is reserved/read-only. -// A reserved/read-only key is forbidden in certain documented contexts. -message Key { - // Entities are partitioned into subsets, currently identified by a dataset - // (usually implicitly specified by the project) and namespace ID. - // Queries are scoped to a single partition. - optional PartitionId partition_id = 1; - - // A (kind, ID/name) pair used to construct a key path. - // - // At most one of name or ID may be set. - // If either is set, the element is complete. - // If neither is set, the element is incomplete. - message PathElement { - // The kind of the entity. - // A kind matching regex "__.*__" is reserved/read-only. - // A kind must not contain more than 500 characters. - // Cannot be "". - required string kind = 1; - // The ID of the entity. - // Never equal to zero. Values less than zero are discouraged and will not - // be supported in the future. - optional int64 id = 2; - // The name of the entity. - // A name matching regex "__.*__" is reserved/read-only. - // A name must not be more than 500 characters. - // Cannot be "". - optional string name = 3; - } - - // The entity path. - // An entity path consists of one or more elements composed of a kind and a - // string or numerical identifier, which identify entities. The first - // element identifies a root entity, the second element identifies - // a child of the root entity, the third element a child of the - // second entity, and so forth. The entities identified by all prefixes of - // the path are called the element's ancestors. - // An entity path is always fully complete: ALL of the entity's ancestors - // are required to be in the path along with the entity identifier itself. - // The only exception is that in some documented cases, the identifier in the - // last path element (for the entity) itself may be omitted. A path can never - // be empty. - repeated PathElement path_element = 2; -} - -// A message that can hold any of the supported value types and associated -// metadata. -// -// At most one of the Value fields may be set. -// If none are set the value is "null". -// -message Value { - // A boolean value. - optional bool boolean_value = 1; - // An integer value. - optional int64 integer_value = 2; - // A double value. - optional double double_value = 3; - // A timestamp value. - optional int64 timestamp_microseconds_value = 4; - // A key value. - optional Key key_value = 5; - // A blob key value. - optional string blob_key_value = 16; - // A UTF-8 encoded string value. - optional string string_value = 17; - // A blob value. - optional bytes blob_value = 18; - // An entity value. - // May have no key. - // May have a key with an incomplete key path. - // May have a reserved/read-only key. - optional Entity entity_value = 6; - // A list value. - // Cannot contain another list value. - // Cannot also have a meaning and indexing set. - repeated Value list_value = 7; - - // The meaning field is reserved and should not be used. - optional int32 meaning = 14; - - // If the value should be indexed. - // - // The indexed property may be set for a - // null value. - // When indexed is true, stringValue - // is limited to 500 characters and the blob value is limited to 500 bytes. - // Exception: If meaning is set to 2, string_value is limited to 2038 - // characters regardless of indexed. - // When indexed is true, meaning 15 and 22 are not allowed, and meaning 16 - // will be ignored on input (and will never be set on output). - // Input values by default have indexed set to - // true; however, you can explicitly set indexed to - // true if you want. (An output value never has - // indexed explicitly set to true.) If a value is - // itself an entity, it cannot have indexed set to - // true. - // Exception: An entity value with meaning 9, 20 or 21 may be indexed. - optional bool indexed = 15 [default = true]; -} - -// An entity property. -message Property { - // The name of the property. - // A property name matching regex "__.*__" is reserved. - // A reserved property name is forbidden in certain documented contexts. - // The name must not contain more than 500 characters. - // Cannot be "". - required string name = 1; - - // The value(s) of the property. - // Each value can have only one value property populated. For example, - // you cannot have a values list of { value: { integerValue: 22, - // stringValue: "a" } }, but you can have { value: { listValue: - // [ { integerValue: 22 }, { stringValue: "a" } ] }. - required Value value = 4; -} - -// An entity. -// -// An entity is limited to 1 megabyte when stored. That roughly -// corresponds to a limit of 1 megabyte for the serialized form of this -// message. -message Entity { - // The entity's key. - // - // An entity must have a key, unless otherwise documented (for example, - // an entity in Value.entityValue may have no key). - // An entity's kind is its key's path's last element's kind, - // or null if it has no key. - optional Key key = 1; - // The entity's properties. - // Each property's name must be unique for its entity. - repeated Property property = 2; -} - -// The result of fetching an entity from the datastore. -message EntityResult { - // Specifies what data the 'entity' field contains. - // A ResultType is either implied (for example, in LookupResponse.found it - // is always FULL) or specified by context (for example, in message - // QueryResultBatch, field 'entity_result_type' specifies a ResultType - // for all the values in field 'entity_result'). - enum ResultType { - FULL = 1; // The entire entity. - PROJECTION = 2; // A projected subset of properties. - // The entity may have no key. - // A property value may have meaning 18. - KEY_ONLY = 3; // Only the key. - } - - // The resulting entity. - required Entity entity = 1; -} - -// A query. -message Query { - // The projection to return. If not set the entire entity is returned. - repeated PropertyExpression projection = 2; - - // The kinds to query (if empty, returns entities from all kinds). - repeated KindExpression kind = 3; - - // The filter to apply (optional). - optional Filter filter = 4; - - // The order to apply to the query results (if empty, order is unspecified). - repeated PropertyOrder order = 5; - - // The properties to group by (if empty, no grouping is applied to the - // result set). - repeated PropertyReference group_by = 6; - - // A starting point for the query results. Optional. Query cursors are - // returned in query result batches. - optional bytes /* serialized QueryCursor */ start_cursor = 7; - - // An ending point for the query results. Optional. Query cursors are - // returned in query result batches. - optional bytes /* serialized QueryCursor */ end_cursor = 8; - - // The number of results to skip. Applies before limit, but after all other - // constraints (optional, defaults to 0). - optional int32 offset = 10 [default=0]; - - // The maximum number of results to return. Applies after all other - // constraints. Optional. - optional int32 limit = 11; -} - -// A representation of a kind. -message KindExpression { - // The name of the kind. - required string name = 1; -} - -// A reference to a property relative to the kind expressions. -// exactly. -message PropertyReference { - // The name of the property. - required string name = 2; -} - -// A representation of a property in a projection. -message PropertyExpression { - enum AggregationFunction { - FIRST = 1; - } - // The property to project. - required PropertyReference property = 1; - // The aggregation function to apply to the property. Optional. - // Can only be used when grouping by at least one property. Must - // then be set on all properties in the projection that are not - // being grouped by. - optional AggregationFunction aggregation_function = 2; -} - -// The desired order for a specific property. -message PropertyOrder { - enum Direction { - ASCENDING = 1; - DESCENDING = 2; - } - // The property to order by. - required PropertyReference property = 1; - // The direction to order by. - optional Direction direction = 2 [default=ASCENDING]; -} - -// A holder for any type of filter. Exactly one field should be specified. -message Filter { - // A composite filter. - optional CompositeFilter composite_filter = 1; - // A filter on a property. - optional PropertyFilter property_filter = 2; -} - -// A filter that merges the multiple other filters using the given operation. -message CompositeFilter { - enum Operator { - AND = 1; - } - - // The operator for combining multiple filters. - required Operator operator = 1; - // The list of filters to combine. - // Must contain at least one filter. - repeated Filter filter = 2; -} - -// A filter on a specific property. -message PropertyFilter { - enum Operator { - LESS_THAN = 1; - LESS_THAN_OR_EQUAL = 2; - GREATER_THAN = 3; - GREATER_THAN_OR_EQUAL = 4; - EQUAL = 5; - - HAS_ANCESTOR = 11; - } - - // The property to filter by. - required PropertyReference property = 1; - // The operator to filter by. - required Operator operator = 2; - // The value to compare the property to. - required Value value = 3; -} - -// A GQL query. -message GqlQuery { - required string query_string = 1; - // When false, the query string must not contain a literal. - optional bool allow_literal = 2 [default = false]; - // A named argument must set field GqlQueryArg.name. - // No two named arguments may have the same name. - // For each non-reserved named binding site in the query string, - // there must be a named argument with that name, - // but not necessarily the inverse. - repeated GqlQueryArg name_arg = 3; - // Numbered binding site @1 references the first numbered argument, - // effectively using 1-based indexing, rather than the usual 0. - // A numbered argument must NOT set field GqlQueryArg.name. - // For each binding site numbered i in query_string, - // there must be an ith numbered argument. - // The inverse must also be true. - repeated GqlQueryArg number_arg = 4; -} - -// A binding argument for a GQL query. -// Exactly one of fields value and cursor must be set. -message GqlQueryArg { - // Must match regex "[A-Za-z_$][A-Za-z_$0-9]*". - // Must not match regex "__.*__". - // Must not be "". - optional string name = 1; - optional Value value = 2; - optional bytes cursor = 3; -} - -// A batch of results produced by a query. -message QueryResultBatch { - // The possible values for the 'more_results' field. - enum MoreResultsType { - NOT_FINISHED = 1; // There are additional batches to fetch from this query. - MORE_RESULTS_AFTER_LIMIT = 2; // The query is finished, but there are more - // results after the limit. - NO_MORE_RESULTS = 3; // The query has been exhausted. - } - - // The result type for every entity in entityResults. - required EntityResult.ResultType entity_result_type = 1; - // The results for this batch. - repeated EntityResult entity_result = 2; - - // A cursor that points to the position after the last result in the batch. - // May be absent. - optional bytes /* serialized QueryCursor */ end_cursor = 4; - - // The state of the query after the current batch. - required MoreResultsType more_results = 5; - - // The number of results skipped because of Query.offset. - optional int32 skipped_results = 6; -} - -// A set of changes to apply. -// -// No entity in this message may have a reserved property name, -// not even a property in an entity in a value. -// No value in this message may have meaning 18, -// not even a value in an entity in another value. -// -// If entities with duplicate keys are present, an arbitrary choice will -// be made as to which is written. -message Mutation { - // Entities to upsert. - // Each upserted entity's key must have a complete path and - // must not be reserved/read-only. - repeated Entity upsert = 1; - // Entities to update. - // Each updated entity's key must have a complete path and - // must not be reserved/read-only. - repeated Entity update = 2; - // Entities to insert. - // Each inserted entity's key must have a complete path and - // must not be reserved/read-only. - repeated Entity insert = 3; - // Insert entities with a newly allocated ID. - // Each inserted entity's key must omit the final identifier in its path and - // must not be reserved/read-only. - repeated Entity insert_auto_id = 4; - // Keys of entities to delete. - // Each key must have a complete key path and must not be reserved/read-only. - repeated Key delete = 5; - // Ignore a user specified read-only period. Optional. - optional bool force = 6; -} - -// The result of applying a mutation. -message MutationResult { - // Number of index writes. - required int32 index_updates = 1; - // Keys for insertAutoId entities. One per entity from the - // request, in the same order. - repeated Key insert_auto_id_key = 2; -} - -// Options shared by read requests. -message ReadOptions { - enum ReadConsistency { - DEFAULT = 0; - STRONG = 1; - EVENTUAL = 2; - } - - // The read consistency to use. - // Cannot be set when transaction is set. - // Lookup and ancestor queries default to STRONG, global queries default to - // EVENTUAL and cannot be set to STRONG. - optional ReadConsistency read_consistency = 1 [default=DEFAULT]; - - // The transaction to use. Optional. - optional bytes /* serialized Transaction */ transaction = 2; -} - -// The request for Lookup. -message LookupRequest { - - // Options for this lookup request. Optional. - optional ReadOptions read_options = 1; - // Keys of entities to look up from the datastore. - repeated Key key = 3; -} - -// The response for Lookup. -message LookupResponse { - - // The order of results in these fields is undefined and has no relation to - // the order of the keys in the input. - - // Entities found as ResultType.FULL entities. - repeated EntityResult found = 1; - - // Entities not found as ResultType.KEY_ONLY entities. - repeated EntityResult missing = 2; - - // A list of keys that were not looked up due to resource constraints. - repeated Key deferred = 3; -} - - -// The request for RunQuery. -message RunQueryRequest { - - // The options for this query. - optional ReadOptions read_options = 1; - - // Entities are partitioned into subsets, identified by a dataset (usually - // implicitly specified by the project) and namespace ID. Queries are scoped - // to a single partition. - // This partition ID is normalized with the standard default context - // partition ID, but all other partition IDs in RunQueryRequest are - // normalized with this partition ID as the context partition ID. - optional PartitionId partition_id = 2; - - // The query to run. - // Either this field or field gql_query must be set, but not both. - optional Query query = 3; - // The GQL query to run. - // Either this field or field query must be set, but not both. - optional GqlQuery gql_query = 7; -} - -// The response for RunQuery. -message RunQueryResponse { - - // A batch of query results (always present). - optional QueryResultBatch batch = 1; - -} - -// The request for BeginTransaction. -message BeginTransactionRequest { - - enum IsolationLevel { - SNAPSHOT = 0; // Read from a consistent snapshot. Concurrent transactions - // conflict if their mutations conflict. For example: - // Read(A),Write(B) may not conflict with Read(B),Write(A), - // but Read(B),Write(B) does conflict with Read(B),Write(B). - SERIALIZABLE = 1; // Read from a consistent snapshot. Concurrent - // transactions conflict if they cannot be serialized. - // For example Read(A),Write(B) does conflict with - // Read(B),Write(A) but Read(A) may not conflict with - // Write(A). - } - - // The transaction isolation level. - optional IsolationLevel isolation_level = 1 [default=SNAPSHOT]; -} - -// The response for BeginTransaction. -message BeginTransactionResponse { - - // The transaction identifier (always present). - optional bytes /* serialized Transaction */ transaction = 1; -} - -// The request for Rollback. -message RollbackRequest { - - // The transaction identifier, returned by a call to - // beginTransaction. - required bytes /* serialized Transaction */ transaction = 1; -} - -// The response for Rollback. -message RollbackResponse { -// Empty -} - -// The request for Commit. -message CommitRequest { - - enum Mode { - TRANSACTIONAL = 1; - NON_TRANSACTIONAL = 2; - } - - // The transaction identifier, returned by a call to - // beginTransaction. Must be set when mode is TRANSACTIONAL. - optional bytes /* serialized Transaction */ transaction = 1; - // The mutation to perform. Optional. - optional Mutation mutation = 2; - // The type of commit to perform. Either TRANSACTIONAL or NON_TRANSACTIONAL. - optional Mode mode = 5 [default=TRANSACTIONAL]; -} - -// The response for Commit. -message CommitResponse { - - // The result of performing the mutation (if any). - optional MutationResult mutation_result = 1; -} - -// The request for AllocateIds. -message AllocateIdsRequest { - - // A list of keys with incomplete key paths to allocate IDs for. - // No key may be reserved/read-only. - repeated Key key = 1; -} - -// The response for AllocateIds. -message AllocateIdsResponse { - - // The keys specified in the request (in the same order), each with - // its key path completed with a newly allocated ID. - repeated Key key = 1; -} - -// Each rpc normalizes the partition IDs of the keys in its input entities, -// and always returns entities with keys with normalized partition IDs. -// (Note that applies to all entities, including entities in values.) -service DatastoreService { - // Look up some entities by key. - rpc Lookup(LookupRequest) returns (LookupResponse) { - }; - // Query for entities. - rpc RunQuery(RunQueryRequest) returns (RunQueryResponse) { - }; - // Begin a new transaction. - rpc BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) { - }; - // Commit a transaction, optionally creating, deleting or modifying some - // entities. - rpc Commit(CommitRequest) returns (CommitResponse) { - }; - // Roll back a transaction. - rpc Rollback(RollbackRequest) returns (RollbackResponse) { - }; - // Allocate IDs for incomplete keys (useful for referencing an entity before - // it is inserted). - rpc AllocateIds(AllocateIdsRequest) returns (AllocateIdsResponse) { - }; -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/opts/option.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/opts/option.go deleted file mode 100644 index 844d31044..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/opts/option.go +++ /dev/null @@ -1,25 +0,0 @@ -// Package opts holds the DialOpts struct, configurable by -// cloud.ClientOptions to set up transports for cloud packages. -// -// This is a separate page to prevent cycles between the core -// cloud packages. -package opts - -import ( - "net/http" - - "golang.org/x/oauth2" - "google.golang.org/grpc" -) - -type DialOpt struct { - Endpoint string - Scopes []string - UserAgent string - - TokenSource oauth2.TokenSource - - HTTPClient *http.Client - GRPCClient *grpc.ClientConn - GRPCDialOpts []grpc.DialOption -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/testutil/context.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/testutil/context.go deleted file mode 100644 index 34e605898..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/testutil/context.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 testutil contains helper functions for writing tests. -package testutil - -import ( - "io/ioutil" - "log" - "os" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" -) - -const ( - envProjID = "GCLOUD_TESTS_GOLANG_PROJECT_ID" - envPrivateKey = "GCLOUD_TESTS_GOLANG_KEY" -) - -// ProjID returns the project ID to use in integration tests, or the empty -// string if none is configured. -func ProjID() string { - projID := os.Getenv(envProjID) - if projID == "" { - return "" - } - return projID -} - -// TokenSource returns the OAuth2 token source to use in integration tests, -// or nil if none is configured. TokenSource will log.Fatal if the token -// source is specified but missing or invalid. -func TokenSource(ctx context.Context, scopes ...string) oauth2.TokenSource { - key := os.Getenv(envPrivateKey) - if key == "" { - return nil - } - jsonKey, err := ioutil.ReadFile(key) - if err != nil { - log.Fatalf("Cannot read the JSON key file, err: %v", err) - } - conf, err := google.JWTConfigFromJSON(jsonKey, scopes...) - if err != nil { - log.Fatalf("google.JWTConfigFromJSON: %v", err) - } - return conf.TokenSource(ctx) -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq.go deleted file mode 100644 index ddae71cce..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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.5 - -package transport - -import "net/http" - -// makeReqCancel returns a closure that cancels the given http.Request -// when called. -func makeReqCancel(req *http.Request) func(http.RoundTripper) { - c := make(chan struct{}) - req.Cancel = c - return func(http.RoundTripper) { - close(c) - } -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq_legacy.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq_legacy.go deleted file mode 100644 index c11a4ddeb..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/cancelreq_legacy.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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.5 - -package transport - -import "net/http" - -// makeReqCancel returns a closure that cancels the given http.Request -// when called. -func makeReqCancel(req *http.Request) func(http.RoundTripper) { - // Go 1.4 and prior do not have a reliable way of cancelling a request. - // Transport.CancelRequest will only work if the request is already in-flight. - return func(r http.RoundTripper) { - if t, ok := r.(*http.Transport); ok { - t.CancelRequest(req) - } - } -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/dial.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/dial.go deleted file mode 100644 index ae2baf9fd..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/dial.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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 ( - "errors" - "fmt" - "net/http" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "google.golang.org/cloud" - "google.golang.org/cloud/internal/opts" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/oauth" -) - -// ErrHTTP is returned when on a non-200 HTTP response. -type ErrHTTP struct { - StatusCode int - Body []byte - err error -} - -func (e *ErrHTTP) Error() string { - if e.err == nil { - return fmt.Sprintf("error during call, http status code: %v %s", e.StatusCode, e.Body) - } - return e.err.Error() -} - -// 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, opt ...cloud.ClientOption) (*http.Client, string, error) { - var o opts.DialOpt - for _, opt := range opt { - opt.Resolve(&o) - } - if o.GRPCClient != nil { - return nil, "", errors.New("unsupported GRPC base transport specified") - } - // TODO(djd): Wrap all http.Clients with appropriate internal version to add - // UserAgent header and prepend correct endpoint. - if o.HTTPClient != nil { - return o.HTTPClient, o.Endpoint, nil - } - if o.TokenSource == nil { - var err error - o.TokenSource, err = google.DefaultTokenSource(ctx, o.Scopes...) - if err != nil { - return nil, "", fmt.Errorf("google.DefaultTokenSource: %v", err) - } - } - return oauth2.NewClient(ctx, o.TokenSource), o.Endpoint, nil -} - -// NewProtoClient returns a ProtoClient for communicating with a Google cloud service, -// configured with the given ClientOptions. -func NewProtoClient(ctx context.Context, opt ...cloud.ClientOption) (*ProtoClient, error) { - var o opts.DialOpt - for _, opt := range opt { - opt.Resolve(&o) - } - if o.GRPCClient != nil { - return nil, errors.New("unsupported GRPC base transport specified") - } - var client *http.Client - switch { - case o.HTTPClient != nil: - if o.TokenSource != nil { - return nil, errors.New("at most one of WithTokenSource or WithBaseHTTP may be provided") - } - client = o.HTTPClient - case o.TokenSource != nil: - client = oauth2.NewClient(ctx, o.TokenSource) - default: - var err error - client, err = google.DefaultClient(ctx, o.Scopes...) - if err != nil { - return nil, err - } - } - - return &ProtoClient{ - client: client, - endpoint: o.Endpoint, - userAgent: o.UserAgent, - }, nil -} - -// DialGRPC returns a GRPC connection for use communicating with a Google cloud -// service, configured with the given ClientOptions. -func DialGRPC(ctx context.Context, opt ...cloud.ClientOption) (*grpc.ClientConn, error) { - var o opts.DialOpt - for _, opt := range opt { - opt.Resolve(&o) - } - if o.HTTPClient != nil { - return nil, errors.New("unsupported HTTP base transport specified") - } - if o.GRPCClient != nil { - return o.GRPCClient, nil - } - if o.TokenSource == nil { - var err error - o.TokenSource, err = google.DefaultTokenSource(ctx, o.Scopes...) - if err != nil { - return nil, fmt.Errorf("google.DefaultTokenSource: %v", err) - } - } - grpcOpts := []grpc.DialOption{ - grpc.WithPerRPCCredentials(oauth.TokenSource{o.TokenSource}), - grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), - } - grpcOpts = append(grpcOpts, o.GRPCDialOpts...) - if o.UserAgent != "" { - grpcOpts = append(grpcOpts, grpc.WithUserAgent(o.UserAgent)) - } - return grpc.Dial(o.Endpoint, grpcOpts...) -} diff --git a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/proto.go b/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/proto.go deleted file mode 100644 index 05b11cde1..000000000 --- a/Godeps/_workspace/src/google.golang.org/cloud/internal/transport/proto.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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 ( - "bytes" - "io/ioutil" - "net/http" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/context" -) - -type ProtoClient struct { - client *http.Client - endpoint string - userAgent string -} - -func (c *ProtoClient) Call(ctx context.Context, method string, req, resp proto.Message) error { - payload, err := proto.Marshal(req) - if err != nil { - return err - } - - httpReq, err := http.NewRequest("POST", c.endpoint+method, bytes.NewReader(payload)) - if err != nil { - return err - } - httpReq.Header.Set("Content-Type", "application/x-protobuf") - if ua := c.userAgent; ua != "" { - httpReq.Header.Set("User-Agent", ua) - } - - errc := make(chan error, 1) - cancel := makeReqCancel(httpReq) - - go func() { - r, err := c.client.Do(httpReq) - if err != nil { - errc <- err - return - } - defer r.Body.Close() - - body, err := ioutil.ReadAll(r.Body) - if r.StatusCode != http.StatusOK { - err = &ErrHTTP{ - StatusCode: r.StatusCode, - Body: body, - err: err, - } - } - if err != nil { - errc <- err - return - } - errc <- proto.Unmarshal(body, resp) - }() - - select { - case <-ctx.Done(): - cancel(c.client.Transport) // Cancel the HTTP request. - return ctx.Err() - case err := <-errc: - return err - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/example_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/example_test.go deleted file mode 100644 index 6fda72acd..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/example_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package gcfg_test - -import ( - "fmt" - "log" -) - -import "gopkg.in/gcfg.v1" - -func ExampleReadStringInto() { - cfgStr := `; Comment line -[section] -name=value # comment` - cfg := struct { - Section struct { - Name string - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.Section.Name) - // Output: value -} - -func ExampleReadStringInto_bool() { - cfgStr := `; Comment line -[section] -switch=on` - cfg := struct { - Section struct { - Switch bool - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.Section.Switch) - // Output: true -} - -func ExampleReadStringInto_hyphens() { - cfgStr := `; Comment line -[section-name] -variable-name=value # comment` - cfg := struct { - Section_Name struct { - Variable_Name string - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.Section_Name.Variable_Name) - // Output: value -} - -func ExampleReadStringInto_tags() { - cfgStr := `; Comment line -[section] -var-name=value # comment` - cfg := struct { - Section struct { - FieldName string `gcfg:"var-name"` - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.Section.FieldName) - // Output: value -} - -func ExampleReadStringInto_subsections() { - cfgStr := `; Comment line -[profile "A"] -color = white - -[profile "B"] -color = black -` - cfg := struct { - Profile map[string]*struct { - Color string - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Printf("%s %s\n", cfg.Profile["A"].Color, cfg.Profile["B"].Color) - // Output: white black -} - -func ExampleReadStringInto_multivalue() { - cfgStr := `; Comment line -[section] -multi=value1 -multi=value2` - cfg := struct { - Section struct { - Multi []string - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.Section.Multi) - // Output: [value1 value2] -} - -func ExampleReadStringInto_unicode() { - cfgStr := `; Comment line -[甲] -乙=丙 # comment` - cfg := struct { - X甲 struct { - X乙 string - } - }{} - err := gcfg.ReadStringInto(&cfg, cfgStr) - if err != nil { - log.Fatalf("Failed to parse gcfg data: %s", err) - } - fmt.Println(cfg.X甲.X乙) - // Output: 丙 -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/issues_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/issues_test.go deleted file mode 100644 index 796dd10b6..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/issues_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package gcfg - -import ( - "fmt" - "math/big" - "strings" - "testing" -) - -type Config1 struct { - Section struct { - Int int - BigInt big.Int - } -} - -var testsIssue1 = []struct { - cfg string - typename string -}{ - {"[section]\nint=X", "int"}, - {"[section]\nint=", "int"}, - {"[section]\nint=1A", "int"}, - {"[section]\nbigint=X", "big.Int"}, - {"[section]\nbigint=", "big.Int"}, - {"[section]\nbigint=1A", "big.Int"}, -} - -// Value parse error should: -// - include plain type name -// - not include reflect internals -func TestIssue1(t *testing.T) { - for i, tt := range testsIssue1 { - var c Config1 - err := ReadStringInto(&c, tt.cfg) - switch { - case err == nil: - t.Errorf("%d fail: got ok; wanted error", i) - case !strings.Contains(err.Error(), tt.typename): - t.Errorf("%d fail: error message doesn't contain type name %q: %v", - i, tt.typename, err) - case strings.Contains(err.Error(), "reflect"): - t.Errorf("%d fail: error message includes reflect internals: %v", - i, err) - default: - t.Logf("%d pass: %v", i, err) - } - } -} - -type confIssue2 struct{ Main struct{ Foo string } } - -var testsIssue2 = []readtest{ - {"[main]\n;\nfoo = bar\n", &confIssue2{struct{ Foo string }{"bar"}}, true}, - {"[main]\r\n;\r\nfoo = bar\r\n", &confIssue2{struct{ Foo string }{"bar"}}, true}, -} - -func TestIssue2(t *testing.T) { - for i, tt := range testsIssue2 { - id := fmt.Sprintf("issue2:%d", i) - testRead(t, id, tt) - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/read_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/read_test.go deleted file mode 100644 index 404d04dd9..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/read_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package gcfg - -import ( - "fmt" - "math/big" - "os" - "reflect" - "testing" -) - -const ( - // 64 spaces - sp64 = " " - // 512 spaces - sp512 = sp64 + sp64 + sp64 + sp64 + sp64 + sp64 + sp64 + sp64 - // 4096 spaces - sp4096 = sp512 + sp512 + sp512 + sp512 + sp512 + sp512 + sp512 + sp512 -) - -type cBasic struct { - Section cBasicS1 - Hyphen_In_Section cBasicS2 - unexported cBasicS1 - Exported cBasicS3 - TagName cBasicS1 `gcfg:"tag-name"` -} -type cBasicS1 struct { - Name string - Int int - PName *string -} -type cBasicS2 struct { - Hyphen_In_Name string -} -type cBasicS3 struct { - unexported string -} - -type nonMulti []string - -type unmarshalable string - -func (u *unmarshalable) UnmarshalText(text []byte) error { - s := string(text) - if s == "error" { - return fmt.Errorf("%s", s) - } - *u = unmarshalable(s) - return nil -} - -var _ textUnmarshaler = new(unmarshalable) - -type cUni struct { - X甲 cUniS1 - XSection cUniS2 -} -type cUniS1 struct { - X乙 string -} -type cUniS2 struct { - XName string -} - -type cMulti struct { - M1 cMultiS1 - M2 cMultiS2 - M3 cMultiS3 -} -type cMultiS1 struct{ Multi []string } -type cMultiS2 struct{ NonMulti nonMulti } -type cMultiS3 struct{ PMulti *[]string } - -type cSubs struct{ Sub map[string]*cSubsS1 } -type cSubsS1 struct{ Name string } - -type cBool struct{ Section cBoolS1 } -type cBoolS1 struct{ Bool bool } - -type cTxUnm struct{ Section cTxUnmS1 } -type cTxUnmS1 struct{ Name unmarshalable } - -type cNum struct { - N1 cNumS1 - N2 cNumS2 - N3 cNumS3 -} -type cNumS1 struct { - Int int - IntDHO int `gcfg:",int=dho"` - Big *big.Int -} -type cNumS2 struct { - MultiInt []int - MultiBig []*big.Int -} -type cNumS3 struct{ FileMode os.FileMode } -type readtest struct { - gcfg string - exp interface{} - ok bool -} - -func newString(s string) *string { return &s } -func newStringSlice(s ...string) *[]string { return &s } - -var readtests = []struct { - group string - tests []readtest -}{{"scanning", []readtest{ - {"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - // hyphen in name - {"[hyphen-in-section]\nhyphen-in-name=value", &cBasic{Hyphen_In_Section: cBasicS2{Hyphen_In_Name: "value"}}, true}, - // quoted string value - {"[section]\nname=\"\"", &cBasic{Section: cBasicS1{Name: ""}}, true}, - {"[section]\nname=\" \"", &cBasic{Section: cBasicS1{Name: " "}}, true}, - {"[section]\nname=\"value\"", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname=\" value \"", &cBasic{Section: cBasicS1{Name: " value "}}, true}, - {"\n[section]\nname=\"va ; lue\"", &cBasic{Section: cBasicS1{Name: "va ; lue"}}, true}, - {"[section]\nname=\"val\" \"ue\"", &cBasic{Section: cBasicS1{Name: "val ue"}}, true}, - {"[section]\nname=\"value", &cBasic{}, false}, - // escape sequences - {"[section]\nname=\"va\\\\lue\"", &cBasic{Section: cBasicS1{Name: "va\\lue"}}, true}, - {"[section]\nname=\"va\\\"lue\"", &cBasic{Section: cBasicS1{Name: "va\"lue"}}, true}, - {"[section]\nname=\"va\\nlue\"", &cBasic{Section: cBasicS1{Name: "va\nlue"}}, true}, - {"[section]\nname=\"va\\tlue\"", &cBasic{Section: cBasicS1{Name: "va\tlue"}}, true}, - {"\n[section]\nname=\\", &cBasic{}, false}, - {"\n[section]\nname=\\a", &cBasic{}, false}, - {"\n[section]\nname=\"val\\a\"", &cBasic{}, false}, - {"\n[section]\nname=val\\", &cBasic{}, false}, - {"\n[sub \"A\\\n\"]\nname=value", &cSubs{}, false}, - {"\n[sub \"A\\\t\"]\nname=value", &cSubs{}, false}, - // broken line - {"[section]\nname=value \\\n value", &cBasic{Section: cBasicS1{Name: "value value"}}, true}, - {"[section]\nname=\"value \\\n value\"", &cBasic{}, false}, -}}, {"scanning:whitespace", []readtest{ - {" \n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {" [section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\t[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[ section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section ]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\n name=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname =value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname= value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname=value ", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\r\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\r\nname=value\r\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {";cmnt\r\n[section]\r\nname=value\r\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - // long lines - {sp4096 + "[section]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[" + sp4096 + "section]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section" + sp4096 + "]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]" + sp4096 + "\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\n" + sp4096 + "name=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname" + sp4096 + "=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname=" + sp4096 + "value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname=value\n" + sp4096, &cBasic{Section: cBasicS1{Name: "value"}}, true}, -}}, {"scanning:comments", []readtest{ - {"; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"# cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {" ; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\t; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]; cmnt\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section] ; cmnt\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]\nname=value; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]\nname=value ; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]\nname=\"value\" ; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]\nname=value ; \"cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"\n[section]\nname=\"va ; lue\" ; cmnt", &cBasic{Section: cBasicS1{Name: "va ; lue"}}, true}, - {"\n[section]\nname=; cmnt", &cBasic{Section: cBasicS1{Name: ""}}, true}, -}}, {"scanning:subsections", []readtest{ - {"\n[sub \"A\"]\nname=value", &cSubs{map[string]*cSubsS1{"A": &cSubsS1{"value"}}}, true}, - {"\n[sub \"b\"]\nname=value", &cSubs{map[string]*cSubsS1{"b": &cSubsS1{"value"}}}, true}, - {"\n[sub \"A\\\\\"]\nname=value", &cSubs{map[string]*cSubsS1{"A\\": &cSubsS1{"value"}}}, true}, - {"\n[sub \"A\\\"\"]\nname=value", &cSubs{map[string]*cSubsS1{"A\"": &cSubsS1{"value"}}}, true}, -}}, {"syntax", []readtest{ - // invalid line - {"\n[section]\n=", &cBasic{}, false}, - // no section - {"name=value", &cBasic{}, false}, - // empty section - {"\n[]\nname=value", &cBasic{}, false}, - // empty subsection - {"\n[sub \"\"]\nname=value", &cSubs{}, false}, -}}, {"setting", []readtest{ - {"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - // pointer - {"[section]", &cBasic{Section: cBasicS1{PName: nil}}, true}, - {"[section]\npname=value", &cBasic{Section: cBasicS1{PName: newString("value")}}, true}, - {"[m3]", &cMulti{M3: cMultiS3{PMulti: nil}}, true}, - {"[m3]\npmulti", &cMulti{M3: cMultiS3{PMulti: newStringSlice()}}, true}, - {"[m3]\npmulti=value", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value")}}, true}, - {"[m3]\npmulti=value1\npmulti=value2", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value1", "value2")}}, true}, - // section name not matched - {"\n[nonexistent]\nname=value", &cBasic{}, false}, - // subsection name not matched - {"\n[section \"nonexistent\"]\nname=value", &cBasic{}, false}, - // variable name not matched - {"\n[section]\nnonexistent=value", &cBasic{}, false}, - // hyphen in name - {"[hyphen-in-section]\nhyphen-in-name=value", &cBasic{Hyphen_In_Section: cBasicS2{Hyphen_In_Name: "value"}}, true}, - // ignore unexported fields - {"[unexported]\nname=value", &cBasic{}, false}, - {"[exported]\nunexported=value", &cBasic{}, false}, - // 'X' prefix for non-upper/lower-case letters - {"[甲]\n乙=丙", &cUni{X甲: cUniS1{X乙: "丙"}}, true}, - //{"[section]\nxname=value", &cBasic{XSection: cBasicS4{XName: "value"}}, false}, - //{"[xsection]\nname=value", &cBasic{XSection: cBasicS4{XName: "value"}}, false}, - // name specified as struct tag - {"[tag-name]\nname=value", &cBasic{TagName: cBasicS1{Name: "value"}}, true}, - // empty subsections - {"\n[sub \"A\"]\n[sub \"B\"]", &cSubs{map[string]*cSubsS1{"A": &cSubsS1{}, "B": &cSubsS1{}}}, true}, -}}, {"multivalue", []readtest{ - // unnamed slice type: treat as multi-value - {"\n[m1]", &cMulti{M1: cMultiS1{}}, true}, - {"\n[m1]\nmulti=value", &cMulti{M1: cMultiS1{[]string{"value"}}}, true}, - {"\n[m1]\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true}, - // "blank" empties multi-valued slice -- here same result as above - {"\n[m1]\nmulti\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true}, - // named slice type: do not treat as multi-value - {"\n[m2]", &cMulti{}, true}, - {"\n[m2]\nmulti=value", &cMulti{}, false}, - {"\n[m2]\nmulti=value1\nmulti=value2", &cMulti{}, false}, -}}, {"type:string", []readtest{ - {"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true}, - {"[section]\nname=", &cBasic{Section: cBasicS1{Name: ""}}, true}, -}}, {"type:bool", []readtest{ - // explicit values - {"[section]\nbool=true", &cBool{cBoolS1{true}}, true}, - {"[section]\nbool=yes", &cBool{cBoolS1{true}}, true}, - {"[section]\nbool=on", &cBool{cBoolS1{true}}, true}, - {"[section]\nbool=1", &cBool{cBoolS1{true}}, true}, - {"[section]\nbool=tRuE", &cBool{cBoolS1{true}}, true}, - {"[section]\nbool=false", &cBool{cBoolS1{false}}, true}, - {"[section]\nbool=no", &cBool{cBoolS1{false}}, true}, - {"[section]\nbool=off", &cBool{cBoolS1{false}}, true}, - {"[section]\nbool=0", &cBool{cBoolS1{false}}, true}, - {"[section]\nbool=NO", &cBool{cBoolS1{false}}, true}, - // "blank" value handled as true - {"[section]\nbool", &cBool{cBoolS1{true}}, true}, - // bool parse errors - {"[section]\nbool=maybe", &cBool{}, false}, - {"[section]\nbool=t", &cBool{}, false}, - {"[section]\nbool=truer", &cBool{}, false}, - {"[section]\nbool=2", &cBool{}, false}, - {"[section]\nbool=-1", &cBool{}, false}, -}}, {"type:numeric", []readtest{ - {"[section]\nint=0", &cBasic{Section: cBasicS1{Int: 0}}, true}, - {"[section]\nint=1", &cBasic{Section: cBasicS1{Int: 1}}, true}, - {"[section]\nint=-1", &cBasic{Section: cBasicS1{Int: -1}}, true}, - {"[section]\nint=0.2", &cBasic{}, false}, - {"[section]\nint=1e3", &cBasic{}, false}, - // primitive [u]int(|8|16|32|64) and big.Int is parsed as dec or hex (not octal) - {"[n1]\nint=010", &cNum{N1: cNumS1{Int: 10}}, true}, - {"[n1]\nint=0x10", &cNum{N1: cNumS1{Int: 0x10}}, true}, - {"[n1]\nbig=1", &cNum{N1: cNumS1{Big: big.NewInt(1)}}, true}, - {"[n1]\nbig=0x10", &cNum{N1: cNumS1{Big: big.NewInt(0x10)}}, true}, - {"[n1]\nbig=010", &cNum{N1: cNumS1{Big: big.NewInt(10)}}, true}, - {"[n2]\nmultiint=010", &cNum{N2: cNumS2{MultiInt: []int{10}}}, true}, - {"[n2]\nmultibig=010", &cNum{N2: cNumS2{MultiBig: []*big.Int{big.NewInt(10)}}}, true}, - // set parse mode for int types via struct tag - {"[n1]\nintdho=010", &cNum{N1: cNumS1{IntDHO: 010}}, true}, - // octal allowed for named type - {"[n3]\nfilemode=0777", &cNum{N3: cNumS3{FileMode: 0777}}, true}, -}}, {"type:textUnmarshaler", []readtest{ - {"[section]\nname=value", &cTxUnm{Section: cTxUnmS1{Name: "value"}}, true}, - {"[section]\nname=error", &cTxUnm{}, false}, -}}, -} - -func TestReadStringInto(t *testing.T) { - for _, tg := range readtests { - for i, tt := range tg.tests { - id := fmt.Sprintf("%s:%d", tg.group, i) - testRead(t, id, tt) - } - } -} - -func TestReadStringIntoMultiBlankPreset(t *testing.T) { - tt := readtest{"\n[m1]\nmulti\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true} - cfg := &cMulti{M1: cMultiS1{[]string{"preset1", "preset2"}}} - testReadInto(t, "multi:blank", tt, cfg) -} - -func testRead(t *testing.T, id string, tt readtest) { - // get the type of the expected result - restyp := reflect.TypeOf(tt.exp).Elem() - // create a new instance to hold the actual result - res := reflect.New(restyp).Interface() - testReadInto(t, id, tt, res) -} - -func testReadInto(t *testing.T, id string, tt readtest, res interface{}) { - err := ReadStringInto(res, tt.gcfg) - if tt.ok { - if err != nil { - t.Errorf("%s fail: got error %v, wanted ok", id, err) - return - } else if !reflect.DeepEqual(res, tt.exp) { - t.Errorf("%s fail: got value %#v, wanted value %#v", id, res, tt.exp) - return - } - if !testing.Short() { - t.Logf("%s pass: got value %#v", id, res) - } - } else { // !tt.ok - if err == nil { - t.Errorf("%s fail: got value %#v, wanted error", id, res) - return - } - if !testing.Short() { - t.Logf("%s pass: got error %v", id, err) - } - } -} - -func TestReadFileInto(t *testing.T) { - res := &struct{ Section struct{ Name string } }{} - err := ReadFileInto(res, "testdata/gcfg_test.gcfg") - if err != nil { - t.Errorf(err.Error()) - } - if "value" != res.Section.Name { - t.Errorf("got %q, wanted %q", res.Section.Name, "value") - } -} - -func TestReadFileIntoUnicode(t *testing.T) { - res := &struct{ X甲 struct{ X乙 string } }{} - err := ReadFileInto(res, "testdata/gcfg_unicode_test.gcfg") - if err != nil { - t.Errorf(err.Error()) - } - if "丙" != res.X甲.X乙 { - t.Errorf("got %q, wanted %q", res.X甲.X乙, "丙") - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/example_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/example_test.go deleted file mode 100644 index ce08e9ca9..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/example_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2012 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 scanner_test - -import ( - "fmt" -) - -import ( - "gopkg.in/gcfg.v1/scanner" - "gopkg.in/gcfg.v1/token" -) - -func ExampleScanner_Scan() { - // src is the input that we want to tokenize. - src := []byte(`[profile "A"] -color = blue ; Comment`) - - // Initialize the scanner. - var s scanner.Scanner - fset := token.NewFileSet() // positions are relative to fset - file := fset.AddFile("", fset.Base(), len(src)) // register input "file" - s.Init(file, src, nil /* no error handler */, scanner.ScanComments) - - // Repeated calls to Scan yield the token sequence found in the input. - for { - pos, tok, lit := s.Scan() - if tok == token.EOF { - break - } - fmt.Printf("%s\t%q\t%q\n", fset.Position(pos), tok, lit) - } - - // output: - // 1:1 "[" "" - // 1:2 "IDENT" "profile" - // 1:10 "STRING" "\"A\"" - // 1:13 "]" "" - // 1:14 "\n" "" - // 2:1 "IDENT" "color" - // 2:7 "=" "" - // 2:9 "STRING" "blue" - // 2:14 "COMMENT" "; Comment" -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/scanner_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/scanner_test.go deleted file mode 100644 index bef219d4c..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/scanner/scanner_test.go +++ /dev/null @@ -1,417 +0,0 @@ -// Copyright 2009 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 scanner - -import ( - "os" - "strings" - "testing" -) - -import ( - "gopkg.in/gcfg.v1/token" -) - -var fset = token.NewFileSet() - -const /* class */ ( - special = iota - literal - operator -) - -func tokenclass(tok token.Token) int { - switch { - case tok.IsLiteral(): - return literal - case tok.IsOperator(): - return operator - } - return special -} - -type elt struct { - tok token.Token - lit string - class int - pre string - suf string -} - -var tokens = [...]elt{ - // Special tokens - {token.COMMENT, "; a comment", special, "", "\n"}, - {token.COMMENT, "# a comment", special, "", "\n"}, - - // Operators and delimiters - {token.ASSIGN, "=", operator, "", "value"}, - {token.LBRACK, "[", operator, "", ""}, - {token.RBRACK, "]", operator, "", ""}, - {token.EOL, "\n", operator, "", ""}, - - // Identifiers - {token.IDENT, "foobar", literal, "", ""}, - {token.IDENT, "a۰۱۸", literal, "", ""}, - {token.IDENT, "foo६४", literal, "", ""}, - {token.IDENT, "bar9876", literal, "", ""}, - {token.IDENT, "foo-bar", literal, "", ""}, - {token.IDENT, "foo", literal, ";\n", ""}, - // String literals (subsection names) - {token.STRING, `"foobar"`, literal, "", ""}, - {token.STRING, `"\""`, literal, "", ""}, - // String literals (values) - {token.STRING, `"\n"`, literal, "=", ""}, - {token.STRING, `"foobar"`, literal, "=", ""}, - {token.STRING, `"foo\nbar"`, literal, "=", ""}, - {token.STRING, `"foo\"bar"`, literal, "=", ""}, - {token.STRING, `"foo\\bar"`, literal, "=", ""}, - {token.STRING, `"foobar"`, literal, "=", ""}, - {token.STRING, `"foobar"`, literal, "= ", ""}, - {token.STRING, `"foobar"`, literal, "=", "\n"}, - {token.STRING, `"foobar"`, literal, "=", ";"}, - {token.STRING, `"foobar"`, literal, "=", " ;"}, - {token.STRING, `"foobar"`, literal, "=", "#"}, - {token.STRING, `"foobar"`, literal, "=", " #"}, - {token.STRING, "foobar", literal, "=", ""}, - {token.STRING, "foobar", literal, "= ", ""}, - {token.STRING, "foobar", literal, "=", " "}, - {token.STRING, `"foo" "bar"`, literal, "=", " "}, - {token.STRING, "foo\\\nbar", literal, "=", ""}, - {token.STRING, "foo\\\r\nbar", literal, "=", ""}, -} - -const whitespace = " \t \n\n\n" // to separate tokens - -var source = func() []byte { - var src []byte - for _, t := range tokens { - src = append(src, t.pre...) - src = append(src, t.lit...) - src = append(src, t.suf...) - src = append(src, whitespace...) - } - return src -}() - -func newlineCount(s string) int { - n := 0 - for i := 0; i < len(s); i++ { - if s[i] == '\n' { - n++ - } - } - return n -} - -func checkPos(t *testing.T, lit string, p token.Pos, expected token.Position) { - pos := fset.Position(p) - if pos.Filename != expected.Filename { - t.Errorf("bad filename for %q: got %s, expected %s", lit, pos.Filename, expected.Filename) - } - if pos.Offset != expected.Offset { - t.Errorf("bad position for %q: got %d, expected %d", lit, pos.Offset, expected.Offset) - } - if pos.Line != expected.Line { - t.Errorf("bad line for %q: got %d, expected %d", lit, pos.Line, expected.Line) - } - if pos.Column != expected.Column { - t.Errorf("bad column for %q: got %d, expected %d", lit, pos.Column, expected.Column) - } -} - -// Verify that calling Scan() provides the correct results. -func TestScan(t *testing.T) { - // make source - src_linecount := newlineCount(string(source)) - whitespace_linecount := newlineCount(whitespace) - - index := 0 - - // error handler - eh := func(_ token.Position, msg string) { - t.Errorf("%d: error handler called (msg = %s)", index, msg) - } - - // verify scan - var s Scanner - s.Init(fset.AddFile("", fset.Base(), len(source)), source, eh, ScanComments) - // epos is the expected position - epos := token.Position{ - Filename: "", - Offset: 0, - Line: 1, - Column: 1, - } - for { - pos, tok, lit := s.Scan() - if lit == "" { - // no literal value for non-literal tokens - lit = tok.String() - } - e := elt{token.EOF, "", special, "", ""} - if index < len(tokens) { - e = tokens[index] - } - if tok == token.EOF { - lit = "" - epos.Line = src_linecount - epos.Column = 2 - } - if e.pre != "" && strings.ContainsRune("=;#", rune(e.pre[0])) { - epos.Column = 1 - checkPos(t, lit, pos, epos) - var etok token.Token - if e.pre[0] == '=' { - etok = token.ASSIGN - } else { - etok = token.COMMENT - } - if tok != etok { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, etok) - } - pos, tok, lit = s.Scan() - } - epos.Offset += len(e.pre) - if tok != token.EOF { - epos.Column = 1 + len(e.pre) - } - if e.pre != "" && e.pre[len(e.pre)-1] == '\n' { - epos.Offset-- - epos.Column-- - checkPos(t, lit, pos, epos) - if tok != token.EOL { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.EOL) - } - epos.Line++ - epos.Offset++ - epos.Column = 1 - pos, tok, lit = s.Scan() - } - checkPos(t, lit, pos, epos) - if tok != e.tok { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, e.tok) - } - if e.tok.IsLiteral() { - // no CRs in value string literals - elit := e.lit - if strings.ContainsRune(e.pre, '=') { - elit = string(stripCR([]byte(elit))) - epos.Offset += len(e.lit) - len(lit) // correct position - } - if lit != elit { - t.Errorf("bad literal for %q: got %q, expected %q", lit, lit, elit) - } - } - if tokenclass(tok) != e.class { - t.Errorf("bad class for %q: got %d, expected %d", lit, tokenclass(tok), e.class) - } - epos.Offset += len(lit) + len(e.suf) + len(whitespace) - epos.Line += newlineCount(lit) + newlineCount(e.suf) + whitespace_linecount - index++ - if tok == token.EOF { - break - } - if e.suf == "value" { - pos, tok, lit = s.Scan() - if tok != token.STRING { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.STRING) - } - } else if strings.ContainsRune(e.suf, ';') || strings.ContainsRune(e.suf, '#') { - pos, tok, lit = s.Scan() - if tok != token.COMMENT { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.COMMENT) - } - } - // skip EOLs - for i := 0; i < whitespace_linecount+newlineCount(e.suf); i++ { - pos, tok, lit = s.Scan() - if tok != token.EOL { - t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.EOL) - } - } - } - if s.ErrorCount != 0 { - t.Errorf("found %d errors", s.ErrorCount) - } -} - -func TestScanValStringEOF(t *testing.T) { - var s Scanner - src := "= value" - f := fset.AddFile("src", fset.Base(), len(src)) - s.Init(f, []byte(src), nil, 0) - s.Scan() // = - s.Scan() // value - _, tok, _ := s.Scan() // EOF - if tok != token.EOF { - t.Errorf("bad token: got %s, expected %s", tok, token.EOF) - } - if s.ErrorCount > 0 { - t.Error("scanning error") - } -} - -// Verify that initializing the same scanner more then once works correctly. -func TestInit(t *testing.T) { - var s Scanner - - // 1st init - src1 := "\nname = value" - f1 := fset.AddFile("src1", fset.Base(), len(src1)) - s.Init(f1, []byte(src1), nil, 0) - if f1.Size() != len(src1) { - t.Errorf("bad file size: got %d, expected %d", f1.Size(), len(src1)) - } - s.Scan() // \n - s.Scan() // name - _, tok, _ := s.Scan() // = - if tok != token.ASSIGN { - t.Errorf("bad token: got %s, expected %s", tok, token.ASSIGN) - } - - // 2nd init - src2 := "[section]" - f2 := fset.AddFile("src2", fset.Base(), len(src2)) - s.Init(f2, []byte(src2), nil, 0) - if f2.Size() != len(src2) { - t.Errorf("bad file size: got %d, expected %d", f2.Size(), len(src2)) - } - _, tok, _ = s.Scan() // [ - if tok != token.LBRACK { - t.Errorf("bad token: got %s, expected %s", tok, token.LBRACK) - } - - if s.ErrorCount != 0 { - t.Errorf("found %d errors", s.ErrorCount) - } -} - -func TestStdErrorHandler(t *testing.T) { - const src = "@\n" + // illegal character, cause an error - "@ @\n" // two errors on the same line - - var list ErrorList - eh := func(pos token.Position, msg string) { list.Add(pos, msg) } - - var s Scanner - s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), eh, 0) - for { - if _, tok, _ := s.Scan(); tok == token.EOF { - break - } - } - - if len(list) != s.ErrorCount { - t.Errorf("found %d errors, expected %d", len(list), s.ErrorCount) - } - - if len(list) != 3 { - t.Errorf("found %d raw errors, expected 3", len(list)) - PrintError(os.Stderr, list) - } - - list.Sort() - if len(list) != 3 { - t.Errorf("found %d sorted errors, expected 3", len(list)) - PrintError(os.Stderr, list) - } - - list.RemoveMultiples() - if len(list) != 2 { - t.Errorf("found %d one-per-line errors, expected 2", len(list)) - PrintError(os.Stderr, list) - } -} - -type errorCollector struct { - cnt int // number of errors encountered - msg string // last error message encountered - pos token.Position // last error position encountered -} - -func checkError(t *testing.T, src string, tok token.Token, pos int, err string) { - var s Scanner - var h errorCollector - eh := func(pos token.Position, msg string) { - h.cnt++ - h.msg = msg - h.pos = pos - } - s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), eh, ScanComments) - if src[0] == '=' { - _, _, _ = s.Scan() - } - _, tok0, _ := s.Scan() - _, tok1, _ := s.Scan() - if tok0 != tok { - t.Errorf("%q: got %s, expected %s", src, tok0, tok) - } - if tok1 != token.EOF { - t.Errorf("%q: got %s, expected EOF", src, tok1) - } - cnt := 0 - if err != "" { - cnt = 1 - } - if h.cnt != cnt { - t.Errorf("%q: got cnt %d, expected %d", src, h.cnt, cnt) - } - if h.msg != err { - t.Errorf("%q: got msg %q, expected %q", src, h.msg, err) - } - if h.pos.Offset != pos { - t.Errorf("%q: got offset %d, expected %d", src, h.pos.Offset, pos) - } -} - -var errors = []struct { - src string - tok token.Token - pos int - err string -}{ - {"\a", token.ILLEGAL, 0, "illegal character U+0007"}, - {"/", token.ILLEGAL, 0, "illegal character U+002F '/'"}, - {"_", token.ILLEGAL, 0, "illegal character U+005F '_'"}, - {`…`, token.ILLEGAL, 0, "illegal character U+2026 '…'"}, - {`""`, token.STRING, 0, ""}, - {`"`, token.STRING, 0, "string not terminated"}, - {"\"\n", token.STRING, 0, "string not terminated"}, - {`="`, token.STRING, 1, "string not terminated"}, - {"=\"\n", token.STRING, 1, "string not terminated"}, - {"=\\", token.STRING, 1, "unquoted '\\' must be followed by new line"}, - {"=\\\r", token.STRING, 1, "unquoted '\\' must be followed by new line"}, - {`"\z"`, token.STRING, 2, "unknown escape sequence"}, - {`"\a"`, token.STRING, 2, "unknown escape sequence"}, - {`"\b"`, token.STRING, 2, "unknown escape sequence"}, - {`"\f"`, token.STRING, 2, "unknown escape sequence"}, - {`"\r"`, token.STRING, 2, "unknown escape sequence"}, - {`"\t"`, token.STRING, 2, "unknown escape sequence"}, - {`"\v"`, token.STRING, 2, "unknown escape sequence"}, - {`"\0"`, token.STRING, 2, "unknown escape sequence"}, -} - -func TestScanErrors(t *testing.T) { - for _, e := range errors { - checkError(t, e.src, e.tok, e.pos, e.err) - } -} - -func BenchmarkScan(b *testing.B) { - b.StopTimer() - fset := token.NewFileSet() - file := fset.AddFile("", fset.Base(), len(source)) - var s Scanner - b.StartTimer() - for i := b.N - 1; i >= 0; i-- { - s.Init(file, source, nil, ScanComments) - for { - _, tok, _ := s.Scan() - if tok == token.EOF { - break - } - } - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg b/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg deleted file mode 100644 index cddff29ab..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg +++ /dev/null @@ -1,3 +0,0 @@ -; Comment line -[section] -name=value # comment diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg b/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg deleted file mode 100644 index 3762a201e..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg +++ /dev/null @@ -1,3 +0,0 @@ -; Comment line -[甲] -乙=丙 # comment diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/position_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/position_test.go deleted file mode 100644 index 160107df4..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/position_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2010 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 token - -import ( - "fmt" - "testing" -) - -func checkPos(t *testing.T, msg string, p, q Position) { - if p.Filename != q.Filename { - t.Errorf("%s: expected filename = %q; got %q", msg, q.Filename, p.Filename) - } - if p.Offset != q.Offset { - t.Errorf("%s: expected offset = %d; got %d", msg, q.Offset, p.Offset) - } - if p.Line != q.Line { - t.Errorf("%s: expected line = %d; got %d", msg, q.Line, p.Line) - } - if p.Column != q.Column { - t.Errorf("%s: expected column = %d; got %d", msg, q.Column, p.Column) - } -} - -func TestNoPos(t *testing.T) { - if NoPos.IsValid() { - t.Errorf("NoPos should not be valid") - } - var fset *FileSet - checkPos(t, "nil NoPos", fset.Position(NoPos), Position{}) - fset = NewFileSet() - checkPos(t, "fset NoPos", fset.Position(NoPos), Position{}) -} - -var tests = []struct { - filename string - source []byte // may be nil - size int - lines []int -}{ - {"a", []byte{}, 0, []int{}}, - {"b", []byte("01234"), 5, []int{0}}, - {"c", []byte("\n\n\n\n\n\n\n\n\n"), 9, []int{0, 1, 2, 3, 4, 5, 6, 7, 8}}, - {"d", nil, 100, []int{0, 5, 10, 20, 30, 70, 71, 72, 80, 85, 90, 99}}, - {"e", nil, 777, []int{0, 80, 100, 120, 130, 180, 267, 455, 500, 567, 620}}, - {"f", []byte("package p\n\nimport \"fmt\""), 23, []int{0, 10, 11}}, - {"g", []byte("package p\n\nimport \"fmt\"\n"), 24, []int{0, 10, 11}}, - {"h", []byte("package p\n\nimport \"fmt\"\n "), 25, []int{0, 10, 11, 24}}, -} - -func linecol(lines []int, offs int) (int, int) { - prevLineOffs := 0 - for line, lineOffs := range lines { - if offs < lineOffs { - return line, offs - prevLineOffs + 1 - } - prevLineOffs = lineOffs - } - return len(lines), offs - prevLineOffs + 1 -} - -func verifyPositions(t *testing.T, fset *FileSet, f *File, lines []int) { - for offs := 0; offs < f.Size(); offs++ { - p := f.Pos(offs) - offs2 := f.Offset(p) - if offs2 != offs { - t.Errorf("%s, Offset: expected offset %d; got %d", f.Name(), offs, offs2) - } - line, col := linecol(lines, offs) - msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p) - checkPos(t, msg, f.Position(f.Pos(offs)), Position{f.Name(), offs, line, col}) - checkPos(t, msg, fset.Position(p), Position{f.Name(), offs, line, col}) - } -} - -func makeTestSource(size int, lines []int) []byte { - src := make([]byte, size) - for _, offs := range lines { - if offs > 0 { - src[offs-1] = '\n' - } - } - return src -} - -func TestPositions(t *testing.T) { - const delta = 7 // a non-zero base offset increment - fset := NewFileSet() - for _, test := range tests { - // verify consistency of test case - if test.source != nil && len(test.source) != test.size { - t.Errorf("%s: inconsistent test case: expected file size %d; got %d", test.filename, test.size, len(test.source)) - } - - // add file and verify name and size - f := fset.AddFile(test.filename, fset.Base()+delta, test.size) - if f.Name() != test.filename { - t.Errorf("expected filename %q; got %q", test.filename, f.Name()) - } - if f.Size() != test.size { - t.Errorf("%s: expected file size %d; got %d", f.Name(), test.size, f.Size()) - } - if fset.File(f.Pos(0)) != f { - t.Errorf("%s: f.Pos(0) was not found in f", f.Name()) - } - - // add lines individually and verify all positions - for i, offset := range test.lines { - f.AddLine(offset) - if f.LineCount() != i+1 { - t.Errorf("%s, AddLine: expected line count %d; got %d", f.Name(), i+1, f.LineCount()) - } - // adding the same offset again should be ignored - f.AddLine(offset) - if f.LineCount() != i+1 { - t.Errorf("%s, AddLine: expected unchanged line count %d; got %d", f.Name(), i+1, f.LineCount()) - } - verifyPositions(t, fset, f, test.lines[0:i+1]) - } - - // add lines with SetLines and verify all positions - if ok := f.SetLines(test.lines); !ok { - t.Errorf("%s: SetLines failed", f.Name()) - } - if f.LineCount() != len(test.lines) { - t.Errorf("%s, SetLines: expected line count %d; got %d", f.Name(), len(test.lines), f.LineCount()) - } - verifyPositions(t, fset, f, test.lines) - - // add lines with SetLinesForContent and verify all positions - src := test.source - if src == nil { - // no test source available - create one from scratch - src = makeTestSource(test.size, test.lines) - } - f.SetLinesForContent(src) - if f.LineCount() != len(test.lines) { - t.Errorf("%s, SetLinesForContent: expected line count %d; got %d", f.Name(), len(test.lines), f.LineCount()) - } - verifyPositions(t, fset, f, test.lines) - } -} - -func TestLineInfo(t *testing.T) { - fset := NewFileSet() - f := fset.AddFile("foo", fset.Base(), 500) - lines := []int{0, 42, 77, 100, 210, 220, 277, 300, 333, 401} - // add lines individually and provide alternative line information - for _, offs := range lines { - f.AddLine(offs) - f.AddLineInfo(offs, "bar", 42) - } - // verify positions for all offsets - for offs := 0; offs <= f.Size(); offs++ { - p := f.Pos(offs) - _, col := linecol(lines, offs) - msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p) - checkPos(t, msg, f.Position(f.Pos(offs)), Position{"bar", offs, 42, col}) - checkPos(t, msg, fset.Position(p), Position{"bar", offs, 42, col}) - } -} - -func TestFiles(t *testing.T) { - fset := NewFileSet() - for i, test := range tests { - fset.AddFile(test.filename, fset.Base(), test.size) - j := 0 - fset.Iterate(func(f *File) bool { - if f.Name() != tests[j].filename { - t.Errorf("expected filename = %s; got %s", tests[j].filename, f.Name()) - } - j++ - return true - }) - if j != i+1 { - t.Errorf("expected %d files; got %d", i+1, j) - } - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/serialize_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/serialize_test.go deleted file mode 100644 index 4e925adb6..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/token/serialize_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2011 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 token - -import ( - "bytes" - "encoding/gob" - "fmt" - "testing" -) - -// equal returns nil if p and q describe the same file set; -// otherwise it returns an error describing the discrepancy. -func equal(p, q *FileSet) error { - if p == q { - // avoid deadlock if p == q - return nil - } - - // not strictly needed for the test - p.mutex.Lock() - q.mutex.Lock() - defer q.mutex.Unlock() - defer p.mutex.Unlock() - - if p.base != q.base { - return fmt.Errorf("different bases: %d != %d", p.base, q.base) - } - - if len(p.files) != len(q.files) { - return fmt.Errorf("different number of files: %d != %d", len(p.files), len(q.files)) - } - - for i, f := range p.files { - g := q.files[i] - if f.set != p { - return fmt.Errorf("wrong fileset for %q", f.name) - } - if g.set != q { - return fmt.Errorf("wrong fileset for %q", g.name) - } - if f.name != g.name { - return fmt.Errorf("different filenames: %q != %q", f.name, g.name) - } - if f.base != g.base { - return fmt.Errorf("different base for %q: %d != %d", f.name, f.base, g.base) - } - if f.size != g.size { - return fmt.Errorf("different size for %q: %d != %d", f.name, f.size, g.size) - } - for j, l := range f.lines { - m := g.lines[j] - if l != m { - return fmt.Errorf("different offsets for %q", f.name) - } - } - for j, l := range f.infos { - m := g.infos[j] - if l.Offset != m.Offset || l.Filename != m.Filename || l.Line != m.Line { - return fmt.Errorf("different infos for %q", f.name) - } - } - } - - // we don't care about .last - it's just a cache - return nil -} - -func checkSerialize(t *testing.T, p *FileSet) { - var buf bytes.Buffer - encode := func(x interface{}) error { - return gob.NewEncoder(&buf).Encode(x) - } - if err := p.Write(encode); err != nil { - t.Errorf("writing fileset failed: %s", err) - return - } - q := NewFileSet() - decode := func(x interface{}) error { - return gob.NewDecoder(&buf).Decode(x) - } - if err := q.Read(decode); err != nil { - t.Errorf("reading fileset failed: %s", err) - return - } - if err := equal(p, q); err != nil { - t.Errorf("filesets not identical: %s", err) - } -} - -func TestSerialization(t *testing.T) { - p := NewFileSet() - checkSerialize(t, p) - // add some files - for i := 0; i < 10; i++ { - f := p.AddFile(fmt.Sprintf("file%d", i), p.Base()+i, i*100) - checkSerialize(t, p) - // add some lines and alternative file infos - line := 1000 - for offs := 0; offs < f.Size(); offs += 40 + i { - f.AddLine(offs) - if offs%7 == 0 { - f.AddLineInfo(offs, fmt.Sprintf("file%d", offs), line) - line += 33 - } - } - checkSerialize(t, p) - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/enum_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/enum_test.go deleted file mode 100644 index 4bf135e67..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/enum_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package types - -import ( - "testing" -) - -func TestEnumParserBool(t *testing.T) { - for _, tt := range []struct { - val string - res bool - ok bool - }{ - {val: "tRuE", res: true, ok: true}, - {val: "False", res: false, ok: true}, - {val: "t", ok: false}, - } { - b, err := ParseBool(tt.val) - switch { - case tt.ok && err != nil: - t.Errorf("%q: got error %v, want %v", tt.val, err, tt.res) - case !tt.ok && err == nil: - t.Errorf("%q: got %v, want error", tt.val, b) - case tt.ok && b != tt.res: - t.Errorf("%q: got %v, want %v", tt.val, b, tt.res) - default: - t.Logf("%q: got %v, %v", tt.val, b, err) - } - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/int_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/int_test.go deleted file mode 100644 index b63dbcbae..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/int_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package types - -import ( - "reflect" - "testing" -) - -func elem(p interface{}) interface{} { - return reflect.ValueOf(p).Elem().Interface() -} - -func TestParseInt(t *testing.T) { - for _, tt := range []struct { - val string - mode IntMode - exp interface{} - ok bool - }{ - {"0", Dec, int(0), true}, - {"10", Dec, int(10), true}, - {"-10", Dec, int(-10), true}, - {"x", Dec, int(0), false}, - {"0xa", Hex, int(0xa), true}, - {"a", Hex, int(0xa), true}, - {"10", Hex, int(0x10), true}, - {"-0xa", Hex, int(-0xa), true}, - {"0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x - {"-0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x - {"-a", Hex, int(-0xa), true}, - {"-10", Hex, int(-0x10), true}, - {"x", Hex, int(0), false}, - {"10", Oct, int(010), true}, - {"010", Oct, int(010), true}, - {"-10", Oct, int(-010), true}, - {"-010", Oct, int(-010), true}, - {"10", Dec | Hex, int(10), true}, - {"010", Dec | Hex, int(10), true}, - {"0x10", Dec | Hex, int(0x10), true}, - {"10", Dec | Oct, int(10), true}, - {"010", Dec | Oct, int(010), true}, - {"0x10", Dec | Oct, int(0), false}, - {"10", Hex | Oct, int(0), false}, // need prefix to distinguish Hex/Oct - {"010", Hex | Oct, int(010), true}, - {"0x10", Hex | Oct, int(0x10), true}, - {"10", Dec | Hex | Oct, int(10), true}, - {"010", Dec | Hex | Oct, int(010), true}, - {"0x10", Dec | Hex | Oct, int(0x10), true}, - } { - typ := reflect.TypeOf(tt.exp) - res := reflect.New(typ).Interface() - err := ParseInt(res, tt.val, tt.mode) - switch { - case tt.ok && err != nil: - t.Errorf("ParseInt(%v, %#v, %v): fail; got error %v, want ok", - typ, tt.val, tt.mode, err) - case !tt.ok && err == nil: - t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want error", - typ, tt.val, tt.mode, elem(res)) - case tt.ok && !reflect.DeepEqual(elem(res), tt.exp): - t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want %v", - typ, tt.val, tt.mode, elem(res), tt.exp) - default: - t.Logf("ParseInt(%v, %#v, %s): pass; got %v, error %v", - typ, tt.val, tt.mode, elem(res), err) - } - } -} diff --git a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/scan_test.go b/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/scan_test.go deleted file mode 100644 index a8083e04f..000000000 --- a/Godeps/_workspace/src/gopkg.in/gcfg.v1/types/scan_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package types - -import ( - "reflect" - "testing" -) - -func TestScanFully(t *testing.T) { - for _, tt := range []struct { - val string - verb byte - res interface{} - ok bool - }{ - {"a", 'v', int(0), false}, - {"0x", 'v', int(0), true}, - {"0x", 'd', int(0), false}, - } { - d := reflect.New(reflect.TypeOf(tt.res)).Interface() - err := ScanFully(d, tt.val, tt.verb) - switch { - case tt.ok && err != nil: - t.Errorf("ScanFully(%T, %q, '%c'): want ok, got error %v", - d, tt.val, tt.verb, err) - case !tt.ok && err == nil: - t.Errorf("ScanFully(%T, %q, '%c'): want error, got %v", - d, tt.val, tt.verb, elem(d)) - case tt.ok && err == nil && !reflect.DeepEqual(tt.res, elem(d)): - t.Errorf("ScanFully(%T, %q, '%c'): want %v, got %v", - d, tt.val, tt.verb, tt.res, elem(d)) - default: - t.Logf("ScanFully(%T, %q, '%c') = %v; *ptr==%v", - d, tt.val, tt.verb, err, elem(d)) - } - } -} diff --git a/Godeps/_workspace/src/gopkg.in/yaml.v2/decode_test.go b/Godeps/_workspace/src/gopkg.in/yaml.v2/decode_test.go deleted file mode 100644 index c159760b6..000000000 --- a/Godeps/_workspace/src/gopkg.in/yaml.v2/decode_test.go +++ /dev/null @@ -1,988 +0,0 @@ -package yaml_test - -import ( - "errors" - . "gopkg.in/check.v1" - "gopkg.in/yaml.v2" - "math" - "net" - "reflect" - "strings" - "time" -) - -var unmarshalIntTest = 123 - -var unmarshalTests = []struct { - data string - value interface{} -}{ - { - "", - &struct{}{}, - }, { - "{}", &struct{}{}, - }, { - "v: hi", - map[string]string{"v": "hi"}, - }, { - "v: hi", map[string]interface{}{"v": "hi"}, - }, { - "v: true", - map[string]string{"v": "true"}, - }, { - "v: true", - map[string]interface{}{"v": true}, - }, { - "v: 10", - map[string]interface{}{"v": 10}, - }, { - "v: 0b10", - map[string]interface{}{"v": 2}, - }, { - "v: 0xA", - map[string]interface{}{"v": 10}, - }, { - "v: 4294967296", - map[string]int64{"v": 4294967296}, - }, { - "v: 0.1", - map[string]interface{}{"v": 0.1}, - }, { - "v: .1", - map[string]interface{}{"v": 0.1}, - }, { - "v: .Inf", - map[string]interface{}{"v": math.Inf(+1)}, - }, { - "v: -.Inf", - map[string]interface{}{"v": math.Inf(-1)}, - }, { - "v: -10", - map[string]interface{}{"v": -10}, - }, { - "v: -.1", - map[string]interface{}{"v": -0.1}, - }, - - // Simple values. - { - "123", - &unmarshalIntTest, - }, - - // Floats from spec - { - "canonical: 6.8523e+5", - map[string]interface{}{"canonical": 6.8523e+5}, - }, { - "expo: 685.230_15e+03", - map[string]interface{}{"expo": 685.23015e+03}, - }, { - "fixed: 685_230.15", - map[string]interface{}{"fixed": 685230.15}, - }, { - "neginf: -.inf", - map[string]interface{}{"neginf": math.Inf(-1)}, - }, { - "fixed: 685_230.15", - map[string]float64{"fixed": 685230.15}, - }, - //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported - //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails. - - // Bools from spec - { - "canonical: y", - map[string]interface{}{"canonical": true}, - }, { - "answer: NO", - map[string]interface{}{"answer": false}, - }, { - "logical: True", - map[string]interface{}{"logical": true}, - }, { - "option: on", - map[string]interface{}{"option": true}, - }, { - "option: on", - map[string]bool{"option": true}, - }, - // Ints from spec - { - "canonical: 685230", - map[string]interface{}{"canonical": 685230}, - }, { - "decimal: +685_230", - map[string]interface{}{"decimal": 685230}, - }, { - "octal: 02472256", - map[string]interface{}{"octal": 685230}, - }, { - "hexa: 0x_0A_74_AE", - map[string]interface{}{"hexa": 685230}, - }, { - "bin: 0b1010_0111_0100_1010_1110", - map[string]interface{}{"bin": 685230}, - }, { - "bin: -0b101010", - map[string]interface{}{"bin": -42}, - }, { - "decimal: +685_230", - map[string]int{"decimal": 685230}, - }, - - //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported - - // Nulls from spec - { - "empty:", - map[string]interface{}{"empty": nil}, - }, { - "canonical: ~", - map[string]interface{}{"canonical": nil}, - }, { - "english: null", - map[string]interface{}{"english": nil}, - }, { - "~: null key", - map[interface{}]string{nil: "null key"}, - }, { - "empty:", - map[string]*bool{"empty": nil}, - }, - - // Flow sequence - { - "seq: [A,B]", - map[string]interface{}{"seq": []interface{}{"A", "B"}}, - }, { - "seq: [A,B,C,]", - map[string][]string{"seq": []string{"A", "B", "C"}}, - }, { - "seq: [A,1,C]", - map[string][]string{"seq": []string{"A", "1", "C"}}, - }, { - "seq: [A,1,C]", - map[string][]int{"seq": []int{1}}, - }, { - "seq: [A,1,C]", - map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, - }, - // Block sequence - { - "seq:\n - A\n - B", - map[string]interface{}{"seq": []interface{}{"A", "B"}}, - }, { - "seq:\n - A\n - B\n - C", - map[string][]string{"seq": []string{"A", "B", "C"}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string][]string{"seq": []string{"A", "1", "C"}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string][]int{"seq": []int{1}}, - }, { - "seq:\n - A\n - 1\n - C", - map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}, - }, - - // Literal block scalar - { - "scalar: | # Comment\n\n literal\n\n \ttext\n\n", - map[string]string{"scalar": "\nliteral\n\n\ttext\n"}, - }, - - // Folded block scalar - { - "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n", - map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"}, - }, - - // Map inside interface with no type hints. - { - "a: {b: c}", - map[interface{}]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, - }, - - // Structs and type conversions. - { - "hello: world", - &struct{ Hello string }{"world"}, - }, { - "a: {b: c}", - &struct{ A struct{ B string } }{struct{ B string }{"c"}}, - }, { - "a: {b: c}", - &struct{ A *struct{ B string } }{&struct{ B string }{"c"}}, - }, { - "a: {b: c}", - &struct{ A map[string]string }{map[string]string{"b": "c"}}, - }, { - "a: {b: c}", - &struct{ A *map[string]string }{&map[string]string{"b": "c"}}, - }, { - "a:", - &struct{ A map[string]string }{}, - }, { - "a: 1", - &struct{ A int }{1}, - }, { - "a: 1", - &struct{ A float64 }{1}, - }, { - "a: 1.0", - &struct{ A int }{1}, - }, { - "a: 1.0", - &struct{ A uint }{1}, - }, { - "a: [1, 2]", - &struct{ A []int }{[]int{1, 2}}, - }, { - "a: 1", - &struct{ B int }{0}, - }, { - "a: 1", - &struct { - B int "a" - }{1}, - }, { - "a: y", - &struct{ A bool }{true}, - }, - - // Some cross type conversions - { - "v: 42", - map[string]uint{"v": 42}, - }, { - "v: -42", - map[string]uint{}, - }, { - "v: 4294967296", - map[string]uint64{"v": 4294967296}, - }, { - "v: -4294967296", - map[string]uint64{}, - }, - - // int - { - "int_max: 2147483647", - map[string]int{"int_max": math.MaxInt32}, - }, - { - "int_min: -2147483648", - map[string]int{"int_min": math.MinInt32}, - }, - { - "int_overflow: 9223372036854775808", // math.MaxInt64 + 1 - map[string]int{}, - }, - - // int64 - { - "int64_max: 9223372036854775807", - map[string]int64{"int64_max": math.MaxInt64}, - }, - { - "int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111", - map[string]int64{"int64_max_base2": math.MaxInt64}, - }, - { - "int64_min: -9223372036854775808", - map[string]int64{"int64_min": math.MinInt64}, - }, - { - "int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111", - map[string]int64{"int64_neg_base2": -math.MaxInt64}, - }, - { - "int64_overflow: 9223372036854775808", // math.MaxInt64 + 1 - map[string]int64{}, - }, - - // uint - { - "uint_min: 0", - map[string]uint{"uint_min": 0}, - }, - { - "uint_max: 4294967295", - map[string]uint{"uint_max": math.MaxUint32}, - }, - { - "uint_underflow: -1", - map[string]uint{}, - }, - - // uint64 - { - "uint64_min: 0", - map[string]uint{"uint64_min": 0}, - }, - { - "uint64_max: 18446744073709551615", - map[string]uint64{"uint64_max": math.MaxUint64}, - }, - { - "uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111", - map[string]uint64{"uint64_max_base2": math.MaxUint64}, - }, - { - "uint64_maxint64: 9223372036854775807", - map[string]uint64{"uint64_maxint64": math.MaxInt64}, - }, - { - "uint64_underflow: -1", - map[string]uint64{}, - }, - - // float32 - { - "float32_max: 3.40282346638528859811704183484516925440e+38", - map[string]float32{"float32_max": math.MaxFloat32}, - }, - { - "float32_nonzero: 1.401298464324817070923729583289916131280e-45", - map[string]float32{"float32_nonzero": math.SmallestNonzeroFloat32}, - }, - { - "float32_maxuint64: 18446744073709551615", - map[string]float32{"float32_maxuint64": float32(math.MaxUint64)}, - }, - { - "float32_maxuint64+1: 18446744073709551616", - map[string]float32{"float32_maxuint64+1": float32(math.MaxUint64 + 1)}, - }, - - // float64 - { - "float64_max: 1.797693134862315708145274237317043567981e+308", - map[string]float64{"float64_max": math.MaxFloat64}, - }, - { - "float64_nonzero: 4.940656458412465441765687928682213723651e-324", - map[string]float64{"float64_nonzero": math.SmallestNonzeroFloat64}, - }, - { - "float64_maxuint64: 18446744073709551615", - map[string]float64{"float64_maxuint64": float64(math.MaxUint64)}, - }, - { - "float64_maxuint64+1: 18446744073709551616", - map[string]float64{"float64_maxuint64+1": float64(math.MaxUint64 + 1)}, - }, - - // Overflow cases. - { - "v: 4294967297", - map[string]int32{}, - }, { - "v: 128", - map[string]int8{}, - }, - - // Quoted values. - { - "'1': '\"2\"'", - map[interface{}]interface{}{"1": "\"2\""}, - }, { - "v:\n- A\n- 'B\n\n C'\n", - map[string][]string{"v": []string{"A", "B\nC"}}, - }, - - // Explicit tags. - { - "v: !!float '1.1'", - map[string]interface{}{"v": 1.1}, - }, { - "v: !!null ''", - map[string]interface{}{"v": nil}, - }, { - "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'", - map[string]interface{}{"v": 1}, - }, - - // Anchors and aliases. - { - "a: &x 1\nb: &y 2\nc: *x\nd: *y\n", - &struct{ A, B, C, D int }{1, 2, 1, 2}, - }, { - "a: &a {c: 1}\nb: *a", - &struct { - A, B struct { - C int - } - }{struct{ C int }{1}, struct{ C int }{1}}, - }, { - "a: &a [1, 2]\nb: *a", - &struct{ B []int }{[]int{1, 2}}, - }, { - "b: *a\na: &a {c: 1}", - &struct { - A, B struct { - C int - } - }{struct{ C int }{1}, struct{ C int }{1}}, - }, - - // Bug #1133337 - { - "foo: ''", - map[string]*string{"foo": new(string)}, - }, { - "foo: null", - map[string]string{"foo": ""}, - }, { - "foo: null", - map[string]interface{}{"foo": nil}, - }, - - // Ignored field - { - "a: 1\nb: 2\n", - &struct { - A int - B int "-" - }{1, 0}, - }, - - // Bug #1191981 - { - "" + - "%YAML 1.1\n" + - "--- !!str\n" + - `"Generic line break (no glyph)\n\` + "\n" + - ` Generic line break (glyphed)\n\` + "\n" + - ` Line separator\u2028\` + "\n" + - ` Paragraph separator\u2029"` + "\n", - "" + - "Generic line break (no glyph)\n" + - "Generic line break (glyphed)\n" + - "Line separator\u2028Paragraph separator\u2029", - }, - - // Struct inlining - { - "a: 1\nb: 2\nc: 3\n", - &struct { - A int - C inlineB `yaml:",inline"` - }{1, inlineB{2, inlineC{3}}}, - }, - - // Map inlining - { - "a: 1\nb: 2\nc: 3\n", - &struct { - A int - C map[string]int `yaml:",inline"` - }{1, map[string]int{"b": 2, "c": 3}}, - }, - - // bug 1243827 - { - "a: -b_c", - map[string]interface{}{"a": "-b_c"}, - }, - { - "a: +b_c", - map[string]interface{}{"a": "+b_c"}, - }, - { - "a: 50cent_of_dollar", - map[string]interface{}{"a": "50cent_of_dollar"}, - }, - - // Duration - { - "a: 3s", - map[string]time.Duration{"a": 3 * time.Second}, - }, - - // Issue #24. - { - "a: ", - map[string]string{"a": ""}, - }, - - // Base 60 floats are obsolete and unsupported. - { - "a: 1:1\n", - map[string]string{"a": "1:1"}, - }, - - // Binary data. - { - "a: !!binary gIGC\n", - map[string]string{"a": "\x80\x81\x82"}, - }, { - "a: !!binary |\n " + strings.Repeat("kJCQ", 17) + "kJ\n CQ\n", - map[string]string{"a": strings.Repeat("\x90", 54)}, - }, { - "a: !!binary |\n " + strings.Repeat("A", 70) + "\n ==\n", - map[string]string{"a": strings.Repeat("\x00", 52)}, - }, - - // Ordered maps. - { - "{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}", - &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}}, - }, - - // Issue #39. - { - "a:\n b:\n c: d\n", - map[string]struct{ B interface{} }{"a": {map[interface{}]interface{}{"c": "d"}}}, - }, - - // Custom map type. - { - "a: {b: c}", - M{"a": M{"b": "c"}}, - }, - - // Support encoding.TextUnmarshaler. - { - "a: 1.2.3.4\n", - map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)}, - }, - { - "a: 2015-02-24T18:19:39Z\n", - map[string]time.Time{"a": time.Unix(1424801979, 0)}, - }, - - // Encode empty lists as zero-length slices. - { - "a: []", - &struct{ A []int }{[]int{}}, - }, - - // UTF-16-LE - { - "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n\x00", - M{"ñoño": "very yes"}, - }, - // UTF-16-LE with surrogate. - { - "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \x00=\xd8\xd4\xdf\n\x00", - M{"ñoño": "very yes 🟔"}, - }, - - // UTF-16-BE - { - "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n", - M{"ñoño": "very yes"}, - }, - // UTF-16-BE with surrogate. - { - "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n", - M{"ñoño": "very yes 🟔"}, - }, -} - -type M map[interface{}]interface{} - -type inlineB struct { - B int - inlineC `yaml:",inline"` -} - -type inlineC struct { - C int -} - -func (s *S) TestUnmarshal(c *C) { - for _, item := range unmarshalTests { - t := reflect.ValueOf(item.value).Type() - var value interface{} - switch t.Kind() { - case reflect.Map: - value = reflect.MakeMap(t).Interface() - case reflect.String: - value = reflect.New(t).Interface() - case reflect.Ptr: - value = reflect.New(t.Elem()).Interface() - default: - c.Fatalf("missing case for %s", t) - } - err := yaml.Unmarshal([]byte(item.data), value) - if _, ok := err.(*yaml.TypeError); !ok { - c.Assert(err, IsNil) - } - if t.Kind() == reflect.String { - c.Assert(*value.(*string), Equals, item.value) - } else { - c.Assert(value, DeepEquals, item.value) - } - } -} - -func (s *S) TestUnmarshalNaN(c *C) { - value := map[string]interface{}{} - err := yaml.Unmarshal([]byte("notanum: .NaN"), &value) - c.Assert(err, IsNil) - c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true) -} - -var unmarshalErrorTests = []struct { - data, error string -}{ - {"v: !!float 'error'", "yaml: cannot decode !!str `error` as a !!float"}, - {"v: [A,", "yaml: line 1: did not find expected node content"}, - {"v:\n- [A,", "yaml: line 2: did not find expected node content"}, - {"a: *b\n", "yaml: unknown anchor 'b' referenced"}, - {"a: &a\n b: *a\n", "yaml: anchor 'a' value contains itself"}, - {"value: -", "yaml: block sequence entries are not allowed in this context"}, - {"a: !!binary ==", "yaml: !!binary value contains invalid base64 data"}, - {"{[.]}", `yaml: invalid map key: \[\]interface \{\}\{"\."\}`}, - {"{{.}}", `yaml: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`}, -} - -func (s *S) TestUnmarshalErrors(c *C) { - for _, item := range unmarshalErrorTests { - var value interface{} - err := yaml.Unmarshal([]byte(item.data), &value) - c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) - } -} - -var unmarshalerTests = []struct { - data, tag string - value interface{} -}{ - {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}}, - {"_: [1,A]", "!!seq", []interface{}{1, "A"}}, - {"_: 10", "!!int", 10}, - {"_: null", "!!null", nil}, - {`_: BAR!`, "!!str", "BAR!"}, - {`_: "BAR!"`, "!!str", "BAR!"}, - {"_: !!foo 'BAR!'", "!!foo", "BAR!"}, -} - -var unmarshalerResult = map[int]error{} - -type unmarshalerType struct { - value interface{} -} - -func (o *unmarshalerType) UnmarshalYAML(unmarshal func(v interface{}) error) error { - if err := unmarshal(&o.value); err != nil { - return err - } - if i, ok := o.value.(int); ok { - if result, ok := unmarshalerResult[i]; ok { - return result - } - } - return nil -} - -type unmarshalerPointer struct { - Field *unmarshalerType "_" -} - -type unmarshalerValue struct { - Field unmarshalerType "_" -} - -func (s *S) TestUnmarshalerPointerField(c *C) { - for _, item := range unmarshalerTests { - obj := &unmarshalerPointer{} - err := yaml.Unmarshal([]byte(item.data), obj) - c.Assert(err, IsNil) - if item.value == nil { - c.Assert(obj.Field, IsNil) - } else { - c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value)) - c.Assert(obj.Field.value, DeepEquals, item.value) - } - } -} - -func (s *S) TestUnmarshalerValueField(c *C) { - for _, item := range unmarshalerTests { - obj := &unmarshalerValue{} - err := yaml.Unmarshal([]byte(item.data), obj) - c.Assert(err, IsNil) - c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value)) - c.Assert(obj.Field.value, DeepEquals, item.value) - } -} - -func (s *S) TestUnmarshalerWholeDocument(c *C) { - obj := &unmarshalerType{} - err := yaml.Unmarshal([]byte(unmarshalerTests[0].data), obj) - c.Assert(err, IsNil) - value, ok := obj.value.(map[interface{}]interface{}) - c.Assert(ok, Equals, true, Commentf("value: %#v", obj.value)) - c.Assert(value["_"], DeepEquals, unmarshalerTests[0].value) -} - -func (s *S) TestUnmarshalerTypeError(c *C) { - unmarshalerResult[2] = &yaml.TypeError{[]string{"foo"}} - unmarshalerResult[4] = &yaml.TypeError{[]string{"bar"}} - defer func() { - delete(unmarshalerResult, 2) - delete(unmarshalerResult, 4) - }() - - type T struct { - Before int - After int - M map[string]*unmarshalerType - } - var v T - data := `{before: A, m: {abc: 1, def: 2, ghi: 3, jkl: 4}, after: B}` - err := yaml.Unmarshal([]byte(data), &v) - c.Assert(err, ErrorMatches, ""+ - "yaml: unmarshal errors:\n"+ - " line 1: cannot unmarshal !!str `A` into int\n"+ - " foo\n"+ - " bar\n"+ - " line 1: cannot unmarshal !!str `B` into int") - c.Assert(v.M["abc"], NotNil) - c.Assert(v.M["def"], IsNil) - c.Assert(v.M["ghi"], NotNil) - c.Assert(v.M["jkl"], IsNil) - - c.Assert(v.M["abc"].value, Equals, 1) - c.Assert(v.M["ghi"].value, Equals, 3) -} - -type proxyTypeError struct{} - -func (v *proxyTypeError) UnmarshalYAML(unmarshal func(interface{}) error) error { - var s string - var a int32 - var b int64 - if err := unmarshal(&s); err != nil { - panic(err) - } - if s == "a" { - if err := unmarshal(&b); err == nil { - panic("should have failed") - } - return unmarshal(&a) - } - if err := unmarshal(&a); err == nil { - panic("should have failed") - } - return unmarshal(&b) -} - -func (s *S) TestUnmarshalerTypeErrorProxying(c *C) { - type T struct { - Before int - After int - M map[string]*proxyTypeError - } - var v T - data := `{before: A, m: {abc: a, def: b}, after: B}` - err := yaml.Unmarshal([]byte(data), &v) - c.Assert(err, ErrorMatches, ""+ - "yaml: unmarshal errors:\n"+ - " line 1: cannot unmarshal !!str `A` into int\n"+ - " line 1: cannot unmarshal !!str `a` into int32\n"+ - " line 1: cannot unmarshal !!str `b` into int64\n"+ - " line 1: cannot unmarshal !!str `B` into int") -} - -type failingUnmarshaler struct{} - -var failingErr = errors.New("failingErr") - -func (ft *failingUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error { - return failingErr -} - -func (s *S) TestUnmarshalerError(c *C) { - err := yaml.Unmarshal([]byte("a: b"), &failingUnmarshaler{}) - c.Assert(err, Equals, failingErr) -} - -type sliceUnmarshaler []int - -func (su *sliceUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error { - var slice []int - err := unmarshal(&slice) - if err == nil { - *su = slice - return nil - } - - var intVal int - err = unmarshal(&intVal) - if err == nil { - *su = []int{intVal} - return nil - } - - return err -} - -func (s *S) TestUnmarshalerRetry(c *C) { - var su sliceUnmarshaler - err := yaml.Unmarshal([]byte("[1, 2, 3]"), &su) - c.Assert(err, IsNil) - c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1, 2, 3})) - - err = yaml.Unmarshal([]byte("1"), &su) - c.Assert(err, IsNil) - c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1})) -} - -// From http://yaml.org/type/merge.html -var mergeTests = ` -anchors: - list: - - &CENTER { "x": 1, "y": 2 } - - &LEFT { "x": 0, "y": 2 } - - &BIG { "r": 10 } - - &SMALL { "r": 1 } - -# All the following maps are equal: - -plain: - # Explicit keys - "x": 1 - "y": 2 - "r": 10 - label: center/big - -mergeOne: - # Merge one map - << : *CENTER - "r": 10 - label: center/big - -mergeMultiple: - # Merge multiple maps - << : [ *CENTER, *BIG ] - label: center/big - -override: - # Override - << : [ *BIG, *LEFT, *SMALL ] - "x": 1 - label: center/big - -shortTag: - # Explicit short merge tag - !!merge "<<" : [ *CENTER, *BIG ] - label: center/big - -longTag: - # Explicit merge long tag - ! "<<" : [ *CENTER, *BIG ] - label: center/big - -inlineMap: - # Inlined map - << : {"x": 1, "y": 2, "r": 10} - label: center/big - -inlineSequenceMap: - # Inlined map in sequence - << : [ *CENTER, {"r": 10} ] - label: center/big -` - -func (s *S) TestMerge(c *C) { - var want = map[interface{}]interface{}{ - "x": 1, - "y": 2, - "r": 10, - "label": "center/big", - } - - var m map[interface{}]interface{} - err := yaml.Unmarshal([]byte(mergeTests), &m) - c.Assert(err, IsNil) - for name, test := range m { - if name == "anchors" { - continue - } - c.Assert(test, DeepEquals, want, Commentf("test %q failed", name)) - } -} - -func (s *S) TestMergeStruct(c *C) { - type Data struct { - X, Y, R int - Label string - } - want := Data{1, 2, 10, "center/big"} - - var m map[string]Data - err := yaml.Unmarshal([]byte(mergeTests), &m) - c.Assert(err, IsNil) - for name, test := range m { - if name == "anchors" { - continue - } - c.Assert(test, Equals, want, Commentf("test %q failed", name)) - } -} - -var unmarshalNullTests = []func() interface{}{ - func() interface{} { var v interface{}; v = "v"; return &v }, - func() interface{} { var s = "s"; return &s }, - func() interface{} { var s = "s"; sptr := &s; return &sptr }, - func() interface{} { var i = 1; return &i }, - func() interface{} { var i = 1; iptr := &i; return &iptr }, - func() interface{} { m := map[string]int{"s": 1}; return &m }, - func() interface{} { m := map[string]int{"s": 1}; return m }, -} - -func (s *S) TestUnmarshalNull(c *C) { - for _, test := range unmarshalNullTests { - item := test() - zero := reflect.Zero(reflect.TypeOf(item).Elem()).Interface() - err := yaml.Unmarshal([]byte("null"), item) - c.Assert(err, IsNil) - if reflect.TypeOf(item).Kind() == reflect.Map { - c.Assert(reflect.ValueOf(item).Interface(), DeepEquals, reflect.MakeMap(reflect.TypeOf(item)).Interface()) - } else { - c.Assert(reflect.ValueOf(item).Elem().Interface(), DeepEquals, zero) - } - } -} - -func (s *S) TestUnmarshalSliceOnPreset(c *C) { - // Issue #48. - v := struct{ A []int }{[]int{1}} - yaml.Unmarshal([]byte("a: [2]"), &v) - c.Assert(v.A, DeepEquals, []int{2}) -} - -//var data []byte -//func init() { -// var err error -// data, err = ioutil.ReadFile("/tmp/file.yaml") -// if err != nil { -// panic(err) -// } -//} -// -//func (s *S) BenchmarkUnmarshal(c *C) { -// var err error -// for i := 0; i < c.N; i++ { -// var v map[string]interface{} -// err = yaml.Unmarshal(data, &v) -// } -// if err != nil { -// panic(err) -// } -//} -// -//func (s *S) BenchmarkMarshal(c *C) { -// var v map[string]interface{} -// yaml.Unmarshal(data, &v) -// c.ResetTimer() -// for i := 0; i < c.N; i++ { -// yaml.Marshal(&v) -// } -//} diff --git a/Godeps/_workspace/src/gopkg.in/yaml.v2/encode_test.go b/Godeps/_workspace/src/gopkg.in/yaml.v2/encode_test.go deleted file mode 100644 index 84099bd38..000000000 --- a/Godeps/_workspace/src/gopkg.in/yaml.v2/encode_test.go +++ /dev/null @@ -1,501 +0,0 @@ -package yaml_test - -import ( - "fmt" - "math" - "strconv" - "strings" - "time" - - . "gopkg.in/check.v1" - "gopkg.in/yaml.v2" - "net" - "os" -) - -var marshalIntTest = 123 - -var marshalTests = []struct { - value interface{} - data string -}{ - { - nil, - "null\n", - }, { - &struct{}{}, - "{}\n", - }, { - map[string]string{"v": "hi"}, - "v: hi\n", - }, { - map[string]interface{}{"v": "hi"}, - "v: hi\n", - }, { - map[string]string{"v": "true"}, - "v: \"true\"\n", - }, { - map[string]string{"v": "false"}, - "v: \"false\"\n", - }, { - map[string]interface{}{"v": true}, - "v: true\n", - }, { - map[string]interface{}{"v": false}, - "v: false\n", - }, { - map[string]interface{}{"v": 10}, - "v: 10\n", - }, { - map[string]interface{}{"v": -10}, - "v: -10\n", - }, { - map[string]uint{"v": 42}, - "v: 42\n", - }, { - map[string]interface{}{"v": int64(4294967296)}, - "v: 4294967296\n", - }, { - map[string]int64{"v": int64(4294967296)}, - "v: 4294967296\n", - }, { - map[string]uint64{"v": 4294967296}, - "v: 4294967296\n", - }, { - map[string]interface{}{"v": "10"}, - "v: \"10\"\n", - }, { - map[string]interface{}{"v": 0.1}, - "v: 0.1\n", - }, { - map[string]interface{}{"v": float64(0.1)}, - "v: 0.1\n", - }, { - map[string]interface{}{"v": -0.1}, - "v: -0.1\n", - }, { - map[string]interface{}{"v": math.Inf(+1)}, - "v: .inf\n", - }, { - map[string]interface{}{"v": math.Inf(-1)}, - "v: -.inf\n", - }, { - map[string]interface{}{"v": math.NaN()}, - "v: .nan\n", - }, { - map[string]interface{}{"v": nil}, - "v: null\n", - }, { - map[string]interface{}{"v": ""}, - "v: \"\"\n", - }, { - map[string][]string{"v": []string{"A", "B"}}, - "v:\n- A\n- B\n", - }, { - map[string][]string{"v": []string{"A", "B\nC"}}, - "v:\n- A\n- |-\n B\n C\n", - }, { - map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}}, - "v:\n- A\n- 1\n- B:\n - 2\n - 3\n", - }, { - map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}, - "a:\n b: c\n", - }, { - map[string]interface{}{"a": "-"}, - "a: '-'\n", - }, - - // Simple values. - { - &marshalIntTest, - "123\n", - }, - - // Structures - { - &struct{ Hello string }{"world"}, - "hello: world\n", - }, { - &struct { - A struct { - B string - } - }{struct{ B string }{"c"}}, - "a:\n b: c\n", - }, { - &struct { - A *struct { - B string - } - }{&struct{ B string }{"c"}}, - "a:\n b: c\n", - }, { - &struct { - A *struct { - B string - } - }{}, - "a: null\n", - }, { - &struct{ A int }{1}, - "a: 1\n", - }, { - &struct{ A []int }{[]int{1, 2}}, - "a:\n- 1\n- 2\n", - }, { - &struct { - B int "a" - }{1}, - "a: 1\n", - }, { - &struct{ A bool }{true}, - "a: true\n", - }, - - // Conditional flag - { - &struct { - A int "a,omitempty" - B int "b,omitempty" - }{1, 0}, - "a: 1\n", - }, { - &struct { - A int "a,omitempty" - B int "b,omitempty" - }{0, 0}, - "{}\n", - }, { - &struct { - A *struct{ X, y int } "a,omitempty,flow" - }{&struct{ X, y int }{1, 2}}, - "a: {x: 1}\n", - }, { - &struct { - A *struct{ X, y int } "a,omitempty,flow" - }{nil}, - "{}\n", - }, { - &struct { - A *struct{ X, y int } "a,omitempty,flow" - }{&struct{ X, y int }{}}, - "a: {x: 0}\n", - }, { - &struct { - A struct{ X, y int } "a,omitempty,flow" - }{struct{ X, y int }{1, 2}}, - "a: {x: 1}\n", - }, { - &struct { - A struct{ X, y int } "a,omitempty,flow" - }{struct{ X, y int }{0, 1}}, - "{}\n", - }, { - &struct { - A float64 "a,omitempty" - B float64 "b,omitempty" - }{1, 0}, - "a: 1\n", - }, - - // Flow flag - { - &struct { - A []int "a,flow" - }{[]int{1, 2}}, - "a: [1, 2]\n", - }, { - &struct { - A map[string]string "a,flow" - }{map[string]string{"b": "c", "d": "e"}}, - "a: {b: c, d: e}\n", - }, { - &struct { - A struct { - B, D string - } "a,flow" - }{struct{ B, D string }{"c", "e"}}, - "a: {b: c, d: e}\n", - }, - - // Unexported field - { - &struct { - u int - A int - }{0, 1}, - "a: 1\n", - }, - - // Ignored field - { - &struct { - A int - B int "-" - }{1, 2}, - "a: 1\n", - }, - - // Struct inlining - { - &struct { - A int - C inlineB `yaml:",inline"` - }{1, inlineB{2, inlineC{3}}}, - "a: 1\nb: 2\nc: 3\n", - }, - - // Map inlining - { - &struct { - A int - C map[string]int `yaml:",inline"` - }{1, map[string]int{"b": 2, "c": 3}}, - "a: 1\nb: 2\nc: 3\n", - }, - - // Duration - { - map[string]time.Duration{"a": 3 * time.Second}, - "a: 3s\n", - }, - - // Issue #24: bug in map merging logic. - { - map[string]string{"a": ""}, - "a: \n", - }, - - // Issue #34: marshal unsupported base 60 floats quoted for compatibility - // with old YAML 1.1 parsers. - { - map[string]string{"a": "1:1"}, - "a: \"1:1\"\n", - }, - - // Binary data. - { - map[string]string{"a": "\x00"}, - "a: \"\\0\"\n", - }, { - map[string]string{"a": "\x80\x81\x82"}, - "a: !!binary gIGC\n", - }, { - map[string]string{"a": strings.Repeat("\x90", 54)}, - "a: !!binary |\n " + strings.Repeat("kJCQ", 17) + "kJ\n CQ\n", - }, - - // Ordered maps. - { - &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}}, - "b: 2\na: 1\nd: 4\nc: 3\nsub:\n e: 5\n", - }, - - // Encode unicode as utf-8 rather than in escaped form. - { - map[string]string{"a": "你好"}, - "a: 你好\n", - }, - - // Support encoding.TextMarshaler. - { - map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)}, - "a: 1.2.3.4\n", - }, - { - map[string]time.Time{"a": time.Unix(1424801979, 0)}, - "a: 2015-02-24T18:19:39Z\n", - }, - - // Ensure strings containing ": " are quoted (reported as PR #43, but not reproducible). - { - map[string]string{"a": "b: c"}, - "a: 'b: c'\n", - }, - - // Containing hash mark ('#') in string should be quoted - { - map[string]string{"a": "Hello #comment"}, - "a: 'Hello #comment'\n", - }, - { - map[string]string{"a": "你好 #comment"}, - "a: '你好 #comment'\n", - }, -} - -func (s *S) TestMarshal(c *C) { - defer os.Setenv("TZ", os.Getenv("TZ")) - os.Setenv("TZ", "UTC") - for _, item := range marshalTests { - data, err := yaml.Marshal(item.value) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, item.data) - } -} - -var marshalErrorTests = []struct { - value interface{} - error string - panic string -}{{ - value: &struct { - B int - inlineB ",inline" - }{1, inlineB{2, inlineC{3}}}, - panic: `Duplicated key 'b' in struct struct \{ B int; .*`, -}, { - value: &struct { - A int - B map[string]int ",inline" - }{1, map[string]int{"a": 2}}, - panic: `Can't have key "a" in inlined map; conflicts with struct field`, -}} - -func (s *S) TestMarshalErrors(c *C) { - for _, item := range marshalErrorTests { - if item.panic != "" { - c.Assert(func() { yaml.Marshal(item.value) }, PanicMatches, item.panic) - } else { - _, err := yaml.Marshal(item.value) - c.Assert(err, ErrorMatches, item.error) - } - } -} - -func (s *S) TestMarshalTypeCache(c *C) { - var data []byte - var err error - func() { - type T struct{ A int } - data, err = yaml.Marshal(&T{}) - c.Assert(err, IsNil) - }() - func() { - type T struct{ B int } - data, err = yaml.Marshal(&T{}) - c.Assert(err, IsNil) - }() - c.Assert(string(data), Equals, "b: 0\n") -} - -var marshalerTests = []struct { - data string - value interface{} -}{ - {"_:\n hi: there\n", map[interface{}]interface{}{"hi": "there"}}, - {"_:\n- 1\n- A\n", []interface{}{1, "A"}}, - {"_: 10\n", 10}, - {"_: null\n", nil}, - {"_: BAR!\n", "BAR!"}, -} - -type marshalerType struct { - value interface{} -} - -func (o marshalerType) MarshalText() ([]byte, error) { - panic("MarshalText called on type with MarshalYAML") -} - -func (o marshalerType) MarshalYAML() (interface{}, error) { - return o.value, nil -} - -type marshalerValue struct { - Field marshalerType "_" -} - -func (s *S) TestMarshaler(c *C) { - for _, item := range marshalerTests { - obj := &marshalerValue{} - obj.Field.value = item.value - data, err := yaml.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, string(item.data)) - } -} - -func (s *S) TestMarshalerWholeDocument(c *C) { - obj := &marshalerType{} - obj.value = map[string]string{"hello": "world!"} - data, err := yaml.Marshal(obj) - c.Assert(err, IsNil) - c.Assert(string(data), Equals, "hello: world!\n") -} - -type failingMarshaler struct{} - -func (ft *failingMarshaler) MarshalYAML() (interface{}, error) { - return nil, failingErr -} - -func (s *S) TestMarshalerError(c *C) { - _, err := yaml.Marshal(&failingMarshaler{}) - c.Assert(err, Equals, failingErr) -} - -func (s *S) TestSortedOutput(c *C) { - order := []interface{}{ - false, - true, - 1, - uint(1), - 1.0, - 1.1, - 1.2, - 2, - uint(2), - 2.0, - 2.1, - "", - ".1", - ".2", - ".a", - "1", - "2", - "a!10", - "a/2", - "a/10", - "a~10", - "ab/1", - "b/1", - "b/01", - "b/2", - "b/02", - "b/3", - "b/03", - "b1", - "b01", - "b3", - "c2.10", - "c10.2", - "d1", - "d12", - "d12a", - } - m := make(map[interface{}]int) - for _, k := range order { - m[k] = 1 - } - data, err := yaml.Marshal(m) - c.Assert(err, IsNil) - out := "\n" + string(data) - last := 0 - for i, k := range order { - repr := fmt.Sprint(k) - if s, ok := k.(string); ok { - if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil { - repr = `"` + repr + `"` - } - } - index := strings.Index(out, "\n"+repr+":") - if index == -1 { - c.Fatalf("%#v is not in the output: %#v", k, out) - } - if index < last { - c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out) - } - last = index - } -} diff --git a/Godeps/_workspace/src/gopkg.in/yaml.v2/suite_test.go b/Godeps/_workspace/src/gopkg.in/yaml.v2/suite_test.go deleted file mode 100644 index c5cf1ed4f..000000000 --- a/Godeps/_workspace/src/gopkg.in/yaml.v2/suite_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package yaml_test - -import ( - . "gopkg.in/check.v1" - "testing" -) - -func Test(t *testing.T) { TestingT(t) } - -type S struct{} - -var _ = Suite(&S{}) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/install/install_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/install/install_test.go deleted file mode 100644 index 87f1ef65d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/install/install_test.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 install - -import ( - "encoding/json" - "testing" - - "k8s.io/kubernetes/federation/apis/federation" - "k8s.io/kubernetes/federation/apis/federation/v1alpha1" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestResourceVersioner(t *testing.T) { - cluster := federation.Cluster{ObjectMeta: api.ObjectMeta{ResourceVersion: "10"}} - version, err := accessor.ResourceVersion(&cluster) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } - - clusterList := federation.ClusterList{ListMeta: unversioned.ListMeta{ResourceVersion: "10"}} - version, err = accessor.ResourceVersion(&clusterList) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } -} - -func TestCodec(t *testing.T) { - cluster := federation.Cluster{} - // We do want to use package registered rather than testapi here, because we - // want to test if the package install and package registered work as expected. - data, err := runtime.Encode(api.Codecs.LegacyCodec(registered.GroupOrDie(federation.GroupName).GroupVersion), &cluster) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - other := federation.Cluster{} - if err := json.Unmarshal(data, &other); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if other.APIVersion != registered.GroupOrDie(federation.GroupName).GroupVersion.String() || other.Kind != "Cluster" { - t.Errorf("unexpected unmarshalled object %#v", other) - } -} - -func TestInterfacesFor(t *testing.T) { - if _, err := registered.GroupOrDie(federation.GroupName).InterfacesFor(federation.SchemeGroupVersion); err == nil { - t.Fatalf("unexpected non-error: %v", err) - } - for i, version := range registered.GroupOrDie(federation.GroupName).GroupVersions { - if vi, err := registered.GroupOrDie(federation.GroupName).InterfacesFor(version); err != nil || vi == nil { - t.Fatalf("%d: unexpected result: %v", i, err) - } - } -} - -func TestRESTMapper(t *testing.T) { - gv := v1alpha1.SchemeGroupVersion - clusterGVK := gv.WithKind("Cluster") - - if gvk, err := registered.GroupOrDie(federation.GroupName).RESTMapper.KindFor(gv.WithResource("clusters")); err != nil || gvk != clusterGVK { - t.Errorf("unexpected version mapping: %v %v", gvk, err) - } - - if m, err := registered.GroupOrDie(federation.GroupName).RESTMapper.RESTMapping(clusterGVK.GroupKind(), ""); err != nil || m.GroupVersionKind != clusterGVK || m.Resource != "clusters" { - t.Errorf("unexpected version mapping: %#v %v", m, err) - } - - for _, version := range registered.GroupOrDie(federation.GroupName).GroupVersions { - mapping, err := registered.GroupOrDie(federation.GroupName).RESTMapper.RESTMapping(clusterGVK.GroupKind(), version.Version) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if mapping.Resource != "clusters" { - t.Errorf("incorrect resource name: %#v", mapping) - } - if mapping.GroupVersionKind.GroupVersion() != version { - t.Errorf("incorrect groupVersion: %v", mapping) - } - - interfaces, _ := registered.GroupOrDie(federation.GroupName).InterfacesFor(version) - if mapping.ObjectConvertor != interfaces.ObjectConvertor { - t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) - } - - rc := &federation.Cluster{ObjectMeta: api.ObjectMeta{Name: "foo"}} - name, err := mapping.MetadataAccessor.Name(rc) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if name != "foo" { - t.Errorf("unable to retrieve object meta with: %v", mapping.MetadataAccessor) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation.go deleted file mode 100644 index f6f3dac48..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "k8s.io/kubernetes/federation/apis/federation" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func ValidateClusterName(name string, prefix bool) (bool, string) { - return validation.NameIsDNSSubdomain(name, prefix) -} - -func ValidateClusterSpec(spec *federation.ClusterSpec, fieldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - // address is required. - if len(spec.ServerAddressByClientCIDRs) == 0 { - allErrs = append(allErrs, field.Required(fieldPath.Child("serverAddressByClientCIDRs"), "")) - } - return allErrs -} - -func ValidateCluster(cluster *federation.Cluster) field.ErrorList { - allErrs := validation.ValidateObjectMeta(&cluster.ObjectMeta, false, ValidateClusterName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateClusterSpec(&cluster.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateClusterUpdate(cluster, oldCluster *federation.Cluster) field.ErrorList { - allErrs := validation.ValidateObjectMetaUpdate(&cluster.ObjectMeta, &oldCluster.ObjectMeta, field.NewPath("metadata")) - if cluster.Name != oldCluster.Name { - allErrs = append(allErrs, field.Invalid(field.NewPath("meta", "name"), - cluster.Name+" != "+oldCluster.Name, "cannot change cluster name")) - } - return allErrs -} - -func ValidateClusterStatusUpdate(cluster, oldCluster *federation.Cluster) field.ErrorList { - allErrs := validation.ValidateObjectMetaUpdate(&cluster.ObjectMeta, &oldCluster.ObjectMeta, field.NewPath("metadata")) - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation_test.go deleted file mode 100644 index d68883675..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/federation/apis/federation/validation/validation_test.go +++ /dev/null @@ -1,206 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "testing" - - "k8s.io/kubernetes/federation/apis/federation" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -func TestValidateCluster(t *testing.T) { - successCases := []federation.Cluster{ - { - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - }, - } - for _, successCase := range successCases { - errs := ValidateCluster(&successCase) - if len(errs) != 0 { - t.Errorf("expect success: %v", errs) - } - } - - errorCases := map[string]federation.Cluster{ - "missing cluster addresses": { - ObjectMeta: api.ObjectMeta{Name: "cluster-f"}, - }, - "empty cluster addresses": { - ObjectMeta: api.ObjectMeta{Name: "cluster-f"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{}, - }}, - "invalid_label": { - ObjectMeta: api.ObjectMeta{ - Name: "cluster-f", - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - }, - } - for testName, errorCase := range errorCases { - errs := ValidateCluster(&errorCase) - if len(errs) == 0 { - t.Errorf("expected failur for %s", testName) - } - } -} - -func TestValidateClusterUpdate(t *testing.T) { - type clusterUpdateTest struct { - old federation.Cluster - update federation.Cluster - } - successCases := []clusterUpdateTest{ - { - old: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - }, - update: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - errs := ValidateClusterUpdate(&successCase.update, &successCase.old) - if len(errs) != 0 { - t.Errorf("expect success: %v", errs) - } - } - - errorCases := map[string]clusterUpdateTest{ - "cluster name changed": { - old: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - }, - update: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-newname"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - }, - }, - } - for testName, errorCase := range errorCases { - errs := ValidateClusterUpdate(&errorCase.update, &errorCase.old) - if len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} - -func TestValidateClusterStatusUpdate(t *testing.T) { - type clusterUpdateTest struct { - old federation.Cluster - update federation.Cluster - } - successCases := []clusterUpdateTest{ - { - old: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - Status: federation.ClusterStatus{ - Conditions: []federation.ClusterCondition{ - {Type: federation.ClusterReady, Status: api.ConditionTrue}, - }, - }, - }, - update: federation.Cluster{ - ObjectMeta: api.ObjectMeta{Name: "cluster-s"}, - Spec: federation.ClusterSpec{ - ServerAddressByClientCIDRs: []unversioned.ServerAddressByClientCIDR{ - { - ClientCIDR: "0.0.0.0/0", - ServerAddress: "localhost:8888", - }, - }, - }, - Status: federation.ClusterStatus{ - Conditions: []federation.ClusterCondition{ - {Type: federation.ClusterReady, Status: api.ConditionTrue}, - {Type: federation.ClusterOffline, Status: api.ConditionTrue}, - }, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - errs := ValidateClusterUpdate(&successCase.update, &successCase.old) - if len(errs) != 0 { - t.Errorf("expect success: %v", errs) - } - } - - errorCases := map[string]clusterUpdateTest{} - for testName, errorCase := range errorCases { - errs := ValidateClusterStatusUpdate(&errorCase.update, &errorCase.old) - if len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/context_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/context_test.go deleted file mode 100644 index c384999ff..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/context_test.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -// TestNamespaceContext validates that a namespace can be get/set on a context object -func TestNamespaceContext(t *testing.T) { - ctx := api.NewDefaultContext() - result, ok := api.NamespaceFrom(ctx) - if !ok { - t.Errorf("Error getting namespace") - } - if api.NamespaceDefault != result { - t.Errorf("Expected: %v, Actual: %v", api.NamespaceDefault, result) - } - - ctx = api.NewContext() - result, ok = api.NamespaceFrom(ctx) - if ok { - t.Errorf("Should not be ok because there is no namespace on the context") - } -} - -// TestValidNamespace validates that namespace rules are enforced on a resource prior to create or update -func TestValidNamespace(t *testing.T) { - ctx := api.NewDefaultContext() - namespace, _ := api.NamespaceFrom(ctx) - resource := api.ReplicationController{} - if !api.ValidNamespace(ctx, &resource.ObjectMeta) { - t.Errorf("expected success") - } - if namespace != resource.Namespace { - t.Errorf("expected resource to have the default namespace assigned during validation") - } - resource = api.ReplicationController{ObjectMeta: api.ObjectMeta{Namespace: "other"}} - if api.ValidNamespace(ctx, &resource.ObjectMeta) { - t.Errorf("Expected error that resource and context errors do not match because resource has different namespace") - } - ctx = api.NewContext() - if api.ValidNamespace(ctx, &resource.ObjectMeta) { - t.Errorf("Expected error that resource and context errors do not match since context has no namespace") - } - - ctx = api.NewContext() - ns := api.NamespaceValue(ctx) - if ns != "" { - t.Errorf("Expected the empty string") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/conversion_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/conversion_test.go deleted file mode 100644 index 2a91f0aec..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/conversion_test.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "io/ioutil" - "math/rand" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/runtime" -) - -func BenchmarkPodConversion(b *testing.B) { - apiObjectFuzzer := apitesting.FuzzerFor(nil, api.SchemeGroupVersion, rand.NewSource(benchmarkSeed)) - items := make([]api.Pod, 4) - for i := range items { - apiObjectFuzzer.Fuzz(&items[i]) - } - - // add a fixed item - data, err := ioutil.ReadFile("pod_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var pod api.Pod - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &pod); err != nil { - b.Fatalf("Unexpected error decoding pod: %v", err) - } - items = append(items, pod) - width := len(items) - - scheme := api.Scheme - var result *api.Pod - for i := 0; i < b.N; i++ { - pod := &items[i%width] - versionedObj, err := scheme.ConvertToVersion(pod, testapi.Default.GroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - result = obj.(*api.Pod) - } - b.Log(result) -} - -func BenchmarkNodeConversion(b *testing.B) { - data, err := ioutil.ReadFile("node_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var node api.Node - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { - b.Fatalf("Unexpected error decoding node: %v", err) - } - - scheme := api.Scheme - var result *api.Node - for i := 0; i < b.N; i++ { - versionedObj, err := scheme.ConvertToVersion(&node, testapi.Default.GroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - result = obj.(*api.Node) - } - if !api.Semantic.DeepDerivative(node, *result) { - b.Fatalf("Incorrect conversion: expected %v, got %v", node, *result) - } -} - -func BenchmarkReplicationControllerConversion(b *testing.B) { - data, err := ioutil.ReadFile("replication_controller_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var replicationController api.ReplicationController - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { - b.Fatalf("Unexpected error decoding node: %v", err) - } - - scheme := api.Scheme - var result *api.ReplicationController - for i := 0; i < b.N; i++ { - versionedObj, err := scheme.ConvertToVersion(&replicationController, testapi.Default.GroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - obj, err := scheme.ConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion().String()) - if err != nil { - b.Fatalf("Conversion error: %v", err) - } - result = obj.(*api.ReplicationController) - } - if !api.Semantic.DeepDerivative(replicationController, *result) { - b.Fatalf("Incorrect conversion: expected %v, got %v", replicationController, *result) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/copy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/copy_test.go deleted file mode 100644 index af81d0273..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/copy_test.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "math/rand" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/util/diff" - - "github.com/google/gofuzz" -) - -func TestDeepCopyApiObjects(t *testing.T) { - for i := 0; i < *fuzzIters; i++ { - for _, version := range []unversioned.GroupVersion{testapi.Default.InternalGroupVersion(), *testapi.Default.GroupVersion()} { - f := apitesting.FuzzerFor(t, version, rand.NewSource(rand.Int63())) - for kind := range api.Scheme.KnownTypes(version) { - doDeepCopyTest(t, version.WithKind(kind), f) - } - } - } -} - -func doDeepCopyTest(t *testing.T, kind unversioned.GroupVersionKind, f *fuzz.Fuzzer) { - item, err := api.Scheme.New(kind) - if err != nil { - t.Fatalf("Could not create a %v: %s", kind, err) - } - f.Fuzz(item) - itemCopy, err := api.Scheme.DeepCopy(item) - if err != nil { - t.Errorf("Could not deep copy a %v: %s", kind, err) - return - } - - if !reflect.DeepEqual(item, itemCopy) { - t.Errorf("\nexpected: %#v\n\ngot: %#v\n\ndiff: %v", item, itemCopy, diff.ObjectGoPrintSideBySide(item, itemCopy)) - } -} - -func TestDeepCopySingleType(t *testing.T) { - for i := 0; i < *fuzzIters; i++ { - for _, version := range []unversioned.GroupVersion{testapi.Default.InternalGroupVersion(), *testapi.Default.GroupVersion()} { - f := apitesting.FuzzerFor(t, version, rand.NewSource(rand.Int63())) - doDeepCopyTest(t, version.WithKind("Pod"), f) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/deep_copy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/deep_copy_test.go deleted file mode 100644 index a251623a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/deep_copy_test.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "io/ioutil" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/runtime" -) - -func BenchmarkPodCopy(b *testing.B) { - data, err := ioutil.ReadFile("pod_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var pod api.Pod - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &pod); err != nil { - b.Fatalf("Unexpected error decoding pod: %v", err) - } - - var result *api.Pod - for i := 0; i < b.N; i++ { - obj, err := api.Scheme.DeepCopy(&pod) - if err != nil { - b.Fatalf("Unexpected error copying pod: %v", err) - } - result = obj.(*api.Pod) - } - if !api.Semantic.DeepEqual(pod, *result) { - b.Fatalf("Incorrect copy: expected %v, got %v", pod, *result) - } -} - -func BenchmarkNodeCopy(b *testing.B) { - data, err := ioutil.ReadFile("node_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var node api.Node - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { - b.Fatalf("Unexpected error decoding node: %v", err) - } - - var result *api.Node - for i := 0; i < b.N; i++ { - obj, err := api.Scheme.DeepCopy(&node) - if err != nil { - b.Fatalf("Unexpected error copying node: %v", err) - } - result = obj.(*api.Node) - } - if !api.Semantic.DeepEqual(node, *result) { - b.Fatalf("Incorrect copy: expected %v, got %v", node, *result) - } -} - -func BenchmarkReplicationControllerCopy(b *testing.B) { - data, err := ioutil.ReadFile("replication_controller_example.json") - if err != nil { - b.Fatalf("Unexpected error while reading file: %v", err) - } - var replicationController api.ReplicationController - if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { - b.Fatalf("Unexpected error decoding node: %v", err) - } - - var result *api.ReplicationController - for i := 0; i < b.N; i++ { - obj, err := api.Scheme.DeepCopy(&replicationController) - if err != nil { - b.Fatalf("Unexpected error copying replication controller: %v", err) - } - result = obj.(*api.ReplicationController) - } - if !api.Semantic.DeepEqual(replicationController, *result) { - b.Fatalf("Incorrect copy: expected %v, got %v", replicationController, *result) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/endpoints/util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/endpoints/util_test.go deleted file mode 100644 index a2f960317..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/endpoints/util_test.go +++ /dev/null @@ -1,444 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 endpoints - -import ( - "reflect" - "testing" - - "github.com/davecgh/go-spew/spew" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/types" -) - -func podRef(uid string) *api.ObjectReference { - ref := api.ObjectReference{UID: types.UID(uid)} - return &ref -} - -func TestPackSubsets(t *testing.T) { - // The downside of table-driven tests is that some things have to live outside the table. - fooObjRef := api.ObjectReference{Name: "foo"} - barObjRef := api.ObjectReference{Name: "bar"} - - testCases := []struct { - name string - given []api.EndpointSubset - expect []api.EndpointSubset - }{ - { - name: "empty everything", - given: []api.EndpointSubset{{Addresses: []api.EndpointAddress{}, Ports: []api.EndpointPort{}}}, - expect: []api.EndpointSubset{}, - }, { - name: "empty addresses", - given: []api.EndpointSubset{{Addresses: []api.EndpointAddress{}, Ports: []api.EndpointPort{{Port: 111}}}}, - expect: []api.EndpointSubset{}, - }, { - name: "empty ports", - given: []api.EndpointSubset{{Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, Ports: []api.EndpointPort{}}}, - expect: []api.EndpointSubset{}, - }, { - name: "empty ports", - given: []api.EndpointSubset{{NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, Ports: []api.EndpointPort{}}}, - expect: []api.EndpointSubset{}, - }, { - name: "one set, one ip, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one notReady ip, one port", - given: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one ip, one UID, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one notReady ip, one UID, one port", - given: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one ip, empty UID, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one notReady ip, empty UID, one port", - given: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, two ips, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, two mixed ips, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - NotReadyAddresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - NotReadyAddresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, two duplicate ips, one port, notReady is covered by ready", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one ip, two ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}, {Port: 222}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}, {Port: 222}}, - }}, - }, { - name: "one set, dup ips, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, dup ips with target-refs, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: &fooObjRef}, - {IP: "1.2.3.4", TargetRef: &barObjRef}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &fooObjRef}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, dup mixed ips with target-refs, one port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: &fooObjRef}, - }, - NotReadyAddresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: &barObjRef}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - // finding the same address twice is considered an error on input, only the first address+port - // reference is preserved - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &fooObjRef}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "one set, one ip, dup ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}, {Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, dup ip, dup port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, dup mixed ip, dup port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, dup ip, two ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}, {Port: 222}}, - }}, - }, { - name: "two sets, dup ip, dup uids, two ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}, {Port: 222}}, - }}, - }, { - name: "two sets, dup mixed ip, dup uids, two ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - }, { - name: "two sets, two ips, dup port", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two set, dup ip, two uids, dup ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-2")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: podRef("uid-1")}, - {IP: "1.2.3.4", TargetRef: podRef("uid-2")}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two set, dup ip, with and without uid, dup ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-2")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4"}, - {IP: "1.2.3.4", TargetRef: podRef("uid-2")}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, two ips, two dup ip with uid, dup port, wrong order", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "5.6.7.8", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4"}, - {IP: "1.2.3.4", TargetRef: podRef("uid-1")}, - {IP: "5.6.7.8"}, - {IP: "5.6.7.8", TargetRef: podRef("uid-1")}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, two mixed ips, two dup ip with uid, dup port, wrong order, ends up with split addresses", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "5.6.7.8", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: podRef("uid-1")}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "5.6.7.8"}, - }, - NotReadyAddresses: []api.EndpointAddress{ - {IP: "1.2.3.4"}, - {IP: "1.2.3.4", TargetRef: podRef("uid-1")}, - {IP: "5.6.7.8", TargetRef: podRef("uid-1")}, - }, - Ports: []api.EndpointPort{{Port: 111}}, - }}, - }, { - name: "two sets, two ips, two ports", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "5.6.7.8"}}, - Ports: []api.EndpointPort{{Port: 222}}, - }}, - }, { - name: "four sets, three ips, three ports, jumbled", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 222}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.6"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 333}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "1.2.3.6"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 222}, {Port: 333}}, - }}, - }, { - name: "four sets, three mixed ips, three ports, jumbled", - given: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 222}}, - }, { - Addresses: []api.EndpointAddress{{IP: "1.2.3.6"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 333}}, - }}, - expect: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4"}, {IP: "1.2.3.6"}}, - Ports: []api.EndpointPort{{Port: 111}}, - }, { - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.5"}}, - Ports: []api.EndpointPort{{Port: 222}, {Port: 333}}, - }}, - }, - } - - for _, tc := range testCases { - result := RepackSubsets(tc.given) - if !reflect.DeepEqual(result, SortSubsets(tc.expect)) { - t.Errorf("case %q: expected %s, got %s", tc.name, spew.Sprintf("%#v", SortSubsets(tc.expect)), spew.Sprintf("%#v", result)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/errors_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/errors_test.go deleted file mode 100644 index 066bb25f2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/errors_test.go +++ /dev/null @@ -1,189 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 errors - -import ( - "errors" - "fmt" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestErrorNew(t *testing.T) { - err := NewAlreadyExists(api.Resource("tests"), "1") - if !IsAlreadyExists(err) { - t.Errorf("expected to be %s", unversioned.StatusReasonAlreadyExists) - } - if IsConflict(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonConflict) - } - if IsNotFound(err) { - t.Errorf(fmt.Sprintf("expected to not be %s", unversioned.StatusReasonNotFound)) - } - if IsInvalid(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonInvalid) - } - if IsBadRequest(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonBadRequest) - } - if IsForbidden(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonForbidden) - } - if IsServerTimeout(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonServerTimeout) - } - if IsMethodNotSupported(err) { - t.Errorf("expected to not be %s", unversioned.StatusReasonMethodNotAllowed) - } - - if !IsConflict(NewConflict(api.Resource("tests"), "2", errors.New("message"))) { - t.Errorf("expected to be conflict") - } - if !IsNotFound(NewNotFound(api.Resource("tests"), "3")) { - t.Errorf("expected to be %s", unversioned.StatusReasonNotFound) - } - if !IsInvalid(NewInvalid(api.Kind("Test"), "2", nil)) { - t.Errorf("expected to be %s", unversioned.StatusReasonInvalid) - } - if !IsBadRequest(NewBadRequest("reason")) { - t.Errorf("expected to be %s", unversioned.StatusReasonBadRequest) - } - if !IsForbidden(NewForbidden(api.Resource("tests"), "2", errors.New("reason"))) { - t.Errorf("expected to be %s", unversioned.StatusReasonForbidden) - } - if !IsUnauthorized(NewUnauthorized("reason")) { - t.Errorf("expected to be %s", unversioned.StatusReasonUnauthorized) - } - if !IsServerTimeout(NewServerTimeout(api.Resource("tests"), "reason", 0)) { - t.Errorf("expected to be %s", unversioned.StatusReasonServerTimeout) - } - if time, ok := SuggestsClientDelay(NewServerTimeout(api.Resource("tests"), "doing something", 10)); time != 10 || !ok { - t.Errorf("expected to be %s", unversioned.StatusReasonServerTimeout) - } - if time, ok := SuggestsClientDelay(NewTimeoutError("test reason", 10)); time != 10 || !ok { - t.Errorf("expected to be %s", unversioned.StatusReasonTimeout) - } - if !IsMethodNotSupported(NewMethodNotSupported(api.Resource("foos"), "delete")) { - t.Errorf("expected to be %s", unversioned.StatusReasonMethodNotAllowed) - } -} - -func TestNewInvalid(t *testing.T) { - testCases := []struct { - Err *field.Error - Details *unversioned.StatusDetails - }{ - { - field.Duplicate(field.NewPath("field[0].name"), "bar"), - &unversioned.StatusDetails{ - Kind: "Kind", - Name: "name", - Causes: []unversioned.StatusCause{{ - Type: unversioned.CauseTypeFieldValueDuplicate, - Field: "field[0].name", - }}, - }, - }, - { - field.Invalid(field.NewPath("field[0].name"), "bar", "detail"), - &unversioned.StatusDetails{ - Kind: "Kind", - Name: "name", - Causes: []unversioned.StatusCause{{ - Type: unversioned.CauseTypeFieldValueInvalid, - Field: "field[0].name", - }}, - }, - }, - { - field.NotFound(field.NewPath("field[0].name"), "bar"), - &unversioned.StatusDetails{ - Kind: "Kind", - Name: "name", - Causes: []unversioned.StatusCause{{ - Type: unversioned.CauseTypeFieldValueNotFound, - Field: "field[0].name", - }}, - }, - }, - { - field.NotSupported(field.NewPath("field[0].name"), "bar", nil), - &unversioned.StatusDetails{ - Kind: "Kind", - Name: "name", - Causes: []unversioned.StatusCause{{ - Type: unversioned.CauseTypeFieldValueNotSupported, - Field: "field[0].name", - }}, - }, - }, - { - field.Required(field.NewPath("field[0].name"), ""), - &unversioned.StatusDetails{ - Kind: "Kind", - Name: "name", - Causes: []unversioned.StatusCause{{ - Type: unversioned.CauseTypeFieldValueRequired, - Field: "field[0].name", - }}, - }, - }, - } - for i, testCase := range testCases { - vErr, expected := testCase.Err, testCase.Details - expected.Causes[0].Message = vErr.ErrorBody() - err := NewInvalid(api.Kind("Kind"), "name", field.ErrorList{vErr}) - status := err.(*StatusError).ErrStatus - if status.Code != 422 || status.Reason != unversioned.StatusReasonInvalid { - t.Errorf("%d: unexpected status: %#v", i, status) - } - if !reflect.DeepEqual(expected, status.Details) { - t.Errorf("%d: expected %#v, got %#v", i, expected, status.Details) - } - } -} - -func Test_reasonForError(t *testing.T) { - if e, a := unversioned.StatusReasonUnknown, reasonForError(nil); e != a { - t.Errorf("unexpected reason type: %#v", a) - } -} - -type TestType struct{} - -func (obj *TestType) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -func TestFromObject(t *testing.T) { - table := []struct { - obj runtime.Object - message string - }{ - {&unversioned.Status{Message: "foobar"}, "foobar"}, - {&TestType{}, "unexpected object: &{}"}, - } - - for _, item := range table { - if e, a := item.message, FromObject(item.obj).Error(); e != a { - t.Errorf("Expected %v, got %v", e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/doc.go deleted file mode 100644 index a2a550526..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd provides conversion of etcd errors to API errors. -package storage diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/storage.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/storage.go deleted file mode 100644 index 2a22b4f17..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/errors/storage/storage.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 storage - -import ( - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/storage" -) - -// InterpretListError converts a generic error on a retrieval -// operation into the appropriate API error. -func InterpretListError(err error, qualifiedResource unversioned.GroupResource) error { - switch { - case storage.IsNotFound(err): - return errors.NewNotFound(qualifiedResource, "") - case storage.IsUnreachable(err): - return errors.NewServerTimeout(qualifiedResource, "list", 2) // TODO: make configurable or handled at a higher level - default: - return err - } -} - -// InterpretGetError converts a generic error on a retrieval -// operation into the appropriate API error. -func InterpretGetError(err error, qualifiedResource unversioned.GroupResource, name string) error { - switch { - case storage.IsNotFound(err): - return errors.NewNotFound(qualifiedResource, name) - case storage.IsUnreachable(err): - return errors.NewServerTimeout(qualifiedResource, "get", 2) // TODO: make configurable or handled at a higher level - default: - return err - } -} - -// InterpretCreateError converts a generic error on a create -// operation into the appropriate API error. -func InterpretCreateError(err error, qualifiedResource unversioned.GroupResource, name string) error { - switch { - case storage.IsNodeExist(err): - return errors.NewAlreadyExists(qualifiedResource, name) - case storage.IsUnreachable(err): - return errors.NewServerTimeout(qualifiedResource, "create", 2) // TODO: make configurable or handled at a higher level - default: - return err - } -} - -// InterpretUpdateError converts a generic error on a update -// operation into the appropriate API error. -func InterpretUpdateError(err error, qualifiedResource unversioned.GroupResource, name string) error { - switch { - case storage.IsTestFailed(err), storage.IsNodeExist(err): - return errors.NewConflict(qualifiedResource, name, err) - case storage.IsUnreachable(err): - return errors.NewServerTimeout(qualifiedResource, "update", 2) // TODO: make configurable or handled at a higher level - case storage.IsNotFound(err): - return errors.NewNotFound(qualifiedResource, name) - case storage.IsInternalError(err): - return errors.NewInternalError(err) - default: - return err - } -} - -// InterpretDeleteError converts a generic error on a delete -// operation into the appropriate API error. -func InterpretDeleteError(err error, qualifiedResource unversioned.GroupResource, name string) error { - switch { - case storage.IsNotFound(err): - return errors.NewNotFound(qualifiedResource, name) - case storage.IsUnreachable(err): - return errors.NewServerTimeout(qualifiedResource, "delete", 2) // TODO: make configurable or handled at a higher level - case storage.IsTestFailed(err), storage.IsNodeExist(err): - return errors.NewConflict(qualifiedResource, name, err) - case storage.IsInternalError(err): - return errors.NewInternalError(err) - default: - return err - } -} - -// InterpretWatchError converts a generic error on a watch -// operation into the appropriate API error. -func InterpretWatchError(err error, resource unversioned.GroupResource, name string) error { - switch { - case storage.IsInvalidError(err): - invalidError, _ := err.(storage.InvalidError) - return errors.NewInvalid(unversioned.GroupKind{Group: resource.Group, Kind: resource.Resource}, name, invalidError.Errs) - default: - return err - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/generate_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/generate_test.go deleted file mode 100644 index fe3cf812b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/generate_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "strings" - "testing" -) - -type nameGeneratorFunc func(base string) string - -func (fn nameGeneratorFunc) GenerateName(base string) string { - return fn(base) -} - -func TestGenerateName(t *testing.T) { - testCases := []struct { - meta ObjectMeta - - base string - returned string - }{ - { - returned: "", - }, - { - meta: ObjectMeta{ - GenerateName: "test", - }, - base: "test", - returned: "test", - }, - { - meta: ObjectMeta{ - Name: "foo", - GenerateName: "test", - }, - base: "test", - returned: "foo", - }, - } - - for i, testCase := range testCases { - GenerateName(nameGeneratorFunc(func(base string) string { - if base != testCase.base { - t.Errorf("%d: unexpected call with base", i) - } - return "test" - }), &testCase.meta) - expect := testCase.returned - if expect != testCase.meta.Name { - t.Errorf("%d: unexpected name: %#v", i, testCase.meta) - } - } -} - -func TestSimpleNameGenerator(t *testing.T) { - meta := &ObjectMeta{ - GenerateName: "foo", - } - GenerateName(SimpleNameGenerator, meta) - if !strings.HasPrefix(meta.Name, "foo") || meta.Name == "foo" { - t.Errorf("unexpected name: %#v", meta) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/helpers_test.go deleted file mode 100644 index 2d6bd488f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/helpers_test.go +++ /dev/null @@ -1,299 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/labels" - - "speter.net/go/exp/math/dec/inf" -) - -func TestConversionError(t *testing.T) { - var i int - var s string - i = 3 - s = "foo" - c := ConversionError{ - In: &i, Out: &s, - Message: "Can't make x into y, silly", - } - var e error - e = &c // ensure it implements error - msg := e.Error() - t.Logf("Message is %v", msg) - for _, part := range []string{"3", "int", "string", "Can't"} { - if !strings.Contains(msg, part) { - t.Errorf("didn't find %v", part) - } - } -} - -func TestSemantic(t *testing.T) { - table := []struct { - a, b interface{} - shouldEqual bool - }{ - {resource.MustParse("0"), resource.Quantity{}, true}, - {resource.Quantity{}, resource.MustParse("0"), true}, - {resource.Quantity{}, resource.MustParse("1m"), false}, - { - resource.Quantity{Amount: inf.NewDec(5, 0), Format: resource.BinarySI}, - resource.Quantity{Amount: inf.NewDec(5, 0), Format: resource.DecimalSI}, - true, - }, - {resource.MustParse("2m"), resource.MustParse("1m"), false}, - } - - for index, item := range table { - if e, a := item.shouldEqual, Semantic.DeepEqual(item.a, item.b); e != a { - t.Errorf("case[%d], expected %v, got %v.", index, e, a) - } - } -} - -func TestIsStandardResource(t *testing.T) { - testCases := []struct { - input string - output bool - }{ - {"cpu", true}, - {"memory", true}, - {"disk", false}, - {"blah", false}, - {"x.y.z", false}, - } - for i, tc := range testCases { - if IsStandardResourceName(tc.input) != tc.output { - t.Errorf("case[%d], expected: %t, got: %t", i, tc.output, !tc.output) - } - } -} - -func TestAddToNodeAddresses(t *testing.T) { - testCases := []struct { - existing []NodeAddress - toAdd []NodeAddress - expected []NodeAddress - }{ - { - existing: []NodeAddress{}, - toAdd: []NodeAddress{}, - expected: []NodeAddress{}, - }, - { - existing: []NodeAddress{}, - toAdd: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeHostName, Address: "localhost"}, - }, - expected: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeHostName, Address: "localhost"}, - }, - }, - { - existing: []NodeAddress{}, - toAdd: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeExternalIP, Address: "1.1.1.1"}, - }, - expected: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - }, - }, - { - existing: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeInternalIP, Address: "10.1.1.1"}, - }, - toAdd: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeHostName, Address: "localhost"}, - }, - expected: []NodeAddress{ - {Type: NodeExternalIP, Address: "1.1.1.1"}, - {Type: NodeInternalIP, Address: "10.1.1.1"}, - {Type: NodeHostName, Address: "localhost"}, - }, - }, - } - - for i, tc := range testCases { - AddToNodeAddresses(&tc.existing, tc.toAdd...) - if !Semantic.DeepEqual(tc.expected, tc.existing) { - t.Errorf("case[%d], expected: %v, got: %v", i, tc.expected, tc.existing) - } - } -} - -func TestGetAccessModesFromString(t *testing.T) { - modes := GetAccessModesFromString("ROX") - if !containsAccessMode(modes, ReadOnlyMany) { - t.Errorf("Expected mode %s, but got %+v", ReadOnlyMany, modes) - } - - modes = GetAccessModesFromString("ROX,RWX") - if !containsAccessMode(modes, ReadOnlyMany) { - t.Errorf("Expected mode %s, but got %+v", ReadOnlyMany, modes) - } - if !containsAccessMode(modes, ReadWriteMany) { - t.Errorf("Expected mode %s, but got %+v", ReadWriteMany, modes) - } - - modes = GetAccessModesFromString("RWO,ROX,RWX") - if !containsAccessMode(modes, ReadOnlyMany) { - t.Errorf("Expected mode %s, but got %+v", ReadOnlyMany, modes) - } - if !containsAccessMode(modes, ReadWriteMany) { - t.Errorf("Expected mode %s, but got %+v", ReadWriteMany, modes) - } -} - -func TestRemoveDuplicateAccessModes(t *testing.T) { - modes := []PersistentVolumeAccessMode{ - ReadWriteOnce, ReadOnlyMany, ReadOnlyMany, ReadOnlyMany, - } - modes = removeDuplicateAccessModes(modes) - if len(modes) != 2 { - t.Errorf("Expected 2 distinct modes in set but found %v", len(modes)) - } -} - -func TestNodeSelectorRequirementsAsSelector(t *testing.T) { - matchExpressions := []NodeSelectorRequirement{{ - Key: "foo", - Operator: NodeSelectorOpIn, - Values: []string{"bar", "baz"}, - }} - mustParse := func(s string) labels.Selector { - out, e := labels.Parse(s) - if e != nil { - panic(e) - } - return out - } - tc := []struct { - in []NodeSelectorRequirement - out labels.Selector - expectErr bool - }{ - {in: nil, out: labels.Nothing()}, - {in: []NodeSelectorRequirement{}, out: labels.Nothing()}, - { - in: matchExpressions, - out: mustParse("foo in (baz,bar)"), - }, - { - in: []NodeSelectorRequirement{{ - Key: "foo", - Operator: NodeSelectorOpExists, - Values: []string{"bar", "baz"}, - }}, - expectErr: true, - }, - { - in: []NodeSelectorRequirement{{ - Key: "foo", - Operator: NodeSelectorOpGt, - Values: []string{"1.1"}, - }}, - out: mustParse("foo>1.1"), - }, - { - in: []NodeSelectorRequirement{{ - Key: "bar", - Operator: NodeSelectorOpLt, - Values: []string{"7.1"}, - }}, - out: mustParse("bar<7.1"), - }, - } - - for i, tc := range tc { - out, err := NodeSelectorRequirementsAsSelector(tc.in) - if err == nil && tc.expectErr { - t.Errorf("[%v]expected error but got none.", i) - } - if err != nil && !tc.expectErr { - t.Errorf("[%v]did not expect error but got: %v", i, err) - } - if !reflect.DeepEqual(out, tc.out) { - t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out) - } - } -} - -func TestGetAffinityFromPod(t *testing.T) { - testCases := []struct { - pod *Pod - expectErr bool - }{ - { - pod: &Pod{}, - expectErr: false, - }, - { - pod: &Pod{ - ObjectMeta: ObjectMeta{ - Annotations: map[string]string{ - AffinityAnnotationKey: ` - {"nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - "matchExpressions": [{ - "key": "foo", - "operator": "In", - "values": ["value1", "value2"] - }] - }] - }}}`, - }, - }, - }, - expectErr: false, - }, - { - pod: &Pod{ - ObjectMeta: ObjectMeta{ - Annotations: map[string]string{ - AffinityAnnotationKey: ` - {"nodeAffinity": { "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - "matchExpressions": [{ - "key": "foo", - `, - }, - }, - }, - expectErr: true, - }, - } - - for i, tc := range testCases { - _, err := GetAffinityFromPodAnnotations(tc.pod.Annotations) - if err == nil && tc.expectErr { - t.Errorf("[%v]expected error but got none.", i) - } - if err != nil && !tc.expectErr { - t.Errorf("[%v]did not expect error but got: %v", i, err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/install/install_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/install/install_test.go deleted file mode 100644 index 07c7f5d51..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/install/install_test.go +++ /dev/null @@ -1,129 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 install - -import ( - "encoding/json" - "reflect" - "testing" - - internal "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestResourceVersioner(t *testing.T) { - pod := internal.Pod{ObjectMeta: internal.ObjectMeta{ResourceVersion: "10"}} - version, err := accessor.ResourceVersion(&pod) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } - - podList := internal.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "10"}} - version, err = accessor.ResourceVersion(&podList) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } -} - -func TestCodec(t *testing.T) { - pod := internal.Pod{} - // We do want to use package registered rather than testapi here, because we - // want to test if the package install and package registered work as expected. - data, err := runtime.Encode(internal.Codecs.LegacyCodec(registered.GroupOrDie(internal.GroupName).GroupVersion), &pod) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - other := internal.Pod{} - if err := json.Unmarshal(data, &other); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if other.APIVersion != registered.GroupOrDie(internal.GroupName).GroupVersion.Version || other.Kind != "Pod" { - t.Errorf("unexpected unmarshalled object %#v", other) - } -} - -func TestInterfacesFor(t *testing.T) { - if _, err := registered.GroupOrDie(internal.GroupName).InterfacesFor(internal.SchemeGroupVersion); err == nil { - t.Fatalf("unexpected non-error: %v", err) - } - for i, version := range registered.GroupOrDie(internal.GroupName).GroupVersions { - if vi, err := registered.GroupOrDie(internal.GroupName).InterfacesFor(version); err != nil || vi == nil { - t.Fatalf("%d: unexpected result: %v", i, err) - } - } -} - -func TestRESTMapper(t *testing.T) { - gv := unversioned.GroupVersion{Group: "", Version: "v1"} - rcGVK := gv.WithKind("ReplicationController") - podTemplateGVK := gv.WithKind("PodTemplate") - - if gvk, err := registered.RESTMapper().KindFor(internal.SchemeGroupVersion.WithResource("replicationcontrollers")); err != nil || gvk != rcGVK { - t.Errorf("unexpected version mapping: %v %v", gvk, err) - } - - if m, err := registered.GroupOrDie(internal.GroupName).RESTMapper.RESTMapping(podTemplateGVK.GroupKind(), ""); err != nil || m.GroupVersionKind != podTemplateGVK || m.Resource != "podtemplates" { - t.Errorf("unexpected version mapping: %#v %v", m, err) - } - - for _, version := range registered.GroupOrDie(internal.GroupName).GroupVersions { - mapping, err := registered.GroupOrDie(internal.GroupName).RESTMapper.RESTMapping(rcGVK.GroupKind(), version.Version) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if mapping.Resource != "replicationControllers" && mapping.Resource != "replicationcontrollers" { - t.Errorf("incorrect resource name: %#v", mapping) - } - if mapping.GroupVersionKind.GroupVersion() != version { - t.Errorf("incorrect version: %v", mapping) - } - - interfaces, _ := registered.GroupOrDie(internal.GroupName).InterfacesFor(version) - if mapping.ObjectConvertor != interfaces.ObjectConvertor { - t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) - } - - rc := &internal.ReplicationController{ObjectMeta: internal.ObjectMeta{Name: "foo"}} - name, err := mapping.MetadataAccessor.Name(rc) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if name != "foo" { - t.Errorf("unable to retrieve object meta with: %v", mapping.MetadataAccessor) - } - } -} - -func TestUnversioned(t *testing.T) { - for _, obj := range []runtime.Object{ - &unversioned.Status{}, - &unversioned.ExportOptions{}, - } { - if unversioned, ok := internal.Scheme.IsUnversioned(obj); !unversioned || !ok { - t.Errorf("%v is expected to be unversioned", reflect.TypeOf(obj)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/help_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/help_test.go deleted file mode 100644 index 85ba2cbf6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/help_test.go +++ /dev/null @@ -1,253 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 meta_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/diff" - - "github.com/google/gofuzz" -) - -func TestIsList(t *testing.T) { - tests := []struct { - obj runtime.Object - isList bool - }{ - {&api.PodList{}, true}, - {&api.Pod{}, false}, - } - for _, item := range tests { - if e, a := item.isList, meta.IsListType(item.obj); e != a { - t.Errorf("%v: Expected %v, got %v", reflect.TypeOf(item.obj), e, a) - } - } -} - -func TestExtractList(t *testing.T) { - pl := &api.PodList{ - Items: []api.Pod{ - {ObjectMeta: api.ObjectMeta{Name: "1"}}, - {ObjectMeta: api.ObjectMeta{Name: "2"}}, - {ObjectMeta: api.ObjectMeta{Name: "3"}}, - }, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - for i := range list { - if e, a := list[i].(*api.Pod).Name, pl.Items[i].Name; e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - } -} - -func TestExtractListV1(t *testing.T) { - pl := &v1.PodList{ - Items: []v1.Pod{ - {ObjectMeta: v1.ObjectMeta{Name: "1"}}, - {ObjectMeta: v1.ObjectMeta{Name: "2"}}, - {ObjectMeta: v1.ObjectMeta{Name: "3"}}, - }, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - for i := range list { - if e, a := list[i].(*v1.Pod).Name, pl.Items[i].Name; e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - } -} - -func TestExtractListGeneric(t *testing.T) { - pl := &api.List{ - Items: []runtime.Object{ - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "1"}}, - &api.Service{ObjectMeta: api.ObjectMeta{Name: "2"}}, - }, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - if obj, ok := list[0].(*api.Pod); !ok { - t.Fatalf("Expected list[0] to be *api.Pod, it is %#v", obj) - } - if obj, ok := list[1].(*api.Service); !ok { - t.Fatalf("Expected list[1] to be *api.Service, it is %#v", obj) - } -} - -func TestExtractListGenericV1(t *testing.T) { - pl := &v1.List{ - Items: []runtime.RawExtension{ - {Raw: []byte("foo")}, - {Raw: []byte("bar")}, - {Object: &v1.Pod{ObjectMeta: v1.ObjectMeta{Name: "other"}}}, - }, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - if obj, ok := list[0].(*runtime.Unknown); !ok { - t.Fatalf("Expected list[0] to be *runtime.Unknown, it is %#v", obj) - } - if obj, ok := list[1].(*runtime.Unknown); !ok { - t.Fatalf("Expected list[1] to be *runtime.Unknown, it is %#v", obj) - } - if obj, ok := list[2].(*v1.Pod); !ok { - t.Fatalf("Expected list[2] to be *runtime.Unknown, it is %#v", obj) - } -} - -type fakePtrInterfaceList struct { - Items *[]runtime.Object -} - -func (obj fakePtrInterfaceList) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -func TestExtractListOfInterfacePtrs(t *testing.T) { - pl := &fakePtrInterfaceList{ - Items: &[]runtime.Object{}, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if len(list) > 0 { - t.Fatalf("Expected empty list, got %#v", list) - } -} - -type fakePtrValueList struct { - Items []*api.Pod -} - -func (obj fakePtrValueList) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -func TestExtractListOfValuePtrs(t *testing.T) { - pl := &fakePtrValueList{ - Items: []*api.Pod{ - {ObjectMeta: api.ObjectMeta{Name: "1"}}, - {ObjectMeta: api.ObjectMeta{Name: "2"}}, - }, - } - list, err := meta.ExtractList(pl) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - for i := range list { - if obj, ok := list[i].(*api.Pod); !ok { - t.Fatalf("Expected list[%d] to be *api.Pod, it is %#v", i, obj) - } - } -} - -func TestSetList(t *testing.T) { - pl := &api.PodList{} - list := []runtime.Object{ - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "1"}}, - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "2"}}, - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "3"}}, - } - err := meta.SetList(pl, list) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - for i := range list { - if e, a := list[i].(*api.Pod).Name, pl.Items[i].Name; e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - } -} - -func TestSetListToRuntimeObjectArray(t *testing.T) { - pl := &api.List{} - list := []runtime.Object{ - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "1"}}, - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "2"}}, - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "3"}}, - } - err := meta.SetList(pl, list) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - if e, a := len(list), len(pl.Items); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - for i := range list { - if e, a := list[i], pl.Items[i]; e != a { - t.Fatalf("%d: unmatched: %s", i, diff.ObjectDiff(e, a)) - } - } -} - -func TestSetExtractListRoundTrip(t *testing.T) { - fuzzer := fuzz.New().NilChance(0).NumElements(1, 5) - for i := 0; i < 5; i++ { - start := &api.PodList{} - fuzzer.Fuzz(&start.Items) - - list, err := meta.ExtractList(start) - if err != nil { - t.Errorf("Unexpected error %v", err) - continue - } - got := &api.PodList{} - err = meta.SetList(got, list) - if err != nil { - t.Errorf("Unexpected error %v", err) - continue - } - if e, a := start, got; !reflect.DeepEqual(e, a) { - t.Fatalf("Expected %#v, got %#v", e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/meta_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/meta_test.go deleted file mode 100644 index 5b6c35230..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/meta_test.go +++ /dev/null @@ -1,778 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 meta_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" -) - -func TestAPIObjectMeta(t *testing.T) { - j := &api.Pod{ - TypeMeta: unversioned.TypeMeta{APIVersion: "/a", Kind: "b"}, - ObjectMeta: api.ObjectMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"x": "y"}, - }, - } - var _ meta.Object = &j.ObjectMeta - var _ meta.ObjectMetaAccessor = j - accessor, err := meta.Accessor(j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if accessor != meta.Object(&j.ObjectMeta) { - t.Fatalf("should have returned the same pointer: %#v %#v", accessor, j) - } - if e, a := "bar", accessor.GetNamespace(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "foo", accessor.GetName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "prefix", accessor.GetGenerateName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "uid", string(accessor.GetUID()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "1", accessor.GetResourceVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "some/place/only/we/know", accessor.GetSelfLink(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor, err := meta.TypeAccessor(j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "a", typeAccessor.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "b", typeAccessor.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - accessor.SetNamespace("baz") - accessor.SetName("bar") - accessor.SetGenerateName("generate") - accessor.SetUID("other") - typeAccessor.SetAPIVersion("c") - typeAccessor.SetKind("d") - accessor.SetResourceVersion("2") - accessor.SetSelfLink("google.com") - - // Prove that accessor changes the original object. - if e, a := "baz", j.Namespace; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "bar", j.Name; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "generate", j.GenerateName; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := types.UID("other"), j.UID; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "c", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "d", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "2", j.ResourceVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "google.com", j.SelfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor.SetAPIVersion("d") - typeAccessor.SetKind("e") - if e, a := "d", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "e", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestGenericTypeMeta(t *testing.T) { - type TypeMeta struct { - Kind string `json:"kind,omitempty"` - Namespace string `json:"namespace,omitempty"` - Name string `json:"name,omitempty"` - GenerateName string `json:"generateName,omitempty"` - UID string `json:"uid,omitempty"` - CreationTimestamp unversioned.Time `json:"creationTimestamp,omitempty"` - SelfLink string `json:"selfLink,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - APIVersion string `json:"apiVersion,omitempty"` - Labels map[string]string `json:"labels,omitempty"` - Annotations map[string]string `json:"annotations,omitempty"` - } - type Object struct { - TypeMeta `json:",inline"` - } - j := Object{ - TypeMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - APIVersion: "a", - Kind: "b", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"x": "y"}, - }, - } - accessor, err := meta.Accessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "bar", accessor.GetNamespace(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "foo", accessor.GetName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "prefix", accessor.GetGenerateName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "uid", string(accessor.GetUID()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "1", accessor.GetResourceVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "some/place/only/we/know", accessor.GetSelfLink(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor, err := meta.TypeAccessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "a", typeAccessor.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "b", typeAccessor.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - accessor.SetNamespace("baz") - accessor.SetName("bar") - accessor.SetGenerateName("generate") - accessor.SetUID("other") - typeAccessor.SetAPIVersion("c") - typeAccessor.SetKind("d") - accessor.SetResourceVersion("2") - accessor.SetSelfLink("google.com") - - // Prove that accessor changes the original object. - if e, a := "baz", j.Namespace; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "bar", j.Name; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "generate", j.GenerateName; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "other", j.UID; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "c", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "d", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "2", j.ResourceVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "google.com", j.SelfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor.SetAPIVersion("d") - typeAccessor.SetKind("e") - if e, a := "d", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "e", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } -} - -type InternalTypeMeta struct { - Kind string `json:"kind,omitempty"` - Namespace string `json:"namespace,omitempty"` - Name string `json:"name,omitempty"` - GenerateName string `json:"generateName,omitempty"` - UID string `json:"uid,omitempty"` - CreationTimestamp unversioned.Time `json:"creationTimestamp,omitempty"` - SelfLink string `json:"selfLink,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - APIVersion string `json:"apiVersion,omitempty"` - Labels map[string]string `json:"labels,omitempty"` - Annotations map[string]string `json:"annotations,omitempty"` -} -type InternalObject struct { - TypeMeta InternalTypeMeta `json:",inline"` -} - -func (obj *InternalObject) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *InternalObject) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.TypeMeta.APIVersion, obj.TypeMeta.Kind = gvk.ToAPIVersionAndKind() -} -func (obj *InternalObject) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.TypeMeta.APIVersion, obj.TypeMeta.Kind) -} - -func TestGenericTypeMetaAccessor(t *testing.T) { - j := &InternalObject{ - InternalTypeMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - APIVersion: "/a", - Kind: "b", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"x": "y"}, - }, - } - accessor := meta.NewAccessor() - namespace, err := accessor.Namespace(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "bar", namespace; e != a { - t.Errorf("expected %v, got %v", e, a) - } - name, err := accessor.Name(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "foo", name; e != a { - t.Errorf("expected %v, got %v", e, a) - } - generateName, err := accessor.GenerateName(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "prefix", generateName; e != a { - t.Errorf("expected %v, got %v", e, a) - } - uid, err := accessor.UID(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "uid", string(uid); e != a { - t.Errorf("expected %v, got %v", e, a) - } - apiVersion, err := accessor.APIVersion(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "a", apiVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - kind, err := accessor.Kind(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "b", kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - rv, err := accessor.ResourceVersion(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "1", rv; e != a { - t.Errorf("expected %v, got %v", e, a) - } - selfLink, err := accessor.SelfLink(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := "some/place/only/we/know", selfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } - labels, err := accessor.Labels(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := 1, len(labels); e != a { - t.Errorf("expected %v, got %v", e, a) - } - annotations, err := accessor.Annotations(j) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := 1, len(annotations); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - if err := accessor.SetNamespace(j, "baz"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetName(j, "bar"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetGenerateName(j, "generate"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetUID(j, "other"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetAPIVersion(j, "c"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetKind(j, "d"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetResourceVersion(j, "2"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetSelfLink(j, "google.com"); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := accessor.SetLabels(j, map[string]string{}); err != nil { - t.Errorf("unexpected error: %v", err) - } - var nilMap map[string]string - if err := accessor.SetAnnotations(j, nilMap); err != nil { - t.Errorf("unexpected error: %v", err) - } - - // Prove that accessor changes the original object. - if e, a := "baz", j.TypeMeta.Namespace; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "bar", j.TypeMeta.Name; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "generate", j.TypeMeta.GenerateName; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "other", j.TypeMeta.UID; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "c", j.TypeMeta.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "d", j.TypeMeta.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "2", j.TypeMeta.ResourceVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "google.com", j.TypeMeta.SelfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := map[string]string{}, j.TypeMeta.Labels; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } - if e, a := nilMap, j.TypeMeta.Annotations; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } -} - -func TestGenericObjectMeta(t *testing.T) { - type TypeMeta struct { - Kind string `json:"kind,omitempty"` - APIVersion string `json:"apiVersion,omitempty"` - } - type ObjectMeta struct { - Namespace string `json:"namespace,omitempty"` - Name string `json:"name,omitempty"` - GenerateName string `json:"generateName,omitempty"` - UID string `json:"uid,omitempty"` - CreationTimestamp unversioned.Time `json:"creationTimestamp,omitempty"` - SelfLink string `json:"selfLink,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - Labels map[string]string `json:"labels,omitempty"` - Annotations map[string]string `json:"annotations,omitempty"` - } - type Object struct { - TypeMeta `json:",inline"` - ObjectMeta `json:"metadata"` - } - j := Object{ - TypeMeta{ - APIVersion: "a", - Kind: "b", - }, - ObjectMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"a": "b"}, - }, - } - accessor, err := meta.Accessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "bar", accessor.GetNamespace(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "foo", accessor.GetName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "prefix", accessor.GetGenerateName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "uid", string(accessor.GetUID()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "1", accessor.GetResourceVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "some/place/only/we/know", accessor.GetSelfLink(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := 1, len(accessor.GetLabels()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := 1, len(accessor.GetAnnotations()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor, err := meta.TypeAccessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "a", typeAccessor.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "b", typeAccessor.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - accessor.SetNamespace("baz") - accessor.SetName("bar") - accessor.SetGenerateName("generate") - accessor.SetUID("other") - typeAccessor.SetAPIVersion("c") - typeAccessor.SetKind("d") - accessor.SetResourceVersion("2") - accessor.SetSelfLink("google.com") - accessor.SetLabels(map[string]string{"other": "label"}) - accessor.SetAnnotations(map[string]string{"c": "d"}) - - // Prove that accessor changes the original object. - if e, a := "baz", j.Namespace; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "bar", j.Name; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "generate", j.GenerateName; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "other", j.UID; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "c", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "d", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "2", j.ResourceVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "google.com", j.SelfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := map[string]string{"other": "label"}, j.Labels; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } - if e, a := map[string]string{"c": "d"}, j.Annotations; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } -} - -func TestGenericListMeta(t *testing.T) { - type TypeMeta struct { - Kind string `json:"kind,omitempty"` - APIVersion string `json:"apiVersion,omitempty"` - } - type ListMeta struct { - SelfLink string `json:"selfLink,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - } - type Object struct { - TypeMeta `json:",inline"` - ListMeta `json:"metadata"` - } - j := Object{ - TypeMeta{ - APIVersion: "a", - Kind: "b", - }, - ListMeta{ - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - }, - } - accessor, err := meta.Accessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "", accessor.GetName(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "", string(accessor.GetUID()); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "1", accessor.GetResourceVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "some/place/only/we/know", accessor.GetSelfLink(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - typeAccessor, err := meta.TypeAccessor(&j) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := "a", typeAccessor.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "b", typeAccessor.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - accessor.SetName("bar") - accessor.SetUID("other") - typeAccessor.SetAPIVersion("c") - typeAccessor.SetKind("d") - accessor.SetResourceVersion("2") - accessor.SetSelfLink("google.com") - - // Prove that accessor changes the original object. - if e, a := "c", j.APIVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "d", j.Kind; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "2", j.ResourceVersion; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "google.com", j.SelfLink; e != a { - t.Errorf("expected %v, got %v", e, a) - } -} - -type MyAPIObject struct { - TypeMeta InternalTypeMeta `json:",inline"` -} - -func (obj *MyAPIObject) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *MyAPIObject) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.TypeMeta.APIVersion, obj.TypeMeta.Kind = gvk.ToAPIVersionAndKind() -} -func (obj *MyAPIObject) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.TypeMeta.APIVersion, obj.TypeMeta.Kind) -} - -type MyIncorrectlyMarkedAsAPIObject struct{} - -func (obj *MyIncorrectlyMarkedAsAPIObject) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -func TestResourceVersionerOfAPI(t *testing.T) { - type T struct { - runtime.Object - Expected string - } - testCases := map[string]T{ - "empty api object": {&MyAPIObject{}, ""}, - "api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, - "pointer to api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, - } - versioning := meta.NewAccessor() - for key, testCase := range testCases { - actual, err := versioning.ResourceVersion(testCase.Object) - if err != nil { - t.Errorf("%s: unexpected error %#v", key, err) - } - if actual != testCase.Expected { - t.Errorf("%s: expected %v, got %v", key, testCase.Expected, actual) - } - } - - failingCases := map[string]struct { - runtime.Object - Expected string - }{ - "not a valid object to try": {&MyIncorrectlyMarkedAsAPIObject{}, "1"}, - } - for key, testCase := range failingCases { - _, err := versioning.ResourceVersion(testCase.Object) - if err == nil { - t.Errorf("%s: expected error, got nil", key) - } - } - - setCases := map[string]struct { - runtime.Object - Expected string - }{ - "pointer to api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, - } - for key, testCase := range setCases { - if err := versioning.SetResourceVersion(testCase.Object, "5"); err != nil { - t.Errorf("%s: unexpected error %#v", key, err) - } - actual, err := versioning.ResourceVersion(testCase.Object) - if err != nil { - t.Errorf("%s: unexpected error %#v", key, err) - } - if actual != "5" { - t.Errorf("%s: expected %v, got %v", key, "5", actual) - } - } -} - -func TestTypeMetaSelfLinker(t *testing.T) { - table := map[string]struct { - obj runtime.Object - expect string - try string - succeed bool - }{ - "normal": { - obj: &MyAPIObject{TypeMeta: InternalTypeMeta{SelfLink: "foobar"}}, - expect: "foobar", - try: "newbar", - succeed: true, - }, - "fail": { - obj: &MyIncorrectlyMarkedAsAPIObject{}, - succeed: false, - }, - } - - linker := runtime.SelfLinker(meta.NewAccessor()) - for name, item := range table { - got, err := linker.SelfLink(item.obj) - if e, a := item.succeed, err == nil; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - if e, a := item.expect, got; item.succeed && e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - - err = linker.SetSelfLink(item.obj, item.try) - if e, a := item.succeed, err == nil; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - if item.succeed { - got, err := linker.SelfLink(item.obj) - if err != nil { - t.Errorf("%v: expected no err, got %v", name, err) - } - if e, a := item.try, got; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - } - } -} - -// BenchmarkAccessorSetFastPath shows the interface fast path -func BenchmarkAccessorSetFastPath(b *testing.B) { - obj := &api.Pod{ - TypeMeta: unversioned.TypeMeta{APIVersion: "/a", Kind: "b"}, - ObjectMeta: api.ObjectMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"x": "y"}, - }, - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - acc, err := meta.Accessor(obj) - if err != nil { - b.Fatal(err) - } - acc.SetNamespace("something") - } - b.StopTimer() -} - -// BenchmarkAccessorSetReflection provides a baseline for accessor performance -func BenchmarkAccessorSetReflection(b *testing.B) { - obj := &InternalObject{ - InternalTypeMeta{ - Namespace: "bar", - Name: "foo", - GenerateName: "prefix", - UID: "uid", - APIVersion: "a", - Kind: "b", - ResourceVersion: "1", - SelfLink: "some/place/only/we/know", - Labels: map[string]string{"foo": "bar"}, - Annotations: map[string]string{"x": "y"}, - }, - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - acc, err := meta.Accessor(obj) - if err != nil { - b.Fatal(err) - } - acc.SetNamespace("something") - } - b.StopTimer() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/multirestmapper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/multirestmapper_test.go deleted file mode 100644 index 1b3685e85..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/multirestmapper_test.go +++ /dev/null @@ -1,298 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 meta - -import ( - "errors" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" -) - -func TestMultiRESTMapperResourceFor(t *testing.T) { - tcs := []struct { - name string - - mapper MultiRESTMapper - input unversioned.GroupVersionResource - result unversioned.GroupVersionResource - err error - }{ - { - name: "empty", - mapper: MultiRESTMapper{}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionResource{}, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "ignore not found", - mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionResource{}, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "accept first failure", - mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "unused"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionResource{}, - err: errors.New("fail on this"), - }, - } - - for _, tc := range tcs { - actualResult, actualErr := tc.mapper.ResourceFor(tc.input) - if e, a := tc.result, actualResult; e != a { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - switch { - case tc.err == nil && actualErr == nil: - case tc.err == nil: - t.Errorf("%s: unexpected error: %v", tc.name, actualErr) - case actualErr == nil: - t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) - case tc.err.Error() != actualErr.Error(): - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} - -func TestMultiRESTMapperResourcesFor(t *testing.T) { - tcs := []struct { - name string - - mapper MultiRESTMapper - input unversioned.GroupVersionResource - result []unversioned.GroupVersionResource - err error - }{ - { - name: "empty", - mapper: MultiRESTMapper{}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "ignore not found", - mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "accept first failure", - mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "unused"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: errors.New("fail on this"), - }, - { - name: "union and dedup", - mapper: MultiRESTMapper{ - fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}}}, - fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "second"}}}, - }, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: []unversioned.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}, {Resource: "second"}}, - }, - { - name: "skip not and continue", - mapper: MultiRESTMapper{ - fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}, - fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "first"}, {Resource: "second"}}}, - }, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: []unversioned.GroupVersionResource{{Resource: "first"}, {Resource: "second"}}, - }, - } - - for _, tc := range tcs { - actualResult, actualErr := tc.mapper.ResourcesFor(tc.input) - if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - switch { - case tc.err == nil && actualErr == nil: - case tc.err == nil: - t.Errorf("%s: unexpected error: %v", tc.name, actualErr) - case actualErr == nil: - t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) - case tc.err.Error() != actualErr.Error(): - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} - -func TestMultiRESTMapperKindsFor(t *testing.T) { - tcs := []struct { - name string - - mapper MultiRESTMapper - input unversioned.GroupVersionResource - result []unversioned.GroupVersionKind - err error - }{ - { - name: "empty", - mapper: MultiRESTMapper{}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "ignore not found", - mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "accept first failure", - mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "unused"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: nil, - err: errors.New("fail on this"), - }, - { - name: "union and dedup", - mapper: MultiRESTMapper{ - fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}}}, - fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "second"}}}, - }, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: []unversioned.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}, {Kind: "second"}}, - }, - { - name: "skip not and continue", - mapper: MultiRESTMapper{ - fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}, - fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "first"}, {Kind: "second"}}}, - }, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: []unversioned.GroupVersionKind{{Kind: "first"}, {Kind: "second"}}, - }, - } - - for _, tc := range tcs { - actualResult, actualErr := tc.mapper.KindsFor(tc.input) - if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - switch { - case tc.err == nil && actualErr == nil: - case tc.err == nil: - t.Errorf("%s: unexpected error: %v", tc.name, actualErr) - case actualErr == nil: - t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) - case tc.err.Error() != actualErr.Error(): - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} - -func TestMultiRESTMapperKindFor(t *testing.T) { - tcs := []struct { - name string - - mapper MultiRESTMapper - input unversioned.GroupVersionResource - result unversioned.GroupVersionKind - err error - }{ - { - name: "empty", - mapper: MultiRESTMapper{}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionKind{}, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "ignore not found", - mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionKind{}, - err: &NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - }, - { - name: "accept first failure", - mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "unused"}}}}, - input: unversioned.GroupVersionResource{Resource: "foo"}, - result: unversioned.GroupVersionKind{}, - err: errors.New("fail on this"), - }, - } - - for _, tc := range tcs { - actualResult, actualErr := tc.mapper.KindFor(tc.input) - if e, a := tc.result, actualResult; e != a { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - switch { - case tc.err == nil && actualErr == nil: - case tc.err == nil: - t.Errorf("%s: unexpected error: %v", tc.name, actualErr) - case actualErr == nil: - t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) - case tc.err.Error() != actualErr.Error(): - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} - -type fixedRESTMapper struct { - resourcesFor []unversioned.GroupVersionResource - kindsFor []unversioned.GroupVersionKind - resourceFor unversioned.GroupVersionResource - kindFor unversioned.GroupVersionKind - - err error -} - -func (m fixedRESTMapper) ResourceSingularizer(resource string) (singular string, err error) { - return "", m.err -} - -func (m fixedRESTMapper) ResourcesFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionResource, error) { - return m.resourcesFor, m.err -} - -func (m fixedRESTMapper) KindsFor(resource unversioned.GroupVersionResource) (gvk []unversioned.GroupVersionKind, err error) { - return m.kindsFor, m.err -} - -func (m fixedRESTMapper) ResourceFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionResource, error) { - return m.resourceFor, m.err -} - -func (m fixedRESTMapper) KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) { - return m.kindFor, m.err -} - -func (m fixedRESTMapper) RESTMapping(gk unversioned.GroupKind, versions ...string) (mapping *RESTMapping, err error) { - return nil, m.err -} - -func (m fixedRESTMapper) AliasesForResource(alias string) (aliases []string, ok bool) { - return nil, false -} - -func (m fixedRESTMapper) ResourceIsValid(resource unversioned.GroupVersionResource) bool { - return false -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/priority_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/priority_test.go deleted file mode 100644 index ea2d24b37..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/priority_test.go +++ /dev/null @@ -1,206 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 meta - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" -) - -func TestPriorityRESTMapperResourceForErrorHandling(t *testing.T) { - tcs := []struct { - name string - - delegate RESTMapper - resourcePatterns []unversioned.GroupVersionResource - result unversioned.GroupVersionResource - err string - }{ - { - name: "single hit", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{{Resource: "single-hit"}}}, - result: unversioned.GroupVersionResource{Resource: "single-hit"}, - }, - { - name: "ambiguous match", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{ - {Group: "one", Version: "a", Resource: "first"}, - {Group: "two", Version: "b", Resource: "second"}, - }}, - err: "matches multiple resources", - }, - { - name: "group selection", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{ - {Group: "one", Version: "a", Resource: "first"}, - {Group: "two", Version: "b", Resource: "second"}, - }}, - resourcePatterns: []unversioned.GroupVersionResource{ - {Group: "one", Version: AnyVersion, Resource: AnyResource}, - }, - result: unversioned.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, - }, - { - name: "empty match continues", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{ - {Group: "one", Version: "a", Resource: "first"}, - {Group: "two", Version: "b", Resource: "second"}, - }}, - resourcePatterns: []unversioned.GroupVersionResource{ - {Group: "fail", Version: AnyVersion, Resource: AnyResource}, - {Group: "one", Version: AnyVersion, Resource: AnyResource}, - }, - result: unversioned.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, - }, - { - name: "group followed by version selection", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{ - {Group: "one", Version: "a", Resource: "first"}, - {Group: "two", Version: "b", Resource: "second"}, - {Group: "one", Version: "c", Resource: "third"}, - }}, - resourcePatterns: []unversioned.GroupVersionResource{ - {Group: "one", Version: AnyVersion, Resource: AnyResource}, - {Group: AnyGroup, Version: "a", Resource: AnyResource}, - }, - result: unversioned.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, - }, - { - name: "resource selection", - delegate: fixedRESTMapper{resourcesFor: []unversioned.GroupVersionResource{ - {Group: "one", Version: "a", Resource: "first"}, - {Group: "one", Version: "a", Resource: "second"}, - }}, - resourcePatterns: []unversioned.GroupVersionResource{ - {Group: AnyGroup, Version: AnyVersion, Resource: "second"}, - }, - result: unversioned.GroupVersionResource{Group: "one", Version: "a", Resource: "second"}, - }, - } - - for _, tc := range tcs { - mapper := PriorityRESTMapper{Delegate: tc.delegate, ResourcePriority: tc.resourcePatterns} - - actualResult, actualErr := mapper.ResourceFor(unversioned.GroupVersionResource{}) - if e, a := tc.result, actualResult; e != a { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - if len(tc.err) == 0 && actualErr == nil { - continue - } - if len(tc.err) > 0 && actualErr == nil { - t.Errorf("%s: missing expected err: %v", tc.name, tc.err) - continue - } - if !strings.Contains(actualErr.Error(), tc.err) { - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} - -func TestPriorityRESTMapperKindForErrorHandling(t *testing.T) { - tcs := []struct { - name string - - delegate RESTMapper - kindPatterns []unversioned.GroupVersionKind - result unversioned.GroupVersionKind - err string - }{ - { - name: "single hit", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{{Kind: "single-hit"}}}, - result: unversioned.GroupVersionKind{Kind: "single-hit"}, - }, - { - name: "ambiguous match", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{ - {Group: "one", Version: "a", Kind: "first"}, - {Group: "two", Version: "b", Kind: "second"}, - }}, - err: "matches multiple kinds", - }, - { - name: "group selection", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{ - {Group: "one", Version: "a", Kind: "first"}, - {Group: "two", Version: "b", Kind: "second"}, - }}, - kindPatterns: []unversioned.GroupVersionKind{ - {Group: "one", Version: AnyVersion, Kind: AnyKind}, - }, - result: unversioned.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, - }, - { - name: "empty match continues", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{ - {Group: "one", Version: "a", Kind: "first"}, - {Group: "two", Version: "b", Kind: "second"}, - }}, - kindPatterns: []unversioned.GroupVersionKind{ - {Group: "fail", Version: AnyVersion, Kind: AnyKind}, - {Group: "one", Version: AnyVersion, Kind: AnyKind}, - }, - result: unversioned.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, - }, - { - name: "group followed by version selection", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{ - {Group: "one", Version: "a", Kind: "first"}, - {Group: "two", Version: "b", Kind: "second"}, - {Group: "one", Version: "c", Kind: "third"}, - }}, - kindPatterns: []unversioned.GroupVersionKind{ - {Group: "one", Version: AnyVersion, Kind: AnyKind}, - {Group: AnyGroup, Version: "a", Kind: AnyKind}, - }, - result: unversioned.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, - }, - { - name: "kind selection", - delegate: fixedRESTMapper{kindsFor: []unversioned.GroupVersionKind{ - {Group: "one", Version: "a", Kind: "first"}, - {Group: "one", Version: "a", Kind: "second"}, - }}, - kindPatterns: []unversioned.GroupVersionKind{ - {Group: AnyGroup, Version: AnyVersion, Kind: "second"}, - }, - result: unversioned.GroupVersionKind{Group: "one", Version: "a", Kind: "second"}, - }, - } - - for _, tc := range tcs { - mapper := PriorityRESTMapper{Delegate: tc.delegate, KindPriority: tc.kindPatterns} - - actualResult, actualErr := mapper.KindFor(unversioned.GroupVersionResource{}) - if e, a := tc.result, actualResult; e != a { - t.Errorf("%s: expected %v, got %v", tc.name, e, a) - } - if len(tc.err) == 0 && actualErr == nil { - continue - } - if len(tc.err) > 0 && actualErr == nil { - t.Errorf("%s: missing expected err: %v", tc.name, tc.err) - continue - } - if !strings.Contains(actualErr.Error(), tc.err) { - t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/restmapper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/restmapper_test.go deleted file mode 100644 index 8f494d0a6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta/restmapper_test.go +++ /dev/null @@ -1,550 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 meta - -import ( - "errors" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" -) - -type fakeConvertor struct{} - -func (fakeConvertor) Convert(in, out interface{}) error { - return nil -} - -func (fakeConvertor) ConvertToVersion(in runtime.Object, _ string) (runtime.Object, error) { - return in, nil -} - -func (fakeConvertor) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - return label, value, nil -} - -var validAccessor = resourceAccessor{} -var validConvertor = fakeConvertor{} - -func fakeInterfaces(version unversioned.GroupVersion) (*VersionInterfaces, error) { - return &VersionInterfaces{ObjectConvertor: validConvertor, MetadataAccessor: validAccessor}, nil -} - -var unmatchedErr = errors.New("no version") - -func unmatchedVersionInterfaces(version unversioned.GroupVersion) (*VersionInterfaces, error) { - return nil, unmatchedErr -} - -func TestRESTMapperVersionAndKindForResource(t *testing.T) { - testGroup := "test.group" - testVersion := "test" - testGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: testVersion} - - testCases := []struct { - Resource unversioned.GroupVersionResource - GroupVersionToRegister unversioned.GroupVersion - ExpectedGVK unversioned.GroupVersionKind - Err bool - }{ - {Resource: unversioned.GroupVersionResource{Resource: "internalobjec"}, Err: true}, - {Resource: unversioned.GroupVersionResource{Resource: "internalObjec"}, Err: true}, - - {Resource: unversioned.GroupVersionResource{Resource: "internalobject"}, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, - {Resource: unversioned.GroupVersionResource{Resource: "internalobjects"}, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, - } - for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion}, fakeInterfaces) - if len(testCase.ExpectedGVK.Kind) != 0 { - mapper.Add(testCase.ExpectedGVK, RESTScopeNamespace) - } - actualGVK, err := mapper.KindFor(testCase.Resource) - - hasErr := err != nil - if hasErr != testCase.Err { - t.Errorf("%d: unexpected error behavior %t: %v", i, testCase.Err, err) - continue - } - if err != nil { - continue - } - - if actualGVK != testCase.ExpectedGVK { - t.Errorf("%d: unexpected version and kind: e=%s a=%s", i, testCase.ExpectedGVK, actualGVK) - } - } -} - -func TestRESTMapperGroupForResource(t *testing.T) { - testCases := []struct { - Resource unversioned.GroupVersionResource - GroupVersionKind unversioned.GroupVersionKind - Err bool - }{ - {Resource: unversioned.GroupVersionResource{Resource: "myObject"}, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, - {Resource: unversioned.GroupVersionResource{Resource: "myobject"}, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi2", Version: "test", Kind: "MyObject"}}, - {Resource: unversioned.GroupVersionResource{Resource: "myObje"}, Err: true, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, - {Resource: unversioned.GroupVersionResource{Resource: "myobje"}, Err: true, GroupVersionKind: unversioned.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, - } - for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testCase.GroupVersionKind.GroupVersion()}, fakeInterfaces) - mapper.Add(testCase.GroupVersionKind, RESTScopeNamespace) - - actualGVK, err := mapper.KindFor(testCase.Resource) - if testCase.Err { - if err == nil { - t.Errorf("%d: expected error", i) - } - } else if err != nil { - t.Errorf("%d: unexpected error: %v", i, err) - } else if actualGVK != testCase.GroupVersionKind { - t.Errorf("%d: expected group %q, got %q", i, testCase.GroupVersionKind, actualGVK) - } - } -} - -func TestRESTMapperKindsFor(t *testing.T) { - testCases := []struct { - Name string - PreferredOrder []unversioned.GroupVersion - KindsToRegister []unversioned.GroupVersionKind - PartialResourceToRequest unversioned.GroupVersionResource - - ExpectedKinds []unversioned.GroupVersionKind - ExpectedKindErr string - }{ - { - Name: "ambiguous groups, with preference order", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "second-group", Version: "first-version"}, - {Group: "first-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PartialResourceToRequest: unversioned.GroupVersionResource{Resource: "my-kinds"}, - - ExpectedKinds: []unversioned.GroupVersionKind{ - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - }, - ExpectedKindErr: " matches multiple kinds ", - }, - - { - Name: "ambiguous groups, with explicit group match", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "second-group", Version: "first-version"}, - {Group: "first-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PartialResourceToRequest: unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kinds"}, - - ExpectedKinds: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - }, - }, - - { - Name: "ambiguous groups, with ambiguous version match", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "first-group", Version: "first-version"}, - {Group: "second-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PartialResourceToRequest: unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kinds"}, - - ExpectedKinds: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - }, - ExpectedKindErr: " matches multiple kinds ", - }, - } - for _, testCase := range testCases { - tcName := testCase.Name - mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces) - for _, kind := range testCase.KindsToRegister { - mapper.Add(kind, RESTScopeNamespace) - } - - actualKinds, err := mapper.KindsFor(testCase.PartialResourceToRequest) - if err != nil { - t.Errorf("%s: unexpected error: %v", tcName, err) - continue - } - if !reflect.DeepEqual(testCase.ExpectedKinds, actualKinds) { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKinds, actualKinds) - } - - singleKind, err := mapper.KindFor(testCase.PartialResourceToRequest) - if err == nil && len(testCase.ExpectedKindErr) != 0 { - t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedKindErr) - continue - } - if err != nil { - if len(testCase.ExpectedKindErr) == 0 { - t.Errorf("%s: unexpected error: %v", tcName, err) - continue - } else { - if !strings.Contains(err.Error(), testCase.ExpectedKindErr) { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKindErr, err) - continue - } - } - - } else { - if testCase.ExpectedKinds[0] != singleKind { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKinds[0], singleKind) - } - - } - } -} - -func TestRESTMapperResourcesFor(t *testing.T) { - testCases := []struct { - Name string - PreferredOrder []unversioned.GroupVersion - KindsToRegister []unversioned.GroupVersionKind - PluralPartialResourceToRequest unversioned.GroupVersionResource - SingularPartialResourceToRequest unversioned.GroupVersionResource - - ExpectedResources []unversioned.GroupVersionResource - ExpectedResourceErr string - }{ - { - Name: "ambiguous groups, with preference order", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "second-group", Version: "first-version"}, - {Group: "first-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PluralPartialResourceToRequest: unversioned.GroupVersionResource{Resource: "my-kinds"}, - SingularPartialResourceToRequest: unversioned.GroupVersionResource{Resource: "my-kind"}, - - ExpectedResources: []unversioned.GroupVersionResource{ - {Group: "second-group", Version: "first-version", Resource: "my-kinds"}, - {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, - }, - ExpectedResourceErr: " matches multiple resources ", - }, - - { - Name: "ambiguous groups, with explicit group match", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "second-group", Version: "first-version"}, - {Group: "first-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PluralPartialResourceToRequest: unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kinds"}, - SingularPartialResourceToRequest: unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kind"}, - - ExpectedResources: []unversioned.GroupVersionResource{ - {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, - }, - }, - - { - Name: "ambiguous groups, with ambiguous version match", - PreferredOrder: []unversioned.GroupVersion{ - {Group: "first-group", Version: "first-version"}, - {Group: "second-group", Version: "first-version"}, - }, - KindsToRegister: []unversioned.GroupVersionKind{ - {Group: "first-group", Version: "first-version", Kind: "my-kind"}, - {Group: "first-group", Version: "first-version", Kind: "your-kind"}, - {Group: "second-group", Version: "first-version", Kind: "my-kind"}, - {Group: "second-group", Version: "first-version", Kind: "your-kind"}, - }, - PluralPartialResourceToRequest: unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kinds"}, - SingularPartialResourceToRequest: unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kind"}, - - ExpectedResources: []unversioned.GroupVersionResource{ - {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, - {Group: "second-group", Version: "first-version", Resource: "my-kinds"}, - }, - ExpectedResourceErr: " matches multiple resources ", - }, - } - for _, testCase := range testCases { - tcName := testCase.Name - - for _, partialResource := range []unversioned.GroupVersionResource{testCase.PluralPartialResourceToRequest, testCase.SingularPartialResourceToRequest} { - mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces) - for _, kind := range testCase.KindsToRegister { - mapper.Add(kind, RESTScopeNamespace) - } - - actualResources, err := mapper.ResourcesFor(partialResource) - if err != nil { - t.Errorf("%s: unexpected error: %v", tcName, err) - continue - } - if !reflect.DeepEqual(testCase.ExpectedResources, actualResources) { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources, actualResources) - } - - singleResource, err := mapper.ResourceFor(partialResource) - if err == nil && len(testCase.ExpectedResourceErr) != 0 { - t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedResourceErr) - continue - } - if err != nil { - if len(testCase.ExpectedResourceErr) == 0 { - t.Errorf("%s: unexpected error: %v", tcName, err) - continue - } else { - if !strings.Contains(err.Error(), testCase.ExpectedResourceErr) { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResourceErr, err) - continue - } - } - - } else { - if testCase.ExpectedResources[0] != singleResource { - t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources[0], singleResource) - } - - } - } - } -} - -func TestKindToResource(t *testing.T) { - testCases := []struct { - Kind string - Plural, Singular string - }{ - {Kind: "Pod", Plural: "pods", Singular: "pod"}, - - {Kind: "ReplicationController", Plural: "replicationcontrollers", Singular: "replicationcontroller"}, - - // Add "ies" when ending with "y" - {Kind: "ImageRepository", Plural: "imagerepositories", Singular: "imagerepository"}, - // Add "es" when ending with "s" - {Kind: "miss", Plural: "misses", Singular: "miss"}, - // Add "s" otherwise - {Kind: "lowercase", Plural: "lowercases", Singular: "lowercase"}, - } - for i, testCase := range testCases { - version := unversioned.GroupVersion{} - - plural, singular := KindToResource(version.WithKind(testCase.Kind)) - if singular != version.WithResource(testCase.Singular) || plural != version.WithResource(testCase.Plural) { - t.Errorf("%d: unexpected plural and singular: %v %v", i, plural, singular) - } - } -} - -func TestRESTMapperResourceSingularizer(t *testing.T) { - testGroupVersion := unversioned.GroupVersion{Group: "tgroup", Version: "test"} - - testCases := []struct { - Kind string - Plural string - Singular string - }{ - {Kind: "Pod", Plural: "pods", Singular: "pod"}, - {Kind: "ReplicationController", Plural: "replicationcontrollers", Singular: "replicationcontroller"}, - {Kind: "ImageRepository", Plural: "imagerepositories", Singular: "imagerepository"}, - {Kind: "Status", Plural: "statuses", Singular: "status"}, - - {Kind: "lowercase", Plural: "lowercases", Singular: "lowercase"}, - // TODO this test is broken. This updates to reflect actual behavior. Kinds are expected to be singular - // old (incorrect), coment: Don't add extra s if the original object is already plural - {Kind: "lowercases", Plural: "lowercaseses", Singular: "lowercases"}, - } - for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{testGroupVersion}, fakeInterfaces) - // create singular/plural mapping - mapper.Add(testGroupVersion.WithKind(testCase.Kind), RESTScopeNamespace) - - singular, err := mapper.ResourceSingularizer(testCase.Plural) - if err != nil { - t.Errorf("%d: unexpected error: %v", i, err) - } - if singular != testCase.Singular { - t.Errorf("%d: mismatched singular: got %v, expected %v", i, singular, testCase.Singular) - } - } -} - -func TestRESTMapperRESTMapping(t *testing.T) { - testGroup := "tgroup" - testGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: "test"} - internalGroupVersion := unversioned.GroupVersion{Group: testGroup, Version: "test"} - - testCases := []struct { - Kind string - APIGroupVersions []unversioned.GroupVersion - DefaultVersions []unversioned.GroupVersion - - Resource string - ExpectedGroupVersion *unversioned.GroupVersion - Err bool - }{ - {Kind: "Unknown", Err: true}, - {Kind: "InternalObject", Err: true}, - - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, - - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{}, Resource: "internalobjects", ExpectedGroupVersion: &unversioned.GroupVersion{Group: testGroup, Version: "test"}}, - - {DefaultVersions: []unversioned.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []unversioned.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - - // TODO: add test for a resource that exists in one version but not another - } - for i, testCase := range testCases { - mapper := NewDefaultRESTMapper(testCase.DefaultVersions, fakeInterfaces) - mapper.Add(internalGroupVersion.WithKind("InternalObject"), RESTScopeNamespace) - - preferredVersions := []string{} - for _, gv := range testCase.APIGroupVersions { - preferredVersions = append(preferredVersions, gv.Version) - } - gk := unversioned.GroupKind{Group: testGroup, Kind: testCase.Kind} - - mapping, err := mapper.RESTMapping(gk, preferredVersions...) - hasErr := err != nil - if hasErr != testCase.Err { - t.Errorf("%d: unexpected error behavior %t: %v", i, testCase.Err, err) - } - if hasErr { - continue - } - if mapping.Resource != testCase.Resource { - t.Errorf("%d: unexpected resource: %#v", i, mapping) - } - - if mapping.MetadataAccessor == nil || mapping.ObjectConvertor == nil { - t.Errorf("%d: missing codec and accessor: %#v", i, mapping) - } - - groupVersion := testCase.ExpectedGroupVersion - if groupVersion == nil { - groupVersion = &testCase.APIGroupVersions[0] - } - if mapping.GroupVersionKind.GroupVersion() != *groupVersion { - t.Errorf("%d: unexpected version: %#v", i, mapping) - } - - } -} - -func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { - expectedGroupVersion1 := unversioned.GroupVersion{Group: "tgroup", Version: "test1"} - expectedGroupVersion2 := unversioned.GroupVersion{Group: "tgroup", Version: "test2"} - expectedGroupVersion3 := unversioned.GroupVersion{Group: "tgroup", Version: "test3"} - internalObjectGK := unversioned.GroupKind{Group: "tgroup", Kind: "InternalObject"} - otherObjectGK := unversioned.GroupKind{Group: "tgroup", Kind: "OtherObject"} - - mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, fakeInterfaces) - mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) - mapper.Add(expectedGroupVersion2.WithKind("OtherObject"), RESTScopeNamespace) - - // pick default matching object kind based on search order - mapping, err := mapper.RESTMapping(otherObjectGK) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { - t.Errorf("unexpected mapping: %#v", mapping) - } - - mapping, err = mapper.RESTMapping(internalObjectGK) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "internalobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 { - t.Errorf("unexpected mapping: %#v", mapping) - } - - // mismatch of version - mapping, err = mapper.RESTMapping(internalObjectGK, expectedGroupVersion2.Version) - if err == nil { - t.Errorf("unexpected non-error") - } - mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion1.Version) - if err == nil { - t.Errorf("unexpected non-error") - } - - // not in the search versions - mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version) - if err == nil { - t.Errorf("unexpected non-error") - } - - // explicit search order - mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version, expectedGroupVersion1.Version) - if err == nil { - t.Errorf("unexpected non-error") - } - - mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version, expectedGroupVersion2.Version) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { - t.Errorf("unexpected mapping: %#v", mapping) - } -} - -func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) { - expectedGroupVersion1 := unversioned.GroupVersion{Group: "tgroup", Version: "test1"} - expectedGroupVersion2 := unversioned.GroupVersion{Group: "tgroup", Version: "test2"} - internalObjectGK := unversioned.GroupKind{Group: "tgroup", Kind: "InternalObject"} - - mapper := NewDefaultRESTMapper([]unversioned.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, unmatchedVersionInterfaces) - mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) - _, err := mapper.RESTMapping(internalObjectGK, expectedGroupVersion1.Version) - if err == nil { - t.Errorf("unexpected non-error") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta_test.go deleted file mode 100644 index e4a9657a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/meta_test.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" -) - -var _ meta.Object = &api.ObjectMeta{} - -// TestFillObjectMetaSystemFields validates that system populated fields are set on an object -func TestFillObjectMetaSystemFields(t *testing.T) { - ctx := api.NewDefaultContext() - resource := api.ObjectMeta{} - api.FillObjectMetaSystemFields(ctx, &resource) - if resource.CreationTimestamp.Time.IsZero() { - t.Errorf("resource.CreationTimestamp is zero") - } else if len(resource.UID) == 0 { - t.Errorf("resource.UID missing") - } -} - -// TestHasObjectMetaSystemFieldValues validates that true is returned if and only if all fields are populated -func TestHasObjectMetaSystemFieldValues(t *testing.T) { - ctx := api.NewDefaultContext() - resource := api.ObjectMeta{} - if api.HasObjectMetaSystemFieldValues(&resource) { - t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does") - } - api.FillObjectMetaSystemFields(ctx, &resource) - if !api.HasObjectMetaSystemFieldValues(&resource) { - t.Errorf("the resource does have all fields populated, but incorrectly reports it does not") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/pod/util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/pod/util_test.go deleted file mode 100644 index 428f2bdcd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/pod/util_test.go +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 pod - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestFindPort(t *testing.T) { - testCases := []struct { - name string - containers []api.Container - port intstr.IntOrString - expected int - pass bool - }{{ - name: "valid int, no ports", - containers: []api.Container{{}}, - port: intstr.FromInt(93), - expected: 93, - pass: true, - }, { - name: "valid int, with ports", - containers: []api.Container{{Ports: []api.ContainerPort{{ - Name: "", - ContainerPort: 11, - Protocol: "TCP", - }, { - Name: "p", - ContainerPort: 22, - Protocol: "TCP", - }}}}, - port: intstr.FromInt(93), - expected: 93, - pass: true, - }, { - name: "valid str, no ports", - containers: []api.Container{{}}, - port: intstr.FromString("p"), - expected: 0, - pass: false, - }, { - name: "valid str, one ctr with ports", - containers: []api.Container{{Ports: []api.ContainerPort{{ - Name: "", - ContainerPort: 11, - Protocol: "UDP", - }, { - Name: "p", - ContainerPort: 22, - Protocol: "TCP", - }, { - Name: "q", - ContainerPort: 33, - Protocol: "TCP", - }}}}, - port: intstr.FromString("q"), - expected: 33, - pass: true, - }, { - name: "valid str, two ctr with ports", - containers: []api.Container{{}, {Ports: []api.ContainerPort{{ - Name: "", - ContainerPort: 11, - Protocol: "UDP", - }, { - Name: "p", - ContainerPort: 22, - Protocol: "TCP", - }, { - Name: "q", - ContainerPort: 33, - Protocol: "TCP", - }}}}, - port: intstr.FromString("q"), - expected: 33, - pass: true, - }} - - for _, tc := range testCases { - port, err := FindPort(&api.Pod{Spec: api.PodSpec{Containers: tc.containers}}, - &api.ServicePort{Protocol: "TCP", TargetPort: tc.port}) - if err != nil && tc.pass { - t.Errorf("unexpected error for %s: %v", tc.name, err) - } - if err == nil && !tc.pass { - t.Errorf("unexpected non-error for %s: %d", tc.name, port) - } - if port != tc.expected { - t.Errorf("wrong result for %s: expected %d, got %d", tc.name, tc.expected, port) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/ref_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/ref_test.go deleted file mode 100644 index dbde7a01f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/ref_test.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" -) - -type FakeAPIObject struct{} - -func (obj *FakeAPIObject) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -type ExtensionAPIObject struct { - unversioned.TypeMeta - ObjectMeta -} - -func (obj *ExtensionAPIObject) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } - -func TestGetReference(t *testing.T) { - - // when vendoring kube, if you don't force the set of registered versions (like this hack/test-go.sh does) - // then you run into trouble because the types aren't registered in the scheme by anything. This does the - // register manually to allow unit test execution - if _, err := Scheme.ObjectKind(&Pod{}); err != nil { - AddToScheme(Scheme) - } - - table := map[string]struct { - obj runtime.Object - ref *ObjectReference - fieldPath string - shouldErr bool - }{ - "pod": { - obj: &Pod{ - ObjectMeta: ObjectMeta{ - Name: "foo", - UID: "bar", - ResourceVersion: "42", - SelfLink: "/api/version1/pods/foo", - }, - }, - fieldPath: ".desiredState.containers[0]", - ref: &ObjectReference{ - Kind: "Pod", - APIVersion: "version1", - Name: "foo", - UID: "bar", - ResourceVersion: "42", - FieldPath: ".desiredState.containers[0]", - }, - }, - "serviceList": { - obj: &ServiceList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "42", - SelfLink: "/api/version2/services", - }, - }, - ref: &ObjectReference{ - Kind: "ServiceList", - APIVersion: "version2", - ResourceVersion: "42", - }, - }, - "extensionAPIObject": { - obj: &ExtensionAPIObject{ - TypeMeta: unversioned.TypeMeta{ - Kind: "ExtensionAPIObject", - }, - ObjectMeta: ObjectMeta{ - Name: "foo", - UID: "bar", - ResourceVersion: "42", - SelfLink: "/custom_prefix/version1/extensions/foo", - }, - }, - ref: &ObjectReference{ - Kind: "ExtensionAPIObject", - APIVersion: "version1", - Name: "foo", - UID: "bar", - ResourceVersion: "42", - }, - }, - "badSelfLink": { - obj: &ServiceList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "42", - SelfLink: "version2/services", - }, - }, - shouldErr: true, - }, - "error": { - obj: &FakeAPIObject{}, - ref: nil, - shouldErr: true, - }, - "errorNil": { - obj: nil, - ref: nil, - shouldErr: true, - }, - } - - for name, item := range table { - ref, err := GetPartialReference(item.obj, item.fieldPath) - if e, a := item.shouldErr, (err != nil); e != a { - t.Errorf("%v: expected %v, got %v, err %v", name, e, a, err) - continue - } - if e, a := item.ref, ref; !reflect.DeepEqual(e, a) { - t.Errorf("%v: expected %#v, got %#v", name, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_example_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_example_test.go deleted file mode 100644 index 48c3d2555..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_example_test.go +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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_test - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/api/resource" -) - -func ExampleFormat() { - memorySize := resource.NewQuantity(5*1024*1024*1024, resource.BinarySI) - fmt.Printf("memorySize = %v\n", memorySize) - - diskSize := resource.NewQuantity(5*1000*1000*1000, resource.DecimalSI) - fmt.Printf("diskSize = %v\n", diskSize) - - cores := resource.NewMilliQuantity(5300, resource.DecimalSI) - fmt.Printf("cores = %v\n", cores) - - // Output: - // memorySize = 5Gi - // diskSize = 5G - // cores = 5300m -} - -func ExampleMustParse() { - memorySize := resource.MustParse("5Gi") - fmt.Printf("memorySize = %v (%v)\n", memorySize.Value(), memorySize.Format) - - diskSize := resource.MustParse("5G") - fmt.Printf("diskSize = %v (%v)\n", diskSize.Value(), diskSize.Format) - - cores := resource.MustParse("5300m") - fmt.Printf("milliCores = %v (%v)\n", cores.MilliValue(), cores.Format) - - cores2 := resource.MustParse("5.4") - fmt.Printf("milliCores = %v (%v)\n", cores2.MilliValue(), cores2.Format) - - // Output: - // memorySize = 5368709120 (BinarySI) - // diskSize = 5000000000 (DecimalSI) - // milliCores = 5300 (DecimalSI) - // milliCores = 5400 (DecimalSI) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_test.go deleted file mode 100644 index 68806b749..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/quantity_test.go +++ /dev/null @@ -1,930 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 - -import ( - //"reflect" - "encoding/json" - "testing" - - fuzz "github.com/google/gofuzz" - "github.com/spf13/pflag" - "speter.net/go/exp/math/dec/inf" -) - -var ( - testQuantityFlag = QuantityFlag("quantityFlag", "1M", "dummy flag for testing the quantity flag mechanism") -) - -func dec(i int64, exponent int) *inf.Dec { - // See the below test-- scale is the negative of an exponent. - return inf.NewDec(i, inf.Scale(-exponent)) -} - -func TestDec(t *testing.T) { - table := []struct { - got *inf.Dec - expect string - }{ - {dec(1, 0), "1"}, - {dec(1, 1), "10"}, - {dec(5, 2), "500"}, - {dec(8, 3), "8000"}, - {dec(2, 0), "2"}, - {dec(1, -1), "0.1"}, - {dec(3, -2), "0.03"}, - {dec(4, -3), "0.004"}, - } - - for _, item := range table { - if e, a := item.expect, item.got.String(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - } -} - -// TestQuantityParseZero ensures that when a 0 quantity is passed, its string value is 0 -func TestQuantityParseZero(t *testing.T) { - zero := MustParse("0") - if expected, actual := "0", zero.String(); expected != actual { - t.Errorf("Expected %v, actual %v", expected, actual) - } -} - -// TestQuantityAddZeroPreservesSuffix verifies that a suffix is preserved -// independent of the order of operations when adding a zero and non-zero val -func TestQuantityAddZeroPreservesSuffix(t *testing.T) { - testValues := []string{"100m", "1Gi"} - zero := MustParse("0") - for _, testValue := range testValues { - value := MustParse(testValue) - v1 := *value.Copy() - // ensure non-zero + zero = non-zero (suffix preserved) - err := v1.Add(zero) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - // ensure zero + non-zero = non-zero (suffix preserved) - v2 := *zero.Copy() - err = v2.Add(value) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - // ensure we preserved the input value - if v1.String() != testValue { - t.Errorf("Expected %v, actual %v", testValue, v1.String()) - } - if v2.String() != testValue { - t.Errorf("Expected %v, actual %v", testValue, v2.String()) - } - } -} - -// TestQuantitySubZeroPreservesSuffix verifies that a suffix is preserved -// independent of the order of operations when subtracting a zero and non-zero val -func TestQuantitySubZeroPreservesSuffix(t *testing.T) { - testValues := []string{"100m", "1Gi"} - zero := MustParse("0") - for _, testValue := range testValues { - value := MustParse(testValue) - v1 := *value.Copy() - // ensure non-zero - zero = non-zero (suffix preserved) - err := v1.Sub(zero) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - // ensure we preserved the input value - if v1.String() != testValue { - t.Errorf("Expected %v, actual %v", testValue, v1.String()) - } - - // ensure zero - non-zero = -non-zero (suffix preserved) - v2 := *zero.Copy() - err = v2.Sub(value) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - negVal := *value.Copy() - err = negVal.Neg(negVal) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - if v2.String() != negVal.String() { - t.Errorf("Expected %v, actual %v", negVal.String(), v2.String()) - } - } -} - -// Verifies that you get 0 as canonical value if internal value is 0, and not 0 -func TestQuantityCanocicalizeZero(t *testing.T) { - val := MustParse("1000m") - x := val.Amount - y := dec(1, 0) - z := val.Amount.Sub(x, y) - zero := Quantity{z, DecimalSI} - if expected, actual := "0", zero.String(); expected != actual { - t.Errorf("Expected %v, actual %v", expected, actual) - } -} - -func TestQuantityCmp(t *testing.T) { - table := []struct { - x string - y string - expect int - }{ - {"0", "0", 0}, - {"100m", "50m", 1}, - {"50m", "100m", -1}, - {"10000T", "100Gi", 1}, - } - for _, testCase := range table { - q1 := MustParse(testCase.x) - q2 := MustParse(testCase.y) - if result := q1.Cmp(q2); result != testCase.expect { - t.Errorf("X: %v, Y: %v, Expected: %v, Actual: %v", testCase.x, testCase.y, testCase.expect, result) - } - } - - nils := []struct { - x *inf.Dec - y *inf.Dec - expect int - }{ - {dec(0, 0), dec(0, 0), 0}, - {nil, dec(0, 0), 0}, - {dec(0, 0), nil, 0}, - {nil, nil, 0}, - {nil, dec(10, 0), -1}, - {nil, dec(-10, 0), 1}, - {dec(10, 0), nil, 1}, - {dec(-10, 0), nil, -1}, - } - for _, nilCase := range nils { - q1 := Quantity{nilCase.x, DecimalSI} - q2 := Quantity{nilCase.y, DecimalSI} - if result := q1.Cmp(q2); result != nilCase.expect { - t.Errorf("X: %v, Y: %v, Expected: %v, Actual: %v", nilCase.x, nilCase.y, nilCase.expect, result) - } - } -} - -func TestQuantityParse(t *testing.T) { - table := []struct { - input string - expect Quantity - }{ - {"0", Quantity{dec(0, 0), DecimalSI}}, - {"0n", Quantity{dec(0, 0), DecimalSI}}, - {"0u", Quantity{dec(0, 0), DecimalSI}}, - {"0m", Quantity{dec(0, 0), DecimalSI}}, - {"0Ki", Quantity{dec(0, 0), BinarySI}}, - {"0k", Quantity{dec(0, 0), DecimalSI}}, - {"0Mi", Quantity{dec(0, 0), BinarySI}}, - {"0M", Quantity{dec(0, 0), DecimalSI}}, - {"0Gi", Quantity{dec(0, 0), BinarySI}}, - {"0G", Quantity{dec(0, 0), DecimalSI}}, - {"0Ti", Quantity{dec(0, 0), BinarySI}}, - {"0T", Quantity{dec(0, 0), DecimalSI}}, - - // Binary suffixes - {"1Ki", Quantity{dec(1024, 0), BinarySI}}, - {"8Ki", Quantity{dec(8*1024, 0), BinarySI}}, - {"7Mi", Quantity{dec(7*1024*1024, 0), BinarySI}}, - {"6Gi", Quantity{dec(6*1024*1024*1024, 0), BinarySI}}, - {"5Ti", Quantity{dec(5*1024*1024*1024*1024, 0), BinarySI}}, - {"4Pi", Quantity{dec(4*1024*1024*1024*1024*1024, 0), BinarySI}}, - {"3Ei", Quantity{dec(3*1024*1024*1024*1024*1024*1024, 0), BinarySI}}, - - {"10Ti", Quantity{dec(10*1024*1024*1024*1024, 0), BinarySI}}, - {"100Ti", Quantity{dec(100*1024*1024*1024*1024, 0), BinarySI}}, - - // Decimal suffixes - {"5n", Quantity{dec(5, -9), DecimalSI}}, - {"4u", Quantity{dec(4, -6), DecimalSI}}, - {"3m", Quantity{dec(3, -3), DecimalSI}}, - {"9", Quantity{dec(9, 0), DecimalSI}}, - {"8k", Quantity{dec(8, 3), DecimalSI}}, - {"7M", Quantity{dec(7, 6), DecimalSI}}, - {"6G", Quantity{dec(6, 9), DecimalSI}}, - {"5T", Quantity{dec(5, 12), DecimalSI}}, - {"40T", Quantity{dec(4, 13), DecimalSI}}, - {"300T", Quantity{dec(3, 14), DecimalSI}}, - {"2P", Quantity{dec(2, 15), DecimalSI}}, - {"1E", Quantity{dec(1, 18), DecimalSI}}, - - // Decimal exponents - {"1E-3", Quantity{dec(1, -3), DecimalExponent}}, - {"1e3", Quantity{dec(1, 3), DecimalExponent}}, - {"1E6", Quantity{dec(1, 6), DecimalExponent}}, - {"1e9", Quantity{dec(1, 9), DecimalExponent}}, - {"1E12", Quantity{dec(1, 12), DecimalExponent}}, - {"1e15", Quantity{dec(1, 15), DecimalExponent}}, - {"1E18", Quantity{dec(1, 18), DecimalExponent}}, - - // Nonstandard but still parsable - {"1e14", Quantity{dec(1, 14), DecimalExponent}}, - {"1e13", Quantity{dec(1, 13), DecimalExponent}}, - {"1e3", Quantity{dec(1, 3), DecimalExponent}}, - {"100.035k", Quantity{dec(100035, 0), DecimalSI}}, - - // Things that look like floating point - {"0.001", Quantity{dec(1, -3), DecimalSI}}, - {"0.0005k", Quantity{dec(5, -1), DecimalSI}}, - {"0.005", Quantity{dec(5, -3), DecimalSI}}, - {"0.05", Quantity{dec(5, -2), DecimalSI}}, - {"0.5", Quantity{dec(5, -1), DecimalSI}}, - {"0.00050k", Quantity{dec(5, -1), DecimalSI}}, - {"0.00500", Quantity{dec(5, -3), DecimalSI}}, - {"0.05000", Quantity{dec(5, -2), DecimalSI}}, - {"0.50000", Quantity{dec(5, -1), DecimalSI}}, - {"0.5e0", Quantity{dec(5, -1), DecimalExponent}}, - {"0.5e-1", Quantity{dec(5, -2), DecimalExponent}}, - {"0.5e-2", Quantity{dec(5, -3), DecimalExponent}}, - {"0.5e0", Quantity{dec(5, -1), DecimalExponent}}, - {"10.035M", Quantity{dec(10035, 3), DecimalSI}}, - - {"1.2e3", Quantity{dec(12, 2), DecimalExponent}}, - {"1.3E+6", Quantity{dec(13, 5), DecimalExponent}}, - {"1.40e9", Quantity{dec(14, 8), DecimalExponent}}, - {"1.53E12", Quantity{dec(153, 10), DecimalExponent}}, - {"1.6e15", Quantity{dec(16, 14), DecimalExponent}}, - {"1.7E18", Quantity{dec(17, 17), DecimalExponent}}, - - {"9.01", Quantity{dec(901, -2), DecimalSI}}, - {"8.1k", Quantity{dec(81, 2), DecimalSI}}, - {"7.123456M", Quantity{dec(7123456, 0), DecimalSI}}, - {"6.987654321G", Quantity{dec(6987654321, 0), DecimalSI}}, - {"5.444T", Quantity{dec(5444, 9), DecimalSI}}, - {"40.1T", Quantity{dec(401, 11), DecimalSI}}, - {"300.2T", Quantity{dec(3002, 11), DecimalSI}}, - {"2.5P", Quantity{dec(25, 14), DecimalSI}}, - {"1.01E", Quantity{dec(101, 16), DecimalSI}}, - - // Things that saturate/round - {"3.001n", Quantity{dec(4, -9), DecimalSI}}, - {"1.1E-9", Quantity{dec(2, -9), DecimalExponent}}, - {"0.0000000001", Quantity{dec(1, -9), DecimalSI}}, - {"0.0000000005", Quantity{dec(1, -9), DecimalSI}}, - {"0.00000000050", Quantity{dec(1, -9), DecimalSI}}, - {"0.5e-9", Quantity{dec(1, -9), DecimalExponent}}, - {"0.9n", Quantity{dec(1, -9), DecimalSI}}, - {"0.00000012345", Quantity{dec(124, -9), DecimalSI}}, - {"0.00000012354", Quantity{dec(124, -9), DecimalSI}}, - {"9Ei", Quantity{maxAllowed, BinarySI}}, - {"9223372036854775807Ki", Quantity{maxAllowed, BinarySI}}, - {"12E", Quantity{maxAllowed, DecimalSI}}, - - // We'll accept fractional binary stuff, too. - {"100.035Ki", Quantity{dec(10243584, -2), BinarySI}}, - {"0.5Mi", Quantity{dec(.5*1024*1024, 0), BinarySI}}, - {"0.05Gi", Quantity{dec(536870912, -1), BinarySI}}, - {"0.025Ti", Quantity{dec(274877906944, -1), BinarySI}}, - - // Things written by trolls - {"0.000000000001Ki", Quantity{dec(2, -9), DecimalSI}}, // rounds up, changes format - {".001", Quantity{dec(1, -3), DecimalSI}}, - {".0001k", Quantity{dec(100, -3), DecimalSI}}, - {"1.", Quantity{dec(1, 0), DecimalSI}}, - {"1.G", Quantity{dec(1, 9), DecimalSI}}, - } - - for _, item := range table { - got, err := ParseQuantity(item.input) - if err != nil { - t.Errorf("%v: unexpected error: %v", item.input, err) - continue - } - if e, a := item.expect.Amount, got.Amount; e.Cmp(a) != 0 { - t.Errorf("%v: expected %v, got %v", item.input, e, a) - } - if e, a := item.expect.Format, got.Format; e != a { - t.Errorf("%v: expected %#v, got %#v", item.input, e, a) - } - } - - // Try the negative version of everything - desired := &inf.Dec{} - for _, item := range table { - got, err := ParseQuantity("-" + item.input) - if err != nil { - t.Errorf("-%v: unexpected error: %v", item.input, err) - continue - } - desired.Neg(item.expect.Amount) - if e, a := desired, got.Amount; e.Cmp(a) != 0 { - t.Errorf("%v: expected %v, got %v", item.input, e, a) - } - if e, a := item.expect.Format, got.Format; e != a { - t.Errorf("%v: expected %#v, got %#v", item.input, e, a) - } - } - - // Try everything with an explicit + - for _, item := range table { - got, err := ParseQuantity("+" + item.input) - if err != nil { - t.Errorf("-%v: unexpected error: %v", item.input, err) - continue - } - if e, a := item.expect.Amount, got.Amount; e.Cmp(a) != 0 { - t.Errorf("%v: expected %v, got %v", item.input, e, a) - } - if e, a := item.expect.Format, got.Format; e != a { - t.Errorf("%v: expected %#v, got %#v", item.input, e, a) - } - } - - invalid := []string{ - "1.1.M", - "1+1.0M", - "0.1mi", - "0.1am", - "aoeu", - ".5i", - "1i", - "-3.01i", - } - for _, item := range invalid { - _, err := ParseQuantity(item) - if err == nil { - t.Errorf("%v parsed unexpectedly", item) - } - } -} - -func TestQuantityString(t *testing.T) { - table := []struct { - in Quantity - expect string - }{ - {Quantity{dec(1024*1024*1024, 0), BinarySI}, "1Gi"}, - {Quantity{dec(300*1024*1024, 0), BinarySI}, "300Mi"}, - {Quantity{dec(6*1024, 0), BinarySI}, "6Ki"}, - {Quantity{dec(1001*1024*1024*1024, 0), BinarySI}, "1001Gi"}, - {Quantity{dec(1024*1024*1024*1024, 0), BinarySI}, "1Ti"}, - {Quantity{dec(5, 0), BinarySI}, "5"}, - {Quantity{dec(500, -3), BinarySI}, "500m"}, - {Quantity{dec(1, 9), DecimalSI}, "1G"}, - {Quantity{dec(1000, 6), DecimalSI}, "1G"}, - {Quantity{dec(1000000, 3), DecimalSI}, "1G"}, - {Quantity{dec(1000000000, 0), DecimalSI}, "1G"}, - {Quantity{dec(1, -3), DecimalSI}, "1m"}, - {Quantity{dec(80, -3), DecimalSI}, "80m"}, - {Quantity{dec(1080, -3), DecimalSI}, "1080m"}, - {Quantity{dec(108, -2), DecimalSI}, "1080m"}, - {Quantity{dec(10800, -4), DecimalSI}, "1080m"}, - {Quantity{dec(300, 6), DecimalSI}, "300M"}, - {Quantity{dec(1, 12), DecimalSI}, "1T"}, - {Quantity{dec(1234567, 6), DecimalSI}, "1234567M"}, - {Quantity{dec(1234567, -3), BinarySI}, "1234567m"}, - {Quantity{dec(3, 3), DecimalSI}, "3k"}, - {Quantity{dec(1025, 0), BinarySI}, "1025"}, - {Quantity{dec(0, 0), DecimalSI}, "0"}, - {Quantity{dec(0, 0), BinarySI}, "0"}, - {Quantity{dec(1, 9), DecimalExponent}, "1e9"}, - {Quantity{dec(1, -3), DecimalExponent}, "1e-3"}, - {Quantity{dec(1, -9), DecimalExponent}, "1e-9"}, - {Quantity{dec(80, -3), DecimalExponent}, "80e-3"}, - {Quantity{dec(300, 6), DecimalExponent}, "300e6"}, - {Quantity{dec(1, 12), DecimalExponent}, "1e12"}, - {Quantity{dec(1, 3), DecimalExponent}, "1e3"}, - {Quantity{dec(3, 3), DecimalExponent}, "3e3"}, - {Quantity{dec(3, 3), DecimalSI}, "3k"}, - {Quantity{dec(0, 0), DecimalExponent}, "0"}, - {Quantity{dec(1, -9), DecimalSI}, "1n"}, - {Quantity{dec(80, -9), DecimalSI}, "80n"}, - {Quantity{dec(1080, -9), DecimalSI}, "1080n"}, - {Quantity{dec(108, -8), DecimalSI}, "1080n"}, - {Quantity{dec(10800, -10), DecimalSI}, "1080n"}, - {Quantity{dec(1, -6), DecimalSI}, "1u"}, - {Quantity{dec(80, -6), DecimalSI}, "80u"}, - {Quantity{dec(1080, -6), DecimalSI}, "1080u"}, - } - for _, item := range table { - got := item.in.String() - if e, a := item.expect, got; e != a { - t.Errorf("%#v: expected %v, got %v", item.in, e, a) - } - } - desired := &inf.Dec{} // Avoid modifying the values in the table. - for _, item := range table { - if item.in.Amount.Cmp(decZero) == 0 { - // Don't expect it to print "-0" ever - continue - } - q := item.in - q.Amount = desired.Neg(q.Amount) - if e, a := "-"+item.expect, q.String(); e != a { - t.Errorf("%#v: expected %v, got %v", item.in, e, a) - } - } -} - -func TestQuantityParseEmit(t *testing.T) { - table := []struct { - in string - expect string - }{ - {"1Ki", "1Ki"}, - {"1Mi", "1Mi"}, - {"1Gi", "1Gi"}, - {"1024Mi", "1Gi"}, - {"1000M", "1G"}, - {".001Ki", "1024m"}, - {".000001Ki", "1024u"}, - {".000000001Ki", "1024n"}, - {".000000000001Ki", "2n"}, - } - - for _, item := range table { - q, err := ParseQuantity(item.in) - if err != nil { - t.Errorf("Couldn't parse %v", item.in) - continue - } - if e, a := item.expect, q.String(); e != a { - t.Errorf("%#v: expected %v, got %v", item.in, e, a) - } - } - for _, item := range table { - q, err := ParseQuantity("-" + item.in) - if err != nil { - t.Errorf("Couldn't parse %v", item.in) - continue - } - if q.Amount.Cmp(decZero) == 0 { - continue - } - if e, a := "-"+item.expect, q.String(); e != a { - t.Errorf("%#v: expected %v, got %v", item.in, e, a) - } - } -} - -var fuzzer = fuzz.New().Funcs( - func(q *Quantity, c fuzz.Continue) { - q.Amount = &inf.Dec{} - if c.RandBool() { - q.Format = BinarySI - if c.RandBool() { - q.Amount.SetScale(0) - q.Amount.SetUnscaled(c.Int63()) - return - } - // Be sure to test cases like 1Mi - q.Amount.SetScale(0) - q.Amount.SetUnscaled(c.Int63n(1024) << uint(10*c.Intn(5))) - return - } - if c.RandBool() { - q.Format = DecimalSI - } else { - q.Format = DecimalExponent - } - if c.RandBool() { - q.Amount.SetScale(inf.Scale(c.Intn(4))) - q.Amount.SetUnscaled(c.Int63()) - return - } - // Be sure to test cases like 1M - q.Amount.SetScale(inf.Scale(3 - c.Intn(15))) - q.Amount.SetUnscaled(c.Int63n(1000)) - }, -) - -func TestJSON(t *testing.T) { - for i := 0; i < 500; i++ { - q := &Quantity{} - fuzzer.Fuzz(q) - b, err := json.Marshal(q) - if err != nil { - t.Errorf("error encoding %v", q) - } - q2 := &Quantity{} - err = json.Unmarshal(b, q2) - if err != nil { - t.Errorf("%v: error decoding %v", q, string(b)) - } - if q2.Amount.Cmp(q.Amount) != 0 { - t.Errorf("Expected equal: %v, %v (json was '%v')", q, q2, string(b)) - } - } -} - -func TestMilliNewSet(t *testing.T) { - table := []struct { - value int64 - format Format - expect string - exact bool - }{ - {1, DecimalSI, "1m", true}, - {1000, DecimalSI, "1", true}, - {1234000, DecimalSI, "1234", true}, - {1024, BinarySI, "1024m", false}, // Format changes - {1000000, "invalidFormatDefaultsToExponent", "1e3", true}, - {1024 * 1024, BinarySI, "1048576m", false}, // Format changes - } - - for _, item := range table { - q := NewMilliQuantity(item.value, item.format) - if e, a := item.expect, q.String(); e != a { - t.Errorf("Expected %v, got %v; %#v", e, a, q) - } - if !item.exact { - continue - } - q2, err := ParseQuantity(q.String()) - if err != nil { - t.Errorf("Round trip failed on %v", q) - } - if e, a := item.value, q2.MilliValue(); e != a { - t.Errorf("Expected %v, got %v", e, a) - } - } - - for _, item := range table { - q := NewQuantity(0, item.format) - q.SetMilli(item.value) - if e, a := item.expect, q.String(); e != a { - t.Errorf("Set: Expected %v, got %v; %#v", e, a, q) - } - } -} - -func TestNewSet(t *testing.T) { - table := []struct { - value int64 - format Format - expect string - }{ - {1, DecimalSI, "1"}, - {1000, DecimalSI, "1k"}, - {1234000, DecimalSI, "1234k"}, - {1024, BinarySI, "1Ki"}, - {1000000, "invalidFormatDefaultsToExponent", "1e6"}, - {1024 * 1024, BinarySI, "1Mi"}, - } - - for _, item := range table { - q := NewQuantity(item.value, item.format) - if e, a := item.expect, q.String(); e != a { - t.Errorf("Expected %v, got %v; %#v", e, a, q) - } - q2, err := ParseQuantity(q.String()) - if err != nil { - t.Errorf("Round trip failed on %v", q) - } - if e, a := item.value, q2.Value(); e != a { - t.Errorf("Expected %v, got %v", e, a) - } - } - - for _, item := range table { - q := NewQuantity(0, item.format) - q.Set(item.value) - if e, a := item.expect, q.String(); e != a { - t.Errorf("Set: Expected %v, got %v; %#v", e, a, q) - } - } -} - -func TestNewScaledSet(t *testing.T) { - table := []struct { - value int64 - scale Scale - expect string - }{ - {1, Nano, "1n"}, - {1000, Nano, "1u"}, - {1, Micro, "1u"}, - {1000, Micro, "1m"}, - {1, Milli, "1m"}, - {1000, Milli, "1"}, - {1, 0, "1"}, - {0, Nano, "0"}, - {0, Micro, "0"}, - {0, Milli, "0"}, - {0, 0, "0"}, - } - - for _, item := range table { - q := NewScaledQuantity(item.value, item.scale) - if e, a := item.expect, q.String(); e != a { - t.Errorf("Expected %v, got %v; %#v", e, a, q) - } - q2, err := ParseQuantity(q.String()) - if err != nil { - t.Errorf("Round trip failed on %v", q) - } - if e, a := item.value, q2.ScaledValue(item.scale); e != a { - t.Errorf("Expected %v, got %v", e, a) - } - q3 := NewQuantity(0, DecimalSI) - q3.SetScaled(item.value, item.scale) - if q.Cmp(*q3) != 0 { - t.Errorf("Expected %v and %v to be equal", q, q3) - } - } -} - -func TestScaledValue(t *testing.T) { - table := []struct { - fromScale Scale - toScale Scale - expected int64 - }{ - {Nano, Nano, 1}, - {Nano, Micro, 1}, - {Nano, Milli, 1}, - {Nano, 0, 1}, - {Micro, Nano, 1000}, - {Micro, Micro, 1}, - {Micro, Milli, 1}, - {Micro, 0, 1}, - {Milli, Nano, 1000 * 1000}, - {Milli, Micro, 1000}, - {Milli, Milli, 1}, - {Milli, 0, 1}, - {0, Nano, 1000 * 1000 * 1000}, - {0, Micro, 1000 * 1000}, - {0, Milli, 1000}, - {0, 0, 1}, - } - - for _, item := range table { - q := NewScaledQuantity(1, item.fromScale) - if e, a := item.expected, q.ScaledValue(item.toScale); e != a { - t.Errorf("%v to %v: Expected %v, got %v", item.fromScale, item.toScale, e, a) - } - } -} - -func TestUninitializedNoCrash(t *testing.T) { - var q Quantity - - q.Value() - q.MilliValue() - q.Copy() - _ = q.String() - q.MarshalJSON() -} - -func TestCopy(t *testing.T) { - q := NewQuantity(5, DecimalSI) - c := q.Copy() - c.Set(6) - if q.Value() == 6 { - t.Errorf("Copy didn't") - } -} - -func TestQFlagSet(t *testing.T) { - qf := qFlag{&Quantity{}} - qf.Set("1Ki") - if e, a := "1Ki", qf.String(); e != a { - t.Errorf("Unexpected result %v != %v", e, a) - } -} - -func TestQFlagIsPFlag(t *testing.T) { - var pfv pflag.Value = qFlag{} - if e, a := "quantity", pfv.Type(); e != a { - t.Errorf("Unexpected result %v != %v", e, a) - } -} - -func TestSub(t *testing.T) { - tests := []struct { - a Quantity - b Quantity - expected Quantity - }{ - {Quantity{dec(10, 0), DecimalSI}, Quantity{dec(1, 1), DecimalSI}, Quantity{dec(0, 0), DecimalSI}}, - {Quantity{dec(10, 0), DecimalSI}, Quantity{dec(1, 0), BinarySI}, Quantity{dec(9, 0), DecimalSI}}, - {Quantity{dec(10, 0), BinarySI}, Quantity{dec(1, 0), DecimalSI}, Quantity{dec(9, 0), BinarySI}}, - {Quantity{nil, DecimalSI}, Quantity{dec(50, 0), DecimalSI}, Quantity{dec(-50, 0), DecimalSI}}, - {Quantity{dec(50, 0), DecimalSI}, Quantity{nil, DecimalSI}, Quantity{dec(50, 0), DecimalSI}}, - {Quantity{nil, DecimalSI}, Quantity{nil, DecimalSI}, Quantity{dec(0, 0), DecimalSI}}, - } - - for i, test := range tests { - test.a.Sub(test.b) - if test.a.Cmp(test.expected) != 0 { - t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), test.a.String()) - } - } -} - -func TestNeg(t *testing.T) { - tests := []struct { - a Quantity - b Quantity - expected Quantity - }{ - { - a: Quantity{dec(0, 0), DecimalSI}, - b: Quantity{dec(10, 0), DecimalSI}, - expected: Quantity{dec(-10, 0), DecimalSI}, - }, - { - a: Quantity{dec(0, 0), DecimalSI}, - b: Quantity{dec(-10, 0), DecimalSI}, - expected: Quantity{dec(10, 0), DecimalSI}, - }, - { - a: Quantity{dec(0, 0), DecimalSI}, - b: Quantity{dec(10, 0), BinarySI}, - expected: Quantity{dec(-10, 0), BinarySI}, - }, - { - a: Quantity{dec(0, 0), DecimalSI}, - b: Quantity{dec(0, 0), BinarySI}, - expected: Quantity{dec(0, 0), BinarySI}, - }, - { - a: Quantity{}, - b: Quantity{dec(10, 0), BinarySI}, - expected: Quantity{dec(-10, 0), BinarySI}, - }, - { - a: Quantity{dec(10, 0), BinarySI}, - b: Quantity{}, - expected: Quantity{}, - }, - { - a: Quantity{dec(10, 0), BinarySI}, - b: Quantity{Format: DecimalSI}, - expected: Quantity{dec(0, 0), DecimalSI}, - }, - } - - for i, test := range tests { - test.a.Neg(test.b) - // ensure value is same - if test.a.Cmp(test.expected) != 0 { - t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), test.a.String()) - } - // ensure format is updated - if test.a.Format != test.expected.Format { - t.Errorf("[%d] Expected format %v, got format %v", i, test.expected.Format, test.a.Format) - } - } -} - -func TestAdd(t *testing.T) { - tests := []struct { - a Quantity - b Quantity - expected Quantity - }{ - {Quantity{dec(10, 0), DecimalSI}, Quantity{dec(1, 1), DecimalSI}, Quantity{dec(20, 0), DecimalSI}}, - {Quantity{dec(10, 0), DecimalSI}, Quantity{dec(1, 0), BinarySI}, Quantity{dec(11, 0), DecimalSI}}, - {Quantity{dec(10, 0), BinarySI}, Quantity{dec(1, 0), DecimalSI}, Quantity{dec(11, 0), BinarySI}}, - {Quantity{nil, DecimalSI}, Quantity{dec(50, 0), DecimalSI}, Quantity{dec(50, 0), DecimalSI}}, - {Quantity{dec(50, 0), DecimalSI}, Quantity{nil, DecimalSI}, Quantity{dec(50, 0), DecimalSI}}, - {Quantity{nil, DecimalSI}, Quantity{nil, DecimalSI}, Quantity{dec(0, 0), DecimalSI}}, - } - - for i, test := range tests { - test.a.Add(test.b) - if test.a.Cmp(test.expected) != 0 { - t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), test.a.String()) - } - } -} - -func benchmarkQuantities() []Quantity { - return []Quantity{ - {dec(1024*1024*1024, 0), BinarySI}, - {dec(1024*1024*1024*1024, 0), BinarySI}, - {dec(1000000, 3), DecimalSI}, - {dec(1000000000, 0), DecimalSI}, - {dec(1, -3), DecimalSI}, - {dec(80, -3), DecimalSI}, - {dec(1080, -3), DecimalSI}, - {dec(0, 0), BinarySI}, - {dec(1, 9), DecimalExponent}, - {dec(1, -9), DecimalSI}, - } -} - -func BenchmarkQuantityString(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - var s string - for i := 0; i < b.N; i++ { - s = values[i%len(values)].String() - } - b.StopTimer() - if len(s) == 0 { - b.Fatal(s) - } -} - -func BenchmarkQuantityMarshalJSON(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := values[i%len(values)].MarshalJSON(); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkQuantityUnmarshalJSON(b *testing.B) { - values := benchmarkQuantities() - var json [][]byte - for _, v := range values { - data, _ := v.MarshalJSON() - json = append(json, data) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - var q Quantity - if err := q.UnmarshalJSON(json[i%len(values)]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkParseQuantity(b *testing.B) { - values := benchmarkQuantities() - var strings []string - for _, v := range values { - strings = append(strings, v.String()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := ParseQuantity(strings[i%len(values)]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkCanonicalize(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - for i := 0; i < b.N; i++ { - s, _ := values[i%len(values)].Canonicalize() - if len(s) == 0 { - b.Fatal(s) - } - } - b.StopTimer() -} - -func BenchmarkQuantityCopy(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - for i := 0; i < b.N; i++ { - q := values[i%len(values)].Copy() - if q.Amount == nil { - b.Fatal(q) - } - } - b.StopTimer() -} - -func BenchmarkQuantityAdd(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - for i := 0; i < b.N; i++ { - q := values[i%len(values)] - if err := q.Add(q); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkQuantityRound(b *testing.B) { - values := benchmarkQuantities() - b.ResetTimer() - for i := 0; i < b.N; i++ { - q := values[i%len(values)] - if q.Cmp(q) != 0 { - b.Fatal(q) - } - } - b.StopTimer() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/scale_int_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/scale_int_test.go deleted file mode 100644 index 1b4390e55..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource/scale_int_test.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 - -import ( - "math" - "math/big" - "testing" -) - -func TestScaledValueInternal(t *testing.T) { - tests := []struct { - unscaled *big.Int - scale int - newScale int - - want int64 - }{ - // remain scale - {big.NewInt(1000), 0, 0, 1000}, - - // scale down - {big.NewInt(1000), 0, -3, 1}, - {big.NewInt(1000), 3, 0, 1}, - {big.NewInt(0), 3, 0, 0}, - - // always round up - {big.NewInt(999), 3, 0, 1}, - {big.NewInt(500), 3, 0, 1}, - {big.NewInt(499), 3, 0, 1}, - {big.NewInt(1), 3, 0, 1}, - // large scaled value does not lose precision - {big.NewInt(0).Sub(maxInt64, bigOne), 1, 0, (math.MaxInt64-1)/10 + 1}, - // large intermidiate result. - {big.NewInt(1).Exp(big.NewInt(10), big.NewInt(100), nil), 100, 0, 1}, - - // scale up - {big.NewInt(0), 0, 3, 0}, - {big.NewInt(1), 0, 3, 1000}, - {big.NewInt(1), -3, 0, 1000}, - {big.NewInt(1000), -3, 2, 100000000}, - {big.NewInt(0).Div(big.NewInt(math.MaxInt64), bigThousand), 0, 3, - (math.MaxInt64 / 1000) * 1000}, - } - - for i, tt := range tests { - old := (&big.Int{}).Set(tt.unscaled) - got := scaledValue(tt.unscaled, tt.scale, tt.newScale) - if got != tt.want { - t.Errorf("#%d: got = %v, want %v", i, got, tt.want) - } - if tt.unscaled.Cmp(old) != 0 { - t.Errorf("#%d: unscaled = %v, want %v", i, tt.unscaled, old) - } - } -} - -func BenchmarkScaledValueSmall(b *testing.B) { - s := big.NewInt(1000) - for i := 0; i < b.N; i++ { - scaledValue(s, 3, 0) - } -} - -func BenchmarkScaledValueLarge(b *testing.B) { - s := big.NewInt(math.MaxInt64) - s.Mul(s, big.NewInt(1000)) - for i := 0; i < b.N; i++ { - scaledValue(s, 10, 0) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource_helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource_helpers_test.go deleted file mode 100644 index 12c0ce7db..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/resource_helpers_test.go +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api/resource" -) - -func TestResourceHelpers(t *testing.T) { - cpuLimit := resource.MustParse("10") - memoryLimit := resource.MustParse("10G") - resourceSpec := ResourceRequirements{ - Limits: ResourceList{ - "cpu": cpuLimit, - "memory": memoryLimit, - "kube.io/storage": memoryLimit, - }, - } - if res := resourceSpec.Limits.Cpu(); *res != cpuLimit { - t.Errorf("expected cpulimit %v, got %v", cpuLimit, res) - } - if res := resourceSpec.Limits.Memory(); *res != memoryLimit { - t.Errorf("expected memorylimit %v, got %v", memoryLimit, res) - } - resourceSpec = ResourceRequirements{ - Limits: ResourceList{ - "memory": memoryLimit, - "kube.io/storage": memoryLimit, - }, - } - if res := resourceSpec.Limits.Cpu(); res.Value() != 0 { - t.Errorf("expected cpulimit %v, got %v", 0, res) - } - if res := resourceSpec.Limits.Memory(); *res != memoryLimit { - t.Errorf("expected memorylimit %v, got %v", memoryLimit, res) - } -} - -func TestDefaultResourceHelpers(t *testing.T) { - resourceList := ResourceList{} - if resourceList.Cpu().Format != resource.DecimalSI { - t.Errorf("expected %v, actual %v", resource.DecimalSI, resourceList.Cpu().Format) - } - if resourceList.Memory().Format != resource.BinarySI { - t.Errorf("expected %v, actual %v", resource.BinarySI, resourceList.Memory().Format) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/rest/resttest/resttest.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/rest/resttest/resttest.go deleted file mode 100644 index bd0a36475..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/rest/resttest/resttest.go +++ /dev/null @@ -1,1064 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 resttest - -import ( - "fmt" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/rest" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/wait" -) - -type Tester struct { - *testing.T - storage rest.Storage - clusterScope bool - createOnUpdate bool - generatesName bool - returnDeletedObject bool -} - -func New(t *testing.T, storage rest.Storage) *Tester { - return &Tester{ - T: t, - storage: storage, - } -} - -func (t *Tester) ClusterScope() *Tester { - t.clusterScope = true - return t -} - -func (t *Tester) AllowCreateOnUpdate() *Tester { - t.createOnUpdate = true - return t -} - -func (t *Tester) GeneratesName() *Tester { - t.generatesName = true - return t -} - -func (t *Tester) ReturnDeletedObject() *Tester { - t.returnDeletedObject = true - return t -} - -// TestNamespace returns the namespace that will be used when creating contexts. -// Returns NamespaceNone for cluster-scoped objects. -func (t *Tester) TestNamespace() string { - if t.clusterScope { - return api.NamespaceNone - } - return "test" -} - -// TestContext returns a namespaced context that will be used when making storage calls. -// Namespace is determined by TestNamespace() -func (t *Tester) TestContext() api.Context { - if t.clusterScope { - return api.NewContext() - } - return api.WithNamespace(api.NewContext(), t.TestNamespace()) -} - -func (t *Tester) getObjectMetaOrFail(obj runtime.Object) *api.ObjectMeta { - meta, err := api.ObjectMetaFor(obj) - if err != nil { - t.Fatalf("object does not have ObjectMeta: %v\n%#v", err, obj) - } - return meta -} - -func (t *Tester) setObjectMeta(obj runtime.Object, name string) { - meta := t.getObjectMetaOrFail(obj) - meta.Name = name - if t.clusterScope { - meta.Namespace = api.NamespaceNone - } else { - meta.Namespace = api.NamespaceValue(t.TestContext()) - } - meta.GenerateName = "" -} - -func copyOrDie(obj runtime.Object) runtime.Object { - out, err := api.Scheme.Copy(obj) - if err != nil { - panic(err) - } - return out -} - -type AssignFunc func([]runtime.Object) []runtime.Object -type EmitFunc func(runtime.Object, string) error -type GetFunc func(api.Context, runtime.Object) (runtime.Object, error) -type InitWatchFunc func() -type InjectErrFunc func(err error) -type IsErrorFunc func(err error) bool -type CreateFunc func(api.Context, runtime.Object) error -type SetRVFunc func(uint64) -type UpdateFunc func(runtime.Object) runtime.Object - -// Test creating an object. -func (t *Tester) TestCreate(valid runtime.Object, createFn CreateFunc, getFn GetFunc, invalid ...runtime.Object) { - t.testCreateHasMetadata(copyOrDie(valid)) - if !t.generatesName { - t.testCreateGeneratesName(copyOrDie(valid)) - } - t.testCreateEquals(copyOrDie(valid), getFn) - t.testCreateAlreadyExisting(copyOrDie(valid), createFn) - if t.clusterScope { - t.testCreateDiscardsObjectNamespace(copyOrDie(valid)) - t.testCreateIgnoresContextNamespace(copyOrDie(valid)) - t.testCreateIgnoresMismatchedNamespace(copyOrDie(valid)) - } else { - t.testCreateRejectsMismatchedNamespace(copyOrDie(valid)) - } - t.testCreateInvokesValidation(invalid...) - t.testCreateValidatesNames(copyOrDie(valid)) -} - -// Test updating an object. -func (t *Tester) TestUpdate(valid runtime.Object, createFn CreateFunc, getFn GetFunc, updateFn UpdateFunc, invalidUpdateFn ...UpdateFunc) { - t.testUpdateEquals(copyOrDie(valid), createFn, getFn, updateFn) - t.testUpdateFailsOnVersionTooOld(copyOrDie(valid), createFn, getFn) - t.testUpdateOnNotFound(copyOrDie(valid)) - if !t.clusterScope { - t.testUpdateRejectsMismatchedNamespace(copyOrDie(valid), createFn) - } - t.testUpdateInvokesValidation(copyOrDie(valid), createFn, invalidUpdateFn...) - t.testUpdateWithWrongUID(copyOrDie(valid), createFn, getFn) -} - -// Test deleting an object. -func (t *Tester) TestDelete(valid runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { - t.testDeleteNonExist(copyOrDie(valid)) - t.testDeleteNoGraceful(copyOrDie(valid), createFn, getFn, isNotFoundFn) - t.testDeleteWithUID(copyOrDie(valid), createFn, getFn, isNotFoundFn) -} - -// Test gracefully deleting an object. -func (t *Tester) TestDeleteGraceful(valid runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { - t.testDeleteGracefulHasDefault(copyOrDie(valid), createFn, getFn, expectedGrace) - t.testDeleteGracefulWithValue(copyOrDie(valid), createFn, getFn, expectedGrace) - t.testDeleteGracefulUsesZeroOnNil(copyOrDie(valid), createFn, expectedGrace) - t.testDeleteGracefulExtend(copyOrDie(valid), createFn, getFn, expectedGrace) - t.testDeleteGracefulImmediate(copyOrDie(valid), createFn, getFn, expectedGrace) -} - -// Test getting object. -func (t *Tester) TestGet(valid runtime.Object) { - t.testGetFound(copyOrDie(valid)) - t.testGetNotFound(copyOrDie(valid)) - t.testGetMimatchedNamespace(copyOrDie(valid)) - if !t.clusterScope { - t.testGetDifferentNamespace(copyOrDie(valid)) - } -} - -// Test listing objects. -func (t *Tester) TestList(valid runtime.Object, assignFn AssignFunc) { - t.testListNotFound(assignFn) - t.testListFound(copyOrDie(valid), assignFn) - t.testListMatchLabels(copyOrDie(valid), assignFn) -} - -// Test watching objects. -func (t *Tester) TestWatch( - valid runtime.Object, emitFn EmitFunc, - labelsPass, labelsFail []labels.Set, fieldsPass, fieldsFail []fields.Set, actions []string) { - t.testWatchLabels(copyOrDie(valid), emitFn, labelsPass, labelsFail, actions) - t.testWatchFields(copyOrDie(valid), emitFn, fieldsPass, fieldsFail, actions) -} - -// ============================================================================= -// Creation tests. - -func (t *Tester) testCreateAlreadyExisting(obj runtime.Object, createFn CreateFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo1") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - - _, err := t.storage.(rest.Creater).Create(ctx, foo) - if !errors.IsAlreadyExists(err) { - t.Errorf("expected already exists err, got %v", err) - } -} - -func (t *Tester) testCreateEquals(obj runtime.Object, getFn GetFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo2") - - created, err := t.storage.(rest.Creater).Create(ctx, foo) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - got, err := getFn(ctx, foo) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - // Set resource version which might be unset in created object. - createdMeta := t.getObjectMetaOrFail(created) - gotMeta := t.getObjectMetaOrFail(got) - createdMeta.ResourceVersion = gotMeta.ResourceVersion - - if e, a := created, got; !api.Semantic.DeepEqual(e, a) { - t.Errorf("unexpected obj: %#v, expected %#v", e, a) - } -} - -func (t *Tester) testCreateDiscardsObjectNamespace(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - - // Ignore non-empty namespace in object meta - objectMeta.Namespace = "not-default" - - // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted - created, err := t.storage.(rest.Creater).Create(t.TestContext(), copyOrDie(valid)) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - createdObjectMeta := t.getObjectMetaOrFail(created) - if createdObjectMeta.Namespace != api.NamespaceNone { - t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) - } -} - -func (t *Tester) testCreateGeneratesName(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - objectMeta.Name = "" - objectMeta.GenerateName = "test-" - - _, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if objectMeta.Name == "test-" || !strings.HasPrefix(objectMeta.Name, "test-") { - t.Errorf("unexpected name: %#v", valid) - } -} - -func (t *Tester) testCreateHasMetadata(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - objectMeta.Name = "" - objectMeta.GenerateName = "test-" - objectMeta.Namespace = t.TestNamespace() - - obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if obj == nil { - t.Fatalf("Unexpected object from result: %#v", obj) - } - if !api.HasObjectMetaSystemFieldValues(objectMeta) { - t.Errorf("storage did not populate object meta field values") - } -} - -func (t *Tester) testCreateIgnoresContextNamespace(valid runtime.Object) { - // Ignore non-empty namespace in context - ctx := api.WithNamespace(api.NewContext(), "not-default2") - - // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted - created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid)) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - createdObjectMeta := t.getObjectMetaOrFail(created) - if createdObjectMeta.Namespace != api.NamespaceNone { - t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) - } -} - -func (t *Tester) testCreateIgnoresMismatchedNamespace(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - - // Ignore non-empty namespace in object meta - objectMeta.Namespace = "not-default" - ctx := api.WithNamespace(api.NewContext(), "not-default2") - - // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted - created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid)) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - createdObjectMeta := t.getObjectMetaOrFail(created) - if createdObjectMeta.Namespace != api.NamespaceNone { - t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) - } -} - -func (t *Tester) testCreateValidatesNames(valid runtime.Object) { - for _, invalidName := range validation.NameMayNotBe { - objCopy := copyOrDie(valid) - objCopyMeta := t.getObjectMetaOrFail(objCopy) - objCopyMeta.Name = invalidName - - ctx := t.TestContext() - _, err := t.storage.(rest.Creater).Create(ctx, objCopy) - if !errors.IsInvalid(err) { - t.Errorf("%s: Expected to get an invalid resource error, got %v", invalidName, err) - } - } - - for _, invalidSuffix := range validation.NameMayNotContain { - objCopy := copyOrDie(valid) - objCopyMeta := t.getObjectMetaOrFail(objCopy) - objCopyMeta.Name += invalidSuffix - - ctx := t.TestContext() - _, err := t.storage.(rest.Creater).Create(ctx, objCopy) - if !errors.IsInvalid(err) { - t.Errorf("%s: Expected to get an invalid resource error, got %v", invalidSuffix, err) - } - } -} - -func (t *Tester) testCreateInvokesValidation(invalid ...runtime.Object) { - for i, obj := range invalid { - ctx := t.TestContext() - _, err := t.storage.(rest.Creater).Create(ctx, obj) - if !errors.IsInvalid(err) { - t.Errorf("%d: Expected to get an invalid resource error, got %v", i, err) - } - } -} - -func (t *Tester) testCreateRejectsMismatchedNamespace(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - objectMeta.Namespace = "not-default" - - _, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) - if err == nil { - t.Errorf("Expected an error, but we didn't get one") - } else if !strings.Contains(err.Error(), "does not match the namespace sent on the request") { - t.Errorf("Expected 'does not match the namespace sent on the request' error, got '%v'", err.Error()) - } -} - -func (t *Tester) testCreateResetsUserData(valid runtime.Object) { - objectMeta := t.getObjectMetaOrFail(valid) - now := unversioned.Now() - objectMeta.UID = "bad-uid" - objectMeta.CreationTimestamp = now - - obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if obj == nil { - t.Fatalf("Unexpected object from result: %#v", obj) - } - if objectMeta.UID == "bad-uid" || objectMeta.CreationTimestamp == now { - t.Errorf("ObjectMeta did not reset basic fields: %#v", objectMeta) - } -} - -// ============================================================================= -// Update tests. - -func (t *Tester) testUpdateEquals(obj runtime.Object, createFn CreateFunc, getFn GetFunc, updateFn UpdateFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo2") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - - toUpdate, err := getFn(ctx, foo) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - toUpdate = updateFn(toUpdate) - updated, created, err := t.storage.(rest.Updater).Update(ctx, toUpdate) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if created { - t.Errorf("unexpected creation") - } - got, err := getFn(ctx, foo) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - // Set resource version which might be unset in created object. - updatedMeta := t.getObjectMetaOrFail(updated) - gotMeta := t.getObjectMetaOrFail(got) - updatedMeta.ResourceVersion = gotMeta.ResourceVersion - - if e, a := updated, got; !api.Semantic.DeepEqual(e, a) { - t.Errorf("unexpected obj: %#v, expected %#v", e, a) - } -} - -func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, createFn CreateFunc, getFn GetFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo3") - - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - - storedFoo, err := getFn(ctx, foo) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - older := copyOrDie(storedFoo) - olderMeta := t.getObjectMetaOrFail(older) - olderMeta.ResourceVersion = "1" - - _, _, err = t.storage.(rest.Updater).Update(t.TestContext(), older) - if err == nil { - t.Errorf("Expected an error, but we didn't get one") - } else if !errors.IsConflict(err) { - t.Errorf("Expected Conflict error, got '%v'", err) - } -} - -func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, createFn CreateFunc, invalidUpdateFn ...UpdateFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo4") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - - for _, update := range invalidUpdateFn { - toUpdate := update(copyOrDie(foo)) - got, created, err := t.storage.(rest.Updater).Update(t.TestContext(), toUpdate) - if got != nil || created { - t.Errorf("expected nil object and no creation for object: %v", toUpdate) - } - if !errors.IsInvalid(err) && !errors.IsBadRequest(err) { - t.Errorf("expected invalid or bad request error, got %v", err) - } - } -} - -func (t *Tester) testUpdateWithWrongUID(obj runtime.Object, createFn CreateFunc, getFn GetFunc) { - ctx := t.TestContext() - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo5") - objectMeta := t.getObjectMetaOrFail(foo) - objectMeta.UID = types.UID("UID0000") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta.UID = types.UID("UID1111") - - obj, created, err := t.storage.(rest.Updater).Update(ctx, foo) - if created || obj != nil { - t.Errorf("expected nil object and no creation for object: %v", foo) - } - if err == nil || !errors.IsConflict(err) { - t.Errorf("unexpected error: %v", err) - } -} - -func (t *Tester) testUpdateOnNotFound(obj runtime.Object) { - t.setObjectMeta(obj, "foo") - _, created, err := t.storage.(rest.Updater).Update(t.TestContext(), obj) - if t.createOnUpdate { - if err != nil { - t.Errorf("creation allowed on updated, but got an error: %v", err) - } - if !created { - t.Errorf("creation allowed on update, but object not created") - } - } else { - if err == nil { - t.Errorf("Expected an error, but we didn't get one") - } else if !errors.IsNotFound(err) { - t.Errorf("Expected NotFound error, got '%v'", err) - } - } -} - -func (t *Tester) testUpdateRejectsMismatchedNamespace(obj runtime.Object, createFn CreateFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo1") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - - objectMeta := t.getObjectMetaOrFail(obj) - objectMeta.Name = "foo1" - objectMeta.Namespace = "not-default" - - obj, updated, err := t.storage.(rest.Updater).Update(t.TestContext(), obj) - if obj != nil || updated { - t.Errorf("expected nil object and not updated") - } - if err == nil { - t.Errorf("expected an error, but didn't get one") - } else if !strings.Contains(err.Error(), "does not match the namespace sent on the request") { - t.Errorf("expected 'does not match the namespace sent on the request' error, got '%v'", err.Error()) - } -} - -// ============================================================================= -// Deletion tests. - -func (t *Tester) testDeleteNoGraceful(obj runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo1") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - obj, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(10)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !t.returnDeletedObject { - if status, ok := obj.(*unversioned.Status); !ok { - t.Errorf("expected status of delete, got %v", status) - } else if status.Status != unversioned.StatusSuccess { - t.Errorf("expected success, got: %v", status.Status) - } - } - - _, err = getFn(ctx, foo) - if err == nil || !isNotFoundFn(err) { - t.Errorf("unexpected error: %v", err) - } -} - -func (t *Tester) testDeleteNonExist(obj runtime.Object) { - objectMeta := t.getObjectMetaOrFail(obj) - - _, err := t.storage.(rest.GracefulDeleter).Delete(t.TestContext(), objectMeta.Name, nil) - if err == nil || !errors.IsNotFound(err) { - t.Errorf("unexpected error: %v", err) - } - -} - -// This test the fast-fail path. We test that the precondition gets verified -// again before deleting the object in tests of pkg/storage/etcd. -func (t *Tester) testDeleteWithUID(obj runtime.Object, createFn CreateFunc, getFn GetFunc, isNotFoundFn IsErrorFunc) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo1") - objectMeta := t.getObjectMetaOrFail(foo) - objectMeta.UID = types.UID("UID0000") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - obj, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewPreconditionDeleteOptions("UID1111")) - if err == nil || !errors.IsConflict(err) { - t.Errorf("unexpected error: %v", err) - } - - obj, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewPreconditionDeleteOptions("UID0000")) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if !t.returnDeletedObject { - if status, ok := obj.(*unversioned.Status); !ok { - t.Errorf("expected status of delete, got %v", status) - } else if status.Status != unversioned.StatusSuccess { - t.Errorf("expected success, got: %v", status.Status) - } - } - - _, err = getFn(ctx, foo) - if err == nil || !isNotFoundFn(err) { - t.Errorf("unexpected error: %v", err) - } -} - -// ============================================================================= -// Graceful Deletion tests. - -func (t *Tester) testDeleteGracefulHasDefault(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo1") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, &api.DeleteOptions{}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, err := getFn(ctx, foo); err != nil { - t.Fatalf("did not gracefully delete resource: %v", err) - } - - object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name) - if err != nil { - t.Fatalf("unexpected error, object should exist: %v", err) - } - objectMeta = t.getObjectMetaOrFail(object) - if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace { - t.Errorf("unexpected deleted meta: %#v", objectMeta) - } -} - -func (t *Tester) testDeleteGracefulWithValue(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo2") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(expectedGrace+2)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, err := getFn(ctx, foo); err != nil { - t.Fatalf("did not gracefully delete resource: %v", err) - } - - object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name) - if err != nil { - t.Errorf("unexpected error, object should exist: %v", err) - } - objectMeta = t.getObjectMetaOrFail(object) - if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace+2 { - t.Errorf("unexpected deleted meta: %#v", objectMeta) - } -} - -func (t *Tester) testDeleteGracefulExtend(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo3") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(expectedGrace)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, err := getFn(ctx, foo); err != nil { - t.Fatalf("did not gracefully delete resource: %v", err) - } - - // second delete duration is ignored - _, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(expectedGrace+2)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name) - if err != nil { - t.Errorf("unexpected error, object should exist: %v", err) - } - objectMeta = t.getObjectMetaOrFail(object) - if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace { - t.Errorf("unexpected deleted meta: %#v", objectMeta) - } -} - -func (t *Tester) testDeleteGracefulImmediate(obj runtime.Object, createFn CreateFunc, getFn GetFunc, expectedGrace int64) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo4") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(expectedGrace)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, err := getFn(ctx, foo); err != nil { - t.Fatalf("did not gracefully delete resource: %v", err) - } - - // second delete is immediate, resource is deleted - out, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, api.NewDeleteOptions(0)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - _, err = t.storage.(rest.Getter).Get(ctx, objectMeta.Name) - if !errors.IsNotFound(err) { - t.Errorf("unexpected error, object should be deleted immediately: %v", err) - } - objectMeta = t.getObjectMetaOrFail(out) - // the second delete shouldn't update the object, so the objectMeta.DeletionGracePeriodSeconds should eqaul to the value set in the first delete. - if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != 0 { - t.Errorf("unexpected deleted meta: %#v", objectMeta) - } -} - -func (t *Tester) testDeleteGracefulUsesZeroOnNil(obj runtime.Object, createFn CreateFunc, expectedGrace int64) { - ctx := t.TestContext() - - foo := copyOrDie(obj) - t.setObjectMeta(foo, "foo5") - if err := createFn(ctx, foo); err != nil { - t.Errorf("unexpected error: %v", err) - } - objectMeta := t.getObjectMetaOrFail(foo) - _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, nil) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name); !errors.IsNotFound(err) { - t.Errorf("unexpected error, object should not exist: %v", err) - } -} - -// ============================================================================= -// Get tests. - -// testGetDifferentNamespace ensures same-name objects in different namespaces do not clash -func (t *Tester) testGetDifferentNamespace(obj runtime.Object) { - if t.clusterScope { - t.Fatalf("the test does not work in in cluster-scope") - } - - objMeta := t.getObjectMetaOrFail(obj) - objMeta.Name = "foo5" - - ctx1 := api.WithNamespace(api.NewContext(), "bar3") - objMeta.Namespace = api.NamespaceValue(ctx1) - _, err := t.storage.(rest.Creater).Create(ctx1, obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - ctx2 := api.WithNamespace(api.NewContext(), "bar4") - objMeta.Namespace = api.NamespaceValue(ctx2) - _, err = t.storage.(rest.Creater).Create(ctx2, obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - got1, err := t.storage.(rest.Getter).Get(ctx1, objMeta.Name) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - got1Meta := t.getObjectMetaOrFail(got1) - if got1Meta.Name != objMeta.Name { - t.Errorf("unexpected name of object: %#v, expected: %s", got1, objMeta.Name) - } - if got1Meta.Namespace != api.NamespaceValue(ctx1) { - t.Errorf("unexpected namespace of object: %#v, expected: %s", got1, api.NamespaceValue(ctx1)) - } - - got2, err := t.storage.(rest.Getter).Get(ctx2, objMeta.Name) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - got2Meta := t.getObjectMetaOrFail(got2) - if got2Meta.Name != objMeta.Name { - t.Errorf("unexpected name of object: %#v, expected: %s", got2, objMeta.Name) - } - if got2Meta.Namespace != api.NamespaceValue(ctx2) { - t.Errorf("unexpected namespace of object: %#v, expected: %s", got2, api.NamespaceValue(ctx2)) - } -} - -func (t *Tester) testGetFound(obj runtime.Object) { - ctx := t.TestContext() - t.setObjectMeta(obj, "foo1") - - existing, err := t.storage.(rest.Creater).Create(ctx, obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - existingMeta := t.getObjectMetaOrFail(existing) - - got, err := t.storage.(rest.Getter).Get(ctx, "foo1") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - gotMeta := t.getObjectMetaOrFail(got) - gotMeta.ResourceVersion = existingMeta.ResourceVersion - if e, a := existing, got; !api.Semantic.DeepEqual(e, a) { - t.Errorf("unexpected obj: %#v, expected %#v", e, a) - } -} - -func (t *Tester) testGetMimatchedNamespace(obj runtime.Object) { - ctx1 := api.WithNamespace(api.NewContext(), "bar1") - ctx2 := api.WithNamespace(api.NewContext(), "bar2") - objMeta := t.getObjectMetaOrFail(obj) - objMeta.Name = "foo4" - objMeta.Namespace = api.NamespaceValue(ctx1) - _, err := t.storage.(rest.Creater).Create(ctx1, obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - _, err = t.storage.(rest.Getter).Get(ctx2, "foo4") - if t.clusterScope { - if err != nil { - t.Errorf("unexpected error: %v", err) - } - } else { - if !errors.IsNotFound(err) { - t.Errorf("unexpected error returned: %#v", err) - } - } -} - -func (t *Tester) testGetNotFound(obj runtime.Object) { - ctx := t.TestContext() - t.setObjectMeta(obj, "foo2") - _, err := t.storage.(rest.Creater).Create(ctx, obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - _, err = t.storage.(rest.Getter).Get(ctx, "foo3") - if !errors.IsNotFound(err) { - t.Errorf("unexpected error returned: %#v", err) - } -} - -// ============================================================================= -// List tests. - -func listToItems(listObj runtime.Object) ([]runtime.Object, error) { - v, err := conversion.EnforcePtr(listObj) - if err != nil { - return nil, fmt.Errorf("unexpected error: %v", err) - } - items := v.FieldByName("Items") - if !items.IsValid() { - return nil, fmt.Errorf("unexpected Items field in %v", listObj) - } - if items.Type().Kind() != reflect.Slice { - return nil, fmt.Errorf("unexpected Items field type: %v", items.Type().Kind()) - } - result := make([]runtime.Object, items.Len()) - for i := 0; i < items.Len(); i++ { - result[i] = items.Index(i).Addr().Interface().(runtime.Object) - } - return result, nil -} - -func (t *Tester) testListFound(obj runtime.Object, assignFn AssignFunc) { - ctx := t.TestContext() - - foo1 := copyOrDie(obj) - t.setObjectMeta(foo1, "foo1") - foo2 := copyOrDie(obj) - t.setObjectMeta(foo2, "foo2") - - existing := assignFn([]runtime.Object{foo1, foo2}) - - listObj, err := t.storage.(rest.Lister).List(ctx, nil) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - items, err := listToItems(listObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(items) != len(existing) { - t.Errorf("unexpected number of items: %v", len(items)) - } - if !api.Semantic.DeepEqual(existing, items) { - t.Errorf("expected: %#v, got: %#v", existing, items) - } -} - -func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) { - ctx := t.TestContext() - testLabels := map[string]string{"key": "value"} - - foo3 := copyOrDie(obj) - t.setObjectMeta(foo3, "foo3") - foo4 := copyOrDie(obj) - foo4Meta := t.getObjectMetaOrFail(foo4) - foo4Meta.Name = "foo4" - foo4Meta.Namespace = api.NamespaceValue(ctx) - foo4Meta.Labels = testLabels - - objs := ([]runtime.Object{foo3, foo4}) - - assignFn(objs) - filtered := []runtime.Object{objs[1]} - - selector := labels.SelectorFromSet(labels.Set(testLabels)) - options := &api.ListOptions{LabelSelector: selector} - listObj, err := t.storage.(rest.Lister).List(ctx, options) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - items, err := listToItems(listObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(items) != len(filtered) { - t.Errorf("unexpected number of items: %v", len(items)) - } - if !api.Semantic.DeepEqual(filtered, items) { - t.Errorf("expected: %#v, got: %#v", filtered, items) - } -} - -func (t *Tester) testListNotFound(assignFn AssignFunc) { - ctx := t.TestContext() - _ = assignFn([]runtime.Object{}) - - listObj, err := t.storage.(rest.Lister).List(ctx, nil) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - items, err := listToItems(listObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(items) != 0 { - t.Errorf("unexpected items: %#v", items) - } -} - -// ============================================================================= -// Watching tests. - -func (t *Tester) testWatchFields(obj runtime.Object, emitFn EmitFunc, fieldsPass, fieldsFail []fields.Set, actions []string) { - ctx := t.TestContext() - - for _, field := range fieldsPass { - for _, action := range actions { - options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"} - watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) - if err != nil { - t.Errorf("unexpected error: %v, %v", err, action) - } - - if err := emitFn(obj, action); err != nil { - t.Errorf("unexpected error: %v", err) - } - - select { - case _, ok := <-watcher.ResultChan(): - if !ok { - t.Errorf("watch channel should be open") - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("unexpected timeout from result channel") - } - watcher.Stop() - } - } - - for _, field := range fieldsFail { - for _, action := range actions { - options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"} - watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := emitFn(obj, action); err != nil { - t.Errorf("unexpected error: %v", err) - } - - select { - case <-watcher.ResultChan(): - t.Errorf("unexpected result from result channel") - case <-time.After(time.Millisecond * 500): - // expected case - } - watcher.Stop() - } - } -} - -func (t *Tester) testWatchLabels(obj runtime.Object, emitFn EmitFunc, labelsPass, labelsFail []labels.Set, actions []string) { - ctx := t.TestContext() - - for _, label := range labelsPass { - for _, action := range actions { - options := &api.ListOptions{LabelSelector: label.AsSelector(), ResourceVersion: "1"} - watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := emitFn(obj, action); err != nil { - t.Errorf("unexpected error: %v", err) - } - - select { - case _, ok := <-watcher.ResultChan(): - if !ok { - t.Errorf("watch channel should be open") - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("unexpected timeout from result channel") - } - watcher.Stop() - } - } - - for _, label := range labelsFail { - for _, action := range actions { - options := &api.ListOptions{LabelSelector: label.AsSelector(), ResourceVersion: "1"} - watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := emitFn(obj, action); err != nil { - t.Errorf("unexpected error: %v", err) - } - - select { - case <-watcher.ResultChan(): - t.Errorf("unexpected result from result channel") - case <-time.After(time.Millisecond * 500): - // expected case - } - watcher.Stop() - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_proto_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_proto_test.go deleted file mode 100644 index e35708340..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_proto_test.go +++ /dev/null @@ -1,182 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "bytes" - "encoding/hex" - "math/rand" - "testing" - - "github.com/gogo/protobuf/proto" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - _ "k8s.io/kubernetes/pkg/apis/extensions" - _ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/protobuf" - "k8s.io/kubernetes/pkg/util/diff" -) - -func init() { - codecsToTest = append(codecsToTest, func(version unversioned.GroupVersion, item runtime.Object) (runtime.Codec, error) { - s := protobuf.NewSerializer(api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), "application/arbitrary.content.type") - return api.Codecs.CodecForVersions(s, s, testapi.ExternalGroupVersions(), nil), nil - }) -} - -func TestUniversalDeserializer(t *testing.T) { - expected := &v1.Pod{ObjectMeta: v1.ObjectMeta{Name: "test"}} - d := api.Codecs.UniversalDeserializer() - for _, mediaType := range []string{"application/json", "application/yaml", "application/vnd.kubernetes.protobuf"} { - e, ok := api.Codecs.SerializerForMediaType(mediaType, nil) - if !ok { - t.Fatal(mediaType) - } - buf := &bytes.Buffer{} - if err := e.EncodeToStream(expected, buf); err != nil { - t.Fatalf("%s: %v", mediaType, err) - } - obj, _, err := d.Decode(buf.Bytes(), &unversioned.GroupVersionKind{Kind: "Pod", Version: "v1"}, nil) - if err != nil { - t.Fatalf("%s: %v", mediaType, err) - } - if !api.Semantic.DeepEqual(expected, obj) { - t.Fatalf("%s: %#v", mediaType, obj) - } - } -} - -func TestProtobufRoundTrip(t *testing.T) { - obj := &v1.Pod{} - apitesting.FuzzerFor(t, v1.SchemeGroupVersion, rand.NewSource(benchmarkSeed)).Fuzz(obj) - data, err := obj.Marshal() - if err != nil { - t.Fatal(err) - } - out := &v1.Pod{} - if err := out.Unmarshal(data); err != nil { - t.Fatal(err) - } - if !api.Semantic.Equalities.DeepEqual(out, obj) { - t.Logf("marshal\n%s", hex.Dump(data)) - t.Fatalf("Unmarshal is unequal\n%s", diff.ObjectGoPrintSideBySide(out, obj)) - } -} - -// BenchmarkEncodeCodec measures the cost of performing a codec encode, which includes -// reflection (to clear APIVersion and Kind) -func BenchmarkEncodeCodecProtobuf(b *testing.B) { - items := benchmarkItems() - width := len(items) - s := protobuf.NewSerializer(nil, nil, "application/arbitrary.content.type") - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Encode(s, &items[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkEncodeCodecFromInternalProtobuf measures the cost of performing a codec encode, -// including conversions and any type setting. This is a "full" encode. -func BenchmarkEncodeCodecFromInternalProtobuf(b *testing.B) { - items := benchmarkItems() - width := len(items) - encodable := make([]api.Pod, width) - for i := range items { - if err := api.Scheme.Convert(&items[i], &encodable[i]); err != nil { - b.Fatal(err) - } - } - s := protobuf.NewSerializer(nil, nil, "application/arbitrary.content.type") - codec := api.Codecs.EncoderForVersion(s, v1.SchemeGroupVersion) - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Encode(codec, &encodable[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkEncodeProtobufGeneratedMarshal(b *testing.B) { - items := benchmarkItems() - width := len(items) - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := items[i%width].Marshal(); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkDecodeCodecToInternalProtobuf measures the cost of performing a codec decode, -// including conversions and any type setting. This is a "full" decode. -func BenchmarkDecodeCodecToInternalProtobuf(b *testing.B) { - items := benchmarkItems() - width := len(items) - s := protobuf.NewSerializer(api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), "application/arbitrary.content.type") - encoder := api.Codecs.EncoderForVersion(s, v1.SchemeGroupVersion) - var encoded [][]byte - for i := range items { - data, err := runtime.Encode(encoder, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded = append(encoded, data) - } - - decoder := api.Codecs.DecoderToVersion(s, api.SchemeGroupVersion) - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Decode(decoder, encoded[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance -func BenchmarkDecodeIntoProtobuf(b *testing.B) { - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := (&items[i]).Marshal() - if err != nil { - b.Fatal(err) - } - encoded[i] = data - validate := &v1.Pod{} - if err := proto.Unmarshal(data, validate); err != nil { - b.Fatalf("Failed to unmarshal %d: %v\n%#v", i, err, items[i]) - } - } - - for i := 0; i < b.N; i++ { - obj := v1.Pod{} - if err := proto.Unmarshal(encoded[i%width], &obj); err != nil { - b.Fatal(err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_test.go deleted file mode 100644 index e52e965bd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/serialization_test.go +++ /dev/null @@ -1,532 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api_test - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "io/ioutil" - "math/rand" - "reflect" - "strings" - "testing" - - "github.com/davecgh/go-spew/spew" - proto "github.com/golang/protobuf/proto" - flag "github.com/spf13/pflag" - "github.com/ugorji/go/codec" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/streaming" - "k8s.io/kubernetes/pkg/util/diff" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/pkg/watch/versioned" -) - -var fuzzIters = flag.Int("fuzz-iters", 20, "How many fuzzing iterations to do.") - -var codecsToTest = []func(version unversioned.GroupVersion, item runtime.Object) (runtime.Codec, error){ - func(version unversioned.GroupVersion, item runtime.Object) (runtime.Codec, error) { - return testapi.GetCodecForObject(item) - }, -} - -func fuzzInternalObject(t *testing.T, forVersion unversioned.GroupVersion, item runtime.Object, seed int64) runtime.Object { - apitesting.FuzzerFor(t, forVersion, rand.NewSource(seed)).Fuzz(item) - - j, err := meta.TypeAccessor(item) - if err != nil { - t.Fatalf("Unexpected error %v for %#v", err, item) - } - j.SetKind("") - j.SetAPIVersion("") - - return item -} - -func dataAsString(data []byte) string { - dataString := string(data) - if !strings.HasPrefix(dataString, "{") { - dataString = "\n" + hex.Dump(data) - proto.NewBuffer(make([]byte, 0, 1024)).DebugPrint("decoded object", data) - } - return dataString -} - -func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) { - printer := spew.ConfigState{DisableMethods: true} - - name := reflect.TypeOf(item).Elem().Name() - data, err := runtime.Encode(codec, item) - if err != nil { - t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", item)) - return - } - - obj2, err := runtime.Decode(codec, data) - if err != nil { - t.Errorf("0: %v: %v\nCodec: %v\nData: %s\nSource: %#v", name, err, codec, dataAsString(data), printer.Sprintf("%#v", item)) - panic("failed") - } - if !api.Semantic.DeepEqual(item, obj2) { - t.Errorf("\n1: %v: diff: %v\nCodec: %v\nSource:\n\n%#v\n\nEncoded:\n\n%s\n\nFinal:\n\n%#v", name, diff.ObjectGoPrintDiff(item, obj2), codec, printer.Sprintf("%#v", item), dataAsString(data), printer.Sprintf("%#v", obj2)) - return - } - - obj3 := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object) - if err := runtime.DecodeInto(codec, data, obj3); err != nil { - t.Errorf("2: %v: %v", name, err) - return - } - if !api.Semantic.DeepEqual(item, obj3) { - t.Errorf("3: %v: diff: %v\nCodec: %v", name, diff.ObjectDiff(item, obj3), codec) - return - } -} - -// roundTripSame verifies the same source object is tested in all API versions. -func roundTripSame(t *testing.T, group testapi.TestGroup, item runtime.Object, except ...string) { - set := sets.NewString(except...) - seed := rand.Int63() - fuzzInternalObject(t, group.InternalGroupVersion(), item, seed) - - version := *group.GroupVersion() - codecs := []runtime.Codec{} - for _, fn := range codecsToTest { - codec, err := fn(version, item) - if err != nil { - t.Errorf("unable to get codec: %v", err) - return - } - codecs = append(codecs, codec) - } - - if !set.Has(version.String()) { - fuzzInternalObject(t, version, item, seed) - for _, codec := range codecs { - roundTrip(t, codec, item) - } - } -} - -// For debugging problems -func TestSpecificKind(t *testing.T) { - kind := "DaemonSet" - for i := 0; i < *fuzzIters; i++ { - doRoundTripTest(testapi.Groups["extensions"], kind, t) - if t.Failed() { - break - } - } -} - -func TestList(t *testing.T) { - kind := "List" - item, err := api.Scheme.New(api.SchemeGroupVersion.WithKind(kind)) - if err != nil { - t.Errorf("Couldn't make a %v? %v", kind, err) - return - } - roundTripSame(t, testapi.Default, item) -} - -var nonRoundTrippableTypes = sets.NewString( - "ExportOptions", - // WatchEvent does not include kind and version and can only be deserialized - // implicitly (if the caller expects the specific object). The watch call defines - // the schema by content type, rather than via kind/version included in each - // object. - "WatchEvent", -) - -var nonInternalRoundTrippableTypes = sets.NewString("List", "ListOptions", "ExportOptions") -var nonRoundTrippableTypesByVersion = map[string][]string{} - -func TestRoundTripTypes(t *testing.T) { - for groupKey, group := range testapi.Groups { - for kind := range group.InternalTypes() { - t.Logf("working on %v in %v", kind, groupKey) - if nonRoundTrippableTypes.Has(kind) { - continue - } - // Try a few times, since runTest uses random values. - for i := 0; i < *fuzzIters; i++ { - doRoundTripTest(group, kind, t) - if t.Failed() { - break - } - } - } - } -} - -func doRoundTripTest(group testapi.TestGroup, kind string, t *testing.T) { - item, err := api.Scheme.New(group.InternalGroupVersion().WithKind(kind)) - if err != nil { - t.Fatalf("Couldn't make a %v? %v", kind, err) - } - if _, err := meta.TypeAccessor(item); err != nil { - t.Fatalf("%q is not a TypeMeta and cannot be tested - add it to nonRoundTrippableTypes: %v", kind, err) - } - if api.Scheme.Recognizes(group.GroupVersion().WithKind(kind)) { - roundTripSame(t, group, item, nonRoundTrippableTypesByVersion[kind]...) - } - if !nonInternalRoundTrippableTypes.Has(kind) && api.Scheme.Recognizes(group.GroupVersion().WithKind(kind)) { - roundTrip(t, group.Codec(), fuzzInternalObject(t, group.InternalGroupVersion(), item, rand.Int63())) - } -} - -func TestEncode_Ptr(t *testing.T) { - grace := int64(30) - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"name": "foo"}, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - - TerminationGracePeriodSeconds: &grace, - - SecurityContext: &api.PodSecurityContext{}, - }, - } - obj := runtime.Object(pod) - data, err := runtime.Encode(testapi.Default.Codec(), obj) - obj2, err2 := runtime.Decode(testapi.Default.Codec(), data) - if err != nil || err2 != nil { - t.Fatalf("Failure: '%v' '%v'", err, err2) - } - if _, ok := obj2.(*api.Pod); !ok { - t.Fatalf("Got wrong type") - } - if !api.Semantic.DeepEqual(obj2, pod) { - t.Errorf("\nExpected:\n\n %#v,\n\nGot:\n\n %#vDiff: %v\n\n", pod, obj2, diff.ObjectDiff(obj2, pod)) - - } -} - -func TestBadJSONRejection(t *testing.T) { - badJSONMissingKind := []byte(`{ }`) - if _, err := runtime.Decode(testapi.Default.Codec(), badJSONMissingKind); err == nil { - t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind) - } - badJSONUnknownType := []byte(`{"kind": "bar"}`) - if _, err1 := runtime.Decode(testapi.Default.Codec(), badJSONUnknownType); err1 == nil { - t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType) - } - /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) - if err2 := DecodeInto(badJSONKindMismatch, &Minion{}); err2 == nil { - t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) - }*/ -} - -func TestUnversionedTypes(t *testing.T) { - testcases := []runtime.Object{ - &unversioned.Status{Status: "Failure", Message: "something went wrong"}, - &unversioned.APIVersions{Versions: []string{"A", "B", "C"}}, - &unversioned.APIGroupList{Groups: []unversioned.APIGroup{{Name: "mygroup"}}}, - &unversioned.APIGroup{Name: "mygroup"}, - &unversioned.APIResourceList{GroupVersion: "mygroup/myversion"}, - } - - for _, obj := range testcases { - // Make sure the unversioned codec can encode - unversionedJSON, err := runtime.Encode(testapi.Default.Codec(), obj) - if err != nil { - t.Errorf("%v: unexpected error: %v", obj, err) - continue - } - - // Make sure the versioned codec under test can decode - versionDecodedObject, err := runtime.Decode(testapi.Default.Codec(), unversionedJSON) - if err != nil { - t.Errorf("%v: unexpected error: %v", obj, err) - continue - } - // Make sure it decodes correctly - if !reflect.DeepEqual(obj, versionDecodedObject) { - t.Errorf("%v: expected %#v, got %#v", obj, obj, versionDecodedObject) - continue - } - } -} - -func TestObjectWatchFraming(t *testing.T) { - f := apitesting.FuzzerFor(nil, api.SchemeGroupVersion, rand.NewSource(benchmarkSeed)) - secret := &api.Secret{} - f.Fuzz(secret) - secret.Data["binary"] = []byte{0x00, 0x10, 0x30, 0x55, 0xff, 0x00} - secret.Data["utf8"] = []byte("a string with \u0345 characters") - secret.Data["long"] = bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x00}, 1000) - converted, _ := api.Scheme.ConvertToVersion(secret, "v1") - v1secret := converted.(*v1.Secret) - for _, streamingMediaType := range api.Codecs.SupportedStreamingMediaTypes() { - s, _ := api.Codecs.StreamingSerializerForMediaType(streamingMediaType, nil) - framer := s.Framer - embedded := s.Embedded.Serializer - if embedded == nil { - t.Errorf("no embedded serializer for %s", streamingMediaType) - continue - } - innerDecode := api.Codecs.DecoderToVersion(embedded, api.SchemeGroupVersion) - - // write a single object through the framer and back out - obj := &bytes.Buffer{} - if err := s.EncodeToStream(v1secret, obj); err != nil { - t.Fatal(err) - } - out := &bytes.Buffer{} - w := framer.NewFrameWriter(out) - if n, err := w.Write(obj.Bytes()); err != nil || n != len(obj.Bytes()) { - t.Fatal(err) - } - sr := streaming.NewDecoder(framer.NewFrameReader(ioutil.NopCloser(out)), s) - resultSecret := &v1.Secret{} - res, _, err := sr.Decode(nil, resultSecret) - if err != nil { - t.Fatalf("%v:\n%s", err, hex.Dump(obj.Bytes())) - } - resultSecret.Kind = "Secret" - resultSecret.APIVersion = "v1" - if !api.Semantic.DeepEqual(v1secret, res) { - t.Fatalf("objects did not match: %s", diff.ObjectGoPrintDiff(v1secret, res)) - } - - // write a watch event through and back out - obj = &bytes.Buffer{} - if err := embedded.EncodeToStream(v1secret, obj); err != nil { - t.Fatal(err) - } - event := &versioned.Event{Type: string(watch.Added)} - event.Object.Raw = obj.Bytes() - obj = &bytes.Buffer{} - if err := s.EncodeToStream(event, obj); err != nil { - t.Fatal(err) - } - out = &bytes.Buffer{} - w = framer.NewFrameWriter(out) - if n, err := w.Write(obj.Bytes()); err != nil || n != len(obj.Bytes()) { - t.Fatal(err) - } - sr = streaming.NewDecoder(framer.NewFrameReader(ioutil.NopCloser(out)), s) - outEvent := &versioned.Event{} - res, _, err = sr.Decode(nil, outEvent) - if err != nil || outEvent.Type != string(watch.Added) { - t.Fatalf("%v: %#v", err, outEvent) - } - if outEvent.Object.Object == nil && outEvent.Object.Raw != nil { - outEvent.Object.Object, err = runtime.Decode(innerDecode, outEvent.Object.Raw) - if err != nil { - t.Fatalf("%v:\n%s", err, hex.Dump(outEvent.Object.Raw)) - } - } - - if !api.Semantic.DeepEqual(secret, outEvent.Object.Object) { - t.Fatalf("%s: did not match after frame decoding: %s", streamingMediaType, diff.ObjectGoPrintDiff(secret, outEvent.Object.Object)) - } - } -} - -const benchmarkSeed = 100 - -func benchmarkItems() []v1.Pod { - apiObjectFuzzer := apitesting.FuzzerFor(nil, api.SchemeGroupVersion, rand.NewSource(benchmarkSeed)) - items := make([]v1.Pod, 2) - for i := range items { - var pod api.Pod - apiObjectFuzzer.Fuzz(&pod) - out, err := api.Scheme.ConvertToVersion(&pod, "v1") - if err != nil { - panic(err) - } - items[i] = *out.(*v1.Pod) - } - return items -} - -// BenchmarkEncodeCodec measures the cost of performing a codec encode, which includes -// reflection (to clear APIVersion and Kind) -func BenchmarkEncodeCodec(b *testing.B) { - items := benchmarkItems() - width := len(items) - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Encode(testapi.Default.Codec(), &items[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkEncodeCodecFromInternal measures the cost of performing a codec encode, -// including conversions. -func BenchmarkEncodeCodecFromInternal(b *testing.B) { - items := benchmarkItems() - width := len(items) - encodable := make([]api.Pod, width) - for i := range items { - if err := api.Scheme.Convert(&items[i], &encodable[i]); err != nil { - b.Fatal(err) - } - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Encode(testapi.Default.Codec(), &encodable[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkEncodeJSONMarshal provides a baseline for regular JSON encode performance -func BenchmarkEncodeJSONMarshal(b *testing.B) { - items := benchmarkItems() - width := len(items) - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := json.Marshal(&items[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkDecodeCodec(b *testing.B) { - codec := testapi.Default.Codec() - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := runtime.Encode(codec, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded[i] = data - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := runtime.Decode(codec, encoded[i%width]); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkDecodeIntoExternalCodec(b *testing.B) { - codec := testapi.Default.Codec() - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := runtime.Encode(codec, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded[i] = data - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - obj := v1.Pod{} - if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -func BenchmarkDecodeIntoInternalCodec(b *testing.B) { - codec := testapi.Default.Codec() - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := runtime.Encode(codec, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded[i] = data - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - obj := api.Pod{} - if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance -func BenchmarkDecodeIntoJSON(b *testing.B) { - codec := testapi.Default.Codec() - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := runtime.Encode(codec, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded[i] = data - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - obj := v1.Pod{} - if err := json.Unmarshal(encoded[i%width], &obj); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} - -// BenchmarkDecodeJSON provides a baseline for codecgen JSON decode performance -func BenchmarkDecodeIntoJSONCodecGen(b *testing.B) { - kcodec := testapi.Default.Codec() - items := benchmarkItems() - width := len(items) - encoded := make([][]byte, width) - for i := range items { - data, err := runtime.Encode(kcodec, &items[i]) - if err != nil { - b.Fatal(err) - } - encoded[i] = data - } - handler := &codec.JsonHandle{} - - b.ResetTimer() - for i := 0; i < b.N; i++ { - obj := v1.Pod{} - if err := codec.NewDecoderBytes(encoded[i%width], handler).Decode(&obj); err != nil { - b.Fatal(err) - } - } - b.StopTimer() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/service/util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/service/util_test.go deleted file mode 100644 index c77d4f259..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/service/util_test.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 - -import ( - "testing" - - netsets "k8s.io/kubernetes/pkg/util/net/sets" -) - -func TestGetLoadBalancerSourceRanges(t *testing.T) { - checkError := func(v string) { - annotations := make(map[string]string) - annotations[AnnotationLoadBalancerSourceRangesKey] = v - _, err := GetLoadBalancerSourceRanges(annotations) - if err == nil { - t.Errorf("Expected error parsing: %q", v) - } - } - checkError("10.0.0.1/33") - checkError("foo.bar") - checkError("10.0.0.1/32,*") - checkError("10.0.0.1/32,") - checkError("10.0.0.1/32, ") - checkError("10.0.0.1") - - checkOK := func(v string) netsets.IPNet { - annotations := make(map[string]string) - annotations[AnnotationLoadBalancerSourceRangesKey] = v - cidrs, err := GetLoadBalancerSourceRanges(annotations) - if err != nil { - t.Errorf("Unexpected error parsing: %q", v) - } - return cidrs - } - cidrs := checkOK("192.168.0.1/32") - if len(cidrs) != 1 { - t.Errorf("Expected exactly one CIDR: %v", cidrs.StringSlice()) - } - cidrs = checkOK("192.168.0.1/32,192.168.0.1/32") - if len(cidrs) != 1 { - t.Errorf("Expected exactly one CIDR (after de-dup): %v", cidrs.StringSlice()) - } - cidrs = checkOK("192.168.0.1/32,192.168.0.2/32") - if len(cidrs) != 2 { - t.Errorf("Expected two CIDRs: %v", cidrs.StringSlice()) - } - cidrs = checkOK(" 192.168.0.1/32 , 192.168.0.2/32 ") - if len(cidrs) != 2 { - t.Errorf("Expected two CIDRs: %v", cidrs.StringSlice()) - } - cidrs = checkOK("") - if len(cidrs) != 1 { - t.Errorf("Expected exactly one CIDR: %v", cidrs.StringSlice()) - } - if !IsAllowAll(cidrs) { - t.Errorf("Expected default to be allow-all: %v", cidrs.StringSlice()) - } -} - -func TestAllowAll(t *testing.T) { - checkAllowAll := func(allowAll bool, cidrs ...string) { - ipnets, err := netsets.ParseIPNets(cidrs...) - if err != nil { - t.Errorf("Unexpected error parsing cidrs: %v", cidrs) - } - if allowAll != IsAllowAll(ipnets) { - t.Errorf("IsAllowAll did not return expected value for %v", cidrs) - } - } - checkAllowAll(false, "10.0.0.1/32") - checkAllowAll(false, "10.0.0.1/32", "10.0.0.2/32") - checkAllowAll(false, "10.0.0.1/32", "10.0.0.1/32") - - checkAllowAll(true, "0.0.0.0/0") - checkAllowAll(true, "192.168.0.0/0") - checkAllowAll(true, "192.168.0.1/32", "0.0.0.0/0") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testapi/testapi_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testapi/testapi_test.go deleted file mode 100644 index aa049f91d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testapi/testapi_test.go +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testapi - -import ( - "encoding/json" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" -) - -// TODO these tests don't add much value for testing things that have groups - -func TestResourcePathWithPrefix(t *testing.T) { - testCases := []struct { - prefix string - resource string - namespace string - name string - expected string - }{ - {"prefix", "resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource/myresource"}, - {"prefix", "resource", "", "myresource", "/api/" + Default.GroupVersion().Version + "/prefix/resource/myresource"}, - {"prefix", "resource", "mynamespace", "", "/api/" + Default.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource"}, - {"prefix", "resource", "", "", "/api/" + Default.GroupVersion().Version + "/prefix/resource"}, - {"", "resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource"}, - } - for _, item := range testCases { - if actual := Default.ResourcePathWithPrefix(item.prefix, item.resource, item.namespace, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for prefix: %s, resource: %s, namespace: %s and name: %s", item.expected, actual, item.prefix, item.resource, item.namespace, item.name) - } - } -} - -func TestResourcePath(t *testing.T) { - testCases := []struct { - resource string - namespace string - name string - expected string - }{ - {"resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource"}, - {"resource", "", "myresource", "/api/" + Default.GroupVersion().Version + "/resource/myresource"}, - {"resource", "mynamespace", "", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource"}, - {"resource", "", "", "/api/" + Default.GroupVersion().Version + "/resource"}, - } - for _, item := range testCases { - if actual := Default.ResourcePath(item.resource, item.namespace, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for resource: %s, namespace: %s and name: %s", item.expected, actual, item.resource, item.namespace, item.name) - } - } -} - -var status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Code: 200, - Reason: unversioned.StatusReasonUnknown, - Message: "", -} - -func TestV1EncodeDecodeStatus(t *testing.T) { - v1Codec := Default.Codec() - - encoded, err := runtime.Encode(v1Codec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := unversioned.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %v", string(encoded)) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"v1\". Got %v", string(encoded)) - } - decoded, err := runtime.Decode(v1Codec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %#v, got: %#v", status, decoded) - } -} - -func testEncodeDecodeStatus(t *testing.T, codec runtime.Codec) { - encoded, err := runtime.Encode(codec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := unversioned.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %s", encoded) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"\". Got %s", encoded) - } - decoded, err := runtime.Decode(codec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %v, got: %v", status, decoded) - } -} - -func TestAutoscalingEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Autoscaling.Codec()) -} - -func TestBatchEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Batch.Codec()) -} - -func TestExperimentalEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Extensions.Codec()) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/compat/compatibility_tester.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/compat/compatibility_tester.go deleted file mode 100644 index 82f165a33..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/compat/compatibility_tester.go +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 compat - -import ( - "encoding/json" - "fmt" - "os" - "reflect" - "regexp" - "strconv" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/kubectl" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -// Based on: https://github.com/openshift/origin/blob/master/pkg/api/compatibility_test.go -// -// TestCompatibility reencodes the input using the codec for the given -// version and checks for the presence of the expected keys and absent -// keys in the resulting JSON. -func TestCompatibility( - t *testing.T, - version unversioned.GroupVersion, - input []byte, - validator func(obj runtime.Object) field.ErrorList, - expectedKeys map[string]string, - absentKeys []string, -) { - - // Decode - codec := api.Codecs.LegacyCodec(version) - obj, err := runtime.Decode(codec, input) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // Validate - errs := validator(obj) - if len(errs) != 0 { - t.Fatalf("Unexpected validation errors: %v", errs) - } - - // Encode - output, err := runtime.Encode(codec, obj) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // Validate old and new fields are encoded - generic := map[string]interface{}{} - if err := json.Unmarshal(output, &generic); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - hasError := false - for k, expectedValue := range expectedKeys { - keys := strings.Split(k, ".") - if actualValue, ok, err := getJSONValue(generic, keys...); err != nil || !ok { - t.Errorf("Unexpected error for %s: %v", k, err) - hasError = true - } else if !reflect.DeepEqual(expectedValue, fmt.Sprintf("%v", actualValue)) { - hasError = true - t.Errorf("Unexpected value for %v: expected %v, got %v", k, expectedValue, actualValue) - } - } - - for _, absentKey := range absentKeys { - keys := strings.Split(absentKey, ".") - actualValue, ok, err := getJSONValue(generic, keys...) - if err == nil || ok { - t.Errorf("Unexpected value found for for key %s: %v", absentKey, actualValue) - hasError = true - } - } - - if hasError { - printer := new(kubectl.JSONPrinter) - printer.PrintObj(obj, os.Stdout) - t.Logf("2: Encoded value: %#v", string(output)) - } -} - -func getJSONValue(data map[string]interface{}, keys ...string) (interface{}, bool, error) { - // No keys, current value is it - if len(keys) == 0 { - return data, true, nil - } - - // Get the key (and optional index) - key := keys[0] - index := -1 - if matches := regexp.MustCompile(`^(.*)\[(\d+)\]$`).FindStringSubmatch(key); len(matches) > 0 { - key = matches[1] - index, _ = strconv.Atoi(matches[2]) - } - - // Look up the value - value, ok := data[key] - if !ok { - return nil, false, fmt.Errorf("No key %s found", key) - } - - // Get the indexed value if an index is specified - if index >= 0 { - valueSlice, ok := value.([]interface{}) - if !ok { - return nil, false, fmt.Errorf("Key %s did not hold a slice", key) - } - if index >= len(valueSlice) { - return nil, false, fmt.Errorf("Index %d out of bounds for slice at key: %v", index, key) - } - value = valueSlice[index] - } - - if len(keys) == 1 { - return value, true, nil - } - - childData, ok := value.(map[string]interface{}) - if !ok { - return nil, false, fmt.Errorf("Key %s did not hold a map", keys[0]) - } - return getJSONValue(childData, keys[1:]...) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/conversion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/conversion.go deleted file mode 100644 index 6f91427e7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/conversion.go +++ /dev/null @@ -1,72 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/labels" -) - -// TestSelectableFieldLabelConversions verifies that given resource have field -// label conversion defined for each its selectable field. -// fields contains selectable fields of the resource. -// labelMap maps deprecated labels to their canonical names. -func TestSelectableFieldLabelConversionsOfKind(t *testing.T, apiVersion string, kind string, fields labels.Set, labelMap map[string]string) { - badFieldLabels := []string{ - "name", - ".name", - "bad", - "metadata", - "foo.bar", - } - - value := "value" - - if len(fields) == 0 { - t.Logf("no selectable fields for kind %q, skipping", kind) - } - for label := range fields { - if label == "name" { - t.Logf("FIXME: \"name\" is deprecated by \"metadata.name\", it should be removed from selectable fields of kind=%s", kind) - continue - } - newLabel, newValue, err := api.Scheme.ConvertFieldLabel(apiVersion, kind, label, value) - if err != nil { - t.Errorf("kind=%s label=%s: got unexpected error: %v", kind, label, err) - } else { - expectedLabel := label - if l, exists := labelMap[label]; exists { - expectedLabel = l - } - if newLabel != expectedLabel { - t.Errorf("kind=%s label=%s: got unexpected label name (%q != %q)", kind, label, newLabel, expectedLabel) - } - if newValue != value { - t.Errorf("kind=%s label=%s: got unexpected new value (%q != %q)", kind, label, newValue, value) - } - } - } - - for _, label := range badFieldLabels { - _, _, err := api.Scheme.ConvertFieldLabel(apiVersion, kind, label, "value") - if err == nil { - t.Errorf("kind=%s label=%s: got unexpected non-error", kind, label) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/fuzzer.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/fuzzer.go deleted file mode 100644 index 052ce3f49..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/fuzzer.go +++ /dev/null @@ -1,424 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "fmt" - "math/rand" - "reflect" - "strconv" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/intstr" - - "github.com/google/gofuzz" -) - -// FuzzerFor can randomly populate api objects that are destined for version. -func FuzzerFor(t *testing.T, version unversioned.GroupVersion, src rand.Source) *fuzz.Fuzzer { - f := fuzz.New().NilChance(.5).NumElements(1, 1) - if src != nil { - f.RandSource(src) - } - f.Funcs( - func(j *int, c fuzz.Continue) { - *j = int(c.Int31()) - }, - func(j **int, c fuzz.Continue) { - if c.RandBool() { - i := int(c.Int31()) - *j = &i - } else { - *j = nil - } - }, - func(q *resource.Quantity, c fuzz.Continue) { - *q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent) - }, - func(j *runtime.TypeMeta, c fuzz.Continue) { - // We have to customize the randomization of TypeMetas because their - // APIVersion and Kind must remain blank in memory. - j.APIVersion = "" - j.Kind = "" - }, - func(j *unversioned.TypeMeta, c fuzz.Continue) { - // We have to customize the randomization of TypeMetas because their - // APIVersion and Kind must remain blank in memory. - j.APIVersion = "" - j.Kind = "" - }, - func(j *api.ObjectMeta, c fuzz.Continue) { - j.Name = c.RandString() - j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) - j.SelfLink = c.RandString() - j.UID = types.UID(c.RandString()) - j.GenerateName = c.RandString() - - var sec, nsec int64 - c.Fuzz(&sec) - c.Fuzz(&nsec) - j.CreationTimestamp = unversioned.Unix(sec, nsec).Rfc3339Copy() - }, - func(j *api.ObjectReference, c fuzz.Continue) { - // We have to customize the randomization of TypeMetas because their - // APIVersion and Kind must remain blank in memory. - j.APIVersion = c.RandString() - j.Kind = c.RandString() - j.Namespace = c.RandString() - j.Name = c.RandString() - j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) - j.FieldPath = c.RandString() - }, - func(j *unversioned.ListMeta, c fuzz.Continue) { - j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) - j.SelfLink = c.RandString() - }, - func(j *api.ListOptions, c fuzz.Continue) { - label, _ := labels.Parse("a=b") - j.LabelSelector = label - field, _ := fields.ParseSelector("a=b") - j.FieldSelector = field - }, - func(j *api.PodExecOptions, c fuzz.Continue) { - j.Stdout = true - j.Stderr = true - }, - func(j *api.PodAttachOptions, c fuzz.Continue) { - j.Stdout = true - j.Stderr = true - }, - func(s *api.PodSpec, c fuzz.Continue) { - c.FuzzNoCustom(s) - // has a default value - ttl := int64(30) - if c.RandBool() { - ttl = int64(c.Uint32()) - } - s.TerminationGracePeriodSeconds = &ttl - - c.Fuzz(s.SecurityContext) - - if s.SecurityContext == nil { - s.SecurityContext = new(api.PodSecurityContext) - } - }, - func(j *api.PodPhase, c fuzz.Continue) { - statuses := []api.PodPhase{api.PodPending, api.PodRunning, api.PodFailed, api.PodUnknown} - *j = statuses[c.Rand.Intn(len(statuses))] - }, - func(j *api.Binding, c fuzz.Continue) { - c.Fuzz(&j.ObjectMeta) - j.Target.Name = c.RandString() - }, - func(j *api.ReplicationControllerSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - //j.TemplateRef = nil // this is required for round trip - }, - func(j *extensions.DeploymentStrategy, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - // Ensure that strategyType is one of valid values. - strategyTypes := []extensions.DeploymentStrategyType{extensions.RecreateDeploymentStrategyType, extensions.RollingUpdateDeploymentStrategyType} - j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))] - if j.Type != extensions.RollingUpdateDeploymentStrategyType { - j.RollingUpdate = nil - } else { - rollingUpdate := extensions.RollingUpdateDeployment{} - if c.RandBool() { - rollingUpdate.MaxUnavailable = intstr.FromInt(int(c.RandUint64())) - rollingUpdate.MaxSurge = intstr.FromInt(int(c.RandUint64())) - } else { - rollingUpdate.MaxSurge = intstr.FromString(fmt.Sprintf("%d%%", c.RandUint64())) - } - j.RollingUpdate = &rollingUpdate - } - }, - func(j *batch.JobSpec, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - completions := int32(c.Rand.Int31()) - parallelism := int32(c.Rand.Int31()) - j.Completions = &completions - j.Parallelism = ¶llelism - if c.Rand.Int31()%2 == 0 { - j.ManualSelector = newBool(true) - } else { - j.ManualSelector = nil - } - }, - func(j *api.List, c fuzz.Continue) { - c.FuzzNoCustom(j) // fuzz self without calling this function again - // TODO: uncomment when round trip starts from a versioned object - if false { //j.Items == nil { - j.Items = []runtime.Object{} - } - }, - func(j *runtime.Object, c fuzz.Continue) { - // TODO: uncomment when round trip starts from a versioned object - if true { //c.RandBool() { - *j = &runtime.Unknown{ - // We do not set TypeMeta here because it is not carried through a round trip - Raw: []byte(`{"apiVersion":"unknown.group/unknown","kind":"Something","someKey":"someValue"}`), - ContentType: runtime.ContentTypeJSON, - } - } else { - types := []runtime.Object{&api.Pod{}, &api.ReplicationController{}} - t := types[c.Rand.Intn(len(types))] - c.Fuzz(t) - *j = t - } - }, - func(q *api.ResourceRequirements, c fuzz.Continue) { - randomQuantity := func() resource.Quantity { - var q resource.Quantity - c.Fuzz(&q) - return q - } - q.Limits = make(api.ResourceList) - q.Requests = make(api.ResourceList) - cpuLimit := randomQuantity() - q.Limits[api.ResourceCPU] = *cpuLimit.Copy() - q.Requests[api.ResourceCPU] = *cpuLimit.Copy() - memoryLimit := randomQuantity() - q.Limits[api.ResourceMemory] = *memoryLimit.Copy() - q.Requests[api.ResourceMemory] = *memoryLimit.Copy() - storageLimit := randomQuantity() - q.Limits[api.ResourceStorage] = *storageLimit.Copy() - q.Requests[api.ResourceStorage] = *storageLimit.Copy() - }, - func(q *api.LimitRangeItem, c fuzz.Continue) { - var cpuLimit resource.Quantity - c.Fuzz(&cpuLimit) - - q.Type = api.LimitTypeContainer - q.Default = make(api.ResourceList) - q.Default[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.DefaultRequest = make(api.ResourceList) - q.DefaultRequest[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.Max = make(api.ResourceList) - q.Max[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.Min = make(api.ResourceList) - q.Min[api.ResourceCPU] = *(cpuLimit.Copy()) - - q.MaxLimitRequestRatio = make(api.ResourceList) - q.MaxLimitRequestRatio[api.ResourceCPU] = resource.MustParse("10") - }, - func(p *api.PullPolicy, c fuzz.Continue) { - policies := []api.PullPolicy{api.PullAlways, api.PullNever, api.PullIfNotPresent} - *p = policies[c.Rand.Intn(len(policies))] - }, - func(rp *api.RestartPolicy, c fuzz.Continue) { - policies := []api.RestartPolicy{api.RestartPolicyAlways, api.RestartPolicyNever, api.RestartPolicyOnFailure} - *rp = policies[c.Rand.Intn(len(policies))] - }, - // Only api.DownwardAPIVolumeFile needs to have a specific func since FieldRef has to be - // defaulted to a version otherwise roundtrip will fail - // For the remaining volume plugins the default fuzzer is enough. - func(m *api.DownwardAPIVolumeFile, c fuzz.Continue) { - m.Path = c.RandString() - versions := []string{"v1"} - m.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))] - m.FieldRef.FieldPath = c.RandString() - }, - func(vs *api.VolumeSource, c fuzz.Continue) { - // Exactly one of the fields must be set. - v := reflect.ValueOf(vs).Elem() - i := int(c.RandUint64() % uint64(v.NumField())) - t := v.Field(i).Addr() - for v.Field(i).IsNil() { - c.Fuzz(t.Interface()) - } - }, - func(i *api.ISCSIVolumeSource, c fuzz.Continue) { - i.ISCSIInterface = c.RandString() - if i.ISCSIInterface == "" { - i.ISCSIInterface = "default" - } - }, - func(d *api.DNSPolicy, c fuzz.Continue) { - policies := []api.DNSPolicy{api.DNSClusterFirst, api.DNSDefault} - *d = policies[c.Rand.Intn(len(policies))] - }, - func(p *api.Protocol, c fuzz.Continue) { - protocols := []api.Protocol{api.ProtocolTCP, api.ProtocolUDP} - *p = protocols[c.Rand.Intn(len(protocols))] - }, - func(p *api.ServiceAffinity, c fuzz.Continue) { - types := []api.ServiceAffinity{api.ServiceAffinityClientIP, api.ServiceAffinityNone} - *p = types[c.Rand.Intn(len(types))] - }, - func(p *api.ServiceType, c fuzz.Continue) { - types := []api.ServiceType{api.ServiceTypeClusterIP, api.ServiceTypeNodePort, api.ServiceTypeLoadBalancer} - *p = types[c.Rand.Intn(len(types))] - }, - func(ct *api.Container, c fuzz.Continue) { - c.FuzzNoCustom(ct) // fuzz self without calling this function again - ct.TerminationMessagePath = "/" + ct.TerminationMessagePath // Must be non-empty - }, - func(p *api.Probe, c fuzz.Continue) { - c.FuzzNoCustom(p) - // These fields have default values. - intFieldsWithDefaults := [...]string{"TimeoutSeconds", "PeriodSeconds", "SuccessThreshold", "FailureThreshold"} - v := reflect.ValueOf(p).Elem() - for _, field := range intFieldsWithDefaults { - f := v.FieldByName(field) - if f.Int() == 0 { - f.SetInt(1) - } - } - }, - func(ev *api.EnvVar, c fuzz.Continue) { - ev.Name = c.RandString() - if c.RandBool() { - ev.Value = c.RandString() - } else { - ev.ValueFrom = &api.EnvVarSource{} - ev.ValueFrom.FieldRef = &api.ObjectFieldSelector{} - - var versions []unversioned.GroupVersion - for _, testGroup := range testapi.Groups { - versions = append(versions, *testGroup.GroupVersion()) - } - - ev.ValueFrom.FieldRef.APIVersion = versions[c.Rand.Intn(len(versions))].String() - ev.ValueFrom.FieldRef.FieldPath = c.RandString() - } - }, - func(sc *api.SecurityContext, c fuzz.Continue) { - c.FuzzNoCustom(sc) // fuzz self without calling this function again - if c.RandBool() { - priv := c.RandBool() - sc.Privileged = &priv - } - - if c.RandBool() { - sc.Capabilities = &api.Capabilities{ - Add: make([]api.Capability, 0), - Drop: make([]api.Capability, 0), - } - c.Fuzz(&sc.Capabilities.Add) - c.Fuzz(&sc.Capabilities.Drop) - } - }, - func(s *api.Secret, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - s.Type = api.SecretTypeOpaque - }, - func(pv *api.PersistentVolume, c fuzz.Continue) { - c.FuzzNoCustom(pv) // fuzz self without calling this function again - types := []api.PersistentVolumePhase{api.VolumeAvailable, api.VolumePending, api.VolumeBound, api.VolumeReleased, api.VolumeFailed} - pv.Status.Phase = types[c.Rand.Intn(len(types))] - pv.Status.Message = c.RandString() - reclamationPolicies := []api.PersistentVolumeReclaimPolicy{api.PersistentVolumeReclaimRecycle, api.PersistentVolumeReclaimRetain} - pv.Spec.PersistentVolumeReclaimPolicy = reclamationPolicies[c.Rand.Intn(len(reclamationPolicies))] - }, - func(pvc *api.PersistentVolumeClaim, c fuzz.Continue) { - c.FuzzNoCustom(pvc) // fuzz self without calling this function again - types := []api.PersistentVolumeClaimPhase{api.ClaimBound, api.ClaimPending} - pvc.Status.Phase = types[c.Rand.Intn(len(types))] - }, - func(s *api.NamespaceSpec, c fuzz.Continue) { - s.Finalizers = []api.FinalizerName{api.FinalizerKubernetes} - }, - func(s *api.NamespaceStatus, c fuzz.Continue) { - s.Phase = api.NamespaceActive - }, - func(http *api.HTTPGetAction, c fuzz.Continue) { - c.FuzzNoCustom(http) // fuzz self without calling this function again - http.Path = "/" + http.Path // can't be blank - http.Scheme = "x" + http.Scheme // can't be blank - }, - func(ss *api.ServiceSpec, c fuzz.Continue) { - c.FuzzNoCustom(ss) // fuzz self without calling this function again - if len(ss.Ports) == 0 { - // There must be at least 1 port. - ss.Ports = append(ss.Ports, api.ServicePort{}) - c.Fuzz(&ss.Ports[0]) - } - for i := range ss.Ports { - switch ss.Ports[i].TargetPort.Type { - case intstr.Int: - ss.Ports[i].TargetPort.IntVal = 1 + ss.Ports[i].TargetPort.IntVal%65535 // non-zero - case intstr.String: - ss.Ports[i].TargetPort.StrVal = "x" + ss.Ports[i].TargetPort.StrVal // non-empty - } - } - }, - func(n *api.Node, c fuzz.Continue) { - c.FuzzNoCustom(n) - n.Spec.ExternalID = "external" - }, - func(s *api.NodeStatus, c fuzz.Continue) { - c.FuzzNoCustom(s) - s.Allocatable = s.Capacity - }, - func(s *extensions.HorizontalPodAutoscalerSpec, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - minReplicas := int32(c.Rand.Int31()) - s.MinReplicas = &minReplicas - s.CPUUtilization = &extensions.CPUTargetUtilization{TargetPercentage: int32(c.RandUint64())} - }, - func(s *extensions.SubresourceReference, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - s.Subresource = "scale" - }, - func(psp *extensions.PodSecurityPolicySpec, c fuzz.Continue) { - c.FuzzNoCustom(psp) // fuzz self without calling this function again - runAsUserRules := []extensions.RunAsUserStrategy{extensions.RunAsUserStrategyMustRunAsNonRoot, extensions.RunAsUserStrategyMustRunAs, extensions.RunAsUserStrategyRunAsAny} - psp.RunAsUser.Rule = runAsUserRules[c.Rand.Intn(len(runAsUserRules))] - seLinuxRules := []extensions.SELinuxStrategy{extensions.SELinuxStrategyRunAsAny, extensions.SELinuxStrategyMustRunAs} - psp.SELinux.Rule = seLinuxRules[c.Rand.Intn(len(seLinuxRules))] - }, - func(s *extensions.Scale, c fuzz.Continue) { - c.FuzzNoCustom(s) // fuzz self without calling this function again - // TODO: Implement a fuzzer to generate valid keys, values and operators for - // selector requirements. - if s.Status.Selector != nil { - s.Status.Selector = &unversioned.LabelSelector{ - MatchLabels: map[string]string{ - "testlabelkey": "testlabelval", - }, - MatchExpressions: []unversioned.LabelSelectorRequirement{ - { - Key: "testkey", - Operator: unversioned.LabelSelectorOpIn, - Values: []string{"val1", "val2", "val3"}, - }, - }, - } - } - }, - ) - return f -} - -func newBool(val bool) *bool { - p := new(bool) - *p = val - return p -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/pod_specs.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/pod_specs.go deleted file mode 100644 index 2020b3f7f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/testing/pod_specs.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "k8s.io/kubernetes/pkg/api" -) - -// DeepEqualSafePodSpec returns a PodSpec which is ready to be used with api.Semantic.DeepEqual -func DeepEqualSafePodSpec() api.PodSpec { - grace := int64(30) - return api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - TerminationGracePeriodSeconds: &grace, - SecurityContext: &api.PodSecurityContext{}, - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/duration_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/duration_test.go deleted file mode 100644 index 6650ca9aa..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/duration_test.go +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "encoding/json" - "testing" - "time" - - "github.com/ghodss/yaml" -) - -type DurationHolder struct { - D Duration `json:"d"` -} - -func TestDurationMarshalYAML(t *testing.T) { - cases := []struct { - input Duration - result string - }{ - {Duration{5 * time.Second}, "d: 5s\n"}, - {Duration{2 * time.Minute}, "d: 2m0s\n"}, - {Duration{time.Hour + 3*time.Millisecond}, "d: 1h0m0.003s\n"}, - } - - for _, c := range cases { - input := DurationHolder{c.input} - result, err := yaml.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input: %q: %v", input, err) - } - if string(result) != c.result { - t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result)) - } - } -} - -func TestDurationUnmarshalYAML(t *testing.T) { - cases := []struct { - input string - result Duration - }{ - {"d: 0s\n", Duration{}}, - {"d: 5s\n", Duration{5 * time.Second}}, - {"d: 2m0s\n", Duration{2 * time.Minute}}, - {"d: 1h0m0.003s\n", Duration{time.Hour + 3*time.Millisecond}}, - - // Units with zero values can optionally be dropped - {"d: 2m\n", Duration{2 * time.Minute}}, - {"d: 1h0.003s\n", Duration{time.Hour + 3*time.Millisecond}}, - } - - for _, c := range cases { - var result DurationHolder - if err := yaml.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("Failed to unmarshal input %q: %v", c.input, err) - } - if result.D != c.result { - t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result) - } - } -} - -func TestDurationMarshalJSON(t *testing.T) { - cases := []struct { - input Duration - result string - }{ - {Duration{5 * time.Second}, `{"d":"5s"}`}, - {Duration{2 * time.Minute}, `{"d":"2m0s"}`}, - {Duration{time.Hour + 3*time.Millisecond}, `{"d":"1h0m0.003s"}`}, - } - - for _, c := range cases { - input := DurationHolder{c.input} - result, err := json.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input: %q: %v", input, err) - } - if string(result) != c.result { - t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result)) - } - } -} - -func TestDurationUnmarshalJSON(t *testing.T) { - cases := []struct { - input string - result Duration - }{ - {`{"d":"0s"}`, Duration{}}, - {`{"d":"5s"}`, Duration{5 * time.Second}}, - {`{"d":"2m0s"}`, Duration{2 * time.Minute}}, - {`{"d":"1h0m0.003s"}`, Duration{time.Hour + 3*time.Millisecond}}, - - // Units with zero values can optionally be dropped - {`{"d":"2m"}`, Duration{2 * time.Minute}}, - {`{"d":"1h0.003s"}`, Duration{time.Hour + 3*time.Millisecond}}, - } - - for _, c := range cases { - var result DurationHolder - if err := json.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("Failed to unmarshal input %q: %v", c.input, err) - } - if result.D != c.result { - t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result) - } - } -} - -func TestDurationMarshalJSONUnmarshalYAML(t *testing.T) { - cases := []struct { - input Duration - }{ - {Duration{}}, - {Duration{5 * time.Second}}, - {Duration{2 * time.Minute}}, - {Duration{time.Hour + 3*time.Millisecond}}, - } - - for i, c := range cases { - input := DurationHolder{c.input} - jsonMarshalled, err := json.Marshal(&input) - if err != nil { - t.Errorf("%d-1: Failed to marshal input: '%v': %v", i, input, err) - } - - var result DurationHolder - if err := yaml.Unmarshal(jsonMarshalled, &result); err != nil { - t.Errorf("%d-2: Failed to unmarshal '%+v': %v", i, string(jsonMarshalled), err) - } - - if input.D != result.D { - t.Errorf("%d-4: Failed to marshal input '%#v': got %#v", i, input, result) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/group_version_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/group_version_test.go deleted file mode 100644 index 4a26fbb10..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/group_version_test.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "encoding/json" - "reflect" - "testing" - - "github.com/ugorji/go/codec" -) - -type GroupVersionHolder struct { - GV GroupVersion `json:"val"` -} - -func TestGroupVersionUnmarshalJSON(t *testing.T) { - cases := []struct { - input []byte - expect GroupVersion - }{ - {[]byte(`{"val": "v1"}`), GroupVersion{"", "v1"}}, - {[]byte(`{"val": "extensions/v1beta1"}`), GroupVersion{"extensions", "v1beta1"}}, - } - - for _, c := range cases { - var result GroupVersionHolder - // test golang lib's JSON codec - if err := json.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("JSON codec failed to unmarshal input '%v': %v", c.input, err) - } - if !reflect.DeepEqual(result.GV, c.expect) { - t.Errorf("JSON codec failed to unmarshal input '%s': expected %+v, got %+v", c.input, c.expect, result.GV) - } - // test the Ugorji codec - if err := codec.NewDecoderBytes(c.input, new(codec.JsonHandle)).Decode(&result); err != nil { - t.Errorf("Ugorji codec failed to unmarshal input '%v': %v", c.input, err) - } - if !reflect.DeepEqual(result.GV, c.expect) { - t.Errorf("Ugorji codec failed to unmarshal input '%s': expected %+v, got %+v", c.input, c.expect, result.GV) - } - } -} - -func TestGroupVersionMarshalJSON(t *testing.T) { - cases := []struct { - input GroupVersion - expect []byte - }{ - {GroupVersion{"", "v1"}, []byte(`{"val":"v1"}`)}, - {GroupVersion{"extensions", "v1beta1"}, []byte(`{"val":"extensions/v1beta1"}`)}, - } - - for _, c := range cases { - input := GroupVersionHolder{c.input} - result, err := json.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input '%v': %v", input, err) - } - if !reflect.DeepEqual(result, c.expect) { - t.Errorf("Failed to marshal input '%+v': expected: %s, got: %s", input, c.expect, result) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/helpers_test.go deleted file mode 100644 index f803d4366..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/helpers_test.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/labels" -) - -func TestLabelSelectorAsSelector(t *testing.T) { - matchLabels := map[string]string{"foo": "bar"} - matchExpressions := []LabelSelectorRequirement{{ - Key: "baz", - Operator: LabelSelectorOpIn, - Values: []string{"qux", "norf"}, - }} - mustParse := func(s string) labels.Selector { - out, e := labels.Parse(s) - if e != nil { - panic(e) - } - return out - } - tc := []struct { - in *LabelSelector - out labels.Selector - expectErr bool - }{ - {in: nil, out: labels.Nothing()}, - {in: &LabelSelector{}, out: labels.Everything()}, - { - in: &LabelSelector{MatchLabels: matchLabels}, - out: mustParse("foo=bar"), - }, - { - in: &LabelSelector{MatchExpressions: matchExpressions}, - out: mustParse("baz in (norf,qux)"), - }, - { - in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions}, - out: mustParse("baz in (norf,qux),foo=bar"), - }, - { - in: &LabelSelector{ - MatchExpressions: []LabelSelectorRequirement{{ - Key: "baz", - Operator: LabelSelectorOpExists, - Values: []string{"qux", "norf"}, - }}, - }, - expectErr: true, - }, - } - - for i, tc := range tc { - out, err := LabelSelectorAsSelector(tc.in) - if err == nil && tc.expectErr { - t.Errorf("[%v]expected error but got none.", i) - } - if err != nil && !tc.expectErr { - t.Errorf("[%v]did not expect error but got: %v", i, err) - } - if !reflect.DeepEqual(out, tc.out) { - t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/time_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/time_test.go deleted file mode 100644 index 2f4f3696d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/time_test.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "encoding/json" - "testing" - "time" - - "github.com/ghodss/yaml" -) - -type TimeHolder struct { - T Time `json:"t"` -} - -func TestTimeMarshalYAML(t *testing.T) { - cases := []struct { - input Time - result string - }{ - {Time{}, "t: null\n"}, - {Date(1998, time.May, 5, 1, 5, 5, 50, time.FixedZone("test", -4*60*60)), "t: 1998-05-05T05:05:05Z\n"}, - {Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "t: 1998-05-05T05:05:05Z\n"}, - } - - for _, c := range cases { - input := TimeHolder{c.input} - result, err := yaml.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input: '%v': %v", input, err) - } - if string(result) != c.result { - t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) - } - } -} - -func TestTimeUnmarshalYAML(t *testing.T) { - cases := []struct { - input string - result Time - }{ - {"t: null\n", Time{}}, - {"t: 1998-05-05T05:05:05Z\n", Time{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, - } - - for _, c := range cases { - var result TimeHolder - if err := yaml.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) - } - if result.T != c.result { - t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) - } - } -} - -func TestTimeMarshalJSON(t *testing.T) { - cases := []struct { - input Time - result string - }{ - {Time{}, "{\"t\":null}"}, - {Date(1998, time.May, 5, 5, 5, 5, 50, time.UTC), "{\"t\":\"1998-05-05T05:05:05Z\"}"}, - {Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "{\"t\":\"1998-05-05T05:05:05Z\"}"}, - } - - for _, c := range cases { - input := TimeHolder{c.input} - result, err := json.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input: '%v': %v", input, err) - } - if string(result) != c.result { - t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) - } - } -} - -func TestTimeUnmarshalJSON(t *testing.T) { - cases := []struct { - input string - result Time - }{ - {"{\"t\":null}", Time{}}, - {"{\"t\":\"1998-05-05T05:05:05Z\"}", Time{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, - } - - for _, c := range cases { - var result TimeHolder - if err := json.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) - } - if result.T != c.result { - t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) - } - } -} - -func TestTimeMarshalJSONUnmarshalYAML(t *testing.T) { - cases := []struct { - input Time - }{ - {Time{}}, - {Date(1998, time.May, 5, 5, 5, 5, 50, time.Local).Rfc3339Copy()}, - {Date(1998, time.May, 5, 5, 5, 5, 0, time.Local).Rfc3339Copy()}, - } - - for i, c := range cases { - input := TimeHolder{c.input} - jsonMarshalled, err := json.Marshal(&input) - if err != nil { - t.Errorf("%d-1: Failed to marshal input: '%v': %v", i, input, err) - } - - var result TimeHolder - err = yaml.Unmarshal(jsonMarshalled, &result) - if err != nil { - t.Errorf("%d-2: Failed to unmarshal '%+v': %v", i, string(jsonMarshalled), err) - } - - iN, iO := input.T.Zone() - oN, oO := result.T.Zone() - if iN != oN || iO != oO { - t.Errorf("%d-3: Time zones differ before and after serialization %s:%d %s:%d", i, iN, iO, oN, oO) - } - - if input.T.UnixNano() != result.T.UnixNano() { - t.Errorf("%d-4: Failed to marshal input '%#v': got %#v", i, input, result) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/validation/validation_test.go deleted file mode 100644 index 26be6fb58..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/unversioned/validation/validation_test.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestValidateLabels(t *testing.T) { - successCases := []map[string]string{ - {"simple": "bar"}, - {"now-with-dashes": "bar"}, - {"1-starts-with-num": "bar"}, - {"1234": "bar"}, - {"simple/simple": "bar"}, - {"now-with-dashes/simple": "bar"}, - {"now-with-dashes/now-with-dashes": "bar"}, - {"now.with.dots/simple": "bar"}, - {"now-with.dashes-and.dots/simple": "bar"}, - {"1-num.2-num/3-num": "bar"}, - {"1234/5678": "bar"}, - {"1.2.3.4/5678": "bar"}, - {"UpperCaseAreOK123": "bar"}, - {"goodvalue": "123_-.BaR"}, - } - for i := range successCases { - errs := ValidateLabels(successCases[i], field.NewPath("field")) - if len(errs) != 0 { - t.Errorf("case[%d] expected success, got %#v", i, errs) - } - } - - labelNameErrorCases := []map[string]string{ - {"nospecialchars^=@": "bar"}, - {"cantendwithadash-": "bar"}, - {"only/one/slash": "bar"}, - {strings.Repeat("a", 254): "bar"}, - } - for i := range labelNameErrorCases { - errs := ValidateLabels(labelNameErrorCases[i], field.NewPath("field")) - if len(errs) != 1 { - t.Errorf("case[%d] expected failure", i) - } else { - detail := errs[0].Detail - if detail != qualifiedNameErrorMsg { - t.Errorf("error detail %s should be equal %s", detail, qualifiedNameErrorMsg) - } - } - } - - labelValueErrorCases := []map[string]string{ - {"toolongvalue": strings.Repeat("a", 64)}, - {"backslashesinvalue": "some\\bad\\value"}, - {"nocommasallowed": "bad,value"}, - {"strangecharsinvalue": "?#$notsogood"}, - } - for i := range labelValueErrorCases { - errs := ValidateLabels(labelValueErrorCases[i], field.NewPath("field")) - if len(errs) != 1 { - t.Errorf("case[%d] expected failure", i) - } else { - detail := errs[0].Detail - if detail != labelValueErrorMsg { - t.Errorf("error detail %s should be equal %s", detail, labelValueErrorMsg) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/util/group_version_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/util/group_version_test.go deleted file mode 100644 index d53b5f4e5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/util/group_version_test.go +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 "testing" - -func TestGetVersion(t *testing.T) { - testCases := []struct { - groupVersion string - output string - }{ - { - "v1", - "v1", - }, - { - "extensions/v1beta1", - "v1beta1", - }, - } - for _, test := range testCases { - actual := GetVersion(test.groupVersion) - if test.output != actual { - t.Errorf("expect version: %s, got: %s\n", test.output, actual) - } - } -} - -func TestGetGroup(t *testing.T) { - testCases := []struct { - groupVersion string - output string - }{ - { - "v1", - "", - }, - { - "extensions/v1beta1", - "extensions", - }, - } - for _, test := range testCases { - actual := GetGroup(test.groupVersion) - if test.output != actual { - t.Errorf("expect version: %s, got: %s\n", test.output, actual) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go deleted file mode 100644 index 2ef3d926f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go +++ /dev/null @@ -1,229 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 v1_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testing/compat" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestCompatibility_v1_PodSecurityContext(t *testing.T) { - cases := []struct { - name string - input string - expectedKeys map[string]string - absentKeys []string - }{ - { - name: "hostNetwork = true", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostNetwork": true, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - expectedKeys: map[string]string{ - "spec.hostNetwork": "true", - }, - }, - { - name: "hostNetwork = false", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostNetwork": false, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - absentKeys: []string{ - "spec.hostNetwork", - }, - }, - { - name: "hostIPC = true", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostIPC": true, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - expectedKeys: map[string]string{ - "spec.hostIPC": "true", - }, - }, - { - name: "hostIPC = false", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostIPC": false, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - absentKeys: []string{ - "spec.hostIPC", - }, - }, - { - name: "hostPID = true", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostPID": true, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - expectedKeys: map[string]string{ - "spec.hostPID": "true", - }, - }, - { - name: "hostPID = false", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"}, - "spec": { - "hostPID": false, - "containers":[{ - "name":"a", - "image":"my-container-image" - }] - } -} -`, - absentKeys: []string{ - "spec.hostPID", - }, - }, - { - name: "reseting defaults for pre-v1.1 mirror pods", - input: ` -{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{ - "name":"my-pod-name", - "namespace":"my-pod-namespace", - "annotations": { - "kubernetes.io/config.mirror": "mirror" - } - }, - "spec": { - "containers":[{ - "name":"a", - "image":"my-container-image", - "resources": { - "limits": { - "cpu": "100m" - } - } - }] - } -} -`, - absentKeys: []string{ - "spec.terminationGracePeriodSeconds", - "spec.containers[0].resources.requests", - }, - }, - { - name: "preserving defaults for v1.1+ mirror pods", - input: ` - { - "kind":"Pod", - "apiVersion":"v1", - "metadata":{ - "name":"my-pod-name", - "namespace":"my-pod-namespace", - "annotations": { - "kubernetes.io/config.mirror": "cbe924f710c7e26f7693d6a341bcfad0" - } - }, - "spec": { - "containers":[{ - "name":"a", - "image":"my-container-image", - "resources": { - "limits": { - "cpu": "100m" - } - } - }] - } - } - `, - expectedKeys: map[string]string{ - "spec.terminationGracePeriodSeconds": "30", - "spec.containers[0].resources.requests": "map[cpu:100m]", - }, - }, - } - - validator := func(obj runtime.Object) field.ErrorList { - return validation.ValidatePodSpec(&(obj.(*api.Pod).Spec), field.NewPath("spec")) - } - - for _, tc := range cases { - t.Logf("Testing 1.0.0 backward compatibility for %v", tc.name) - compat.TestCompatibility(t, v1.SchemeGroupVersion, []byte(tc.input), validator, tc.expectedKeys, tc.absentKeys) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/conversion_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/conversion_test.go deleted file mode 100644 index ac0b4e682..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/conversion_test.go +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 v1_test - -import ( - "net/url" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - versioned "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/diff" -) - -func TestPodLogOptions(t *testing.T) { - sinceSeconds := int64(1) - sinceTime := unversioned.NewTime(time.Date(2000, 1, 1, 12, 34, 56, 0, time.UTC).Local()) - tailLines := int64(2) - limitBytes := int64(3) - - versionedLogOptions := &versioned.PodLogOptions{ - Container: "mycontainer", - Follow: true, - Previous: true, - SinceSeconds: &sinceSeconds, - SinceTime: &sinceTime, - Timestamps: true, - TailLines: &tailLines, - LimitBytes: &limitBytes, - } - unversionedLogOptions := &api.PodLogOptions{ - Container: "mycontainer", - Follow: true, - Previous: true, - SinceSeconds: &sinceSeconds, - SinceTime: &sinceTime, - Timestamps: true, - TailLines: &tailLines, - LimitBytes: &limitBytes, - } - expectedParameters := url.Values{ - "container": {"mycontainer"}, - "follow": {"true"}, - "previous": {"true"}, - "sinceSeconds": {"1"}, - "sinceTime": {"2000-01-01T12:34:56Z"}, - "timestamps": {"true"}, - "tailLines": {"2"}, - "limitBytes": {"3"}, - } - - codec := runtime.NewParameterCodec(api.Scheme) - - // unversioned -> query params - { - actualParameters, err := codec.EncodeParameters(unversionedLogOptions, versioned.SchemeGroupVersion) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(actualParameters, expectedParameters) { - t.Fatalf("Expected\n%#v\ngot\n%#v", expectedParameters, actualParameters) - } - } - - // versioned -> query params - { - actualParameters, err := codec.EncodeParameters(versionedLogOptions, versioned.SchemeGroupVersion) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(actualParameters, expectedParameters) { - t.Fatalf("Expected\n%#v\ngot\n%#v", expectedParameters, actualParameters) - } - } - - // query params -> versioned - { - convertedLogOptions := &versioned.PodLogOptions{} - err := codec.DecodeParameters(expectedParameters, versioned.SchemeGroupVersion, convertedLogOptions) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(convertedLogOptions, versionedLogOptions) { - t.Fatalf("Unexpected deserialization:\n%s", diff.ObjectGoPrintSideBySide(versionedLogOptions, convertedLogOptions)) - } - } - - // query params -> unversioned - { - convertedLogOptions := &api.PodLogOptions{} - err := codec.DecodeParameters(expectedParameters, versioned.SchemeGroupVersion, convertedLogOptions) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(convertedLogOptions, unversionedLogOptions) { - t.Fatalf("Unexpected deserialization:\n%s", diff.ObjectGoPrintSideBySide(unversionedLogOptions, convertedLogOptions)) - } - } -} - -// TestPodSpecConversion tests that ServiceAccount is an alias for -// ServiceAccountName. -func TestPodSpecConversion(t *testing.T) { - name, other := "foo", "bar" - - // Test internal -> v1. Should have both alias (DeprecatedServiceAccount) - // and new field (ServiceAccountName). - i := &api.PodSpec{ - ServiceAccountName: name, - } - v := versioned.PodSpec{} - if err := api.Scheme.Convert(i, &v); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if v.ServiceAccountName != name { - t.Fatalf("want v1.ServiceAccountName %q, got %q", name, v.ServiceAccountName) - } - if v.DeprecatedServiceAccount != name { - t.Fatalf("want v1.DeprecatedServiceAccount %q, got %q", name, v.DeprecatedServiceAccount) - } - - // Test v1 -> internal. Either DeprecatedServiceAccount, ServiceAccountName, - // or both should translate to ServiceAccountName. ServiceAccountName wins - // if both are set. - testCases := []*versioned.PodSpec{ - // New - {ServiceAccountName: name}, - // Alias - {DeprecatedServiceAccount: name}, - // Both: same - {ServiceAccountName: name, DeprecatedServiceAccount: name}, - // Both: different - {ServiceAccountName: name, DeprecatedServiceAccount: other}, - } - for k, v := range testCases { - got := api.PodSpec{} - err := api.Scheme.Convert(v, &got) - if err != nil { - t.Fatalf("unexpected error for case %d: %v", k, err) - } - if got.ServiceAccountName != name { - t.Fatalf("want api.ServiceAccountName %q, got %q", name, got.ServiceAccountName) - } - } -} - -func TestResourceListConversion(t *testing.T) { - bigMilliQuantity := resource.NewQuantity(resource.MaxMilliValue, resource.DecimalSI) - bigMilliQuantity.Add(resource.MustParse("12345m")) - - tests := []struct { - input versioned.ResourceList - expected api.ResourceList - }{ - { // No changes necessary. - input: versioned.ResourceList{ - versioned.ResourceMemory: resource.MustParse("30M"), - versioned.ResourceCPU: resource.MustParse("100m"), - versioned.ResourceStorage: resource.MustParse("1G"), - }, - expected: api.ResourceList{ - api.ResourceMemory: resource.MustParse("30M"), - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceStorage: resource.MustParse("1G"), - }, - }, - { // Nano-scale values should be rounded up to milli-scale. - input: versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("3.000023m"), - versioned.ResourceMemory: resource.MustParse("500.000050m"), - }, - expected: api.ResourceList{ - api.ResourceCPU: resource.MustParse("4m"), - api.ResourceMemory: resource.MustParse("501m"), - }, - }, - { // Large values should still be accurate. - input: versioned.ResourceList{ - versioned.ResourceCPU: *bigMilliQuantity.Copy(), - versioned.ResourceStorage: *bigMilliQuantity.Copy(), - }, - expected: api.ResourceList{ - api.ResourceCPU: *bigMilliQuantity.Copy(), - api.ResourceStorage: *bigMilliQuantity.Copy(), - }, - }, - } - - output := api.ResourceList{} - for i, test := range tests { - err := api.Scheme.Convert(&test.input, &output) - if err != nil { - t.Fatalf("unexpected error for case %d: %v", i, err) - } - if !api.Semantic.DeepEqual(test.expected, output) { - t.Errorf("unexpected conversion for case %d: Expected %+v; Got %+v", i, test.expected, output) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/defaults_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/defaults_test.go deleted file mode 100644 index b1a78e758..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/v1/defaults_test.go +++ /dev/null @@ -1,645 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 v1_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - versioned "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { - codec := api.Codecs.LegacyCodec(versioned.SchemeGroupVersion) - data, err := runtime.Encode(codec, obj) - if err != nil { - t.Errorf("%v\n %#v", err, obj) - return nil - } - obj2, err := runtime.Decode(codec, data) - if err != nil { - t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) - return nil - } - obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) - err = api.Scheme.Convert(obj2, obj3) - if err != nil { - t.Errorf("%v\nSource: %#v", err, obj2) - return nil - } - return obj3 -} - -func TestSetDefaultReplicationController(t *testing.T) { - tests := []struct { - rc *versioned.ReplicationController - expectLabels bool - expectSelector bool - }{ - { - rc: &versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: true, - }, - { - rc: &versioned.ReplicationController{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: versioned.ReplicationControllerSpec{ - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: true, - }, - { - rc: &versioned.ReplicationController{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: versioned.ReplicationControllerSpec{ - Selector: map[string]string{ - "some": "other", - }, - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: false, - }, - { - rc: &versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Selector: map[string]string{ - "some": "other", - }, - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: false, - }, - } - - for _, test := range tests { - rc := test.rc - obj2 := roundTrip(t, runtime.Object(rc)) - rc2, ok := obj2.(*versioned.ReplicationController) - if !ok { - t.Errorf("unexpected object: %v", rc2) - t.FailNow() - } - if test.expectSelector != reflect.DeepEqual(rc2.Spec.Selector, rc2.Spec.Template.Labels) { - if test.expectSelector { - t.Errorf("expected: %v, got: %v", rc2.Spec.Template.Labels, rc2.Spec.Selector) - } else { - t.Errorf("unexpected equality: %v", rc.Spec.Selector) - } - } - if test.expectLabels != reflect.DeepEqual(rc2.Labels, rc2.Spec.Template.Labels) { - if test.expectLabels { - t.Errorf("expected: %v, got: %v", rc2.Spec.Template.Labels, rc2.Labels) - } else { - t.Errorf("unexpected equality: %v", rc.Labels) - } - } - } -} - -func newInt(val int32) *int32 { - p := new(int32) - *p = val - return p -} - -func TestSetDefaultReplicationControllerReplicas(t *testing.T) { - tests := []struct { - rc versioned.ReplicationController - expectReplicas int32 - }{ - { - rc: versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 1, - }, - { - rc: versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Replicas: newInt(0), - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 0, - }, - { - rc: versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Replicas: newInt(3), - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 3, - }, - } - - for _, test := range tests { - rc := &test.rc - obj2 := roundTrip(t, runtime.Object(rc)) - rc2, ok := obj2.(*versioned.ReplicationController) - if !ok { - t.Errorf("unexpected object: %v", rc2) - t.FailNow() - } - if rc2.Spec.Replicas == nil { - t.Errorf("unexpected nil Replicas") - } else if test.expectReplicas != *rc2.Spec.Replicas { - t.Errorf("expected: %d replicas, got: %d", test.expectReplicas, *rc2.Spec.Replicas) - } - } -} - -func TestSetDefaultService(t *testing.T) { - svc := &versioned.Service{} - obj2 := roundTrip(t, runtime.Object(svc)) - svc2 := obj2.(*versioned.Service) - if svc2.Spec.SessionAffinity != versioned.ServiceAffinityNone { - t.Errorf("Expected default session affinity type:%s, got: %s", versioned.ServiceAffinityNone, svc2.Spec.SessionAffinity) - } - if svc2.Spec.Type != versioned.ServiceTypeClusterIP { - t.Errorf("Expected default type:%s, got: %s", versioned.ServiceTypeClusterIP, svc2.Spec.Type) - } -} - -func TestSetDefaultSecret(t *testing.T) { - s := &versioned.Secret{} - obj2 := roundTrip(t, runtime.Object(s)) - s2 := obj2.(*versioned.Secret) - - if s2.Type != versioned.SecretTypeOpaque { - t.Errorf("Expected secret type %v, got %v", versioned.SecretTypeOpaque, s2.Type) - } -} - -func TestSetDefaultPersistentVolume(t *testing.T) { - pv := &versioned.PersistentVolume{} - obj2 := roundTrip(t, runtime.Object(pv)) - pv2 := obj2.(*versioned.PersistentVolume) - - if pv2.Status.Phase != versioned.VolumePending { - t.Errorf("Expected volume phase %v, got %v", versioned.VolumePending, pv2.Status.Phase) - } - if pv2.Spec.PersistentVolumeReclaimPolicy != versioned.PersistentVolumeReclaimRetain { - t.Errorf("Expected pv reclaim policy %v, got %v", versioned.PersistentVolumeReclaimRetain, pv2.Spec.PersistentVolumeReclaimPolicy) - } -} - -func TestSetDefaultPersistentVolumeClaim(t *testing.T) { - pvc := &versioned.PersistentVolumeClaim{} - obj2 := roundTrip(t, runtime.Object(pvc)) - pvc2 := obj2.(*versioned.PersistentVolumeClaim) - - if pvc2.Status.Phase != versioned.ClaimPending { - t.Errorf("Expected claim phase %v, got %v", versioned.ClaimPending, pvc2.Status.Phase) - } -} - -func TestSetDefaulEndpointsProtocol(t *testing.T) { - in := &versioned.Endpoints{Subsets: []versioned.EndpointSubset{ - {Ports: []versioned.EndpointPort{{}, {Protocol: "UDP"}, {}}}, - }} - obj := roundTrip(t, runtime.Object(in)) - out := obj.(*versioned.Endpoints) - - for i := range out.Subsets { - for j := range out.Subsets[i].Ports { - if in.Subsets[i].Ports[j].Protocol == "" { - if out.Subsets[i].Ports[j].Protocol != versioned.ProtocolTCP { - t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Subsets[i].Ports[j].Protocol) - } - } else { - if out.Subsets[i].Ports[j].Protocol != in.Subsets[i].Ports[j].Protocol { - t.Errorf("Expected protocol %s, got %s", in.Subsets[i].Ports[j].Protocol, out.Subsets[i].Ports[j].Protocol) - } - } - } - } -} - -func TestSetDefaulServiceTargetPort(t *testing.T) { - in := &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234}}}} - obj := roundTrip(t, runtime.Object(in)) - out := obj.(*versioned.Service) - if out.Spec.Ports[0].TargetPort != intstr.FromInt(1234) { - t.Errorf("Expected TargetPort to be defaulted, got %v", out.Spec.Ports[0].TargetPort) - } - - in = &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234, TargetPort: intstr.FromInt(5678)}}}} - obj = roundTrip(t, runtime.Object(in)) - out = obj.(*versioned.Service) - if out.Spec.Ports[0].TargetPort != intstr.FromInt(5678) { - t.Errorf("Expected TargetPort to be unchanged, got %v", out.Spec.Ports[0].TargetPort) - } -} - -func TestSetDefaultServicePort(t *testing.T) { - // Unchanged if set. - in := &versioned.Service{Spec: versioned.ServiceSpec{ - Ports: []versioned.ServicePort{ - {Protocol: "UDP", Port: 9376, TargetPort: intstr.FromString("p")}, - {Protocol: "UDP", Port: 8675, TargetPort: intstr.FromInt(309)}, - }, - }} - out := roundTrip(t, runtime.Object(in)).(*versioned.Service) - if out.Spec.Ports[0].Protocol != versioned.ProtocolUDP { - t.Errorf("Expected protocol %s, got %s", versioned.ProtocolUDP, out.Spec.Ports[0].Protocol) - } - if out.Spec.Ports[0].TargetPort != intstr.FromString("p") { - t.Errorf("Expected port %v, got %v", in.Spec.Ports[0].Port, out.Spec.Ports[0].TargetPort) - } - if out.Spec.Ports[1].Protocol != versioned.ProtocolUDP { - t.Errorf("Expected protocol %s, got %s", versioned.ProtocolUDP, out.Spec.Ports[1].Protocol) - } - if out.Spec.Ports[1].TargetPort != intstr.FromInt(309) { - t.Errorf("Expected port %v, got %v", in.Spec.Ports[1].Port, out.Spec.Ports[1].TargetPort) - } - - // Defaulted. - in = &versioned.Service{Spec: versioned.ServiceSpec{ - Ports: []versioned.ServicePort{ - {Protocol: "", Port: 9376, TargetPort: intstr.FromString("")}, - {Protocol: "", Port: 8675, TargetPort: intstr.FromInt(0)}, - }, - }} - out = roundTrip(t, runtime.Object(in)).(*versioned.Service) - if out.Spec.Ports[0].Protocol != versioned.ProtocolTCP { - t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Spec.Ports[0].Protocol) - } - if out.Spec.Ports[0].TargetPort != intstr.FromInt(int(in.Spec.Ports[0].Port)) { - t.Errorf("Expected port %v, got %v", in.Spec.Ports[0].Port, out.Spec.Ports[0].TargetPort) - } - if out.Spec.Ports[1].Protocol != versioned.ProtocolTCP { - t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Spec.Ports[1].Protocol) - } - if out.Spec.Ports[1].TargetPort != intstr.FromInt(int(in.Spec.Ports[1].Port)) { - t.Errorf("Expected port %v, got %v", in.Spec.Ports[1].Port, out.Spec.Ports[1].TargetPort) - } -} - -func TestSetDefaultNamespace(t *testing.T) { - s := &versioned.Namespace{} - obj2 := roundTrip(t, runtime.Object(s)) - s2 := obj2.(*versioned.Namespace) - - if s2.Status.Phase != versioned.NamespaceActive { - t.Errorf("Expected phase %v, got %v", versioned.NamespaceActive, s2.Status.Phase) - } -} - -func TestSetDefaultPodSpecHostNetwork(t *testing.T) { - portNum := int32(8080) - s := versioned.PodSpec{} - s.HostNetwork = true - s.Containers = []versioned.Container{ - { - Ports: []versioned.ContainerPort{ - { - ContainerPort: portNum, - }, - }, - }, - } - pod := &versioned.Pod{ - Spec: s, - } - obj2 := roundTrip(t, runtime.Object(pod)) - pod2 := obj2.(*versioned.Pod) - s2 := pod2.Spec - - hostPortNum := s2.Containers[0].Ports[0].HostPort - if hostPortNum != portNum { - t.Errorf("Expected container port to be defaulted, was made %d instead of %d", hostPortNum, portNum) - } -} - -func TestSetDefaultNodeExternalID(t *testing.T) { - name := "node0" - n := &versioned.Node{} - n.Name = name - obj2 := roundTrip(t, runtime.Object(n)) - n2 := obj2.(*versioned.Node) - if n2.Spec.ExternalID != name { - t.Errorf("Expected default External ID: %s, got: %s", name, n2.Spec.ExternalID) - } - if n2.Spec.ProviderID != "" { - t.Errorf("Expected empty default Cloud Provider ID, got: %s", n2.Spec.ProviderID) - } -} - -func TestSetDefaultNodeStatusAllocatable(t *testing.T) { - capacity := versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("1000m"), - versioned.ResourceMemory: resource.MustParse("10G"), - } - allocatable := versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("500m"), - versioned.ResourceMemory: resource.MustParse("5G"), - } - tests := []struct { - capacity versioned.ResourceList - allocatable versioned.ResourceList - expectedAllocatable versioned.ResourceList - }{{ // Everything set, no defaulting. - capacity: capacity, - allocatable: allocatable, - expectedAllocatable: allocatable, - }, { // Allocatable set, no defaulting. - capacity: nil, - allocatable: allocatable, - expectedAllocatable: allocatable, - }, { // Capacity set, allocatable defaults to capacity. - capacity: capacity, - allocatable: nil, - expectedAllocatable: capacity, - }, { // Nothing set, allocatable "defaults" to capacity. - capacity: nil, - allocatable: nil, - expectedAllocatable: nil, - }} - - copyResourceList := func(rl versioned.ResourceList) versioned.ResourceList { - if rl == nil { - return nil - } - copy := make(versioned.ResourceList, len(rl)) - for k, v := range rl { - copy[k] = *v.Copy() - } - return copy - } - - resourceListsEqual := func(a versioned.ResourceList, b versioned.ResourceList) bool { - if len(a) != len(b) { - return false - } - for k, v := range a { - vb, found := b[k] - if !found { - return false - } - if v.Cmp(vb) != 0 { - return false - } - } - return true - } - - for i, testcase := range tests { - node := versioned.Node{ - Status: versioned.NodeStatus{ - Capacity: copyResourceList(testcase.capacity), - Allocatable: copyResourceList(testcase.allocatable), - }, - } - node2 := roundTrip(t, runtime.Object(&node)).(*versioned.Node) - actual := node2.Status.Allocatable - expected := testcase.expectedAllocatable - if !resourceListsEqual(expected, actual) { - t.Errorf("[%d] Expected NodeStatus.Allocatable: %+v; Got: %+v", i, expected, actual) - } - } -} - -func TestSetDefaultObjectFieldSelectorAPIVersion(t *testing.T) { - s := versioned.PodSpec{ - Containers: []versioned.Container{ - { - Env: []versioned.EnvVar{ - { - ValueFrom: &versioned.EnvVarSource{ - FieldRef: &versioned.ObjectFieldSelector{}, - }, - }, - }, - }, - }, - } - pod := &versioned.Pod{ - Spec: s, - } - obj2 := roundTrip(t, runtime.Object(pod)) - pod2 := obj2.(*versioned.Pod) - s2 := pod2.Spec - - apiVersion := s2.Containers[0].Env[0].ValueFrom.FieldRef.APIVersion - if apiVersion != "v1" { - t.Errorf("Expected default APIVersion v1, got: %v", apiVersion) - } -} - -func TestSetDefaultRequestsPod(t *testing.T) { - // verify we default if limits are specified - s := versioned.PodSpec{} - s.Containers = []versioned.Container{ - { - Resources: versioned.ResourceRequirements{ - Limits: versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("100m"), - }, - }, - }, - } - pod := &versioned.Pod{ - Spec: s, - } - output := roundTrip(t, runtime.Object(pod)) - pod2 := output.(*versioned.Pod) - defaultRequest := pod2.Spec.Containers[0].Resources.Requests - requestValue := defaultRequest[versioned.ResourceCPU] - if requestValue.String() != "100m" { - t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String()) - } - - // verify we do nothing if no limits are specified - s = versioned.PodSpec{} - s.Containers = []versioned.Container{{}} - pod = &versioned.Pod{ - Spec: s, - } - output = roundTrip(t, runtime.Object(pod)) - pod2 = output.(*versioned.Pod) - defaultRequest = pod2.Spec.Containers[0].Resources.Requests - requestValue = defaultRequest[versioned.ResourceCPU] - if requestValue.String() != "0" { - t.Errorf("Expected 0 request value, got: %s", requestValue.String()) - } -} - -func TestDefaultRequestIsNotSetForReplicationController(t *testing.T) { - s := versioned.PodSpec{} - s.Containers = []versioned.Container{ - { - Resources: versioned.ResourceRequirements{ - Limits: versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("100m"), - }, - }, - }, - } - rc := &versioned.ReplicationController{ - Spec: versioned.ReplicationControllerSpec{ - Replicas: newInt(3), - Template: &versioned.PodTemplateSpec{ - ObjectMeta: versioned.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - Spec: s, - }, - }, - } - output := roundTrip(t, runtime.Object(rc)) - rc2 := output.(*versioned.ReplicationController) - defaultRequest := rc2.Spec.Template.Spec.Containers[0].Resources.Requests - requestValue := defaultRequest[versioned.ResourceCPU] - if requestValue.String() != "0" { - t.Errorf("Expected 0 request value, got: %s", requestValue.String()) - } -} - -func TestSetDefaultLimitRangeItem(t *testing.T) { - limitRange := &versioned.LimitRange{ - ObjectMeta: versioned.ObjectMeta{ - Name: "test-defaults", - }, - Spec: versioned.LimitRangeSpec{ - Limits: []versioned.LimitRangeItem{{ - Type: versioned.LimitTypeContainer, - Max: versioned.ResourceList{ - versioned.ResourceCPU: resource.MustParse("100m"), - }, - Min: versioned.ResourceList{ - versioned.ResourceMemory: resource.MustParse("100Mi"), - }, - Default: versioned.ResourceList{}, - DefaultRequest: versioned.ResourceList{}, - }}, - }, - } - - output := roundTrip(t, runtime.Object(limitRange)) - limitRange2 := output.(*versioned.LimitRange) - defaultLimit := limitRange2.Spec.Limits[0].Default - defaultRequest := limitRange2.Spec.Limits[0].DefaultRequest - - // verify that default cpu was set to the max - defaultValue := defaultLimit[versioned.ResourceCPU] - if defaultValue.String() != "100m" { - t.Errorf("Expected default cpu: %s, got: %s", "100m", defaultValue.String()) - } - // verify that default request was set to the limit - requestValue := defaultRequest[versioned.ResourceCPU] - if requestValue.String() != "100m" { - t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String()) - } - // verify that if a min is provided, it will be the default if no limit is specified - requestMinValue := defaultRequest[versioned.ResourceMemory] - if requestMinValue.String() != "100Mi" { - t.Errorf("Expected request memory: %s, got: %s", "100Mi", requestMinValue.String()) - } -} - -func TestSetDefaultProbe(t *testing.T) { - originalProbe := versioned.Probe{} - expectedProbe := versioned.Probe{ - InitialDelaySeconds: 0, - TimeoutSeconds: 1, - PeriodSeconds: 10, - SuccessThreshold: 1, - FailureThreshold: 3, - } - - pod := &versioned.Pod{ - Spec: versioned.PodSpec{ - Containers: []versioned.Container{{LivenessProbe: &originalProbe}}, - }, - } - - output := roundTrip(t, runtime.Object(pod)).(*versioned.Pod) - actualProbe := *output.Spec.Containers[0].LivenessProbe - if actualProbe != expectedProbe { - t.Errorf("Expected probe: %+v\ngot: %+v\n", expectedProbe, actualProbe) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/events_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/events_test.go deleted file mode 100644 index a2910d064..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/events_test.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestValidateEvent(t *testing.T) { - table := []struct { - *api.Event - valid bool - }{ - { - &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Namespace: "foo", - }, - InvolvedObject: api.ObjectReference{ - Namespace: "bar", - }, - }, - false, - }, { - &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Namespace: "aoeu-_-aoeu", - }, - InvolvedObject: api.ObjectReference{ - Namespace: "aoeu-_-aoeu", - }, - }, - false, - }, - } - - for _, item := range table { - if e, a := item.valid, len(ValidateEvent(item.Event)) == 0; e != a { - t.Errorf("%v: expected %v, got %v", item.Event.Name, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/name_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/name_test.go deleted file mode 100644 index b8687cdcc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/name_test.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" -) - -func TestValidatePathSegmentName(t *testing.T) { - testcases := map[string]struct { - Name string - Prefix bool - ExpectedOK bool - ExpectedMsg string - }{ - "empty": { - Name: "", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - "empty,prefix": { - Name: "", - Prefix: true, - ExpectedOK: true, - ExpectedMsg: "", - }, - - "valid": { - Name: "foo.bar.baz", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - "valid,prefix": { - Name: "foo.bar.baz", - Prefix: true, - ExpectedOK: true, - ExpectedMsg: "", - }, - - // Make sure mixed case, non DNS subdomain characters are tolerated - "valid complex": { - Name: "sha256:ABCDEF012345@ABCDEF012345", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - // Make sure non-ascii characters are tolerated - "valid extended charset": { - Name: "Iñtërnâtiônàlizætiøn", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - - "dot": { - Name: ".", - Prefix: false, - ExpectedOK: false, - ExpectedMsg: ".", - }, - "dot leading": { - Name: ".test", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - "dot,prefix": { - Name: ".", - Prefix: true, - ExpectedOK: true, // allowed because a suffix could make it valid - ExpectedMsg: "", - }, - - "dot dot": { - Name: "..", - Prefix: false, - ExpectedOK: false, - ExpectedMsg: "..", - }, - "dot dot leading": { - Name: "..test", - Prefix: false, - ExpectedOK: true, - ExpectedMsg: "", - }, - "dot dot,prefix": { - Name: "..", - Prefix: true, - ExpectedOK: true, // allowed because a suffix could make it valid - ExpectedMsg: "", - }, - - "slash": { - Name: "foo/bar", - Prefix: false, - ExpectedOK: false, - ExpectedMsg: "/", - }, - "slash,prefix": { - Name: "foo/bar", - Prefix: true, - ExpectedOK: false, - ExpectedMsg: "/", - }, - - "percent": { - Name: "foo%bar", - Prefix: false, - ExpectedOK: false, - ExpectedMsg: "%", - }, - "percent,prefix": { - Name: "foo%bar", - Prefix: true, - ExpectedOK: false, - ExpectedMsg: "%", - }, - } - - for k, tc := range testcases { - ok, msg := ValidatePathSegmentName(tc.Name, tc.Prefix) - if ok != tc.ExpectedOK { - t.Errorf("%s: expected ok=%v, got %v", k, tc.ExpectedOK, ok) - } - if len(tc.ExpectedMsg) == 0 && len(msg) > 0 { - t.Errorf("%s: expected no message, got %v", k, msg) - } - if len(tc.ExpectedMsg) > 0 && !strings.Contains(msg, tc.ExpectedMsg) { - t.Errorf("%s: expected message containing %q, got %v", k, tc.ExpectedMsg, msg) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/schema_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/schema_test.go deleted file mode 100644 index 9754110a5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/schema_test.go +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "io/ioutil" - "math/rand" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/runtime" - - "github.com/ghodss/yaml" -) - -func readPod(filename string) ([]byte, error) { - data, err := ioutil.ReadFile("testdata/" + testapi.Default.GroupVersion().Version + "/" + filename) - if err != nil { - return nil, err - } - return data, nil -} - -func readSwaggerFile() ([]byte, error) { - // TODO this path is broken - pathToSwaggerSpec := "../../../api/swagger-spec/" + testapi.Default.GroupVersion().Version + ".json" - return ioutil.ReadFile(pathToSwaggerSpec) -} - -func loadSchemaForTest() (Schema, error) { - data, err := readSwaggerFile() - if err != nil { - return nil, err - } - return NewSwaggerSchemaFromBytes(data) -} - -func TestLoad(t *testing.T) { - _, err := loadSchemaForTest() - if err != nil { - t.Errorf("Failed to load: %v", err) - } -} - -func TestValidateOk(t *testing.T) { - schema, err := loadSchemaForTest() - if err != nil { - t.Errorf("Failed to load: %v", err) - } - tests := []struct { - obj runtime.Object - typeName string - }{ - {obj: &api.Pod{}}, - {obj: &api.Service{}}, - {obj: &api.ReplicationController{}}, - } - - seed := rand.Int63() - apiObjectFuzzer := apitesting.FuzzerFor(nil, testapi.Default.InternalGroupVersion(), rand.NewSource(seed)) - for i := 0; i < 5; i++ { - for _, test := range tests { - testObj := test.obj - apiObjectFuzzer.Fuzz(testObj) - data, err := runtime.Encode(testapi.Default.Codec(), testObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - err = schema.ValidateBytes(data) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - } - } -} - -func TestInvalid(t *testing.T) { - schema, err := loadSchemaForTest() - if err != nil { - t.Errorf("Failed to load: %v", err) - } - tests := []string{ - "invalidPod1.json", // command is a string, instead of []string. - "invalidPod2.json", // hostPort if of type string, instead of int. - "invalidPod3.json", // volumes is not an array of objects. - "invalidPod.yaml", // command is a string, instead of []string. - } - for _, test := range tests { - pod, err := readPod(test) - if err != nil { - t.Errorf("could not read file: %s, err: %v", test, err) - } - err = schema.ValidateBytes(pod) - if err == nil { - t.Errorf("unexpected non-error, err: %s for pod: %s", err, pod) - } - } -} - -func TestValid(t *testing.T) { - schema, err := loadSchemaForTest() - if err != nil { - t.Errorf("Failed to load: %v", err) - } - tests := []string{ - "validPod.yaml", - } - for _, test := range tests { - pod, err := readPod(test) - if err != nil { - t.Errorf("could not read file: %s, err: %v", test, err) - } - err = schema.ValidateBytes(pod) - if err != nil { - t.Errorf("unexpected error %s, for pod %s", err, pod) - } - } -} - -func TestVersionRegex(t *testing.T) { - testCases := []struct { - typeName string - match bool - }{ - { - typeName: "v1.Binding", - match: true, - }, - { - typeName: "v1beta1.Binding", - match: true, - }, - { - typeName: "Binding", - match: false, - }, - } - for _, test := range testCases { - if versionRegexp.MatchString(test.typeName) && !test.match { - t.Errorf("unexpected error: expect %s not to match the regular expression", test.typeName) - } - if !versionRegexp.MatchString(test.typeName) && test.match { - t.Errorf("unexpected error: expect %s to match the regular expression", test.typeName) - } - } -} - -// Tests that validation works fine when spec contains "type": "any" instead of "type": "object" -// Ref: https://github.com/kubernetes/kubernetes/issues/24309 -func TestTypeOAny(t *testing.T) { - data, err := readSwaggerFile() - if err != nil { - t.Errorf("failed to read swagger file: %v", err) - } - // Replace type: "any" in the spec by type: "object" and verify that the validation still passes. - newData := strings.Replace(string(data), `"type": "object"`, `"type": "any"`, -1) - schema, err := NewSwaggerSchemaFromBytes([]byte(newData)) - if err != nil { - t.Errorf("Failed to load: %v", err) - } - tests := []string{ - "validPod.yaml", - } - for _, test := range tests { - podBytes, err := readPod(test) - if err != nil { - t.Errorf("could not read file: %s, err: %v", test, err) - } - // Verify that pod has at least one label (labels are type "any") - var pod api.Pod - err = yaml.Unmarshal(podBytes, &pod) - if err != nil { - t.Errorf("error in unmarshalling pod: %v", err) - } - if len(pod.Labels) == 0 { - t.Errorf("invalid test input: the pod should have at least one label") - } - err = schema.ValidateBytes(podBytes) - if err != nil { - t.Errorf("unexpected error %s, for pod %s", err, string(podBytes)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod.yaml b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod.yaml deleted file mode 100644 index 9557c55ff..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - labels: - name: redis-master - name: name -spec: - containers: - - args: "this is a bad command" - image: gcr.io/fake_project/fake_image:fake_tag - name: master diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod1.json b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod1.json deleted file mode 100644 index d935742d7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "kind": "Pod", - "apiVersion": "v1", - "metadata": { - "name": "name", - "labels": { - "name": "redis-master" - } - }, - "spec": { - "containers": [ - { - "name": "master", - "image": "gcr.io/fake_project/fake_image:fake_tag", - "args": "this is a bad command" - } - ] - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod2.json b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod2.json deleted file mode 100644 index 56e8f93ba..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod2.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "kind": "Pod", - "apiVersion": "v1", - "metadata": { - "name": "apache-php", - "labels": { - "name": "apache-php" - } - }, - "spec": { - "volumes": [{ - "name": "shared-disk" - }], - "containers": [ - { - "name": "apache-php", - "image": "gcr.io/fake_project/fake_image:fake_tag", - "ports": [ - { - "name": "apache", - "hostPort": "13380", - "containerPort": 80, - "protocol": "TCP" - } - ], - "volumeMounts": [ - { - "name": "shared-disk", - "mountPath": "/var/www/html" - } - ] - } - ] - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod3.json b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod3.json deleted file mode 100644 index 4d99181dc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/invalidPod3.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "kind": "Pod", - "apiVersion": "v1", - "metadata": { - "name": "apache-php", - "labels": { - "name": "apache-php" - } - }, - "spec": { - "volumes": [ - "name": "shared-disk" - ], - "containers": [ - { - "name": "apache-php", - "image": "gcr.io/fake_project/fake_image:fake_tag", - "ports": [ - { - "name": "apache", - "hostPort": 13380, - "containerPort": 80, - "protocol": "TCP" - } - ], - "volumeMounts": [ - { - "name": "shared-disk", - "mountPath": "/var/www/html" - } - ] - } - ] - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/validPod.yaml b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/validPod.yaml deleted file mode 100644 index 3849ba7a1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/testdata/v1/validPod.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - labels: - name: redis-master - name: name -spec: - containers: - - args: - - this - - is - - an - - ok - - command - image: gcr.io/fake_project/fake_image:fake_tag - name: master diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/validation_test.go deleted file mode 100644 index eb1c325f0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/api/validation/validation_test.go +++ /dev/null @@ -1,5781 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "math/rand" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/service" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/capabilities" - "k8s.io/kubernetes/pkg/util/intstr" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func expectPrefix(t *testing.T, prefix string, errs field.ErrorList) { - for i := range errs { - if f, p := errs[i].Field, prefix; !strings.HasPrefix(f, p) { - t.Errorf("expected prefix '%s' for field '%s' (%v)", p, f, errs[i]) - } - } -} - -// Ensure custom name functions are allowed -func TestValidateObjectMetaCustomName(t *testing.T) { - errs := ValidateObjectMeta( - &api.ObjectMeta{Name: "test", GenerateName: "foo"}, - false, - func(s string, prefix bool) (bool, string) { - if s == "test" { - return true, "" - } - return false, "name-gen" - }, - field.NewPath("field")) - if len(errs) != 1 { - t.Fatalf("unexpected errors: %v", errs) - } - if !strings.Contains(errs[0].Error(), "name-gen") { - t.Errorf("unexpected error message: %v", errs) - } -} - -// Ensure namespace names follow dns label format -func TestValidateObjectMetaNamespaces(t *testing.T) { - errs := ValidateObjectMeta( - &api.ObjectMeta{Name: "test", Namespace: "foo.bar"}, - true, - func(s string, prefix bool) (bool, string) { - return true, "" - }, - field.NewPath("field")) - if len(errs) != 1 { - t.Fatalf("unexpected errors: %v", errs) - } - if !strings.Contains(errs[0].Error(), `Invalid value: "foo.bar"`) { - t.Errorf("unexpected error message: %v", errs) - } - maxLength := 63 - letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - b := make([]rune, maxLength+1) - for i := range b { - b[i] = letters[rand.Intn(len(letters))] - } - errs = ValidateObjectMeta( - &api.ObjectMeta{Name: "test", Namespace: string(b)}, - true, - func(s string, prefix bool) (bool, string) { - return true, "" - }, - field.NewPath("field")) - if len(errs) != 1 { - t.Fatalf("unexpected errors: %v", errs) - } - if !strings.Contains(errs[0].Error(), "Invalid value") { - t.Errorf("unexpected error message: %v", errs) - } -} - -func TestValidateObjectMetaOwnerReferences(t *testing.T) { - testCases := []struct { - ownerReferences []api.OwnerReference - expectError bool - }{ - { - []api.OwnerReference{ - { - APIVersion: "thirdpartyVersion", - Kind: "thirdpartyKind", - Name: "name", - UID: "1", - }, - }, - false, - }, - { - // event shouldn't be set as an owner - []api.OwnerReference{ - { - APIVersion: "v1", - Kind: "Event", - Name: "name", - UID: "1", - }, - }, - true, - }, - } - - for _, tc := range testCases { - errs := ValidateObjectMeta( - &api.ObjectMeta{Name: "test", Namespace: "test", OwnerReferences: tc.ownerReferences}, - true, - func(s string, prefix bool) (bool, string) { - return true, "" - }, - field.NewPath("field")) - if len(errs) != 0 && !tc.expectError { - t.Errorf("unexpected error: %v", errs) - } - if len(errs) == 0 && tc.expectError { - t.Errorf("expect error") - } - if len(errs) != 0 && !strings.Contains(errs[0].Error(), "is disallowed from being an owner") { - t.Errorf("unexpected error message: %v", errs) - } - } -} - -func TestValidateObjectMetaUpdateIgnoresCreationTimestamp(t *testing.T) { - if errs := ValidateObjectMetaUpdate( - &api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - &api.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: unversioned.NewTime(time.Unix(10, 0))}, - field.NewPath("field"), - ); len(errs) != 0 { - t.Fatalf("unexpected errors: %v", errs) - } - if errs := ValidateObjectMetaUpdate( - &api.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: unversioned.NewTime(time.Unix(10, 0))}, - &api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - field.NewPath("field"), - ); len(errs) != 0 { - t.Fatalf("unexpected errors: %v", errs) - } - if errs := ValidateObjectMetaUpdate( - &api.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: unversioned.NewTime(time.Unix(10, 0))}, - &api.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: unversioned.NewTime(time.Unix(11, 0))}, - field.NewPath("field"), - ); len(errs) != 0 { - t.Fatalf("unexpected errors: %v", errs) - } -} - -func TestValidateObjectMetaUpdatePreventsDeletionFieldMutation(t *testing.T) { - now := unversioned.NewTime(time.Unix(1000, 0).UTC()) - later := unversioned.NewTime(time.Unix(2000, 0).UTC()) - gracePeriodShort := int64(30) - gracePeriodLong := int64(40) - - testcases := map[string]struct { - Old api.ObjectMeta - New api.ObjectMeta - ExpectedNew api.ObjectMeta - ExpectedErrs []string - }{ - "valid without deletion fields": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedErrs: []string{}, - }, - "valid with deletion fields": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedErrs: []string{}, - }, - - "invalid set deletionTimestamp": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: \"1970-01-01T00:16:40Z\": field is immutable; may only be changed via deletion"}, - }, - "invalid clear deletionTimestamp": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{}, // no errors, validation copies the old value - }, - "invalid change deletionTimestamp": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &later}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{}, // no errors, validation copies the old value - }, - - "invalid set deletionGracePeriodSeconds": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 30: field is immutable; may only be changed via deletion"}, - }, - "invalid clear deletionGracePeriodSeconds": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedErrs: []string{}, // no errors, validation copies the old value - }, - "invalid change deletionGracePeriodSeconds": { - Old: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - New: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, - ExpectedNew: api.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, - ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 40: field is immutable; may only be changed via deletion"}, - }, - } - - for k, tc := range testcases { - errs := ValidateObjectMetaUpdate(&tc.New, &tc.Old, field.NewPath("field")) - if len(errs) != len(tc.ExpectedErrs) { - t.Logf("%s: Expected: %#v", k, tc.ExpectedErrs) - t.Logf("%s: Got: %#v", k, errs) - t.Errorf("%s: expected %d errors, got %d", k, len(tc.ExpectedErrs), len(errs)) - continue - } - for i := range errs { - if errs[i].Error() != tc.ExpectedErrs[i] { - t.Errorf("%s: error #%d: expected %q, got %q", k, i, tc.ExpectedErrs[i], errs[i].Error()) - } - } - if !reflect.DeepEqual(tc.New, tc.ExpectedNew) { - t.Errorf("%s: Expected after validation:\n%#v\ngot\n%#v", k, tc.ExpectedNew, tc.New) - } - } -} - -// Ensure trailing slash is allowed in generate name -func TestValidateObjectMetaTrimsTrailingSlash(t *testing.T) { - errs := ValidateObjectMeta( - &api.ObjectMeta{Name: "test", GenerateName: "foo-"}, - false, - NameIsDNSSubdomain, - field.NewPath("field")) - if len(errs) != 0 { - t.Fatalf("unexpected errors: %v", errs) - } -} - -// Ensure updating finalizers is disallowed -func TestValidateObjectMetaUpdateDisallowsUpdatingFinalizers(t *testing.T) { - errs := ValidateObjectMetaUpdate( - &api.ObjectMeta{Name: "test", ResourceVersion: "1", Finalizers: []string{"orphaning"}}, - &api.ObjectMeta{Name: "test", ResourceVersion: "1"}, - field.NewPath("field"), - ) - if len(errs) != 1 { - t.Fatalf("unexpected errors: %v", errs) - } - if !strings.Contains(errs[0].Error(), "field is immutable") { - t.Errorf("unexpected error message: %v", errs) - } -} - -func TestValidateAnnotations(t *testing.T) { - successCases := []map[string]string{ - {"simple": "bar"}, - {"now-with-dashes": "bar"}, - {"1-starts-with-num": "bar"}, - {"1234": "bar"}, - {"simple/simple": "bar"}, - {"now-with-dashes/simple": "bar"}, - {"now-with-dashes/now-with-dashes": "bar"}, - {"now.with.dots/simple": "bar"}, - {"now-with.dashes-and.dots/simple": "bar"}, - {"1-num.2-num/3-num": "bar"}, - {"1234/5678": "bar"}, - {"1.2.3.4/5678": "bar"}, - {"UpperCase123": "bar"}, - {"a": strings.Repeat("b", totalAnnotationSizeLimitB-1)}, - { - "a": strings.Repeat("b", totalAnnotationSizeLimitB/2-1), - "c": strings.Repeat("d", totalAnnotationSizeLimitB/2-1), - }, - } - for i := range successCases { - errs := ValidateAnnotations(successCases[i], field.NewPath("field")) - if len(errs) != 0 { - t.Errorf("case[%d] expected success, got %#v", i, errs) - } - } - - nameErrorCases := []map[string]string{ - {"nospecialchars^=@": "bar"}, - {"cantendwithadash-": "bar"}, - {"only/one/slash": "bar"}, - {strings.Repeat("a", 254): "bar"}, - } - for i := range nameErrorCases { - errs := ValidateAnnotations(nameErrorCases[i], field.NewPath("field")) - if len(errs) != 1 { - t.Errorf("case[%d] expected failure", i) - } - detail := errs[0].Detail - if detail != qualifiedNameErrorMsg { - t.Errorf("error detail %s should be equal %s", detail, qualifiedNameErrorMsg) - } - } - totalSizeErrorCases := []map[string]string{ - {"a": strings.Repeat("b", totalAnnotationSizeLimitB)}, - { - "a": strings.Repeat("b", totalAnnotationSizeLimitB/2), - "c": strings.Repeat("d", totalAnnotationSizeLimitB/2), - }, - } - for i := range totalSizeErrorCases { - errs := ValidateAnnotations(totalSizeErrorCases[i], field.NewPath("field")) - if len(errs) != 1 { - t.Errorf("case[%d] expected failure", i) - } - } -} - -func testVolume(name string, namespace string, spec api.PersistentVolumeSpec) *api.PersistentVolume { - objMeta := api.ObjectMeta{Name: name} - if namespace != "" { - objMeta.Namespace = namespace - } - - return &api.PersistentVolume{ - ObjectMeta: objMeta, - Spec: spec, - } -} - -func TestValidatePersistentVolumes(t *testing.T) { - scenarios := map[string]struct { - isExpectedFailure bool - volume *api.PersistentVolume - }{ - "good-volume": { - isExpectedFailure: false, - volume: testVolume("foo", "", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }), - }, - "invalid-accessmode": { - isExpectedFailure: true, - volume: testVolume("foo", "", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - AccessModes: []api.PersistentVolumeAccessMode{"fakemode"}, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }), - }, - "unexpected-namespace": { - isExpectedFailure: true, - volume: testVolume("foo", "unexpected-namespace", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }), - }, - "bad-name": { - isExpectedFailure: true, - volume: testVolume("123*Bad(Name", "unexpected-namespace", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }), - }, - "missing-name": { - isExpectedFailure: true, - volume: testVolume("", "", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - }), - }, - "missing-capacity": { - isExpectedFailure: true, - volume: testVolume("foo", "", api.PersistentVolumeSpec{}), - }, - "missing-accessmodes": { - isExpectedFailure: true, - volume: testVolume("goodname", "missing-accessmodes", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }), - }, - "too-many-sources": { - isExpectedFailure: true, - volume: testVolume("", "", api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "foo", FSType: "ext4"}, - }, - }), - }, - } - - for name, scenario := range scenarios { - errs := ValidatePersistentVolume(scenario.volume) - if len(errs) == 0 && scenario.isExpectedFailure { - t.Errorf("Unexpected success for scenario: %s", name) - } - if len(errs) > 0 && !scenario.isExpectedFailure { - t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) - } - } - -} - -func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim { - return &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespace}, - Spec: spec, - } -} - -func TestValidatePersistentVolumeClaim(t *testing.T) { - scenarios := map[string]struct { - isExpectedFailure bool - claim *api.PersistentVolumeClaim - }{ - "good-claim": { - isExpectedFailure: false, - claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }), - }, - "invalid-accessmode": { - isExpectedFailure: true, - claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{"fakemode"}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }), - }, - "missing-namespace": { - isExpectedFailure: true, - claim: testVolumeClaim("foo", "", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }), - }, - "no-access-modes": { - isExpectedFailure: true, - claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }), - }, - "no-resource-requests": { - isExpectedFailure: true, - claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - }, - }), - }, - "invalid-resource-requests": { - isExpectedFailure: true, - claim: testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - }), - }, - } - - for name, scenario := range scenarios { - errs := ValidatePersistentVolumeClaim(scenario.claim) - if len(errs) == 0 && scenario.isExpectedFailure { - t.Errorf("Unexpected success for scenario: %s", name) - } - if len(errs) > 0 && !scenario.isExpectedFailure { - t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) - } - } -} - -func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { - validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }) - validUpdateClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - VolumeName: "volume", - }) - invalidUpdateClaimResources := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("20G"), - }, - }, - VolumeName: "volume", - }) - invalidUpdateClaimAccessModes := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - VolumeName: "volume", - }) - scenarios := map[string]struct { - isExpectedFailure bool - oldClaim *api.PersistentVolumeClaim - newClaim *api.PersistentVolumeClaim - }{ - "valid-update": { - isExpectedFailure: false, - oldClaim: validClaim, - newClaim: validUpdateClaim, - }, - "invalid-update-change-resources-on-bound-claim": { - isExpectedFailure: true, - oldClaim: validUpdateClaim, - newClaim: invalidUpdateClaimResources, - }, - "invalid-update-change-access-modes-on-bound-claim": { - isExpectedFailure: true, - oldClaim: validUpdateClaim, - newClaim: invalidUpdateClaimAccessModes, - }, - } - - for name, scenario := range scenarios { - // ensure we have a resource version specified for updates - scenario.oldClaim.ResourceVersion = "1" - scenario.newClaim.ResourceVersion = "1" - errs := ValidatePersistentVolumeClaimUpdate(scenario.newClaim, scenario.oldClaim) - if len(errs) == 0 && scenario.isExpectedFailure { - t.Errorf("Unexpected success for scenario: %s", name) - } - if len(errs) > 0 && !scenario.isExpectedFailure { - t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) - } - } -} - -func TestValidateVolumes(t *testing.T) { - lun := int32(1) - successCase := []api.Volume{ - {Name: "abc", VolumeSource: api.VolumeSource{HostPath: &api.HostPathVolumeSource{Path: "/mnt/path1"}}}, - {Name: "123", VolumeSource: api.VolumeSource{HostPath: &api.HostPathVolumeSource{Path: "/mnt/path2"}}}, - {Name: "abc-123", VolumeSource: api.VolumeSource{HostPath: &api.HostPathVolumeSource{Path: "/mnt/path3"}}}, - {Name: "empty", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - {Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}, - {Name: "awsebs", VolumeSource: api.VolumeSource{AWSElasticBlockStore: &api.AWSElasticBlockStoreVolumeSource{VolumeID: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}, - {Name: "gitrepo", VolumeSource: api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{Repository: "my-repo", Revision: "hashstring", Directory: "target"}}}, - {Name: "gitrepodot", VolumeSource: api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{Repository: "my-repo", Directory: "."}}}, - {Name: "iscsidisk", VolumeSource: api.VolumeSource{ISCSI: &api.ISCSIVolumeSource{TargetPortal: "127.0.0.1", IQN: "iqn.2015-02.example.com:test", Lun: 1, FSType: "ext4", ReadOnly: false}}}, - {Name: "secret", VolumeSource: api.VolumeSource{Secret: &api.SecretVolumeSource{SecretName: "my-secret"}}}, - {Name: "glusterfs", VolumeSource: api.VolumeSource{Glusterfs: &api.GlusterfsVolumeSource{EndpointsName: "host1", Path: "path", ReadOnly: false}}}, - {Name: "flocker", VolumeSource: api.VolumeSource{Flocker: &api.FlockerVolumeSource{DatasetName: "datasetName"}}}, - {Name: "rbd", VolumeSource: api.VolumeSource{RBD: &api.RBDVolumeSource{CephMonitors: []string{"foo"}, RBDImage: "bar", FSType: "ext4"}}}, - {Name: "cinder", VolumeSource: api.VolumeSource{Cinder: &api.CinderVolumeSource{VolumeID: "29ea5088-4f60-4757-962e-dba678767887", FSType: "ext4", ReadOnly: false}}}, - {Name: "cephfs", VolumeSource: api.VolumeSource{CephFS: &api.CephFSVolumeSource{Monitors: []string{"foo"}}}}, - {Name: "downwardapi", VolumeSource: api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{ - {Path: "labels", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}, - {Path: "annotations", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.annotations"}}, - {Path: "namespace", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.namespace"}}, - {Path: "name", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.name"}}, - {Path: "path/withslash/andslash", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}, - {Path: "path/./withdot", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}, - {Path: "path/with..dot", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}, - {Path: "second-level-dirent-can-have/..dot", FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}, - }}}}, - {Name: "fc", VolumeSource: api.VolumeSource{FC: &api.FCVolumeSource{TargetWWNs: []string{"some_wwn"}, Lun: &lun, FSType: "ext4", ReadOnly: false}}}, - {Name: "flexvolume", VolumeSource: api.VolumeSource{FlexVolume: &api.FlexVolumeSource{Driver: "kubernetes.io/blue", FSType: "ext4"}}}, - {Name: "azure", VolumeSource: api.VolumeSource{AzureFile: &api.AzureFileVolumeSource{SecretName: "key", ShareName: "share", ReadOnly: false}}}, - } - names, errs := validateVolumes(successCase, field.NewPath("field")) - if len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - if len(names) != len(successCase) || !names.HasAll("abc", "123", "abc-123", "empty", "gcepd", "gitrepo", "secret", "iscsidisk", "cinder", "cephfs", "flexvolume", "fc") { - t.Errorf("wrong names result: %v", names) - } - emptyVS := api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}} - emptyPortal := api.VolumeSource{ISCSI: &api.ISCSIVolumeSource{TargetPortal: "", IQN: "iqn.2015-02.example.com:test", Lun: 1, FSType: "ext4", ReadOnly: false}} - emptyIQN := api.VolumeSource{ISCSI: &api.ISCSIVolumeSource{TargetPortal: "127.0.0.1", IQN: "", Lun: 1, FSType: "ext4", ReadOnly: false}} - emptyHosts := api.VolumeSource{Glusterfs: &api.GlusterfsVolumeSource{EndpointsName: "", Path: "path", ReadOnly: false}} - emptyPath := api.VolumeSource{Glusterfs: &api.GlusterfsVolumeSource{EndpointsName: "host", Path: "", ReadOnly: false}} - emptyName := api.VolumeSource{Flocker: &api.FlockerVolumeSource{DatasetName: ""}} - emptyMon := api.VolumeSource{RBD: &api.RBDVolumeSource{CephMonitors: []string{}, RBDImage: "bar", FSType: "ext4"}} - emptyImage := api.VolumeSource{RBD: &api.RBDVolumeSource{CephMonitors: []string{"foo"}, RBDImage: "", FSType: "ext4"}} - emptyCephFSMon := api.VolumeSource{CephFS: &api.CephFSVolumeSource{Monitors: []string{}}} - startsWithDots := api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{Repository: "foo", Directory: "..dots/bar"}} - containsDots := api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{Repository: "foo", Directory: "dots/../bar"}} - absPath := api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{Repository: "foo", Directory: "/abstarget"}} - emptyPathName := api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{{Path: "", - FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}}, - }} - absolutePathName := api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{{Path: "/absolutepath", - FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}}, - }} - dotDotInPath := api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{{Path: "../../passwd", - FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}}, - }} - dotDotPathName := api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{{Path: "..badFileName", - FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}}, - }} - dotDotFirstLevelDirent := api.VolumeSource{DownwardAPI: &api.DownwardAPIVolumeSource{Items: []api.DownwardAPIVolumeFile{{Path: "..badDirName/goodFileName", - FieldRef: api.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "metadata.labels"}}}, - }} - zeroWWN := api.VolumeSource{FC: &api.FCVolumeSource{TargetWWNs: []string{}, Lun: &lun, FSType: "ext4", ReadOnly: false}} - emptyLun := api.VolumeSource{FC: &api.FCVolumeSource{TargetWWNs: []string{"wwn"}, Lun: nil, FSType: "ext4", ReadOnly: false}} - slashInName := api.VolumeSource{Flocker: &api.FlockerVolumeSource{DatasetName: "foo/bar"}} - emptyAzureSecret := api.VolumeSource{AzureFile: &api.AzureFileVolumeSource{SecretName: "", ShareName: "share", ReadOnly: false}} - emptyAzureShare := api.VolumeSource{AzureFile: &api.AzureFileVolumeSource{SecretName: "name", ShareName: "", ReadOnly: false}} - errorCases := map[string]struct { - V []api.Volume - T field.ErrorType - F string - D string - }{ - "zero-length name": { - []api.Volume{{Name: "", VolumeSource: emptyVS}}, - field.ErrorTypeRequired, - "name", "", - }, - "name > 63 characters": { - []api.Volume{{Name: strings.Repeat("a", 64), VolumeSource: emptyVS}}, - field.ErrorTypeInvalid, - "name", "must be a DNS label", - }, - "name not a DNS label": { - []api.Volume{{Name: "a.b.c", VolumeSource: emptyVS}}, - field.ErrorTypeInvalid, - "name", "must be a DNS label", - }, - "name not unique": { - []api.Volume{{Name: "abc", VolumeSource: emptyVS}, {Name: "abc", VolumeSource: emptyVS}}, - field.ErrorTypeDuplicate, - "[1].name", "", - }, - "empty portal": { - []api.Volume{{Name: "badportal", VolumeSource: emptyPortal}}, - field.ErrorTypeRequired, - "iscsi.targetPortal", "", - }, - "empty iqn": { - []api.Volume{{Name: "badiqn", VolumeSource: emptyIQN}}, - field.ErrorTypeRequired, - "iscsi.iqn", "", - }, - "empty hosts": { - []api.Volume{{Name: "badhost", VolumeSource: emptyHosts}}, - field.ErrorTypeRequired, - "glusterfs.endpoints", "", - }, - "empty path": { - []api.Volume{{Name: "badpath", VolumeSource: emptyPath}}, - field.ErrorTypeRequired, - "glusterfs.path", "", - }, - "empty datasetName": { - []api.Volume{{Name: "badname", VolumeSource: emptyName}}, - field.ErrorTypeRequired, - "flocker.datasetName", "", - }, - "empty mon": { - []api.Volume{{Name: "badmon", VolumeSource: emptyMon}}, - field.ErrorTypeRequired, - "rbd.monitors", "", - }, - "empty image": { - []api.Volume{{Name: "badimage", VolumeSource: emptyImage}}, - field.ErrorTypeRequired, - "rbd.image", "", - }, - "empty cephfs mon": { - []api.Volume{{Name: "badmon", VolumeSource: emptyCephFSMon}}, - field.ErrorTypeRequired, - "cephfs.monitors", "", - }, - "empty metatada path": { - []api.Volume{{Name: "emptyname", VolumeSource: emptyPathName}}, - field.ErrorTypeRequired, - "downwardAPI.path", "", - }, - "absolute path": { - []api.Volume{{Name: "absolutepath", VolumeSource: absolutePathName}}, - field.ErrorTypeInvalid, - "downwardAPI.path", "", - }, - "dot dot path": { - []api.Volume{{Name: "dotdotpath", VolumeSource: dotDotInPath}}, - field.ErrorTypeInvalid, - "downwardAPI.path", `must not contain '..'`, - }, - "dot dot file name": { - []api.Volume{{Name: "dotdotfilename", VolumeSource: dotDotPathName}}, - field.ErrorTypeInvalid, - "downwardAPI.path", `must not start with '..'`, - }, - "dot dot first level dirent": { - []api.Volume{{Name: "dotdotdirfilename", VolumeSource: dotDotFirstLevelDirent}}, - field.ErrorTypeInvalid, - "downwardAPI.path", `must not start with '..'`, - }, - "empty wwn": { - []api.Volume{{Name: "badimage", VolumeSource: zeroWWN}}, - field.ErrorTypeRequired, - "fc.targetWWNs", "", - }, - "empty lun": { - []api.Volume{{Name: "badimage", VolumeSource: emptyLun}}, - field.ErrorTypeRequired, - "fc.lun", "", - }, - "slash in datasetName": { - []api.Volume{{Name: "slashinname", VolumeSource: slashInName}}, - field.ErrorTypeInvalid, - "flocker.datasetName", "must not contain '/'", - }, - "starts with '..'": { - []api.Volume{{Name: "badprefix", VolumeSource: startsWithDots}}, - field.ErrorTypeInvalid, - "gitRepo.directory", `must not start with '..'`, - }, - "contains '..'": { - []api.Volume{{Name: "containsdots", VolumeSource: containsDots}}, - field.ErrorTypeInvalid, - "gitRepo.directory", `must not contain '..'`, - }, - "absolute target": { - []api.Volume{{Name: "absolutetarget", VolumeSource: absPath}}, - field.ErrorTypeInvalid, - "gitRepo.directory", "", - }, - "empty secret": { - []api.Volume{{Name: "emptyaccount", VolumeSource: emptyAzureSecret}}, - field.ErrorTypeRequired, - "azureFile.secretName", "", - }, - "empty share": { - []api.Volume{{Name: "emptyaccount", VolumeSource: emptyAzureShare}}, - field.ErrorTypeRequired, - "azureFile.shareName", "", - }, - } - for k, v := range errorCases { - _, errs := validateVolumes(v.V, field.NewPath("field")) - if len(errs) == 0 { - t.Errorf("expected failure %s for %v", k, v.V) - continue - } - for i := range errs { - if errs[i].Type != v.T { - t.Errorf("%s: expected error to have type %q: %q", k, v.T, errs[i].Type) - } - if !strings.Contains(errs[i].Field, v.F) { - t.Errorf("%s: expected error field %q: %q", k, v.F, errs[i].Field) - } - if !strings.Contains(errs[i].Detail, v.D) { - t.Errorf("%s: expected error detail %q, got %q", k, v.D, errs[i].Detail) - } - } - } -} - -func TestValidatePorts(t *testing.T) { - successCase := []api.ContainerPort{ - {Name: "abc", ContainerPort: 80, HostPort: 80, Protocol: "TCP"}, - {Name: "easy", ContainerPort: 82, Protocol: "TCP"}, - {Name: "as", ContainerPort: 83, Protocol: "UDP"}, - {Name: "do-re-me", ContainerPort: 84, Protocol: "UDP"}, - {ContainerPort: 85, Protocol: "TCP"}, - } - if errs := validateContainerPorts(successCase, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - nonCanonicalCase := []api.ContainerPort{ - {ContainerPort: 80, Protocol: "TCP"}, - } - if errs := validateContainerPorts(nonCanonicalCase, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - errorCases := map[string]struct { - P []api.ContainerPort - T field.ErrorType - F string - D string - }{ - "name > 15 characters": { - []api.ContainerPort{{Name: strings.Repeat("a", 16), ContainerPort: 80, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "name", PortNameErrorMsg, - }, - "name not a IANA svc name ": { - []api.ContainerPort{{Name: "a.b.c", ContainerPort: 80, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "name", PortNameErrorMsg, - }, - "name not a IANA svc name (i.e. a number)": { - []api.ContainerPort{{Name: "80", ContainerPort: 80, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "name", PortNameErrorMsg, - }, - "name not unique": { - []api.ContainerPort{ - {Name: "abc", ContainerPort: 80, Protocol: "TCP"}, - {Name: "abc", ContainerPort: 81, Protocol: "TCP"}, - }, - field.ErrorTypeDuplicate, - "[1].name", "", - }, - "zero container port": { - []api.ContainerPort{{ContainerPort: 0, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "containerPort", PortRangeErrorMsg, - }, - "invalid container port": { - []api.ContainerPort{{ContainerPort: 65536, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "containerPort", PortRangeErrorMsg, - }, - "invalid host port": { - []api.ContainerPort{{ContainerPort: 80, HostPort: 65536, Protocol: "TCP"}}, - field.ErrorTypeInvalid, - "hostPort", PortRangeErrorMsg, - }, - "invalid protocol case": { - []api.ContainerPort{{ContainerPort: 80, Protocol: "tcp"}}, - field.ErrorTypeNotSupported, - "protocol", "supported values: TCP, UDP", - }, - "invalid protocol": { - []api.ContainerPort{{ContainerPort: 80, Protocol: "ICMP"}}, - field.ErrorTypeNotSupported, - "protocol", "supported values: TCP, UDP", - }, - "protocol required": { - []api.ContainerPort{{Name: "abc", ContainerPort: 80}}, - field.ErrorTypeRequired, - "protocol", "", - }, - } - for k, v := range errorCases { - errs := validateContainerPorts(v.P, field.NewPath("field")) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - if errs[i].Type != v.T { - t.Errorf("%s: expected error to have type %q: %q", k, v.T, errs[i].Type) - } - if !strings.Contains(errs[i].Field, v.F) { - t.Errorf("%s: expected error field %q: %q", k, v.F, errs[i].Field) - } - if !strings.Contains(errs[i].Detail, v.D) { - t.Errorf("%s: expected error detail %q, got %q", k, v.D, errs[i].Detail) - } - } - } -} - -func TestValidateEnv(t *testing.T) { - successCase := []api.EnvVar{ - {Name: "abc", Value: "value"}, - {Name: "ABC", Value: "value"}, - {Name: "AbC_123", Value: "value"}, - {Name: "abc", Value: ""}, - { - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - FieldPath: "metadata.name", - }, - }, - }, - { - Name: "secret_value", - ValueFrom: &api.EnvVarSource{ - SecretKeyRef: &api.SecretKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "some-secret", - }, - Key: "secret-key", - }, - }, - }, - { - Name: "ENV_VAR_1", - ValueFrom: &api.EnvVarSource{ - ConfigMapKeyRef: &api.ConfigMapKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "some-config-map", - }, - Key: "some-key", - }, - }, - }, - } - if errs := validateEnv(successCase, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - errorCases := []struct { - name string - envs []api.EnvVar - expectedError string - }{ - { - name: "zero-length name", - envs: []api.EnvVar{{Name: ""}}, - expectedError: "[0].name: Required value", - }, - { - name: "name not a C identifier", - envs: []api.EnvVar{{Name: "a.b.c"}}, - expectedError: `[0].name: Invalid value: "a.b.c": must be a C identifier (matching regex [A-Za-z_][A-Za-z0-9_]*): e.g. "my_name" or "MyName"`, - }, - { - name: "value and valueFrom specified", - envs: []api.EnvVar{{ - Name: "abc", - Value: "foo", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - FieldPath: "metadata.name", - }, - }, - }}, - expectedError: "[0].valueFrom: Invalid value: \"\": may not be specified when `value` is not empty", - }, - { - name: "valueFrom.fieldRef and valueFrom.secretKeyRef specified", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - FieldPath: "metadata.name", - }, - SecretKeyRef: &api.SecretKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "a-secret", - }, - Key: "a-key", - }, - }, - }}, - expectedError: "[0].valueFrom: Invalid value: \"\": may not have more than one field specified at a time", - }, - { - name: "valueFrom.fieldRef and valueFrom.configMapKeyRef set", - envs: []api.EnvVar{{ - Name: "some_var_name", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - FieldPath: "metadata.name", - }, - ConfigMapKeyRef: &api.ConfigMapKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "some-config-map", - }, - Key: "some-key", - }, - }, - }}, - expectedError: `[0].valueFrom: Invalid value: "": may not have more than one field specified at a time`, - }, - { - name: "valueFrom.fieldRef and valueFrom.secretKeyRef specified", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - FieldPath: "metadata.name", - }, - SecretKeyRef: &api.SecretKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "a-secret", - }, - Key: "a-key", - }, - ConfigMapKeyRef: &api.ConfigMapKeySelector{ - LocalObjectReference: api.LocalObjectReference{ - Name: "some-config-map", - }, - Key: "some-key", - }, - }, - }}, - expectedError: `[0].valueFrom: Invalid value: "": may not have more than one field specified at a time`, - }, - { - name: "missing FieldPath on ObjectFieldSelector", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - APIVersion: testapi.Default.GroupVersion().String(), - }, - }, - }}, - expectedError: `[0].valueFrom.fieldRef.fieldPath: Required value`, - }, - { - name: "missing APIVersion on ObjectFieldSelector", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - FieldPath: "metadata.name", - }, - }, - }}, - expectedError: `[0].valueFrom.fieldRef.apiVersion: Required value`, - }, - { - name: "invalid fieldPath", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - FieldPath: "metadata.whoops", - APIVersion: testapi.Default.GroupVersion().String(), - }, - }, - }}, - expectedError: `[0].valueFrom.fieldRef.fieldPath: Invalid value: "metadata.whoops": error converting fieldPath`, - }, - { - name: "invalid fieldPath labels", - envs: []api.EnvVar{{ - Name: "labels", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - FieldPath: "metadata.labels", - APIVersion: "v1", - }, - }, - }}, - expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: metadata.name, metadata.namespace, status.podIP`, - }, - { - name: "invalid fieldPath annotations", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - FieldPath: "metadata.annotations", - APIVersion: "v1", - }, - }, - }}, - expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.annotations": supported values: metadata.name, metadata.namespace, status.podIP`, - }, - { - name: "unsupported fieldPath", - envs: []api.EnvVar{{ - Name: "abc", - ValueFrom: &api.EnvVarSource{ - FieldRef: &api.ObjectFieldSelector{ - FieldPath: "status.phase", - APIVersion: testapi.Default.GroupVersion().String(), - }, - }, - }}, - expectedError: `valueFrom.fieldRef.fieldPath: Unsupported value: "status.phase": supported values: metadata.name, metadata.namespace, status.podIP`, - }, - } - for _, tc := range errorCases { - if errs := validateEnv(tc.envs, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %s", tc.name) - } else { - for i := range errs { - str := errs[i].Error() - if str != "" && !strings.Contains(str, tc.expectedError) { - t.Errorf("%s: expected error detail either empty or %q, got %q", tc.name, tc.expectedError, str) - } - } - } - } -} - -func TestValidateVolumeMounts(t *testing.T) { - volumes := sets.NewString("abc", "123", "abc-123") - - successCase := []api.VolumeMount{ - {Name: "abc", MountPath: "/foo"}, - {Name: "123", MountPath: "/bar"}, - {Name: "abc-123", MountPath: "/baz"}, - {Name: "abc-123", MountPath: "/baa", SubPath: ""}, - {Name: "abc-123", MountPath: "/bab", SubPath: "baz"}, - {Name: "abc-123", MountPath: "/bac", SubPath: ".baz"}, - {Name: "abc-123", MountPath: "/bad", SubPath: "..baz"}, - } - if errs := validateVolumeMounts(successCase, volumes, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - errorCases := map[string][]api.VolumeMount{ - "empty name": {{Name: "", MountPath: "/foo"}}, - "name not found": {{Name: "", MountPath: "/foo"}}, - "empty mountpath": {{Name: "abc", MountPath: ""}}, - "colon mountpath": {{Name: "abc", MountPath: "foo:bar"}}, - "mountpath collision": {{Name: "foo", MountPath: "/path/a"}, {Name: "bar", MountPath: "/path/a"}}, - "absolute subpath": {{Name: "abc", MountPath: "/bar", SubPath: "/baz"}}, - "subpath in ..": {{Name: "abc", MountPath: "/bar", SubPath: "../baz"}}, - "subpath contains ..": {{Name: "abc", MountPath: "/bar", SubPath: "baz/../bat"}}, - "subpath ends in ..": {{Name: "abc", MountPath: "/bar", SubPath: "./.."}}, - } - for k, v := range errorCases { - if errs := validateVolumeMounts(v, volumes, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - } -} - -func TestValidateProbe(t *testing.T) { - handler := api.Handler{Exec: &api.ExecAction{Command: []string{"echo"}}} - // These fields must be positive. - positiveFields := [...]string{"InitialDelaySeconds", "TimeoutSeconds", "PeriodSeconds", "SuccessThreshold", "FailureThreshold"} - successCases := []*api.Probe{nil} - for _, field := range positiveFields { - probe := &api.Probe{Handler: handler} - reflect.ValueOf(probe).Elem().FieldByName(field).SetInt(10) - successCases = append(successCases, probe) - } - - for _, p := range successCases { - if errs := validateProbe(p, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []*api.Probe{{TimeoutSeconds: 10, InitialDelaySeconds: 10}} - for _, field := range positiveFields { - probe := &api.Probe{Handler: handler} - reflect.ValueOf(probe).Elem().FieldByName(field).SetInt(-10) - errorCases = append(errorCases, probe) - } - for _, p := range errorCases { - if errs := validateProbe(p, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %v", p) - } - } -} - -func TestValidateHandler(t *testing.T) { - successCases := []api.Handler{ - {Exec: &api.ExecAction{Command: []string{"echo"}}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromInt(1), Host: "", Scheme: "HTTP"}}, - {HTTPGet: &api.HTTPGetAction{Path: "/foo", Port: intstr.FromInt(65535), Host: "host", Scheme: "HTTP"}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromString("port"), Host: "", Scheme: "HTTP"}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromString("port"), Host: "", Scheme: "HTTP", HTTPHeaders: []api.HTTPHeader{{"Host", "foo.example.com"}}}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromString("port"), Host: "", Scheme: "HTTP", HTTPHeaders: []api.HTTPHeader{{"X-Forwarded-For", "1.2.3.4"}, {"X-Forwarded-For", "5.6.7.8"}}}}, - } - for _, h := range successCases { - if errs := validateHandler(&h, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []api.Handler{ - {}, - {Exec: &api.ExecAction{Command: []string{}}}, - {HTTPGet: &api.HTTPGetAction{Path: "", Port: intstr.FromInt(0), Host: ""}}, - {HTTPGet: &api.HTTPGetAction{Path: "/foo", Port: intstr.FromInt(65536), Host: "host"}}, - {HTTPGet: &api.HTTPGetAction{Path: "", Port: intstr.FromString(""), Host: ""}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromString("port"), Host: "", Scheme: "HTTP", HTTPHeaders: []api.HTTPHeader{{"Host:", "foo.example.com"}}}}, - {HTTPGet: &api.HTTPGetAction{Path: "/", Port: intstr.FromString("port"), Host: "", Scheme: "HTTP", HTTPHeaders: []api.HTTPHeader{{"X_Forwarded_For", "foo.example.com"}}}}, - } - for _, h := range errorCases { - if errs := validateHandler(&h, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %#v", h) - } - } -} - -func TestValidatePullPolicy(t *testing.T) { - type T struct { - Container api.Container - ExpectedPolicy api.PullPolicy - } - testCases := map[string]T{ - "NotPresent1": { - api.Container{Name: "abc", Image: "image:latest", ImagePullPolicy: "IfNotPresent"}, - api.PullIfNotPresent, - }, - "NotPresent2": { - api.Container{Name: "abc1", Image: "image", ImagePullPolicy: "IfNotPresent"}, - api.PullIfNotPresent, - }, - "Always1": { - api.Container{Name: "123", Image: "image:latest", ImagePullPolicy: "Always"}, - api.PullAlways, - }, - "Always2": { - api.Container{Name: "1234", Image: "image", ImagePullPolicy: "Always"}, - api.PullAlways, - }, - "Never1": { - api.Container{Name: "abc-123", Image: "image:latest", ImagePullPolicy: "Never"}, - api.PullNever, - }, - "Never2": { - api.Container{Name: "abc-1234", Image: "image", ImagePullPolicy: "Never"}, - api.PullNever, - }, - } - for k, v := range testCases { - ctr := &v.Container - errs := validatePullPolicy(ctr.ImagePullPolicy, field.NewPath("field")) - if len(errs) != 0 { - t.Errorf("case[%s] expected success, got %#v", k, errs) - } - if ctr.ImagePullPolicy != v.ExpectedPolicy { - t.Errorf("case[%s] expected policy %v, got %v", k, v.ExpectedPolicy, ctr.ImagePullPolicy) - } - } -} - -func getResourceLimits(cpu, memory string) api.ResourceList { - res := api.ResourceList{} - res[api.ResourceCPU] = resource.MustParse(cpu) - res[api.ResourceMemory] = resource.MustParse(memory) - return res -} - -func TestValidateContainers(t *testing.T) { - volumes := sets.String{} - capabilities.SetForTests(capabilities.Capabilities{ - AllowPrivileged: true, - }) - - successCase := []api.Container{ - {Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}, - {Name: "123", Image: "image", ImagePullPolicy: "IfNotPresent"}, - {Name: "abc-123", Image: "image", ImagePullPolicy: "IfNotPresent"}, - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{ - Exec: &api.ExecAction{Command: []string{"ls", "-l"}}, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "resources-test", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - api.ResourceName("my.org/resource"): resource.MustParse("10m"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "resources-request-limit-simple", - Image: "image", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("8"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "resources-request-limit-edge", - Image: "image", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - api.ResourceName("my.org/resource"): resource.MustParse("10m"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - api.ResourceName("my.org/resource"): resource.MustParse("10m"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "resources-request-limit-partials", - Image: "image", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("9.5"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName("my.org/resource"): resource.MustParse("10m"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "resources-request", - Image: "image", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("9.5"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - { - Name: "same-host-port-different-protocol", - Image: "image", - Ports: []api.ContainerPort{ - {ContainerPort: 80, HostPort: 80, Protocol: "TCP"}, - {ContainerPort: 80, HostPort: 80, Protocol: "UDP"}, - }, - ImagePullPolicy: "IfNotPresent", - }, - {Name: "abc-1234", Image: "image", ImagePullPolicy: "IfNotPresent", SecurityContext: fakeValidSecurityContext(true)}, - } - if errs := validateContainers(successCase, volumes, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - capabilities.SetForTests(capabilities.Capabilities{ - AllowPrivileged: false, - }) - errorCases := map[string][]api.Container{ - "zero-length name": {{Name: "", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - "name > 63 characters": {{Name: strings.Repeat("a", 64), Image: "image", ImagePullPolicy: "IfNotPresent"}}, - "name not a DNS label": {{Name: "a.b.c", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - "name not unique": { - {Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}, - {Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}, - }, - "zero-length image": {{Name: "abc", Image: "", ImagePullPolicy: "IfNotPresent"}}, - "host port not unique": { - {Name: "abc", Image: "image", Ports: []api.ContainerPort{{ContainerPort: 80, HostPort: 80, Protocol: "TCP"}}, - ImagePullPolicy: "IfNotPresent"}, - {Name: "def", Image: "image", Ports: []api.ContainerPort{{ContainerPort: 81, HostPort: 80, Protocol: "TCP"}}, - ImagePullPolicy: "IfNotPresent"}, - }, - "invalid env var name": { - {Name: "abc", Image: "image", Env: []api.EnvVar{{Name: "ev.1"}}, ImagePullPolicy: "IfNotPresent"}, - }, - "unknown volume name": { - {Name: "abc", Image: "image", VolumeMounts: []api.VolumeMount{{Name: "anything", MountPath: "/foo"}}, - ImagePullPolicy: "IfNotPresent"}, - }, - "invalid lifecycle, no exec command.": { - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{ - Exec: &api.ExecAction{}, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid lifecycle, no http path.": { - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{ - HTTPGet: &api.HTTPGetAction{}, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid lifecycle, no tcp socket port.": { - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{ - TCPSocket: &api.TCPSocketAction{}, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid lifecycle, zero tcp socket port.": { - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{ - TCPSocket: &api.TCPSocketAction{ - Port: intstr.FromInt(0), - }, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid lifecycle, no action.": { - { - Name: "life-123", - Image: "image", - Lifecycle: &api.Lifecycle{ - PreStop: &api.Handler{}, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid liveness probe, no tcp socket port.": { - { - Name: "life-123", - Image: "image", - LivenessProbe: &api.Probe{ - Handler: api.Handler{ - TCPSocket: &api.TCPSocketAction{}, - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "invalid liveness probe, no action.": { - { - Name: "life-123", - Image: "image", - LivenessProbe: &api.Probe{ - Handler: api.Handler{}, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "privilege disabled": { - {Name: "abc", Image: "image", SecurityContext: fakeValidSecurityContext(true)}, - }, - "invalid compute resource": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: api.ResourceList{ - "disk": resource.MustParse("10G"), - }, - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "Resource CPU invalid": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("-10", "0"), - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "Resource Requests CPU invalid": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Requests: getResourceLimits("-10", "0"), - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "Resource Memory invalid": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("0", "-10"), - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "Request limit simple invalid": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("5", "3"), - Requests: getResourceLimits("6", "3"), - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - "Request limit multiple invalid": { - { - Name: "abc-123", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("5", "3"), - Requests: getResourceLimits("6", "4"), - }, - ImagePullPolicy: "IfNotPresent", - }, - }, - } - for k, v := range errorCases { - if errs := validateContainers(v, volumes, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - } -} - -func TestValidateRestartPolicy(t *testing.T) { - successCases := []api.RestartPolicy{ - api.RestartPolicyAlways, - api.RestartPolicyOnFailure, - api.RestartPolicyNever, - } - for _, policy := range successCases { - if errs := validateRestartPolicy(&policy, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []api.RestartPolicy{"", "newpolicy"} - - for k, policy := range errorCases { - if errs := validateRestartPolicy(&policy, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %d", k) - } - } -} - -func TestValidateDNSPolicy(t *testing.T) { - successCases := []api.DNSPolicy{api.DNSClusterFirst, api.DNSDefault, api.DNSPolicy(api.DNSClusterFirst)} - for _, policy := range successCases { - if errs := validateDNSPolicy(&policy, field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []api.DNSPolicy{api.DNSPolicy("invalid")} - for _, policy := range errorCases { - if errs := validateDNSPolicy(&policy, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %v", policy) - } - } -} - -func TestValidatePodSpec(t *testing.T) { - activeDeadlineSeconds := int64(30) - minID := int64(0) - maxID := int64(2147483647) - successCases := []api.PodSpec{ - { // Populate basic fields, leave defaults for most. - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate all fields. - Volumes: []api.Volume{ - {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - }, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - NodeSelector: map[string]string{ - "key": "value", - }, - NodeName: "foobar", - DNSPolicy: api.DNSClusterFirst, - ActiveDeadlineSeconds: &activeDeadlineSeconds, - ServiceAccountName: "acct", - }, - { // Populate HostNetwork. - Containers: []api.Container{ - {Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", Ports: []api.ContainerPort{ - {HostPort: 8080, ContainerPort: 8080, Protocol: "TCP"}}, - }, - }, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: true, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate RunAsUser SupplementalGroups FSGroup with minID 0 - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - SupplementalGroups: []int64{minID}, - RunAsUser: &minID, - FSGroup: &minID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate RunAsUser SupplementalGroups FSGroup with maxID 2147483647 - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - SupplementalGroups: []int64{maxID}, - RunAsUser: &maxID, - FSGroup: &maxID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate HostIPC. - SecurityContext: &api.PodSecurityContext{ - HostIPC: true, - }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate HostPID. - SecurityContext: &api.PodSecurityContext{ - HostPID: true, - }, - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - { // Populate Affinity. - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - } - for i := range successCases { - if errs := ValidatePodSpec(&successCases[i], field.NewPath("field")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - activeDeadlineSeconds = int64(0) - minID = int64(-1) - maxID = int64(2147483648) - failureCases := map[string]api.PodSpec{ - "bad volume": { - Volumes: []api.Volume{{}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - "no containers": { - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad container": { - Containers: []api.Container{{}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad DNS policy": { - DNSPolicy: api.DNSPolicy("invalid"), - RestartPolicy: api.RestartPolicyAlways, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - "bad service account name": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - ServiceAccountName: "invalidName", - }, - "bad restart policy": { - RestartPolicy: "UnknowPolicy", - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - "with hostNetwork hostPort not equal to containerPort": { - Containers: []api.Container{ - {Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", Ports: []api.ContainerPort{ - {HostPort: 8080, ContainerPort: 2600, Protocol: "TCP"}}, - }, - }, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: true, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad supplementalGroups large than math.MaxInt32": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - SupplementalGroups: []int64{maxID, 1234}, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad supplementalGroups less than 0": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - SupplementalGroups: []int64{minID, 1234}, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad runAsUser large than math.MaxInt32": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - RunAsUser: &maxID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad runAsUser less than 0": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - RunAsUser: &minID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad fsGroup large than math.MaxInt32": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - FSGroup: &maxID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad fsGroup less than 0": { - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - SecurityContext: &api.PodSecurityContext{ - HostNetwork: false, - FSGroup: &minID, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - "bad-active-deadline-seconds": { - Volumes: []api.Volume{ - {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - }, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - NodeSelector: map[string]string{ - "key": "value", - }, - NodeName: "foobar", - DNSPolicy: api.DNSClusterFirst, - ActiveDeadlineSeconds: &activeDeadlineSeconds, - }, - "bad nodeName": { - NodeName: "node name", - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - } - for k, v := range failureCases { - if errs := ValidatePodSpec(&v, field.NewPath("field")); len(errs) == 0 { - t.Errorf("expected failure for %q", k) - } - } -} - -func TestValidatePod(t *testing.T) { - successCases := []api.Pod{ - { // Basic fields. - ObjectMeta: api.ObjectMeta{Name: "123", Namespace: "ns"}, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - { // Just about everything. - ObjectMeta: api.ObjectMeta{Name: "abc.123.do-re-mi", Namespace: "ns"}, - Spec: api.PodSpec{ - Volumes: []api.Volume{ - {Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, - }, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - NodeSelector: map[string]string{ - "key": "value", - }, - NodeName: "foobar", - }, - }, - } - for _, pod := range successCases { - if errs := ValidatePod(&pod); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]api.Pod{ - "bad name": { - ObjectMeta: api.ObjectMeta{Name: "", Namespace: "ns"}, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - "bad namespace": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: ""}, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - "bad spec": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "ns"}, - Spec: api.PodSpec{ - Containers: []api.Container{{}}, - }, - }, - "bad label": { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "ns", - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - for k, v := range errorCases { - if errs := ValidatePod(&v); len(errs) == 0 { - t.Errorf("expected failure for %q", k) - } - } -} - -func TestValidateAffinity(t *testing.T) { - successCases := []api.Pod{ - { // Serialized affinity requirements in annotations. - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - // TODO: Uncomment and move this block into Annotations map once - // RequiredDuringSchedulingRequiredDuringExecution is implemented - // "requiredDuringSchedulingRequiredDuringExecution": { - // "nodeSelectorTerms": [{ - // "matchExpressions": [{ - // "key": "key1", - // "operator": "Exists" - // }] - // }] - // }, - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - "matchExpressions": [{ - "key": "key2", - "operator": "In", - "values": ["value1", "value2"] - }] - }] - }, - "preferredDuringSchedulingIgnoredDuringExecution": [ - { - "weight": 10, - "preference": {"matchExpressions": [ - { - "key": "foo", - "operator": "In", "values": ["bar"] - } - ]} - } - ] - }}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - { // Serialized pod affinity in affinity requirements in annotations. - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - // TODO: Uncomment and move this block into Annotations map once - // RequiredDuringSchedulingRequiredDuringExecution is implemented - // "requiredDuringSchedulingRequiredDuringExecution": [{ - // "labelSelector": { - // "matchExpressions": [{ - // "key": "key2", - // "operator": "In", - // "values": ["value1", "value2"] - // }] - // }, - // "namespaces":["ns"], - // "topologyKey": "zone" - // }] - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": [{ - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "In", - "values": ["value1", "value2"] - }] - }, - "topologyKey": "zone", - "namespaces": ["ns"] - }], - "preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "NotIn", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "region" - } - }] - }}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - { // Serialized pod anti affinity with different Label Operators in affinity requirements in annotations. - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - // TODO: Uncomment and move this block into Annotations map once - // RequiredDuringSchedulingRequiredDuringExecution is implemented - // "requiredDuringSchedulingRequiredDuringExecution": [{ - // "labelSelector": { - // "matchExpressions": [{ - // "key": "key2", - // "operator": "In", - // "values": ["value1", "value2"] - // }] - // }, - // "namespaces":["ns"], - // "topologyKey": "zone" - // }] - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAntiAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": [{ - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "Exists" - }] - }, - "topologyKey": "zone", - "namespaces": ["ns"] - }], - "preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "DoesNotExist" - }] - }, - "namespaces": ["ns"], - "topologyKey": "region" - } - }] - }}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - } - for _, pod := range successCases { - if errs := ValidatePod(&pod); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]api.Pod{ - "invalid json of node affinity in pod annotations": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - `, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid node selector requirement in node affinity in pod annotations, operator can't be null": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - "matchExpressions": [{ - "key": "key1", - }] - }] - }}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid preferredSchedulingTerm in node affinity in pod annotations, weight should be in range 1-100": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [ - { - "weight": 199, - "preference": {"matchExpressions": [ - { - "key": "foo", - "operator": "In", - "values": ["bar"] - } - ]} - } - ]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid requiredDuringSchedulingIgnoredDuringExecution node selector, nodeSelectorTerms must have at least one term": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [] - }, - }}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid requiredDuringSchedulingIgnoredDuringExecution node selector term, matchExpressions must have at least one node selector requirement": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"nodeAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": { - "nodeSelectorTerms": [{ - "matchExpressions": [] - }] - }, - }}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid weight in preferredDuringSchedulingIgnoredDuringExecution in pod affinity annotations, weight should be in range 1-100": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 109, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "NotIn", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "region" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid labelSelector in preferredDuringSchedulingIgnoredDuringExecution in podaffinity annotations, values should be empty if the operator is Exists": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "Exists", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "region" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid name space in preferredDuringSchedulingIgnoredDuringExecution in podaffinity annotations, name space shouldbe valid": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "Exists", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["INVALID_NAMESPACE"], - "topologyKey": "region" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid labelOperator in preferredDuringSchedulingIgnoredDuringExecution in podantiaffinity annotations, labelOperator should be proper": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAntiAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "WrongOp", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "region" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid pod affinity, empty topologyKey is not allowed for hard pod affinity": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "In", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid pod anti-affinity, empty topologyKey is not allowed for hard pod anti-affinity": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAntiAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "In", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - "invalid pod anti-affinity, empty topologyKey is not allowed for soft pod affinity": { - ObjectMeta: api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Annotations: map[string]string{ - api.AffinityAnnotationKey: ` - {"podAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{ - "weight": 10, - "podAffinityTerm": - { - "labelSelector": { - "matchExpressions": [{ - "key": "key2", - "operator": "In", - "values": ["value1", "value2"] - }] - }, - "namespaces": ["ns"], - "topologyKey": "" - } - }]}}`, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - }, - } - for k, v := range errorCases { - if errs := ValidatePod(&v); len(errs) == 0 { - t.Errorf("expected failure for %q", k) - } - } -} - -func TestValidatePodUpdate(t *testing.T) { - var ( - activeDeadlineSecondsZero = int64(0) - activeDeadlineSecondsNegative = int64(-30) - activeDeadlineSecondsPositive = int64(30) - activeDeadlineSecondsLarger = int64(31) - - now = unversioned.Now() - grace = int64(30) - grace2 = int64(31) - ) - - tests := []struct { - a api.Pod - b api.Pod - isValid bool - test string - }{ - {api.Pod{}, api.Pod{}, true, "nothing"}, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "bar"}, - }, - false, - "ids", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "bar": "foo", - }, - }, - }, - true, - "labels", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Annotations: map[string]string{ - "foo": "bar", - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Annotations: map[string]string{ - "bar": "foo", - }, - }, - }, - true, - "annotations", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V1", - }, - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V2", - }, - { - Image: "bar:V2", - }, - }, - }, - }, - false, - "more containers", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{Containers: []api.Container{{Image: "foo:V1"}}}, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", DeletionTimestamp: &now}, - Spec: api.PodSpec{Containers: []api.Container{{Image: "foo:V1"}}}, - }, - true, - "deletion timestamp filled out", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &grace}, - Spec: api.PodSpec{Containers: []api.Container{{Image: "foo:V1"}}}, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &grace2}, - Spec: api.PodSpec{Containers: []api.Container{{Image: "foo:V1"}}}, - }, - false, - "deletion grace period seconds cleared", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V1", - }, - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V2", - }, - }, - }, - }, - true, - "image change", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - {}, - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V2", - }, - }, - }, - }, - false, - "image change to empty", - }, - { - api.Pod{ - Spec: api.PodSpec{}, - }, - api.Pod{ - Spec: api.PodSpec{}, - }, - true, - "activeDeadlineSeconds no change, nil", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - true, - "activeDeadlineSeconds no change, set", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - api.Pod{}, - true, - "activeDeadlineSeconds change to positive from nil", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsLarger, - }, - }, - true, - "activeDeadlineSeconds change to smaller positive", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsLarger, - }, - }, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - false, - "activeDeadlineSeconds change to larger positive", - }, - - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsNegative, - }, - }, - api.Pod{}, - false, - "activeDeadlineSeconds change to negative from nil", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsNegative, - }, - }, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - false, - "activeDeadlineSeconds change to negative from positive", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsZero, - }, - }, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - true, - "activeDeadlineSeconds change to zero from positive", - }, - { - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsZero, - }, - }, - api.Pod{}, - true, - "activeDeadlineSeconds change to zero from nil", - }, - { - api.Pod{}, - api.Pod{ - Spec: api.PodSpec{ - ActiveDeadlineSeconds: &activeDeadlineSecondsPositive, - }, - }, - false, - "activeDeadlineSeconds change to nil from positive", - }, - - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V1", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("100m", "0"), - }, - }, - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V2", - Resources: api.ResourceRequirements{ - Limits: getResourceLimits("1000m", "0"), - }, - }, - }, - }, - }, - false, - "cpu change", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V1", - Ports: []api.ContainerPort{ - {HostPort: 8080, ContainerPort: 80}, - }, - }, - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo:V2", - Ports: []api.ContainerPort{ - {HostPort: 8000, ContainerPort: 80}, - }, - }, - }, - }, - }, - false, - "port change", - }, - { - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "Bar": "foo", - }, - }, - }, - true, - "bad label change", - }, - } - - for _, test := range tests { - test.a.ObjectMeta.ResourceVersion = "1" - test.b.ObjectMeta.ResourceVersion = "1" - errs := ValidatePodUpdate(&test.a, &test.b) - if test.isValid { - if len(errs) != 0 { - t.Errorf("unexpected invalid: %s (%+v)\nA: %+v\nB: %+v", test.test, errs, test.a, test.b) - } - } else { - if len(errs) == 0 { - t.Errorf("unexpected valid: %s\nA: %+v\nB: %+v", test.test, test.a, test.b) - } - } - } -} - -func makeValidService() api.Service { - return api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "valid", - Namespace: "valid", - Labels: map[string]string{}, - Annotations: map[string]string{}, - ResourceVersion: "1", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"key": "val"}, - SessionAffinity: "None", - Type: api.ServiceTypeClusterIP, - Ports: []api.ServicePort{{Name: "p", Protocol: "TCP", Port: 8675, TargetPort: intstr.FromInt(8675)}}, - }, - } -} - -func TestValidateService(t *testing.T) { - testCases := []struct { - name string - tweakSvc func(svc *api.Service) // given a basic valid service, each test case can customize it - numErrs int - }{ - { - name: "missing namespace", - tweakSvc: func(s *api.Service) { - s.Namespace = "" - }, - numErrs: 1, - }, - { - name: "invalid namespace", - tweakSvc: func(s *api.Service) { - s.Namespace = "-123" - }, - numErrs: 1, - }, - { - name: "missing name", - tweakSvc: func(s *api.Service) { - s.Name = "" - }, - numErrs: 1, - }, - { - name: "invalid name", - tweakSvc: func(s *api.Service) { - s.Name = "-123" - }, - numErrs: 1, - }, - { - name: "too long name", - tweakSvc: func(s *api.Service) { - s.Name = strings.Repeat("a", 25) - }, - numErrs: 1, - }, - { - name: "invalid generateName", - tweakSvc: func(s *api.Service) { - s.GenerateName = "-123" - }, - numErrs: 1, - }, - { - name: "too long generateName", - tweakSvc: func(s *api.Service) { - s.GenerateName = strings.Repeat("a", 25) - }, - numErrs: 1, - }, - { - name: "invalid label", - tweakSvc: func(s *api.Service) { - s.Labels["NoUppercaseOrSpecialCharsLike=Equals"] = "bar" - }, - numErrs: 1, - }, - { - name: "invalid annotation", - tweakSvc: func(s *api.Service) { - s.Annotations["NoSpecialCharsLike=Equals"] = "bar" - }, - numErrs: 1, - }, - { - name: "nil selector", - tweakSvc: func(s *api.Service) { - s.Spec.Selector = nil - }, - numErrs: 0, - }, - { - name: "invalid selector", - tweakSvc: func(s *api.Service) { - s.Spec.Selector["NoSpecialCharsLike=Equals"] = "bar" - }, - numErrs: 1, - }, - { - name: "missing session affinity", - tweakSvc: func(s *api.Service) { - s.Spec.SessionAffinity = "" - }, - numErrs: 1, - }, - { - name: "missing type", - tweakSvc: func(s *api.Service) { - s.Spec.Type = "" - }, - numErrs: 1, - }, - { - name: "missing ports", - tweakSvc: func(s *api.Service) { - s.Spec.Ports = nil - }, - numErrs: 1, - }, - { - name: "missing ports but headless", - tweakSvc: func(s *api.Service) { - s.Spec.Ports = nil - s.Spec.ClusterIP = api.ClusterIPNone - }, - numErrs: 0, - }, - { - name: "empty port[0] name", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Name = "" - }, - numErrs: 0, - }, - { - name: "empty port[1] name", - tweakSvc: func(s *api.Service) { - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "", Protocol: "TCP", Port: 12345, TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "empty multi-port port[0] name", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Name = "" - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p", Protocol: "TCP", Port: 12345, TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "invalid port name", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Name = "INVALID" - }, - numErrs: 1, - }, - { - name: "missing protocol", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Protocol = "" - }, - numErrs: 1, - }, - { - name: "invalid protocol", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Protocol = "INVALID" - }, - numErrs: 1, - }, - { - name: "invalid cluster ip", - tweakSvc: func(s *api.Service) { - s.Spec.ClusterIP = "invalid" - }, - numErrs: 1, - }, - { - name: "missing port", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Port = 0 - }, - numErrs: 1, - }, - { - name: "invalid port", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Port = 65536 - }, - numErrs: 1, - }, - { - name: "invalid TargetPort int", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].TargetPort = intstr.FromInt(65536) - }, - numErrs: 1, - }, - { - name: "valid port headless", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Port = 11722 - s.Spec.Ports[0].TargetPort = intstr.FromInt(11722) - s.Spec.ClusterIP = api.ClusterIPNone - }, - numErrs: 0, - }, - { - name: "invalid port headless 1", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Port = 11722 - s.Spec.Ports[0].TargetPort = intstr.FromInt(11721) - s.Spec.ClusterIP = api.ClusterIPNone - }, - // in the v1 API, targetPorts on headless services were tolerated. - // once we have version-specific validation, we can reject this on newer API versions, but until then, we have to tolerate it for compatibility. - // numErrs: 1, - numErrs: 0, - }, - { - name: "invalid port headless 2", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Port = 11722 - s.Spec.Ports[0].TargetPort = intstr.FromString("target") - s.Spec.ClusterIP = api.ClusterIPNone - }, - // in the v1 API, targetPorts on headless services were tolerated. - // once we have version-specific validation, we can reject this on newer API versions, but until then, we have to tolerate it for compatibility. - // numErrs: 1, - numErrs: 0, - }, - { - name: "invalid publicIPs localhost", - tweakSvc: func(s *api.Service) { - s.Spec.ExternalIPs = []string{"127.0.0.1"} - }, - numErrs: 1, - }, - { - name: "invalid publicIPs", - tweakSvc: func(s *api.Service) { - s.Spec.ExternalIPs = []string{"0.0.0.0"} - }, - numErrs: 1, - }, - { - name: "invalid publicIPs host", - tweakSvc: func(s *api.Service) { - s.Spec.ExternalIPs = []string{"myhost.mydomain"} - }, - numErrs: 1, - }, - { - name: "dup port name", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Name = "p" - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "valid load balancer protocol UDP 1", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports[0].Protocol = "UDP" - }, - numErrs: 0, - }, - { - name: "valid load balancer protocol UDP 2", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports[0] = api.ServicePort{Name: "q", Port: 12345, Protocol: "UDP", TargetPort: intstr.FromInt(12345)} - }, - numErrs: 0, - }, - { - name: "invalid load balancer with mix protocol", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "UDP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "valid 1", - tweakSvc: func(s *api.Service) { - // do nothing - }, - numErrs: 0, - }, - { - name: "valid 2", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].Protocol = "UDP" - s.Spec.Ports[0].TargetPort = intstr.FromInt(12345) - }, - numErrs: 0, - }, - { - name: "valid 3", - tweakSvc: func(s *api.Service) { - s.Spec.Ports[0].TargetPort = intstr.FromString("http") - }, - numErrs: 0, - }, - { - name: "valid cluster ip - none ", - tweakSvc: func(s *api.Service) { - s.Spec.ClusterIP = "None" - }, - numErrs: 0, - }, - { - name: "valid cluster ip - empty", - tweakSvc: func(s *api.Service) { - s.Spec.ClusterIP = "" - s.Spec.Ports[0].TargetPort = intstr.FromString("http") - }, - numErrs: 0, - }, - { - name: "valid type - cluster", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeClusterIP - }, - numErrs: 0, - }, - { - name: "valid type - loadbalancer", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - }, - numErrs: 0, - }, - { - name: "valid type loadbalancer 2 ports", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "valid external load balancer 2 ports", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "duplicate nodeports", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(1)}) - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(2)}) - }, - numErrs: 1, - }, - { - name: "duplicate nodeports (different protocols)", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(1)}) - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "UDP", NodePort: 1, TargetPort: intstr.FromInt(2)}) - }, - numErrs: 0, - }, - { - name: "valid type - cluster", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeClusterIP - }, - numErrs: 0, - }, - { - name: "valid type - nodeport", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - }, - numErrs: 0, - }, - { - name: "valid type - loadbalancer", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - }, - numErrs: 0, - }, - { - name: "valid type loadbalancer 2 ports", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "valid type loadbalancer with NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", NodePort: 12345, TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "valid type=NodePort service with NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", NodePort: 12345, TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "valid type=NodePort service without NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "valid cluster service without NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeClusterIP - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - name: "invalid cluster service with NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeClusterIP - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", NodePort: 12345, TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "invalid public service with duplicate NodePort", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeNodePort - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p1", Port: 1, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(1)}) - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p2", Port: 2, Protocol: "TCP", NodePort: 1, TargetPort: intstr.FromInt(2)}) - }, - numErrs: 1, - }, - { - name: "valid type=LoadBalancer", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 12345, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 0, - }, - { - // For now we open firewalls, and its insecure if we open 10250, remove this - // when we have better protections in place. - name: "invalid port type=LoadBalancer", - tweakSvc: func(s *api.Service) { - s.Spec.Type = api.ServiceTypeLoadBalancer - s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "kubelet", Port: 10250, Protocol: "TCP", TargetPort: intstr.FromInt(12345)}) - }, - numErrs: 1, - }, - { - name: "valid LoadBalancer source range annotation", - tweakSvc: func(s *api.Service) { - s.Annotations[service.AnnotationLoadBalancerSourceRangesKey] = "1.2.3.4/8, 5.6.7.8/16" - }, - numErrs: 0, - }, - { - name: "empty LoadBalancer source range annotation", - tweakSvc: func(s *api.Service) { - s.Annotations[service.AnnotationLoadBalancerSourceRangesKey] = "" - }, - numErrs: 0, - }, - { - name: "invalid LoadBalancer source range annotation (hostname)", - tweakSvc: func(s *api.Service) { - s.Annotations[service.AnnotationLoadBalancerSourceRangesKey] = "foo.bar" - }, - numErrs: 1, - }, - { - name: "invalid LoadBalancer source range annotation (invalid CIDR)", - tweakSvc: func(s *api.Service) { - s.Annotations[service.AnnotationLoadBalancerSourceRangesKey] = "1.2.3.4/33" - }, - numErrs: 1, - }, - } - - for _, tc := range testCases { - svc := makeValidService() - tc.tweakSvc(&svc) - errs := ValidateService(&svc) - if len(errs) != tc.numErrs { - t.Errorf("Unexpected error list for case %q: %v", tc.name, errs.ToAggregate()) - } - } -} - -func TestValidateReplicationControllerStatusUpdate(t *testing.T) { - validSelector := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - type rcUpdateTest struct { - old api.ReplicationController - update api.ReplicationController - } - successCases := []rcUpdateTest{ - { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 2, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 3, - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 4, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateReplicationControllerStatusUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]rcUpdateTest{ - "negative replicas": { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 3, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - Status: api.ReplicationControllerStatus{ - Replicas: -3, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidateReplicationControllerStatusUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } - -} - -func TestValidateReplicationControllerUpdate(t *testing.T) { - validSelector := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - }, - }, - } - invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidSelector, - }, - }, - } - type rcUpdateTest struct { - old api.ReplicationController - update api.ReplicationController - } - successCases := []rcUpdateTest{ - { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 3, - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - }, - { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: validSelector, - Template: &readWriteVolumePodTemplate.Template, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateReplicationControllerUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]rcUpdateTest{ - "more than one read/write": { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Selector: validSelector, - Template: &readWriteVolumePodTemplate.Template, - }, - }, - }, - "invalid selector": { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Selector: invalidSelector, - Template: &validPodTemplate.Template, - }, - }, - }, - "invalid pod": { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Selector: validSelector, - Template: &invalidPodTemplate.Template, - }, - }, - }, - "negative replicas": { - old: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - update: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: -1, - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidateReplicationControllerUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} - -func TestValidateReplicationController(t *testing.T) { - validSelector := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidSelector, - }, - }, - } - successCases := []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: validSelector, - Template: &readWriteVolumePodTemplate.Template, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateReplicationController(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]api.ReplicationController{ - "zero-length ID": { - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - "missing-namespace": { - ObjectMeta: api.ObjectMeta{Name: "abc-123"}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - "empty selector": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Template: &validPodTemplate.Template, - }, - }, - "selector_doesnt_match": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "bar"}, - Template: &validPodTemplate.Template, - }, - }, - "invalid manifest": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - }, - }, - "read-write persistent disk with > 1 pod": { - ObjectMeta: api.ObjectMeta{Name: "abc"}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Selector: validSelector, - Template: &readWriteVolumePodTemplate.Template, - }, - }, - "negative_replicas": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: api.ReplicationControllerSpec{ - Replicas: -1, - Selector: validSelector, - }, - }, - "invalid_label": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - "invalid_label 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: api.ReplicationControllerSpec{ - Template: &invalidPodTemplate.Template, - }, - }, - "invalid_annotation": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &validPodTemplate.Template, - }, - }, - "invalid restart policy 1": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - }, - }, - }, - "invalid restart policy 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: api.ReplicationControllerSpec{ - Selector: validSelector, - Template: &api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - }, - }, - }, - } - for k, v := range errorCases { - errs := ValidateReplicationController(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - field := errs[i].Field - if !strings.HasPrefix(field, "spec.template.") && - field != "metadata.name" && - field != "metadata.namespace" && - field != "spec.selector" && - field != "spec.template" && - field != "GCEPersistentDisk.ReadOnly" && - field != "spec.replicas" && - field != "spec.template.labels" && - field != "metadata.annotations" && - field != "metadata.labels" && - field != "status.replicas" { - t.Errorf("%s: missing prefix for: %v", k, errs[i]) - } - } - } -} - -func TestValidateNode(t *testing.T) { - validSelector := map[string]string{"a": "b"} - invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - successCases := []api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Labels: validSelector, - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{ - {Type: api.NodeLegacyHostIP, Address: "something"}, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - api.ResourceName("my.org/gpu"): resource.MustParse("10"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "external", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{ - {Type: api.NodeLegacyHostIP, Address: "something"}, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("0"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "external", - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateNode(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]api.Node{ - "zero-length Name": { - ObjectMeta: api.ObjectMeta{ - Name: "", - Labels: validSelector, - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "external", - }, - }, - "invalid-labels": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Labels: invalidSelector, - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "external", - }, - }, - "missing-external-id": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Labels: validSelector, - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - }, - } - for k, v := range errorCases { - errs := ValidateNode(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - field := errs[i].Field - expectedFields := map[string]bool{ - "metadata.name": true, - "metadata.labels": true, - "metadata.annotations": true, - "metadata.namespace": true, - "spec.externalID": true, - } - if expectedFields[field] == false { - t.Errorf("%s: missing prefix for: %v", k, errs[i]) - } - } - } -} - -func TestValidateNodeUpdate(t *testing.T) { - tests := []struct { - oldNode api.Node - node api.Node - valid bool - }{ - {api.Node{}, api.Node{}, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}}, - api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "bar"}, - }, false}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar"}, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"bar": "foo"}, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - PodCIDR: "", - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - PodCIDR: "192.168.0.0/16", - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - PodCIDR: "192.123.0.0/16", - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - PodCIDR: "192.168.0.0/16", - }, - }, false}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("10000"), - api.ResourceMemory: resource.MustParse("100"), - }, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - }, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"bar": "foo"}, - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("10000"), - api.ResourceMemory: resource.MustParse("100"), - }, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"bar": "fooobaz"}, - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - }, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"bar": "foo"}, - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{ - {Type: api.NodeLegacyHostIP, Address: "1.2.3.4"}, - }, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"bar": "fooobaz"}, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "baz"}, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"Foo": "baz"}, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - Unschedulable: false, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - Unschedulable: true, - }, - }, true}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - Unschedulable: false, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{ - {Type: api.NodeExternalIP, Address: "1.1.1.1"}, - {Type: api.NodeExternalIP, Address: "1.1.1.1"}, - }, - }, - }, false}, - {api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - Unschedulable: false, - }, - }, api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Status: api.NodeStatus{ - Addresses: []api.NodeAddress{ - {Type: api.NodeExternalIP, Address: "1.1.1.1"}, - {Type: api.NodeInternalIP, Address: "10.1.1.1"}, - }, - }, - }, true}, - } - for i, test := range tests { - test.oldNode.ObjectMeta.ResourceVersion = "1" - test.node.ObjectMeta.ResourceVersion = "1" - errs := ValidateNodeUpdate(&test.node, &test.oldNode) - if test.valid && len(errs) > 0 { - t.Errorf("%d: Unexpected error: %v", i, errs) - t.Logf("%#v vs %#v", test.oldNode.ObjectMeta, test.node.ObjectMeta) - } - if !test.valid && len(errs) == 0 { - t.Errorf("%d: Unexpected non-error", i) - } - } -} - -func TestValidateServiceUpdate(t *testing.T) { - testCases := []struct { - name string - tweakSvc func(oldSvc, newSvc *api.Service) // given basic valid services, each test case can customize them - numErrs int - }{ - { - name: "no change", - tweakSvc: func(oldSvc, newSvc *api.Service) { - // do nothing - }, - numErrs: 0, - }, - { - name: "change name", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Name += "2" - }, - numErrs: 1, - }, - { - name: "change namespace", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Namespace += "2" - }, - numErrs: 1, - }, - { - name: "change label valid", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Labels["key"] = "other-value" - }, - numErrs: 0, - }, - { - name: "add label", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Labels["key2"] = "value2" - }, - numErrs: 0, - }, - { - name: "change cluster IP", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Spec.ClusterIP = "1.2.3.4" - newSvc.Spec.ClusterIP = "8.6.7.5" - }, - numErrs: 1, - }, - { - name: "remove cluster IP", - tweakSvc: func(oldSvc, newSvc *api.Service) { - oldSvc.Spec.ClusterIP = "1.2.3.4" - newSvc.Spec.ClusterIP = "" - }, - numErrs: 1, - }, - { - name: "change affinity", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Spec.SessionAffinity = "ClientIP" - }, - numErrs: 0, - }, - { - name: "remove affinity", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Spec.SessionAffinity = "" - }, - numErrs: 1, - }, - { - name: "change type", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Spec.Type = api.ServiceTypeLoadBalancer - }, - numErrs: 0, - }, - { - name: "remove type", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Spec.Type = "" - }, - numErrs: 1, - }, - { - name: "change type -> nodeport", - tweakSvc: func(oldSvc, newSvc *api.Service) { - newSvc.Spec.Type = api.ServiceTypeNodePort - }, - numErrs: 0, - }, - } - - for _, tc := range testCases { - oldSvc := makeValidService() - newSvc := makeValidService() - tc.tweakSvc(&oldSvc, &newSvc) - errs := ValidateServiceUpdate(&newSvc, &oldSvc) - if len(errs) != tc.numErrs { - t.Errorf("Unexpected error list for case %q: %v", tc.name, errs.ToAggregate()) - } - } -} - -func TestValidateResourceNames(t *testing.T) { - table := []struct { - input string - success bool - }{ - {"memory", true}, - {"cpu", true}, - {"network", false}, - {"disk", false}, - {"", false}, - {".", false}, - {"..", false}, - {"my.favorite.app.co/12345", true}, - {"my.favorite.app.co/_12345", false}, - {"my.favorite.app.co/12345_", false}, - {"kubernetes.io/..", false}, - {"kubernetes.io/" + strings.Repeat("a", 63), true}, - {"kubernetes.io/" + strings.Repeat("a", 64), false}, - {"kubernetes.io//", false}, - {"kubernetes.io", false}, - {"kubernetes.io/will/not/work/", false}, - } - for k, item := range table { - err := validateResourceName(item.input, field.NewPath("field")) - if len(err) != 0 && item.success { - t.Errorf("expected no failure for input %q", item.input) - } else if len(err) == 0 && !item.success { - t.Errorf("expected failure for input %q", item.input) - for i := range err { - detail := err[i].Detail - if detail != "" && detail != qualifiedNameErrorMsg { - t.Errorf("%d: expected error detail either empty or %s, got %s", k, qualifiedNameErrorMsg, detail) - } - } - } - } -} - -func getResourceList(cpu, memory string) api.ResourceList { - res := api.ResourceList{} - if cpu != "" { - res[api.ResourceCPU] = resource.MustParse(cpu) - } - if memory != "" { - res[api.ResourceMemory] = resource.MustParse(memory) - } - return res -} - -func getStorageResourceList(storage string) api.ResourceList { - res := api.ResourceList{} - if storage != "" { - res[api.ResourceStorage] = resource.MustParse(storage) - } - return res -} - -func TestValidateLimitRange(t *testing.T) { - successCases := []struct { - name string - spec api.LimitRangeSpec - }{ - { - name: "all-fields-valid", - spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: getResourceList("100m", "10000Mi"), - Min: getResourceList("5m", "100Mi"), - MaxLimitRequestRatio: getResourceList("10", ""), - }, - { - Type: api.LimitTypeContainer, - Max: getResourceList("100m", "10000Mi"), - Min: getResourceList("5m", "100Mi"), - Default: getResourceList("50m", "500Mi"), - DefaultRequest: getResourceList("10m", "200Mi"), - MaxLimitRequestRatio: getResourceList("10", ""), - }, - }, - }, - }, - { - name: "all-fields-valid-big-numbers", - spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypeContainer, - Max: getResourceList("100m", "10000T"), - Min: getResourceList("5m", "100Mi"), - Default: getResourceList("50m", "500Mi"), - DefaultRequest: getResourceList("10m", "200Mi"), - MaxLimitRequestRatio: getResourceList("10", ""), - }, - }, - }, - }, - { - name: "thirdparty-fields-all-valid-standard-container-resources", - spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: "thirdparty.com/foo", - Max: getResourceList("100m", "10000T"), - Min: getResourceList("5m", "100Mi"), - Default: getResourceList("50m", "500Mi"), - DefaultRequest: getResourceList("10m", "200Mi"), - MaxLimitRequestRatio: getResourceList("10", ""), - }, - }, - }, - }, - { - name: "thirdparty-fields-all-valid-storage-resources", - spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: "thirdparty.com/foo", - Max: getStorageResourceList("10000T"), - Min: getStorageResourceList("100Mi"), - Default: getStorageResourceList("500Mi"), - DefaultRequest: getStorageResourceList("200Mi"), - MaxLimitRequestRatio: getStorageResourceList(""), - }, - }, - }, - }, - } - - for _, successCase := range successCases { - limitRange := &api.LimitRange{ObjectMeta: api.ObjectMeta{Name: successCase.name, Namespace: "foo"}, Spec: successCase.spec} - if errs := ValidateLimitRange(limitRange); len(errs) != 0 { - t.Errorf("Case %v, unexpected error: %v", successCase.name, errs) - } - } - - errorCases := map[string]struct { - R api.LimitRange - D string - }{ - "zero-length-name": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "", Namespace: "foo"}, Spec: api.LimitRangeSpec{}}, - "name or generateName is required", - }, - "zero-length-namespace": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: ""}, Spec: api.LimitRangeSpec{}}, - "", - }, - "invalid-name": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "^Invalid", Namespace: "foo"}, Spec: api.LimitRangeSpec{}}, - DNSSubdomainErrorMsg, - }, - "invalid-namespace": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "^Invalid"}, Spec: api.LimitRangeSpec{}}, - DNS1123LabelErrorMsg, - }, - "duplicate-limit-type": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: getResourceList("100m", "10000m"), - Min: getResourceList("0m", "100m"), - }, - { - Type: api.LimitTypePod, - Min: getResourceList("0m", "100m"), - }, - }, - }}, - "", - }, - "default-limit-type-pod": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: getResourceList("100m", "10000m"), - Min: getResourceList("0m", "100m"), - Default: getResourceList("10m", "100m"), - }, - }, - }}, - "may not be specified when `type` is 'Pod'", - }, - "default-request-limit-type-pod": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: getResourceList("100m", "10000m"), - Min: getResourceList("0m", "100m"), - DefaultRequest: getResourceList("10m", "100m"), - }, - }, - }}, - "may not be specified when `type` is 'Pod'", - }, - "min value 100m is greater than max value 10m": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: getResourceList("10m", ""), - Min: getResourceList("100m", ""), - }, - }, - }}, - "min value 100m is greater than max value 10m", - }, - "invalid spec default outside range": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypeContainer, - Max: getResourceList("1", ""), - Min: getResourceList("100m", ""), - Default: getResourceList("2000m", ""), - }, - }, - }}, - "default value 2 is greater than max value 1", - }, - "invalid spec defaultrequest outside range": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypeContainer, - Max: getResourceList("1", ""), - Min: getResourceList("100m", ""), - DefaultRequest: getResourceList("2000m", ""), - }, - }, - }}, - "default request value 2 is greater than max value 1", - }, - "invalid spec defaultrequest more than default": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypeContainer, - Max: getResourceList("2", ""), - Min: getResourceList("100m", ""), - Default: getResourceList("500m", ""), - DefaultRequest: getResourceList("800m", ""), - }, - }, - }}, - "default request value 800m is greater than default limit value 500m", - }, - "invalid spec maxLimitRequestRatio less than 1": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - MaxLimitRequestRatio: getResourceList("800m", ""), - }, - }, - }}, - "ratio 800m is less than 1", - }, - "invalid spec maxLimitRequestRatio greater than max/min": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypeContainer, - Max: getResourceList("", "2Gi"), - Min: getResourceList("", "512Mi"), - MaxLimitRequestRatio: getResourceList("", "10"), - }, - }, - }}, - "ratio 10 is greater than max/min = 4.000000", - }, - "invalid non standard limit type": { - api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: "foo", - Max: getStorageResourceList("10000T"), - Min: getStorageResourceList("100Mi"), - Default: getStorageResourceList("500Mi"), - DefaultRequest: getStorageResourceList("200Mi"), - MaxLimitRequestRatio: getStorageResourceList(""), - }, - }, - }}, - "must be a standard limit type or fully qualified", - }, - } - - for k, v := range errorCases { - errs := ValidateLimitRange(&v.R) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - detail := errs[i].Detail - if detail != v.D { - t.Errorf("[%s]: expected error detail either empty or %q, got %q", k, v.D, detail) - } - } - } - -} - -func TestValidateResourceQuota(t *testing.T) { - spec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - api.ResourceRequestsCPU: resource.MustParse("100"), - api.ResourceRequestsMemory: resource.MustParse("10000"), - api.ResourceLimitsCPU: resource.MustParse("100"), - api.ResourceLimitsMemory: resource.MustParse("10000"), - api.ResourcePods: resource.MustParse("10"), - api.ResourceServices: resource.MustParse("0"), - api.ResourceReplicationControllers: resource.MustParse("10"), - api.ResourceQuotas: resource.MustParse("10"), - api.ResourceConfigMaps: resource.MustParse("10"), - api.ResourceSecrets: resource.MustParse("10"), - }, - } - - terminatingSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceLimitsCPU: resource.MustParse("200"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeTerminating}, - } - - nonTerminatingSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeNotTerminating}, - } - - bestEffortSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourcePods: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeBestEffort}, - } - - nonBestEffortSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeNotBestEffort}, - } - - // storage is not yet supported as a quota tracked resource - invalidQuotaResourceSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceStorage: resource.MustParse("10"), - }, - } - - negativeSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("-100"), - api.ResourceMemory: resource.MustParse("-10000"), - api.ResourcePods: resource.MustParse("-10"), - api.ResourceServices: resource.MustParse("-10"), - api.ResourceReplicationControllers: resource.MustParse("-10"), - api.ResourceQuotas: resource.MustParse("-10"), - api.ResourceConfigMaps: resource.MustParse("-10"), - api.ResourceSecrets: resource.MustParse("-10"), - }, - } - - fractionalComputeSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - }, - } - - fractionalPodSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourcePods: resource.MustParse(".1"), - api.ResourceServices: resource.MustParse(".5"), - api.ResourceReplicationControllers: resource.MustParse("1.25"), - api.ResourceQuotas: resource.MustParse("2.5"), - }, - } - - invalidTerminatingScopePairsSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeTerminating, api.ResourceQuotaScopeNotTerminating}, - } - - invalidBestEffortScopePairsSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourcePods: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScopeBestEffort, api.ResourceQuotaScopeNotBestEffort}, - } - - invalidScopeNameSpec := api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - }, - Scopes: []api.ResourceQuotaScope{api.ResourceQuotaScope("foo")}, - } - - successCases := []api.ResourceQuota{ - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: spec, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: fractionalComputeSpec, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: terminatingSpec, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: nonTerminatingSpec, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: bestEffortSpec, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: nonBestEffortSpec, - }, - } - - for _, successCase := range successCases { - if errs := ValidateResourceQuota(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]struct { - R api.ResourceQuota - D string - }{ - "zero-length Name": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "", Namespace: "foo"}, Spec: spec}, - "name or generateName is required", - }, - "zero-length Namespace": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: ""}, Spec: spec}, - "", - }, - "invalid Name": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "^Invalid", Namespace: "foo"}, Spec: spec}, - DNSSubdomainErrorMsg, - }, - "invalid Namespace": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "^Invalid"}, Spec: spec}, - DNS1123LabelErrorMsg, - }, - "negative-limits": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: negativeSpec}, - isNegativeErrorMsg, - }, - "fractional-api-resource": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: fractionalPodSpec}, - isNotIntegerErrorMsg, - }, - "invalid-quota-resource": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidQuotaResourceSpec}, - isInvalidQuotaResource, - }, - "invalid-quota-terminating-pair": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidTerminatingScopePairsSpec}, - "conflicting scopes", - }, - "invalid-quota-besteffort-pair": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidBestEffortScopePairsSpec}, - "conflicting scopes", - }, - "invalid-quota-scope-name": { - api.ResourceQuota{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidScopeNameSpec}, - "unsupported scope", - }, - } - for k, v := range errorCases { - errs := ValidateResourceQuota(&v.R) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - if errs[i].Detail != v.D { - t.Errorf("[%s]: expected error detail either empty or %s, got %s", k, v.D, errs[i].Detail) - } - } - } -} - -func TestValidateNamespace(t *testing.T) { - validLabels := map[string]string{"a": "b"} - invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - successCases := []api.Namespace{ - { - ObjectMeta: api.ObjectMeta{Name: "abc", Labels: validLabels}, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"example.com/something", "example.com/other"}, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateNamespace(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]struct { - R api.Namespace - D string - }{ - "zero-length name": { - api.Namespace{ObjectMeta: api.ObjectMeta{Name: ""}}, - "", - }, - "defined-namespace": { - api.Namespace{ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: "makesnosense"}}, - "", - }, - "invalid-labels": { - api.Namespace{ObjectMeta: api.ObjectMeta{Name: "abc", Labels: invalidLabels}}, - "", - }, - } - for k, v := range errorCases { - errs := ValidateNamespace(&v.R) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - } -} - -func TestValidateNamespaceFinalizeUpdate(t *testing.T) { - tests := []struct { - oldNamespace api.Namespace - namespace api.Namespace - valid bool - }{ - {api.Namespace{}, api.Namespace{}, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"Foo"}, - }, - }, false}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"foo.com/bar"}, - }, - }, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"foo.com/bar", "what.com/bar"}, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "fooemptyfinalizer"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"foo.com/bar"}, - }, - }, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "fooemptyfinalizer"}, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"", "foo.com/bar", "what.com/bar"}, - }, - }, false}, - } - for i, test := range tests { - test.namespace.ObjectMeta.ResourceVersion = "1" - test.oldNamespace.ObjectMeta.ResourceVersion = "1" - errs := ValidateNamespaceFinalizeUpdate(&test.namespace, &test.oldNamespace) - if test.valid && len(errs) > 0 { - t.Errorf("%d: Unexpected error: %v", i, errs) - t.Logf("%#v vs %#v", test.oldNamespace, test.namespace) - } - if !test.valid && len(errs) == 0 { - t.Errorf("%d: Unexpected non-error", i) - } - } -} - -func TestValidateNamespaceStatusUpdate(t *testing.T) { - now := unversioned.Now() - - tests := []struct { - oldNamespace api.Namespace - namespace api.Namespace - valid bool - }{ - {api.Namespace{}, api.Namespace{ - Status: api.NamespaceStatus{ - Phase: api.NamespaceActive, - }, - }, true}, - // Cannot set deletionTimestamp via status update - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - DeletionTimestamp: &now}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - }, false}, - // Can update phase via status update - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - DeletionTimestamp: &now}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - DeletionTimestamp: &now}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - }, false}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo"}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "bar"}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - }, false}, - } - for i, test := range tests { - test.namespace.ObjectMeta.ResourceVersion = "1" - test.oldNamespace.ObjectMeta.ResourceVersion = "1" - errs := ValidateNamespaceStatusUpdate(&test.namespace, &test.oldNamespace) - if test.valid && len(errs) > 0 { - t.Errorf("%d: Unexpected error: %v", i, errs) - t.Logf("%#v vs %#v", test.oldNamespace.ObjectMeta, test.namespace.ObjectMeta) - } - if !test.valid && len(errs) == 0 { - t.Errorf("%d: Unexpected non-error", i) - } - } -} - -func TestValidateNamespaceUpdate(t *testing.T) { - tests := []struct { - oldNamespace api.Namespace - namespace api.Namespace - valid bool - }{ - {api.Namespace{}, api.Namespace{}, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo1"}}, - api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "bar1"}, - }, false}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo2", - Labels: map[string]string{"foo": "bar"}, - }, - }, api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo2", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo3", - }, - }, api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo3", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo4", - Labels: map[string]string{"bar": "foo"}, - }, - }, api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo4", - Labels: map[string]string{"foo": "baz"}, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo5", - Labels: map[string]string{"foo": "baz"}, - }, - }, api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo5", - Labels: map[string]string{"Foo": "baz"}, - }, - }, true}, - {api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo6", - Labels: map[string]string{"foo": "baz"}, - }, - }, api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo6", - Labels: map[string]string{"Foo": "baz"}, - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"kubernetes"}, - }, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - }, true}, - } - for i, test := range tests { - test.namespace.ObjectMeta.ResourceVersion = "1" - test.oldNamespace.ObjectMeta.ResourceVersion = "1" - errs := ValidateNamespaceUpdate(&test.namespace, &test.oldNamespace) - if test.valid && len(errs) > 0 { - t.Errorf("%d: Unexpected error: %v", i, errs) - t.Logf("%#v vs %#v", test.oldNamespace.ObjectMeta, test.namespace.ObjectMeta) - } - if !test.valid && len(errs) == 0 { - t.Errorf("%d: Unexpected non-error", i) - } - } -} - -func TestValidateSecret(t *testing.T) { - // Opaque secret validation - validSecret := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, - Data: map[string][]byte{ - "data-1": []byte("bar"), - }, - } - } - - var ( - emptyName = validSecret() - invalidName = validSecret() - emptyNs = validSecret() - invalidNs = validSecret() - overMaxSize = validSecret() - invalidKey = validSecret() - leadingDotKey = validSecret() - dotKey = validSecret() - doubleDotKey = validSecret() - ) - - emptyName.Name = "" - invalidName.Name = "NoUppercaseOrSpecialCharsLike=Equals" - emptyNs.Namespace = "" - invalidNs.Namespace = "NoUppercaseOrSpecialCharsLike=Equals" - overMaxSize.Data = map[string][]byte{ - "over": make([]byte, api.MaxSecretSize+1), - } - invalidKey.Data["a..b"] = []byte("whoops") - leadingDotKey.Data[".key"] = []byte("bar") - dotKey.Data["."] = []byte("bar") - doubleDotKey.Data[".."] = []byte("bar") - - // kubernetes.io/service-account-token secret validation - validServiceAccountTokenSecret := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "bar", - Annotations: map[string]string{ - api.ServiceAccountNameKey: "foo", - }, - }, - Type: api.SecretTypeServiceAccountToken, - Data: map[string][]byte{ - "data-1": []byte("bar"), - }, - } - } - - var ( - emptyTokenAnnotation = validServiceAccountTokenSecret() - missingTokenAnnotation = validServiceAccountTokenSecret() - missingTokenAnnotations = validServiceAccountTokenSecret() - ) - emptyTokenAnnotation.Annotations[api.ServiceAccountNameKey] = "" - delete(missingTokenAnnotation.Annotations, api.ServiceAccountNameKey) - missingTokenAnnotations.Annotations = nil - - tests := map[string]struct { - secret api.Secret - valid bool - }{ - "valid": {validSecret(), true}, - "empty name": {emptyName, false}, - "invalid name": {invalidName, false}, - "empty namespace": {emptyNs, false}, - "invalid namespace": {invalidNs, false}, - "over max size": {overMaxSize, false}, - "invalid key": {invalidKey, false}, - "valid service-account-token secret": {validServiceAccountTokenSecret(), true}, - "empty service-account-token annotation": {emptyTokenAnnotation, false}, - "missing service-account-token annotation": {missingTokenAnnotation, false}, - "missing service-account-token annotations": {missingTokenAnnotations, false}, - "leading dot key": {leadingDotKey, true}, - "dot key": {dotKey, false}, - "double dot key": {doubleDotKey, false}, - } - - for name, tc := range tests { - errs := ValidateSecret(&tc.secret) - if tc.valid && len(errs) > 0 { - t.Errorf("%v: Unexpected error: %v", name, errs) - } - if !tc.valid && len(errs) == 0 { - t.Errorf("%v: Unexpected non-error", name) - } - } -} - -func TestValidateDockerConfigSecret(t *testing.T) { - validDockerSecret := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, - Type: api.SecretTypeDockercfg, - Data: map[string][]byte{ - api.DockerConfigKey: []byte(`{"https://index.docker.io/v1/": {"auth": "Y2x1ZWRyb29sZXIwMDAxOnBhc3N3b3Jk","email": "fake@example.com"}}`), - }, - } - } - validDockerSecret2 := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, - Type: api.SecretTypeDockerConfigJson, - Data: map[string][]byte{ - api.DockerConfigJsonKey: []byte(`{"auths":{"https://index.docker.io/v1/": {"auth": "Y2x1ZWRyb29sZXIwMDAxOnBhc3N3b3Jk","email": "fake@example.com"}}}`), - }, - } - } - - var ( - missingDockerConfigKey = validDockerSecret() - emptyDockerConfigKey = validDockerSecret() - invalidDockerConfigKey = validDockerSecret() - missingDockerConfigKey2 = validDockerSecret2() - emptyDockerConfigKey2 = validDockerSecret2() - invalidDockerConfigKey2 = validDockerSecret2() - ) - - delete(missingDockerConfigKey.Data, api.DockerConfigKey) - emptyDockerConfigKey.Data[api.DockerConfigKey] = []byte("") - invalidDockerConfigKey.Data[api.DockerConfigKey] = []byte("bad") - delete(missingDockerConfigKey2.Data, api.DockerConfigJsonKey) - emptyDockerConfigKey2.Data[api.DockerConfigJsonKey] = []byte("") - invalidDockerConfigKey2.Data[api.DockerConfigJsonKey] = []byte("bad") - - tests := map[string]struct { - secret api.Secret - valid bool - }{ - "valid dockercfg": {validDockerSecret(), true}, - "missing dockercfg": {missingDockerConfigKey, false}, - "empty dockercfg": {emptyDockerConfigKey, false}, - "invalid dockercfg": {invalidDockerConfigKey, false}, - "valid config.json": {validDockerSecret2(), true}, - "missing config.json": {missingDockerConfigKey2, false}, - "empty config.json": {emptyDockerConfigKey2, false}, - "invalid config.json": {invalidDockerConfigKey2, false}, - } - - for name, tc := range tests { - errs := ValidateSecret(&tc.secret) - if tc.valid && len(errs) > 0 { - t.Errorf("%v: Unexpected error: %v", name, errs) - } - if !tc.valid && len(errs) == 0 { - t.Errorf("%v: Unexpected non-error", name) - } - } -} - -func TestValidateBasicAuthSecret(t *testing.T) { - validBasicAuthSecret := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, - Type: api.SecretTypeBasicAuth, - Data: map[string][]byte{ - api.BasicAuthUsernameKey: []byte("username"), - api.BasicAuthPasswordKey: []byte("password"), - }, - } - } - - var ( - missingBasicAuthUsernamePasswordKeys = validBasicAuthSecret() - // invalidBasicAuthUsernamePasswordKey = validBasicAuthSecret() - // emptyBasicAuthUsernameKey = validBasicAuthSecret() - // emptyBasicAuthPasswordKey = validBasicAuthSecret() - ) - - delete(missingBasicAuthUsernamePasswordKeys.Data, api.BasicAuthUsernameKey) - delete(missingBasicAuthUsernamePasswordKeys.Data, api.BasicAuthPasswordKey) - - // invalidBasicAuthUsernamePasswordKey.Data[api.BasicAuthUsernameKey] = []byte("bad") - // invalidBasicAuthUsernamePasswordKey.Data[api.BasicAuthPasswordKey] = []byte("bad") - - // emptyBasicAuthUsernameKey.Data[api.BasicAuthUsernameKey] = []byte("") - // emptyBasicAuthPasswordKey.Data[api.BasicAuthPasswordKey] = []byte("") - - tests := map[string]struct { - secret api.Secret - valid bool - }{ - "valid": {validBasicAuthSecret(), true}, - "missing username and password": {missingBasicAuthUsernamePasswordKeys, false}, - // "invalid username and password": {invalidBasicAuthUsernamePasswordKey, false}, - // "empty username": {emptyBasicAuthUsernameKey, false}, - // "empty password": {emptyBasicAuthPasswordKey, false}, - } - - for name, tc := range tests { - errs := ValidateSecret(&tc.secret) - if tc.valid && len(errs) > 0 { - t.Errorf("%v: Unexpected error: %v", name, errs) - } - if !tc.valid && len(errs) == 0 { - t.Errorf("%v: Unexpected non-error", name) - } - } -} - -func TestValidateSSHAuthSecret(t *testing.T) { - validSSHAuthSecret := func() api.Secret { - return api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, - Type: api.SecretTypeSSHAuth, - Data: map[string][]byte{ - api.SSHAuthPrivateKey: []byte("foo-bar-baz"), - }, - } - } - - missingSSHAuthPrivateKey := validSSHAuthSecret() - - delete(missingSSHAuthPrivateKey.Data, api.SSHAuthPrivateKey) - - tests := map[string]struct { - secret api.Secret - valid bool - }{ - "valid": {validSSHAuthSecret(), true}, - "missing private key": {missingSSHAuthPrivateKey, false}, - } - - for name, tc := range tests { - errs := ValidateSecret(&tc.secret) - if tc.valid && len(errs) > 0 { - t.Errorf("%v: Unexpected error: %v", name, errs) - } - if !tc.valid && len(errs) == 0 { - t.Errorf("%v: Unexpected non-error", name) - } - } -} - -func TestValidateEndpoints(t *testing.T) { - successCases := map[string]api.Endpoints{ - "simple endpoint": { - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}, {IP: "10.10.2.2"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 8675, Protocol: "TCP"}, {Name: "b", Port: 309, Protocol: "TCP"}}, - }, - { - Addresses: []api.EndpointAddress{{IP: "10.10.3.3"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 93, Protocol: "TCP"}, {Name: "b", Port: 76, Protocol: "TCP"}}, - }, - }, - }, - "empty subsets": { - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - }, - "no name required for singleton port": { - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Port: 8675, Protocol: "TCP"}}, - }, - }, - }, - } - - for k, v := range successCases { - if errs := ValidateEndpoints(&v); len(errs) != 0 { - t.Errorf("Expected success for %s, got %v", k, errs) - } - } - - errorCases := map[string]struct { - endpoints api.Endpoints - errorType field.ErrorType - errorDetail string - }{ - "missing namespace": { - endpoints: api.Endpoints{ObjectMeta: api.ObjectMeta{Name: "mysvc"}}, - errorType: "FieldValueRequired", - }, - "missing name": { - endpoints: api.Endpoints{ObjectMeta: api.ObjectMeta{Namespace: "namespace"}}, - errorType: "FieldValueRequired", - }, - "invalid namespace": { - endpoints: api.Endpoints{ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "no@#invalid.;chars\"allowed"}}, - errorType: "FieldValueInvalid", - errorDetail: DNS1123LabelErrorMsg, - }, - "invalid name": { - endpoints: api.Endpoints{ObjectMeta: api.ObjectMeta{Name: "-_Invliad^&Characters", Namespace: "namespace"}}, - errorType: "FieldValueInvalid", - errorDetail: DNSSubdomainErrorMsg, - }, - "empty addresses": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Ports: []api.EndpointPort{{Name: "a", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueRequired", - }, - "empty ports": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.3.3"}}, - }, - }, - }, - errorType: "FieldValueRequired", - }, - "invalid IP": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "[2001:0db8:85a3:0042:1000:8a2e:0370:7334]"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: "must be a valid IP address", - }, - "Multiple ports, one without name": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Port: 8675, Protocol: "TCP"}, {Name: "b", Port: 309, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueRequired", - }, - "Invalid port number": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 66000, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: PortRangeErrorMsg, - }, - "Invalid protocol": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 93, Protocol: "Protocol"}}, - }, - }, - }, - errorType: "FieldValueNotSupported", - }, - "Address missing IP": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{}}, - Ports: []api.EndpointPort{{Name: "a", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: "must be a valid IP address", - }, - "Port missing number": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Name: "a", Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: PortRangeErrorMsg, - }, - "Port missing protocol": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "10.10.1.1"}}, - Ports: []api.EndpointPort{{Name: "a", Port: 93}}, - }, - }, - }, - errorType: "FieldValueRequired", - }, - "Address is loopback": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "127.0.0.1"}}, - Ports: []api.EndpointPort{{Name: "p", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: "loopback", - }, - "Address is link-local": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "169.254.169.254"}}, - Ports: []api.EndpointPort{{Name: "p", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: "link-local", - }, - "Address is link-local multicast": { - endpoints: api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "mysvc", Namespace: "namespace"}, - Subsets: []api.EndpointSubset{ - { - Addresses: []api.EndpointAddress{{IP: "224.0.0.1"}}, - Ports: []api.EndpointPort{{Name: "p", Port: 93, Protocol: "TCP"}}, - }, - }, - }, - errorType: "FieldValueInvalid", - errorDetail: "link-local multicast", - }, - } - - for k, v := range errorCases { - if errs := ValidateEndpoints(&v.endpoints); len(errs) == 0 || errs[0].Type != v.errorType || !strings.Contains(errs[0].Detail, v.errorDetail) { - t.Errorf("[%s] Expected error type %s with detail %q, got %v", k, v.errorType, v.errorDetail, errs) - } - } -} - -func TestValidateTLSSecret(t *testing.T) { - successCases := map[string]api.Secret{ - "emtpy certificate chain": { - ObjectMeta: api.ObjectMeta{Name: "tls-cert", Namespace: "namespace"}, - Data: map[string][]byte{ - api.TLSCertKey: []byte("public key"), - api.TLSPrivateKeyKey: []byte("private key"), - }, - }, - } - for k, v := range successCases { - if errs := ValidateSecret(&v); len(errs) != 0 { - t.Errorf("Expected success for %s, got %v", k, errs) - } - } - errorCases := map[string]struct { - secrets api.Secret - errorType field.ErrorType - errorDetail string - }{ - "missing public key": { - secrets: api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "tls-cert"}, - Data: map[string][]byte{ - api.TLSCertKey: []byte("public key"), - }, - }, - errorType: "FieldValueRequired", - }, - "missing private key": { - secrets: api.Secret{ - ObjectMeta: api.ObjectMeta{Name: "tls-cert"}, - Data: map[string][]byte{ - api.TLSCertKey: []byte("public key"), - }, - }, - errorType: "FieldValueRequired", - }, - } - for k, v := range errorCases { - if errs := ValidateSecret(&v.secrets); len(errs) == 0 || errs[0].Type != v.errorType || !strings.Contains(errs[0].Detail, v.errorDetail) { - t.Errorf("[%s] Expected error type %s with detail %q, got %v", k, v.errorType, v.errorDetail, errs) - } - } -} - -func TestValidateSecurityContext(t *testing.T) { - priv := false - var runAsUser int64 = 1 - fullValidSC := func() *api.SecurityContext { - return &api.SecurityContext{ - Privileged: &priv, - Capabilities: &api.Capabilities{ - Add: []api.Capability{"foo"}, - Drop: []api.Capability{"bar"}, - }, - SELinuxOptions: &api.SELinuxOptions{ - User: "user", - Role: "role", - Type: "type", - Level: "level", - }, - RunAsUser: &runAsUser, - } - } - - //setup data - allSettings := fullValidSC() - noCaps := fullValidSC() - noCaps.Capabilities = nil - - noSELinux := fullValidSC() - noSELinux.SELinuxOptions = nil - - noPrivRequest := fullValidSC() - noPrivRequest.Privileged = nil - - noRunAsUser := fullValidSC() - noRunAsUser.RunAsUser = nil - - successCases := map[string]struct { - sc *api.SecurityContext - }{ - "all settings": {allSettings}, - "no capabilities": {noCaps}, - "no selinux": {noSELinux}, - "no priv request": {noPrivRequest}, - "no run as user": {noRunAsUser}, - } - for k, v := range successCases { - if errs := ValidateSecurityContext(v.sc, field.NewPath("field")); len(errs) != 0 { - t.Errorf("[%s] Expected success, got %v", k, errs) - } - } - - privRequestWithGlobalDeny := fullValidSC() - requestPrivileged := true - privRequestWithGlobalDeny.Privileged = &requestPrivileged - - negativeRunAsUser := fullValidSC() - var negativeUser int64 = -1 - negativeRunAsUser.RunAsUser = &negativeUser - - errorCases := map[string]struct { - sc *api.SecurityContext - errorType field.ErrorType - errorDetail string - }{ - "request privileged when capabilities forbids": { - sc: privRequestWithGlobalDeny, - errorType: "FieldValueForbidden", - errorDetail: "disallowed by policy", - }, - "negative RunAsUser": { - sc: negativeRunAsUser, - errorType: "FieldValueInvalid", - errorDetail: isNegativeErrorMsg, - }, - } - for k, v := range errorCases { - if errs := ValidateSecurityContext(v.sc, field.NewPath("field")); len(errs) == 0 || errs[0].Type != v.errorType || !strings.Contains(errs[0].Detail, v.errorDetail) { - t.Errorf("[%s] Expected error type %q with detail %q, got %v", k, v.errorType, v.errorDetail, errs) - } - } -} - -func fakeValidSecurityContext(priv bool) *api.SecurityContext { - return &api.SecurityContext{ - Privileged: &priv, - } -} - -func TestValidPodLogOptions(t *testing.T) { - now := unversioned.Now() - negative := int64(-1) - zero := int64(0) - positive := int64(1) - tests := []struct { - opt api.PodLogOptions - errs int - }{ - {api.PodLogOptions{}, 0}, - {api.PodLogOptions{Previous: true}, 0}, - {api.PodLogOptions{Follow: true}, 0}, - {api.PodLogOptions{TailLines: &zero}, 0}, - {api.PodLogOptions{TailLines: &negative}, 1}, - {api.PodLogOptions{TailLines: &positive}, 0}, - {api.PodLogOptions{LimitBytes: &zero}, 1}, - {api.PodLogOptions{LimitBytes: &negative}, 1}, - {api.PodLogOptions{LimitBytes: &positive}, 0}, - {api.PodLogOptions{SinceSeconds: &negative}, 1}, - {api.PodLogOptions{SinceSeconds: &positive}, 0}, - {api.PodLogOptions{SinceSeconds: &zero}, 1}, - {api.PodLogOptions{SinceTime: &now}, 0}, - } - for i, test := range tests { - errs := ValidatePodLogOptions(&test.opt) - if test.errs != len(errs) { - t.Errorf("%d: Unexpected errors: %v", i, errs) - } - } -} - -func TestValidateConfigMap(t *testing.T) { - newConfigMap := func(name, namespace string, data map[string]string) api.ConfigMap { - return api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Data: data, - } - } - - var ( - validConfigMap = newConfigMap("validname", "validns", map[string]string{"key": "value"}) - maxKeyLength = newConfigMap("validname", "validns", map[string]string{strings.Repeat("a", 253): "value"}) - - emptyName = newConfigMap("", "validns", nil) - invalidName = newConfigMap("NoUppercaseOrSpecialCharsLike=Equals", "validns", nil) - emptyNs = newConfigMap("validname", "", nil) - invalidNs = newConfigMap("validname", "NoUppercaseOrSpecialCharsLike=Equals", nil) - invalidKey = newConfigMap("validname", "validns", map[string]string{"a..b": "value"}) - leadingDotKey = newConfigMap("validname", "validns", map[string]string{".ab": "value"}) - dotKey = newConfigMap("validname", "validns", map[string]string{".": "value"}) - doubleDotKey = newConfigMap("validname", "validns", map[string]string{"..": "value"}) - overMaxKeyLength = newConfigMap("validname", "validns", map[string]string{strings.Repeat("a", 254): "value"}) - overMaxSize = newConfigMap("validname", "validns", map[string]string{"key": strings.Repeat("a", api.MaxSecretSize+1)}) - ) - - tests := map[string]struct { - cfg api.ConfigMap - isValid bool - }{ - "valid": {validConfigMap, true}, - "max key length": {maxKeyLength, true}, - "leading dot key": {leadingDotKey, true}, - "empty name": {emptyName, false}, - "invalid name": {invalidName, false}, - "invalid key": {invalidKey, false}, - "empty namespace": {emptyNs, false}, - "invalid namespace": {invalidNs, false}, - "dot key": {dotKey, false}, - "double dot key": {doubleDotKey, false}, - "over max key length": {overMaxKeyLength, false}, - "over max size": {overMaxSize, false}, - } - - for name, tc := range tests { - errs := ValidateConfigMap(&tc.cfg) - if tc.isValid && len(errs) > 0 { - t.Errorf("%v: unexpected error: %v", name, errs) - } - if !tc.isValid && len(errs) == 0 { - t.Errorf("%v: unexpected non-error", name) - } - } -} - -func TestValidateConfigMapUpdate(t *testing.T) { - newConfigMap := func(version, name, namespace string, data map[string]string) api.ConfigMap { - return api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: namespace, - ResourceVersion: version, - }, - Data: data, - } - } - - var ( - validConfigMap = newConfigMap("1", "validname", "validns", map[string]string{"key": "value"}) - noVersion = newConfigMap("", "validname", "validns", map[string]string{"key": "value"}) - ) - - cases := []struct { - name string - newCfg api.ConfigMap - oldCfg api.ConfigMap - isValid bool - }{ - { - name: "valid", - newCfg: validConfigMap, - oldCfg: validConfigMap, - isValid: true, - }, - { - name: "invalid", - newCfg: noVersion, - oldCfg: validConfigMap, - isValid: false, - }, - } - - for _, tc := range cases { - errs := ValidateConfigMapUpdate(&tc.newCfg, &tc.oldCfg) - if tc.isValid && len(errs) > 0 { - t.Errorf("%v: unexpected error: %v", tc.name, errs) - } - if !tc.isValid && len(errs) == 0 { - t.Errorf("%v: unexpected non-error", tc.name) - } - } -} - -func TestValidateHasLabel(t *testing.T) { - successCase := api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Labels: map[string]string{ - "other": "blah", - "foo": "bar", - }, - } - if errs := ValidateHasLabel(successCase, field.NewPath("field"), "foo", "bar"); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - - missingCase := api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Labels: map[string]string{ - "other": "blah", - }, - } - if errs := ValidateHasLabel(missingCase, field.NewPath("field"), "foo", "bar"); len(errs) == 0 { - t.Errorf("expected failure") - } - - wrongValueCase := api.ObjectMeta{ - Name: "123", - Namespace: "ns", - Labels: map[string]string{ - "other": "blah", - "foo": "notbar", - }, - } - if errs := ValidateHasLabel(wrongValueCase, field.NewPath("field"), "foo", "bar"); len(errs) == 0 { - t.Errorf("expected failure") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apimachinery/registered/registered_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apimachinery/registered/registered_test.go deleted file mode 100644 index 001b65e92..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apimachinery/registered/registered_test.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 registered - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery" -) - -func TestAllPreferredGroupVersions(t *testing.T) { - testCases := []struct { - groupMetas []apimachinery.GroupMeta - expect string - }{ - { - groupMetas: []apimachinery.GroupMeta{ - { - GroupVersion: unversioned.GroupVersion{Group: "group1", Version: "v1"}, - }, - { - GroupVersion: unversioned.GroupVersion{Group: "group2", Version: "v2"}, - }, - { - GroupVersion: unversioned.GroupVersion{Group: "", Version: "v1"}, - }, - }, - expect: "group1/v1,group2/v2,v1", - }, - { - groupMetas: []apimachinery.GroupMeta{ - { - GroupVersion: unversioned.GroupVersion{Group: "", Version: "v1"}, - }, - }, - expect: "v1", - }, - { - groupMetas: []apimachinery.GroupMeta{}, - expect: "", - }, - } - for _, testCase := range testCases { - for _, groupMeta := range testCase.groupMetas { - RegisterGroup(groupMeta) - } - output := AllPreferredGroupVersions() - if testCase.expect != output { - t.Errorf("Error. expect: %s, got: %s", testCase.expect, output) - } - reset() - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go deleted file mode 100644 index ce83ef8c5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation.go +++ /dev/null @@ -1,129 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "reflect" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - unversionedvalidation "k8s.io/kubernetes/pkg/api/unversioned/validation" - apivalidation "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -// ValidatePetSetName can be used to check whether the given PetSet -// name is valid. -// Prefix indicates this name will be used as part of generation, in which case -// trailing dashes are allowed. -func ValidatePetSetName(name string, prefix bool) (bool, string) { - // TODO: Validate that there's name for the suffix inserted by the pets. - // Currently this is just "-index". In the future we may allow a user - // specified list of suffixes and we need to validate the longest one. - return apivalidation.NameIsDNSSubdomain(name, prefix) -} - -// Validates the given template and ensures that it is in accordance with the desired selector. -func ValidatePodTemplateSpecForPetSet(template *api.PodTemplateSpec, selector labels.Selector, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if template == nil { - allErrs = append(allErrs, field.Required(fldPath, "")) - } else { - if !selector.Empty() { - // Verify that the PetSet selector matches the labels in template. - labels := labels.Set(template.Labels) - if !selector.Matches(labels) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("metadata", "labels"), template.Labels, "`selector` does not match template `labels`")) - } - } - // TODO: Add validation for PodSpec, currently this will check volumes, which we know will - // fail. We should really check that the union of the given volumes and volumeClaims match - // volume mounts in the containers. - // allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(template, fldPath)...) - allErrs = append(allErrs, unversionedvalidation.ValidateLabels(template.Labels, fldPath.Child("labels"))...) - allErrs = append(allErrs, apivalidation.ValidateAnnotations(template.Annotations, fldPath.Child("annotations"))...) - allErrs = append(allErrs, apivalidation.ValidatePodSpecificAnnotations(template.Annotations, fldPath.Child("annotations"))...) - } - return allErrs -} - -// ValidatePetSetSpec tests if required fields in the PetSet spec are set. -func ValidatePetSetSpec(spec *apps.PetSetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...) - if spec.Selector == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) - } else { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - if len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is not valid for petset.")) - } - } - - selector, err := unversioned.LabelSelectorAsSelector(spec.Selector) - if err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "")) - } else { - allErrs = append(allErrs, ValidatePodTemplateSpecForPetSet(&spec.Template, selector, fldPath.Child("template"))...) - } - - if spec.Template.Spec.RestartPolicy != api.RestartPolicyAlways { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)})) - } - - return allErrs -} - -// ValidatePetSet validates a PetSet. -func ValidatePetSet(petSet *apps.PetSet) field.ErrorList { - allErrs := apivalidation.ValidateObjectMeta(&petSet.ObjectMeta, true, ValidatePetSetName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidatePetSetSpec(&petSet.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidatePetSetUpdate tests if required fields in the PetSet are set. -func ValidatePetSetUpdate(petSet, oldPetSet *apps.PetSet) field.ErrorList { - allErrs := field.ErrorList{} - - // TODO: For now we're taking the safe route and disallowing all updates to spec except for Spec.Replicas. - // Enable on a case by case basis. - restoreReplicas := petSet.Spec.Replicas - petSet.Spec.Replicas = oldPetSet.Spec.Replicas - - // The generation changes for this update - restoreGeneration := petSet.Generation - petSet.Generation = oldPetSet.Generation - - if !reflect.DeepEqual(petSet, oldPetSet) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to petset spec for fields other than 'replicas' are forbidden.")) - } - petSet.Spec.Replicas = restoreReplicas - petSet.Generation = restoreGeneration - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(petSet.Spec.Replicas), field.NewPath("spec", "replicas"))...) - return allErrs -} - -// ValidatePetSetStatusUpdate tests if required fields in the PetSet are set. -func ValidatePetSetStatusUpdate(petSet, oldPetSet *apps.PetSet) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&petSet.ObjectMeta, &oldPetSet.ObjectMeta, field.NewPath("metadata"))...) - // TODO: Validate status. - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation_test.go deleted file mode 100644 index 851ea895f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/apps/validation/validation_test.go +++ /dev/null @@ -1,379 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/apps" -) - -func TestValidatePetSet(t *testing.T) { - validLabels := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidLabels, - }, - }, - } - successCases := []apps.PetSet{ - { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidatePetSet(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]apps.PetSet{ - "zero-length ID": { - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "missing-namespace": { - ObjectMeta: api.ObjectMeta{Name: "abc-123"}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "empty selector": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Template: validPodTemplate.Template, - }, - }, - "selector_doesnt_match": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: validPodTemplate.Template, - }, - }, - "invalid manifest": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - }, - }, - "negative_replicas": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: -1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - }, - }, - "invalid_label": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "invalid_label 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.PetSetSpec{ - Template: invalidPodTemplate.Template, - }, - }, - "invalid_annotation": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "invalid restart policy 1": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - }, - }, - }, - "invalid restart policy 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - }, - }, - }, - } - for k, v := range errorCases { - errs := ValidatePetSet(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - field := errs[i].Field - if !strings.HasPrefix(field, "spec.template.") && - field != "metadata.name" && - field != "metadata.namespace" && - field != "spec.selector" && - field != "spec.template" && - field != "GCEPersistentDisk.ReadOnly" && - field != "spec.replicas" && - field != "spec.template.labels" && - field != "metadata.annotations" && - field != "metadata.labels" && - field != "status.replicas" { - t.Errorf("%s: missing prefix for: %v", k, errs[i]) - } - } - } -} - -func TestValidatePetSetUpdate(t *testing.T) { - validLabels := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - }, - }, - } - invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidLabels, - }, - }, - } - type psUpdateTest struct { - old apps.PetSet - update apps.PetSet - } - successCases := []psUpdateTest{ - { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: 3, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidatePetSetUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]psUpdateTest{ - "more than one read/write": { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - }, - "updates to a field other than spec.Replicas": { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: 1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - }, - "invalid selector": { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: invalidLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - "invalid pod": { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: invalidPodTemplate.Template, - }, - }, - }, - "negative replicas": { - old: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: apps.PetSetSpec{ - Replicas: -1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidatePetSetUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation.go deleted file mode 100644 index 11a548f41..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation.go +++ /dev/null @@ -1,64 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - authorizationapi "k8s.io/kubernetes/pkg/apis/authorization" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func ValidateSubjectAccessReviewSpec(spec authorizationapi.SubjectAccessReviewSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if spec.ResourceAttributes != nil && spec.NonResourceAttributes != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("nonResourceAttributes"), spec.NonResourceAttributes, `cannot be specified in combination with resourceAttributes`)) - } - if spec.ResourceAttributes == nil && spec.NonResourceAttributes == nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("resourceAttributes"), spec.NonResourceAttributes, `exactly one of nonResourceAttributes or resourceAttributes must be specified`)) - } - if len(spec.User) == 0 && len(spec.Groups) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("user"), spec.User, `at least one of user or group must be specified`)) - } - - return allErrs -} - -func ValidateSelfSubjectAccessReviewSpec(spec authorizationapi.SelfSubjectAccessReviewSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if spec.ResourceAttributes != nil && spec.NonResourceAttributes != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("nonResourceAttributes"), spec.NonResourceAttributes, `cannot be specified in combination with resourceAttributes`)) - } - if spec.ResourceAttributes == nil && spec.NonResourceAttributes == nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("resourceAttributes"), spec.NonResourceAttributes, `exactly one of nonResourceAttributes or resourceAttributes must be specified`)) - } - - return allErrs -} - -func ValidateSubjectAccessReview(sar *authorizationapi.SubjectAccessReview) field.ErrorList { - allErrs := ValidateSubjectAccessReviewSpec(sar.Spec, field.NewPath("spec")) - return allErrs -} - -func ValidateSelfSubjectAccessReview(sar *authorizationapi.SelfSubjectAccessReview) field.ErrorList { - allErrs := ValidateSelfSubjectAccessReviewSpec(sar.Spec, field.NewPath("spec")) - return allErrs -} - -func ValidateLocalSubjectAccessReview(sar *authorizationapi.LocalSubjectAccessReview) field.ErrorList { - allErrs := ValidateSubjectAccessReviewSpec(sar.Spec, field.NewPath("spec")) - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation_test.go deleted file mode 100644 index c2776c404..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/authorization/validation/validation_test.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" - - authorizationapi "k8s.io/kubernetes/pkg/apis/authorization" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestValidateSARSpec(t *testing.T) { - successCases := []authorizationapi.SubjectAccessReviewSpec{ - {ResourceAttributes: &authorizationapi.ResourceAttributes{}, User: "me"}, - {NonResourceAttributes: &authorizationapi.NonResourceAttributes{}, Groups: []string{"my-group"}}, - } - for _, successCase := range successCases { - if errs := ValidateSubjectAccessReviewSpec(successCase, field.NewPath("spec")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []struct { - name string - obj authorizationapi.SubjectAccessReviewSpec - msg string - }{ - { - name: "neither request", - obj: authorizationapi.SubjectAccessReviewSpec{User: "me"}, - msg: "exactly one of nonResourceAttributes or resourceAttributes must be specified", - }, - { - name: "both requests", - obj: authorizationapi.SubjectAccessReviewSpec{ - ResourceAttributes: &authorizationapi.ResourceAttributes{}, - NonResourceAttributes: &authorizationapi.NonResourceAttributes{}, - User: "me", - }, - msg: "cannot be specified in combination with resourceAttributes", - }, - { - name: "no subject", - obj: authorizationapi.SubjectAccessReviewSpec{ - ResourceAttributes: &authorizationapi.ResourceAttributes{}, - }, - msg: `spec.user: Invalid value: "": at least one of user or group must be specified`, - }, - } - - for _, c := range errorCases { - errs := ValidateSubjectAccessReviewSpec(c.obj, field.NewPath("spec")) - if len(errs) == 0 { - t.Errorf("%s: expected failure for %q", c.name, c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("%s: unexpected error: %q, expected: %q", c.name, errs[0], c.msg) - } - - errs = ValidateSubjectAccessReview(&authorizationapi.SubjectAccessReview{Spec: c.obj}) - if len(errs) == 0 { - t.Errorf("%s: expected failure for %q", c.name, c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("%s: unexpected error: %q, expected: %q", c.name, errs[0], c.msg) - } - errs = ValidateLocalSubjectAccessReview(&authorizationapi.LocalSubjectAccessReview{Spec: c.obj}) - if len(errs) == 0 { - t.Errorf("%s: expected failure for %q", c.name, c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("%s: unexpected error: %q, expected: %q", c.name, errs[0], c.msg) - } - - } -} - -func TestValidateSelfSAR(t *testing.T) { - successCases := []authorizationapi.SelfSubjectAccessReviewSpec{ - {ResourceAttributes: &authorizationapi.ResourceAttributes{}}, - } - for _, successCase := range successCases { - if errs := ValidateSelfSubjectAccessReviewSpec(successCase, field.NewPath("spec")); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []struct { - name string - obj authorizationapi.SelfSubjectAccessReviewSpec - msg string - }{ - { - name: "neither request", - obj: authorizationapi.SelfSubjectAccessReviewSpec{}, - msg: "exactly one of nonResourceAttributes or resourceAttributes must be specified", - }, - { - name: "both requests", - obj: authorizationapi.SelfSubjectAccessReviewSpec{ - ResourceAttributes: &authorizationapi.ResourceAttributes{}, - NonResourceAttributes: &authorizationapi.NonResourceAttributes{}, - }, - msg: "cannot be specified in combination with resourceAttributes", - }, - } - - for _, c := range errorCases { - errs := ValidateSelfSubjectAccessReviewSpec(c.obj, field.NewPath("spec")) - if len(errs) == 0 { - t.Errorf("%s: expected failure for %q", c.name, c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("%s: unexpected error: %q, expected: %q", c.name, errs[0], c.msg) - } - - errs = ValidateSelfSubjectAccessReview(&authorizationapi.SelfSubjectAccessReview{Spec: c.obj}) - if len(errs) == 0 { - t.Errorf("%s: expected failure for %q", c.name, c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("%s: unexpected error: %q, expected: %q", c.name, errs[0], c.msg) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation.go deleted file mode 100644 index 8b9a21a9d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - apivalidation "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/apis/autoscaling" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func ValidateScale(scale *autoscaling.Scale) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&scale.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) - - if scale.Spec.Replicas < 0 { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "replicas"), scale.Spec.Replicas, "must be greater than or equal to 0")) - } - - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation_test.go deleted file mode 100644 index ac8921ee0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/autoscaling/validation/validation_test.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/autoscaling" -) - -func TestValidateScale(t *testing.T) { - successCases := []autoscaling.Scale{ - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: autoscaling.ScaleSpec{ - Replicas: 1, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: autoscaling.ScaleSpec{ - Replicas: 10, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: autoscaling.ScaleSpec{ - Replicas: 0, - }, - }, - } - - for _, successCase := range successCases { - if errs := ValidateScale(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []struct { - scale autoscaling.Scale - msg string - }{ - { - scale: autoscaling.Scale{ - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: autoscaling.ScaleSpec{ - Replicas: -1, - }, - }, - msg: "must be greater than or equal to 0", - }, - } - - for _, c := range errorCases { - if errs := ValidateScale(&c.scale); len(errs) == 0 { - t.Errorf("expected failure for %s", c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("unexpected error: %v, expected: %s", errs[0], c.msg) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go deleted file mode 100644 index d4d187578..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation.go +++ /dev/null @@ -1,157 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - unversionedvalidation "k8s.io/kubernetes/pkg/api/unversioned/validation" - apivalidation "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -// TODO: generalize for other controller objects that will follow the same pattern, such as ReplicaSet and DaemonSet, and -// move to new location. Replace batch.Job with an interface. -// -// ValidateGeneratedSelector validates that the generated selector on a controller object match the controller object -// metadata, and the labels on the pod template are as generated. -func ValidateGeneratedSelector(obj *batch.Job) field.ErrorList { - allErrs := field.ErrorList{} - if obj.Spec.ManualSelector != nil && *obj.Spec.ManualSelector { - return allErrs - } - - if obj.Spec.Selector == nil { - return allErrs // This case should already have been checked in caller. No need for more errors. - } - - // If somehow uid was unset then we would get "controller-uid=" as the selector - // which is bad. - if obj.ObjectMeta.UID == "" { - allErrs = append(allErrs, field.Required(field.NewPath("metadata").Child("uid"), "")) - } - - // If somehow uid was unset then we would get "controller-uid=" as the selector - // which is bad. - if obj.ObjectMeta.UID == "" { - allErrs = append(allErrs, field.Required(field.NewPath("metadata").Child("uid"), "")) - } - - // If selector generation was requested, then expected labels must be - // present on pod template, and much match job's uid and name. The - // generated (not-manual) selectors/labels ensure no overlap with other - // controllers. The manual mode allows orphaning, adoption, - // backward-compatibility, and experimentation with new - // labeling/selection schemes. Automatic selector generation should - // have placed certain labels on the pod, but this could have failed if - // the user added coflicting labels. Validate that the expected - // generated ones are there. - - allErrs = append(allErrs, apivalidation.ValidateHasLabel(obj.Spec.Template.ObjectMeta, field.NewPath("spec").Child("template").Child("metadata"), "controller-uid", string(obj.UID))...) - allErrs = append(allErrs, apivalidation.ValidateHasLabel(obj.Spec.Template.ObjectMeta, field.NewPath("spec").Child("template").Child("metadata"), "job-name", string(obj.Name))...) - expectedLabels := make(map[string]string) - expectedLabels["controller-uid"] = string(obj.UID) - expectedLabels["job-name"] = string(obj.Name) - // Whether manually or automatically generated, the selector of the job must match the pods it will produce. - if selector, err := unversioned.LabelSelectorAsSelector(obj.Spec.Selector); err == nil { - if !selector.Matches(labels.Set(expectedLabels)) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("selector"), obj.Spec.Selector, "`selector` not auto-generated")) - } - } - - return allErrs -} - -func ValidateJob(job *batch.Job) field.ErrorList { - // Jobs and rcs have the same name validation - allErrs := apivalidation.ValidateObjectMeta(&job.ObjectMeta, true, apivalidation.ValidateReplicationControllerName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateGeneratedSelector(job)...) - allErrs = append(allErrs, ValidateJobSpec(&job.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateJobSpec(spec *batch.JobSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - if spec.Parallelism != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.Parallelism), fldPath.Child("parallelism"))...) - } - if spec.Completions != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.Completions), fldPath.Child("completions"))...) - } - if spec.ActiveDeadlineSeconds != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.ActiveDeadlineSeconds), fldPath.Child("activeDeadlineSeconds"))...) - } - if spec.Selector == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) - } else { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - } - - // Whether manually or automatically generated, the selector of the job must match the pods it will produce. - if selector, err := unversioned.LabelSelectorAsSelector(spec.Selector); err == nil { - labels := labels.Set(spec.Template.Labels) - if !selector.Matches(labels) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "metadata", "labels"), spec.Template.Labels, "`selector` does not match template `labels`")) - } - } - - allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(&spec.Template, fldPath.Child("template"))...) - if spec.Template.Spec.RestartPolicy != api.RestartPolicyOnFailure && - spec.Template.Spec.RestartPolicy != api.RestartPolicyNever { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), - spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyOnFailure), string(api.RestartPolicyNever)})) - } - return allErrs -} - -func ValidateJobStatus(status *batch.JobStatus, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Active), fldPath.Child("active"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Succeeded), fldPath.Child("succeeded"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Failed), fldPath.Child("failed"))...) - return allErrs -} - -func ValidateJobUpdate(job, oldJob *batch.Job) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&oldJob.ObjectMeta, &job.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateJobSpecUpdate(job.Spec, oldJob.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateJobUpdateStatus(job, oldJob *batch.Job) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&oldJob.ObjectMeta, &job.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateJobStatusUpdate(job.Status, oldJob.Status)...) - return allErrs -} - -func ValidateJobSpecUpdate(spec, oldSpec batch.JobSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidateJobSpec(&spec, fldPath)...) - allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Completions, oldSpec.Completions, fldPath.Child("completions"))...) - allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Selector, oldSpec.Selector, fldPath.Child("selector"))...) - allErrs = append(allErrs, apivalidation.ValidateImmutableField(spec.Template, oldSpec.Template, fldPath.Child("template"))...) - return allErrs -} - -func ValidateJobStatusUpdate(status, oldStatus batch.JobStatus) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidateJobStatus(&status, field.NewPath("status"))...) - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation_test.go deleted file mode 100644 index 5b59a4c6e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/batch/validation/validation_test.go +++ /dev/null @@ -1,297 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/types" -) - -func TestValidateJob(t *testing.T) { - validManualSelector := &unversioned.LabelSelector{ - MatchLabels: map[string]string{"a": "b"}, - } - validGeneratedSelector := &unversioned.LabelSelector{ - MatchLabels: map[string]string{"controller-uid": "1a2b3c", "job-name": "myjob"}, - } - validPodTemplateSpecForManual := api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validManualSelector.MatchLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - } - validPodTemplateSpecForGenerated := api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validGeneratedSelector.MatchLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - } - successCases := map[string]batch.Job{ - "manual selector": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: validPodTemplateSpecForManual, - }, - }, - "generated selector": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Selector: validGeneratedSelector, - ManualSelector: newBool(false), - Template: validPodTemplateSpecForGenerated, - }, - }, - } - for k, v := range successCases { - if errs := ValidateJob(&v); len(errs) != 0 { - t.Errorf("expected success for %s: %v", k, errs) - } - } - negative := int32(-1) - negative64 := int64(-1) - errorCases := map[string]batch.Job{ - "spec.parallelism:must be greater than or equal to 0": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Parallelism: &negative, - ManualSelector: newBool(true), - Template: validPodTemplateSpecForGenerated, - }, - }, - "spec.completions:must be greater than or equal to 0": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Completions: &negative, - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: validPodTemplateSpecForGenerated, - }, - }, - "spec.activeDeadlineSeconds:must be greater than or equal to 0": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - ActiveDeadlineSeconds: &negative64, - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: validPodTemplateSpecForGenerated, - }, - }, - "spec.selector:Required value": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Template: validPodTemplateSpecForGenerated, - }, - }, - "spec.template.metadata.labels: Invalid value: {\"y\":\"z\"}: `selector` does not match template `labels`": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"y": "z"}, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - }, - }, - "spec.template.metadata.labels: Invalid value: {\"controller-uid\":\"4d5e6f\"}: `selector` does not match template `labels`": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"controller-uid": "4d5e6f"}, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - }, - }, - "spec.template.spec.restartPolicy: Unsupported value": { - ObjectMeta: api.ObjectMeta{ - Name: "myjob", - Namespace: api.NamespaceDefault, - UID: types.UID("1a2b3c"), - }, - Spec: batch.JobSpec{ - Selector: validManualSelector, - ManualSelector: newBool(true), - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validManualSelector.MatchLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - }, - }, - } - - for k, v := range errorCases { - errs := ValidateJob(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } else { - s := strings.Split(k, ":") - err := errs[0] - if err.Field != s[0] || !strings.Contains(err.Error(), s[1]) { - t.Errorf("unexpected error: %v, expected: %s", err, k) - } - } - } -} - -func TestValidateJobUpdateStatus(t *testing.T) { - type testcase struct { - old batch.Job - update batch.Job - } - - successCases := []testcase{ - { - old: batch.Job{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Status: batch.JobStatus{ - Active: 1, - Succeeded: 2, - Failed: 3, - }, - }, - update: batch.Job{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Status: batch.JobStatus{ - Active: 1, - Succeeded: 1, - Failed: 3, - }, - }, - }, - } - - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateJobUpdateStatus(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]testcase{ - "[status.active: Invalid value: -1: must be greater than or equal to 0, status.succeeded: Invalid value: -2: must be greater than or equal to 0]": { - old: batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - ResourceVersion: "10", - }, - Status: batch.JobStatus{ - Active: 1, - Succeeded: 2, - Failed: 3, - }, - }, - update: batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - ResourceVersion: "10", - }, - Status: batch.JobStatus{ - Active: -1, - Succeeded: -2, - Failed: 3, - }, - }, - }, - } - - for testName, errorCase := range errorCases { - errs := ValidateJobUpdateStatus(&errorCase.update, &errorCase.old) - if len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - continue - } - if errs.ToAggregate().Error() != testName { - t.Errorf("expected '%s' got '%s'", errs.ToAggregate().Error(), testName) - } - } -} - -func newBool(val bool) *bool { - p := new(bool) - *p = val - return p -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/helpers_test.go deleted file mode 100644 index 7aece8257..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/helpers_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 componentconfig - -import ( - "strings" - "testing" - - "github.com/spf13/pflag" -) - -func TestIPVar(t *testing.T) { - defaultIP := "0.0.0.0" - cases := []struct { - argc string - expectErr bool - expectVal string - }{ - - { - argc: "blah --ip=1.2.3.4", - expectVal: "1.2.3.4", - }, - { - argc: "blah --ip=1.2.3.4a", - expectErr: true, - expectVal: defaultIP, - }, - } - for _, c := range cases { - fs := pflag.NewFlagSet("blah", pflag.PanicOnError) - ip := defaultIP - fs.Var(IPVar{&ip}, "ip", "the ip") - - var err error - func() { - defer func() { - if r := recover(); r != nil { - err = r.(error) - } - }() - fs.Parse(strings.Split(c.argc, " ")) - }() - - if c.expectErr && err == nil { - t.Errorf("did not observe an expected error") - continue - } - if !c.expectErr && err != nil { - t.Errorf("observed an unexpected error") - continue - } - if c.expectVal != ip { - t.Errorf("unexpected ip: expected %q, saw %q", c.expectVal, ip) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/install/install_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/install/install_test.go deleted file mode 100644 index 940e17567..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/componentconfig/install/install_test.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 install - -import ( - "encoding/json" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/apis/componentconfig" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestCodec(t *testing.T) { - daemonSet := componentconfig.KubeProxyConfiguration{} - // We do want to use package registered rather than testapi here, because we - // want to test if the package install and package registered work as expected. - data, err := runtime.Encode(api.Codecs.LegacyCodec(registered.GroupOrDie(componentconfig.GroupName).GroupVersion), &daemonSet) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - other := componentconfig.KubeProxyConfiguration{} - if err := json.Unmarshal(data, &other); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if other.APIVersion != registered.GroupOrDie(componentconfig.GroupName).GroupVersion.String() || other.Kind != "KubeProxyConfiguration" { - t.Errorf("unexpected unmarshalled object %#v", other) - } -} - -func TestInterfacesFor(t *testing.T) { - if _, err := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(componentconfig.SchemeGroupVersion); err == nil { - t.Fatalf("unexpected non-error: %v", err) - } - for i, version := range registered.GroupOrDie(componentconfig.GroupName).GroupVersions { - if vi, err := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(version); err != nil || vi == nil { - t.Fatalf("%d: unexpected result: %v", i, err) - } - } -} - -func TestRESTMapper(t *testing.T) { - gv := unversioned.GroupVersion{Group: componentconfig.GroupName, Version: "v1alpha1"} - proxyGVK := gv.WithKind("KubeProxyConfiguration") - - if gvk, err := registered.GroupOrDie(componentconfig.GroupName).RESTMapper.KindFor(gv.WithResource("kubeproxyconfiguration")); err != nil || gvk != proxyGVK { - t.Errorf("unexpected version mapping: %v %v", gvk, err) - } - - if m, err := registered.GroupOrDie(componentconfig.GroupName).RESTMapper.RESTMapping(proxyGVK.GroupKind(), ""); err != nil || m.GroupVersionKind != proxyGVK || m.Resource != "kubeproxyconfigurations" { - t.Errorf("unexpected version mapping: %#v %v", m, err) - } - - for _, version := range registered.GroupOrDie(componentconfig.GroupName).GroupVersions { - mapping, err := registered.GroupOrDie(componentconfig.GroupName).RESTMapper.RESTMapping(proxyGVK.GroupKind(), version.Version) - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - - if mapping.Resource != "kubeproxyconfigurations" { - t.Errorf("incorrect resource name: %#v", mapping) - } - if mapping.GroupVersionKind.GroupVersion() != version { - t.Errorf("incorrect groupVersion: %v", mapping) - } - - interfaces, _ := registered.GroupOrDie(componentconfig.GroupName).InterfacesFor(version) - if mapping.ObjectConvertor != interfaces.ObjectConvertor { - t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/install/install_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/install/install_test.go deleted file mode 100644 index 311fad56d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/install/install_test.go +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 install - -import ( - "encoding/json" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestResourceVersioner(t *testing.T) { - daemonSet := extensions.DaemonSet{ObjectMeta: api.ObjectMeta{ResourceVersion: "10"}} - version, err := accessor.ResourceVersion(&daemonSet) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } - - daemonSetList := extensions.DaemonSetList{ListMeta: unversioned.ListMeta{ResourceVersion: "10"}} - version, err = accessor.ResourceVersion(&daemonSetList) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != "10" { - t.Errorf("unexpected version %v", version) - } -} - -func TestCodec(t *testing.T) { - daemonSet := extensions.DaemonSet{} - // We do want to use package registered rather than testapi here, because we - // want to test if the package install and package registered work as expected. - data, err := runtime.Encode(api.Codecs.LegacyCodec(registered.GroupOrDie(extensions.GroupName).GroupVersion), &daemonSet) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - other := extensions.DaemonSet{} - if err := json.Unmarshal(data, &other); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if other.APIVersion != registered.GroupOrDie(extensions.GroupName).GroupVersion.String() || other.Kind != "DaemonSet" { - t.Errorf("unexpected unmarshalled object %#v", other) - } -} - -func TestInterfacesFor(t *testing.T) { - if _, err := registered.GroupOrDie(extensions.GroupName).InterfacesFor(extensions.SchemeGroupVersion); err == nil { - t.Fatalf("unexpected non-error: %v", err) - } - for i, version := range registered.GroupOrDie(extensions.GroupName).GroupVersions { - if vi, err := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version); err != nil || vi == nil { - t.Fatalf("%d: unexpected result: %v", i, err) - } - } -} - -func TestRESTMapper(t *testing.T) { - gv := v1beta1.SchemeGroupVersion - hpaGVK := gv.WithKind("HorizontalPodAutoscaler") - daemonSetGVK := gv.WithKind("DaemonSet") - - if gvk, err := registered.GroupOrDie(extensions.GroupName).RESTMapper.KindFor(gv.WithResource("horizontalpodautoscalers")); err != nil || gvk != hpaGVK { - t.Errorf("unexpected version mapping: %v %v", gvk, err) - } - - if m, err := registered.GroupOrDie(extensions.GroupName).RESTMapper.RESTMapping(daemonSetGVK.GroupKind(), ""); err != nil || m.GroupVersionKind != daemonSetGVK || m.Resource != "daemonsets" { - t.Errorf("unexpected version mapping: %#v %v", m, err) - } - - for _, version := range registered.GroupOrDie(extensions.GroupName).GroupVersions { - mapping, err := registered.GroupOrDie(extensions.GroupName).RESTMapper.RESTMapping(hpaGVK.GroupKind(), version.Version) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if mapping.Resource != "horizontalpodautoscalers" { - t.Errorf("incorrect resource name: %#v", mapping) - } - if mapping.GroupVersionKind.GroupVersion() != version { - t.Errorf("incorrect groupVersion: %v", mapping) - } - - interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version) - if mapping.ObjectConvertor != interfaces.ObjectConvertor { - t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces) - } - - rc := &extensions.HorizontalPodAutoscaler{ObjectMeta: api.ObjectMeta{Name: "foo"}} - name, err := mapping.MetadataAccessor.Name(rc) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if name != "foo" { - t.Errorf("unable to retrieve object meta with: %v", mapping.MetadataAccessor) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion_test.go deleted file mode 100644 index 759e38ca1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/conversion_test.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 v1beta1_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/batch" - versioned "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" -) - -// TestJobSpecConversion tests that ManualSelector and AutoSelector -// are handled correctly. -func TestJobSpecConversion(t *testing.T) { - pTrue := new(bool) - *pTrue = true - pFalse := new(bool) - *pFalse = false - - // False or nil convert to true. - // True converts to nil. - tests := []struct { - in *bool - expectOut *bool - }{ - { - in: nil, - expectOut: pTrue, - }, - { - in: pFalse, - expectOut: pTrue, - }, - { - in: pTrue, - expectOut: nil, - }, - } - - // Test internal -> v1beta1. - for _, test := range tests { - i := &batch.JobSpec{ - ManualSelector: test.in, - } - v := versioned.JobSpec{} - if err := api.Scheme.Convert(i, &v); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(test.expectOut, v.AutoSelector) { - t.Fatalf("want v1beta1.AutoSelector %v, got %v", test.expectOut, v.AutoSelector) - } - } - - // Test v1beta1 -> internal. - for _, test := range tests { - i := &versioned.JobSpec{ - AutoSelector: test.in, - } - e := batch.JobSpec{} - if err := api.Scheme.Convert(i, &e); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(test.expectOut, e.ManualSelector) { - t.Fatalf("want extensions.ManualSelector %v, got %v", test.expectOut, e.ManualSelector) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults_test.go deleted file mode 100644 index f02b2c0d4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/v1beta1/defaults_test.go +++ /dev/null @@ -1,731 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 v1beta1_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - _ "k8s.io/kubernetes/pkg/api/install" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/v1" - _ "k8s.io/kubernetes/pkg/apis/extensions/install" - . "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestSetDefaultDaemonSet(t *testing.T) { - defaultLabels := map[string]string{"foo": "bar"} - period := int64(v1.DefaultTerminationGracePeriodSeconds) - defaultTemplate := v1.PodTemplateSpec{ - Spec: v1.PodSpec{ - DNSPolicy: v1.DNSClusterFirst, - RestartPolicy: v1.RestartPolicyAlways, - SecurityContext: &v1.PodSecurityContext{}, - TerminationGracePeriodSeconds: &period, - }, - ObjectMeta: v1.ObjectMeta{ - Labels: defaultLabels, - }, - } - templateNoLabel := v1.PodTemplateSpec{ - Spec: v1.PodSpec{ - DNSPolicy: v1.DNSClusterFirst, - RestartPolicy: v1.RestartPolicyAlways, - SecurityContext: &v1.PodSecurityContext{}, - TerminationGracePeriodSeconds: &period, - }, - } - tests := []struct { - original *DaemonSet - expected *DaemonSet - }{ - { // Labels change/defaulting test. - original: &DaemonSet{ - Spec: DaemonSetSpec{ - Template: defaultTemplate, - }, - }, - expected: &DaemonSet{ - ObjectMeta: v1.ObjectMeta{ - Labels: defaultLabels, - }, - Spec: DaemonSetSpec{ - Selector: &LabelSelector{ - MatchLabels: defaultLabels, - }, - Template: defaultTemplate, - }, - }, - }, - { // Labels change/defaulting test. - original: &DaemonSet{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: DaemonSetSpec{ - Template: defaultTemplate, - }, - }, - expected: &DaemonSet{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: DaemonSetSpec{ - Selector: &LabelSelector{ - MatchLabels: defaultLabels, - }, - Template: defaultTemplate, - }, - }, - }, - { // Update strategy. - original: &DaemonSet{}, - expected: &DaemonSet{ - Spec: DaemonSetSpec{ - Template: templateNoLabel, - }, - }, - }, - { // Update strategy. - original: &DaemonSet{ - Spec: DaemonSetSpec{}, - }, - expected: &DaemonSet{ - Spec: DaemonSetSpec{ - Template: templateNoLabel, - }, - }, - }, - { // Custom unique label key. - original: &DaemonSet{ - Spec: DaemonSetSpec{}, - }, - expected: &DaemonSet{ - Spec: DaemonSetSpec{ - Template: templateNoLabel, - }, - }, - }, - } - - for i, test := range tests { - original := test.original - expected := test.expected - obj2 := roundTrip(t, runtime.Object(original)) - got, ok := obj2.(*DaemonSet) - if !ok { - t.Errorf("(%d) unexpected object: %v", i, got) - t.FailNow() - } - if !reflect.DeepEqual(got.Spec, expected.Spec) { - t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec) - } - } -} - -func TestSetDefaultDeployment(t *testing.T) { - defaultIntOrString := intstr.FromInt(1) - differentIntOrString := intstr.FromInt(5) - period := int64(v1.DefaultTerminationGracePeriodSeconds) - defaultTemplate := v1.PodTemplateSpec{ - Spec: v1.PodSpec{ - DNSPolicy: v1.DNSClusterFirst, - RestartPolicy: v1.RestartPolicyAlways, - SecurityContext: &v1.PodSecurityContext{}, - TerminationGracePeriodSeconds: &period, - }, - } - tests := []struct { - original *Deployment - expected *Deployment - }{ - { - original: &Deployment{}, - expected: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(1), - Strategy: DeploymentStrategy{ - Type: RollingUpdateDeploymentStrategyType, - RollingUpdate: &RollingUpdateDeployment{ - MaxSurge: &defaultIntOrString, - MaxUnavailable: &defaultIntOrString, - }, - }, - Template: defaultTemplate, - }, - }, - }, - { - original: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - RollingUpdate: &RollingUpdateDeployment{ - MaxSurge: &differentIntOrString, - }, - }, - }, - }, - expected: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - Type: RollingUpdateDeploymentStrategyType, - RollingUpdate: &RollingUpdateDeployment{ - MaxSurge: &differentIntOrString, - MaxUnavailable: &defaultIntOrString, - }, - }, - Template: defaultTemplate, - }, - }, - }, - { - original: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - Type: RecreateDeploymentStrategyType, - }, - }, - }, - expected: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - Type: RecreateDeploymentStrategyType, - }, - Template: defaultTemplate, - }, - }, - }, - { - original: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - Type: RecreateDeploymentStrategyType, - }, - }, - }, - expected: &Deployment{ - Spec: DeploymentSpec{ - Replicas: newInt32(5), - Strategy: DeploymentStrategy{ - Type: RecreateDeploymentStrategyType, - }, - Template: defaultTemplate, - }, - }, - }, - } - - for _, test := range tests { - original := test.original - expected := test.expected - obj2 := roundTrip(t, runtime.Object(original)) - got, ok := obj2.(*Deployment) - if !ok { - t.Errorf("unexpected object: %v", got) - t.FailNow() - } - if !reflect.DeepEqual(got.Spec, expected.Spec) { - t.Errorf("got different than expected:\n\t%+v\ngot:\n\t%+v", got.Spec, expected.Spec) - } - } -} - -func TestSetDefaultJobParallelismAndCompletions(t *testing.T) { - tests := []struct { - original *Job - expected *Job - }{ - // both unspecified -> sets both to 1 - { - original: &Job{ - Spec: JobSpec{}, - }, - expected: &Job{ - Spec: JobSpec{ - Completions: newInt32(1), - Parallelism: newInt32(1), - }, - }, - }, - // WQ: Parallelism explicitly 0 and completions unset -> no change - { - original: &Job{ - Spec: JobSpec{ - Parallelism: newInt32(0), - }, - }, - expected: &Job{ - Spec: JobSpec{ - Parallelism: newInt32(0), - }, - }, - }, - // WQ: Parallelism explicitly 2 and completions unset -> no change - { - original: &Job{ - Spec: JobSpec{ - Parallelism: newInt32(2), - }, - }, - expected: &Job{ - Spec: JobSpec{ - Parallelism: newInt32(2), - }, - }, - }, - // Completions explicitly 2 and parallelism unset -> parallelism is defaulted - { - original: &Job{ - Spec: JobSpec{ - Completions: newInt32(2), - }, - }, - expected: &Job{ - Spec: JobSpec{ - Completions: newInt32(2), - Parallelism: newInt32(1), - }, - }, - }, - // Both set -> no change - { - original: &Job{ - Spec: JobSpec{ - Completions: newInt32(10), - Parallelism: newInt32(11), - }, - }, - expected: &Job{ - Spec: JobSpec{ - Completions: newInt32(10), - Parallelism: newInt32(11), - }, - }, - }, - // Both set, flipped -> no change - { - original: &Job{ - Spec: JobSpec{ - Completions: newInt32(11), - Parallelism: newInt32(10), - }, - }, - expected: &Job{ - Spec: JobSpec{ - Completions: newInt32(11), - Parallelism: newInt32(10), - }, - }, - }, - } - - for _, tc := range tests { - original := tc.original - expected := tc.expected - obj2 := roundTrip(t, runtime.Object(original)) - got, ok := obj2.(*Job) - if !ok { - t.Errorf("unexpected object: %v", got) - t.FailNow() - } - if (got.Spec.Completions == nil) != (expected.Spec.Completions == nil) { - t.Errorf("got different *completions than expected: %v %v", got.Spec.Completions, expected.Spec.Completions) - } - if got.Spec.Completions != nil && expected.Spec.Completions != nil { - if *got.Spec.Completions != *expected.Spec.Completions { - t.Errorf("got different completions than expected: %d %d", *got.Spec.Completions, *expected.Spec.Completions) - } - } - if (got.Spec.Parallelism == nil) != (expected.Spec.Parallelism == nil) { - t.Errorf("got different *Parallelism than expected: %v %v", got.Spec.Parallelism, expected.Spec.Parallelism) - } - if got.Spec.Parallelism != nil && expected.Spec.Parallelism != nil { - if *got.Spec.Parallelism != *expected.Spec.Parallelism { - t.Errorf("got different parallelism than expected: %d %d", *got.Spec.Parallelism, *expected.Spec.Parallelism) - } - } - } -} - -func TestSetDefaultJobSelector(t *testing.T) { - tests := []struct { - original *Job - expectedSelector *LabelSelector - }{ - // selector set explicitly, nil autoSelector - { - original: &Job{ - Spec: JobSpec{ - Selector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - }, - expectedSelector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - // selector set explicitly, autoSelector=true - { - original: &Job{ - Spec: JobSpec{ - Selector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - AutoSelector: newBool(true), - }, - }, - expectedSelector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - // selector set explicitly, autoSelector=false - { - original: &Job{ - Spec: JobSpec{ - Selector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - AutoSelector: newBool(false), - }, - }, - expectedSelector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - // selector from template labels - { - original: &Job{ - Spec: JobSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{"job": "selector"}, - }, - }, - }, - }, - expectedSelector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - // selector from template labels, autoSelector=false - { - original: &Job{ - Spec: JobSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{"job": "selector"}, - }, - }, - AutoSelector: newBool(false), - }, - }, - expectedSelector: &LabelSelector{ - MatchLabels: map[string]string{"job": "selector"}, - }, - }, - // selector not copied from template labels, autoSelector=true - { - original: &Job{ - Spec: JobSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{"job": "selector"}, - }, - }, - AutoSelector: newBool(true), - }, - }, - expectedSelector: nil, - }, - } - - for i, testcase := range tests { - obj2 := roundTrip(t, runtime.Object(testcase.original)) - got, ok := obj2.(*Job) - if !ok { - t.Errorf("%d: unexpected object: %v", i, got) - t.FailNow() - } - if !reflect.DeepEqual(got.Spec.Selector, testcase.expectedSelector) { - t.Errorf("%d: got different selectors %#v %#v", i, got.Spec.Selector, testcase.expectedSelector) - } - } -} - -func TestSetDefaultReplicaSet(t *testing.T) { - tests := []struct { - rs *ReplicaSet - expectLabels bool - expectSelector bool - }{ - { - rs: &ReplicaSet{ - Spec: ReplicaSetSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: true, - }, - { - rs: &ReplicaSet{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: ReplicaSetSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: true, - }, - { - rs: &ReplicaSet{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "bar": "foo", - }, - }, - Spec: ReplicaSetSpec{ - Selector: &LabelSelector{ - MatchLabels: map[string]string{ - "some": "other", - }, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: false, - expectSelector: false, - }, - { - rs: &ReplicaSet{ - Spec: ReplicaSetSpec{ - Selector: &LabelSelector{ - MatchLabels: map[string]string{ - "some": "other", - }, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectLabels: true, - expectSelector: false, - }, - } - - for _, test := range tests { - rs := test.rs - obj2 := roundTrip(t, runtime.Object(rs)) - rs2, ok := obj2.(*ReplicaSet) - if !ok { - t.Errorf("unexpected object: %v", rs2) - t.FailNow() - } - if test.expectSelector != reflect.DeepEqual(rs2.Spec.Selector.MatchLabels, rs2.Spec.Template.Labels) { - if test.expectSelector { - t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Spec.Selector) - } else { - t.Errorf("unexpected equality: %v", rs.Spec.Selector) - } - } - if test.expectLabels != reflect.DeepEqual(rs2.Labels, rs2.Spec.Template.Labels) { - if test.expectLabels { - t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Labels) - } else { - t.Errorf("unexpected equality: %v", rs.Labels) - } - } - } -} - -func TestSetDefaultReplicaSetReplicas(t *testing.T) { - tests := []struct { - rs ReplicaSet - expectReplicas int32 - }{ - { - rs: ReplicaSet{ - Spec: ReplicaSetSpec{ - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 1, - }, - { - rs: ReplicaSet{ - Spec: ReplicaSetSpec{ - Replicas: newInt32(0), - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 0, - }, - { - rs: ReplicaSet{ - Spec: ReplicaSetSpec{ - Replicas: newInt32(3), - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - }, - expectReplicas: 3, - }, - } - - for _, test := range tests { - rs := &test.rs - obj2 := roundTrip(t, runtime.Object(rs)) - rs2, ok := obj2.(*ReplicaSet) - if !ok { - t.Errorf("unexpected object: %v", rs2) - t.FailNow() - } - if rs2.Spec.Replicas == nil { - t.Errorf("unexpected nil Replicas") - } else if test.expectReplicas != *rs2.Spec.Replicas { - t.Errorf("expected: %d replicas, got: %d", test.expectReplicas, *rs2.Spec.Replicas) - } - } -} - -func TestDefaultRequestIsNotSetForReplicaSet(t *testing.T) { - s := v1.PodSpec{} - s.Containers = []v1.Container{ - { - Resources: v1.ResourceRequirements{ - Limits: v1.ResourceList{ - v1.ResourceCPU: resource.MustParse("100m"), - }, - }, - }, - } - rs := &ReplicaSet{ - Spec: ReplicaSetSpec{ - Replicas: newInt32(3), - Template: v1.PodTemplateSpec{ - ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - Spec: s, - }, - }, - } - output := roundTrip(t, runtime.Object(rs)) - rs2 := output.(*ReplicaSet) - defaultRequest := rs2.Spec.Template.Spec.Containers[0].Resources.Requests - requestValue := defaultRequest[v1.ResourceCPU] - if requestValue.String() != "0" { - t.Errorf("Expected 0 request value, got: %s", requestValue.String()) - } -} - -func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { - data, err := runtime.Encode(api.Codecs.LegacyCodec(SchemeGroupVersion), obj) - if err != nil { - t.Errorf("%v\n %#v", err, obj) - return nil - } - obj2, err := runtime.Decode(api.Codecs.UniversalDecoder(), data) - if err != nil { - t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) - return nil - } - obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) - err = api.Scheme.Convert(obj2, obj3) - if err != nil { - t.Errorf("%v\nSource: %#v", err, obj2) - return nil - } - return obj3 -} - -func newInt32(val int32) *int32 { - p := new(int32) - *p = val - return p -} - -func newString(val string) *string { - p := new(string) - *p = val - return p -} - -func newBool(val bool) *bool { - b := new(bool) - *b = val - return b -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/validation/validation_test.go deleted file mode 100644 index 51e09597b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/extensions/validation/validation_test.go +++ /dev/null @@ -1,1845 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "fmt" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/controller/podautoscaler" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestValidateHorizontalPodAutoscaler(t *testing.T) { - successCases := []extensions.HorizontalPodAutoscaler{ - { - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - podautoscaler.HpaCustomMetricsTargetAnnotationName: "{\"items\":[{\"name\":\"qps\",\"value\":\"20\"}]}", - }, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateHorizontalPodAutoscaler(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []struct { - horizontalPodAutoscaler extensions.HorizontalPodAutoscaler - msg string - }{ - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Name: "myrc", Subresource: "scale"}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.kind: Required", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "..", Name: "myrc", Subresource: "scale"}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.kind: Invalid", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "ReplicationController", Subresource: "scale"}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.name: Required", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "ReplicationController", Name: "..", Subresource: "scale"}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.name: Invalid", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "ReplicationController", Name: "myrc", Subresource: ""}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.subresource: Required", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "ReplicationController", Name: "myrc", Subresource: ".."}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.subresource: Invalid", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{Name: "myautoscaler", Namespace: api.NamespaceDefault}, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{Kind: "ReplicationController", Name: "myrc", Subresource: "randomsubresource"}, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: 70}, - }, - }, - msg: "scaleRef.subresource: Unsupported", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Subresource: "scale", - }, - MinReplicas: newInt32(-1), - MaxReplicas: 5, - }, - }, - msg: "must be greater than 0", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Subresource: "scale", - }, - MinReplicas: newInt32(7), - MaxReplicas: 5, - }, - }, - msg: "must be greater than or equal to `minReplicas`", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - CPUUtilization: &extensions.CPUTargetUtilization{TargetPercentage: -70}, - }, - }, - msg: "must be greater than 0", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - podautoscaler.HpaCustomMetricsTargetAnnotationName: "broken", - }, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - msg: "failed to parse custom metrics target annotation", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - podautoscaler.HpaCustomMetricsTargetAnnotationName: "{}", - }, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - msg: "custom metrics target must not be empty", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - podautoscaler.HpaCustomMetricsTargetAnnotationName: "{\"items\":[{\"value\":\"20\"}]}", - }, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - msg: "missing custom metric target name", - }, - { - horizontalPodAutoscaler: extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "myautoscaler", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - podautoscaler.HpaCustomMetricsTargetAnnotationName: "{\"items\":[{\"name\":\"qps\",\"value\":\"0\"}]}", - }, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: "ReplicationController", - Name: "myrc", - Subresource: "scale", - }, - MinReplicas: newInt32(1), - MaxReplicas: 5, - }, - }, - msg: "custom metric target value must be greater than 0", - }, - } - - for _, c := range errorCases { - errs := ValidateHorizontalPodAutoscaler(&c.horizontalPodAutoscaler) - if len(errs) == 0 { - t.Errorf("expected failure for %q", c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("unexpected error: %q, expected: %q", errs[0], c.msg) - } - } -} - -func TestValidateDaemonSetStatusUpdate(t *testing.T) { - type dsUpdateTest struct { - old extensions.DaemonSet - update extensions.DaemonSet - } - - successCases := []dsUpdateTest{ - { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Status: extensions.DaemonSetStatus{ - CurrentNumberScheduled: 1, - NumberMisscheduled: 2, - DesiredNumberScheduled: 3, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Status: extensions.DaemonSetStatus{ - CurrentNumberScheduled: 1, - NumberMisscheduled: 1, - DesiredNumberScheduled: 3, - }, - }, - }, - } - - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateDaemonSetStatusUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]dsUpdateTest{ - "negative values": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - ResourceVersion: "10", - }, - Status: extensions.DaemonSetStatus{ - CurrentNumberScheduled: 1, - NumberMisscheduled: 2, - DesiredNumberScheduled: 3, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - ResourceVersion: "10", - }, - Status: extensions.DaemonSetStatus{ - CurrentNumberScheduled: -1, - NumberMisscheduled: -1, - DesiredNumberScheduled: -3, - }, - }, - }, - } - - for testName, errorCase := range errorCases { - if errs := ValidateDaemonSetStatusUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} - -func TestValidateDaemonSetUpdate(t *testing.T) { - validSelector := map[string]string{"a": "b"} - validSelector2 := map[string]string{"c": "d"} - invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - - validPodSpecAbc := api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - } - validPodSpecDef := api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "def", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - } - validPodSpecNodeSelector := api.PodSpec{ - NodeSelector: validSelector, - NodeName: "xyz", - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - } - validPodSpecVolume := api.PodSpec{ - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - } - - validPodTemplateAbc := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: validPodSpecAbc, - }, - } - validPodTemplateNodeSelector := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: validPodSpecNodeSelector, - }, - } - validPodTemplateAbc2 := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector2, - }, - Spec: validPodSpecAbc, - }, - } - validPodTemplateDef := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector2, - }, - Spec: validPodSpecDef, - }, - } - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidSelector, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: validPodSpecVolume, - }, - } - - type dsUpdateTest struct { - old extensions.DaemonSet - update extensions.DaemonSet - } - successCases := []dsUpdateTest{ - { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - }, - { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector2}, - Template: validPodTemplateAbc2.Template, - }, - }, - }, - { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateNodeSelector.Template, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateDaemonSetUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]dsUpdateTest{ - "change daemon name": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - }, - "invalid selector": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: invalidSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - }, - "invalid pod": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: invalidPodTemplate.Template, - }, - }, - }, - "change container image": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateDef.Template, - }, - }, - }, - "read-write volume": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - }, - "invalid update strategy": { - old: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - update: extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: invalidSelector}, - Template: validPodTemplateAbc.Template, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidateDaemonSetUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} - -func TestValidateDaemonSet(t *testing.T) { - validSelector := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidSelector, - }, - }, - } - successCases := []extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateDaemonSet(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]extensions.DaemonSet{ - "zero-length ID": { - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - "missing-namespace": { - ObjectMeta: api.ObjectMeta{Name: "abc-123"}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - "nil selector": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Template: validPodTemplate.Template, - }, - }, - "empty selector": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{}, - Template: validPodTemplate.Template, - }, - }, - "selector_doesnt_match": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: validPodTemplate.Template, - }, - }, - "invalid template": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - }, - }, - "invalid_label": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - "invalid_label 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: invalidPodTemplate.Template, - }, - }, - "invalid_annotation": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: validPodTemplate.Template, - }, - }, - "invalid restart policy 1": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - }, - }, - }, - "invalid restart policy 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validSelector}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validSelector, - }, - }, - }, - }, - } - for k, v := range errorCases { - errs := ValidateDaemonSet(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - field := errs[i].Field - if !strings.HasPrefix(field, "spec.template.") && - !strings.HasPrefix(field, "spec.updateStrategy") && - field != "metadata.name" && - field != "metadata.namespace" && - field != "spec.selector" && - field != "spec.template" && - field != "GCEPersistentDisk.ReadOnly" && - field != "spec.template.labels" && - field != "metadata.annotations" && - field != "metadata.labels" { - t.Errorf("%s: missing prefix for: %v", k, errs[i]) - } - } - } -} - -func validDeployment() *extensions.Deployment { - return &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.DeploymentSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{ - "name": "abc", - }, - }, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "name": "abc", - }, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSDefault, - Containers: []api.Container{ - { - Name: "nginx", - Image: "image", - ImagePullPolicy: api.PullNever, - }, - }, - }, - }, - RollbackTo: &extensions.RollbackConfig{ - Revision: 1, - }, - }, - } -} - -func TestValidateDeployment(t *testing.T) { - successCases := []*extensions.Deployment{ - validDeployment(), - } - for _, successCase := range successCases { - if errs := ValidateDeployment(successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]*extensions.Deployment{} - errorCases["metadata.name: Required value"] = &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Namespace: api.NamespaceDefault, - }, - } - // selector should match the labels in pod template. - invalidSelectorDeployment := validDeployment() - invalidSelectorDeployment.Spec.Selector = &unversioned.LabelSelector{ - MatchLabels: map[string]string{ - "name": "def", - }, - } - errorCases["`selector` does not match template `labels`"] = invalidSelectorDeployment - - // RestartPolicy should be always. - invalidRestartPolicyDeployment := validDeployment() - invalidRestartPolicyDeployment.Spec.Template.Spec.RestartPolicy = api.RestartPolicyNever - errorCases["Unsupported value: \"Never\""] = invalidRestartPolicyDeployment - - // rollingUpdate should be nil for recreate. - invalidRecreateDeployment := validDeployment() - invalidRecreateDeployment.Spec.Strategy = extensions.DeploymentStrategy{ - Type: extensions.RecreateDeploymentStrategyType, - RollingUpdate: &extensions.RollingUpdateDeployment{}, - } - errorCases["may not be specified when strategy `type` is 'Recreate'"] = invalidRecreateDeployment - - // MaxSurge should be in the form of 20%. - invalidMaxSurgeDeployment := validDeployment() - invalidMaxSurgeDeployment.Spec.Strategy = extensions.DeploymentStrategy{ - Type: extensions.RollingUpdateDeploymentStrategyType, - RollingUpdate: &extensions.RollingUpdateDeployment{ - MaxSurge: intstr.FromString("20Percent"), - }, - } - errorCases["must be an integer or percentage"] = invalidMaxSurgeDeployment - - // MaxSurge and MaxUnavailable cannot both be zero. - invalidRollingUpdateDeployment := validDeployment() - invalidRollingUpdateDeployment.Spec.Strategy = extensions.DeploymentStrategy{ - Type: extensions.RollingUpdateDeploymentStrategyType, - RollingUpdate: &extensions.RollingUpdateDeployment{ - MaxSurge: intstr.FromString("0%"), - MaxUnavailable: intstr.FromInt(0), - }, - } - errorCases["may not be 0 when `maxSurge` is 0"] = invalidRollingUpdateDeployment - - // MaxUnavailable should not be more than 100%. - invalidMaxUnavailableDeployment := validDeployment() - invalidMaxUnavailableDeployment.Spec.Strategy = extensions.DeploymentStrategy{ - Type: extensions.RollingUpdateDeploymentStrategyType, - RollingUpdate: &extensions.RollingUpdateDeployment{ - MaxUnavailable: intstr.FromString("110%"), - }, - } - errorCases["must not be greater than 100%"] = invalidMaxUnavailableDeployment - - // Rollback.Revision must be non-negative - invalidRollbackRevisionDeployment := validDeployment() - invalidRollbackRevisionDeployment.Spec.RollbackTo.Revision = -3 - errorCases["must be greater than or equal to 0"] = invalidRollbackRevisionDeployment - - for k, v := range errorCases { - errs := ValidateDeployment(v) - if len(errs) == 0 { - t.Errorf("[%s] expected failure", k) - } else if !strings.Contains(errs[0].Error(), k) { - t.Errorf("unexpected error: %q, expected: %q", errs[0].Error(), k) - } - } -} - -func validDeploymentRollback() *extensions.DeploymentRollback { - return &extensions.DeploymentRollback{ - Name: "abc", - UpdatedAnnotations: map[string]string{ - "created-by": "abc", - }, - RollbackTo: extensions.RollbackConfig{ - Revision: 1, - }, - } -} - -func TestValidateDeploymentRollback(t *testing.T) { - noAnnotation := validDeploymentRollback() - noAnnotation.UpdatedAnnotations = nil - successCases := []*extensions.DeploymentRollback{ - validDeploymentRollback(), - noAnnotation, - } - for _, successCase := range successCases { - if errs := ValidateDeploymentRollback(successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]*extensions.DeploymentRollback{} - invalidNoName := validDeploymentRollback() - invalidNoName.Name = "" - errorCases["name: Required value"] = invalidNoName - - for k, v := range errorCases { - errs := ValidateDeploymentRollback(v) - if len(errs) == 0 { - t.Errorf("[%s] expected failure", k) - } else if !strings.Contains(errs[0].Error(), k) { - t.Errorf("unexpected error: %q, expected: %q", errs[0].Error(), k) - } - } -} - -type ingressRules map[string]string - -func TestValidateIngress(t *testing.T) { - defaultBackend := extensions.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(80), - } - - newValid := func() extensions.Ingress { - return extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.IngressSpec{ - Backend: &extensions.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(80), - }, - Rules: []extensions.IngressRule{ - { - Host: "foo.bar.com", - IngressRuleValue: extensions.IngressRuleValue{ - HTTP: &extensions.HTTPIngressRuleValue{ - Paths: []extensions.HTTPIngressPath{ - { - Path: "/foo", - Backend: defaultBackend, - }, - }, - }, - }, - }, - }, - }, - Status: extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.1"}, - }, - }, - }, - } - } - servicelessBackend := newValid() - servicelessBackend.Spec.Backend.ServiceName = "" - invalidNameBackend := newValid() - invalidNameBackend.Spec.Backend.ServiceName = "defaultBackend" - noPortBackend := newValid() - noPortBackend.Spec.Backend = &extensions.IngressBackend{ServiceName: defaultBackend.ServiceName} - noForwardSlashPath := newValid() - noForwardSlashPath.Spec.Rules[0].IngressRuleValue.HTTP.Paths = []extensions.HTTPIngressPath{ - { - Path: "invalid", - Backend: defaultBackend, - }, - } - noPaths := newValid() - noPaths.Spec.Rules[0].IngressRuleValue.HTTP.Paths = []extensions.HTTPIngressPath{} - badHost := newValid() - badHost.Spec.Rules[0].Host = "foobar:80" - badRegexPath := newValid() - badPathExpr := "/invalid[" - badRegexPath.Spec.Rules[0].IngressRuleValue.HTTP.Paths = []extensions.HTTPIngressPath{ - { - Path: badPathExpr, - Backend: defaultBackend, - }, - } - badPathErr := fmt.Sprintf("spec.rules[0].http.paths[0].path: Invalid value: '%v'", badPathExpr) - hostIP := "127.0.0.1" - badHostIP := newValid() - badHostIP.Spec.Rules[0].Host = hostIP - badHostIPErr := fmt.Sprintf("spec.rules[0].host: Invalid value: '%v'", hostIP) - - errorCases := map[string]extensions.Ingress{ - "spec.backend.serviceName: Required value": servicelessBackend, - "spec.backend.serviceName: Invalid value": invalidNameBackend, - "spec.backend.servicePort: Invalid value": noPortBackend, - "spec.rules[0].host: Invalid value": badHost, - "spec.rules[0].http.paths: Required value": noPaths, - "spec.rules[0].http.paths[0].path: Invalid value": noForwardSlashPath, - } - errorCases[badPathErr] = badRegexPath - errorCases[badHostIPErr] = badHostIP - - for k, v := range errorCases { - errs := ValidateIngress(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %q", k) - } else { - s := strings.Split(k, ":") - err := errs[0] - if err.Field != s[0] || !strings.Contains(err.Error(), s[1]) { - t.Errorf("unexpected error: %q, expected: %q", err, k) - } - } - } -} - -func TestValidateIngressStatusUpdate(t *testing.T) { - defaultBackend := extensions.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(80), - } - - newValid := func() extensions.Ingress { - return extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: api.NamespaceDefault, - ResourceVersion: "9", - }, - Spec: extensions.IngressSpec{ - Backend: &extensions.IngressBackend{ - ServiceName: "default-backend", - ServicePort: intstr.FromInt(80), - }, - Rules: []extensions.IngressRule{ - { - Host: "foo.bar.com", - IngressRuleValue: extensions.IngressRuleValue{ - HTTP: &extensions.HTTPIngressRuleValue{ - Paths: []extensions.HTTPIngressPath{ - { - Path: "/foo", - Backend: defaultBackend, - }, - }, - }, - }, - }, - }, - }, - Status: extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.1", Hostname: "foo.bar.com"}, - }, - }, - }, - } - } - oldValue := newValid() - newValue := newValid() - newValue.Status = extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.2", Hostname: "foo.com"}, - }, - }, - } - invalidIP := newValid() - invalidIP.Status = extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "abcd", Hostname: "foo.com"}, - }, - }, - } - invalidHostname := newValid() - invalidHostname.Status = extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.1", Hostname: "127.0.0.1"}, - }, - }, - } - - errs := ValidateIngressStatusUpdate(&newValue, &oldValue) - if len(errs) != 0 { - t.Errorf("Unexpected error %v", errs) - } - - errorCases := map[string]extensions.Ingress{ - "status.loadBalancer.ingress[0].ip: Invalid value": invalidIP, - "status.loadBalancer.ingress[0].hostname: Invalid value": invalidHostname, - } - for k, v := range errorCases { - errs := ValidateIngressStatusUpdate(&v, &oldValue) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } else { - s := strings.Split(k, ":") - err := errs[0] - if err.Field != s[0] || !strings.Contains(err.Error(), s[1]) { - t.Errorf("unexpected error: %q, expected: %q", err, k) - } - } - } -} - -func TestValidateScale(t *testing.T) { - successCases := []extensions.Scale{ - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ScaleSpec{ - Replicas: 1, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ScaleSpec{ - Replicas: 10, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ScaleSpec{ - Replicas: 0, - }, - }, - } - - for _, successCase := range successCases { - if errs := ValidateScale(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := []struct { - scale extensions.Scale - msg string - }{ - { - scale: extensions.Scale{ - ObjectMeta: api.ObjectMeta{ - Name: "frontend", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ScaleSpec{ - Replicas: -1, - }, - }, - msg: "must be greater than or equal to 0", - }, - } - - for _, c := range errorCases { - if errs := ValidateScale(&c.scale); len(errs) == 0 { - t.Errorf("expected failure for %s", c.msg) - } else if !strings.Contains(errs[0].Error(), c.msg) { - t.Errorf("unexpected error: %v, expected: %s", errs[0], c.msg) - } - } -} - -func TestValidateReplicaSetStatusUpdate(t *testing.T) { - validLabels := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - type rcUpdateTest struct { - old extensions.ReplicaSet - update extensions.ReplicaSet - } - successCases := []rcUpdateTest{ - { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - Status: extensions.ReplicaSetStatus{ - Replicas: 2, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 3, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - Status: extensions.ReplicaSetStatus{ - Replicas: 4, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateReplicaSetStatusUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]rcUpdateTest{ - "negative replicas": { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - Status: extensions.ReplicaSetStatus{ - Replicas: 3, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - Status: extensions.ReplicaSetStatus{ - Replicas: -3, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidateReplicaSetStatusUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } - -} - -func TestValidateReplicaSetUpdate(t *testing.T) { - validLabels := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - }, - }, - } - invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidLabels, - }, - }, - } - type rcUpdateTest struct { - old extensions.ReplicaSet - update extensions.ReplicaSet - } - successCases := []rcUpdateTest{ - { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 3, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - }, - } - for _, successCase := range successCases { - successCase.old.ObjectMeta.ResourceVersion = "1" - successCase.update.ObjectMeta.ResourceVersion = "1" - if errs := ValidateReplicaSetUpdate(&successCase.update, &successCase.old); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - errorCases := map[string]rcUpdateTest{ - "more than one read/write": { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - }, - "invalid selector": { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: invalidLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - "invalid pod": { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: invalidPodTemplate.Template, - }, - }, - }, - "negative replicas": { - old: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - update: extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: -1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - }, - } - for testName, errorCase := range errorCases { - if errs := ValidateReplicaSetUpdate(&errorCase.update, &errorCase.old); len(errs) == 0 { - t.Errorf("expected failure: %s", testName) - } - } -} - -func TestValidateReplicaSet(t *testing.T) { - validLabels := map[string]string{"a": "b"} - validPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - readWriteVolumePodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "gcepd", VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{PDName: "my-PD", FSType: "ext4", Partition: 1, ReadOnly: false}}}}, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "abc", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - }, - } - invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"} - invalidPodTemplate := api.PodTemplate{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: api.ObjectMeta{ - Labels: invalidLabels, - }, - }, - } - successCases := []extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - } - for _, successCase := range successCases { - if errs := ValidateReplicaSet(&successCase); len(errs) != 0 { - t.Errorf("expected success: %v", errs) - } - } - - errorCases := map[string]extensions.ReplicaSet{ - "zero-length ID": { - ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "missing-namespace": { - ObjectMeta: api.ObjectMeta{Name: "abc-123"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "empty selector": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Template: validPodTemplate.Template, - }, - }, - "selector_doesnt_match": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: validPodTemplate.Template, - }, - }, - "invalid manifest": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - }, - }, - "read-write persistent disk with > 1 pod": { - ObjectMeta: api.ObjectMeta{Name: "abc"}, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: readWriteVolumePodTemplate.Template, - }, - }, - "negative_replicas": { - ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault}, - Spec: extensions.ReplicaSetSpec{ - Replicas: -1, - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - }, - }, - "invalid_label": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "invalid_label 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Template: invalidPodTemplate.Template, - }, - }, - "invalid_annotation": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - Annotations: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - }, - }, - "invalid restart policy 1": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - }, - }, - }, - "invalid restart policy 2": { - ObjectMeta: api.ObjectMeta{ - Name: "abc-123", - Namespace: api.NamespaceDefault, - }, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: api.ObjectMeta{ - Labels: validLabels, - }, - }, - }, - }, - } - for k, v := range errorCases { - errs := ValidateReplicaSet(&v) - if len(errs) == 0 { - t.Errorf("expected failure for %s", k) - } - for i := range errs { - field := errs[i].Field - if !strings.HasPrefix(field, "spec.template.") && - field != "metadata.name" && - field != "metadata.namespace" && - field != "spec.selector" && - field != "spec.template" && - field != "GCEPersistentDisk.ReadOnly" && - field != "spec.replicas" && - field != "spec.template.labels" && - field != "metadata.annotations" && - field != "metadata.labels" && - field != "status.replicas" { - t.Errorf("%s: missing prefix for: %v", k, errs[i]) - } - } - } -} - -func newInt32(val int32) *int32 { - p := new(int32) - *p = val - return p -} - -func TestValidatePodSecurityPolicy(t *testing.T) { - validSCC := func() *extensions.PodSecurityPolicy { - return &extensions.PodSecurityPolicy{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: extensions.PodSecurityPolicySpec{ - SELinux: extensions.SELinuxStrategyOptions{ - Rule: extensions.SELinuxStrategyRunAsAny, - }, - RunAsUser: extensions.RunAsUserStrategyOptions{ - Rule: extensions.RunAsUserStrategyRunAsAny, - }, - }, - } - } - - noUserOptions := validSCC() - noUserOptions.Spec.RunAsUser.Rule = "" - - noSELinuxOptions := validSCC() - noSELinuxOptions.Spec.SELinux.Rule = "" - - invalidUserStratRule := validSCC() - invalidUserStratRule.Spec.RunAsUser.Rule = "invalid" - - invalidSELinuxStratRule := validSCC() - invalidSELinuxStratRule.Spec.SELinux.Rule = "invalid" - - missingObjectMetaName := validSCC() - missingObjectMetaName.ObjectMeta.Name = "" - - invalidRangeMinGreaterThanMax := validSCC() - invalidRangeMinGreaterThanMax.Spec.RunAsUser.Ranges = []extensions.IDRange{ - {Min: 2, Max: 1}, - } - - invalidRangeNegativeMin := validSCC() - invalidRangeNegativeMin.Spec.RunAsUser.Ranges = []extensions.IDRange{ - {Min: -1, Max: 10}, - } - - invalidRangeNegativeMax := validSCC() - invalidRangeNegativeMax.Spec.RunAsUser.Ranges = []extensions.IDRange{ - {Min: 1, Max: -10}, - } - - errorCases := map[string]struct { - scc *extensions.PodSecurityPolicy - errorDetail string - }{ - "no user options": { - scc: noUserOptions, - errorDetail: "supported values: MustRunAs, MustRunAsNonRoot, RunAsAny", - }, - "no selinux options": { - scc: noSELinuxOptions, - errorDetail: "supported values: MustRunAs, RunAsAny", - }, - "invalid user strategy rule": { - scc: invalidUserStratRule, - errorDetail: "supported values: MustRunAs, MustRunAsNonRoot, RunAsAny", - }, - "invalid selinux strategy rule": { - scc: invalidSELinuxStratRule, - errorDetail: "supported values: MustRunAs, RunAsAny", - }, - "missing object meta name": { - scc: missingObjectMetaName, - errorDetail: "name or generateName is required", - }, - "invalid range min greater than max": { - scc: invalidRangeMinGreaterThanMax, - errorDetail: "min cannot be greater than max", - }, - "invalid range negative min": { - scc: invalidRangeNegativeMin, - errorDetail: "min cannot be negative", - }, - "invalid range negative max": { - scc: invalidRangeNegativeMax, - errorDetail: "max cannot be negative", - }, - } - - for k, v := range errorCases { - if errs := ValidatePodSecurityPolicy(v.scc); len(errs) == 0 || errs[0].Detail != v.errorDetail { - t.Errorf("Expected error with detail %s for %s, got %v", v.errorDetail, k, errs[0].Detail) - } - } - - mustRunAs := validSCC() - mustRunAs.Spec.RunAsUser.Rule = extensions.RunAsUserStrategyMustRunAs - mustRunAs.Spec.RunAsUser.Ranges = []extensions.IDRange{ - { - Min: 1, - Max: 1, - }, - } - mustRunAs.Spec.SELinux.Rule = extensions.SELinuxStrategyMustRunAs - - runAsNonRoot := validSCC() - runAsNonRoot.Spec.RunAsUser.Rule = extensions.RunAsUserStrategyMustRunAsNonRoot - - successCases := map[string]struct { - scc *extensions.PodSecurityPolicy - }{ - "must run as": { - scc: mustRunAs, - }, - "run as any": { - scc: validSCC(), - }, - "run as non-root (user only)": { - scc: runAsNonRoot, - }, - } - - for k, v := range successCases { - if errs := ValidatePodSecurityPolicy(v.scc); len(errs) != 0 { - t.Errorf("Expected success for %s, got %v", k, errs) - } - } -} - -func newBool(val bool) *bool { - p := new(bool) - *p = val - return p -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go deleted file mode 100644 index d9ce117ae..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - unversionedvalidation "k8s.io/kubernetes/pkg/api/unversioned/validation" - extensionsvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" - "k8s.io/kubernetes/pkg/apis/policy" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func ValidatePodDisruptionBudgetSpec(spec policy.PodDisruptionBudgetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - allErrs = append(allErrs, extensionsvalidation.ValidatePositiveIntOrPercent(spec.MinAvailable, fldPath.Child("minAvailable"))...) - allErrs = append(allErrs, extensionsvalidation.IsNotMoreThan100Percent(spec.MinAvailable, fldPath.Child("minAvailable"))...) - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - - return allErrs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation_test.go deleted file mode 100644 index 9b0737156..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/apis/policy/validation/validation_test.go +++ /dev/null @@ -1,62 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 validation - -import ( - "testing" - - "k8s.io/kubernetes/pkg/apis/policy" - "k8s.io/kubernetes/pkg/util/intstr" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestValidatePodDisruptionBudgetSpec(t *testing.T) { - successCases := []intstr.IntOrString{ - intstr.FromString("0%"), - intstr.FromString("1%"), - intstr.FromString("100%"), - intstr.FromInt(0), - intstr.FromInt(1), - intstr.FromInt(100), - } - for _, c := range successCases { - spec := policy.PodDisruptionBudgetSpec{ - MinAvailable: c, - } - errs := ValidatePodDisruptionBudgetSpec(spec, field.NewPath("foo")) - if len(errs) != 0 { - t.Errorf("unexpected failure %v for %v", errs, spec) - } - } - - failureCases := []intstr.IntOrString{ - intstr.FromString("1.1%"), - intstr.FromString("nope"), - intstr.FromString("-1%"), - intstr.FromString("101%"), - intstr.FromInt(-1), - } - for _, c := range failureCases { - spec := policy.PodDisruptionBudgetSpec{ - MinAvailable: c, - } - errs := ValidatePodDisruptionBudgetSpec(spec, field.NewPath("foo")) - if len(errs) == 0 { - t.Errorf("unexpected success for %v", spec) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/delta_fifo_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/delta_fifo_test.go deleted file mode 100644 index 8efd982b5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/delta_fifo_test.go +++ /dev/null @@ -1,385 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "reflect" - "testing" - "time" -) - -// helper function to reduce stuttering -func testPop(f *DeltaFIFO) testFifoObject { - return f.Pop().(Deltas).Newest().Object.(testFifoObject) -} - -// keyLookupFunc adapts a raw function to be a KeyLookup. -type keyLookupFunc func() []string - -// ListKeys just calls kl. -func (kl keyLookupFunc) ListKeys() []string { - return kl() -} - -// GetByKey returns the key if it exists in the list returned by kl. -func (kl keyLookupFunc) GetByKey(key string) (interface{}, bool, error) { - for _, v := range kl() { - if v == key { - return key, true, nil - } - } - return nil, false, nil -} - -func TestDeltaFIFO_basic(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - const amount = 500 - go func() { - for i := 0; i < amount; i++ { - f.Add(mkFifoObj(string([]rune{'a', rune(i)}), i+1)) - } - }() - go func() { - for u := uint64(0); u < amount; u++ { - f.Add(mkFifoObj(string([]rune{'b', rune(u)}), u+1)) - } - }() - - lastInt := int(0) - lastUint := uint64(0) - for i := 0; i < amount*2; i++ { - switch obj := testPop(f).val.(type) { - case int: - if obj <= lastInt { - t.Errorf("got %v (int) out of order, last was %v", obj, lastInt) - } - lastInt = obj - case uint64: - if obj <= lastUint { - t.Errorf("got %v (uint) out of order, last was %v", obj, lastUint) - } else { - lastUint = obj - } - default: - t.Fatalf("unexpected type %#v", obj) - } - } -} - -func TestDeltaFIFO_compressorWorks(t *testing.T) { - oldestTypes := []DeltaType{} - f := NewDeltaFIFO( - testFifoObjectKeyFunc, - // This function just keeps the most recent delta - // and puts deleted ones in the list. - DeltaCompressorFunc(func(d Deltas) Deltas { - if n := len(d); n > 1 { - oldestTypes = append(oldestTypes, d[0].Type) - d = d[1:] - } - return d - }), - nil, - ) - f.Add(mkFifoObj("foo", 10)) - f.Update(mkFifoObj("foo", 12)) - f.Replace([]interface{}{mkFifoObj("foo", 20)}, "0") - f.Delete(mkFifoObj("foo", 22)) - f.Add(mkFifoObj("foo", 25)) // flush the last one out - expect := []DeltaType{Added, Updated, Sync, Deleted} - if e, a := expect, oldestTypes; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } - if e, a := (Deltas{{Added, mkFifoObj("foo", 25)}}), f.Pop().(Deltas); !reflect.DeepEqual(e, a) { - t.Fatalf("Expected %#v, got %#v", e, a) - } - -} - -func TestDeltaFIFO_addUpdate(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - f.Add(mkFifoObj("foo", 10)) - f.Update(mkFifoObj("foo", 12)) - f.Delete(mkFifoObj("foo", 15)) - - if e, a := []interface{}{mkFifoObj("foo", 15)}, f.List(); !reflect.DeepEqual(e, a) { - t.Errorf("Expected %+v, got %+v", e, a) - } - if e, a := []string{"foo"}, f.ListKeys(); !reflect.DeepEqual(e, a) { - t.Errorf("Expected %+v, got %+v", e, a) - } - - got := make(chan testFifoObject, 2) - go func() { - for { - obj := f.Pop().(Deltas).Newest().Object.(testFifoObject) - t.Logf("got a thing %#v", obj) - t.Logf("D len: %v", len(f.queue)) - got <- obj - } - }() - - first := <-got - if e, a := 15, first.val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - select { - case unexpected := <-got: - t.Errorf("Got second value %v", unexpected.val) - case <-time.After(50 * time.Millisecond): - } - _, exists, _ := f.Get(mkFifoObj("foo", "")) - if exists { - t.Errorf("item did not get removed") - } -} - -func TestDeltaFIFO_enqueueingNoLister(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - f.Add(mkFifoObj("foo", 10)) - f.Update(mkFifoObj("bar", 15)) - f.Add(mkFifoObj("qux", 17)) - f.Delete(mkFifoObj("qux", 18)) - - // This delete does not enqueue anything because baz doesn't exist. - f.Delete(mkFifoObj("baz", 20)) - - expectList := []int{10, 15, 18} - for _, expect := range expectList { - if e, a := expect, testPop(f).val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - } - if e, a := 0, len(f.items); e != a { - t.Errorf("queue unexpectedly not empty: %v != %v\n%#v", e, a, f.items) - } -} - -func TestDeltaFIFO_enqueueingWithLister(t *testing.T) { - f := NewDeltaFIFO( - testFifoObjectKeyFunc, - nil, - keyLookupFunc(func() []string { - return []string{"foo", "bar", "baz"} - }), - ) - f.Add(mkFifoObj("foo", 10)) - f.Update(mkFifoObj("bar", 15)) - - // This delete does enqueue the deletion, because "baz" is in the key lister. - f.Delete(mkFifoObj("baz", 20)) - - expectList := []int{10, 15, 20} - for _, expect := range expectList { - if e, a := expect, testPop(f).val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - } - if e, a := 0, len(f.items); e != a { - t.Errorf("queue unexpectedly not empty: %v != %v", e, a) - } -} - -func TestDeltaFIFO_addReplace(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - f.Add(mkFifoObj("foo", 10)) - f.Replace([]interface{}{mkFifoObj("foo", 15)}, "0") - got := make(chan testFifoObject, 2) - go func() { - for { - got <- testPop(f) - } - }() - - first := <-got - if e, a := 15, first.val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - select { - case unexpected := <-got: - t.Errorf("Got second value %v", unexpected.val) - case <-time.After(50 * time.Millisecond): - } - _, exists, _ := f.Get(mkFifoObj("foo", "")) - if exists { - t.Errorf("item did not get removed") - } -} - -func TestDeltaFIFO_ReplaceMakesDeletions(t *testing.T) { - f := NewDeltaFIFO( - testFifoObjectKeyFunc, - nil, - keyLookupFunc(func() []string { - return []string{"foo", "bar", "baz"} - }), - ) - f.Delete(mkFifoObj("baz", 10)) - f.Replace([]interface{}{mkFifoObj("foo", 5)}, "0") - - expectedList := []Deltas{ - {{Deleted, mkFifoObj("baz", 10)}}, - {{Sync, mkFifoObj("foo", 5)}}, - // Since "bar" didn't have a delete event and wasn't in the Replace list - // it should get a tombstone key with the right Obj. - {{Deleted, DeletedFinalStateUnknown{Key: "bar", Obj: "bar"}}}, - } - - for _, expected := range expectedList { - cur := f.Pop().(Deltas) - if e, a := expected, cur; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } - } -} - -func TestDeltaFIFO_detectLineJumpers(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - - f.Add(mkFifoObj("foo", 10)) - f.Add(mkFifoObj("bar", 1)) - f.Add(mkFifoObj("foo", 11)) - f.Add(mkFifoObj("foo", 13)) - f.Add(mkFifoObj("zab", 30)) - - if e, a := 13, testPop(f).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - f.Add(mkFifoObj("foo", 14)) // ensure foo doesn't jump back in line - - if e, a := 1, testPop(f).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - if e, a := 30, testPop(f).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - if e, a := 14, testPop(f).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } -} - -func TestDeltaFIFO_addIfNotPresent(t *testing.T) { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - - f.Add(mkFifoObj("b", 3)) - b3 := f.Pop() - f.Add(mkFifoObj("c", 4)) - c4 := f.Pop() - if e, a := 0, len(f.items); e != a { - t.Fatalf("Expected %v, got %v items in queue", e, a) - } - - f.Add(mkFifoObj("a", 1)) - f.Add(mkFifoObj("b", 2)) - f.AddIfNotPresent(b3) - f.AddIfNotPresent(c4) - - if e, a := 3, len(f.items); a != e { - t.Fatalf("expected queue length %d, got %d", e, a) - } - - expectedValues := []int{1, 2, 4} - for _, expected := range expectedValues { - if actual := testPop(f).val; actual != expected { - t.Fatalf("expected value %d, got %d", expected, actual) - } - } -} - -func TestDeltaFIFO_KeyOf(t *testing.T) { - f := DeltaFIFO{keyFunc: testFifoObjectKeyFunc} - - table := []struct { - obj interface{} - key string - }{ - {obj: testFifoObject{name: "A"}, key: "A"}, - {obj: DeletedFinalStateUnknown{Key: "B", Obj: nil}, key: "B"}, - {obj: Deltas{{Object: testFifoObject{name: "C"}}}, key: "C"}, - {obj: Deltas{{Object: DeletedFinalStateUnknown{Key: "D", Obj: nil}}}, key: "D"}, - } - - for _, item := range table { - got, err := f.KeyOf(item.obj) - if err != nil { - t.Errorf("Unexpected error for %q: %v", item.obj, err) - continue - } - if e, a := item.key, got; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - } -} - -func TestDeltaFIFO_HasSynced(t *testing.T) { - tests := []struct { - actions []func(f *DeltaFIFO) - expectedSynced bool - }{ - { - actions: []func(f *DeltaFIFO){}, - expectedSynced: false, - }, - { - actions: []func(f *DeltaFIFO){ - func(f *DeltaFIFO) { f.Add(mkFifoObj("a", 1)) }, - }, - expectedSynced: true, - }, - { - actions: []func(f *DeltaFIFO){ - func(f *DeltaFIFO) { f.Replace([]interface{}{}, "0") }, - }, - expectedSynced: true, - }, - { - actions: []func(f *DeltaFIFO){ - func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - }, - expectedSynced: false, - }, - { - actions: []func(f *DeltaFIFO){ - func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - func(f *DeltaFIFO) { f.Pop() }, - }, - expectedSynced: false, - }, - { - actions: []func(f *DeltaFIFO){ - func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - func(f *DeltaFIFO) { f.Pop() }, - func(f *DeltaFIFO) { f.Pop() }, - }, - expectedSynced: true, - }, - } - - for i, test := range tests { - f := NewDeltaFIFO(testFifoObjectKeyFunc, nil, nil) - - for _, action := range test.actions { - action(f) - } - if e, a := test.expectedSynced, f.HasSynced(); a != e { - t.Errorf("test case %v failed, expected: %v , got %v", i, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/expiration_cache_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/expiration_cache_test.go deleted file mode 100644 index 04a05786f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/expiration_cache_test.go +++ /dev/null @@ -1,189 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" -) - -func TestTTLExpirationBasic(t *testing.T) { - testObj := testStoreObject{id: "foo", val: "bar"} - deleteChan := make(chan string, 1) - ttlStore := NewFakeExpirationStore( - testStoreKeyFunc, deleteChan, - &FakeExpirationPolicy{ - NeverExpire: sets.NewString(), - RetrieveKeyFunc: func(obj interface{}) (string, error) { - return obj.(*timestampedEntry).obj.(testStoreObject).id, nil - }, - }, - util.RealClock{}, - ) - err := ttlStore.Add(testObj) - if err != nil { - t.Errorf("Unable to add obj %#v", testObj) - } - item, exists, err := ttlStore.Get(testObj) - if err != nil { - t.Errorf("Failed to get from store, %v", err) - } - if exists || item != nil { - t.Errorf("Got unexpected item %#v", item) - } - key, _ := testStoreKeyFunc(testObj) - select { - case delKey := <-deleteChan: - if delKey != key { - t.Errorf("Unexpected delete for key %s", key) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Unexpected timeout waiting on delete") - } - close(deleteChan) -} - -func TestReAddExpiredItem(t *testing.T) { - deleteChan := make(chan string, 1) - exp := &FakeExpirationPolicy{ - NeverExpire: sets.NewString(), - RetrieveKeyFunc: func(obj interface{}) (string, error) { - return obj.(*timestampedEntry).obj.(testStoreObject).id, nil - }, - } - ttlStore := NewFakeExpirationStore( - testStoreKeyFunc, deleteChan, exp, util.RealClock{}) - testKey := "foo" - testObj := testStoreObject{id: testKey, val: "bar"} - err := ttlStore.Add(testObj) - if err != nil { - t.Errorf("Unable to add obj %#v", testObj) - } - - // This get will expire the item. - item, exists, err := ttlStore.Get(testObj) - if err != nil { - t.Errorf("Failed to get from store, %v", err) - } - if exists || item != nil { - t.Errorf("Got unexpected item %#v", item) - } - - key, _ := testStoreKeyFunc(testObj) - differentValue := "different_bar" - err = ttlStore.Add( - testStoreObject{id: testKey, val: differentValue}) - if err != nil { - t.Errorf("Failed to add second value") - } - - select { - case delKey := <-deleteChan: - if delKey != key { - t.Errorf("Unexpected delete for key %s", key) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Unexpected timeout waiting on delete") - } - exp.NeverExpire = sets.NewString(testKey) - item, exists, err = ttlStore.GetByKey(testKey) - if err != nil { - t.Errorf("Failed to get from store, %v", err) - } - if !exists || item == nil || item.(testStoreObject).val != differentValue { - t.Errorf("Got unexpected item %#v", item) - } - close(deleteChan) -} - -func TestTTLList(t *testing.T) { - testObjs := []testStoreObject{ - {id: "foo", val: "bar"}, - {id: "foo1", val: "bar1"}, - {id: "foo2", val: "bar2"}, - } - expireKeys := sets.NewString(testObjs[0].id, testObjs[2].id) - deleteChan := make(chan string, len(testObjs)) - defer close(deleteChan) - - ttlStore := NewFakeExpirationStore( - testStoreKeyFunc, deleteChan, - &FakeExpirationPolicy{ - NeverExpire: sets.NewString(testObjs[1].id), - RetrieveKeyFunc: func(obj interface{}) (string, error) { - return obj.(*timestampedEntry).obj.(testStoreObject).id, nil - }, - }, - util.RealClock{}, - ) - for _, obj := range testObjs { - err := ttlStore.Add(obj) - if err != nil { - t.Errorf("Unable to add obj %#v", obj) - } - } - listObjs := ttlStore.List() - if len(listObjs) != 1 || !reflect.DeepEqual(listObjs[0], testObjs[1]) { - t.Errorf("List returned unexpected results %#v", listObjs) - } - - // Make sure all our deletes come through in an acceptable rate (1/100ms) - for expireKeys.Len() != 0 { - select { - case delKey := <-deleteChan: - if !expireKeys.Has(delKey) { - t.Errorf("Unexpected delete for key %s", delKey) - } - expireKeys.Delete(delKey) - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Unexpected timeout waiting on delete") - return - } - } -} - -func TestTTLPolicy(t *testing.T) { - fakeTime := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) - ttl := 30 * time.Second - exactlyOnTTL := fakeTime.Add(-ttl) - expiredTime := fakeTime.Add(-(ttl + 1)) - - policy := TTLPolicy{ttl, util.NewFakeClock(fakeTime)} - fakeTimestampedEntry := ×tampedEntry{obj: struct{}{}, timestamp: exactlyOnTTL} - if policy.IsExpired(fakeTimestampedEntry) { - t.Errorf("TTL cache should not expire entries exactly on ttl") - } - fakeTimestampedEntry.timestamp = fakeTime - if policy.IsExpired(fakeTimestampedEntry) { - t.Errorf("TTL Cache should not expire entries before ttl") - } - fakeTimestampedEntry.timestamp = expiredTime - if !policy.IsExpired(fakeTimestampedEntry) { - t.Errorf("TTL Cache should expire entries older than ttl") - } - for _, ttl = range []time.Duration{0, -1} { - policy.Ttl = ttl - if policy.IsExpired(fakeTimestampedEntry) { - t.Errorf("TTL policy should only expire entries when initialized with a ttl > 0") - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/fifo_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/fifo_test.go deleted file mode 100644 index 974fa6d3b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/fifo_test.go +++ /dev/null @@ -1,235 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "reflect" - "testing" - "time" -) - -func testFifoObjectKeyFunc(obj interface{}) (string, error) { - return obj.(testFifoObject).name, nil -} - -type testFifoObject struct { - name string - val interface{} -} - -func mkFifoObj(name string, val interface{}) testFifoObject { - return testFifoObject{name: name, val: val} -} - -func TestFIFO_basic(t *testing.T) { - f := NewFIFO(testFifoObjectKeyFunc) - const amount = 500 - go func() { - for i := 0; i < amount; i++ { - f.Add(mkFifoObj(string([]rune{'a', rune(i)}), i+1)) - } - }() - go func() { - for u := uint64(0); u < amount; u++ { - f.Add(mkFifoObj(string([]rune{'b', rune(u)}), u+1)) - } - }() - - lastInt := int(0) - lastUint := uint64(0) - for i := 0; i < amount*2; i++ { - switch obj := f.Pop().(testFifoObject).val.(type) { - case int: - if obj <= lastInt { - t.Errorf("got %v (int) out of order, last was %v", obj, lastInt) - } - lastInt = obj - case uint64: - if obj <= lastUint { - t.Errorf("got %v (uint) out of order, last was %v", obj, lastUint) - } else { - lastUint = obj - } - default: - t.Fatalf("unexpected type %#v", obj) - } - } -} - -func TestFIFO_addUpdate(t *testing.T) { - f := NewFIFO(testFifoObjectKeyFunc) - f.Add(mkFifoObj("foo", 10)) - f.Update(mkFifoObj("foo", 15)) - - if e, a := []interface{}{mkFifoObj("foo", 15)}, f.List(); !reflect.DeepEqual(e, a) { - t.Errorf("Expected %+v, got %+v", e, a) - } - if e, a := []string{"foo"}, f.ListKeys(); !reflect.DeepEqual(e, a) { - t.Errorf("Expected %+v, got %+v", e, a) - } - - got := make(chan testFifoObject, 2) - go func() { - for { - got <- f.Pop().(testFifoObject) - } - }() - - first := <-got - if e, a := 15, first.val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - select { - case unexpected := <-got: - t.Errorf("Got second value %v", unexpected.val) - case <-time.After(50 * time.Millisecond): - } - _, exists, _ := f.Get(mkFifoObj("foo", "")) - if exists { - t.Errorf("item did not get removed") - } -} - -func TestFIFO_addReplace(t *testing.T) { - f := NewFIFO(testFifoObjectKeyFunc) - f.Add(mkFifoObj("foo", 10)) - f.Replace([]interface{}{mkFifoObj("foo", 15)}, "15") - got := make(chan testFifoObject, 2) - go func() { - for { - got <- f.Pop().(testFifoObject) - } - }() - - first := <-got - if e, a := 15, first.val; e != a { - t.Errorf("Didn't get updated value (%v), got %v", e, a) - } - select { - case unexpected := <-got: - t.Errorf("Got second value %v", unexpected.val) - case <-time.After(50 * time.Millisecond): - } - _, exists, _ := f.Get(mkFifoObj("foo", "")) - if exists { - t.Errorf("item did not get removed") - } -} - -func TestFIFO_detectLineJumpers(t *testing.T) { - f := NewFIFO(testFifoObjectKeyFunc) - - f.Add(mkFifoObj("foo", 10)) - f.Add(mkFifoObj("bar", 1)) - f.Add(mkFifoObj("foo", 11)) - f.Add(mkFifoObj("foo", 13)) - f.Add(mkFifoObj("zab", 30)) - - if e, a := 13, f.Pop().(testFifoObject).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - f.Add(mkFifoObj("foo", 14)) // ensure foo doesn't jump back in line - - if e, a := 1, f.Pop().(testFifoObject).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - if e, a := 30, f.Pop().(testFifoObject).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } - - if e, a := 14, f.Pop().(testFifoObject).val; a != e { - t.Fatalf("expected %d, got %d", e, a) - } -} - -func TestFIFO_addIfNotPresent(t *testing.T) { - f := NewFIFO(testFifoObjectKeyFunc) - - f.Add(mkFifoObj("a", 1)) - f.Add(mkFifoObj("b", 2)) - f.AddIfNotPresent(mkFifoObj("b", 3)) - f.AddIfNotPresent(mkFifoObj("c", 4)) - - if e, a := 3, len(f.items); a != e { - t.Fatalf("expected queue length %d, got %d", e, a) - } - - expectedValues := []int{1, 2, 4} - for _, expected := range expectedValues { - if actual := f.Pop().(testFifoObject).val; actual != expected { - t.Fatalf("expected value %d, got %d", expected, actual) - } - } -} - -func TestFIFO_HasSynced(t *testing.T) { - tests := []struct { - actions []func(f *FIFO) - expectedSynced bool - }{ - { - actions: []func(f *FIFO){}, - expectedSynced: false, - }, - { - actions: []func(f *FIFO){ - func(f *FIFO) { f.Add(mkFifoObj("a", 1)) }, - }, - expectedSynced: true, - }, - { - actions: []func(f *FIFO){ - func(f *FIFO) { f.Replace([]interface{}{}, "0") }, - }, - expectedSynced: true, - }, - { - actions: []func(f *FIFO){ - func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - }, - expectedSynced: false, - }, - { - actions: []func(f *FIFO){ - func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - func(f *FIFO) { f.Pop() }, - }, - expectedSynced: false, - }, - { - actions: []func(f *FIFO){ - func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, - func(f *FIFO) { f.Pop() }, - func(f *FIFO) { f.Pop() }, - }, - expectedSynced: true, - }, - } - - for i, test := range tests { - f := NewFIFO(testFifoObjectKeyFunc) - - for _, action := range test.actions { - action(f) - } - if e, a := test.expectedSynced, f.HasSynced(); a != e { - t.Errorf("test case %v failed, expected: %v , got %v", i, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/index_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/index_test.go deleted file mode 100644 index 4b0d5ff4f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/index_test.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func testIndexFunc(obj interface{}) ([]string, error) { - pod := obj.(*api.Pod) - return []string{pod.Labels["foo"]}, nil -} - -func TestGetIndexFuncValues(t *testing.T) { - index := NewIndexer(MetaNamespaceKeyFunc, Indexers{"testmodes": testIndexFunc}) - - pod1 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "one", Labels: map[string]string{"foo": "bar"}}} - pod2 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "two", Labels: map[string]string{"foo": "bar"}}} - pod3 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "tre", Labels: map[string]string{"foo": "biz"}}} - - index.Add(pod1) - index.Add(pod2) - index.Add(pod3) - - keys := index.ListIndexFuncValues("testmodes") - if len(keys) != 2 { - t.Errorf("Expected 2 keys but got %v", len(keys)) - } - - for _, key := range keys { - if key != "bar" && key != "biz" { - t.Errorf("Expected only 'bar' or 'biz' but got %s", key) - } - } -} - -func testUsersIndexFunc(obj interface{}) ([]string, error) { - pod := obj.(*api.Pod) - usersString := pod.Annotations["users"] - - return strings.Split(usersString, ","), nil -} - -func TestMultiIndexKeys(t *testing.T) { - index := NewIndexer(MetaNamespaceKeyFunc, Indexers{"byUser": testUsersIndexFunc}) - - pod1 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "one", Annotations: map[string]string{"users": "ernie,bert"}}} - pod2 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "two", Annotations: map[string]string{"users": "bert,oscar"}}} - pod3 := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "tre", Annotations: map[string]string{"users": "ernie,elmo"}}} - - index.Add(pod1) - index.Add(pod2) - index.Add(pod3) - - erniePods, err := index.ByIndex("byUser", "ernie") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(erniePods) != 2 { - t.Errorf("Expected 2 pods but got %v", len(erniePods)) - } - - bertPods, err := index.ByIndex("byUser", "bert") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(bertPods) != 2 { - t.Errorf("Expected 2 pods but got %v", len(bertPods)) - } - - oscarPods, err := index.ByIndex("byUser", "oscar") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(oscarPods) != 1 { - t.Errorf("Expected 1 pods but got %v", len(erniePods)) - } - - ernieAndBertKeys, err := index.Index("byUser", pod1) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(ernieAndBertKeys) != 3 { - t.Errorf("Expected 3 pods but got %v", len(ernieAndBertKeys)) - } - - index.Delete(pod3) - erniePods, err = index.ByIndex("byUser", "ernie") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(erniePods) != 1 { - t.Errorf("Expected 1 pods but got %v", len(erniePods)) - } - elmoPods, err := index.ByIndex("byUser", "elmo") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(elmoPods) != 0 { - t.Errorf("Expected 0 pods but got %v", len(elmoPods)) - } - - obj, err := api.Scheme.DeepCopy(pod2) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - copyOfPod2 := obj.(*api.Pod) - copyOfPod2.Annotations["users"] = "oscar" - index.Update(copyOfPod2) - bertPods, err = index.ByIndex("byUser", "bert") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(bertPods) != 1 { - t.Errorf("Expected 1 pods but got %v", len(bertPods)) - } - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listers_test.go deleted file mode 100644 index 5e062fd90..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listers_test.go +++ /dev/null @@ -1,722 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/util/sets" -) - -func TestStoreToNodeLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - ids := sets.NewString("foo", "bar", "baz") - for id := range ids { - store.Add(&api.Node{ObjectMeta: api.ObjectMeta{Name: id}}) - } - sml := StoreToNodeLister{store} - - gotNodes, err := sml.List() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - got := make([]string, len(gotNodes.Items)) - for ix := range gotNodes.Items { - got[ix] = gotNodes.Items[ix].Name - } - if !ids.HasAll(got...) || len(got) != len(ids) { - t.Errorf("Expected %v, got %v", ids, got) - } -} - -func TestStoreToNodeConditionLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - nodes := []*api.Node{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionFalse, - }, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeOutOfDisk, - Status: api.ConditionTrue, - }, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "baz"}, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionUnknown, - }, - }, - }, - }, - } - for _, n := range nodes { - store.Add(n) - } - - predicate := func(node api.Node) bool { - for _, cond := range node.Status.Conditions { - if cond.Type == api.NodeOutOfDisk && cond.Status == api.ConditionTrue { - return false - } - } - return true - } - - snl := StoreToNodeLister{store} - sncl := snl.NodeCondition(predicate) - - want := sets.NewString("foo", "baz") - gotNodes, err := sncl.List() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - got := make([]string, len(gotNodes.Items)) - for ix := range gotNodes.Items { - got[ix] = gotNodes.Items[ix].Name - } - if !want.HasAll(got...) || len(got) != len(want) { - t.Errorf("Expected %v, got %v", want, got) - } -} - -func TestStoreToReplicationControllerLister(t *testing.T) { - store := NewIndexer(MetaNamespaceKeyFunc, Indexers{NamespaceIndex: MetaNamespaceIndexFunc}) - lister := StoreToReplicationControllerLister{store} - testCases := []struct { - inRCs []*api.ReplicationController - list func() ([]api.ReplicationController, error) - outRCNames sets.String - expectErr bool - }{ - // Basic listing with all labels and no selectors - { - inRCs: []*api.ReplicationController{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - }, - list: func() ([]api.ReplicationController, error) { - return lister.List() - }, - outRCNames: sets.NewString("basic"), - }, - // No pod labels - { - inRCs: []*api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "baz"}, - }, - }, - }, - list: func() ([]api.ReplicationController, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "pod1", Namespace: "ns"}, - } - return lister.GetPodControllers(pod) - }, - outRCNames: sets.NewString(), - expectErr: true, - }, - // No RC selectors - { - inRCs: []*api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - }, - }, - list: func() ([]api.ReplicationController, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - } - return lister.GetPodControllers(pod) - }, - outRCNames: sets.NewString(), - expectErr: true, - }, - // Matching labels to selectors and namespace - { - inRCs: []*api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "bar"}, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "bar"}, - }, - }, - }, - list: func() ([]api.ReplicationController, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Labels: map[string]string{"foo": "bar"}, - Namespace: "ns", - }, - } - return lister.GetPodControllers(pod) - }, - outRCNames: sets.NewString("bar"), - }, - } - for _, c := range testCases { - for _, r := range c.inRCs { - store.Add(r) - } - - gotControllers, err := c.list() - if err != nil && c.expectErr { - continue - } else if c.expectErr { - t.Error("Expected error, got none") - continue - } else if err != nil { - t.Errorf("Unexpected error %#v", err) - continue - } - gotNames := make([]string, len(gotControllers)) - for ix := range gotControllers { - gotNames[ix] = gotControllers[ix].Name - } - if !c.outRCNames.HasAll(gotNames...) || len(gotNames) != len(c.outRCNames) { - t.Errorf("Unexpected got controllers %+v expected %+v", gotNames, c.outRCNames) - } - } -} - -func TestStoreToReplicaSetLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - lister := StoreToReplicaSetLister{store} - testCases := []struct { - inRSs []*extensions.ReplicaSet - list func() ([]extensions.ReplicaSet, error) - outRSNames sets.String - expectErr bool - }{ - // Basic listing with all labels and no selectors - { - inRSs: []*extensions.ReplicaSet{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - }, - list: func() ([]extensions.ReplicaSet, error) { - return lister.List() - }, - outRSNames: sets.NewString("basic"), - }, - // No pod labels - { - inRSs: []*extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}}, - }, - }, - }, - list: func() ([]extensions.ReplicaSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "pod1", Namespace: "ns"}, - } - return lister.GetPodReplicaSets(pod) - }, - outRSNames: sets.NewString(), - expectErr: true, - }, - // No ReplicaSet selectors - { - inRSs: []*extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - }, - }, - list: func() ([]extensions.ReplicaSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - } - return lister.GetPodReplicaSets(pod) - }, - outRSNames: sets.NewString(), - expectErr: true, - }, - // Matching labels to selectors and namespace - { - inRSs: []*extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - }, - list: func() ([]extensions.ReplicaSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Labels: map[string]string{"foo": "bar"}, - Namespace: "ns", - }, - } - return lister.GetPodReplicaSets(pod) - }, - outRSNames: sets.NewString("bar"), - }, - } - for _, c := range testCases { - for _, r := range c.inRSs { - store.Add(r) - } - - gotRSs, err := c.list() - if err != nil && c.expectErr { - continue - } else if c.expectErr { - t.Error("Expected error, got none") - continue - } else if err != nil { - t.Errorf("Unexpected error %#v", err) - continue - } - gotNames := make([]string, len(gotRSs)) - for ix := range gotRSs { - gotNames[ix] = gotRSs[ix].Name - } - if !c.outRSNames.HasAll(gotNames...) || len(gotNames) != len(c.outRSNames) { - t.Errorf("Unexpected got ReplicaSets %+v expected %+v", gotNames, c.outRSNames) - } - } -} - -func TestStoreToDaemonSetLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - lister := StoreToDaemonSetLister{store} - testCases := []struct { - inDSs []*extensions.DaemonSet - list func() ([]extensions.DaemonSet, error) - outDaemonSetNames sets.String - expectErr bool - }{ - // Basic listing - { - inDSs: []*extensions.DaemonSet{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - }, - list: func() ([]extensions.DaemonSet, error) { - list, err := lister.List() - return list.Items, err - }, - outDaemonSetNames: sets.NewString("basic"), - }, - // Listing multiple daemon sets - { - inDSs: []*extensions.DaemonSet{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - {ObjectMeta: api.ObjectMeta{Name: "complex"}}, - {ObjectMeta: api.ObjectMeta{Name: "complex2"}}, - }, - list: func() ([]extensions.DaemonSet, error) { - list, err := lister.List() - return list.Items, err - }, - outDaemonSetNames: sets.NewString("basic", "complex", "complex2"), - }, - // No pod labels - { - inDSs: []*extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}}, - }, - }, - }, - list: func() ([]extensions.DaemonSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "pod1", Namespace: "ns"}, - } - return lister.GetPodDaemonSets(pod) - }, - outDaemonSetNames: sets.NewString(), - expectErr: true, - }, - // No DS selectors - { - inDSs: []*extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - }, - }, - list: func() ([]extensions.DaemonSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - } - return lister.GetPodDaemonSets(pod) - }, - outDaemonSetNames: sets.NewString(), - expectErr: true, - }, - // Matching labels to selectors and namespace - { - inDSs: []*extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - }, - list: func() ([]extensions.DaemonSet, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Labels: map[string]string{"foo": "bar"}, - Namespace: "ns", - }, - } - return lister.GetPodDaemonSets(pod) - }, - outDaemonSetNames: sets.NewString("bar"), - }, - } - for _, c := range testCases { - for _, r := range c.inDSs { - store.Add(r) - } - - daemonSets, err := c.list() - if err != nil && c.expectErr { - continue - } else if c.expectErr { - t.Error("Expected error, got none") - continue - } else if err != nil { - t.Errorf("Unexpected error %#v", err) - continue - } - daemonSetNames := make([]string, len(daemonSets)) - for ix := range daemonSets { - daemonSetNames[ix] = daemonSets[ix].Name - } - if !c.outDaemonSetNames.HasAll(daemonSetNames...) || len(daemonSetNames) != len(c.outDaemonSetNames) { - t.Errorf("Unexpected got controllers %+v expected %+v", daemonSetNames, c.outDaemonSetNames) - } - } -} - -func TestStoreToJobLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - lister := StoreToJobLister{store} - testCases := []struct { - inJobs []*batch.Job - list func() ([]batch.Job, error) - outJobNames sets.String - expectErr bool - msg string - }{ - // Basic listing - { - inJobs: []*batch.Job{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - }, - list: func() ([]batch.Job, error) { - list, err := lister.List() - return list.Items, err - }, - outJobNames: sets.NewString("basic"), - msg: "basic listing failed", - }, - // Listing multiple jobs - { - inJobs: []*batch.Job{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}, - {ObjectMeta: api.ObjectMeta{Name: "complex"}}, - {ObjectMeta: api.ObjectMeta{Name: "complex2"}}, - }, - list: func() ([]batch.Job, error) { - list, err := lister.List() - return list.Items, err - }, - outJobNames: sets.NewString("basic", "complex", "complex2"), - msg: "listing multiple jobs failed", - }, - // No pod labels - { - inJobs: []*batch.Job{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "baz"}, - }, - }, - }, - }, - list: func() ([]batch.Job, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "pod", Namespace: "ns"}, - } - return lister.GetPodJobs(pod) - }, - outJobNames: sets.NewString(), - expectErr: true, - msg: "listing jobs failed when pod has no labels: expected error, got none", - }, - // No Job selectors - { - inJobs: []*batch.Job{ - { - ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, - }, - }, - list: func() ([]batch.Job, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - } - return lister.GetPodJobs(pod) - }, - outJobNames: sets.NewString(), - expectErr: true, - msg: "listing jobs failed when job has no selector: expected error, got none", - }, - // Matching labels to selectors and namespace - { - inJobs: []*batch.Job{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - }, - }, - }, - list: func() ([]batch.Job, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod", - Labels: map[string]string{"foo": "bar"}, - Namespace: "ns", - }, - } - return lister.GetPodJobs(pod) - }, - outJobNames: sets.NewString("bar"), - msg: "listing jobs with namespace and selector failed", - }, - // Matching labels to selectors and namespace, error case - { - inJobs: []*batch.Job{ - { - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "foo"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "bar"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - }, - }, - }, - list: func() ([]batch.Job, error) { - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod", - Labels: map[string]string{"foo": "bar"}, - Namespace: "baz", - }, - } - return lister.GetPodJobs(pod) - }, - expectErr: true, - msg: "listing jobs with namespace and selector failed: expected error, got none", - }, - } - for _, c := range testCases { - for _, r := range c.inJobs { - store.Add(r) - } - - Jobs, err := c.list() - if err != nil && c.expectErr { - continue - } else if c.expectErr { - t.Errorf("%v", c.msg) - continue - } else if err != nil { - t.Errorf("Unexpected error %#v", err) - continue - } - JobNames := make([]string, len(Jobs)) - for ix := range Jobs { - JobNames[ix] = Jobs[ix].Name - } - if !c.outJobNames.HasAll(JobNames...) || len(JobNames) != len(c.outJobNames) { - t.Errorf("%v : expected %v, got %v", c.msg, JobNames, c.outJobNames) - } - } -} - -func TestStoreToPodLister(t *testing.T) { - store := NewIndexer(MetaNamespaceKeyFunc, Indexers{NamespaceIndex: MetaNamespaceIndexFunc}) - ids := []string{"foo", "bar", "baz"} - for _, id := range ids { - store.Add(&api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: id, - Labels: map[string]string{"name": id}, - }, - }) - } - spl := StoreToPodLister{store} - - for _, id := range ids { - got, err := spl.List(labels.Set{"name": id}.AsSelector()) - if err != nil { - t.Errorf("Unexpected error: %v", err) - continue - } - if e, a := 1, len(got); e != a { - t.Errorf("Expected %v, got %v", e, a) - continue - } - if e, a := id, got[0].Name; e != a { - t.Errorf("Expected %v, got %v", e, a) - continue - } - - exists, err := spl.Exists(&api.Pod{ObjectMeta: api.ObjectMeta{Name: id}}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !exists { - t.Errorf("exists returned false for %v", id) - } - } - - exists, err := spl.Exists(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "qux"}}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if exists { - t.Error("Unexpected pod exists") - } -} - -func TestStoreToServiceLister(t *testing.T) { - store := NewStore(MetaNamespaceKeyFunc) - store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - }, - }) - store.Add(&api.Service{ObjectMeta: api.ObjectMeta{Name: "bar"}}) - ssl := StoreToServiceLister{store} - - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foopod", - Labels: map[string]string{"role": "foo"}, - }, - } - - services, err := ssl.GetPodServices(pod) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if len(services) != 1 { - t.Fatalf("Expected 1 service, got %v", len(services)) - } - if e, a := "foo", services[0].Name; e != a { - t.Errorf("Expected service %q, got %q", e, a) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listwatch_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listwatch_test.go deleted file mode 100644 index ddd58cf74..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/listwatch_test.go +++ /dev/null @@ -1,172 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "net/http/httptest" - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/fields" - utiltesting "k8s.io/kubernetes/pkg/util/testing" -) - -func parseSelectorOrDie(s string) fields.Selector { - selector, err := fields.ParseSelector(s) - if err != nil { - panic(err) - } - return selector -} - -// buildQueryValues is a convenience function for knowing if a namespace should be in a query param or not -func buildQueryValues(query url.Values) url.Values { - v := url.Values{} - if query != nil { - for key, values := range query { - for _, value := range values { - v.Add(key, value) - } - } - } - return v -} - -func buildLocation(resourcePath string, query url.Values) string { - return resourcePath + "?" + query.Encode() -} - -func TestListWatchesCanList(t *testing.T) { - fieldSelectorQueryParamName := unversioned.FieldSelectorQueryParam(testapi.Default.GroupVersion().String()) - table := []struct { - location string - resource string - namespace string - fieldSelector fields.Selector - }{ - // Node - { - location: testapi.Default.ResourcePath("nodes", api.NamespaceAll, ""), - resource: "nodes", - namespace: api.NamespaceAll, - fieldSelector: parseSelectorOrDie(""), - }, - // pod with "assigned" field selector. - { - location: buildLocation( - testapi.Default.ResourcePath("pods", api.NamespaceAll, ""), - buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}})), - resource: "pods", - namespace: api.NamespaceAll, - fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), - }, - // pod in namespace "foo" - { - location: buildLocation( - testapi.Default.ResourcePath("pods", "foo", ""), - buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}})), - resource: "pods", - namespace: "foo", - fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), - }, - } - for _, item := range table { - handler := utiltesting.FakeHandler{ - StatusCode: 500, - ResponseBody: "", - T: t, - } - server := httptest.NewServer(&handler) - defer server.Close() - client := client.NewOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - lw := NewListWatchFromClient(client, item.resource, item.namespace, item.fieldSelector) - // This test merely tests that the correct request is made. - lw.List(api.ListOptions{}) - handler.ValidateRequest(t, item.location, "GET", nil) - } -} - -func TestListWatchesCanWatch(t *testing.T) { - fieldSelectorQueryParamName := unversioned.FieldSelectorQueryParam(testapi.Default.GroupVersion().String()) - table := []struct { - rv string - location string - resource string - namespace string - fieldSelector fields.Selector - }{ - // Node - { - location: buildLocation( - testapi.Default.ResourcePathWithPrefix("watch", "nodes", api.NamespaceAll, ""), - buildQueryValues(url.Values{})), - rv: "", - resource: "nodes", - namespace: api.NamespaceAll, - fieldSelector: parseSelectorOrDie(""), - }, - { - location: buildLocation( - testapi.Default.ResourcePathWithPrefix("watch", "nodes", api.NamespaceAll, ""), - buildQueryValues(url.Values{"resourceVersion": []string{"42"}})), - rv: "42", - resource: "nodes", - namespace: api.NamespaceAll, - fieldSelector: parseSelectorOrDie(""), - }, - // pod with "assigned" field selector. - { - location: buildLocation( - testapi.Default.ResourcePathWithPrefix("watch", "pods", api.NamespaceAll, ""), - buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}, "resourceVersion": []string{"0"}})), - rv: "0", - resource: "pods", - namespace: api.NamespaceAll, - fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), - }, - // pod with namespace foo and assigned field selector - { - location: buildLocation( - testapi.Default.ResourcePathWithPrefix("watch", "pods", "foo", ""), - buildQueryValues(url.Values{fieldSelectorQueryParamName: []string{"spec.host="}, "resourceVersion": []string{"0"}})), - rv: "0", - resource: "pods", - namespace: "foo", - fieldSelector: fields.Set{"spec.host": ""}.AsSelector(), - }, - } - - for _, item := range table { - handler := utiltesting.FakeHandler{ - StatusCode: 500, - ResponseBody: "", - T: t, - } - server := httptest.NewServer(&handler) - defer server.Close() - client := client.NewOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - lw := NewListWatchFromClient(client, item.resource, item.namespace, item.fieldSelector) - // This test merely tests that the correct request is made. - lw.Watch(api.ListOptions{ResourceVersion: item.rv}) - handler.ValidateRequest(t, item.location, "GET", nil) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/reflector_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/reflector_test.go deleted file mode 100644 index 223769ade..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/reflector_test.go +++ /dev/null @@ -1,404 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "fmt" - "math/rand" - "strconv" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -type testLW struct { - ListFunc func() (runtime.Object, error) - WatchFunc func(resourceVersion string) (watch.Interface, error) -} - -func (t *testLW) List(options api.ListOptions) (runtime.Object, error) { - return t.ListFunc() -} -func (t *testLW) Watch(options api.ListOptions) (watch.Interface, error) { - return t.WatchFunc(options.ResourceVersion) -} - -func TestCloseWatchChannelOnError(t *testing.T) { - r := NewReflector(&testLW{}, &api.Pod{}, NewStore(MetaNamespaceKeyFunc), 0) - pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}} - fw := watch.NewFake() - r.listerWatcher = &testLW{ - WatchFunc: func(rv string) (watch.Interface, error) { - return fw, nil - }, - ListFunc: func() (runtime.Object, error) { - return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "1"}}, nil - }, - } - go r.ListAndWatch(wait.NeverStop) - fw.Error(pod) - select { - case _, ok := <-fw.ResultChan(): - if ok { - t.Errorf("Watch channel left open after cancellation") - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("the cancellation is at least %s late", wait.ForeverTestTimeout.String()) - break - } -} - -func TestRunUntil(t *testing.T) { - stopCh := make(chan struct{}) - store := NewStore(MetaNamespaceKeyFunc) - r := NewReflector(&testLW{}, &api.Pod{}, store, 0) - fw := watch.NewFake() - r.listerWatcher = &testLW{ - WatchFunc: func(rv string) (watch.Interface, error) { - return fw, nil - }, - ListFunc: func() (runtime.Object, error) { - return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "1"}}, nil - }, - } - r.RunUntil(stopCh) - // Synchronously add a dummy pod into the watch channel so we - // know the RunUntil go routine is in the watch handler. - fw.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}) - stopCh <- struct{}{} - select { - case _, ok := <-fw.ResultChan(): - if ok { - t.Errorf("Watch channel left open after stopping the watch") - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("the cancellation is at least %s late", wait.ForeverTestTimeout.String()) - break - } -} - -func TestReflectorResyncChan(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, time.Millisecond) - a, _ := g.resyncChan() - b := time.After(wait.ForeverTestTimeout) - select { - case <-a: - t.Logf("got timeout as expected") - case <-b: - t.Errorf("resyncChan() is at least 99 milliseconds late??") - } -} - -func BenchmarkReflectorResyncChanMany(b *testing.B) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, 25*time.Millisecond) - // The improvement to this (calling the timer's Stop() method) makes - // this benchmark about 40% faster. - for i := 0; i < b.N; i++ { - g.resyncPeriod = time.Duration(rand.Float64() * float64(time.Millisecond) * 25) - _, stop := g.resyncChan() - stop() - } -} - -func TestReflectorWatchHandlerError(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, 0) - fw := watch.NewFake() - go func() { - fw.Stop() - }() - var resumeRV string - err := g.watchHandler(fw, &resumeRV, neverExitWatch, wait.NeverStop) - if err == nil { - t.Errorf("unexpected non-error") - } -} - -func TestReflectorWatchHandler(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, 0) - fw := watch.NewFake() - s.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - s.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}) - go func() { - fw.Add(&api.Service{ObjectMeta: api.ObjectMeta{Name: "rejected"}}) - fw.Delete(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - fw.Modify(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar", ResourceVersion: "55"}}) - fw.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "baz", ResourceVersion: "32"}}) - fw.Stop() - }() - var resumeRV string - err := g.watchHandler(fw, &resumeRV, neverExitWatch, wait.NeverStop) - if err != nil { - t.Errorf("unexpected error %v", err) - } - - mkPod := func(id string, rv string) *api.Pod { - return &api.Pod{ObjectMeta: api.ObjectMeta{Name: id, ResourceVersion: rv}} - } - - table := []struct { - Pod *api.Pod - exists bool - }{ - {mkPod("foo", ""), false}, - {mkPod("rejected", ""), false}, - {mkPod("bar", "55"), true}, - {mkPod("baz", "32"), true}, - } - for _, item := range table { - obj, exists, _ := s.Get(item.Pod) - if e, a := item.exists, exists; e != a { - t.Errorf("%v: expected %v, got %v", item.Pod, e, a) - } - if !exists { - continue - } - if e, a := item.Pod.ResourceVersion, obj.(*api.Pod).ResourceVersion; e != a { - t.Errorf("%v: expected %v, got %v", item.Pod, e, a) - } - } - - // RV should send the last version we see. - if e, a := "32", resumeRV; e != a { - t.Errorf("expected %v, got %v", e, a) - } - - // last sync resource version should be the last version synced with store - if e, a := "32", g.LastSyncResourceVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestReflectorWatchHandlerTimeout(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, 0) - fw := watch.NewFake() - var resumeRV string - exit := make(chan time.Time, 1) - exit <- time.Now() - err := g.watchHandler(fw, &resumeRV, exit, wait.NeverStop) - if err != errorResyncRequested { - t.Errorf("expected timeout error, but got %q", err) - } -} - -func TestReflectorStopWatch(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - g := NewReflector(&testLW{}, &api.Pod{}, s, 0) - fw := watch.NewFake() - var resumeRV string - stopWatch := make(chan struct{}, 1) - stopWatch <- struct{}{} - err := g.watchHandler(fw, &resumeRV, neverExitWatch, stopWatch) - if err != errorStopRequested { - t.Errorf("expected stop error, got %q", err) - } -} - -func TestReflectorListAndWatch(t *testing.T) { - createdFakes := make(chan *watch.FakeWatcher) - - // The ListFunc says that it's at revision 1. Therefore, we expect our WatchFunc - // to get called at the beginning of the watch with 1, and again with 3 when we - // inject an error. - expectedRVs := []string{"1", "3"} - lw := &testLW{ - WatchFunc: func(rv string) (watch.Interface, error) { - fw := watch.NewFake() - if e, a := expectedRVs[0], rv; e != a { - t.Errorf("Expected rv %v, but got %v", e, a) - } - expectedRVs = expectedRVs[1:] - // channel is not buffered because the for loop below needs to block. But - // we don't want to block here, so report the new fake via a go routine. - go func() { createdFakes <- fw }() - return fw, nil - }, - ListFunc: func() (runtime.Object, error) { - return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "1"}}, nil - }, - } - s := NewFIFO(MetaNamespaceKeyFunc) - r := NewReflector(lw, &api.Pod{}, s, 0) - go r.ListAndWatch(wait.NeverStop) - - ids := []string{"foo", "bar", "baz", "qux", "zoo"} - var fw *watch.FakeWatcher - for i, id := range ids { - if fw == nil { - fw = <-createdFakes - } - sendingRV := strconv.FormatUint(uint64(i+2), 10) - fw.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: id, ResourceVersion: sendingRV}}) - if sendingRV == "3" { - // Inject a failure. - fw.Stop() - fw = nil - } - } - - // Verify we received the right ids with the right resource versions. - for i, id := range ids { - pod := s.Pop().(*api.Pod) - if e, a := id, pod.Name; e != a { - t.Errorf("%v: Expected %v, got %v", i, e, a) - } - if e, a := strconv.FormatUint(uint64(i+2), 10), pod.ResourceVersion; e != a { - t.Errorf("%v: Expected %v, got %v", i, e, a) - } - } - - if len(expectedRVs) != 0 { - t.Error("called watchStarter an unexpected number of times") - } -} - -func TestReflectorListAndWatchWithErrors(t *testing.T) { - mkPod := func(id string, rv string) *api.Pod { - return &api.Pod{ObjectMeta: api.ObjectMeta{Name: id, ResourceVersion: rv}} - } - mkList := func(rv string, pods ...*api.Pod) *api.PodList { - list := &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: rv}} - for _, pod := range pods { - list.Items = append(list.Items, *pod) - } - return list - } - table := []struct { - list *api.PodList - listErr error - events []watch.Event - watchErr error - }{ - { - list: mkList("1"), - events: []watch.Event{ - {watch.Added, mkPod("foo", "2")}, - {watch.Added, mkPod("bar", "3")}, - }, - }, { - list: mkList("3", mkPod("foo", "2"), mkPod("bar", "3")), - events: []watch.Event{ - {watch.Deleted, mkPod("foo", "4")}, - {watch.Added, mkPod("qux", "5")}, - }, - }, { - listErr: fmt.Errorf("a list error"), - }, { - list: mkList("5", mkPod("bar", "3"), mkPod("qux", "5")), - watchErr: fmt.Errorf("a watch error"), - }, { - list: mkList("5", mkPod("bar", "3"), mkPod("qux", "5")), - events: []watch.Event{ - {watch.Added, mkPod("baz", "6")}, - }, - }, { - list: mkList("6", mkPod("bar", "3"), mkPod("qux", "5"), mkPod("baz", "6")), - }, - } - - s := NewFIFO(MetaNamespaceKeyFunc) - for line, item := range table { - if item.list != nil { - // Test that the list is what currently exists in the store. - current := s.List() - checkMap := map[string]string{} - for _, item := range current { - pod := item.(*api.Pod) - checkMap[pod.Name] = pod.ResourceVersion - } - for _, pod := range item.list.Items { - if e, a := pod.ResourceVersion, checkMap[pod.Name]; e != a { - t.Errorf("%v: expected %v, got %v for pod %v", line, e, a, pod.Name) - } - } - if e, a := len(item.list.Items), len(checkMap); e != a { - t.Errorf("%v: expected %v, got %v", line, e, a) - } - } - watchRet, watchErr := item.events, item.watchErr - lw := &testLW{ - WatchFunc: func(rv string) (watch.Interface, error) { - if watchErr != nil { - return nil, watchErr - } - watchErr = fmt.Errorf("second watch") - fw := watch.NewFake() - go func() { - for _, e := range watchRet { - fw.Action(e.Type, e.Object) - } - fw.Stop() - }() - return fw, nil - }, - ListFunc: func() (runtime.Object, error) { - return item.list, item.listErr - }, - } - r := NewReflector(lw, &api.Pod{}, s, 0) - r.ListAndWatch(wait.NeverStop) - } -} - -func TestReflectorResync(t *testing.T) { - s := NewStore(MetaNamespaceKeyFunc) - - currentTime := time.Time{} - iteration := 0 - - lw := &testLW{ - WatchFunc: func(rv string) (watch.Interface, error) { - if iteration == 0 { - // Move time, but do not force resync. - currentTime = currentTime.Add(30 * time.Second) - } else if iteration == 1 { - // Move time to force resync. - currentTime = currentTime.Add(28 * time.Second) - } else if iteration >= 2 { - t.Fatalf("should have forced resync earlier") - } - iteration++ - fw := watch.NewFake() - // Send something to the watcher to avoid "watch too short" errors. - go func() { - fw.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: strconv.Itoa(iteration)}}) - fw.Stop() - }() - return fw, nil - }, - ListFunc: func() (runtime.Object, error) { - return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "0"}}, nil - }, - } - resyncPeriod := time.Minute - r := NewReflector(lw, &api.Pod{}, s, resyncPeriod) - r.now = func() time.Time { return currentTime } - - r.ListAndWatch(wait.NeverStop) - if iteration != 2 { - t.Errorf("exactly 2 iterations were expected, got: %v", iteration) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/store_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/store_test.go deleted file mode 100644 index 07275f493..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/store_test.go +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "testing" - - "k8s.io/kubernetes/pkg/util/sets" -) - -// Test public interface -func doTestStore(t *testing.T, store Store) { - mkObj := func(id string, val string) testStoreObject { - return testStoreObject{id: id, val: val} - } - - store.Add(mkObj("foo", "bar")) - if item, ok, _ := store.Get(mkObj("foo", "")); !ok { - t.Errorf("didn't find inserted item") - } else { - if e, a := "bar", item.(testStoreObject).val; e != a { - t.Errorf("expected %v, got %v", e, a) - } - } - store.Update(mkObj("foo", "baz")) - if item, ok, _ := store.Get(mkObj("foo", "")); !ok { - t.Errorf("didn't find inserted item") - } else { - if e, a := "baz", item.(testStoreObject).val; e != a { - t.Errorf("expected %v, got %v", e, a) - } - } - store.Delete(mkObj("foo", "")) - if _, ok, _ := store.Get(mkObj("foo", "")); ok { - t.Errorf("found deleted item??") - } - - // Test List. - store.Add(mkObj("a", "b")) - store.Add(mkObj("c", "d")) - store.Add(mkObj("e", "e")) - { - found := sets.String{} - for _, item := range store.List() { - found.Insert(item.(testStoreObject).val) - } - if !found.HasAll("b", "d", "e") { - t.Errorf("missing items, found: %v", found) - } - if len(found) != 3 { - t.Errorf("extra items") - } - } - - // Test Replace. - store.Replace([]interface{}{ - mkObj("foo", "foo"), - mkObj("bar", "bar"), - }, "0") - - { - found := sets.String{} - for _, item := range store.List() { - found.Insert(item.(testStoreObject).val) - } - if !found.HasAll("foo", "bar") { - t.Errorf("missing items") - } - if len(found) != 2 { - t.Errorf("extra items") - } - } -} - -// Test public interface -func doTestIndex(t *testing.T, indexer Indexer) { - mkObj := func(id string, val string) testStoreObject { - return testStoreObject{id: id, val: val} - } - - // Test Index - expected := map[string]sets.String{} - expected["b"] = sets.NewString("a", "c") - expected["f"] = sets.NewString("e") - expected["h"] = sets.NewString("g") - indexer.Add(mkObj("a", "b")) - indexer.Add(mkObj("c", "b")) - indexer.Add(mkObj("e", "f")) - indexer.Add(mkObj("g", "h")) - { - for k, v := range expected { - found := sets.String{} - indexResults, err := indexer.Index("by_val", mkObj("", k)) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - for _, item := range indexResults { - found.Insert(item.(testStoreObject).id) - } - items := v.List() - if !found.HasAll(items...) { - t.Errorf("missing items, index %s, expected %v but found %v", k, items, found.List()) - } - } - } -} - -func testStoreKeyFunc(obj interface{}) (string, error) { - return obj.(testStoreObject).id, nil -} - -func testStoreIndexFunc(obj interface{}) ([]string, error) { - return []string{obj.(testStoreObject).val}, nil -} - -func testStoreIndexers() Indexers { - indexers := Indexers{} - indexers["by_val"] = testStoreIndexFunc - return indexers -} - -type testStoreObject struct { - id string - val string -} - -func TestCache(t *testing.T) { - doTestStore(t, NewStore(testStoreKeyFunc)) -} - -func TestFIFOCache(t *testing.T) { - doTestStore(t, NewFIFO(testStoreKeyFunc)) -} - -func TestUndeltaStore(t *testing.T) { - nop := func([]interface{}) {} - doTestStore(t, NewUndeltaStore(nop, testStoreKeyFunc)) -} - -func TestIndex(t *testing.T) { - doTestIndex(t, NewIndexer(testStoreKeyFunc, testStoreIndexers())) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/undelta_store_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/undelta_store_test.go deleted file mode 100644 index c14b7a800..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/cache/undelta_store_test.go +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "reflect" - "testing" -) - -// store_test.go checks that UndeltaStore conforms to the Store interface -// behavior. This test just tests that it calls the push func in addition. - -type testUndeltaObject struct { - name string - val interface{} -} - -func testUndeltaKeyFunc(obj interface{}) (string, error) { - return obj.(testUndeltaObject).name, nil -} - -/* -var ( - o1 interface{} = t{1} - o2 interface{} = t{2} - l1 []interface{} = []interface{}{t{1}} -) -*/ - -func TestUpdateCallsPush(t *testing.T) { - mkObj := func(name string, val interface{}) testUndeltaObject { - return testUndeltaObject{name: name, val: val} - } - - var got []interface{} - var callcount int = 0 - push := func(m []interface{}) { - callcount++ - got = m - } - - u := NewUndeltaStore(push, testUndeltaKeyFunc) - - u.Add(mkObj("a", 2)) - u.Update(mkObj("a", 1)) - if callcount != 2 { - t.Errorf("Expected 2 calls, got %d", callcount) - } - - l := []interface{}{mkObj("a", 1)} - if !reflect.DeepEqual(l, got) { - t.Errorf("Expected %#v, Got %#v", l, got) - } -} - -func TestDeleteCallsPush(t *testing.T) { - mkObj := func(name string, val interface{}) testUndeltaObject { - return testUndeltaObject{name: name, val: val} - } - - var got []interface{} - var callcount int = 0 - push := func(m []interface{}) { - callcount++ - got = m - } - - u := NewUndeltaStore(push, testUndeltaKeyFunc) - - u.Add(mkObj("a", 2)) - u.Delete(mkObj("a", "")) - if callcount != 2 { - t.Errorf("Expected 2 calls, got %d", callcount) - } - expected := []interface{}{} - if !reflect.DeepEqual(expected, got) { - t.Errorf("Expected %#v, Got %#v", expected, got) - } -} - -func TestReadsDoNotCallPush(t *testing.T) { - push := func(m []interface{}) { - t.Errorf("Unexpected call to push!") - } - - u := NewUndeltaStore(push, testUndeltaKeyFunc) - - // These should not call push. - _ = u.List() - _, _, _ = u.Get(testUndeltaObject{"a", ""}) -} - -func TestReplaceCallsPush(t *testing.T) { - mkObj := func(name string, val interface{}) testUndeltaObject { - return testUndeltaObject{name: name, val: val} - } - - var got []interface{} - var callcount int = 0 - push := func(m []interface{}) { - callcount++ - got = m - } - - u := NewUndeltaStore(push, testUndeltaKeyFunc) - - m := []interface{}{mkObj("a", 1)} - - u.Replace(m, "0") - if callcount != 1 { - t.Errorf("Expected 1 calls, got %d", callcount) - } - expected := []interface{}{mkObj("a", 1)} - if !reflect.DeepEqual(expected, got) { - t.Errorf("Expected %#v, Got %#v", expected, got) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go deleted file mode 100644 index b303034d6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apimachinery/registered" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedbatch "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned" - fakeunversionedbatch "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - fakeunversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake" - unversionedextensions "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned" - fakeunversionedextensions "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/client/typed/discovery" - fakediscovery "k8s.io/kubernetes/pkg/client/typed/discovery/fake" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/watch" -) - -// Clientset returns a clientset that will respond with the provided objects -func NewSimpleClientset(objects ...runtime.Object) *Clientset { - o := core.NewObjects(api.Scheme, api.Codecs.UniversalDecoder()) - for _, obj := range objects { - if err := o.Add(obj); err != nil { - panic(err) - } - } - - fakePtr := core.Fake{} - fakePtr.AddReactor("*", "*", core.ObjectReaction(o, registered.RESTMapper())) - - fakePtr.AddWatchReactor("*", core.DefaultWatchReactor(watch.NewFake(), nil)) - - return &Clientset{fakePtr} -} - -// Clientset implements clientset.Interface. Meant to be embedded into a -// struct to get a default implementation. This makes faking out just the method -// you want to test easier. -type Clientset struct { - core.Fake -} - -func (c *Clientset) Discovery() discovery.DiscoveryInterface { - return &fakediscovery.FakeDiscovery{Fake: &c.Fake} -} - -var _ clientset.Interface = &Clientset{} - -// Core retrieves the CoreClient -func (c *Clientset) Core() unversionedcore.CoreInterface { - return &fakeunversionedcore.FakeCore{Fake: &c.Fake} -} - -// Extensions retrieves the ExtensionsClient -func (c *Clientset) Extensions() unversionedextensions.ExtensionsInterface { - return &fakeunversionedextensions.FakeExtensions{Fake: &c.Fake} -} - -// Batch retrieves the BatchClient -func (c *Clientset) Batch() unversionedbatch.BatchInterface { - return &fakeunversionedbatch.FakeBatch{Fake: &c.Fake} -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/doc.go deleted file mode 100644 index 559cf8914..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// This package is generated by client-gen with the default arguments. - -// This package has the automatically generated fake clientset. -package fake diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/doc.go deleted file mode 100644 index eb358c26c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// This package is generated by client-gen with the default arguments. - -// Package fake has the automatically generated clients. -package fake diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_batch_client.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_batch_client.go deleted file mode 100644 index 884593467..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_batch_client.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - unversioned "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned" - restclient "k8s.io/kubernetes/pkg/client/restclient" - core "k8s.io/kubernetes/pkg/client/testing/core" -) - -type FakeBatch struct { - *core.Fake -} - -func (c *FakeBatch) Jobs(namespace string) unversioned.JobInterface { - return &FakeJobs{c, namespace} -} - -// GetRESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeBatch) GetRESTClient() *restclient.RESTClient { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_job.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_job.go deleted file mode 100644 index 701c102b4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake/fake_job.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - batch "k8s.io/kubernetes/pkg/apis/batch" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeJobs implements JobInterface -type FakeJobs struct { - Fake *FakeBatch - ns string -} - -var jobsResource = unversioned.GroupVersionResource{Group: "batch", Version: "", Resource: "jobs"} - -func (c *FakeJobs) Create(job *batch.Job) (result *batch.Job, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(jobsResource, c.ns, job), &batch.Job{}) - - if obj == nil { - return nil, err - } - return obj.(*batch.Job), err -} - -func (c *FakeJobs) Update(job *batch.Job) (result *batch.Job, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(jobsResource, c.ns, job), &batch.Job{}) - - if obj == nil { - return nil, err - } - return obj.(*batch.Job), err -} - -func (c *FakeJobs) UpdateStatus(job *batch.Job) (*batch.Job, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(jobsResource, "status", c.ns, job), &batch.Job{}) - - if obj == nil { - return nil, err - } - return obj.(*batch.Job), err -} - -func (c *FakeJobs) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(jobsResource, c.ns, name), &batch.Job{}) - - return err -} - -func (c *FakeJobs) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(jobsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &batch.JobList{}) - return err -} - -func (c *FakeJobs) Get(name string) (result *batch.Job, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(jobsResource, c.ns, name), &batch.Job{}) - - if obj == nil { - return nil, err - } - return obj.(*batch.Job), err -} - -func (c *FakeJobs) List(opts api.ListOptions) (result *batch.JobList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(jobsResource, c.ns, opts), &batch.JobList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &batch.JobList{} - for _, item := range obj.(*batch.JobList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested jobs. -func (c *FakeJobs) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(jobsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/doc.go deleted file mode 100644 index eb358c26c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// This package is generated by client-gen with the default arguments. - -// Package fake has the automatically generated clients. -package fake diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_componentstatus.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_componentstatus.go deleted file mode 100644 index 84dca9984..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_componentstatus.go +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeComponentStatuses implements ComponentStatusInterface -type FakeComponentStatuses struct { - Fake *FakeCore -} - -var componentstatusesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "componentstatuses"} - -func (c *FakeComponentStatuses) Create(componentStatus *api.ComponentStatus) (result *api.ComponentStatus, err error) { - obj, err := c.Fake. - Invokes(core.NewRootCreateAction(componentstatusesResource, componentStatus), &api.ComponentStatus{}) - if obj == nil { - return nil, err - } - return obj.(*api.ComponentStatus), err -} - -func (c *FakeComponentStatuses) Update(componentStatus *api.ComponentStatus) (result *api.ComponentStatus, err error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateAction(componentstatusesResource, componentStatus), &api.ComponentStatus{}) - if obj == nil { - return nil, err - } - return obj.(*api.ComponentStatus), err -} - -func (c *FakeComponentStatuses) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewRootDeleteAction(componentstatusesResource, name), &api.ComponentStatus{}) - return err -} - -func (c *FakeComponentStatuses) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewRootDeleteCollectionAction(componentstatusesResource, listOptions) - - _, err := c.Fake.Invokes(action, &api.ComponentStatusList{}) - return err -} - -func (c *FakeComponentStatuses) Get(name string) (result *api.ComponentStatus, err error) { - obj, err := c.Fake. - Invokes(core.NewRootGetAction(componentstatusesResource, name), &api.ComponentStatus{}) - if obj == nil { - return nil, err - } - return obj.(*api.ComponentStatus), err -} - -func (c *FakeComponentStatuses) List(opts api.ListOptions) (result *api.ComponentStatusList, err error) { - obj, err := c.Fake. - Invokes(core.NewRootListAction(componentstatusesResource, opts), &api.ComponentStatusList{}) - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ComponentStatusList{} - for _, item := range obj.(*api.ComponentStatusList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested componentStatuses. -func (c *FakeComponentStatuses) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewRootWatchAction(componentstatusesResource, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_configmap.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_configmap.go deleted file mode 100644 index 8908c26a3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_configmap.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeConfigMaps implements ConfigMapInterface -type FakeConfigMaps struct { - Fake *FakeCore - ns string -} - -var configmapsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "configmaps"} - -func (c *FakeConfigMaps) Create(configMap *api.ConfigMap) (result *api.ConfigMap, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(configmapsResource, c.ns, configMap), &api.ConfigMap{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) Update(configMap *api.ConfigMap) (result *api.ConfigMap, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(configmapsResource, c.ns, configMap), &api.ConfigMap{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(configmapsResource, c.ns, name), &api.ConfigMap{}) - - return err -} - -func (c *FakeConfigMaps) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(configmapsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.ConfigMapList{}) - return err -} - -func (c *FakeConfigMaps) Get(name string) (result *api.ConfigMap, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(configmapsResource, c.ns, name), &api.ConfigMap{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) List(opts api.ListOptions) (result *api.ConfigMapList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(configmapsResource, c.ns, opts), &api.ConfigMapList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ConfigMapList{} - for _, item := range obj.(*api.ConfigMapList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested configMaps. -func (c *FakeConfigMaps) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(configmapsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_core_client.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_core_client.go deleted file mode 100644 index 533735e7c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_core_client.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - unversioned "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - restclient "k8s.io/kubernetes/pkg/client/restclient" - core "k8s.io/kubernetes/pkg/client/testing/core" -) - -type FakeCore struct { - *core.Fake -} - -func (c *FakeCore) ComponentStatuses() unversioned.ComponentStatusInterface { - return &FakeComponentStatuses{c} -} - -func (c *FakeCore) ConfigMaps(namespace string) unversioned.ConfigMapInterface { - return &FakeConfigMaps{c, namespace} -} - -func (c *FakeCore) Endpoints(namespace string) unversioned.EndpointsInterface { - return &FakeEndpoints{c, namespace} -} - -func (c *FakeCore) Events(namespace string) unversioned.EventInterface { - return &FakeEvents{c, namespace} -} - -func (c *FakeCore) LimitRanges(namespace string) unversioned.LimitRangeInterface { - return &FakeLimitRanges{c, namespace} -} - -func (c *FakeCore) Namespaces() unversioned.NamespaceInterface { - return &FakeNamespaces{c} -} - -func (c *FakeCore) Nodes() unversioned.NodeInterface { - return &FakeNodes{c} -} - -func (c *FakeCore) PersistentVolumes() unversioned.PersistentVolumeInterface { - return &FakePersistentVolumes{c} -} - -func (c *FakeCore) PersistentVolumeClaims(namespace string) unversioned.PersistentVolumeClaimInterface { - return &FakePersistentVolumeClaims{c, namespace} -} - -func (c *FakeCore) Pods(namespace string) unversioned.PodInterface { - return &FakePods{c, namespace} -} - -func (c *FakeCore) PodTemplates(namespace string) unversioned.PodTemplateInterface { - return &FakePodTemplates{c, namespace} -} - -func (c *FakeCore) ReplicationControllers(namespace string) unversioned.ReplicationControllerInterface { - return &FakeReplicationControllers{c, namespace} -} - -func (c *FakeCore) ResourceQuotas(namespace string) unversioned.ResourceQuotaInterface { - return &FakeResourceQuotas{c, namespace} -} - -func (c *FakeCore) Secrets(namespace string) unversioned.SecretInterface { - return &FakeSecrets{c, namespace} -} - -func (c *FakeCore) Services(namespace string) unversioned.ServiceInterface { - return &FakeServices{c, namespace} -} - -func (c *FakeCore) ServiceAccounts(namespace string) unversioned.ServiceAccountInterface { - return &FakeServiceAccounts{c, namespace} -} - -// GetRESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeCore) GetRESTClient() *restclient.RESTClient { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_endpoints.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_endpoints.go deleted file mode 100644 index b888d89c0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_endpoints.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeEndpoints implements EndpointsInterface -type FakeEndpoints struct { - Fake *FakeCore - ns string -} - -var endpointsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "endpoints"} - -func (c *FakeEndpoints) Create(endpoints *api.Endpoints) (result *api.Endpoints, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(endpointsResource, c.ns, endpoints), &api.Endpoints{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) Update(endpoints *api.Endpoints) (result *api.Endpoints, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(endpointsResource, c.ns, endpoints), &api.Endpoints{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(endpointsResource, c.ns, name), &api.Endpoints{}) - - return err -} - -func (c *FakeEndpoints) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(endpointsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.EndpointsList{}) - return err -} - -func (c *FakeEndpoints) Get(name string) (result *api.Endpoints, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(endpointsResource, c.ns, name), &api.Endpoints{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) List(opts api.ListOptions) (result *api.EndpointsList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(endpointsResource, c.ns, opts), &api.EndpointsList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.EndpointsList{} - for _, item := range obj.(*api.EndpointsList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested endpoints. -func (c *FakeEndpoints) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(endpointsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event.go deleted file mode 100644 index d86b05a7b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeEvents implements EventInterface -type FakeEvents struct { - Fake *FakeCore - ns string -} - -var eventsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "events"} - -func (c *FakeEvents) Create(event *api.Event) (result *api.Event, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(eventsResource, c.ns, event), &api.Event{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Event), err -} - -func (c *FakeEvents) Update(event *api.Event) (result *api.Event, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(eventsResource, c.ns, event), &api.Event{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Event), err -} - -func (c *FakeEvents) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(eventsResource, c.ns, name), &api.Event{}) - - return err -} - -func (c *FakeEvents) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(eventsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.EventList{}) - return err -} - -func (c *FakeEvents) Get(name string) (result *api.Event, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(eventsResource, c.ns, name), &api.Event{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Event), err -} - -func (c *FakeEvents) List(opts api.ListOptions) (result *api.EventList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(eventsResource, c.ns, opts), &api.EventList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.EventList{} - for _, item := range obj.(*api.EventList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested events. -func (c *FakeEvents) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(eventsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event_expansion.go deleted file mode 100644 index b76be860d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_event_expansion.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/runtime" -) - -func (c *FakeEvents) CreateWithEventNamespace(event *api.Event) (*api.Event, error) { - action := core.NewRootCreateAction(eventsResource, event) - if c.ns != "" { - action = core.NewCreateAction(eventsResource, c.ns, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// Update replaces an existing event. Returns the copy of the event the server returns, or an error. -func (c *FakeEvents) UpdateWithEventNamespace(event *api.Event) (*api.Event, error) { - action := core.NewRootUpdateAction(eventsResource, event) - if c.ns != "" { - action = core.NewUpdateAction(eventsResource, c.ns, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// Patch patches an existing event. Returns the copy of the event the server returns, or an error. -func (c *FakeEvents) Patch(event *api.Event, data []byte) (*api.Event, error) { - action := core.NewRootPatchAction(eventsResource, event) - if c.ns != "" { - action = core.NewPatchAction(eventsResource, c.ns, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// Search returns a list of events matching the specified object. -func (c *FakeEvents) Search(objOrRef runtime.Object) (*api.EventList, error) { - action := core.NewRootListAction(eventsResource, api.ListOptions{}) - if c.ns != "" { - action = core.NewListAction(eventsResource, c.ns, api.ListOptions{}) - } - obj, err := c.Fake.Invokes(action, &api.EventList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.EventList), err -} - -func (c *FakeEvents) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector { - action := core.GenericActionImpl{} - action.Verb = "get-field-selector" - action.Resource = eventsResource - - c.Fake.Invokes(action, nil) - return fields.Everything() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_limitrange.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_limitrange.go deleted file mode 100644 index b46f5eba4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_limitrange.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeLimitRanges implements LimitRangeInterface -type FakeLimitRanges struct { - Fake *FakeCore - ns string -} - -var limitrangesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "limitranges"} - -func (c *FakeLimitRanges) Create(limitRange *api.LimitRange) (result *api.LimitRange, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(limitrangesResource, c.ns, limitRange), &api.LimitRange{}) - - if obj == nil { - return nil, err - } - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) Update(limitRange *api.LimitRange) (result *api.LimitRange, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(limitrangesResource, c.ns, limitRange), &api.LimitRange{}) - - if obj == nil { - return nil, err - } - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(limitrangesResource, c.ns, name), &api.LimitRange{}) - - return err -} - -func (c *FakeLimitRanges) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(limitrangesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.LimitRangeList{}) - return err -} - -func (c *FakeLimitRanges) Get(name string) (result *api.LimitRange, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(limitrangesResource, c.ns, name), &api.LimitRange{}) - - if obj == nil { - return nil, err - } - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) List(opts api.ListOptions) (result *api.LimitRangeList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(limitrangesResource, c.ns, opts), &api.LimitRangeList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.LimitRangeList{} - for _, item := range obj.(*api.LimitRangeList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested limitRanges. -func (c *FakeLimitRanges) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(limitrangesResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace.go deleted file mode 100644 index 233dd8ff9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeNamespaces implements NamespaceInterface -type FakeNamespaces struct { - Fake *FakeCore -} - -var namespacesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "namespaces"} - -func (c *FakeNamespaces) Create(namespace *api.Namespace) (result *api.Namespace, err error) { - obj, err := c.Fake. - Invokes(core.NewRootCreateAction(namespacesResource, namespace), &api.Namespace{}) - if obj == nil { - return nil, err - } - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) Update(namespace *api.Namespace) (result *api.Namespace, err error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateAction(namespacesResource, namespace), &api.Namespace{}) - if obj == nil { - return nil, err - } - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) UpdateStatus(namespace *api.Namespace) (*api.Namespace, error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateSubresourceAction(namespacesResource, "status", namespace), &api.Namespace{}) - if obj == nil { - return nil, err - } - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewRootDeleteAction(namespacesResource, name), &api.Namespace{}) - return err -} - -func (c *FakeNamespaces) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewRootDeleteCollectionAction(namespacesResource, listOptions) - - _, err := c.Fake.Invokes(action, &api.NamespaceList{}) - return err -} - -func (c *FakeNamespaces) Get(name string) (result *api.Namespace, err error) { - obj, err := c.Fake. - Invokes(core.NewRootGetAction(namespacesResource, name), &api.Namespace{}) - if obj == nil { - return nil, err - } - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) List(opts api.ListOptions) (result *api.NamespaceList, err error) { - obj, err := c.Fake. - Invokes(core.NewRootListAction(namespacesResource, opts), &api.NamespaceList{}) - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.NamespaceList{} - for _, item := range obj.(*api.NamespaceList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested namespaces. -func (c *FakeNamespaces) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewRootWatchAction(namespacesResource, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace_expansion.go deleted file mode 100644 index 04b3acc14..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_namespace_expansion.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/testing/core" -) - -func (c *FakeNamespaces) Finalize(namespace *api.Namespace) (*api.Namespace, error) { - action := core.CreateActionImpl{} - action.Verb = "create" - action.Resource = namespacesResource - action.Subresource = "finalize" - action.Object = namespace - - obj, err := c.Fake.Invokes(action, namespace) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_node.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_node.go deleted file mode 100644 index 7370e5a2a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_node.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeNodes implements NodeInterface -type FakeNodes struct { - Fake *FakeCore -} - -var nodesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "nodes"} - -func (c *FakeNodes) Create(node *api.Node) (result *api.Node, err error) { - obj, err := c.Fake. - Invokes(core.NewRootCreateAction(nodesResource, node), &api.Node{}) - if obj == nil { - return nil, err - } - return obj.(*api.Node), err -} - -func (c *FakeNodes) Update(node *api.Node) (result *api.Node, err error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateAction(nodesResource, node), &api.Node{}) - if obj == nil { - return nil, err - } - return obj.(*api.Node), err -} - -func (c *FakeNodes) UpdateStatus(node *api.Node) (*api.Node, error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateSubresourceAction(nodesResource, "status", node), &api.Node{}) - if obj == nil { - return nil, err - } - return obj.(*api.Node), err -} - -func (c *FakeNodes) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewRootDeleteAction(nodesResource, name), &api.Node{}) - return err -} - -func (c *FakeNodes) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewRootDeleteCollectionAction(nodesResource, listOptions) - - _, err := c.Fake.Invokes(action, &api.NodeList{}) - return err -} - -func (c *FakeNodes) Get(name string) (result *api.Node, err error) { - obj, err := c.Fake. - Invokes(core.NewRootGetAction(nodesResource, name), &api.Node{}) - if obj == nil { - return nil, err - } - return obj.(*api.Node), err -} - -func (c *FakeNodes) List(opts api.ListOptions) (result *api.NodeList, err error) { - obj, err := c.Fake. - Invokes(core.NewRootListAction(nodesResource, opts), &api.NodeList{}) - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.NodeList{} - for _, item := range obj.(*api.NodeList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested nodes. -func (c *FakeNodes) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewRootWatchAction(nodesResource, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolume.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolume.go deleted file mode 100644 index fd0ae18ae..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolume.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakePersistentVolumes implements PersistentVolumeInterface -type FakePersistentVolumes struct { - Fake *FakeCore -} - -var persistentvolumesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "persistentvolumes"} - -func (c *FakePersistentVolumes) Create(persistentVolume *api.PersistentVolume) (result *api.PersistentVolume, err error) { - obj, err := c.Fake. - Invokes(core.NewRootCreateAction(persistentvolumesResource, persistentVolume), &api.PersistentVolume{}) - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) Update(persistentVolume *api.PersistentVolume) (result *api.PersistentVolume, err error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateAction(persistentvolumesResource, persistentVolume), &api.PersistentVolume{}) - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) UpdateStatus(persistentVolume *api.PersistentVolume) (*api.PersistentVolume, error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateSubresourceAction(persistentvolumesResource, "status", persistentVolume), &api.PersistentVolume{}) - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewRootDeleteAction(persistentvolumesResource, name), &api.PersistentVolume{}) - return err -} - -func (c *FakePersistentVolumes) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewRootDeleteCollectionAction(persistentvolumesResource, listOptions) - - _, err := c.Fake.Invokes(action, &api.PersistentVolumeList{}) - return err -} - -func (c *FakePersistentVolumes) Get(name string) (result *api.PersistentVolume, err error) { - obj, err := c.Fake. - Invokes(core.NewRootGetAction(persistentvolumesResource, name), &api.PersistentVolume{}) - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) List(opts api.ListOptions) (result *api.PersistentVolumeList, err error) { - obj, err := c.Fake. - Invokes(core.NewRootListAction(persistentvolumesResource, opts), &api.PersistentVolumeList{}) - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.PersistentVolumeList{} - for _, item := range obj.(*api.PersistentVolumeList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested persistentVolumes. -func (c *FakePersistentVolumes) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewRootWatchAction(persistentvolumesResource, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolumeclaim.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolumeclaim.go deleted file mode 100644 index bd10e834d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_persistentvolumeclaim.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakePersistentVolumeClaims implements PersistentVolumeClaimInterface -type FakePersistentVolumeClaims struct { - Fake *FakeCore - ns string -} - -var persistentvolumeclaimsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "persistentvolumeclaims"} - -func (c *FakePersistentVolumeClaims) Create(persistentVolumeClaim *api.PersistentVolumeClaim) (result *api.PersistentVolumeClaim, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(persistentvolumeclaimsResource, c.ns, persistentVolumeClaim), &api.PersistentVolumeClaim{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) Update(persistentVolumeClaim *api.PersistentVolumeClaim) (result *api.PersistentVolumeClaim, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(persistentvolumeclaimsResource, c.ns, persistentVolumeClaim), &api.PersistentVolumeClaim{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) UpdateStatus(persistentVolumeClaim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(persistentvolumeclaimsResource, "status", c.ns, persistentVolumeClaim), &api.PersistentVolumeClaim{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(persistentvolumeclaimsResource, c.ns, name), &api.PersistentVolumeClaim{}) - - return err -} - -func (c *FakePersistentVolumeClaims) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(persistentvolumeclaimsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.PersistentVolumeClaimList{}) - return err -} - -func (c *FakePersistentVolumeClaims) Get(name string) (result *api.PersistentVolumeClaim, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(persistentvolumeclaimsResource, c.ns, name), &api.PersistentVolumeClaim{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) List(opts api.ListOptions) (result *api.PersistentVolumeClaimList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(persistentvolumeclaimsResource, c.ns, opts), &api.PersistentVolumeClaimList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.PersistentVolumeClaimList{} - for _, item := range obj.(*api.PersistentVolumeClaimList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested persistentVolumeClaims. -func (c *FakePersistentVolumeClaims) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(persistentvolumeclaimsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod.go deleted file mode 100644 index 98c0b8e3f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakePods implements PodInterface -type FakePods struct { - Fake *FakeCore - ns string -} - -var podsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "pods"} - -func (c *FakePods) Create(pod *api.Pod) (result *api.Pod, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(podsResource, c.ns, pod), &api.Pod{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Pod), err -} - -func (c *FakePods) Update(pod *api.Pod) (result *api.Pod, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(podsResource, c.ns, pod), &api.Pod{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Pod), err -} - -func (c *FakePods) UpdateStatus(pod *api.Pod) (*api.Pod, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(podsResource, "status", c.ns, pod), &api.Pod{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Pod), err -} - -func (c *FakePods) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(podsResource, c.ns, name), &api.Pod{}) - - return err -} - -func (c *FakePods) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(podsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.PodList{}) - return err -} - -func (c *FakePods) Get(name string) (result *api.Pod, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(podsResource, c.ns, name), &api.Pod{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Pod), err -} - -func (c *FakePods) List(opts api.ListOptions) (result *api.PodList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(podsResource, c.ns, opts), &api.PodList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.PodList{} - for _, item := range obj.(*api.PodList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested pods. -func (c *FakePods) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(podsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod_expansion.go deleted file mode 100644 index 32fd74c02..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_pod_expansion.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" -) - -func (c *FakePods) Bind(binding *api.Binding) error { - action := core.CreateActionImpl{} - action.Verb = "create" - action.Resource = podsResource - action.Subresource = "bindings" - action.Object = binding - - _, err := c.Fake.Invokes(action, binding) - return err -} - -func (c *FakePods) GetLogs(name string, opts *api.PodLogOptions) *restclient.Request { - action := core.GenericActionImpl{} - action.Verb = "get" - action.Namespace = c.ns - action.Resource = podsResource - action.Subresource = "logs" - action.Value = opts - - _, _ = c.Fake.Invokes(action, &api.Pod{}) - return &restclient.Request{} -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_podtemplate.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_podtemplate.go deleted file mode 100644 index c08d06bea..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_podtemplate.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakePodTemplates implements PodTemplateInterface -type FakePodTemplates struct { - Fake *FakeCore - ns string -} - -var podtemplatesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "podtemplates"} - -func (c *FakePodTemplates) Create(podTemplate *api.PodTemplate) (result *api.PodTemplate, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(podtemplatesResource, c.ns, podTemplate), &api.PodTemplate{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) Update(podTemplate *api.PodTemplate) (result *api.PodTemplate, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(podtemplatesResource, c.ns, podTemplate), &api.PodTemplate{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(podtemplatesResource, c.ns, name), &api.PodTemplate{}) - - return err -} - -func (c *FakePodTemplates) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(podtemplatesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.PodTemplateList{}) - return err -} - -func (c *FakePodTemplates) Get(name string) (result *api.PodTemplate, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(podtemplatesResource, c.ns, name), &api.PodTemplate{}) - - if obj == nil { - return nil, err - } - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) List(opts api.ListOptions) (result *api.PodTemplateList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(podtemplatesResource, c.ns, opts), &api.PodTemplateList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.PodTemplateList{} - for _, item := range obj.(*api.PodTemplateList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested podTemplates. -func (c *FakePodTemplates) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(podtemplatesResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_replicationcontroller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_replicationcontroller.go deleted file mode 100644 index 0a7faddbc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_replicationcontroller.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeReplicationControllers implements ReplicationControllerInterface -type FakeReplicationControllers struct { - Fake *FakeCore - ns string -} - -var replicationcontrollersResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "replicationcontrollers"} - -func (c *FakeReplicationControllers) Create(replicationController *api.ReplicationController) (result *api.ReplicationController, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(replicationcontrollersResource, c.ns, replicationController), &api.ReplicationController{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) Update(replicationController *api.ReplicationController) (result *api.ReplicationController, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(replicationcontrollersResource, c.ns, replicationController), &api.ReplicationController{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) UpdateStatus(replicationController *api.ReplicationController) (*api.ReplicationController, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(replicationcontrollersResource, "status", c.ns, replicationController), &api.ReplicationController{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(replicationcontrollersResource, c.ns, name), &api.ReplicationController{}) - - return err -} - -func (c *FakeReplicationControllers) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(replicationcontrollersResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.ReplicationControllerList{}) - return err -} - -func (c *FakeReplicationControllers) Get(name string) (result *api.ReplicationController, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(replicationcontrollersResource, c.ns, name), &api.ReplicationController{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) List(opts api.ListOptions) (result *api.ReplicationControllerList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(replicationcontrollersResource, c.ns, opts), &api.ReplicationControllerList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ReplicationControllerList{} - for _, item := range obj.(*api.ReplicationControllerList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested replicationControllers. -func (c *FakeReplicationControllers) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(replicationcontrollersResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_resourcequota.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_resourcequota.go deleted file mode 100644 index d91ee2685..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_resourcequota.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeResourceQuotas implements ResourceQuotaInterface -type FakeResourceQuotas struct { - Fake *FakeCore - ns string -} - -var resourcequotasResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "resourcequotas"} - -func (c *FakeResourceQuotas) Create(resourceQuota *api.ResourceQuota) (result *api.ResourceQuota, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(resourcequotasResource, c.ns, resourceQuota), &api.ResourceQuota{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) Update(resourceQuota *api.ResourceQuota) (result *api.ResourceQuota, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(resourcequotasResource, c.ns, resourceQuota), &api.ResourceQuota{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) UpdateStatus(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(resourcequotasResource, "status", c.ns, resourceQuota), &api.ResourceQuota{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(resourcequotasResource, c.ns, name), &api.ResourceQuota{}) - - return err -} - -func (c *FakeResourceQuotas) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(resourcequotasResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.ResourceQuotaList{}) - return err -} - -func (c *FakeResourceQuotas) Get(name string) (result *api.ResourceQuota, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(resourcequotasResource, c.ns, name), &api.ResourceQuota{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) List(opts api.ListOptions) (result *api.ResourceQuotaList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(resourcequotasResource, c.ns, opts), &api.ResourceQuotaList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ResourceQuotaList{} - for _, item := range obj.(*api.ResourceQuotaList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested resourceQuotas. -func (c *FakeResourceQuotas) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(resourcequotasResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_secret.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_secret.go deleted file mode 100644 index 0caaa47cf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_secret.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeSecrets implements SecretInterface -type FakeSecrets struct { - Fake *FakeCore - ns string -} - -var secretsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "secrets"} - -func (c *FakeSecrets) Create(secret *api.Secret) (result *api.Secret, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(secretsResource, c.ns, secret), &api.Secret{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) Update(secret *api.Secret) (result *api.Secret, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(secretsResource, c.ns, secret), &api.Secret{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(secretsResource, c.ns, name), &api.Secret{}) - - return err -} - -func (c *FakeSecrets) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(secretsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.SecretList{}) - return err -} - -func (c *FakeSecrets) Get(name string) (result *api.Secret, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(secretsResource, c.ns, name), &api.Secret{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) List(opts api.ListOptions) (result *api.SecretList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(secretsResource, c.ns, opts), &api.SecretList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.SecretList{} - for _, item := range obj.(*api.SecretList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested secrets. -func (c *FakeSecrets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(secretsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service.go deleted file mode 100644 index 62eae6481..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeServices implements ServiceInterface -type FakeServices struct { - Fake *FakeCore - ns string -} - -var servicesResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "services"} - -func (c *FakeServices) Create(service *api.Service) (result *api.Service, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(servicesResource, c.ns, service), &api.Service{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Service), err -} - -func (c *FakeServices) Update(service *api.Service) (result *api.Service, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(servicesResource, c.ns, service), &api.Service{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Service), err -} - -func (c *FakeServices) UpdateStatus(service *api.Service) (*api.Service, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(servicesResource, "status", c.ns, service), &api.Service{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Service), err -} - -func (c *FakeServices) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(servicesResource, c.ns, name), &api.Service{}) - - return err -} - -func (c *FakeServices) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(servicesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.ServiceList{}) - return err -} - -func (c *FakeServices) Get(name string) (result *api.Service, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(servicesResource, c.ns, name), &api.Service{}) - - if obj == nil { - return nil, err - } - return obj.(*api.Service), err -} - -func (c *FakeServices) List(opts api.ListOptions) (result *api.ServiceList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(servicesResource, c.ns, opts), &api.ServiceList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ServiceList{} - for _, item := range obj.(*api.ServiceList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested services. -func (c *FakeServices) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(servicesResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service_expansion.go deleted file mode 100644 index 3494b8737..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_service_expansion.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" -) - -func (c *FakeServices) ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper { - return c.Fake.InvokesProxy(core.NewProxyGetAction(servicesResource, c.ns, scheme, name, port, path, params)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_serviceaccount.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_serviceaccount.go deleted file mode 100644 index fbce964a1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake/fake_serviceaccount.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeServiceAccounts implements ServiceAccountInterface -type FakeServiceAccounts struct { - Fake *FakeCore - ns string -} - -var serviceaccountsResource = unversioned.GroupVersionResource{Group: "", Version: "", Resource: "serviceaccounts"} - -func (c *FakeServiceAccounts) Create(serviceAccount *api.ServiceAccount) (result *api.ServiceAccount, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(serviceaccountsResource, c.ns, serviceAccount), &api.ServiceAccount{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) Update(serviceAccount *api.ServiceAccount) (result *api.ServiceAccount, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(serviceaccountsResource, c.ns, serviceAccount), &api.ServiceAccount{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(serviceaccountsResource, c.ns, name), &api.ServiceAccount{}) - - return err -} - -func (c *FakeServiceAccounts) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(serviceaccountsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &api.ServiceAccountList{}) - return err -} - -func (c *FakeServiceAccounts) Get(name string) (result *api.ServiceAccount, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(serviceaccountsResource, c.ns, name), &api.ServiceAccount{}) - - if obj == nil { - return nil, err - } - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) List(opts api.ListOptions) (result *api.ServiceAccountList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(serviceaccountsResource, c.ns, opts), &api.ServiceAccountList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.ServiceAccountList{} - for _, item := range obj.(*api.ServiceAccountList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested serviceAccounts. -func (c *FakeServiceAccounts) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(serviceaccountsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/doc.go deleted file mode 100644 index eb358c26c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// This package is generated by client-gen with the default arguments. - -// Package fake has the automatically generated clients. -package fake diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_daemonset.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_daemonset.go deleted file mode 100644 index d53fa797a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_daemonset.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeDaemonSets implements DaemonSetInterface -type FakeDaemonSets struct { - Fake *FakeExtensions - ns string -} - -var daemonsetsResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "daemonsets"} - -func (c *FakeDaemonSets) Create(daemonSet *extensions.DaemonSet) (result *extensions.DaemonSet, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(daemonsetsResource, c.ns, daemonSet), &extensions.DaemonSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) Update(daemonSet *extensions.DaemonSet) (result *extensions.DaemonSet, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(daemonsetsResource, c.ns, daemonSet), &extensions.DaemonSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) UpdateStatus(daemonSet *extensions.DaemonSet) (*extensions.DaemonSet, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(daemonsetsResource, "status", c.ns, daemonSet), &extensions.DaemonSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(daemonsetsResource, c.ns, name), &extensions.DaemonSet{}) - - return err -} - -func (c *FakeDaemonSets) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(daemonsetsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.DaemonSetList{}) - return err -} - -func (c *FakeDaemonSets) Get(name string) (result *extensions.DaemonSet, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(daemonsetsResource, c.ns, name), &extensions.DaemonSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) List(opts api.ListOptions) (result *extensions.DaemonSetList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(daemonsetsResource, c.ns, opts), &extensions.DaemonSetList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.DaemonSetList{} - for _, item := range obj.(*extensions.DaemonSetList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested daemonSets. -func (c *FakeDaemonSets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(daemonsetsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment.go deleted file mode 100644 index c70a3a81d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeDeployments implements DeploymentInterface -type FakeDeployments struct { - Fake *FakeExtensions - ns string -} - -var deploymentsResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "deployments"} - -func (c *FakeDeployments) Create(deployment *extensions.Deployment) (result *extensions.Deployment, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(deploymentsResource, c.ns, deployment), &extensions.Deployment{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) Update(deployment *extensions.Deployment) (result *extensions.Deployment, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(deploymentsResource, c.ns, deployment), &extensions.Deployment{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) UpdateStatus(deployment *extensions.Deployment) (*extensions.Deployment, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(deploymentsResource, "status", c.ns, deployment), &extensions.Deployment{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(deploymentsResource, c.ns, name), &extensions.Deployment{}) - - return err -} - -func (c *FakeDeployments) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(deploymentsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.DeploymentList{}) - return err -} - -func (c *FakeDeployments) Get(name string) (result *extensions.Deployment, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(deploymentsResource, c.ns, name), &extensions.Deployment{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) List(opts api.ListOptions) (result *extensions.DeploymentList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(deploymentsResource, c.ns, opts), &extensions.DeploymentList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.DeploymentList{} - for _, item := range obj.(*extensions.DeploymentList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested deployments. -func (c *FakeDeployments) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(deploymentsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment_expansion.go deleted file mode 100644 index 3a7c06e50..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_deployment_expansion.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/testing/core" -) - -func (c *FakeDeployments) Rollback(deploymentRollback *extensions.DeploymentRollback) error { - action := core.CreateActionImpl{} - action.Verb = "create" - action.Resource = deploymentsResource - action.Subresource = "rollback" - action.Object = deploymentRollback - - _, err := c.Fake.Invokes(action, deploymentRollback) - return err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_extensions_client.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_extensions_client.go deleted file mode 100644 index dfddee1c7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_extensions_client.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - unversioned "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned" - restclient "k8s.io/kubernetes/pkg/client/restclient" - core "k8s.io/kubernetes/pkg/client/testing/core" -) - -type FakeExtensions struct { - *core.Fake -} - -func (c *FakeExtensions) DaemonSets(namespace string) unversioned.DaemonSetInterface { - return &FakeDaemonSets{c, namespace} -} - -func (c *FakeExtensions) Deployments(namespace string) unversioned.DeploymentInterface { - return &FakeDeployments{c, namespace} -} - -func (c *FakeExtensions) HorizontalPodAutoscalers(namespace string) unversioned.HorizontalPodAutoscalerInterface { - return &FakeHorizontalPodAutoscalers{c, namespace} -} - -func (c *FakeExtensions) Ingresses(namespace string) unversioned.IngressInterface { - return &FakeIngresses{c, namespace} -} - -func (c *FakeExtensions) ReplicaSets(namespace string) unversioned.ReplicaSetInterface { - return &FakeReplicaSets{c, namespace} -} - -func (c *FakeExtensions) Scales(namespace string) unversioned.ScaleInterface { - return &FakeScales{c, namespace} -} - -func (c *FakeExtensions) ThirdPartyResources() unversioned.ThirdPartyResourceInterface { - return &FakeThirdPartyResources{c} -} - -// GetRESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeExtensions) GetRESTClient() *restclient.RESTClient { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_horizontalpodautoscaler.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_horizontalpodautoscaler.go deleted file mode 100644 index 29000bef0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_horizontalpodautoscaler.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeHorizontalPodAutoscalers implements HorizontalPodAutoscalerInterface -type FakeHorizontalPodAutoscalers struct { - Fake *FakeExtensions - ns string -} - -var horizontalpodautoscalersResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "horizontalpodautoscalers"} - -func (c *FakeHorizontalPodAutoscalers) Create(horizontalPodAutoscaler *extensions.HorizontalPodAutoscaler) (result *extensions.HorizontalPodAutoscaler, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(horizontalpodautoscalersResource, c.ns, horizontalPodAutoscaler), &extensions.HorizontalPodAutoscaler{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) Update(horizontalPodAutoscaler *extensions.HorizontalPodAutoscaler) (result *extensions.HorizontalPodAutoscaler, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(horizontalpodautoscalersResource, c.ns, horizontalPodAutoscaler), &extensions.HorizontalPodAutoscaler{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) UpdateStatus(horizontalPodAutoscaler *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(horizontalpodautoscalersResource, "status", c.ns, horizontalPodAutoscaler), &extensions.HorizontalPodAutoscaler{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(horizontalpodautoscalersResource, c.ns, name), &extensions.HorizontalPodAutoscaler{}) - - return err -} - -func (c *FakeHorizontalPodAutoscalers) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(horizontalpodautoscalersResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.HorizontalPodAutoscalerList{}) - return err -} - -func (c *FakeHorizontalPodAutoscalers) Get(name string) (result *extensions.HorizontalPodAutoscaler, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(horizontalpodautoscalersResource, c.ns, name), &extensions.HorizontalPodAutoscaler{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) List(opts api.ListOptions) (result *extensions.HorizontalPodAutoscalerList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(horizontalpodautoscalersResource, c.ns, opts), &extensions.HorizontalPodAutoscalerList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.HorizontalPodAutoscalerList{} - for _, item := range obj.(*extensions.HorizontalPodAutoscalerList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested horizontalPodAutoscalers. -func (c *FakeHorizontalPodAutoscalers) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(horizontalpodautoscalersResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_ingress.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_ingress.go deleted file mode 100644 index 68578ce12..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_ingress.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeIngresses implements IngressInterface -type FakeIngresses struct { - Fake *FakeExtensions - ns string -} - -var ingressesResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "ingresses"} - -func (c *FakeIngresses) Create(ingress *extensions.Ingress) (result *extensions.Ingress, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(ingressesResource, c.ns, ingress), &extensions.Ingress{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngresses) Update(ingress *extensions.Ingress) (result *extensions.Ingress, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(ingressesResource, c.ns, ingress), &extensions.Ingress{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngresses) UpdateStatus(ingress *extensions.Ingress) (*extensions.Ingress, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(ingressesResource, "status", c.ns, ingress), &extensions.Ingress{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngresses) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(ingressesResource, c.ns, name), &extensions.Ingress{}) - - return err -} - -func (c *FakeIngresses) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(ingressesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.IngressList{}) - return err -} - -func (c *FakeIngresses) Get(name string) (result *extensions.Ingress, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(ingressesResource, c.ns, name), &extensions.Ingress{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngresses) List(opts api.ListOptions) (result *extensions.IngressList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(ingressesResource, c.ns, opts), &extensions.IngressList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.IngressList{} - for _, item := range obj.(*extensions.IngressList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested ingresses. -func (c *FakeIngresses) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(ingressesResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_replicaset.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_replicaset.go deleted file mode 100644 index 9d7241ca4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_replicaset.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeReplicaSets implements ReplicaSetInterface -type FakeReplicaSets struct { - Fake *FakeExtensions - ns string -} - -var replicasetsResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "replicasets"} - -func (c *FakeReplicaSets) Create(replicaSet *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) { - obj, err := c.Fake. - Invokes(core.NewCreateAction(replicasetsResource, c.ns, replicaSet), &extensions.ReplicaSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) Update(replicaSet *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) { - obj, err := c.Fake. - Invokes(core.NewUpdateAction(replicasetsResource, c.ns, replicaSet), &extensions.ReplicaSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) UpdateStatus(replicaSet *extensions.ReplicaSet) (*extensions.ReplicaSet, error) { - obj, err := c.Fake. - Invokes(core.NewUpdateSubresourceAction(replicasetsResource, "status", c.ns, replicaSet), &extensions.ReplicaSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewDeleteAction(replicasetsResource, c.ns, name), &extensions.ReplicaSet{}) - - return err -} - -func (c *FakeReplicaSets) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewDeleteCollectionAction(replicasetsResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.ReplicaSetList{}) - return err -} - -func (c *FakeReplicaSets) Get(name string) (result *extensions.ReplicaSet, err error) { - obj, err := c.Fake. - Invokes(core.NewGetAction(replicasetsResource, c.ns, name), &extensions.ReplicaSet{}) - - if obj == nil { - return nil, err - } - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) List(opts api.ListOptions) (result *extensions.ReplicaSetList, err error) { - obj, err := c.Fake. - Invokes(core.NewListAction(replicasetsResource, c.ns, opts), &extensions.ReplicaSetList{}) - - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.ReplicaSetList{} - for _, item := range obj.(*extensions.ReplicaSetList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested replicaSets. -func (c *FakeReplicaSets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewWatchAction(replicasetsResource, c.ns, opts)) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale.go deleted file mode 100644 index d2cfc5f7b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -// FakeScales implements ScaleInterface -type FakeScales struct { - Fake *FakeExtensions - ns string -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale_expansion.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale_expansion.go deleted file mode 100644 index 949836afe..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_scale_expansion.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/testing/core" -) - -func (c *FakeScales) Get(kind string, name string) (result *extensions.Scale, err error) { - action := core.GetActionImpl{} - action.Verb = "get" - action.Namespace = c.ns - action.Resource = unversioned.GroupVersionResource{Resource: kind} - action.Subresource = "scale" - action.Name = name - obj, err := c.Fake.Invokes(action, &extensions.Scale{}) - result = obj.(*extensions.Scale) - return -} - -func (c *FakeScales) Update(kind string, scale *extensions.Scale) (result *extensions.Scale, err error) { - action := core.UpdateActionImpl{} - action.Verb = "update" - action.Namespace = c.ns - action.Resource = unversioned.GroupVersionResource{Resource: kind} - action.Subresource = "scale" - action.Object = scale - obj, err := c.Fake.Invokes(action, scale) - result = obj.(*extensions.Scale) - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_thirdpartyresource.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_thirdpartyresource.go deleted file mode 100644 index 37cbca979..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake/fake_thirdpartyresource.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - api "k8s.io/kubernetes/pkg/api" - unversioned "k8s.io/kubernetes/pkg/api/unversioned" - extensions "k8s.io/kubernetes/pkg/apis/extensions" - core "k8s.io/kubernetes/pkg/client/testing/core" - labels "k8s.io/kubernetes/pkg/labels" - watch "k8s.io/kubernetes/pkg/watch" -) - -// FakeThirdPartyResources implements ThirdPartyResourceInterface -type FakeThirdPartyResources struct { - Fake *FakeExtensions -} - -var thirdpartyresourcesResource = unversioned.GroupVersionResource{Group: "extensions", Version: "", Resource: "thirdpartyresources"} - -func (c *FakeThirdPartyResources) Create(thirdPartyResource *extensions.ThirdPartyResource) (result *extensions.ThirdPartyResource, err error) { - obj, err := c.Fake. - Invokes(core.NewRootCreateAction(thirdpartyresourcesResource, thirdPartyResource), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) Update(thirdPartyResource *extensions.ThirdPartyResource) (result *extensions.ThirdPartyResource, err error) { - obj, err := c.Fake. - Invokes(core.NewRootUpdateAction(thirdpartyresourcesResource, thirdPartyResource), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake. - Invokes(core.NewRootDeleteAction(thirdpartyresourcesResource, name), &extensions.ThirdPartyResource{}) - return err -} - -func (c *FakeThirdPartyResources) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := core.NewRootDeleteCollectionAction(thirdpartyresourcesResource, listOptions) - - _, err := c.Fake.Invokes(action, &extensions.ThirdPartyResourceList{}) - return err -} - -func (c *FakeThirdPartyResources) Get(name string) (result *extensions.ThirdPartyResource, err error) { - obj, err := c.Fake. - Invokes(core.NewRootGetAction(thirdpartyresourcesResource, name), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) List(opts api.ListOptions) (result *extensions.ThirdPartyResourceList, err error) { - obj, err := c.Fake. - Invokes(core.NewRootListAction(thirdpartyresourcesResource, opts), &extensions.ThirdPartyResourceList{}) - if obj == nil { - return nil, err - } - - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.ThirdPartyResourceList{} - for _, item := range obj.(*extensions.ThirdPartyResourceList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested thirdPartyResources. -func (c *FakeThirdPartyResources) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(core.NewRootWatchAction(thirdpartyresourcesResource, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/event_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/event_test.go deleted file mode 100644 index ba7005abf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/event_test.go +++ /dev/null @@ -1,926 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 record - -import ( - "encoding/json" - "fmt" - "math/rand" - "strconv" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - _ "k8s.io/kubernetes/pkg/api/install" // To register api.Pod used in tests below - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - k8sruntime "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/strategicpatch" - "net/http" -) - -type testEventSink struct { - OnCreate func(e *api.Event) (*api.Event, error) - OnUpdate func(e *api.Event) (*api.Event, error) - OnPatch func(e *api.Event, p []byte) (*api.Event, error) -} - -// CreateEvent records the event for testing. -func (t *testEventSink) Create(e *api.Event) (*api.Event, error) { - if t.OnCreate != nil { - return t.OnCreate(e) - } - return e, nil -} - -// UpdateEvent records the event for testing. -func (t *testEventSink) Update(e *api.Event) (*api.Event, error) { - if t.OnUpdate != nil { - return t.OnUpdate(e) - } - return e, nil -} - -// PatchEvent records the event for testing. -func (t *testEventSink) Patch(e *api.Event, p []byte) (*api.Event, error) { - if t.OnPatch != nil { - return t.OnPatch(e, p) - } - return e, nil -} - -type OnCreateFunc func(*api.Event) (*api.Event, error) - -func OnCreateFactory(testCache map[string]*api.Event, createEvent chan<- *api.Event) OnCreateFunc { - return func(event *api.Event) (*api.Event, error) { - testCache[getEventKey(event)] = event - createEvent <- event - return event, nil - } -} - -type OnPatchFunc func(*api.Event, []byte) (*api.Event, error) - -func OnPatchFactory(testCache map[string]*api.Event, patchEvent chan<- *api.Event) OnPatchFunc { - return func(event *api.Event, patch []byte) (*api.Event, error) { - cachedEvent, found := testCache[getEventKey(event)] - if !found { - return nil, fmt.Errorf("unexpected error: couldn't find Event in testCache.") - } - originalData, err := json.Marshal(cachedEvent) - if err != nil { - return nil, fmt.Errorf("unexpected error: %v", err) - } - patched, err := strategicpatch.StrategicMergePatch(originalData, patch, event) - if err != nil { - return nil, fmt.Errorf("unexpected error: %v", err) - } - patchedObj := &api.Event{} - err = json.Unmarshal(patched, patchedObj) - if err != nil { - return nil, fmt.Errorf("unexpected error: %v", err) - } - patchEvent <- patchedObj - return patchedObj, nil - } -} - -func TestEventf(t *testing.T) { - testPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - SelfLink: "/api/version/pods/foo", - Name: "foo", - Namespace: "baz", - UID: "bar", - }, - } - testPod2 := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - SelfLink: "/api/version/pods/foo", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - }, - } - testRef, err := api.GetPartialReference(testPod, "spec.containers[2]") - testRef2, err := api.GetPartialReference(testPod2, "spec.containers[3]") - if err != nil { - t.Fatal(err) - } - table := []struct { - obj k8sruntime.Object - eventtype string - reason string - messageFmt string - elements []interface{} - expect *api.Event - expectLog string - expectUpdate bool - }{ - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testPod, - eventtype: api.EventTypeNormal, - reason: "Killed", - messageFmt: "some other verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - }, - Reason: "Killed", - Message: "some other verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 2, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: true, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 3, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: true, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Stopped", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Stopped", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Stopped", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Stopped", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 2, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, - expectUpdate: true, - }, - } - - testCache := map[string]*api.Event{} - logCalled := make(chan struct{}) - createEvent := make(chan *api.Event) - updateEvent := make(chan *api.Event) - patchEvent := make(chan *api.Event) - testEvents := testEventSink{ - OnCreate: OnCreateFactory(testCache, createEvent), - OnUpdate: func(event *api.Event) (*api.Event, error) { - updateEvent <- event - return event, nil - }, - OnPatch: OnPatchFactory(testCache, patchEvent), - } - eventBroadcaster := NewBroadcasterForTests(0) - sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) - - clock := util.NewFakeClock(time.Now()) - recorder := recorderWithFakeClock(api.EventSource{Component: "eventTest"}, eventBroadcaster, clock) - for index, item := range table { - clock.Step(1 * time.Second) - // TODO: uncomment this after we upgrade to Go 1.6.1. - // testing.(*common).log() is racing with testing.(*T).report() in Go 1.6. - // See #23533 for more details. - // logWatcher1 := eventBroadcaster.StartLogging(t.Logf) // Prove that it is useful - logWatcher2 := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { - if e, a := item.expectLog, fmt.Sprintf(formatter, args...); e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - logCalled <- struct{}{} - }) - recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) - - <-logCalled - - // validate event - if item.expectUpdate { - actualEvent := <-patchEvent - validateEvent(string(index), actualEvent, item.expect, t) - } else { - actualEvent := <-createEvent - validateEvent(string(index), actualEvent, item.expect, t) - } - // TODO: uncomment this after we upgrade to Go 1.6.1. - // logWatcher1.Stop() - logWatcher2.Stop() - } - sinkWatcher.Stop() -} - -func recorderWithFakeClock(eventSource api.EventSource, eventBroadcaster EventBroadcaster, clock util.Clock) EventRecorder { - return &recorderImpl{eventSource, eventBroadcaster.(*eventBroadcasterImpl).Broadcaster, clock} -} - -func TestWriteEventError(t *testing.T) { - type entry struct { - timesToSendError int - attemptsWanted int - err error - } - table := map[string]*entry{ - "giveUp1": { - timesToSendError: 1000, - attemptsWanted: 1, - err: &restclient.RequestConstructionError{}, - }, - "giveUp2": { - timesToSendError: 1000, - attemptsWanted: 1, - err: &errors.StatusError{}, - }, - "retry1": { - timesToSendError: 1000, - attemptsWanted: 12, - err: &errors.UnexpectedObjectError{}, - }, - "retry2": { - timesToSendError: 1000, - attemptsWanted: 12, - err: fmt.Errorf("A weird error"), - }, - "succeedEventually": { - timesToSendError: 2, - attemptsWanted: 2, - err: fmt.Errorf("A weird error"), - }, - } - - eventCorrelator := NewEventCorrelator(util.RealClock{}) - randGen := rand.New(rand.NewSource(time.Now().UnixNano())) - - for caseName, ent := range table { - attempts := 0 - sink := &testEventSink{ - OnCreate: func(event *api.Event) (*api.Event, error) { - attempts++ - if attempts < ent.timesToSendError { - return nil, ent.err - } - return event, nil - }, - } - ev := &api.Event{} - recordToSink(sink, ev, eventCorrelator, randGen, 0) - if attempts != ent.attemptsWanted { - t.Errorf("case %v: wanted %d, got %d attempts", caseName, ent.attemptsWanted, attempts) - } - } -} - -func TestUpdateExpiredEvent(t *testing.T) { - eventCorrelator := NewEventCorrelator(util.RealClock{}) - randGen := rand.New(rand.NewSource(time.Now().UnixNano())) - - var createdEvent *api.Event - - sink := &testEventSink{ - OnPatch: func(*api.Event, []byte) (*api.Event, error) { - return nil, &errors.StatusError{ - ErrStatus: unversioned.Status{ - Code: http.StatusNotFound, - Reason: unversioned.StatusReasonNotFound, - }} - }, - OnCreate: func(event *api.Event) (*api.Event, error) { - createdEvent = event - return event, nil - }, - } - - ev := &api.Event{} - ev.ResourceVersion = "updated-resource-version" - ev.Count = 2 - recordToSink(sink, ev, eventCorrelator, randGen, 0) - - if createdEvent == nil { - t.Error("Event did not get created after patch failed") - return - } - - if createdEvent.ResourceVersion != "" { - t.Errorf("Event did not have its resource version cleared, was %s", createdEvent.ResourceVersion) - } -} - -func TestLotsOfEvents(t *testing.T) { - recorderCalled := make(chan struct{}) - loggerCalled := make(chan struct{}) - - // Fail each event a few times to ensure there's some load on the tested code. - var counts [1000]int - testEvents := testEventSink{ - OnCreate: func(event *api.Event) (*api.Event, error) { - num, err := strconv.Atoi(event.Message) - if err != nil { - t.Error(err) - return event, nil - } - counts[num]++ - if counts[num] < 5 { - return nil, fmt.Errorf("fake error") - } - recorderCalled <- struct{}{} - return event, nil - }, - } - - eventBroadcaster := NewBroadcasterForTests(0) - sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) - logWatcher := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { - loggerCalled <- struct{}{} - }) - recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "eventTest"}) - ref := &api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - } - for i := 0; i < maxQueuedEvents; i++ { - // we need to vary the reason to prevent aggregation - go recorder.Eventf(ref, api.EventTypeNormal, "Reason-"+string(i), strconv.Itoa(i)) - } - // Make sure no events were dropped by either of the listeners. - for i := 0; i < maxQueuedEvents; i++ { - <-recorderCalled - <-loggerCalled - } - // Make sure that every event was attempted 5 times - for i := 0; i < maxQueuedEvents; i++ { - if counts[i] < 5 { - t.Errorf("Only attempted to record event '%d' %d times.", i, counts[i]) - } - } - sinkWatcher.Stop() - logWatcher.Stop() -} - -func TestEventfNoNamespace(t *testing.T) { - testPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - SelfLink: "/api/version/pods/foo", - Name: "foo", - UID: "bar", - }, - } - testRef, err := api.GetPartialReference(testPod, "spec.containers[2]") - if err != nil { - t.Fatal(err) - } - table := []struct { - obj k8sruntime.Object - eventtype string - reason string - messageFmt string - elements []interface{} - expect *api.Event - expectLog string - expectUpdate bool - }{ - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "default", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: false, - }, - } - - testCache := map[string]*api.Event{} - logCalled := make(chan struct{}) - createEvent := make(chan *api.Event) - updateEvent := make(chan *api.Event) - patchEvent := make(chan *api.Event) - testEvents := testEventSink{ - OnCreate: OnCreateFactory(testCache, createEvent), - OnUpdate: func(event *api.Event) (*api.Event, error) { - updateEvent <- event - return event, nil - }, - OnPatch: OnPatchFactory(testCache, patchEvent), - } - eventBroadcaster := NewBroadcasterForTests(0) - sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) - - clock := util.NewFakeClock(time.Now()) - recorder := recorderWithFakeClock(api.EventSource{Component: "eventTest"}, eventBroadcaster, clock) - - for index, item := range table { - clock.Step(1 * time.Second) - // TODO: uncomment this after we upgrade to Go 1.6.1. - // testing.(*common).log() is racing with testing.(*T).report() in Go 1.6. - // See #23533 for more details. - // logWatcher1 := eventBroadcaster.StartLogging(t.Logf) // Prove that it is useful - logWatcher2 := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { - if e, a := item.expectLog, fmt.Sprintf(formatter, args...); e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - logCalled <- struct{}{} - }) - recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) - - <-logCalled - - // validate event - if item.expectUpdate { - actualEvent := <-patchEvent - validateEvent(string(index), actualEvent, item.expect, t) - } else { - actualEvent := <-createEvent - validateEvent(string(index), actualEvent, item.expect, t) - } - - // TODO: uncomment this after we upgrade to Go 1.6.1. - // logWatcher1.Stop() - logWatcher2.Stop() - } - sinkWatcher.Stop() -} - -func TestMultiSinkCache(t *testing.T) { - testPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - SelfLink: "/api/version/pods/foo", - Name: "foo", - Namespace: "baz", - UID: "bar", - }, - } - testPod2 := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - SelfLink: "/api/version/pods/foo", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - }, - } - testRef, err := api.GetPartialReference(testPod, "spec.containers[2]") - testRef2, err := api.GetPartialReference(testPod2, "spec.containers[3]") - if err != nil { - t.Fatal(err) - } - table := []struct { - obj k8sruntime.Object - eventtype string - reason string - messageFmt string - elements []interface{} - expect *api.Event - expectLog string - expectUpdate bool - }{ - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testPod, - eventtype: api.EventTypeNormal, - reason: "Killed", - messageFmt: "some other verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - }, - Reason: "Killed", - Message: "some other verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 2, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: true, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef, - eventtype: api.EventTypeNormal, - reason: "Started", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "bar", - APIVersion: "version", - FieldPath: "spec.containers[2]", - }, - Reason: "Started", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 3, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, - expectUpdate: true, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Stopped", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Stopped", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 1, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, - expectUpdate: false, - }, - { - obj: testRef2, - eventtype: api.EventTypeNormal, - reason: "Stopped", - messageFmt: "some verbose message: %v", - elements: []interface{}{1}, - expect: &api.Event{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - }, - InvolvedObject: api.ObjectReference{ - Kind: "Pod", - Name: "foo", - Namespace: "baz", - UID: "differentUid", - APIVersion: "version", - FieldPath: "spec.containers[3]", - }, - Reason: "Stopped", - Message: "some verbose message: 1", - Source: api.EventSource{Component: "eventTest"}, - Count: 2, - Type: api.EventTypeNormal, - }, - expectLog: `Event(api.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, - expectUpdate: true, - }, - } - - testCache := map[string]*api.Event{} - createEvent := make(chan *api.Event) - updateEvent := make(chan *api.Event) - patchEvent := make(chan *api.Event) - testEvents := testEventSink{ - OnCreate: OnCreateFactory(testCache, createEvent), - OnUpdate: func(event *api.Event) (*api.Event, error) { - updateEvent <- event - return event, nil - }, - OnPatch: OnPatchFactory(testCache, patchEvent), - } - - testCache2 := map[string]*api.Event{} - createEvent2 := make(chan *api.Event) - updateEvent2 := make(chan *api.Event) - patchEvent2 := make(chan *api.Event) - testEvents2 := testEventSink{ - OnCreate: OnCreateFactory(testCache2, createEvent2), - OnUpdate: func(event *api.Event) (*api.Event, error) { - updateEvent2 <- event - return event, nil - }, - OnPatch: OnPatchFactory(testCache2, patchEvent2), - } - - eventBroadcaster := NewBroadcasterForTests(0) - clock := util.NewFakeClock(time.Now()) - recorder := recorderWithFakeClock(api.EventSource{Component: "eventTest"}, eventBroadcaster, clock) - - sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) - for index, item := range table { - clock.Step(1 * time.Second) - recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) - - // validate event - if item.expectUpdate { - actualEvent := <-patchEvent - validateEvent(string(index), actualEvent, item.expect, t) - } else { - actualEvent := <-createEvent - validateEvent(string(index), actualEvent, item.expect, t) - } - } - - // Another StartRecordingToSink call should start to record events with new clean cache. - sinkWatcher2 := eventBroadcaster.StartRecordingToSink(&testEvents2) - for index, item := range table { - clock.Step(1 * time.Second) - recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) - - // validate event - if item.expectUpdate { - actualEvent := <-patchEvent2 - validateEvent(string(index), actualEvent, item.expect, t) - } else { - actualEvent := <-createEvent2 - validateEvent(string(index), actualEvent, item.expect, t) - } - } - - sinkWatcher.Stop() - sinkWatcher2.Stop() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/events_cache_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/events_cache_test.go deleted file mode 100644 index 166550783..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/record/events_cache_test.go +++ /dev/null @@ -1,254 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 record - -import ( - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/diff" -) - -func makeObjectReference(kind, name, namespace string) api.ObjectReference { - return api.ObjectReference{ - Kind: kind, - Name: name, - Namespace: namespace, - UID: "C934D34AFB20242", - APIVersion: "version", - } -} - -func makeEvent(reason, message string, involvedObject api.ObjectReference) api.Event { - eventTime := unversioned.Now() - event := api.Event{ - Reason: reason, - Message: message, - InvolvedObject: involvedObject, - Source: api.EventSource{ - Component: "kubelet", - Host: "kublet.node1", - }, - Count: 1, - FirstTimestamp: eventTime, - LastTimestamp: eventTime, - Type: api.EventTypeNormal, - } - return event -} - -func makeEvents(num int, template api.Event) []api.Event { - events := []api.Event{} - for i := 0; i < num; i++ { - events = append(events, template) - } - return events -} - -func makeUniqueEvents(num int) []api.Event { - events := []api.Event{} - kind := "Pod" - for i := 0; i < num; i++ { - reason := strings.Join([]string{"reason", string(i)}, "-") - message := strings.Join([]string{"message", string(i)}, "-") - name := strings.Join([]string{"pod", string(i)}, "-") - namespace := strings.Join([]string{"ns", string(i)}, "-") - involvedObject := makeObjectReference(kind, name, namespace) - events = append(events, makeEvent(reason, message, involvedObject)) - } - return events -} - -func makeSimilarEvents(num int, template api.Event, messagePrefix string) []api.Event { - events := makeEvents(num, template) - for i := range events { - events[i].Message = strings.Join([]string{messagePrefix, string(i), events[i].Message}, "-") - } - return events -} - -func setCount(event api.Event, count int) api.Event { - event.Count = int32(count) - return event -} - -func validateEvent(messagePrefix string, actualEvent *api.Event, expectedEvent *api.Event, t *testing.T) (*api.Event, error) { - recvEvent := *actualEvent - expectCompression := expectedEvent.Count > 1 - t.Logf("%v - expectedEvent.Count is %d\n", messagePrefix, expectedEvent.Count) - // Just check that the timestamp was set. - if recvEvent.FirstTimestamp.IsZero() || recvEvent.LastTimestamp.IsZero() { - t.Errorf("%v - timestamp wasn't set: %#v", messagePrefix, recvEvent) - } - actualFirstTimestamp := recvEvent.FirstTimestamp - actualLastTimestamp := recvEvent.LastTimestamp - if actualFirstTimestamp.Equal(actualLastTimestamp) { - if expectCompression { - t.Errorf("%v - FirstTimestamp (%q) and LastTimestamp (%q) must be different to indicate event compression happened, but were the same. Actual Event: %#v", messagePrefix, actualFirstTimestamp, actualLastTimestamp, recvEvent) - } - } else { - if expectedEvent.Count == 1 { - t.Errorf("%v - FirstTimestamp (%q) and LastTimestamp (%q) must be equal to indicate only one occurrence of the event, but were different. Actual Event: %#v", messagePrefix, actualFirstTimestamp, actualLastTimestamp, recvEvent) - } - } - // Temp clear time stamps for comparison because actual values don't matter for comparison - recvEvent.FirstTimestamp = expectedEvent.FirstTimestamp - recvEvent.LastTimestamp = expectedEvent.LastTimestamp - // Check that name has the right prefix. - if n, en := recvEvent.Name, expectedEvent.Name; !strings.HasPrefix(n, en) { - t.Errorf("%v - Name '%v' does not contain prefix '%v'", messagePrefix, n, en) - } - recvEvent.Name = expectedEvent.Name - if e, a := expectedEvent, &recvEvent; !reflect.DeepEqual(e, a) { - t.Errorf("%v - diff: %s", messagePrefix, diff.ObjectGoPrintDiff(e, a)) - } - recvEvent.FirstTimestamp = actualFirstTimestamp - recvEvent.LastTimestamp = actualLastTimestamp - return actualEvent, nil -} - -// TestDefaultEventFilterFunc ensures that no events are filtered -func TestDefaultEventFilterFunc(t *testing.T) { - event := makeEvent("end-of-world", "it was fun", makeObjectReference("Pod", "pod1", "other")) - if DefaultEventFilterFunc(&event) { - t.Fatalf("DefaultEventFilterFunc should always return false") - } -} - -// TestEventAggregatorByReasonFunc ensures that two events are aggregated if they vary only by event.message -func TestEventAggregatorByReasonFunc(t *testing.T) { - event1 := makeEvent("end-of-world", "it was fun", makeObjectReference("Pod", "pod1", "other")) - event2 := makeEvent("end-of-world", "it was awful", makeObjectReference("Pod", "pod1", "other")) - event3 := makeEvent("nevermind", "it was a bug", makeObjectReference("Pod", "pod1", "other")) - - aggKey1, localKey1 := EventAggregatorByReasonFunc(&event1) - aggKey2, localKey2 := EventAggregatorByReasonFunc(&event2) - aggKey3, _ := EventAggregatorByReasonFunc(&event3) - - if aggKey1 != aggKey2 { - t.Errorf("Expected %v equal %v", aggKey1, aggKey2) - } - if localKey1 == localKey2 { - t.Errorf("Expected %v to not equal %v", aggKey1, aggKey3) - } - if aggKey1 == aggKey3 { - t.Errorf("Expected %v to not equal %v", aggKey1, aggKey3) - } -} - -// TestEventAggregatorByReasonMessageFunc validates the proper output for an aggregate message -func TestEventAggregatorByReasonMessageFunc(t *testing.T) { - expected := "(events with common reason combined)" - event1 := makeEvent("end-of-world", "it was fun", makeObjectReference("Pod", "pod1", "other")) - if actual := EventAggregatorByReasonMessageFunc(&event1); expected != actual { - t.Errorf("Expected %v got %v", expected, actual) - } -} - -// TestEventCorrelator validates proper counting, aggregation of events -func TestEventCorrelator(t *testing.T) { - firstEvent := makeEvent("first", "i am first", makeObjectReference("Pod", "my-pod", "my-ns")) - duplicateEvent := makeEvent("duplicate", "me again", makeObjectReference("Pod", "my-pod", "my-ns")) - uniqueEvent := makeEvent("unique", "snowflake", makeObjectReference("Pod", "my-pod", "my-ns")) - similarEvent := makeEvent("similar", "similar message", makeObjectReference("Pod", "my-pod", "my-ns")) - aggregateEvent := makeEvent(similarEvent.Reason, EventAggregatorByReasonMessageFunc(&similarEvent), similarEvent.InvolvedObject) - scenario := map[string]struct { - previousEvents []api.Event - newEvent api.Event - expectedEvent api.Event - intervalSeconds int - }{ - "create-a-single-event": { - previousEvents: []api.Event{}, - newEvent: firstEvent, - expectedEvent: setCount(firstEvent, 1), - intervalSeconds: 5, - }, - "the-same-event-should-just-count": { - previousEvents: makeEvents(1, duplicateEvent), - newEvent: duplicateEvent, - expectedEvent: setCount(duplicateEvent, 2), - intervalSeconds: 5, - }, - "the-same-event-should-just-count-even-if-more-than-aggregate": { - previousEvents: makeEvents(defaultAggregateMaxEvents, duplicateEvent), - newEvent: duplicateEvent, - expectedEvent: setCount(duplicateEvent, defaultAggregateMaxEvents+1), - intervalSeconds: 5, - }, - "create-many-unique-events": { - previousEvents: makeUniqueEvents(30), - newEvent: uniqueEvent, - expectedEvent: setCount(uniqueEvent, 1), - intervalSeconds: 5, - }, - "similar-events-should-aggregate-event": { - previousEvents: makeSimilarEvents(defaultAggregateMaxEvents-1, similarEvent, similarEvent.Message), - newEvent: similarEvent, - expectedEvent: setCount(aggregateEvent, 1), - intervalSeconds: 5, - }, - "similar-events-many-times-should-count-the-aggregate": { - previousEvents: makeSimilarEvents(defaultAggregateMaxEvents, similarEvent, similarEvent.Message), - newEvent: similarEvent, - expectedEvent: setCount(aggregateEvent, 2), - intervalSeconds: 5, - }, - "similar-events-whose-interval-is-greater-than-aggregate-interval-do-not-aggregate": { - previousEvents: makeSimilarEvents(defaultAggregateMaxEvents-1, similarEvent, similarEvent.Message), - newEvent: similarEvent, - expectedEvent: setCount(similarEvent, 1), - intervalSeconds: defaultAggregateIntervalInSeconds, - }, - } - - for testScenario, testInput := range scenario { - eventInterval := time.Duration(testInput.intervalSeconds) * time.Second - clock := util.IntervalClock{Time: time.Now(), Duration: eventInterval} - correlator := NewEventCorrelator(&clock) - for i := range testInput.previousEvents { - event := testInput.previousEvents[i] - now := unversioned.NewTime(clock.Now()) - event.FirstTimestamp = now - event.LastTimestamp = now - result, err := correlator.EventCorrelate(&event) - if err != nil { - t.Errorf("scenario %v: unexpected error playing back prevEvents %v", testScenario, err) - } - correlator.UpdateState(result.Event) - } - - // update the input to current clock value - now := unversioned.NewTime(clock.Now()) - testInput.newEvent.FirstTimestamp = now - testInput.newEvent.LastTimestamp = now - result, err := correlator.EventCorrelate(&testInput.newEvent) - if err != nil { - t.Errorf("scenario %v: unexpected error correlating input event %v", testScenario, err) - } - - _, err = validateEvent(testScenario, result.Event, &testInput.expectedEvent, t) - if err != nil { - t.Errorf("scenario %v: unexpected error validating result %v", testScenario, err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/client_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/client_test.go deleted file mode 100644 index e1cc1f9fa..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/client_test.go +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "net/http" - "net/http/httptest" - "net/url" - "os" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/diff" - utiltesting "k8s.io/kubernetes/pkg/util/testing" -) - -func TestDoRequestSuccess(t *testing.T) { - status := &unversioned.Status{Status: unversioned.StatusSuccess} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c, err := RESTClientFor(&Config{ - Host: testServer.URL, - ContentConfig: ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - }, - Username: "user", - Password: "pass", - }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - body, err := c.Get().Prefix("test").Do().Raw() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if fakeHandler.RequestReceived.Header["Authorization"] == nil { - t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived) - } - statusOut, err := runtime.Decode(testapi.Default.Codec(), body) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if !reflect.DeepEqual(status, statusOut) { - t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", status, statusOut) - } - fakeHandler.ValidateRequest(t, "/"+testapi.Default.GroupVersion().String()+"/test", "GET", nil) -} - -func TestDoRequestFailed(t *testing.T) { - status := &unversioned.Status{ - Code: http.StatusNotFound, - Status: unversioned.StatusFailure, - Reason: unversioned.StatusReasonNotFound, - Message: " \"\" not found", - Details: &unversioned.StatusDetails{}, - } - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 404, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c, err := RESTClientFor(&Config{ - Host: testServer.URL, - ContentConfig: ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - }, - }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - body, err := c.Get().Do().Raw() - if err == nil || body != nil { - t.Errorf("unexpected non-error: %#v", body) - } - ss, ok := err.(errors.APIStatus) - if !ok { - t.Errorf("unexpected error type %v", err) - } - actual := ss.Status() - expected := *status - // The decoder will apply the default Version and Kind to the Status. - expected.APIVersion = "v1" - expected.Kind = "Status" - if !reflect.DeepEqual(&expected, &actual) { - t.Errorf("Unexpected mis-match: %s", diff.ObjectDiff(status, &actual)) - } -} - -func TestDoRequestCreated(t *testing.T) { - status := &unversioned.Status{Status: unversioned.StatusSuccess} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 201, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c, err := RESTClientFor(&Config{ - Host: testServer.URL, - ContentConfig: ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - }, - Username: "user", - Password: "pass", - }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - created := false - body, err := c.Get().Prefix("test").Do().WasCreated(&created).Raw() - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if !created { - t.Errorf("Expected object to be created") - } - statusOut, err := runtime.Decode(testapi.Default.Codec(), body) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if !reflect.DeepEqual(status, statusOut) { - t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", status, statusOut) - } - fakeHandler.ValidateRequest(t, "/"+testapi.Default.GroupVersion().String()+"/test", "GET", nil) -} - -func TestCreateBackoffManager(t *testing.T) { - - theUrl, _ := url.Parse("http://localhost") - - // 1 second base backoff + duration of 2 seconds -> exponential backoff for requests. - os.Setenv(envBackoffBase, "1") - os.Setenv(envBackoffDuration, "2") - backoff := readExpBackoffConfig() - backoff.UpdateBackoff(theUrl, nil, 500) - backoff.UpdateBackoff(theUrl, nil, 500) - if backoff.CalculateBackoff(theUrl)/time.Second != 2 { - t.Errorf("Backoff env not working.") - } - - // 0 duration -> no backoff. - os.Setenv(envBackoffBase, "1") - os.Setenv(envBackoffDuration, "0") - backoff.UpdateBackoff(theUrl, nil, 500) - backoff.UpdateBackoff(theUrl, nil, 500) - backoff = readExpBackoffConfig() - if backoff.CalculateBackoff(theUrl)/time.Second != 0 { - t.Errorf("Zero backoff duration, but backoff still occuring.") - } - - // No env -> No backoff. - os.Setenv(envBackoffBase, "") - os.Setenv(envBackoffDuration, "") - backoff = readExpBackoffConfig() - backoff.UpdateBackoff(theUrl, nil, 500) - backoff.UpdateBackoff(theUrl, nil, 500) - if backoff.CalculateBackoff(theUrl)/time.Second != 0 { - t.Errorf("Backoff should have been 0.") - } - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/config_test.go deleted file mode 100644 index a9c71e19d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/config_test.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/testapi" -) - -func TestIsConfigTransportTLS(t *testing.T) { - testCases := []struct { - Config *Config - TransportTLS bool - }{ - { - Config: &Config{}, - TransportTLS: false, - }, - { - Config: &Config{ - Host: "https://localhost", - }, - TransportTLS: true, - }, - { - Config: &Config{ - Host: "localhost", - TLSClientConfig: TLSClientConfig{ - CertFile: "foo", - }, - }, - TransportTLS: true, - }, - { - Config: &Config{ - Host: "///:://localhost", - TLSClientConfig: TLSClientConfig{ - CertFile: "foo", - }, - }, - TransportTLS: false, - }, - { - Config: &Config{ - Host: "1.2.3.4:567", - Insecure: true, - }, - TransportTLS: true, - }, - } - for _, testCase := range testCases { - if err := SetKubernetesDefaults(testCase.Config); err != nil { - t.Errorf("setting defaults failed for %#v: %v", testCase.Config, err) - continue - } - useTLS := IsConfigTransportTLS(*testCase.Config) - if testCase.TransportTLS != useTLS { - t.Errorf("expected %v for %#v", testCase.TransportTLS, testCase.Config) - } - } -} - -func TestSetKubernetesDefaultsUserAgent(t *testing.T) { - config := &Config{} - if err := SetKubernetesDefaults(config); err != nil { - t.Errorf("unexpected error: %v", err) - } - if !strings.Contains(config.UserAgent, "kubernetes/") { - t.Errorf("no user agent set: %#v", config) - } -} - -func TestRESTClientRequires(t *testing.T) { - if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{NegotiatedSerializer: testapi.Default.NegotiatedSerializer()}}); err == nil { - t.Errorf("unexpected non-error") - } - if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}); err == nil { - t.Errorf("unexpected non-error") - } - if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: testapi.Default.GroupVersion(), NegotiatedSerializer: testapi.Default.NegotiatedSerializer()}}); err != nil { - t.Errorf("unexpected error: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/plugin_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/plugin_test.go deleted file mode 100644 index 3419ecb8a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/plugin_test.go +++ /dev/null @@ -1,311 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "fmt" - "net/http" - "reflect" - "strconv" - "testing" - - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" -) - -func TestAuthPluginWrapTransport(t *testing.T) { - if err := RegisterAuthProviderPlugin("pluginA", pluginAProvider); err != nil { - t.Errorf("Unexpected error: failed to register pluginA: %v", err) - } - if err := RegisterAuthProviderPlugin("pluginB", pluginBProvider); err != nil { - t.Errorf("Unexpected error: failed to register pluginB: %v", err) - } - if err := RegisterAuthProviderPlugin("pluginFail", pluginFailProvider); err != nil { - t.Errorf("Unexpected error: failed to register pluginFail: %v", err) - } - testCases := []struct { - useWrapTransport bool - plugin string - expectErr bool - expectPluginA bool - expectPluginB bool - }{ - {false, "", false, false, false}, - {false, "pluginA", false, true, false}, - {false, "pluginB", false, false, true}, - {false, "pluginFail", true, false, false}, - {false, "pluginUnknown", true, false, false}, - } - for i, tc := range testCases { - c := Config{} - if tc.useWrapTransport { - // Specify an existing WrapTransport in the config to make sure that - // plugins play nicely. - c.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { - return &wrapTransport{rt} - } - } - if len(tc.plugin) != 0 { - c.AuthProvider = &clientcmdapi.AuthProviderConfig{Name: tc.plugin} - } - tConfig, err := c.transportConfig() - if err != nil { - // Unknown/bad plugins are expected to fail here. - if !tc.expectErr { - t.Errorf("%d. Did not expect errors loading Auth Plugin: %q. Got: %v", i, tc.plugin, err) - } - continue - } - var fullyWrappedTransport http.RoundTripper - fullyWrappedTransport = &emptyTransport{} - if tConfig.WrapTransport != nil { - fullyWrappedTransport = tConfig.WrapTransport(&emptyTransport{}) - } - res, err := fullyWrappedTransport.RoundTrip(&http.Request{}) - if err != nil { - t.Errorf("%d. Unexpected error in RoundTrip: %v", i, err) - continue - } - hasWrapTransport := res.Header.Get("wrapTransport") == "Y" - hasPluginA := res.Header.Get("pluginA") == "Y" - hasPluginB := res.Header.Get("pluginB") == "Y" - if hasWrapTransport != tc.useWrapTransport { - t.Errorf("%d. Expected Existing config.WrapTransport: %t; Got: %t", i, tc.useWrapTransport, hasWrapTransport) - } - if hasPluginA != tc.expectPluginA { - t.Errorf("%d. Expected Plugin A: %t; Got: %t", i, tc.expectPluginA, hasPluginA) - } - if hasPluginB != tc.expectPluginB { - t.Errorf("%d. Expected Plugin B: %t; Got: %t", i, tc.expectPluginB, hasPluginB) - } - } -} - -func TestAuthPluginPersist(t *testing.T) { - // register pluginA by a different name so we don't collide across tests. - if err := RegisterAuthProviderPlugin("pluginA2", pluginAProvider); err != nil { - t.Errorf("Unexpected error: failed to register pluginA: %v", err) - } - if err := RegisterAuthProviderPlugin("pluginPersist", pluginPersistProvider); err != nil { - t.Errorf("Unexpected error: failed to register pluginPersist: %v", err) - } - fooBarConfig := map[string]string{"foo": "bar"} - testCases := []struct { - plugin string - startingConfig map[string]string - expectedConfigAfterLogin map[string]string - expectedConfigAfterRoundTrip map[string]string - }{ - // non-persisting plugins should work fine without modifying config. - {"pluginA2", map[string]string{}, map[string]string{}, map[string]string{}}, - {"pluginA2", fooBarConfig, fooBarConfig, fooBarConfig}, - // plugins that persist config should be able to persist when they want. - { - "pluginPersist", - map[string]string{}, - map[string]string{ - "login": "Y", - }, - map[string]string{ - "login": "Y", - "roundTrips": "1", - }, - }, - { - "pluginPersist", - map[string]string{ - "login": "Y", - "roundTrips": "123", - }, - map[string]string{ - "login": "Y", - "roundTrips": "123", - }, - map[string]string{ - "login": "Y", - "roundTrips": "124", - }, - }, - } - for i, tc := range testCases { - cfg := &clientcmdapi.AuthProviderConfig{ - Name: tc.plugin, - Config: tc.startingConfig, - } - persister := &inMemoryPersister{make(map[string]string)} - persister.Persist(tc.startingConfig) - plugin, err := GetAuthProvider("127.0.0.1", cfg, persister) - if err != nil { - t.Errorf("%d. Unexpected error: failed to get plugin %q: %v", i, tc.plugin, err) - } - if err := plugin.Login(); err != nil { - t.Errorf("%d. Unexpected error calling Login() w/ plugin %q: %v", i, tc.plugin, err) - } - // Make sure the plugin persisted what we expect after Login(). - if !reflect.DeepEqual(persister.savedConfig, tc.expectedConfigAfterLogin) { - t.Errorf("%d. Unexpected persisted config after calling %s.Login(): \nGot:\n%v\nExpected:\n%v", - i, tc.plugin, persister.savedConfig, tc.expectedConfigAfterLogin) - } - if _, err := plugin.WrapTransport(&emptyTransport{}).RoundTrip(&http.Request{}); err != nil { - t.Errorf("%d. Unexpected error round-tripping w/ plugin %q: %v", i, tc.plugin, err) - } - // Make sure the plugin persisted what we expect after RoundTrip(). - if !reflect.DeepEqual(persister.savedConfig, tc.expectedConfigAfterRoundTrip) { - t.Errorf("%d. Unexpected persisted config after calling %s.WrapTransport.RoundTrip(): \nGot:\n%v\nExpected:\n%v", - i, tc.plugin, persister.savedConfig, tc.expectedConfigAfterLogin) - } - } - -} - -// emptyTransport provides an empty http.Response with an initialized header -// to allow wrapping RoundTrippers to set header values. -type emptyTransport struct{} - -func (*emptyTransport) RoundTrip(req *http.Request) (*http.Response, error) { - res := &http.Response{ - Header: make(map[string][]string), - } - return res, nil -} - -// wrapTransport sets "wrapTransport" = "Y" on the response. -type wrapTransport struct { - rt http.RoundTripper -} - -func (w *wrapTransport) RoundTrip(req *http.Request) (*http.Response, error) { - res, err := w.rt.RoundTrip(req) - if err != nil { - return nil, err - } - res.Header.Add("wrapTransport", "Y") - return res, nil -} - -// wrapTransportA sets "pluginA" = "Y" on the response. -type wrapTransportA struct { - rt http.RoundTripper -} - -func (w *wrapTransportA) RoundTrip(req *http.Request) (*http.Response, error) { - res, err := w.rt.RoundTrip(req) - if err != nil { - return nil, err - } - res.Header.Add("pluginA", "Y") - return res, nil -} - -type pluginA struct{} - -func (*pluginA) WrapTransport(rt http.RoundTripper) http.RoundTripper { - return &wrapTransportA{rt} -} - -func (*pluginA) Login() error { return nil } - -func pluginAProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { - return &pluginA{}, nil -} - -// wrapTransportB sets "pluginB" = "Y" on the response. -type wrapTransportB struct { - rt http.RoundTripper -} - -func (w *wrapTransportB) RoundTrip(req *http.Request) (*http.Response, error) { - res, err := w.rt.RoundTrip(req) - if err != nil { - return nil, err - } - res.Header.Add("pluginB", "Y") - return res, nil -} - -type pluginB struct{} - -func (*pluginB) WrapTransport(rt http.RoundTripper) http.RoundTripper { - return &wrapTransportB{rt} -} - -func (*pluginB) Login() error { return nil } - -func pluginBProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { - return &pluginB{}, nil -} - -// pluginFailProvider simulates a registered AuthPlugin that fails to load. -func pluginFailProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { - return nil, fmt.Errorf("Failed to load AuthProvider") -} - -type inMemoryPersister struct { - savedConfig map[string]string -} - -func (i *inMemoryPersister) Persist(config map[string]string) error { - i.savedConfig = make(map[string]string) - for k, v := range config { - i.savedConfig[k] = v - } - return nil -} - -// wrapTransportPersist increments the "roundTrips" entry from the config when -// roundTrip is called. -type wrapTransportPersist struct { - rt http.RoundTripper - config map[string]string - persister AuthProviderConfigPersister -} - -func (w *wrapTransportPersist) RoundTrip(req *http.Request) (*http.Response, error) { - roundTrips := 0 - if rtVal, ok := w.config["roundTrips"]; ok { - var err error - roundTrips, err = strconv.Atoi(rtVal) - if err != nil { - return nil, err - } - } - roundTrips++ - w.config["roundTrips"] = fmt.Sprintf("%d", roundTrips) - if err := w.persister.Persist(w.config); err != nil { - return nil, err - } - return w.rt.RoundTrip(req) -} - -type pluginPersist struct { - config map[string]string - persister AuthProviderConfigPersister -} - -func (p *pluginPersist) WrapTransport(rt http.RoundTripper) http.RoundTripper { - return &wrapTransportPersist{rt, p.config, p.persister} -} - -// Login sets the config entry "login" to "Y". -func (p *pluginPersist) Login() error { - p.config["login"] = "Y" - p.persister.Persist(p.config) - return nil -} - -func pluginPersistProvider(_ string, config map[string]string, persister AuthProviderConfigPersister) (AuthProvider, error) { - return &pluginPersist{config, persister}, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/request_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/request_test.go deleted file mode 100644 index b7cb6a2ac..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/request_test.go +++ /dev/null @@ -1,1343 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "os" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/streaming" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/intstr" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/pkg/watch/versioned" -) - -func TestNewRequestSetsAccept(t *testing.T) { - r := NewRequest(nil, "get", &url.URL{Path: "/path/"}, "", ContentConfig{}, Serializers{}, nil, nil) - if r.headers.Get("Accept") != "" { - t.Errorf("unexpected headers: %#v", r.headers) - } - r = NewRequest(nil, "get", &url.URL{Path: "/path/"}, "", ContentConfig{ContentType: "application/other"}, Serializers{}, nil, nil) - if r.headers.Get("Accept") != "application/other, */*" { - t.Errorf("unexpected headers: %#v", r.headers) - } -} - -func TestRequestWithErrorWontChange(t *testing.T) { - original := Request{ - err: errors.New("test"), - content: ContentConfig{GroupVersion: testapi.Default.GroupVersion()}, - } - r := original - changed := r.Param("foo", "bar"). - LabelsSelectorParam(labels.Set{"a": "b"}.AsSelector()). - UintParam("uint", 1). - AbsPath("/abs"). - Prefix("test"). - Suffix("testing"). - Namespace("new"). - Resource("foos"). - Name("bars"). - Body("foo"). - Timeout(time.Millisecond) - if changed != &r { - t.Errorf("returned request should point to the same object") - } - if !reflect.DeepEqual(changed, &original) { - t.Errorf("expected %#v, got %#v", &original, changed) - } -} - -func TestRequestPreservesBaseTrailingSlash(t *testing.T) { - r := &Request{baseURL: &url.URL{}, pathPrefix: "/path/"} - if s := r.URL().String(); s != "/path/" { - t.Errorf("trailing slash should be preserved: %s", s) - } -} - -func TestRequestAbsPathPreservesTrailingSlash(t *testing.T) { - r := (&Request{baseURL: &url.URL{}}).AbsPath("/foo/") - if s := r.URL().String(); s != "/foo/" { - t.Errorf("trailing slash should be preserved: %s", s) - } - - r = (&Request{baseURL: &url.URL{}}).AbsPath("/foo/") - if s := r.URL().String(); s != "/foo/" { - t.Errorf("trailing slash should be preserved: %s", s) - } -} - -func TestRequestAbsPathJoins(t *testing.T) { - r := (&Request{baseURL: &url.URL{}}).AbsPath("foo/bar", "baz") - if s := r.URL().String(); s != "foo/bar/baz" { - t.Errorf("trailing slash should be preserved: %s", s) - } -} - -func TestRequestSetsNamespace(t *testing.T) { - r := (&Request{ - baseURL: &url.URL{ - Path: "/", - }, - }).Namespace("foo") - if r.namespace == "" { - t.Errorf("namespace should be set: %#v", r) - } - - if s := r.URL().String(); s != "namespaces/foo" { - t.Errorf("namespace should be in path: %s", s) - } -} - -func TestRequestOrdersNamespaceInPath(t *testing.T) { - r := (&Request{ - baseURL: &url.URL{}, - pathPrefix: "/test/", - }).Name("bar").Resource("baz").Namespace("foo") - if s := r.URL().String(); s != "/test/namespaces/foo/baz/bar" { - t.Errorf("namespace should be in order in path: %s", s) - } -} - -func TestRequestOrdersSubResource(t *testing.T) { - r := (&Request{ - baseURL: &url.URL{}, - pathPrefix: "/test/", - }).Name("bar").Resource("baz").Namespace("foo").Suffix("test").SubResource("a", "b") - if s := r.URL().String(); s != "/test/namespaces/foo/baz/bar/a/b/test" { - t.Errorf("namespace should be in order in path: %s", s) - } -} - -func TestRequestSetTwiceError(t *testing.T) { - if (&Request{}).Name("bar").Name("baz").err == nil { - t.Errorf("setting name twice should result in error") - } - if (&Request{}).Namespace("bar").Namespace("baz").err == nil { - t.Errorf("setting namespace twice should result in error") - } - if (&Request{}).Resource("bar").Resource("baz").err == nil { - t.Errorf("setting resource twice should result in error") - } - if (&Request{}).SubResource("bar").SubResource("baz").err == nil { - t.Errorf("setting subresource twice should result in error") - } -} - -func TestInvalidSegments(t *testing.T) { - invalidSegments := []string{".", "..", "test/segment", "test%2bsegment"} - setters := map[string]func(string, *Request){ - "namespace": func(s string, r *Request) { r.Namespace(s) }, - "resource": func(s string, r *Request) { r.Resource(s) }, - "name": func(s string, r *Request) { r.Name(s) }, - "subresource": func(s string, r *Request) { r.SubResource(s) }, - } - for _, invalidSegment := range invalidSegments { - for setterName, setter := range setters { - r := &Request{} - setter(invalidSegment, r) - if r.err == nil { - t.Errorf("%s: %s: expected error, got none", setterName, invalidSegment) - } - } - } -} - -func TestRequestParam(t *testing.T) { - r := (&Request{}).Param("foo", "a") - if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) { - t.Errorf("should have set a param: %#v", r) - } - - r.Param("bar", "1") - r.Param("bar", "2") - if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}, "bar": []string{"1", "2"}}) { - t.Errorf("should have set a param: %#v", r) - } -} - -func TestRequestVersionedParams(t *testing.T) { - r := (&Request{content: ContentConfig{GroupVersion: &v1.SchemeGroupVersion}}).Param("foo", "a") - if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) { - t.Errorf("should have set a param: %#v", r) - } - r.VersionedParams(&api.PodLogOptions{Follow: true, Container: "bar"}, api.ParameterCodec) - - if !reflect.DeepEqual(r.params, url.Values{ - "foo": []string{"a"}, - "container": []string{"bar"}, - "follow": []string{"true"}, - }) { - t.Errorf("should have set a param: %#v", r) - } -} - -func TestRequestVersionedParamsFromListOptions(t *testing.T) { - r := &Request{content: ContentConfig{GroupVersion: &v1.SchemeGroupVersion}} - r.VersionedParams(&api.ListOptions{ResourceVersion: "1"}, api.ParameterCodec) - if !reflect.DeepEqual(r.params, url.Values{ - "resourceVersion": []string{"1"}, - }) { - t.Errorf("should have set a param: %#v", r) - } - - var timeout int64 = 10 - r.VersionedParams(&api.ListOptions{ResourceVersion: "2", TimeoutSeconds: &timeout}, api.ParameterCodec) - if !reflect.DeepEqual(r.params, url.Values{ - "resourceVersion": []string{"1", "2"}, - "timeoutSeconds": []string{"10"}, - }) { - t.Errorf("should have set a param: %#v", r) - } -} - -func TestRequestURI(t *testing.T) { - r := (&Request{}).Param("foo", "a") - r.Prefix("other") - r.RequestURI("/test?foo=b&a=b&c=1&c=2") - if r.pathPrefix != "/test" { - t.Errorf("path is wrong: %#v", r) - } - if !reflect.DeepEqual(r.params, url.Values{"a": []string{"b"}, "foo": []string{"b"}, "c": []string{"1", "2"}}) { - t.Errorf("should have set a param: %#v", r) - } -} - -type NotAnAPIObject struct{} - -func (obj NotAnAPIObject) GroupVersionKind() *unversioned.GroupVersionKind { return nil } -func (obj NotAnAPIObject) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) {} - -func defaultContentConfig() ContentConfig { - return ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - Codec: testapi.Default.Codec(), - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - } -} - -func defaultSerializers() Serializers { - return Serializers{ - Encoder: testapi.Default.Codec(), - Decoder: testapi.Default.Codec(), - StreamingSerializer: testapi.Default.Codec(), - Framer: runtime.DefaultFramer, - } -} - -func TestRequestBody(t *testing.T) { - // test unknown type - r := (&Request{}).Body([]string{"test"}) - if r.err == nil || r.body != nil { - t.Errorf("should have set err and left body nil: %#v", r) - } - - // test error set when failing to read file - f, err := ioutil.TempFile("", "test") - if err != nil { - t.Fatalf("unable to create temp file") - } - defer f.Close() - os.Remove(f.Name()) - r = (&Request{}).Body(f.Name()) - if r.err == nil || r.body != nil { - t.Errorf("should have set err and left body nil: %#v", r) - } - - // test unencodable api object - r = (&Request{content: defaultContentConfig()}).Body(&NotAnAPIObject{}) - if r.err == nil || r.body != nil { - t.Errorf("should have set err and left body nil: %#v", r) - } -} - -func TestResultIntoWithErrReturnsErr(t *testing.T) { - res := Result{err: errors.New("test")} - if err := res.Into(&api.Pod{}); err != res.err { - t.Errorf("should have returned exact error from result") - } -} - -func TestURLTemplate(t *testing.T) { - uri, _ := url.Parse("http://localhost") - r := NewRequest(nil, "POST", uri, "", ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "test"}}, Serializers{}, nil, nil) - r.Prefix("pre1").Resource("r1").Namespace("ns").Name("nm").Param("p0", "v0") - full := r.URL() - if full.String() != "http://localhost/pre1/namespaces/ns/r1/nm?p0=v0" { - t.Errorf("unexpected initial URL: %s", full) - } - actual := r.finalURLTemplate() - expected := "http://localhost/pre1/namespaces/%7Bnamespace%7D/r1/%7Bname%7D?p0=%7Bvalue%7D" - if actual != expected { - t.Errorf("unexpected URL template: %s %s", actual, expected) - } - if r.URL().String() != full.String() { - t.Errorf("creating URL template changed request: %s -> %s", full.String(), r.URL().String()) - } -} - -func TestTransformResponse(t *testing.T) { - invalid := []byte("aaaaa") - uri, _ := url.Parse("http://localhost") - testCases := []struct { - Response *http.Response - Data []byte - Created bool - Error bool - ErrFn func(err error) bool - }{ - {Response: &http.Response{StatusCode: 200}, Data: []byte{}}, - {Response: &http.Response{StatusCode: 201}, Data: []byte{}, Created: true}, - {Response: &http.Response{StatusCode: 199}, Error: true}, - {Response: &http.Response{StatusCode: 500}, Error: true}, - {Response: &http.Response{StatusCode: 422}, Error: true}, - {Response: &http.Response{StatusCode: 409}, Error: true}, - {Response: &http.Response{StatusCode: 404}, Error: true}, - {Response: &http.Response{StatusCode: 401}, Error: true}, - { - Response: &http.Response{ - StatusCode: 401, - Header: http.Header{"Content-Type": []string{"application/json"}}, - Body: ioutil.NopCloser(bytes.NewReader(invalid)), - }, - Error: true, - ErrFn: func(err error) bool { - return err.Error() != "aaaaa" && apierrors.IsUnauthorized(err) - }, - }, - { - Response: &http.Response{ - StatusCode: 401, - Header: http.Header{"Content-Type": []string{"text/any"}}, - Body: ioutil.NopCloser(bytes.NewReader(invalid)), - }, - Error: true, - ErrFn: func(err error) bool { - return strings.Contains(err.Error(), "server has asked for the client to provide") && apierrors.IsUnauthorized(err) - }, - }, - {Response: &http.Response{StatusCode: 403}, Error: true}, - {Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid}, - {Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid}, - } - for i, test := range testCases { - r := NewRequest(nil, "", uri, "", defaultContentConfig(), defaultSerializers(), nil, nil) - if test.Response.Body == nil { - test.Response.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) - } - result := r.transformResponse(test.Response, &http.Request{}) - response, created, err := result.body, result.statusCode == http.StatusCreated, result.err - hasErr := err != nil - if hasErr != test.Error { - t.Errorf("%d: unexpected error: %t %v", i, test.Error, err) - } else if hasErr && test.Response.StatusCode > 399 { - status, ok := err.(apierrors.APIStatus) - if !ok { - t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err) - continue - } - if int(status.Status().Code) != test.Response.StatusCode { - t.Errorf("%d: status code did not match response: %#v", i, status.Status()) - } - } - if test.ErrFn != nil && !test.ErrFn(err) { - t.Errorf("%d: error function did not match: %v", i, err) - } - if !(test.Data == nil && response == nil) && !api.Semantic.DeepDerivative(test.Data, response) { - t.Errorf("%d: unexpected response: %#v %#v", i, test.Data, response) - } - if test.Created != created { - t.Errorf("%d: expected created %t, got %t", i, test.Created, created) - } - } -} - -func TestTransformUnstructuredError(t *testing.T) { - testCases := []struct { - Req *http.Request - Res *http.Response - - Resource string - Name string - - ErrFn func(error) bool - }{ - { - Resource: "foo", - Name: "bar", - Req: &http.Request{ - Method: "POST", - }, - Res: &http.Response{ - StatusCode: http.StatusConflict, - Body: ioutil.NopCloser(bytes.NewReader(nil)), - }, - ErrFn: apierrors.IsAlreadyExists, - }, - { - Resource: "foo", - Name: "bar", - Req: &http.Request{ - Method: "PUT", - }, - Res: &http.Response{ - StatusCode: http.StatusConflict, - Body: ioutil.NopCloser(bytes.NewReader(nil)), - }, - ErrFn: apierrors.IsConflict, - }, - { - Resource: "foo", - Name: "bar", - Req: &http.Request{}, - Res: &http.Response{ - StatusCode: http.StatusNotFound, - Body: ioutil.NopCloser(bytes.NewReader(nil)), - }, - ErrFn: apierrors.IsNotFound, - }, - { - Req: &http.Request{}, - Res: &http.Response{ - StatusCode: http.StatusBadRequest, - Body: ioutil.NopCloser(bytes.NewReader(nil)), - }, - ErrFn: apierrors.IsBadRequest, - }, - } - - for _, testCase := range testCases { - r := &Request{ - content: defaultContentConfig(), - serializers: defaultSerializers(), - resourceName: testCase.Name, - resource: testCase.Resource, - } - result := r.transformResponse(testCase.Res, testCase.Req) - err := result.err - if !testCase.ErrFn(err) { - t.Errorf("unexpected error: %v", err) - continue - } - if len(testCase.Name) != 0 && !strings.Contains(err.Error(), testCase.Name) { - t.Errorf("unexpected error string: %s", err) - } - if len(testCase.Resource) != 0 && !strings.Contains(err.Error(), testCase.Resource) { - t.Errorf("unexpected error string: %s", err) - } - } -} - -type clientFunc func(req *http.Request) (*http.Response, error) - -func (f clientFunc) Do(req *http.Request) (*http.Response, error) { - return f(req) -} - -func TestRequestWatch(t *testing.T) { - testCases := []struct { - Request *Request - Err bool - ErrFn func(error) bool - Empty bool - }{ - { - Request: &Request{err: errors.New("bail")}, - Err: true, - }, - { - Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, - Err: true, - }, - { - Request: &Request{ - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, errors.New("err") - }), - baseURL: &url.URL{}, - }, - Err: true, - }, - { - Request: &Request{ - content: defaultContentConfig(), - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: http.StatusForbidden, - Body: ioutil.NopCloser(bytes.NewReader([]byte{})), - }, nil - }), - baseURL: &url.URL{}, - }, - Err: true, - ErrFn: func(err error) bool { - return apierrors.IsForbidden(err) - }, - }, - { - Request: &Request{ - content: defaultContentConfig(), - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: http.StatusUnauthorized, - Body: ioutil.NopCloser(bytes.NewReader([]byte{})), - }, nil - }), - baseURL: &url.URL{}, - }, - Err: true, - ErrFn: func(err error) bool { - return apierrors.IsUnauthorized(err) - }, - }, - { - Request: &Request{ - content: defaultContentConfig(), - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: http.StatusUnauthorized, - Body: ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &unversioned.Status{ - Status: unversioned.StatusFailure, - Reason: unversioned.StatusReasonUnauthorized, - })))), - }, nil - }), - baseURL: &url.URL{}, - }, - Err: true, - ErrFn: func(err error) bool { - return apierrors.IsUnauthorized(err) - }, - }, - { - Request: &Request{ - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, io.EOF - }), - baseURL: &url.URL{}, - }, - Empty: true, - }, - { - Request: &Request{ - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, &url.Error{Err: io.EOF} - }), - baseURL: &url.URL{}, - }, - Empty: true, - }, - { - Request: &Request{ - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, errors.New("http: can't write HTTP request on broken connection") - }), - baseURL: &url.URL{}, - }, - Empty: true, - }, - { - Request: &Request{ - serializers: defaultSerializers(), - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, errors.New("foo: connection reset by peer") - }), - baseURL: &url.URL{}, - }, - Empty: true, - }, - } - for i, testCase := range testCases { - t.Logf("testcase %v", testCase.Request) - testCase.Request.backoffMgr = &NoBackoff{} - watch, err := testCase.Request.Watch() - hasErr := err != nil - if hasErr != testCase.Err { - t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) - continue - } - if testCase.ErrFn != nil && !testCase.ErrFn(err) { - t.Errorf("%d: error not valid: %v", i, err) - } - if hasErr && watch != nil { - t.Errorf("%d: watch should be nil when error is returned", i) - continue - } - if testCase.Empty { - _, ok := <-watch.ResultChan() - if ok { - t.Errorf("%d: expected the watch to be empty: %#v", i, watch) - } - } - } -} - -func TestRequestStream(t *testing.T) { - testCases := []struct { - Request *Request - Err bool - }{ - { - Request: &Request{err: errors.New("bail")}, - Err: true, - }, - { - Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, - Err: true, - }, - { - Request: &Request{ - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, errors.New("err") - }), - baseURL: &url.URL{}, - }, - Err: true, - }, - { - Request: &Request{ - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return &http.Response{ - StatusCode: http.StatusUnauthorized, - Body: ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &unversioned.Status{ - Status: unversioned.StatusFailure, - Reason: unversioned.StatusReasonUnauthorized, - })))), - }, nil - }), - content: defaultContentConfig(), - serializers: defaultSerializers(), - baseURL: &url.URL{}, - }, - Err: true, - }, - } - for i, testCase := range testCases { - testCase.Request.backoffMgr = &NoBackoff{} - body, err := testCase.Request.Stream() - hasErr := err != nil - if hasErr != testCase.Err { - t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) - } - if hasErr && body != nil { - t.Errorf("%d: body should be nil when error is returned", i) - } - } -} - -type fakeUpgradeConnection struct{} - -func (c *fakeUpgradeConnection) CreateStream(headers http.Header) (httpstream.Stream, error) { - return nil, nil -} -func (c *fakeUpgradeConnection) Close() error { - return nil -} -func (c *fakeUpgradeConnection) CloseChan() <-chan bool { - return make(chan bool) -} -func (c *fakeUpgradeConnection) SetIdleTimeout(timeout time.Duration) { -} - -type fakeUpgradeRoundTripper struct { - req *http.Request - conn httpstream.Connection -} - -func (f *fakeUpgradeRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - f.req = req - b := []byte{} - body := ioutil.NopCloser(bytes.NewReader(b)) - resp := &http.Response{ - StatusCode: 101, - Body: body, - } - return resp, nil -} - -func (f *fakeUpgradeRoundTripper) NewConnection(resp *http.Response) (httpstream.Connection, error) { - return f.conn, nil -} - -func TestRequestDo(t *testing.T) { - testCases := []struct { - Request *Request - Err bool - }{ - { - Request: &Request{err: errors.New("bail")}, - Err: true, - }, - { - Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, - Err: true, - }, - { - Request: &Request{ - client: clientFunc(func(req *http.Request) (*http.Response, error) { - return nil, errors.New("err") - }), - baseURL: &url.URL{}, - }, - Err: true, - }, - } - for i, testCase := range testCases { - testCase.Request.backoffMgr = &NoBackoff{} - body, err := testCase.Request.Do().Raw() - hasErr := err != nil - if hasErr != testCase.Err { - t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) - } - if hasErr && body != nil { - t.Errorf("%d: body should be nil when error is returned", i) - } - } -} - -func TestDoRequestNewWay(t *testing.T) { - reqBody := "request body" - expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ - Protocol: "TCP", - Port: 12345, - TargetPort: intstr.FromInt(12345), - }}}} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := testRESTClient(t, testServer) - obj, err := c.Verb("POST"). - Prefix("foo", "bar"). - Suffix("baz"). - Timeout(time.Second). - Body([]byte(reqBody)). - Do().Get() - if err != nil { - t.Errorf("Unexpected error: %v %#v", err, err) - return - } - if obj == nil { - t.Error("nil obj") - } else if !api.Semantic.DeepDerivative(expectedObj, obj) { - t.Errorf("Expected: %#v, got %#v", expectedObj, obj) - } - requestURL := testapi.Default.ResourcePathWithPrefix("foo/bar", "", "", "baz") - requestURL += "?timeout=1s" - fakeHandler.ValidateRequest(t, requestURL, "POST", &reqBody) -} - -// This test assumes that the client implementation backs off exponentially, for an individual request. -func TestBackoffLifecycle(t *testing.T) { - count := 0 - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - count++ - t.Logf("Attempt %d", count) - if count == 5 || count == 9 { - w.WriteHeader(http.StatusOK) - return - } else { - w.WriteHeader(http.StatusGatewayTimeout) - return - } - })) - defer testServer.Close() - c := testRESTClient(t, testServer) - - // Test backoff recovery and increase. This correlates to the constants - // which are used in the server implementation returning StatusOK above. - seconds := []int{0, 1, 2, 4, 8, 0, 1, 2, 4, 0} - request := c.Verb("POST").Prefix("backofftest").Suffix("abc") - clock := util.FakeClock{} - request.backoffMgr = &URLBackoff{ - // Use a fake backoff here to avoid flakes and speed the test up. - Backoff: flowcontrol.NewFakeBackOff( - time.Duration(1)*time.Second, - time.Duration(200)*time.Second, - &clock, - )} - - for _, sec := range seconds { - thisBackoff := request.backoffMgr.CalculateBackoff(request.URL()) - t.Logf("Current backoff %v", thisBackoff) - if thisBackoff != time.Duration(sec)*time.Second { - t.Errorf("Backoff is %v instead of %v", thisBackoff, sec) - } - now := clock.Now() - request.DoRaw() - elapsed := clock.Since(now) - if clock.Since(now) != thisBackoff { - t.Errorf("CalculatedBackoff not honored by clock: Expected time of %v, but got %v ", thisBackoff, elapsed) - } - } -} - -func TestCheckRetryClosesBody(t *testing.T) { - count := 0 - ch := make(chan struct{}) - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - count++ - t.Logf("attempt %d", count) - if count >= 5 { - w.WriteHeader(http.StatusOK) - close(ch) - return - } - w.Header().Set("Retry-After", "0") - w.WriteHeader(apierrors.StatusTooManyRequests) - })) - defer testServer.Close() - - c := testRESTClient(t, testServer) - _, err := c.Verb("POST"). - Prefix("foo", "bar"). - Suffix("baz"). - Timeout(time.Second). - Body([]byte(strings.Repeat("abcd", 1000))). - DoRaw() - if err != nil { - t.Fatalf("Unexpected error: %v %#v", err, err) - } - <-ch - if count != 5 { - t.Errorf("unexpected retries: %d", count) - } -} - -func TestCheckRetryHandles429And5xx(t *testing.T) { - count := 0 - ch := make(chan struct{}) - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - t.Logf("attempt %d", count) - if count >= 4 { - w.WriteHeader(http.StatusOK) - close(ch) - return - } - w.Header().Set("Retry-After", "0") - w.WriteHeader([]int{apierrors.StatusTooManyRequests, 500, 501, 504}[count]) - count++ - })) - defer testServer.Close() - - c := testRESTClient(t, testServer) - _, err := c.Verb("POST"). - Prefix("foo", "bar"). - Suffix("baz"). - Timeout(time.Second). - Body([]byte(strings.Repeat("abcd", 1000))). - DoRaw() - if err != nil { - t.Fatalf("Unexpected error: %v %#v", err, err) - } - <-ch - if count != 4 { - t.Errorf("unexpected retries: %d", count) - } -} - -func BenchmarkCheckRetryClosesBody(b *testing.B) { - count := 0 - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - count++ - if count%3 == 0 { - w.WriteHeader(http.StatusOK) - return - } - w.Header().Set("Retry-After", "0") - w.WriteHeader(apierrors.StatusTooManyRequests) - })) - defer testServer.Close() - - c := testRESTClient(b, testServer) - r := c.Verb("POST"). - Prefix("foo", "bar"). - Suffix("baz"). - Timeout(time.Second). - Body([]byte(strings.Repeat("abcd", 1000))) - - for i := 0; i < b.N; i++ { - if _, err := r.DoRaw(); err != nil { - b.Fatalf("Unexpected error: %v %#v", err, err) - } - } -} - -func TestDoRequestNewWayReader(t *testing.T) { - reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj) - expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ - Protocol: "TCP", - Port: 12345, - TargetPort: intstr.FromInt(12345), - }}}} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := testRESTClient(t, testServer) - obj, err := c.Verb("POST"). - Resource("bar"). - Name("baz"). - Prefix("foo"). - LabelsSelectorParam(labels.Set{"name": "foo"}.AsSelector()). - Timeout(time.Second). - Body(bytes.NewBuffer(reqBodyExpected)). - Do().Get() - if err != nil { - t.Errorf("Unexpected error: %v %#v", err, err) - return - } - if obj == nil { - t.Error("nil obj") - } else if !api.Semantic.DeepDerivative(expectedObj, obj) { - t.Errorf("Expected: %#v, got %#v", expectedObj, obj) - } - tmpStr := string(reqBodyExpected) - requestURL := testapi.Default.ResourcePathWithPrefix("foo", "bar", "", "baz") - requestURL += "?" + unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) + "=name%3Dfoo&timeout=1s" - fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) -} - -func TestDoRequestNewWayObj(t *testing.T) { - reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj) - expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ - Protocol: "TCP", - Port: 12345, - TargetPort: intstr.FromInt(12345), - }}}} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := testRESTClient(t, testServer) - obj, err := c.Verb("POST"). - Suffix("baz"). - Name("bar"). - Resource("foo"). - LabelsSelectorParam(labels.Set{"name": "foo"}.AsSelector()). - Timeout(time.Second). - Body(reqObj). - Do().Get() - if err != nil { - t.Errorf("Unexpected error: %v %#v", err, err) - return - } - if obj == nil { - t.Error("nil obj") - } else if !api.Semantic.DeepDerivative(expectedObj, obj) { - t.Errorf("Expected: %#v, got %#v", expectedObj, obj) - } - tmpStr := string(reqBodyExpected) - requestURL := testapi.Default.ResourcePath("foo", "", "bar/baz") - requestURL += "?" + unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) + "=name%3Dfoo&timeout=1s" - fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) -} - -func TestDoRequestNewWayFile(t *testing.T) { - reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - file, err := ioutil.TempFile("", "foo") - if err != nil { - t.Errorf("unexpected error: %v", err) - } - defer file.Close() - - _, err = file.Write(reqBodyExpected) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ - Protocol: "TCP", - Port: 12345, - TargetPort: intstr.FromInt(12345), - }}}} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := testRESTClient(t, testServer) - wasCreated := true - obj, err := c.Verb("POST"). - Prefix("foo/bar", "baz"). - Timeout(time.Second). - Body(file.Name()). - Do().WasCreated(&wasCreated).Get() - if err != nil { - t.Errorf("Unexpected error: %v %#v", err, err) - return - } - if obj == nil { - t.Error("nil obj") - } else if !api.Semantic.DeepDerivative(expectedObj, obj) { - t.Errorf("Expected: %#v, got %#v", expectedObj, obj) - } - if wasCreated { - t.Errorf("expected object was not created") - } - tmpStr := string(reqBodyExpected) - requestURL := testapi.Default.ResourcePathWithPrefix("foo/bar/baz", "", "", "") - requestURL += "?timeout=1s" - fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) -} - -func TestWasCreated(t *testing.T) { - reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ - Protocol: "TCP", - Port: 12345, - TargetPort: intstr.FromInt(12345), - }}}} - expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 201, - ResponseBody: string(expectedBody), - T: t, - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := testRESTClient(t, testServer) - wasCreated := false - obj, err := c.Verb("PUT"). - Prefix("foo/bar", "baz"). - Timeout(time.Second). - Body(reqBodyExpected). - Do().WasCreated(&wasCreated).Get() - if err != nil { - t.Errorf("Unexpected error: %v %#v", err, err) - return - } - if obj == nil { - t.Error("nil obj") - } else if !api.Semantic.DeepDerivative(expectedObj, obj) { - t.Errorf("Expected: %#v, got %#v", expectedObj, obj) - } - if !wasCreated { - t.Errorf("Expected object was created") - } - - tmpStr := string(reqBodyExpected) - requestURL := testapi.Default.ResourcePathWithPrefix("foo/bar/baz", "", "", "") - requestURL += "?timeout=1s" - fakeHandler.ValidateRequest(t, requestURL, "PUT", &tmpStr) -} - -func TestVerbs(t *testing.T) { - c := testRESTClient(t, nil) - if r := c.Post(); r.verb != "POST" { - t.Errorf("Post verb is wrong") - } - if r := c.Put(); r.verb != "PUT" { - t.Errorf("Put verb is wrong") - } - if r := c.Get(); r.verb != "GET" { - t.Errorf("Get verb is wrong") - } - if r := c.Delete(); r.verb != "DELETE" { - t.Errorf("Delete verb is wrong") - } -} - -func TestAbsPath(t *testing.T) { - for i, tc := range []struct { - configPrefix string - resourcePrefix string - absPath string - wantsAbsPath string - }{ - {"/", "", "", "/"}, - {"", "", "/", "/"}, - {"", "", "/api", "/api"}, - {"", "", "/api/", "/api/"}, - {"", "", "/apis", "/apis"}, - {"", "/foo", "/bar/foo", "/bar/foo"}, - {"", "/api/foo/123", "/bar/foo", "/bar/foo"}, - {"/p1", "", "", "/p1"}, - {"/p1", "", "/", "/p1/"}, - {"/p1", "", "/api", "/p1/api"}, - {"/p1", "", "/apis", "/p1/apis"}, - {"/p1", "/r1", "/apis", "/p1/apis"}, - {"/p1", "/api/r1", "/apis", "/p1/apis"}, - {"/p1/api/p2", "", "", "/p1/api/p2"}, - {"/p1/api/p2", "", "/", "/p1/api/p2/"}, - {"/p1/api/p2", "", "/api", "/p1/api/p2/api"}, - {"/p1/api/p2", "", "/api/", "/p1/api/p2/api/"}, - {"/p1/api/p2", "/r1", "/api/", "/p1/api/p2/api/"}, - {"/p1/api/p2", "/api/r1", "/api/", "/p1/api/p2/api/"}, - } { - u, _ := url.Parse("http://localhost:123" + tc.configPrefix) - r := NewRequest(nil, "POST", u, "", ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "test"}}, Serializers{}, nil, nil).Prefix(tc.resourcePrefix).AbsPath(tc.absPath) - if r.pathPrefix != tc.wantsAbsPath { - t.Errorf("test case %d failed, unexpected path: %q, expected %q", i, r.pathPrefix, tc.wantsAbsPath) - } - } -} - -func TestUintParam(t *testing.T) { - table := []struct { - name string - testVal uint64 - expectStr string - }{ - {"foo", 31415, "http://localhost?foo=31415"}, - {"bar", 42, "http://localhost?bar=42"}, - {"baz", 0, "http://localhost?baz=0"}, - } - - for _, item := range table { - u, _ := url.Parse("http://localhost") - r := NewRequest(nil, "GET", u, "", ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "test"}}, Serializers{}, nil, nil).AbsPath("").UintParam(item.name, item.testVal) - if e, a := item.expectStr, r.URL().String(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - } -} - -func TestUnacceptableParamNames(t *testing.T) { - table := []struct { - name string - testVal string - expectSuccess bool - }{ - {"timeout", "42", false}, - } - - for _, item := range table { - c := testRESTClient(t, nil) - r := c.Get().setParam(item.name, item.testVal) - if e, a := item.expectSuccess, r.err == nil; e != a { - t.Errorf("expected %v, got %v (%v)", e, a, r.err) - } - } -} - -func TestBody(t *testing.T) { - const data = "test payload" - - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - bodyExpected, _ := runtime.Encode(testapi.Default.Codec(), obj) - - f, err := ioutil.TempFile("", "test_body") - if err != nil { - t.Fatalf("TempFile error: %v", err) - } - if _, err := f.WriteString(data); err != nil { - t.Fatalf("TempFile.WriteString error: %v", err) - } - f.Close() - - var nilObject *api.DeleteOptions - typedObject := interface{}(nilObject) - c := testRESTClient(t, nil) - tests := []struct { - input interface{} - expected string - headers map[string]string - }{ - {[]byte(data), data, nil}, - {f.Name(), data, nil}, - {strings.NewReader(data), data, nil}, - {obj, string(bodyExpected), map[string]string{"Content-Type": "application/json"}}, - {typedObject, "", nil}, - } - for i, tt := range tests { - r := c.Post().Body(tt.input) - if r.err != nil { - t.Errorf("%d: r.Body(%#v) error: %v", i, tt, r.err) - continue - } - if tt.headers != nil { - for k, v := range tt.headers { - if r.headers.Get(k) != v { - t.Errorf("%d: r.headers[%q] = %q; want %q", i, k, v, v) - } - } - } - - if r.body == nil { - if len(tt.expected) != 0 { - t.Errorf("%d: r.body = %q; want %q", i, r.body, tt.expected) - } - continue - } - buf := make([]byte, len(tt.expected)) - if _, err := r.body.Read(buf); err != nil { - t.Errorf("%d: r.body.Read error: %v", i, err) - continue - } - body := string(buf) - if body != tt.expected { - t.Errorf("%d: r.body = %q; want %q", i, body, tt.expected) - } - } -} - -func TestWatch(t *testing.T) { - var table = []struct { - t watch.EventType - obj runtime.Object - }{ - {watch.Added, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "first"}}}, - {watch.Modified, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "second"}}}, - {watch.Deleted, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "last"}}}, - } - - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - flusher, ok := w.(http.Flusher) - if !ok { - panic("need flusher!") - } - - w.Header().Set("Transfer-Encoding", "chunked") - w.WriteHeader(http.StatusOK) - flusher.Flush() - - encoder := versioned.NewEncoder(streaming.NewEncoder(w, testapi.Default.Codec()), testapi.Default.Codec()) - for _, item := range table { - if err := encoder.Encode(&watch.Event{Type: item.t, Object: item.obj}); err != nil { - panic(err) - } - flusher.Flush() - } - })) - defer testServer.Close() - - s := testRESTClient(t, testServer) - watching, err := s.Get().Prefix("path/to/watch/thing").Watch() - if err != nil { - t.Fatalf("Unexpected error") - } - - for _, item := range table { - got, ok := <-watching.ResultChan() - if !ok { - t.Fatalf("Unexpected early close") - } - if e, a := item.t, got.Type; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - if e, a := item.obj, got.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Expected %v, got %v", e, a) - } - } - - _, ok := <-watching.ResultChan() - if ok { - t.Fatal("Unexpected non-close") - } -} - -func TestStream(t *testing.T) { - expectedBody := "expected body" - - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - flusher, ok := w.(http.Flusher) - if !ok { - panic("need flusher!") - } - w.Header().Set("Transfer-Encoding", "chunked") - w.WriteHeader(http.StatusOK) - w.Write([]byte(expectedBody)) - flusher.Flush() - })) - defer testServer.Close() - - s := testRESTClient(t, testServer) - readCloser, err := s.Get().Prefix("path/to/stream/thing").Stream() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - defer readCloser.Close() - buf := new(bytes.Buffer) - buf.ReadFrom(readCloser) - resultBody := buf.String() - - if expectedBody != resultBody { - t.Errorf("Expected %s, got %s", expectedBody, resultBody) - } -} - -func testRESTClient(t testing.TB, srv *httptest.Server) *RESTClient { - baseURL, _ := url.Parse("http://localhost") - if srv != nil { - var err error - baseURL, err = url.Parse(srv.URL) - if err != nil { - t.Fatalf("failed to parse test URL: %v", err) - } - } - versionedAPIPath := testapi.Default.ResourcePath("", "", "") - client, err := NewRESTClient(baseURL, versionedAPIPath, defaultContentConfig(), 0, 0, nil, nil) - if err != nil { - t.Fatalf("failed to create a client: %v", err) - } - return client -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/url_utils_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/url_utils_test.go deleted file mode 100644 index 4bf8c5423..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/url_utils_test.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "path" - "testing" - - "k8s.io/kubernetes/pkg/api/testapi" -) - -func TestValidatesHostParameter(t *testing.T) { - testCases := []struct { - Host string - APIPath string - - URL string - Err bool - }{ - {"127.0.0.1", "", "http://127.0.0.1/" + testapi.Default.GroupVersion().Version, false}, - {"127.0.0.1:8080", "", "http://127.0.0.1:8080/" + testapi.Default.GroupVersion().Version, false}, - {"foo.bar.com", "", "http://foo.bar.com/" + testapi.Default.GroupVersion().Version, false}, - {"http://host/prefix", "", "http://host/prefix/" + testapi.Default.GroupVersion().Version, false}, - {"http://host", "", "http://host/" + testapi.Default.GroupVersion().Version, false}, - {"http://host", "/", "http://host/" + testapi.Default.GroupVersion().Version, false}, - {"http://host", "/other", "http://host/other/" + testapi.Default.GroupVersion().Version, false}, - {"host/server", "", "", true}, - } - for i, testCase := range testCases { - u, versionedAPIPath, err := DefaultServerURL(testCase.Host, testCase.APIPath, *testapi.Default.GroupVersion(), false) - switch { - case err == nil && testCase.Err: - t.Errorf("expected error but was nil") - continue - case err != nil && !testCase.Err: - t.Errorf("unexpected error %v", err) - continue - case err != nil: - continue - } - u.Path = path.Join(u.Path, versionedAPIPath) - if e, a := testCase.URL, u.String(); e != a { - t.Errorf("%d: expected host %s, got %s", i, e, a) - continue - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/urlbackoff_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/urlbackoff_test.go deleted file mode 100644 index 5b370dbe5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/restclient/urlbackoff_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 restclient - -import ( - "net/url" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/flowcontrol" -) - -func parse(raw string) *url.URL { - theUrl, _ := url.Parse(raw) - return theUrl -} - -func TestURLBackoffFunctionalityCollisions(t *testing.T) { - myBackoff := &URLBackoff{ - Backoff: flowcontrol.NewBackOff(1*time.Second, 60*time.Second), - } - - // Add some noise and make sure backoff for a clean URL is zero. - myBackoff.UpdateBackoff(parse("http://100.200.300.400:8080"), nil, 500) - - myBackoff.UpdateBackoff(parse("http://1.2.3.4:8080"), nil, 500) - - if myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) > 0 { - t.Errorf("URLs are colliding in the backoff map!") - } -} - -// TestURLBackoffFunctionality generally tests the URLBackoff wrapper. We avoid duplicating tests from backoff and request. -func TestURLBackoffFunctionality(t *testing.T) { - myBackoff := &URLBackoff{ - Backoff: flowcontrol.NewBackOff(1*time.Second, 60*time.Second), - } - - // Now test that backoff increases, then recovers. - // 200 and 300 should both result in clearing the backoff. - // all others like 429 should result in increased backoff. - seconds := []int{0, - 1, 2, 4, 8, 0, - 1, 2} - returnCodes := []int{ - 429, 500, 501, 502, 300, - 500, 501, 502, - } - - if len(seconds) != len(returnCodes) { - t.Fatalf("responseCode to backoff arrays should be the same length... sanity check failed.") - } - - for i, sec := range seconds { - backoffSec := myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) - if backoffSec < time.Duration(sec)*time.Second || backoffSec > time.Duration(sec+5)*time.Second { - t.Errorf("Backoff out of range %v: %v %v", i, sec, backoffSec) - } - myBackoff.UpdateBackoff(parse("http://1.2.3.4:100/responseCodeForFuncTest"), nil, returnCodes[i]) - } - - if myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) == 0 { - t.Errorf("The final return code %v should have resulted in a backoff ! ", returnCodes[7]) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/cache_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/cache_test.go deleted file mode 100644 index 8a602c147..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/cache_test.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "net/http" - "testing" -) - -func TestTLSConfigKey(t *testing.T) { - // Make sure config fields that don't affect the tls config don't affect the cache key - identicalConfigurations := map[string]*Config{ - "empty": {}, - "basic": {Username: "bob", Password: "password"}, - "bearer": {BearerToken: "token"}, - "user agent": {UserAgent: "useragent"}, - "transport": {Transport: http.DefaultTransport}, - "wrap transport": {WrapTransport: func(http.RoundTripper) http.RoundTripper { return nil }}, - } - for nameA, valueA := range identicalConfigurations { - for nameB, valueB := range identicalConfigurations { - keyA, err := tlsConfigKey(valueA) - if err != nil { - t.Errorf("Unexpected error for %q: %v", nameA, err) - continue - } - keyB, err := tlsConfigKey(valueB) - if err != nil { - t.Errorf("Unexpected error for %q: %v", nameB, err) - continue - } - if keyA != keyB { - t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) - continue - } - } - } - - // Make sure config fields that affect the tls config affect the cache key - uniqueConfigurations := map[string]*Config{ - "no tls": {}, - "insecure": {TLS: TLSConfig{Insecure: true}}, - "cadata 1": {TLS: TLSConfig{CAData: []byte{1}}}, - "cadata 2": {TLS: TLSConfig{CAData: []byte{2}}}, - "cert 1, key 1": { - TLS: TLSConfig{ - CertData: []byte{1}, - KeyData: []byte{1}, - }, - }, - "cert 1, key 2": { - TLS: TLSConfig{ - CertData: []byte{1}, - KeyData: []byte{2}, - }, - }, - "cert 2, key 1": { - TLS: TLSConfig{ - CertData: []byte{2}, - KeyData: []byte{1}, - }, - }, - "cert 2, key 2": { - TLS: TLSConfig{ - CertData: []byte{2}, - KeyData: []byte{2}, - }, - }, - "cadata 1, cert 1, key 1": { - TLS: TLSConfig{ - CAData: []byte{1}, - CertData: []byte{1}, - KeyData: []byte{1}, - }, - }, - } - for nameA, valueA := range uniqueConfigurations { - for nameB, valueB := range uniqueConfigurations { - // Don't compare to ourselves - if nameA == nameB { - continue - } - - keyA, err := tlsConfigKey(valueA) - if err != nil { - t.Errorf("Unexpected error for %q: %v", nameA, err) - continue - } - keyB, err := tlsConfigKey(valueB) - if err != nil { - t.Errorf("Unexpected error for %q: %v", nameB, err) - continue - } - if keyA == keyB { - t.Errorf("Expected unique cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) - continue - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/round_trippers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/round_trippers_test.go deleted file mode 100644 index 6e8e52f7d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/round_trippers_test.go +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ( - "net/http" - "testing" -) - -type testRoundTripper struct { - Request *http.Request - Response *http.Response - Err error -} - -func (rt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - rt.Request = req - return rt.Response, rt.Err -} - -func TestBearerAuthRoundTripper(t *testing.T) { - rt := &testRoundTripper{} - req := &http.Request{} - NewBearerAuthRoundTripper("test", rt).RoundTrip(req) - if rt.Request == nil { - t.Fatalf("unexpected nil request: %v", rt) - } - if rt.Request == req { - t.Fatalf("round tripper should have copied request object: %#v", rt.Request) - } - if rt.Request.Header.Get("Authorization") != "Bearer test" { - t.Errorf("unexpected authorization header: %#v", rt.Request) - } -} - -func TestBasicAuthRoundTripper(t *testing.T) { - for n, tc := range map[string]struct { - user string - pass string - }{ - "basic": {user: "user", pass: "pass"}, - "no pass": {user: "user"}, - } { - rt := &testRoundTripper{} - req := &http.Request{} - NewBasicAuthRoundTripper(tc.user, tc.pass, rt).RoundTrip(req) - if rt.Request == nil { - t.Fatalf("%s: unexpected nil request: %v", n, rt) - } - if rt.Request == req { - t.Fatalf("%s: round tripper should have copied request object: %#v", n, rt.Request) - } - if user, pass, found := rt.Request.BasicAuth(); !found || user != tc.user || pass != tc.pass { - t.Errorf("%s: unexpected authorization header: %#v", n, rt.Request) - } - } -} - -func TestUserAgentRoundTripper(t *testing.T) { - rt := &testRoundTripper{} - req := &http.Request{ - Header: make(http.Header), - } - req.Header.Set("User-Agent", "other") - NewUserAgentRoundTripper("test", rt).RoundTrip(req) - if rt.Request == nil { - t.Fatalf("unexpected nil request: %v", rt) - } - if rt.Request != req { - t.Fatalf("round tripper should not have copied request object: %#v", rt.Request) - } - if rt.Request.Header.Get("User-Agent") != "other" { - t.Errorf("unexpected user agent header: %#v", rt.Request) - } - - req = &http.Request{} - NewUserAgentRoundTripper("test", rt).RoundTrip(req) - if rt.Request == nil { - t.Fatalf("unexpected nil request: %v", rt) - } - if rt.Request == req { - t.Fatalf("round tripper should have copied request object: %#v", rt.Request) - } - if rt.Request.Header.Get("User-Agent") != "test" { - t.Errorf("unexpected user agent header: %#v", rt.Request) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/transport_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/transport_test.go deleted file mode 100644 index ca04172d2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/transport/transport_test.go +++ /dev/null @@ -1,204 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "net/http" - "testing" -) - -const ( - rootCACert = `-----BEGIN CERTIFICATE----- -MIIC4DCCAcqgAwIBAgIBATALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu -MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIxNTczN1oXDTE2MDExNTIxNTcz -OFowIzEhMB8GA1UEAwwYMTAuMTMuMTI5LjEwNkAxNDIxMzU5MDU4MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunDRXGwsiYWGFDlWH6kjGun+PshDGeZX -xtx9lUnL8pIRWH3wX6f13PO9sktaOWW0T0mlo6k2bMlSLlSZgG9H6og0W6gLS3vq -s4VavZ6DbXIwemZG2vbRwsvR+t4G6Nbwelm6F8RFnA1Fwt428pavmNQ/wgYzo+T1 -1eS+HiN4ACnSoDSx3QRWcgBkB1g6VReofVjx63i0J+w8Q/41L9GUuLqquFxu6ZnH -60vTB55lHgFiDLjA1FkEz2dGvGh/wtnFlRvjaPC54JH2K1mPYAUXTreoeJtLJKX0 -ycoiyB24+zGCniUmgIsmQWRPaOPircexCp1BOeze82BT1LCZNTVaxQIDAQABoyMw -ITAOBgNVHQ8BAf8EBAMCAKQwDwYDVR0TAQH/BAUwAwEB/zALBgkqhkiG9w0BAQsD -ggEBADMxsUuAFlsYDpF4fRCzXXwrhbtj4oQwcHpbu+rnOPHCZupiafzZpDu+rw4x -YGPnCb594bRTQn4pAu3Ac18NbLD5pV3uioAkv8oPkgr8aUhXqiv7KdDiaWm6sbAL -EHiXVBBAFvQws10HMqMoKtO8f1XDNAUkWduakR/U6yMgvOPwS7xl0eUTqyRB6zGb -K55q2dejiFWaFqB/y78txzvz6UlOZKE44g2JAVoJVM6kGaxh33q8/FmrL4kuN3ut -W+MmJCVDvd4eEqPwbp7146ZWTqpIJ8lvA6wuChtqV8lhAPka2hD/LMqY8iXNmfXD -uml0obOEy+ON91k+SWTJ3ggmF/U= ------END CERTIFICATE-----` - - certData = `-----BEGIN CERTIFICATE----- -MIIC6jCCAdSgAwIBAgIBCzALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu -MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIyMDEzMVoXDTE2MDExNTIyMDEz -MlowGzEZMBcGA1UEAxMQb3BlbnNoaWZ0LWNsaWVudDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKtdhz0+uCLXw5cSYns9rU/XifFSpb/x24WDdrm72S/v -b9BPYsAStiP148buylr1SOuNi8sTAZmlVDDIpIVwMLff+o2rKYDicn9fjbrTxTOj -lI4pHJBH+JU3AJ0tbajupioh70jwFS0oYpwtneg2zcnE2Z4l6mhrj2okrc5Q1/X2 -I2HChtIU4JYTisObtin10QKJX01CLfYXJLa8upWzKZ4/GOcHG+eAV3jXWoXidtjb -1Usw70amoTZ6mIVCkiu1QwCoa8+ycojGfZhvqMsAp1536ZcCul+Na+AbCv4zKS7F -kQQaImVrXdUiFansIoofGlw/JNuoKK6ssVpS5Ic3pgcCAwEAAaM1MDMwDgYDVR0P -AQH/BAQDAgCgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwCwYJ -KoZIhvcNAQELA4IBAQCKLREH7bXtXtZ+8vI6cjD7W3QikiArGqbl36bAhhWsJLp/ -p/ndKz39iFNaiZ3GlwIURWOOKx3y3GA0x9m8FR+Llthf0EQ8sUjnwaknWs0Y6DQ3 -jjPFZOpV3KPCFrdMJ3++E3MgwFC/Ih/N2ebFX9EcV9Vcc6oVWMdwT0fsrhu683rq -6GSR/3iVX1G/pmOiuaR0fNUaCyCfYrnI4zHBDgSfnlm3vIvN2lrsR/DQBakNL8DJ -HBgKxMGeUPoneBv+c8DMXIL0EhaFXRlBv9QW45/GiAIOuyFJ0i6hCtGZpJjq4OpQ -BRjCI+izPzFTjsxD4aORE+WOkyWFCGPWKfNejfw0 ------END CERTIFICATE-----` - - keyData = `-----BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAq12HPT64ItfDlxJiez2tT9eJ8VKlv/HbhYN2ubvZL+9v0E9i -wBK2I/Xjxu7KWvVI642LyxMBmaVUMMikhXAwt9/6jaspgOJyf1+NutPFM6OUjikc -kEf4lTcAnS1tqO6mKiHvSPAVLShinC2d6DbNycTZniXqaGuPaiStzlDX9fYjYcKG -0hTglhOKw5u2KfXRAolfTUIt9hcktry6lbMpnj8Y5wcb54BXeNdaheJ22NvVSzDv -RqahNnqYhUKSK7VDAKhrz7JyiMZ9mG+oywCnXnfplwK6X41r4BsK/jMpLsWRBBoi -ZWtd1SIVqewiih8aXD8k26gorqyxWlLkhzemBwIDAQABAoIBAD2XYRs3JrGHQUpU -FkdbVKZkvrSY0vAZOqBTLuH0zUv4UATb8487anGkWBjRDLQCgxH+jucPTrztekQK -aW94clo0S3aNtV4YhbSYIHWs1a0It0UdK6ID7CmdWkAj6s0T8W8lQT7C46mWYVLm -5mFnCTHi6aB42jZrqmEpC7sivWwuU0xqj3Ml8kkxQCGmyc9JjmCB4OrFFC8NNt6M -ObvQkUI6Z3nO4phTbpxkE1/9dT0MmPIF7GhHVzJMS+EyyRYUDllZ0wvVSOM3qZT0 -JMUaBerkNwm9foKJ1+dv2nMKZZbJajv7suUDCfU44mVeaEO+4kmTKSGCGjjTBGkr -7L1ySDECgYEA5ElIMhpdBzIivCuBIH8LlUeuzd93pqssO1G2Xg0jHtfM4tz7fyeI -cr90dc8gpli24dkSxzLeg3Tn3wIj/Bu64m2TpZPZEIlukYvgdgArmRIPQVxerYey -OkrfTNkxU1HXsYjLCdGcGXs5lmb+K/kuTcFxaMOs7jZi7La+jEONwf8CgYEAwCs/ -rUOOA0klDsWWisbivOiNPII79c9McZCNBqncCBfMUoiGe8uWDEO4TFHN60vFuVk9 -8PkwpCfvaBUX+ajvbafIfHxsnfk1M04WLGCeqQ/ym5Q4sQoQOcC1b1y9qc/xEWfg -nIUuia0ukYRpl7qQa3tNg+BNFyjypW8zukUAC/kCgYB1/Kojuxx5q5/oQVPrx73k -2bevD+B3c+DYh9MJqSCNwFtUpYIWpggPxoQan4LwdsmO0PKzocb/ilyNFj4i/vII -NToqSc/WjDFpaDIKyuu9oWfhECye45NqLWhb/6VOuu4QA/Nsj7luMhIBehnEAHW+ -GkzTKM8oD1PxpEG3nPKXYQKBgQC6AuMPRt3XBl1NkCrpSBy/uObFlFaP2Enpf39S -3OZ0Gv0XQrnSaL1kP8TMcz68rMrGX8DaWYsgytstR4W+jyy7WvZwsUu+GjTJ5aMG -77uEcEBpIi9CBzivfn7hPccE8ZgqPf+n4i6q66yxBJflW5xhvafJqDtW2LcPNbW/ -bvzdmQKBgExALRUXpq+5dbmkdXBHtvXdRDZ6rVmrnjy4nI5bPw+1GqQqk6uAR6B/ -F6NmLCQOO4PDG/cuatNHIr2FrwTmGdEL6ObLUGWn9Oer9gJhHVqqsY5I4sEPo4XX -stR0Yiw0buV6DL/moUO0HIM9Bjh96HJp+LxiIS6UCdIhMPp5HoQa ------END RSA PRIVATE KEY-----` -) - -func TestNew(t *testing.T) { - testCases := map[string]struct { - Config *Config - Err bool - TLS bool - Default bool - }{ - "default transport": { - Default: true, - Config: &Config{}, - }, - - "ca transport": { - TLS: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - }, - }, - }, - "bad ca file transport": { - Err: true, - Config: &Config{ - TLS: TLSConfig{ - CAFile: "invalid file", - }, - }, - }, - "ca data overriding bad ca file transport": { - TLS: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - CAFile: "invalid file", - }, - }, - }, - - "cert transport": { - TLS: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - CertData: []byte(certData), - KeyData: []byte(keyData), - }, - }, - }, - "bad cert data transport": { - Err: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - CertData: []byte(certData), - KeyData: []byte("bad key data"), - }, - }, - }, - "bad file cert transport": { - Err: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - CertData: []byte(certData), - KeyFile: "invalid file", - }, - }, - }, - "key data overriding bad file cert transport": { - TLS: true, - Config: &Config{ - TLS: TLSConfig{ - CAData: []byte(rootCACert), - CertData: []byte(certData), - KeyData: []byte(keyData), - KeyFile: "invalid file", - }, - }, - }, - } - for k, testCase := range testCases { - transport, err := New(testCase.Config) - switch { - case testCase.Err && err == nil: - t.Errorf("%s: unexpected non-error", k) - continue - case !testCase.Err && err != nil: - t.Errorf("%s: unexpected error: %v", k, err) - continue - } - - switch { - case testCase.Default && transport != http.DefaultTransport: - t.Errorf("%s: expected the default transport, got %#v", k, transport) - continue - case !testCase.Default && transport == http.DefaultTransport: - t.Errorf("%s: expected non-default transport, got %#v", k, transport) - continue - } - - // We only know how to check TLSConfig on http.Transports - if transport, ok := transport.(*http.Transport); ok { - switch { - case testCase.TLS && transport.TLSClientConfig == nil: - t.Errorf("%s: expected TLSClientConfig, got %#v", k, transport) - continue - case !testCase.TLS && transport.TLSClientConfig != nil: - t.Errorf("%s: expected no TLSClientConfig, got %#v", k, transport) - continue - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/client_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/client_test.go deleted file mode 100644 index 674b92f0f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/client_test.go +++ /dev/null @@ -1,303 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 discovery - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "reflect" - "testing" - - "github.com/emicklei/go-restful/swagger" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/version" -) - -func TestGetServerVersion(t *testing.T) { - expect := version.Info{ - Major: "foo", - Minor: "bar", - GitCommit: "baz", - } - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - output, err := json.Marshal(expect) - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - - got, err := client.ServerVersion() - if err != nil { - t.Fatalf("unexpected encoding error: %v", err) - } - if e, a := expect, *got; !reflect.DeepEqual(e, a) { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestGetServerGroupsWithV1Server(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var obj interface{} - switch req.URL.Path { - case "/api": - obj = &unversioned.APIVersions{ - Versions: []string{ - "v1", - }, - } - default: - w.WriteHeader(http.StatusNotFound) - return - } - output, err := json.Marshal(obj) - if err != nil { - t.Fatalf("unexpected encoding error: %v", err) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - // ServerGroups should not return an error even if server returns error at /api and /apis - apiGroupList, err := client.ServerGroups() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - groupVersions := unversioned.ExtractGroupVersions(apiGroupList) - if !reflect.DeepEqual(groupVersions, []string{"v1"}) { - t.Errorf("expected: %q, got: %q", []string{"v1"}, groupVersions) - } -} - -func TestGetServerResourcesWithV1Server(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var obj interface{} - switch req.URL.Path { - case "/api": - obj = &unversioned.APIVersions{ - Versions: []string{ - "v1", - }, - } - default: - w.WriteHeader(http.StatusNotFound) - return - } - output, err := json.Marshal(obj) - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - // ServerResources should not return an error even if server returns error at /api/v1. - resourceMap, err := client.ServerResources() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, found := resourceMap["v1"]; !found { - t.Errorf("missing v1 in resource map") - } - -} - -func TestGetServerResources(t *testing.T) { - stable := unversioned.APIResourceList{ - GroupVersion: "v1", - APIResources: []unversioned.APIResource{ - {"pods", true, "Pod"}, - {"services", true, "Service"}, - {"namespaces", false, "Namespace"}, - }, - } - beta := unversioned.APIResourceList{ - GroupVersion: "extensions/v1", - APIResources: []unversioned.APIResource{ - {"deployments", true, "Deployment"}, - {"ingresses", true, "Ingress"}, - {"jobs", true, "Job"}, - }, - } - tests := []struct { - resourcesList *unversioned.APIResourceList - path string - request string - expectErr bool - }{ - { - resourcesList: &stable, - path: "/api/v1", - request: "v1", - expectErr: false, - }, - { - resourcesList: &beta, - path: "/apis/extensions/v1beta1", - request: "extensions/v1beta1", - expectErr: false, - }, - { - resourcesList: &stable, - path: "/api/v1", - request: "foobar", - expectErr: true, - }, - } - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var list interface{} - switch req.URL.Path { - case "/api/v1": - list = &stable - case "/apis/extensions/v1beta1": - list = &beta - case "/api": - list = &unversioned.APIVersions{ - Versions: []string{ - "v1", - }, - } - case "/apis": - list = &unversioned.APIGroupList{ - Groups: []unversioned.APIGroup{ - { - Versions: []unversioned.GroupVersionForDiscovery{ - {GroupVersion: "extensions/v1beta1"}, - }, - }, - }, - } - default: - t.Logf("unexpected request: %s", req.URL.Path) - w.WriteHeader(http.StatusNotFound) - return - } - output, err := json.Marshal(list) - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - defer server.Close() - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - for _, test := range tests { - got, err := client.ServerResourcesForGroupVersion(test.request) - if test.expectErr { - if err == nil { - t.Error("unexpected non-error") - } - continue - } - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - if !reflect.DeepEqual(got, test.resourcesList) { - t.Errorf("expected:\n%v\ngot:\n%v\n", test.resourcesList, got) - } - } - - resourceMap, err := client.ServerResources() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - for _, api := range []string{"v1", "extensions/v1beta1"} { - if _, found := resourceMap[api]; !found { - t.Errorf("missing expected api: %s", api) - } - } -} - -func swaggerSchemaFakeServer() (*httptest.Server, error) { - request := 1 - var sErr error - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var resp interface{} - if request == 1 { - resp = unversioned.APIVersions{Versions: []string{"v1", "v2", "v3"}} - request++ - } else { - resp = swagger.ApiDeclaration{} - } - output, err := json.Marshal(resp) - if err != nil { - sErr = err - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - return server, sErr -} - -func TestGetSwaggerSchema(t *testing.T) { - expect := swagger.ApiDeclaration{} - - server, err := swaggerSchemaFakeServer() - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - } - defer server.Close() - - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - got, err := client.SwaggerSchema(v1.SchemeGroupVersion) - if err != nil { - t.Fatalf("unexpected encoding error: %v", err) - } - if e, a := expect, *got; !reflect.DeepEqual(e, a) { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestGetSwaggerSchemaFail(t *testing.T) { - expErr := "API version: api.group/v4 is not supported by the server. Use one of: [v1 v2 v3]" - - server, err := swaggerSchemaFakeServer() - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - } - defer server.Close() - - client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) - got, err := client.SwaggerSchema(unversioned.GroupVersion{Group: "api.group", Version: "v4"}) - if got != nil { - t.Fatalf("unexpected response: %v", got) - } - if err.Error() != expErr { - t.Errorf("expected an error, got %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/fake/discovery.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/fake/discovery.go deleted file mode 100644 index 0a2bb9af9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/typed/discovery/fake/discovery.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "github.com/emicklei/go-restful/swagger" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/version" -) - -type FakeDiscovery struct { - *core.Fake -} - -func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*unversioned.APIResourceList, error) { - action := core.ActionImpl{ - Verb: "get", - Resource: unversioned.GroupVersionResource{Resource: "resource"}, - } - c.Invokes(action, nil) - return c.Resources[groupVersion], nil -} - -func (c *FakeDiscovery) ServerResources() (map[string]*unversioned.APIResourceList, error) { - action := core.ActionImpl{ - Verb: "get", - Resource: unversioned.GroupVersionResource{Resource: "resource"}, - } - c.Invokes(action, nil) - return c.Resources, nil -} - -func (c *FakeDiscovery) ServerGroups() (*unversioned.APIGroupList, error) { - return nil, nil -} - -func (c *FakeDiscovery) ServerVersion() (*version.Info, error) { - action := core.ActionImpl{} - action.Verb = "get" - action.Resource = unversioned.GroupVersionResource{Resource: "version"} - - c.Invokes(action, nil) - versionInfo := version.Get() - return &versionInfo, nil -} - -func (c *FakeDiscovery) SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) { - action := core.ActionImpl{} - action.Verb = "get" - if version == v1.SchemeGroupVersion { - action.Resource = unversioned.GroupVersionResource{Resource: "/swaggerapi/api/" + version.Version} - } else { - action.Resource = unversioned.GroupVersionResource{Resource: "/swaggerapi/apis/" + version.Group + "/" + version.Version} - } - - c.Invokes(action, nil) - return &swagger.ApiDeclaration{}, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_2/clientset_adaption.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_2/clientset_adaption.go deleted file mode 100644 index 9e33ccd19..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_2/clientset_adaption.go +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 release_1_2 - -import ( - "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2" - v1core "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2/typed/core/v1" - v1beta1extensions "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1" - "k8s.io/kubernetes/pkg/client/typed/discovery" - "k8s.io/kubernetes/pkg/client/unversioned" -) - -// FromUnversionedClient adapts a unversioned.Client to a release_1_2.Clientset. -// This function is temporary. We will remove it when everyone has moved to using -// Clientset. New code should NOT use this function. -func FromUnversionedClient(c *unversioned.Client) *release_1_2.Clientset { - var clientset release_1_2.Clientset - if c != nil { - clientset.CoreClient = v1core.New(c.RESTClient) - } else { - clientset.CoreClient = v1core.New(nil) - } - if c != nil && c.ExtensionsClient != nil { - clientset.ExtensionsClient = v1beta1extensions.New(c.ExtensionsClient.RESTClient) - } else { - clientset.ExtensionsClient = v1beta1extensions.New(nil) - } - - if c != nil && c.DiscoveryClient != nil { - clientset.DiscoveryClient = discovery.NewDiscoveryClient(c.DiscoveryClient.RESTClient) - } else { - clientset.DiscoveryClient = discovery.NewDiscoveryClient(nil) - } - - return &clientset -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_3/clientset_adaption.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_3/clientset_adaption.go deleted file mode 100644 index 3f4b86fb4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/adapters/release_1_3/clientset_adaption.go +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 release_1_3 - -import ( - "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3" - v1core "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3/typed/core/v1" - v1beta1extensions "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1" - "k8s.io/kubernetes/pkg/client/typed/discovery" - "k8s.io/kubernetes/pkg/client/unversioned" -) - -// FromUnversionedClient adapts a unversioned.Client to a release_1_3.Clientset. -// This function is temporary. We will remove it when everyone has moved to using -// Clientset. New code should NOT use this function. -func FromUnversionedClient(c *unversioned.Client) *release_1_3.Clientset { - var clientset release_1_3.Clientset - if c != nil { - clientset.CoreClient = v1core.New(c.RESTClient) - } else { - clientset.CoreClient = v1core.New(nil) - } - if c != nil && c.ExtensionsClient != nil { - clientset.ExtensionsClient = v1beta1extensions.New(c.ExtensionsClient.RESTClient) - } else { - clientset.ExtensionsClient = v1beta1extensions.New(nil) - } - - if c != nil && c.DiscoveryClient != nil { - clientset.DiscoveryClient = discovery.NewDiscoveryClient(c.DiscoveryClient.RESTClient) - } else { - clientset.DiscoveryClient = discovery.NewDiscoveryClient(nil) - } - - return &clientset -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth_test.go deleted file mode 100644 index a99c5d94a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth_test.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 auth_test - -import ( - "io/ioutil" - "os" - "reflect" - "testing" - - clientauth "k8s.io/kubernetes/pkg/client/unversioned/auth" -) - -func TestLoadFromFile(t *testing.T) { - loadAuthInfoTests := []struct { - authData string - authInfo *clientauth.Info - expectErr bool - }{ - { - `{"user": "user", "password": "pass"}`, - &clientauth.Info{User: "user", Password: "pass"}, - false, - }, - { - "", nil, true, - }, - } - for _, loadAuthInfoTest := range loadAuthInfoTests { - tt := loadAuthInfoTest - aifile, err := ioutil.TempFile("", "testAuthInfo") - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - if tt.authData != "missing" { - defer os.Remove(aifile.Name()) - defer aifile.Close() - _, err = aifile.WriteString(tt.authData) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - } else { - aifile.Close() - os.Remove(aifile.Name()) - } - authInfo, err := clientauth.LoadFromFile(aifile.Name()) - gotErr := err != nil - if gotErr != tt.expectErr { - t.Errorf("expected errorness: %v, actual errorness: %v", tt.expectErr, gotErr) - } - if !reflect.DeepEqual(authInfo, tt.authInfo) { - t.Errorf("Expected %v, got %v", tt.authInfo, authInfo) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers_test.go deleted file mode 100644 index 6952524c6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers_test.go +++ /dev/null @@ -1,301 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "fmt" - "io/ioutil" - "os" - "reflect" - "testing" - - "github.com/ghodss/yaml" -) - -func newMergedConfig(certFile, certContent, keyFile, keyContent, caFile, caContent string, t *testing.T) Config { - if err := ioutil.WriteFile(certFile, []byte(certContent), 0644); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := ioutil.WriteFile(keyFile, []byte(keyContent), 0600); err != nil { - t.Errorf("unexpected error: %v", err) - } - if err := ioutil.WriteFile(caFile, []byte(caContent), 0644); err != nil { - t.Errorf("unexpected error: %v", err) - } - - return Config{ - AuthInfos: map[string]*AuthInfo{ - "red-user": {Token: "red-token", ClientCertificateData: []byte(certContent), ClientKeyData: []byte(keyContent)}, - "blue-user": {Token: "blue-token", ClientCertificate: certFile, ClientKey: keyFile}}, - Clusters: map[string]*Cluster{ - "cow-cluster": {Server: "http://cow.org:8080", CertificateAuthorityData: []byte(caContent)}, - "chicken-cluster": {Server: "http://chicken.org:8080", CertificateAuthority: caFile}}, - Contexts: map[string]*Context{ - "federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}, - "shaker-context": {AuthInfo: "blue-user", Cluster: "chicken-cluster"}}, - CurrentContext: "federal-context", - } -} - -func TestMinifySuccess(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) - - if err := MinifyConfig(&mutatingConfig); err != nil { - t.Errorf("unexpected error: %v", err) - } - - if len(mutatingConfig.Contexts) > 1 { - t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) - } - if _, exists := mutatingConfig.Contexts["federal-context"]; !exists { - t.Errorf("missing context") - } - - if len(mutatingConfig.Clusters) > 1 { - t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) - } - if _, exists := mutatingConfig.Clusters["cow-cluster"]; !exists { - t.Errorf("missing cluster") - } - - if len(mutatingConfig.AuthInfos) > 1 { - t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) - } - if _, exists := mutatingConfig.AuthInfos["red-user"]; !exists { - t.Errorf("missing user") - } -} - -func TestMinifyMissingContext(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) - mutatingConfig.CurrentContext = "missing" - - errMsg := "cannot locate context missing" - - if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { - t.Errorf("expected %v, got %v", errMsg, err) - } -} - -func TestMinifyMissingCluster(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) - delete(mutatingConfig.Clusters, mutatingConfig.Contexts[mutatingConfig.CurrentContext].Cluster) - - errMsg := "cannot locate cluster cow-cluster" - - if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { - t.Errorf("expected %v, got %v", errMsg, err) - } -} - -func TestMinifyMissingAuthInfo(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) - delete(mutatingConfig.AuthInfos, mutatingConfig.Contexts[mutatingConfig.CurrentContext].AuthInfo) - - errMsg := "cannot locate user red-user" - - if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { - t.Errorf("expected %v, got %v", errMsg, err) - } -} - -func TestFlattenSuccess(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - certData := "cert" - keyData := "key" - caData := "ca" - - unchangingCluster := "cow-cluster" - unchangingAuthInfo := "red-user" - changingCluster := "chicken-cluster" - changingAuthInfo := "blue-user" - - startingConfig := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, t) - mutatingConfig := startingConfig - - if err := FlattenConfig(&mutatingConfig); err != nil { - t.Errorf("unexpected error: %v", err) - } - - if len(mutatingConfig.Contexts) != 2 { - t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) - } - if !reflect.DeepEqual(startingConfig.Contexts, mutatingConfig.Contexts) { - t.Errorf("expected %v, got %v", startingConfig.Contexts, mutatingConfig.Contexts) - } - - if len(mutatingConfig.Clusters) != 2 { - t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) - } - if !reflect.DeepEqual(startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) { - t.Errorf("expected %v, got %v", startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) - } - if len(mutatingConfig.Clusters[changingCluster].CertificateAuthority) != 0 { - t.Errorf("unexpected caFile") - } - if string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData) != caData { - t.Errorf("expected %v, got %v", caData, string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData)) - } - - if len(mutatingConfig.AuthInfos) != 2 { - t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) - } - if !reflect.DeepEqual(startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) { - t.Errorf("expected %v, got %v", startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) - } - if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificate) != 0 { - t.Errorf("unexpected caFile") - } - if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData) != certData { - t.Errorf("expected %v, got %v", certData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData)) - } - if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientKey) != 0 { - t.Errorf("unexpected caFile") - } - if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData) != keyData { - t.Errorf("expected %v, got %v", keyData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData)) - } - -} - -func Example_minifyAndShorten() { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - certData := "cert" - keyData := "key" - caData := "ca" - - config := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, nil) - - MinifyConfig(&config) - ShortenConfig(&config) - - output, _ := yaml.Marshal(config) - fmt.Printf("%s", string(output)) - // Output: - // clusters: - // cow-cluster: - // LocationOfOrigin: "" - // certificate-authority-data: REDACTED - // server: http://cow.org:8080 - // contexts: - // federal-context: - // LocationOfOrigin: "" - // cluster: cow-cluster - // user: red-user - // current-context: federal-context - // preferences: {} - // users: - // red-user: - // LocationOfOrigin: "" - // client-certificate-data: REDACTED - // client-key-data: REDACTED - // token: red-token -} - -func TestShortenSuccess(t *testing.T) { - certFile, _ := ioutil.TempFile("", "") - defer os.Remove(certFile.Name()) - keyFile, _ := ioutil.TempFile("", "") - defer os.Remove(keyFile.Name()) - caFile, _ := ioutil.TempFile("", "") - defer os.Remove(caFile.Name()) - - certData := "cert" - keyData := "key" - caData := "ca" - - unchangingCluster := "chicken-cluster" - unchangingAuthInfo := "blue-user" - changingCluster := "cow-cluster" - changingAuthInfo := "red-user" - - startingConfig := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, t) - mutatingConfig := startingConfig - - ShortenConfig(&mutatingConfig) - - if len(mutatingConfig.Contexts) != 2 { - t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) - } - if !reflect.DeepEqual(startingConfig.Contexts, mutatingConfig.Contexts) { - t.Errorf("expected %v, got %v", startingConfig.Contexts, mutatingConfig.Contexts) - } - - redacted := string(redactedBytes) - if len(mutatingConfig.Clusters) != 2 { - t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) - } - if !reflect.DeepEqual(startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) { - t.Errorf("expected %v, got %v", startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) - } - if string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData) != redacted { - t.Errorf("expected %v, got %v", redacted, string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData)) - } - - if len(mutatingConfig.AuthInfos) != 2 { - t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) - } - if !reflect.DeepEqual(startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) { - t.Errorf("expected %v, got %v", startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) - } - if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData) != redacted { - t.Errorf("expected %v, got %v", redacted, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData)) - } - if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData) != redacted { - t.Errorf("expected %v, got %v", redacted, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types_test.go deleted file mode 100644 index 6c79728f4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types_test.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 api - -import ( - "fmt" - - "github.com/ghodss/yaml" -) - -func Example_emptyConfig() { - defaultConfig := NewConfig() - - output, err := yaml.Marshal(defaultConfig) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - - fmt.Printf("%v", string(output)) - // Output: - // clusters: {} - // contexts: {} - // current-context: "" - // preferences: {} - // users: {} -} - -func Example_ofOptionsConfig() { - defaultConfig := NewConfig() - defaultConfig.Preferences.Colors = true - defaultConfig.Clusters["alfa"] = &Cluster{ - Server: "https://alfa.org:8080", - InsecureSkipTLSVerify: true, - CertificateAuthority: "path/to/my/cert-ca-filename", - } - defaultConfig.Clusters["bravo"] = &Cluster{ - Server: "https://bravo.org:8080", - InsecureSkipTLSVerify: false, - } - defaultConfig.AuthInfos["white-mage-via-cert"] = &AuthInfo{ - ClientCertificate: "path/to/my/client-cert-filename", - ClientKey: "path/to/my/client-key-filename", - } - defaultConfig.AuthInfos["red-mage-via-token"] = &AuthInfo{ - Token: "my-secret-token", - } - defaultConfig.AuthInfos["black-mage-via-auth-provider"] = &AuthInfo{ - AuthProvider: &AuthProviderConfig{ - Name: "gcp", - Config: map[string]string{ - "foo": "bar", - "token": "s3cr3t-t0k3n", - }, - }, - } - defaultConfig.Contexts["bravo-as-black-mage"] = &Context{ - Cluster: "bravo", - AuthInfo: "black-mage-via-auth-provider", - Namespace: "yankee", - } - defaultConfig.Contexts["alfa-as-black-mage"] = &Context{ - Cluster: "alfa", - AuthInfo: "black-mage-via-auth-provider", - Namespace: "zulu", - } - defaultConfig.Contexts["alfa-as-white-mage"] = &Context{ - Cluster: "alfa", - AuthInfo: "white-mage-via-cert", - } - defaultConfig.CurrentContext = "alfa-as-white-mage" - - output, err := yaml.Marshal(defaultConfig) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - - fmt.Printf("%v", string(output)) - // Output: - // clusters: - // alfa: - // LocationOfOrigin: "" - // certificate-authority: path/to/my/cert-ca-filename - // insecure-skip-tls-verify: true - // server: https://alfa.org:8080 - // bravo: - // LocationOfOrigin: "" - // server: https://bravo.org:8080 - // contexts: - // alfa-as-black-mage: - // LocationOfOrigin: "" - // cluster: alfa - // namespace: zulu - // user: black-mage-via-auth-provider - // alfa-as-white-mage: - // LocationOfOrigin: "" - // cluster: alfa - // user: white-mage-via-cert - // bravo-as-black-mage: - // LocationOfOrigin: "" - // cluster: bravo - // namespace: yankee - // user: black-mage-via-auth-provider - // current-context: alfa-as-white-mage - // preferences: - // colors: true - // users: - // black-mage-via-auth-provider: - // LocationOfOrigin: "" - // auth-provider: - // config: - // foo: bar - // token: s3cr3t-t0k3n - // name: gcp - // red-mage-via-token: - // LocationOfOrigin: "" - // token: my-secret-token - // white-mage-via-cert: - // LocationOfOrigin: "" - // client-certificate: path/to/my/client-cert-filename - // client-key: path/to/my/client-key-filename -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config_test.go deleted file mode 100644 index 1e9b5b8b3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config_test.go +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 clientcmd - -import ( - "reflect" - "testing" - - "github.com/imdario/mergo" - "k8s.io/kubernetes/pkg/client/restclient" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" -) - -func TestOldMergoLib(t *testing.T) { - type T struct { - X string - } - dst := T{X: "one"} - src := T{X: "two"} - mergo.Merge(&dst, &src) - if dst.X != "two" { - // mergo.Merge changed in an incompatible way with - // - // https://github.com/imdario/mergo/commit/d304790b2ed594794496464fadd89d2bb266600a - // - // We have to stay with the old version which still does eager - // copying from src to dst in structs. - t.Errorf("mergo.Merge library found with incompatible, new behavior") - } -} - -func createValidTestConfig() *clientcmdapi.Config { - const ( - server = "https://anything.com:8080" - token = "the-token" - ) - - config := clientcmdapi.NewConfig() - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: server, - } - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - Token: token, - } - config.Contexts["clean"] = &clientcmdapi.Context{ - Cluster: "clean", - AuthInfo: "clean", - } - config.CurrentContext = "clean" - - return config -} - -func createCAValidTestConfig() *clientcmdapi.Config { - - config := createValidTestConfig() - config.Clusters["clean"].CertificateAuthorityData = []byte{0, 0} - return config -} - -func TestInsecureOverridesCA(t *testing.T) { - config := createCAValidTestConfig() - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{ - ClusterInfo: clientcmdapi.Cluster{ - InsecureSkipTLSVerify: true, - }, - }, nil) - - actualCfg, err := clientBuilder.ClientConfig() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - matchBoolArg(true, actualCfg.Insecure, t) - matchStringArg("", actualCfg.TLSClientConfig.CAFile, t) - matchByteArg(nil, actualCfg.TLSClientConfig.CAData, t) -} - -func TestMergeContext(t *testing.T) { - const namespace = "overriden-namespace" - - config := createValidTestConfig() - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}, nil) - - _, overridden, err := clientBuilder.Namespace() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if overridden { - t.Error("Expected namespace to not be overridden") - } - - clientBuilder = NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{ - Context: clientcmdapi.Context{ - Namespace: namespace, - }, - }, nil) - - actual, overridden, err := clientBuilder.Namespace() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if !overridden { - t.Error("Expected namespace to be overridden") - } - - matchStringArg(namespace, actual, t) -} - -func TestCertificateData(t *testing.T) { - caData := []byte("ca-data") - certData := []byte("cert-data") - keyData := []byte("key-data") - - config := clientcmdapi.NewConfig() - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: "https://localhost:8443", - CertificateAuthorityData: caData, - } - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - ClientCertificateData: certData, - ClientKeyData: keyData, - } - config.Contexts["clean"] = &clientcmdapi.Context{ - Cluster: "clean", - AuthInfo: "clean", - } - config.CurrentContext = "clean" - - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}, nil) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // Make sure cert data gets into config (will override file paths) - matchByteArg(caData, clientConfig.TLSClientConfig.CAData, t) - matchByteArg(certData, clientConfig.TLSClientConfig.CertData, t) - matchByteArg(keyData, clientConfig.TLSClientConfig.KeyData, t) -} - -func TestBasicAuthData(t *testing.T) { - username := "myuser" - password := "mypass" - - config := clientcmdapi.NewConfig() - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: "https://localhost:8443", - } - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - Username: username, - Password: password, - } - config.Contexts["clean"] = &clientcmdapi.Context{ - Cluster: "clean", - AuthInfo: "clean", - } - config.CurrentContext = "clean" - - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}, nil) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // Make sure basic auth data gets into config - matchStringArg(username, clientConfig.Username, t) - matchStringArg(password, clientConfig.Password, t) -} - -func TestCreateClean(t *testing.T) { - config := createValidTestConfig() - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}, nil) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - matchStringArg(config.Clusters["clean"].Server, clientConfig.Host, t) - matchStringArg("", clientConfig.APIPath, t) - matchBoolArg(config.Clusters["clean"].InsecureSkipTLSVerify, clientConfig.Insecure, t) - matchStringArg(config.AuthInfos["clean"].Token, clientConfig.BearerToken, t) -} - -func TestCreateCleanWithPrefix(t *testing.T) { - tt := []struct { - server string - host string - }{ - {"https://anything.com:8080/foo/bar", "https://anything.com:8080/foo/bar"}, - {"http://anything.com:8080/foo/bar", "http://anything.com:8080/foo/bar"}, - {"http://anything.com:8080/foo/bar/", "http://anything.com:8080/foo/bar/"}, - {"http://anything.com:8080/", "http://anything.com:8080/"}, - {"http://anything.com:8080//", "http://anything.com:8080//"}, - {"anything.com:8080/foo/bar", "anything.com:8080/foo/bar"}, - {"anything.com:8080", "anything.com:8080"}, - {"anything.com", "anything.com"}, - {"anything", "anything"}, - } - - // WARNING: EnvVarCluster.Server is set during package loading time and can not be overriden by os.Setenv inside this test - EnvVarCluster.Server = "" - tt = append(tt, struct{ server, host string }{"", "http://localhost:8080"}) - - for _, tc := range tt { - config := createValidTestConfig() - - cleanConfig := config.Clusters["clean"] - cleanConfig.Server = tc.server - config.Clusters["clean"] = cleanConfig - - clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}, nil) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - matchStringArg(tc.host, clientConfig.Host, t) - } -} - -func TestCreateCleanDefault(t *testing.T) { - config := createValidTestConfig() - clientBuilder := NewDefaultClientConfig(*config, &ConfigOverrides{}) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - matchStringArg(config.Clusters["clean"].Server, clientConfig.Host, t) - matchBoolArg(config.Clusters["clean"].InsecureSkipTLSVerify, clientConfig.Insecure, t) - matchStringArg(config.AuthInfos["clean"].Token, clientConfig.BearerToken, t) -} - -func TestCreateMissingContext(t *testing.T) { - const expectedErrorContains = "Context was not found for specified context" - config := createValidTestConfig() - clientBuilder := NewNonInteractiveClientConfig(*config, "not-present", &ConfigOverrides{}, nil) - - clientConfig, err := clientBuilder.ClientConfig() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - expectedConfig := &restclient.Config{Host: clientConfig.Host} - - if !reflect.DeepEqual(expectedConfig, clientConfig) { - t.Errorf("Expected %#v, got %#v", expectedConfig, clientConfig) - } - -} - -func matchBoolArg(expected, got bool, t *testing.T) { - if expected != got { - t.Errorf("Expected %v, got %v", expected, got) - } -} - -func matchStringArg(expected, got string, t *testing.T) { - if expected != got { - t.Errorf("Expected %q, got %q", expected, got) - } -} - -func matchByteArg(expected, got []byte, t *testing.T) { - if !reflect.DeepEqual(expected, got) { - t.Errorf("Expected %v, got %v", expected, got) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader_test.go deleted file mode 100644 index ad79c7b81..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader_test.go +++ /dev/null @@ -1,562 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 clientcmd - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "reflect" - "strings" - "testing" - - "github.com/ghodss/yaml" - - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - clientcmdlatest "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest" - "k8s.io/kubernetes/pkg/runtime" -) - -var ( - testConfigAlfa = clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "red-user": {Token: "red-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "cow-cluster": {Server: "http://cow.org:8080"}}, - Contexts: map[string]*clientcmdapi.Context{ - "federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster", Namespace: "hammer-ns"}}, - } - testConfigBravo = clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "black-user": {Token: "black-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "pig-cluster": {Server: "http://pig.org:8080"}}, - Contexts: map[string]*clientcmdapi.Context{ - "queen-anne-context": {AuthInfo: "black-user", Cluster: "pig-cluster", Namespace: "saw-ns"}}, - } - testConfigCharlie = clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "green-user": {Token: "green-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "horse-cluster": {Server: "http://horse.org:8080"}}, - Contexts: map[string]*clientcmdapi.Context{ - "shaker-context": {AuthInfo: "green-user", Cluster: "horse-cluster", Namespace: "chisel-ns"}}, - } - testConfigDelta = clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "blue-user": {Token: "blue-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "chicken-cluster": {Server: "http://chicken.org:8080"}}, - Contexts: map[string]*clientcmdapi.Context{ - "gothic-context": {AuthInfo: "blue-user", Cluster: "chicken-cluster", Namespace: "plane-ns"}}, - } - - testConfigConflictAlfa = clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "red-user": {Token: "a-different-red-token"}, - "yellow-user": {Token: "yellow-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "cow-cluster": {Server: "http://a-different-cow.org:8080", InsecureSkipTLSVerify: true}, - "donkey-cluster": {Server: "http://donkey.org:8080", InsecureSkipTLSVerify: true}}, - CurrentContext: "federal-context", - } -) - -func TestNonExistentCommandLineFile(t *testing.T) { - loadingRules := ClientConfigLoadingRules{ - ExplicitPath: "bogus_file", - } - - _, err := loadingRules.Load() - if err == nil { - t.Fatalf("Expected error for missing command-line file, got none") - } - if !strings.Contains(err.Error(), "bogus_file") { - t.Fatalf("Expected error about 'bogus_file', got %s", err.Error()) - } -} - -func TestToleratingMissingFiles(t *testing.T) { - loadingRules := ClientConfigLoadingRules{ - Precedence: []string{"bogus1", "bogus2", "bogus3"}, - } - - _, err := loadingRules.Load() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } -} - -func TestErrorReadingFile(t *testing.T) { - commandLineFile, _ := ioutil.TempFile("", "") - defer os.Remove(commandLineFile.Name()) - - if err := ioutil.WriteFile(commandLineFile.Name(), []byte("bogus value"), 0644); err != nil { - t.Fatalf("Error creating tempfile: %v", err) - } - - loadingRules := ClientConfigLoadingRules{ - ExplicitPath: commandLineFile.Name(), - } - - _, err := loadingRules.Load() - if err == nil { - t.Fatalf("Expected error for unloadable file, got none") - } - if !strings.Contains(err.Error(), commandLineFile.Name()) { - t.Fatalf("Expected error about '%s', got %s", commandLineFile.Name(), err.Error()) - } -} - -func TestErrorReadingNonFile(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "") - if err != nil { - t.Fatalf("Couldn't create tmpdir") - } - defer os.Remove(tmpdir) - - loadingRules := ClientConfigLoadingRules{ - ExplicitPath: tmpdir, - } - - _, err = loadingRules.Load() - if err == nil { - t.Fatalf("Expected error for non-file, got none") - } - if !strings.Contains(err.Error(), tmpdir) { - t.Fatalf("Expected error about '%s', got %s", tmpdir, err.Error()) - } -} - -func TestConflictingCurrentContext(t *testing.T) { - commandLineFile, _ := ioutil.TempFile("", "") - defer os.Remove(commandLineFile.Name()) - envVarFile, _ := ioutil.TempFile("", "") - defer os.Remove(envVarFile.Name()) - - mockCommandLineConfig := clientcmdapi.Config{ - CurrentContext: "any-context-value", - } - mockEnvVarConfig := clientcmdapi.Config{ - CurrentContext: "a-different-context", - } - - WriteToFile(mockCommandLineConfig, commandLineFile.Name()) - WriteToFile(mockEnvVarConfig, envVarFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - ExplicitPath: commandLineFile.Name(), - Precedence: []string{envVarFile.Name()}, - } - - mergedConfig, err := loadingRules.Load() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if mergedConfig.CurrentContext != mockCommandLineConfig.CurrentContext { - t.Errorf("expected %v, got %v", mockCommandLineConfig.CurrentContext, mergedConfig.CurrentContext) - } -} - -func TestLoadingEmptyMaps(t *testing.T) { - configFile, _ := ioutil.TempFile("", "") - defer os.Remove(configFile.Name()) - - mockConfig := clientcmdapi.Config{ - CurrentContext: "any-context-value", - } - - WriteToFile(mockConfig, configFile.Name()) - - config, err := LoadFromFile(configFile.Name()) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if config.Clusters == nil { - t.Error("expected config.Clusters to be non-nil") - } - if config.AuthInfos == nil { - t.Error("expected config.AuthInfos to be non-nil") - } - if config.Contexts == nil { - t.Error("expected config.Contexts to be non-nil") - } -} - -func TestResolveRelativePaths(t *testing.T) { - pathResolutionConfig1 := clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "relative-user-1": {ClientCertificate: "relative/client/cert", ClientKey: "../relative/client/key"}, - "absolute-user-1": {ClientCertificate: "/absolute/client/cert", ClientKey: "/absolute/client/key"}, - }, - Clusters: map[string]*clientcmdapi.Cluster{ - "relative-server-1": {CertificateAuthority: "../relative/ca"}, - "absolute-server-1": {CertificateAuthority: "/absolute/ca"}, - }, - } - pathResolutionConfig2 := clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "relative-user-2": {ClientCertificate: "relative/client/cert2", ClientKey: "../relative/client/key2"}, - "absolute-user-2": {ClientCertificate: "/absolute/client/cert2", ClientKey: "/absolute/client/key2"}, - }, - Clusters: map[string]*clientcmdapi.Cluster{ - "relative-server-2": {CertificateAuthority: "../relative/ca2"}, - "absolute-server-2": {CertificateAuthority: "/absolute/ca2"}, - }, - } - - configDir1, _ := ioutil.TempDir("", "") - configFile1 := path.Join(configDir1, ".kubeconfig") - configDir1, _ = filepath.Abs(configDir1) - defer os.Remove(configFile1) - configDir2, _ := ioutil.TempDir("", "") - configDir2, _ = ioutil.TempDir(configDir2, "") - configFile2 := path.Join(configDir2, ".kubeconfig") - configDir2, _ = filepath.Abs(configDir2) - defer os.Remove(configFile2) - - WriteToFile(pathResolutionConfig1, configFile1) - WriteToFile(pathResolutionConfig2, configFile2) - - loadingRules := ClientConfigLoadingRules{ - Precedence: []string{configFile1, configFile2}, - } - - mergedConfig, err := loadingRules.Load() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - foundClusterCount := 0 - for key, cluster := range mergedConfig.Clusters { - if key == "relative-server-1" { - foundClusterCount++ - matchStringArg(path.Join(configDir1, pathResolutionConfig1.Clusters["relative-server-1"].CertificateAuthority), cluster.CertificateAuthority, t) - } - if key == "relative-server-2" { - foundClusterCount++ - matchStringArg(path.Join(configDir2, pathResolutionConfig2.Clusters["relative-server-2"].CertificateAuthority), cluster.CertificateAuthority, t) - } - if key == "absolute-server-1" { - foundClusterCount++ - matchStringArg(pathResolutionConfig1.Clusters["absolute-server-1"].CertificateAuthority, cluster.CertificateAuthority, t) - } - if key == "absolute-server-2" { - foundClusterCount++ - matchStringArg(pathResolutionConfig2.Clusters["absolute-server-2"].CertificateAuthority, cluster.CertificateAuthority, t) - } - } - if foundClusterCount != 4 { - t.Errorf("Expected 4 clusters, found %v: %v", foundClusterCount, mergedConfig.Clusters) - } - - foundAuthInfoCount := 0 - for key, authInfo := range mergedConfig.AuthInfos { - if key == "relative-user-1" { - foundAuthInfoCount++ - matchStringArg(path.Join(configDir1, pathResolutionConfig1.AuthInfos["relative-user-1"].ClientCertificate), authInfo.ClientCertificate, t) - matchStringArg(path.Join(configDir1, pathResolutionConfig1.AuthInfos["relative-user-1"].ClientKey), authInfo.ClientKey, t) - } - if key == "relative-user-2" { - foundAuthInfoCount++ - matchStringArg(path.Join(configDir2, pathResolutionConfig2.AuthInfos["relative-user-2"].ClientCertificate), authInfo.ClientCertificate, t) - matchStringArg(path.Join(configDir2, pathResolutionConfig2.AuthInfos["relative-user-2"].ClientKey), authInfo.ClientKey, t) - } - if key == "absolute-user-1" { - foundAuthInfoCount++ - matchStringArg(pathResolutionConfig1.AuthInfos["absolute-user-1"].ClientCertificate, authInfo.ClientCertificate, t) - matchStringArg(pathResolutionConfig1.AuthInfos["absolute-user-1"].ClientKey, authInfo.ClientKey, t) - } - if key == "absolute-user-2" { - foundAuthInfoCount++ - matchStringArg(pathResolutionConfig2.AuthInfos["absolute-user-2"].ClientCertificate, authInfo.ClientCertificate, t) - matchStringArg(pathResolutionConfig2.AuthInfos["absolute-user-2"].ClientKey, authInfo.ClientKey, t) - } - } - if foundAuthInfoCount != 4 { - t.Errorf("Expected 4 users, found %v: %v", foundAuthInfoCount, mergedConfig.AuthInfos) - } - -} - -func TestMigratingFile(t *testing.T) { - sourceFile, _ := ioutil.TempFile("", "") - defer os.Remove(sourceFile.Name()) - destinationFile, _ := ioutil.TempFile("", "") - // delete the file so that we'll write to it - os.Remove(destinationFile.Name()) - - WriteToFile(testConfigAlfa, sourceFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - MigrationRules: map[string]string{destinationFile.Name(): sourceFile.Name()}, - } - - if _, err := loadingRules.Load(); err != nil { - t.Errorf("unexpected error %v", err) - } - - // the load should have recreated this file - defer os.Remove(destinationFile.Name()) - - sourceContent, err := ioutil.ReadFile(sourceFile.Name()) - if err != nil { - t.Errorf("unexpected error %v", err) - } - destinationContent, err := ioutil.ReadFile(destinationFile.Name()) - if err != nil { - t.Errorf("unexpected error %v", err) - } - - if !reflect.DeepEqual(sourceContent, destinationContent) { - t.Errorf("source and destination do not match") - } -} - -func TestMigratingFileLeaveExistingFileAlone(t *testing.T) { - sourceFile, _ := ioutil.TempFile("", "") - defer os.Remove(sourceFile.Name()) - destinationFile, _ := ioutil.TempFile("", "") - defer os.Remove(destinationFile.Name()) - - WriteToFile(testConfigAlfa, sourceFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - MigrationRules: map[string]string{destinationFile.Name(): sourceFile.Name()}, - } - - if _, err := loadingRules.Load(); err != nil { - t.Errorf("unexpected error %v", err) - } - - destinationContent, err := ioutil.ReadFile(destinationFile.Name()) - if err != nil { - t.Errorf("unexpected error %v", err) - } - - if len(destinationContent) > 0 { - t.Errorf("destination should not have been touched") - } -} - -func TestMigratingFileSourceMissingSkip(t *testing.T) { - sourceFilename := "some-missing-file" - destinationFile, _ := ioutil.TempFile("", "") - // delete the file so that we'll write to it - os.Remove(destinationFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - MigrationRules: map[string]string{destinationFile.Name(): sourceFilename}, - } - - if _, err := loadingRules.Load(); err != nil { - t.Errorf("unexpected error %v", err) - } - - if _, err := os.Stat(destinationFile.Name()); !os.IsNotExist(err) { - t.Errorf("destination should not exist") - } -} - -func Example_noMergingOnExplicitPaths() { - commandLineFile, _ := ioutil.TempFile("", "") - defer os.Remove(commandLineFile.Name()) - envVarFile, _ := ioutil.TempFile("", "") - defer os.Remove(envVarFile.Name()) - - WriteToFile(testConfigAlfa, commandLineFile.Name()) - WriteToFile(testConfigConflictAlfa, envVarFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - ExplicitPath: commandLineFile.Name(), - Precedence: []string{envVarFile.Name()}, - } - - mergedConfig, err := loadingRules.Load() - - json, err := runtime.Encode(clientcmdlatest.Codec, mergedConfig) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - output, err := yaml.JSONToYAML(json) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - - fmt.Printf("%v", string(output)) - // Output: - // apiVersion: v1 - // clusters: - // - cluster: - // server: http://cow.org:8080 - // name: cow-cluster - // contexts: - // - context: - // cluster: cow-cluster - // namespace: hammer-ns - // user: red-user - // name: federal-context - // current-context: "" - // kind: Config - // preferences: {} - // users: - // - name: red-user - // user: - // token: red-token -} - -func Example_mergingSomeWithConflict() { - commandLineFile, _ := ioutil.TempFile("", "") - defer os.Remove(commandLineFile.Name()) - envVarFile, _ := ioutil.TempFile("", "") - defer os.Remove(envVarFile.Name()) - - WriteToFile(testConfigAlfa, commandLineFile.Name()) - WriteToFile(testConfigConflictAlfa, envVarFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - Precedence: []string{commandLineFile.Name(), envVarFile.Name()}, - } - - mergedConfig, err := loadingRules.Load() - - json, err := runtime.Encode(clientcmdlatest.Codec, mergedConfig) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - output, err := yaml.JSONToYAML(json) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - - fmt.Printf("%v", string(output)) - // Output: - // apiVersion: v1 - // clusters: - // - cluster: - // server: http://cow.org:8080 - // name: cow-cluster - // - cluster: - // insecure-skip-tls-verify: true - // server: http://donkey.org:8080 - // name: donkey-cluster - // contexts: - // - context: - // cluster: cow-cluster - // namespace: hammer-ns - // user: red-user - // name: federal-context - // current-context: federal-context - // kind: Config - // preferences: {} - // users: - // - name: red-user - // user: - // token: red-token - // - name: yellow-user - // user: - // token: yellow-token -} - -func Example_mergingEverythingNoConflicts() { - commandLineFile, _ := ioutil.TempFile("", "") - defer os.Remove(commandLineFile.Name()) - envVarFile, _ := ioutil.TempFile("", "") - defer os.Remove(envVarFile.Name()) - currentDirFile, _ := ioutil.TempFile("", "") - defer os.Remove(currentDirFile.Name()) - homeDirFile, _ := ioutil.TempFile("", "") - defer os.Remove(homeDirFile.Name()) - - WriteToFile(testConfigAlfa, commandLineFile.Name()) - WriteToFile(testConfigBravo, envVarFile.Name()) - WriteToFile(testConfigCharlie, currentDirFile.Name()) - WriteToFile(testConfigDelta, homeDirFile.Name()) - - loadingRules := ClientConfigLoadingRules{ - Precedence: []string{commandLineFile.Name(), envVarFile.Name(), currentDirFile.Name(), homeDirFile.Name()}, - } - - mergedConfig, err := loadingRules.Load() - - json, err := runtime.Encode(clientcmdlatest.Codec, mergedConfig) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - output, err := yaml.JSONToYAML(json) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - - fmt.Printf("%v", string(output)) - // Output: - // apiVersion: v1 - // clusters: - // - cluster: - // server: http://chicken.org:8080 - // name: chicken-cluster - // - cluster: - // server: http://cow.org:8080 - // name: cow-cluster - // - cluster: - // server: http://horse.org:8080 - // name: horse-cluster - // - cluster: - // server: http://pig.org:8080 - // name: pig-cluster - // contexts: - // - context: - // cluster: cow-cluster - // namespace: hammer-ns - // user: red-user - // name: federal-context - // - context: - // cluster: chicken-cluster - // namespace: plane-ns - // user: blue-user - // name: gothic-context - // - context: - // cluster: pig-cluster - // namespace: saw-ns - // user: black-user - // name: queen-anne-context - // - context: - // cluster: horse-cluster - // namespace: chisel-ns - // user: green-user - // name: shaker-context - // current-context: "" - // kind: Config - // preferences: {} - // users: - // - name: black-user - // user: - // token: black-token - // - name: blue-user - // user: - // token: blue-token - // - name: green-user - // user: - // token: green-token - // - name: red-user - // user: - // token: red-token -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation_test.go deleted file mode 100644 index ca4843a87..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation_test.go +++ /dev/null @@ -1,432 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 clientcmd - -import ( - "io/ioutil" - "os" - "strings" - "testing" - - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - utilerrors "k8s.io/kubernetes/pkg/util/errors" -) - -func TestConfirmUsableBadInfoButOkConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - config.Clusters["missing ca"] = &clientcmdapi.Cluster{ - Server: "anything", - CertificateAuthority: "missing", - } - config.AuthInfos["error"] = &clientcmdapi.AuthInfo{ - Username: "anything", - Token: "here", - } - config.Contexts["dirty"] = &clientcmdapi.Context{ - Cluster: "missing ca", - AuthInfo: "error", - } - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: "anything", - } - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - Token: "here", - } - config.Contexts["clean"] = &clientcmdapi.Context{ - Cluster: "clean", - AuthInfo: "clean", - } - - badValidation := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"unable to read certificate-authority"}, - } - okTest := configValidationTest{ - config: config, - } - - okTest.testConfirmUsable("clean", t) - badValidation.testConfig(t) -} -func TestConfirmUsableBadInfoConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - config.Clusters["missing ca"] = &clientcmdapi.Cluster{ - Server: "anything", - CertificateAuthority: "missing", - } - config.AuthInfos["error"] = &clientcmdapi.AuthInfo{ - Username: "anything", - Token: "here", - } - config.Contexts["first"] = &clientcmdapi.Context{ - Cluster: "missing ca", - AuthInfo: "error", - } - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"unable to read certificate-authority"}, - } - - test.testConfirmUsable("first", t) -} -func TestConfirmUsableEmptyConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"invalid configuration: no configuration has been provided"}, - } - - test.testConfirmUsable("", t) -} -func TestConfirmUsableMissingConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"invalid configuration: no configuration has been provided"}, - } - - test.testConfirmUsable("not-here", t) -} -func TestValidateEmptyConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"invalid configuration: no configuration has been provided"}, - } - - test.testConfig(t) -} -func TestValidateMissingCurrentContextConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - config.CurrentContext = "anything" - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"context was not found for specified "}, - } - - test.testConfig(t) -} -func TestIsContextNotFound(t *testing.T) { - config := clientcmdapi.NewConfig() - config.CurrentContext = "anything" - - err := Validate(*config) - if !IsContextNotFound(err) { - t.Errorf("Expected context not found, but got %v", err) - } - if !IsConfigurationInvalid(err) { - t.Errorf("Expected configuration invalid, but got %v", err) - } -} - -func TestIsEmptyConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - - err := Validate(*config) - if !IsEmptyConfig(err) { - t.Errorf("Expected context not found, but got %v", err) - } - if !IsConfigurationInvalid(err) { - t.Errorf("Expected configuration invalid, but got %v", err) - } -} - -func TestIsConfigurationInvalid(t *testing.T) { - if newErrConfigurationInvalid([]error{}) != nil { - t.Errorf("unexpected error") - } - if newErrConfigurationInvalid([]error{ErrNoContext}) == ErrNoContext { - t.Errorf("unexpected error") - } - if newErrConfigurationInvalid([]error{ErrNoContext, ErrNoContext}) == nil { - t.Errorf("unexpected error") - } - if !IsConfigurationInvalid(newErrConfigurationInvalid([]error{ErrNoContext, ErrNoContext})) { - t.Errorf("unexpected error") - } -} - -func TestValidateMissingReferencesConfig(t *testing.T) { - config := clientcmdapi.NewConfig() - config.CurrentContext = "anything" - config.Contexts["anything"] = &clientcmdapi.Context{Cluster: "missing", AuthInfo: "missing"} - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"user \"missing\" was not found for context \"anything\"", "cluster \"missing\" was not found for context \"anything\""}, - } - - test.testContext("anything", t) - test.testConfig(t) -} -func TestValidateEmptyContext(t *testing.T) { - config := clientcmdapi.NewConfig() - config.CurrentContext = "anything" - config.Contexts["anything"] = &clientcmdapi.Context{} - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"user was not specified for context \"anything\"", "cluster was not specified for context \"anything\""}, - } - - test.testContext("anything", t) - test.testConfig(t) -} - -func TestValidateEmptyClusterInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.Clusters["empty"] = &clientcmdapi.Cluster{} - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"cluster has no server defined"}, - } - - test.testCluster("empty", t) - test.testConfig(t) -} -func TestValidateMissingCAFileClusterInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.Clusters["missing ca"] = &clientcmdapi.Cluster{ - Server: "anything", - CertificateAuthority: "missing", - } - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"unable to read certificate-authority"}, - } - - test.testCluster("missing ca", t) - test.testConfig(t) -} -func TestValidateCleanClusterInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: "anything", - } - test := configValidationTest{ - config: config, - } - - test.testCluster("clean", t) - test.testConfig(t) -} -func TestValidateCleanWithCAClusterInfo(t *testing.T) { - tempFile, _ := ioutil.TempFile("", "") - defer os.Remove(tempFile.Name()) - - config := clientcmdapi.NewConfig() - config.Clusters["clean"] = &clientcmdapi.Cluster{ - Server: "anything", - CertificateAuthority: tempFile.Name(), - } - test := configValidationTest{ - config: config, - } - - test.testCluster("clean", t) - test.testConfig(t) -} - -func TestValidateEmptyAuthInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.AuthInfos["error"] = &clientcmdapi.AuthInfo{} - test := configValidationTest{ - config: config, - } - - test.testAuthInfo("error", t) - test.testConfig(t) -} -func TestValidateCertFilesNotFoundAuthInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.AuthInfos["error"] = &clientcmdapi.AuthInfo{ - ClientCertificate: "missing", - ClientKey: "missing", - } - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"unable to read client-cert", "unable to read client-key"}, - } - - test.testAuthInfo("error", t) - test.testConfig(t) -} -func TestValidateCertDataOverridesFiles(t *testing.T) { - tempFile, _ := ioutil.TempFile("", "") - defer os.Remove(tempFile.Name()) - - config := clientcmdapi.NewConfig() - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - ClientCertificate: tempFile.Name(), - ClientCertificateData: []byte("certdata"), - ClientKey: tempFile.Name(), - ClientKeyData: []byte("keydata"), - } - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"client-cert-data and client-cert are both specified", "client-key-data and client-key are both specified"}, - } - - test.testAuthInfo("clean", t) - test.testConfig(t) -} -func TestValidateCleanCertFilesAuthInfo(t *testing.T) { - tempFile, _ := ioutil.TempFile("", "") - defer os.Remove(tempFile.Name()) - - config := clientcmdapi.NewConfig() - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - ClientCertificate: tempFile.Name(), - ClientKey: tempFile.Name(), - } - test := configValidationTest{ - config: config, - } - - test.testAuthInfo("clean", t) - test.testConfig(t) -} -func TestValidateCleanTokenAuthInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.AuthInfos["clean"] = &clientcmdapi.AuthInfo{ - Token: "any-value", - } - test := configValidationTest{ - config: config, - } - - test.testAuthInfo("clean", t) - test.testConfig(t) -} - -func TestValidateMultipleMethodsAuthInfo(t *testing.T) { - config := clientcmdapi.NewConfig() - config.AuthInfos["error"] = &clientcmdapi.AuthInfo{ - Token: "token", - Username: "username", - } - test := configValidationTest{ - config: config, - expectedErrorSubstring: []string{"more than one authentication method", "token", "basicAuth"}, - } - - test.testAuthInfo("error", t) - test.testConfig(t) -} - -type configValidationTest struct { - config *clientcmdapi.Config - expectedErrorSubstring []string -} - -func (c configValidationTest) testContext(contextName string, t *testing.T) { - errs := validateContext(contextName, *c.config.Contexts[contextName], *c.config) - - if len(c.expectedErrorSubstring) != 0 { - if len(errs) == 0 { - t.Errorf("Expected error containing: %v", c.expectedErrorSubstring) - } - for _, curr := range c.expectedErrorSubstring { - if len(errs) != 0 && !strings.Contains(utilerrors.NewAggregate(errs).Error(), curr) { - t.Errorf("Expected error containing: %v, but got %v", c.expectedErrorSubstring, utilerrors.NewAggregate(errs)) - } - } - - } else { - if len(errs) != 0 { - t.Errorf("Unexpected error: %v", utilerrors.NewAggregate(errs)) - } - } -} -func (c configValidationTest) testConfirmUsable(contextName string, t *testing.T) { - err := ConfirmUsable(*c.config, contextName) - - if len(c.expectedErrorSubstring) != 0 { - if err == nil { - t.Errorf("Expected error containing: %v", c.expectedErrorSubstring) - } else { - for _, curr := range c.expectedErrorSubstring { - if err != nil && !strings.Contains(err.Error(), curr) { - t.Errorf("Expected error containing: %v, but got %v", c.expectedErrorSubstring, err) - } - } - } - } else { - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - } -} -func (c configValidationTest) testConfig(t *testing.T) { - err := Validate(*c.config) - - if len(c.expectedErrorSubstring) != 0 { - if err == nil { - t.Errorf("Expected error containing: %v", c.expectedErrorSubstring) - } else { - for _, curr := range c.expectedErrorSubstring { - if err != nil && !strings.Contains(err.Error(), curr) { - t.Errorf("Expected error containing: %v, but got %v", c.expectedErrorSubstring, err) - } - } - if !IsConfigurationInvalid(err) { - t.Errorf("all errors should be configuration invalid: %v", err) - } - } - } else { - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - } -} -func (c configValidationTest) testCluster(clusterName string, t *testing.T) { - errs := validateClusterInfo(clusterName, *c.config.Clusters[clusterName]) - - if len(c.expectedErrorSubstring) != 0 { - if len(errs) == 0 { - t.Errorf("Expected error containing: %v", c.expectedErrorSubstring) - } - for _, curr := range c.expectedErrorSubstring { - if len(errs) != 0 && !strings.Contains(utilerrors.NewAggregate(errs).Error(), curr) { - t.Errorf("Expected error containing: %v, but got %v", c.expectedErrorSubstring, utilerrors.NewAggregate(errs)) - } - } - - } else { - if len(errs) != 0 { - t.Errorf("Unexpected error: %v", utilerrors.NewAggregate(errs)) - } - } -} - -func (c configValidationTest) testAuthInfo(authInfoName string, t *testing.T) { - errs := validateAuthInfo(authInfoName, *c.config.AuthInfos[authInfoName]) - - if len(c.expectedErrorSubstring) != 0 { - if len(errs) == 0 { - t.Errorf("Expected error containing: %v", c.expectedErrorSubstring) - } - for _, curr := range c.expectedErrorSubstring { - if len(errs) != 0 && !strings.Contains(utilerrors.NewAggregate(errs).Error(), curr) { - t.Errorf("Expected error containing: %v, but got %v", c.expectedErrorSubstring, utilerrors.NewAggregate(errs)) - } - } - - } else { - if len(errs) != 0 { - t.Errorf("Unexpected error: %v", utilerrors.NewAggregate(errs)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/conditions_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/conditions_test.go deleted file mode 100644 index 1042461c0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/conditions_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "fmt" - "testing" - - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/util/wait" -) - -func TestRetryOnConflict(t *testing.T) { - opts := wait.Backoff{Factor: 1.0, Steps: 3} - conflictErr := errors.NewConflict(unversioned.GroupResource{Resource: "test"}, "other", nil) - - // never returns - err := RetryOnConflict(opts, func() error { - return conflictErr - }) - if err != conflictErr { - t.Errorf("unexpected error: %v", err) - } - - // returns immediately - i := 0 - err = RetryOnConflict(opts, func() error { - i++ - return nil - }) - if err != nil || i != 1 { - t.Errorf("unexpected error: %v", err) - } - - // returns immediately on error - testErr := fmt.Errorf("some other error") - err = RetryOnConflict(opts, func() error { - return testErr - }) - if err != testErr { - t.Errorf("unexpected error: %v", err) - } - - // keeps retrying - i = 0 - err = RetryOnConflict(opts, func() error { - if i < 2 { - i++ - return errors.NewConflict(unversioned.GroupResource{Resource: "test"}, "other", nil) - } - return nil - }) - if err != nil || i != 2 { - t.Errorf("unexpected error: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/containerinfo_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/containerinfo_test.go deleted file mode 100644 index 797ad5139..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/containerinfo_test.go +++ /dev/null @@ -1,198 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "net/url" - "path" - "reflect" - "strconv" - "strings" - "testing" - "time" - - cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapitest "github.com/google/cadvisor/info/v1/test" -) - -func testHTTPContainerInfoGetter( - req *cadvisorapi.ContainerInfoRequest, - cinfo *cadvisorapi.ContainerInfo, - podID string, - containerID string, - status int, - t *testing.T, -) { - expectedPath := "/stats" - if len(podID) > 0 && len(containerID) > 0 { - expectedPath = path.Join(expectedPath, podID, containerID) - } - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if status != 0 { - w.WriteHeader(status) - } - if strings.TrimRight(r.URL.Path, "/") != strings.TrimRight(expectedPath, "/") { - t.Fatalf("Received request to an invalid path. Should be %v. got %v", - expectedPath, r.URL.Path) - } - - var receivedReq cadvisorapi.ContainerInfoRequest - err := json.NewDecoder(r.Body).Decode(&receivedReq) - if err != nil { - t.Fatal(err) - } - // Note: This will not make a deep copy of req. - // So changing req after Get*Info would be a race. - expectedReq := req - // Fill any empty fields with default value - if !expectedReq.Equals(receivedReq) { - t.Errorf("received wrong request") - } - err = json.NewEncoder(w).Encode(cinfo) - if err != nil { - t.Fatal(err) - } - })) - defer ts.Close() - hostURL, err := url.Parse(ts.URL) - if err != nil { - t.Fatal(err) - } - parts := strings.Split(hostURL.Host, ":") - - port, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatal(err) - } - - containerInfoGetter := &HTTPContainerInfoGetter{ - Client: http.DefaultClient, - Port: port, - } - - var receivedContainerInfo *cadvisorapi.ContainerInfo - if len(podID) > 0 && len(containerID) > 0 { - receivedContainerInfo, err = containerInfoGetter.GetContainerInfo(parts[0], podID, containerID, req) - } else { - receivedContainerInfo, err = containerInfoGetter.GetRootInfo(parts[0], req) - } - if status == 0 || status == http.StatusOK { - if err != nil { - t.Errorf("received unexpected error: %v", err) - } - - if !receivedContainerInfo.Eq(cinfo) { - t.Error("received unexpected container info") - } - } else { - if err == nil { - t.Error("did not receive expected error.") - } - } -} - -func TestHTTPContainerInfoGetterGetContainerInfoSuccessfully(t *testing.T) { - req := &cadvisorapi.ContainerInfoRequest{ - NumStats: 10, - } - cinfo := cadvisorapitest.GenerateRandomContainerInfo( - "dockerIDWhichWillNotBeChecked", // docker ID - 2, // Number of cores - req, - 1*time.Second, - ) - testHTTPContainerInfoGetter(req, cinfo, "somePodID", "containerNameInK8S", 0, t) -} - -func TestHTTPContainerInfoGetterGetRootInfoSuccessfully(t *testing.T) { - req := &cadvisorapi.ContainerInfoRequest{ - NumStats: 10, - } - cinfo := cadvisorapitest.GenerateRandomContainerInfo( - "dockerIDWhichWillNotBeChecked", // docker ID - 2, // Number of cores - req, - 1*time.Second, - ) - testHTTPContainerInfoGetter(req, cinfo, "", "", 0, t) -} - -func TestHTTPContainerInfoGetterGetContainerInfoWithError(t *testing.T) { - req := &cadvisorapi.ContainerInfoRequest{ - NumStats: 10, - } - cinfo := cadvisorapitest.GenerateRandomContainerInfo( - "dockerIDWhichWillNotBeChecked", // docker ID - 2, // Number of cores - req, - 1*time.Second, - ) - testHTTPContainerInfoGetter(req, cinfo, "somePodID", "containerNameInK8S", http.StatusNotFound, t) -} - -func TestHTTPContainerInfoGetterGetRootInfoWithError(t *testing.T) { - req := &cadvisorapi.ContainerInfoRequest{ - NumStats: 10, - } - cinfo := cadvisorapitest.GenerateRandomContainerInfo( - "dockerIDWhichWillNotBeChecked", // docker ID - 2, // Number of cores - req, - 1*time.Second, - ) - testHTTPContainerInfoGetter(req, cinfo, "", "", http.StatusNotFound, t) -} - -func TestHTTPGetMachineInfo(t *testing.T) { - mspec := &cadvisorapi.MachineInfo{ - NumCores: 4, - MemoryCapacity: 2048, - } - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - err := json.NewEncoder(w).Encode(mspec) - if err != nil { - t.Fatal(err) - } - })) - defer ts.Close() - hostURL, err := url.Parse(ts.URL) - if err != nil { - t.Fatal(err) - } - parts := strings.Split(hostURL.Host, ":") - - port, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatal(err) - } - - containerInfoGetter := &HTTPContainerInfoGetter{ - Client: http.DefaultClient, - Port: port, - } - - received, err := containerInfoGetter.GetMachineInfo(parts[0]) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(received, mspec) { - t.Errorf("received wrong machine spec") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets_test.go deleted file mode 100644 index f453a9138..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets_test.go +++ /dev/null @@ -1,198 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/extensions" -) - -func getDSResourceName() string { - return "daemonsets" -} - -func TestListDaemonSets(t *testing.T) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &extensions.DaemonSetList{ - Items: []extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - }, - }, - } - receivedDSs, err := c.Setup(t).Extensions().DaemonSets(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedDSs, err) - -} - -func TestGetDaemonSet(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedDaemonSet, err := c.Setup(t).Extensions().DaemonSets(ns).Get("foo") - defer c.Close() - c.Validate(t, receivedDaemonSet, err) -} - -func TestGetDaemonSetWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Extensions().DaemonSets(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestUpdateDaemonSet(t *testing.T) { - ns := api.NamespaceDefault - requestDaemonSet := &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedDaemonSet, err := c.Setup(t).Extensions().DaemonSets(ns).Update(requestDaemonSet) - defer c.Close() - c.Validate(t, receivedDaemonSet, err) -} - -func TestUpdateDaemonSetUpdateStatus(t *testing.T) { - ns := api.NamespaceDefault - requestDaemonSet := &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, "foo") + "/status", Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{}, - }, - Status: extensions.DaemonSetStatus{}, - }, - }, - } - receivedDaemonSet, err := c.Setup(t).Extensions().DaemonSets(ns).UpdateStatus(requestDaemonSet) - defer c.Close() - c.Validate(t, receivedDaemonSet, err) -} - -func TestDeleteDaemon(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Extensions().DaemonSets(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestCreateDaemonSet(t *testing.T) { - ns := api.NamespaceDefault - requestDaemonSet := &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Extensions.ResourcePath(getDSResourceName(), ns, ""), Body: requestDaemonSet, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedDaemonSet, err := c.Setup(t).Extensions().DaemonSets(ns).Create(requestDaemonSet) - defer c.Close() - c.Validate(t, receivedDaemonSet, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/deployment_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/deployment_test.go deleted file mode 100644 index c530411a7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/deployment_test.go +++ /dev/null @@ -1,236 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/http" - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" - "k8s.io/kubernetes/pkg/labels" -) - -func getDeploymentsResourceName() string { - return "deployments" -} - -func TestDeploymentCreate(t *testing.T) { - ns := api.NamespaceDefault - deployment := extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: &deployment, - }, - Response: simple.Response{StatusCode: 200, Body: &deployment}, - } - - response, err := c.Setup(t).Deployments(ns).Create(&deployment) - defer c.Close() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - c.Validate(t, response, err) -} - -func TestDeploymentGet(t *testing.T) { - ns := api.NamespaceDefault - deployment := &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: deployment}, - } - - response, err := c.Setup(t).Deployments(ns).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestDeploymentList(t *testing.T) { - ns := api.NamespaceDefault - deploymentList := &extensions.DeploymentList{ - Items: []extensions.Deployment{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: deploymentList}, - } - response, err := c.Setup(t).Deployments(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestDeploymentUpdate(t *testing.T) { - ns := api.NamespaceDefault - deployment := &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{StatusCode: 200, Body: deployment}, - } - response, err := c.Setup(t).Deployments(ns).Update(deployment) - defer c.Close() - c.Validate(t, response, err) -} - -func TestDeploymentUpdateStatus(t *testing.T) { - ns := api.NamespaceDefault - deployment := &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, "abc") + "/status", - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{StatusCode: 200, Body: deployment}, - } - response, err := c.Setup(t).Deployments(ns).UpdateStatus(deployment) - defer c.Close() - c.Validate(t, response, err) -} - -func TestDeploymentDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "DELETE", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Deployments(ns).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestDeploymentWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePathWithPrefix("watch", getDeploymentsResourceName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}, - }, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).Deployments(api.NamespaceAll).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestListDeploymentsLabels(t *testing.T) { - ns := api.NamespaceDefault - labelSelectorQueryParamName := unversioned.LabelSelectorQueryParam(testapi.Extensions.GroupVersion().String()) - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath("deployments", ns, ""), - Query: simple.BuildQueryValues(url.Values{labelSelectorQueryParamName: []string{"foo=bar,name=baz"}})}, - Response: simple.Response{ - StatusCode: http.StatusOK, - Body: &extensions.DeploymentList{ - Items: []extensions.Deployment{ - { - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - }, - }, - }, - }, - } - c.Setup(t) - defer c.Close() - c.QueryValidator[labelSelectorQueryParamName] = simple.ValidateLabels - selector := labels.Set{"foo": "bar", "name": "baz"}.AsSelector() - options := api.ListOptions{LabelSelector: selector} - receivedPodList, err := c.Deployments(ns).List(options) - c.Validate(t, receivedPodList, err) -} - -func TestDeploymentRollback(t *testing.T) { - ns := api.NamespaceDefault - deploymentRollback := &extensions.DeploymentRollback{ - Name: "abc", - UpdatedAnnotations: map[string]string{}, - RollbackTo: extensions.RollbackConfig{Revision: 1}, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Extensions.ResourcePath(getDeploymentsResourceName(), ns, "abc") + "/rollback", - Query: simple.BuildQueryValues(nil), - Body: deploymentRollback, - }, - Response: simple.Response{StatusCode: http.StatusOK}, - } - err := c.Setup(t).Deployments(ns).Rollback(deploymentRollback) - defer c.Close() - c.ValidateCommon(t, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/endpoints_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/endpoints_test.go deleted file mode 100644 index 59bc869b8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/endpoints_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func TestListEndpoints(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath("endpoints", ns, ""), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, - Body: &api.EndpointsList{ - Items: []api.Endpoints{ - { - ObjectMeta: api.ObjectMeta{Name: "endpoint-1"}, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "10.245.1.2"}, {IP: "10.245.1.3"}}, - Ports: []api.EndpointPort{{Port: 8080}}, - }}, - }, - }, - }, - }, - } - receivedEndpointsList, err := c.Setup(t).Endpoints(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedEndpointsList, err) -} - -func TestGetEndpoints(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath("endpoints", ns, "endpoint-1"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: &api.Endpoints{ObjectMeta: api.ObjectMeta{Name: "endpoint-1"}}}, - } - response, err := c.Setup(t).Endpoints(ns).Get("endpoint-1") - defer c.Close() - c.Validate(t, response, err) -} - -func TestGetEndpointWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Endpoints(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/events_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/events_test.go deleted file mode 100644 index 371c7544e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/events_test.go +++ /dev/null @@ -1,205 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - . "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -import ( - "net/url" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -func TestEventSearch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("events", "baz", ""), - Query: url.Values{ - unversioned.FieldSelectorQueryParam(testapi.Default.GroupVersion().String()): []string{ - GetInvolvedObjectNameFieldLabel(testapi.Default.GroupVersion().String()) + "=foo,", - "involvedObject.namespace=baz,", - "involvedObject.kind=Pod", - }, - unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()): []string{}, - }, - }, - Response: simple.Response{StatusCode: 200, Body: &api.EventList{}}, - } - eventList, err := c.Setup(t).Events("baz").Search( - &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "baz", - SelfLink: testapi.Default.SelfLink("pods", ""), - }, - }, - ) - defer c.Close() - c.Validate(t, eventList, err) -} - -func TestEventCreate(t *testing.T) { - objReference := &api.ObjectReference{ - Kind: "foo", - Namespace: "nm", - Name: "objref1", - UID: "uid", - APIVersion: "apiv1", - ResourceVersion: "1", - } - timeStamp := unversioned.Now() - event := &api.Event{ - ObjectMeta: api.ObjectMeta{ - Namespace: api.NamespaceDefault, - }, - InvolvedObject: *objReference, - FirstTimestamp: timeStamp, - LastTimestamp: timeStamp, - Count: 1, - Type: api.EventTypeNormal, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath("events", api.NamespaceDefault, ""), - Body: event, - }, - Response: simple.Response{StatusCode: 200, Body: event}, - } - - response, err := c.Setup(t).Events(api.NamespaceDefault).Create(event) - defer c.Close() - - if err != nil { - t.Fatalf("%v should be nil.", err) - } - - if e, a := *objReference, response.InvolvedObject; !reflect.DeepEqual(e, a) { - t.Errorf("%#v != %#v.", e, a) - } -} - -func TestEventGet(t *testing.T) { - objReference := &api.ObjectReference{ - Kind: "foo", - Namespace: "nm", - Name: "objref1", - UID: "uid", - APIVersion: "apiv1", - ResourceVersion: "1", - } - timeStamp := unversioned.Now() - event := &api.Event{ - ObjectMeta: api.ObjectMeta{ - Namespace: "other", - }, - InvolvedObject: *objReference, - FirstTimestamp: timeStamp, - LastTimestamp: timeStamp, - Count: 1, - Type: api.EventTypeNormal, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("events", "other", "1"), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: event}, - } - - response, err := c.Setup(t).Events("other").Get("1") - defer c.Close() - - if err != nil { - t.Fatalf("%v should be nil.", err) - } - - if e, r := event.InvolvedObject, response.InvolvedObject; !reflect.DeepEqual(e, r) { - t.Errorf("%#v != %#v.", e, r) - } -} - -func TestEventList(t *testing.T) { - ns := api.NamespaceDefault - objReference := &api.ObjectReference{ - Kind: "foo", - Namespace: ns, - Name: "objref1", - UID: "uid", - APIVersion: "apiv1", - ResourceVersion: "1", - } - timeStamp := unversioned.Now() - eventList := &api.EventList{ - Items: []api.Event{ - { - InvolvedObject: *objReference, - FirstTimestamp: timeStamp, - LastTimestamp: timeStamp, - Count: 1, - Type: api.EventTypeNormal, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("events", ns, ""), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: eventList}, - } - response, err := c.Setup(t).Events(ns).List(api.ListOptions{}) - defer c.Close() - - if err != nil { - t.Errorf("%#v should be nil.", err) - } - - if len(response.Items) != 1 { - t.Errorf("%#v response.Items should have len 1.", response.Items) - } - - responseEvent := response.Items[0] - if e, r := eventList.Items[0].InvolvedObject, - responseEvent.InvolvedObject; !reflect.DeepEqual(e, r) { - t.Errorf("%#v != %#v.", e, r) - } -} - -func TestEventDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "DELETE", - Path: testapi.Default.ResourcePath("events", ns, "foo"), - }, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Events(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/fake/fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/fake/fake.go deleted file mode 100644 index df7824251..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/fake/fake.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// This is made a separate package and should only be imported by tests, because -// it imports testapi -package fake - -import ( - "net/http" - "net/url" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/runtime" -) - -func CreateHTTPClient(roundTripper func(*http.Request) (*http.Response, error)) *http.Client { - return &http.Client{ - Transport: roundTripperFunc(roundTripper), - } -} - -type roundTripperFunc func(*http.Request) (*http.Response, error) - -func (f roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) { - return f(req) -} - -// RESTClient provides a fake RESTClient interface. -type RESTClient struct { - Client *http.Client - Codec runtime.Codec - Req *http.Request - Resp *http.Response - Err error -} - -func (c *RESTClient) Get() *restclient.Request { - return c.request("GET") -} - -func (c *RESTClient) Put() *restclient.Request { - return c.request("PUT") -} - -func (c *RESTClient) Patch(_ api.PatchType) *restclient.Request { - return c.request("PATCH") -} - -func (c *RESTClient) Post() *restclient.Request { - return c.request("POST") -} - -func (c *RESTClient) Delete() *restclient.Request { - return c.request("DELETE") -} - -func (c *RESTClient) request(verb string) *restclient.Request { - config := restclient.ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - Codec: c.Codec, - } - serializers := restclient.Serializers{ - Encoder: c.Codec, - Decoder: c.Codec, - StreamingSerializer: c.Codec, - Framer: runtime.DefaultFramer, - } - return restclient.NewRequest(c, verb, &url.URL{Host: "localhost"}, "", config, serializers, nil, nil) -} - -func (c *RESTClient) Do(req *http.Request) (*http.Response, error) { - if c.Err != nil { - return nil, c.Err - } - c.Req = req - if c.Client != nil { - return c.Client.Do(req) - } - return c.Resp, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/flags_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/flags_test.go deleted file mode 100644 index ab0f94d04..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/flags_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/sets" -) - -type fakeFlagSet struct { - t *testing.T - set sets.String -} - -func (f *fakeFlagSet) StringVar(p *string, name, value, usage string) { - if p == nil { - f.t.Errorf("unexpected nil pointer") - } - if usage == "" { - f.t.Errorf("unexpected empty usage") - } - f.set.Insert(name) -} - -func (f *fakeFlagSet) BoolVar(p *bool, name string, value bool, usage string) { - if p == nil { - f.t.Errorf("unexpected nil pointer") - } - if usage == "" { - f.t.Errorf("unexpected empty usage") - } - f.set.Insert(name) -} - -func (f *fakeFlagSet) UintVar(p *uint, name string, value uint, usage string) { - if p == nil { - f.t.Errorf("unexpected nil pointer") - } - if usage == "" { - f.t.Errorf("unexpected empty usage") - } - f.set.Insert(name) -} - -func (f *fakeFlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) { - if p == nil { - f.t.Errorf("unexpected nil pointer") - } - if usage == "" { - f.t.Errorf("unexpected empty usage") - } - f.set.Insert(name) -} - -func (f *fakeFlagSet) IntVar(p *int, name string, value int, usage string) { - if p == nil { - f.t.Errorf("unexpected nil pointer") - } - if usage == "" { - f.t.Errorf("unexpected empty usage") - } - f.set.Insert(name) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_blackbox_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_blackbox_test.go deleted file mode 100644 index c4860a12f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_blackbox_test.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "bytes" - "encoding/json" - "errors" - "io" - "io/ioutil" - "net/http" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/testapi" - uapi "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func objBody(object interface{}) io.ReadCloser { - output, err := json.MarshalIndent(object, "", "") - if err != nil { - panic(err) - } - return ioutil.NopCloser(bytes.NewReader([]byte(output))) -} - -func TestNegotiateVersion(t *testing.T) { - tests := []struct { - name string - version *uapi.GroupVersion - expectedVersion *uapi.GroupVersion - serverVersions []string - clientVersions []uapi.GroupVersion - config *restclient.Config - expectErr func(err error) bool - sendErr error - }{ - { - name: "server supports client default", - version: &uapi.GroupVersion{Version: "version1"}, - config: &restclient.Config{}, - serverVersions: []string{"version1", testapi.Default.GroupVersion().String()}, - clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, - expectedVersion: &uapi.GroupVersion{Version: "version1"}, - }, - { - name: "server falls back to client supported", - version: testapi.Default.GroupVersion(), - config: &restclient.Config{}, - serverVersions: []string{"version1"}, - clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, - expectedVersion: &uapi.GroupVersion{Version: "version1"}, - }, - { - name: "explicit version supported", - config: &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}, - serverVersions: []string{"/version1", testapi.Default.GroupVersion().String()}, - clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, - expectedVersion: testapi.Default.GroupVersion(), - }, - { - name: "explicit version not supported", - config: &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}, - serverVersions: []string{"version1"}, - clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, - expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) }, - }, - { - name: "connection refused error", - config: &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}, - serverVersions: []string{"version1"}, - clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, - sendErr: errors.New("connection refused"), - expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") }, - }, - } - codec := testapi.Default.Codec() - - for _, test := range tests { - fakeClient := &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{ - StatusCode: 200, - Body: objBody(&uapi.APIVersions{Versions: test.serverVersions}), - }, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - if test.sendErr != nil { - return nil, test.sendErr - } - return &http.Response{StatusCode: 200, Body: objBody(&uapi.APIVersions{Versions: test.serverVersions})}, nil - }), - } - c := unversioned.NewOrDie(test.config) - c.DiscoveryClient.Client = fakeClient.Client - response, err := unversioned.NegotiateVersion(c, test.config, test.version, test.clientVersions) - if err == nil && test.expectErr != nil { - t.Errorf("expected error, got nil for [%s].", test.name) - } - if err != nil { - if test.expectErr == nil || !test.expectErr(err) { - t.Errorf("unexpected error for [%s]: %v.", test.name, err) - } - continue - } - if *response != *test.expectedVersion { - t.Errorf("%s: expected version %s, got %s.", test.name, test.expectedVersion, response) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_test.go deleted file mode 100644 index 0e186e4c7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/helper_test.go +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestSetKubernetesDefaults(t *testing.T) { - testCases := []struct { - Config restclient.Config - After restclient.Config - Err bool - }{ - { - restclient.Config{}, - restclient.Config{ - APIPath: "/api", - ContentConfig: restclient.ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - Codec: testapi.Default.Codec(), - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - }, - QPS: 5, - Burst: 10, - }, - false, - }, - // Add this test back when we fixed config and SetKubernetesDefaults - // { - // restclient.Config{ - // GroupVersion: &unversioned.GroupVersion{Group: "not.a.group", Version: "not_an_api"}, - // }, - // restclient.Config{}, - // true, - // }, - } - for _, testCase := range testCases { - val := &testCase.Config - err := SetKubernetesDefaults(val) - val.UserAgent = "" - switch { - case err == nil && testCase.Err: - t.Errorf("expected error but was nil") - continue - case err != nil && !testCase.Err: - t.Errorf("unexpected error %v", err) - continue - case err != nil: - continue - } - if !reflect.DeepEqual(*val, testCase.After) { - t.Errorf("unexpected result object: %#v", val) - } - } -} - -func TestHelperGetServerAPIVersions(t *testing.T) { - expect := []string{"v1", "v2", "v3"} - APIVersions := unversioned.APIVersions{Versions: expect} - expect = append(expect, "group1/v1", "group1/v2", "group2/v1", "group2/v2") - APIGroupList := unversioned.APIGroupList{ - Groups: []unversioned.APIGroup{ - { - Versions: []unversioned.GroupVersionForDiscovery{ - { - GroupVersion: "group1/v1", - }, - { - GroupVersion: "group1/v2", - }, - }, - }, - { - Versions: []unversioned.GroupVersionForDiscovery{ - { - GroupVersion: "group2/v1", - }, - { - GroupVersion: "group2/v2", - }, - }, - }, - }, - } - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var output []byte - var err error - switch req.URL.Path { - case "/api": - output, err = json.Marshal(APIVersions) - - case "/apis": - output, err = json.Marshal(APIGroupList) - } - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write(output) - })) - defer server.Close() - got, err := restclient.ServerAPIVersions(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "invalid version", Version: "one"}, NegotiatedSerializer: testapi.Default.NegotiatedSerializer()}}) - if err != nil { - t.Fatalf("unexpected encoding error: %v", err) - } - if e, a := expect, got; !reflect.DeepEqual(e, a) { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestSetsCodec(t *testing.T) { - testCases := map[string]struct { - Err bool - Prefix string - Codec runtime.Codec - }{ - testapi.Default.GroupVersion().Version: {false, "/api/" + testapi.Default.GroupVersion().Version, testapi.Default.Codec()}, - // Add this test back when we fixed config and SetKubernetesDefaults - // "invalidVersion": {true, "", nil}, - } - for version, expected := range testCases { - conf := &restclient.Config{ - Host: "127.0.0.1", - ContentConfig: restclient.ContentConfig{ - GroupVersion: &unversioned.GroupVersion{Version: version}, - }, - } - - var versionedPath string - err := SetKubernetesDefaults(conf) - if err == nil { - _, versionedPath, err = restclient.DefaultServerURL(conf.Host, conf.APIPath, *conf.GroupVersion, false) - } - - switch { - case err == nil && expected.Err: - t.Errorf("expected error but was nil") - continue - case err != nil && !expected.Err: - t.Errorf("unexpected error %v", err) - continue - case err != nil: - continue - } - if e, a := expected.Prefix, versionedPath; e != a { - t.Errorf("expected %#v, got %#v", e, a) - } - if e, a := expected.Codec, conf.Codec; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler_test.go deleted file mode 100644 index 550dae6ec..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler_test.go +++ /dev/null @@ -1,222 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/autoscaling" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getHorizontalPodAutoscalersResoureName() string { - return "horizontalpodautoscalers" -} - -func getHPAClient(t *testing.T, c *simple.Client, ns, resourceGroup string) unversioned.HorizontalPodAutoscalerInterface { - switch resourceGroup { - case autoscaling.GroupName: - return c.Setup(t).Autoscaling().HorizontalPodAutoscalers(ns) - case extensions.GroupName: - return c.Setup(t).Extensions().HorizontalPodAutoscalers(ns) - default: - t.Fatalf("Unknown group %v", resourceGroup) - } - return nil -} - -func testHorizontalPodAutoscalerCreate(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - horizontalPodAutoscaler := extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: &horizontalPodAutoscaler, - }, - Response: simple.Response{StatusCode: 200, Body: &horizontalPodAutoscaler}, - ResourceGroup: resourceGroup, - } - - response, err := getHPAClient(t, c, ns, resourceGroup).Create(&horizontalPodAutoscaler) - defer c.Close() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - c.Validate(t, response, err) -} - -func TestHorizontalPodAutoscalerCreate(t *testing.T) { - testHorizontalPodAutoscalerCreate(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerCreate(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerGet(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - horizontalPodAutoscaler := &extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: horizontalPodAutoscaler}, - ResourceGroup: resourceGroup, - } - - response, err := getHPAClient(t, c, ns, resourceGroup).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestHorizontalPodAutoscalerGet(t *testing.T) { - testHorizontalPodAutoscalerGet(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerGet(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerList(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - horizontalPodAutoscalerList := &extensions.HorizontalPodAutoscalerList{ - Items: []extensions.HorizontalPodAutoscaler{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: horizontalPodAutoscalerList}, - ResourceGroup: resourceGroup, - } - response, err := getHPAClient(t, c, ns, resourceGroup).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestHorizontalPodAutoscalerList(t *testing.T) { - testHorizontalPodAutoscalerList(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerList(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerUpdate(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - horizontalPodAutoscaler := &extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: horizontalPodAutoscaler}, - ResourceGroup: resourceGroup, - } - response, err := getHPAClient(t, c, ns, resourceGroup).Update(horizontalPodAutoscaler) - defer c.Close() - c.Validate(t, response, err) -} - -func TestHorizontalPodAutoscalerUpdate(t *testing.T) { - testHorizontalPodAutoscalerUpdate(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerUpdate(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerUpdateStatus(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - horizontalPodAutoscaler := &extensions.HorizontalPodAutoscaler{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, "abc") + "/status", Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: horizontalPodAutoscaler}, - ResourceGroup: resourceGroup, - } - response, err := getHPAClient(t, c, ns, resourceGroup).UpdateStatus(horizontalPodAutoscaler) - defer c.Close() - c.Validate(t, response, err) -} - -func TestHorizontalPodAutoscalerUpdateStatus(t *testing.T) { - testHorizontalPodAutoscalerUpdateStatus(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerUpdateStatus(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerDelete(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: group.ResourcePath(getHorizontalPodAutoscalersResoureName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - ResourceGroup: resourceGroup, - } - err := getHPAClient(t, c, ns, resourceGroup).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestHorizontalPodAutoscalerDelete(t *testing.T) { - testHorizontalPodAutoscalerDelete(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerDelete(t, testapi.Autoscaling, autoscaling.GroupName) -} - -func testHorizontalPodAutoscalerWatch(t *testing.T, group testapi.TestGroup, resourceGroup string) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: group.ResourcePathWithPrefix("watch", getHorizontalPodAutoscalersResoureName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - ResourceGroup: resourceGroup, - } - _, err := getHPAClient(t, c, api.NamespaceAll, resourceGroup).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestHorizontalPodAutoscalerWatch(t *testing.T) { - testHorizontalPodAutoscalerWatch(t, testapi.Extensions, extensions.GroupName) - testHorizontalPodAutoscalerWatch(t, testapi.Autoscaling, autoscaling.GroupName) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/ingress_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/ingress_test.go deleted file mode 100644 index dfec482ea..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/ingress_test.go +++ /dev/null @@ -1,236 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getIngressResourceName() string { - return "ingresses" -} - -func TestListIngress(t *testing.T) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &extensions.IngressList{ - Items: []extensions.Ingress{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.IngressSpec{ - Rules: []extensions.IngressRule{}, - }, - }, - }, - }, - }, - } - receivedIngressList, err := c.Setup(t).Extensions().Ingress(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedIngressList, err) -} - -func TestGetIngress(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.IngressSpec{ - Rules: []extensions.IngressRule{}, - }, - }, - }, - } - receivedIngress, err := c.Setup(t).Extensions().Ingress(ns).Get("foo") - defer c.Close() - c.Validate(t, receivedIngress, err) -} - -func TestGetIngressWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedIngress, err := c.Setup(t).Extensions().Ingress(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedIngress, err) -} - -func TestUpdateIngress(t *testing.T) { - ns := api.NamespaceDefault - requestIngress := &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.IngressSpec{ - Rules: []extensions.IngressRule{}, - }, - }, - }, - } - receivedIngress, err := c.Setup(t).Extensions().Ingress(ns).Update(requestIngress) - defer c.Close() - c.Validate(t, receivedIngress, err) -} - -func TestUpdateIngressStatus(t *testing.T) { - ns := api.NamespaceDefault - lbStatus := api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.1"}, - }, - } - requestIngress := &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Status: extensions.IngressStatus{ - LoadBalancer: lbStatus, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, "foo") + "/status", - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.IngressSpec{ - Rules: []extensions.IngressRule{}, - }, - Status: extensions.IngressStatus{ - LoadBalancer: lbStatus, - }, - }, - }, - } - receivedIngress, err := c.Setup(t).Extensions().Ingress(ns).UpdateStatus(requestIngress) - defer c.Close() - c.Validate(t, receivedIngress, err) -} - -func TestDeleteIngress(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "DELETE", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Extensions().Ingress(ns).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestCreateIngress(t *testing.T) { - ns := api.NamespaceDefault - requestIngress := &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Extensions.ResourcePath(getIngressResourceName(), ns, ""), - Body: requestIngress, - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.IngressSpec{ - Rules: []extensions.IngressRule{}, - }, - }, - }, - } - receivedIngress, err := c.Setup(t).Extensions().Ingress(ns).Create(requestIngress) - defer c.Close() - c.Validate(t, receivedIngress, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/jobs_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/jobs_test.go deleted file mode 100644 index e47d49d51..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/jobs_test.go +++ /dev/null @@ -1,269 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getJobsResourceName() string { - return "jobs" -} - -func getJobClient(t *testing.T, c *simple.Client, ns, resourceGroup string) unversioned.JobInterface { - switch resourceGroup { - case batch.GroupName: - return c.Setup(t).Batch().Jobs(ns) - case extensions.GroupName: - return c.Setup(t).Extensions().Jobs(ns) - default: - t.Fatalf("Unknown group %v", resourceGroup) - } - return nil -} - -func testListJob(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: group.ResourcePath(getJobsResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &batch.JobList{ - Items: []batch.Job{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - }, - }, - ResourceGroup: resourceGroup, - } - receivedJobList, err := getJobClient(t, c, ns, resourceGroup).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedJobList, err) -} - -func TestListJob(t *testing.T) { - testListJob(t, testapi.Extensions, extensions.GroupName) - testListJob(t, testapi.Batch, batch.GroupName) -} - -func testGetJob(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: group.ResourcePath(getJobsResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - ResourceGroup: resourceGroup, - } - receivedJob, err := getJobClient(t, c, ns, resourceGroup).Get("foo") - defer c.Close() - c.Validate(t, receivedJob, err) -} - -func TestGetJob(t *testing.T) { - testGetJob(t, testapi.Extensions, extensions.GroupName) - testGetJob(t, testapi.Batch, batch.GroupName) -} - -func testUpdateJob(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - requestJob := &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: group.ResourcePath(getJobsResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - ResourceGroup: resourceGroup, - } - receivedJob, err := getJobClient(t, c, ns, resourceGroup).Update(requestJob) - defer c.Close() - c.Validate(t, receivedJob, err) -} - -func TestUpdateJob(t *testing.T) { - testUpdateJob(t, testapi.Extensions, extensions.GroupName) - testUpdateJob(t, testapi.Batch, batch.GroupName) -} - -func testUpdateJobStatus(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - requestJob := &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: group.ResourcePath(getJobsResourceName(), ns, "foo") + "/status", - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{}, - }, - Status: batch.JobStatus{ - Active: 1, - }, - }, - }, - ResourceGroup: resourceGroup, - } - receivedJob, err := getJobClient(t, c, ns, resourceGroup).UpdateStatus(requestJob) - defer c.Close() - c.Validate(t, receivedJob, err) -} - -func TestUpdateJobStatus(t *testing.T) { - testUpdateJobStatus(t, testapi.Extensions, extensions.GroupName) - testUpdateJobStatus(t, testapi.Batch, batch.GroupName) -} - -func testDeleteJob(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "DELETE", - Path: group.ResourcePath(getJobsResourceName(), ns, "foo"), - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{StatusCode: 200}, - ResourceGroup: resourceGroup, - } - err := getJobClient(t, c, ns, resourceGroup).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestDeleteJob(t *testing.T) { - testDeleteJob(t, testapi.Extensions, extensions.GroupName) - testDeleteJob(t, testapi.Batch, batch.GroupName) -} - -func testCreateJob(t *testing.T, group testapi.TestGroup, resourceGroup string) { - ns := api.NamespaceDefault - requestJob := &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: group.ResourcePath(getJobsResourceName(), ns, ""), - Body: requestJob, - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: batch.JobSpec{ - Template: api.PodTemplateSpec{}, - }, - }, - }, - ResourceGroup: resourceGroup, - } - receivedJob, err := getJobClient(t, c, ns, resourceGroup).Create(requestJob) - defer c.Close() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - c.Validate(t, receivedJob, err) -} - -func TestCreateJob(t *testing.T) { - testCreateJob(t, testapi.Extensions, extensions.GroupName) - testCreateJob(t, testapi.Batch, batch.GroupName) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges_test.go deleted file mode 100644 index 445310291..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges_test.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getLimitRangesResourceName() string { - return "limitranges" -} - -func TestLimitRangeCreate(t *testing.T) { - ns := api.NamespaceDefault - limitRange := &api.LimitRange{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - }, - Min: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - api.ResourceMemory: resource.MustParse("100"), - }, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getLimitRangesResourceName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: limitRange, - }, - Response: simple.Response{StatusCode: 200, Body: limitRange}, - } - - response, err := c.Setup(t).LimitRanges(ns).Create(limitRange) - defer c.Close() - c.Validate(t, response, err) -} - -func TestLimitRangeGet(t *testing.T) { - ns := api.NamespaceDefault - limitRange := &api.LimitRange{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - }, - Min: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - api.ResourceMemory: resource.MustParse("100"), - }, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getLimitRangesResourceName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: limitRange}, - } - - response, err := c.Setup(t).LimitRanges(ns).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestLimitRangeList(t *testing.T) { - ns := api.NamespaceDefault - - limitRangeList := &api.LimitRangeList{ - Items: []api.LimitRange{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getLimitRangesResourceName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: limitRangeList}, - } - response, err := c.Setup(t).LimitRanges(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestLimitRangeUpdate(t *testing.T) { - ns := api.NamespaceDefault - limitRange := &api.LimitRange{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - Spec: api.LimitRangeSpec{ - Limits: []api.LimitRangeItem{ - { - Type: api.LimitTypePod, - Max: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - }, - Min: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - api.ResourceMemory: resource.MustParse("100"), - }, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getLimitRangesResourceName(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: limitRange}, - } - response, err := c.Setup(t).LimitRanges(ns).Update(limitRange) - defer c.Close() - c.Validate(t, response, err) -} - -func TestLimitRangeDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getLimitRangesResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).LimitRanges(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestLimitRangeWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", getLimitRangesResourceName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).LimitRanges(api.NamespaceAll).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/namespaces_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/namespaces_test.go deleted file mode 100644 index 8e38c935b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/namespaces_test.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func TestNamespaceCreate(t *testing.T) { - // we create a namespace relative to another namespace - namespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath("namespaces", "", ""), - Body: namespace, - }, - Response: simple.Response{StatusCode: 200, Body: namespace}, - } - - // from the source ns, provision a new global namespace "foo" - response, err := c.Setup(t).Namespaces().Create(namespace) - defer c.Close() - - if err != nil { - t.Errorf("%#v should be nil.", err) - } - - if e, a := response.Name, namespace.Name; e != a { - t.Errorf("%#v != %#v.", e, a) - } -} - -func TestNamespaceGet(t *testing.T) { - namespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("namespaces", "", "foo"), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: namespace}, - } - - response, err := c.Setup(t).Namespaces().Get("foo") - defer c.Close() - - if err != nil { - t.Errorf("%#v should be nil.", err) - } - - if e, r := response.Name, namespace.Name; e != r { - t.Errorf("%#v != %#v.", e, r) - } -} - -func TestNamespaceList(t *testing.T) { - namespaceList := &api.NamespaceList{ - Items: []api.Namespace{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("namespaces", "", ""), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: namespaceList}, - } - response, err := c.Setup(t).Namespaces().List(api.ListOptions{}) - defer c.Close() - - if err != nil { - t.Errorf("%#v should be nil.", err) - } - - if len(response.Items) != 1 { - t.Errorf("%#v response.Items should have len 1.", response.Items) - } - - responseNamespace := response.Items[0] - if e, r := responseNamespace.Name, "foo"; e != r { - t.Errorf("%#v != %#v.", e, r) - } -} - -func TestNamespaceUpdate(t *testing.T) { - requestNamespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - ResourceVersion: "1", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{api.FinalizerKubernetes}, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath("namespaces", "", "foo")}, - Response: simple.Response{StatusCode: 200, Body: requestNamespace}, - } - receivedNamespace, err := c.Setup(t).Namespaces().Update(requestNamespace) - defer c.Close() - c.Validate(t, receivedNamespace, err) -} - -func TestNamespaceFinalize(t *testing.T) { - requestNamespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - ResourceVersion: "1", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{api.FinalizerKubernetes}, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath("namespaces", "", "foo") + "/finalize", - }, - Response: simple.Response{StatusCode: 200, Body: requestNamespace}, - } - receivedNamespace, err := c.Setup(t).Namespaces().Finalize(requestNamespace) - defer c.Close() - c.Validate(t, receivedNamespace, err) -} - -func TestNamespaceDelete(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath("namespaces", "", "foo")}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Namespaces().Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestNamespaceWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", "namespaces", "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).Namespaces().Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/nodes_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/nodes_test.go deleted file mode 100644 index d20656d49..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/nodes_test.go +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" - "k8s.io/kubernetes/pkg/labels" -) - -func getNodesResourceName() string { - return "nodes" -} - -func TestListNodes(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", ""), - }, - Response: simple.Response{StatusCode: 200, Body: &api.NodeList{ListMeta: unversioned.ListMeta{ResourceVersion: "1"}}}, - } - response, err := c.Setup(t).Nodes().List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestListNodesLabels(t *testing.T) { - labelSelectorQueryParamName := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", ""), - Query: simple.BuildQueryValues(url.Values{labelSelectorQueryParamName: []string{"foo=bar,name=baz"}})}, - Response: simple.Response{ - StatusCode: 200, - Body: &api.NodeList{ - Items: []api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - }, - }, - }, - }, - } - c.Setup(t) - defer c.Close() - c.QueryValidator[labelSelectorQueryParamName] = simple.ValidateLabels - selector := labels.Set{"foo": "bar", "name": "baz"}.AsSelector() - options := api.ListOptions{LabelSelector: selector} - receivedNodeList, err := c.Nodes().List(options) - c.Validate(t, receivedNodeList, err) -} - -func TestGetNode(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", "1"), - }, - Response: simple.Response{StatusCode: 200, Body: &api.Node{ObjectMeta: api.ObjectMeta{Name: "node-1"}}}, - } - response, err := c.Setup(t).Nodes().Get("1") - defer c.Close() - c.Validate(t, response, err) -} - -func TestGetNodeWithNoName(t *testing.T) { - c := &simple.Client{Error: true} - receivedNode, err := c.Setup(t).Nodes().Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedNode, err) -} - -func TestCreateNode(t *testing.T) { - requestNode := &api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "node-1", - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("1000m"), - api.ResourceMemory: resource.MustParse("1Mi"), - }, - }, - Spec: api.NodeSpec{ - Unschedulable: false, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", ""), - Body: requestNode}, - Response: simple.Response{ - StatusCode: 200, - Body: requestNode, - }, - } - receivedNode, err := c.Setup(t).Nodes().Create(requestNode) - defer c.Close() - c.Validate(t, receivedNode, err) -} - -func TestDeleteNode(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "DELETE", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", "foo"), - }, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Nodes().Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestUpdateNode(t *testing.T) { - requestNode := &api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - ResourceVersion: "1", - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("1000m"), - api.ResourceMemory: resource.MustParse("1Mi"), - }, - }, - Spec: api.NodeSpec{ - Unschedulable: true, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath(getNodesResourceName(), "", "foo"), - }, - Response: simple.Response{StatusCode: 200, Body: requestNode}, - } - response, err := c.Setup(t).Nodes().Update(requestNode) - defer c.Close() - c.Validate(t, response, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolume_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolume_test.go deleted file mode 100644 index 03ebed7e7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolume_test.go +++ /dev/null @@ -1,191 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getPersistentVolumesResoureName() string { - return "persistentvolumes" -} - -func TestPersistentVolumeCreate(t *testing.T) { - pv := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }, - } - - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", ""), - Query: simple.BuildQueryValues(nil), - Body: pv, - }, - Response: simple.Response{StatusCode: 200, Body: pv}, - } - - response, err := c.Setup(t).PersistentVolumes().Create(pv) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeGet(t *testing.T) { - persistentVolume := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: persistentVolume}, - } - - response, err := c.Setup(t).PersistentVolumes().Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeList(t *testing.T) { - persistentVolumeList := &api.PersistentVolumeList{ - Items: []api.PersistentVolume{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: persistentVolumeList}, - } - response, err := c.Setup(t).PersistentVolumes().List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeUpdate(t *testing.T) { - persistentVolume := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: persistentVolume}, - } - response, err := c.Setup(t).PersistentVolumes().Update(persistentVolume) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeStatusUpdate(t *testing.T) { - persistentVolume := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{Path: "/foo"}, - }, - }, - Status: api.PersistentVolumeStatus{ - Phase: api.VolumeBound, - Message: "foo", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", "abc") + "/status", - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: persistentVolume}, - } - response, err := c.Setup(t).PersistentVolumes().UpdateStatus(persistentVolume) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeDelete(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getPersistentVolumesResoureName(), "", "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).PersistentVolumes().Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestPersistentVolumeWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", getPersistentVolumesResoureName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).PersistentVolumes().Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim_test.go deleted file mode 100644 index 901f510df..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim_test.go +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getPersistentVolumeClaimsResoureName() string { - return "persistentvolumeclaims" -} - -func TestPersistentVolumeClaimCreate(t *testing.T) { - ns := api.NamespaceDefault - pv := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }, - } - - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: pv, - }, - Response: simple.Response{StatusCode: 200, Body: pv}, - } - - response, err := c.Setup(t).PersistentVolumeClaims(ns).Create(pv) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeClaimGet(t *testing.T) { - ns := api.NamespaceDefault - persistentVolumeClaim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: persistentVolumeClaim}, - } - - response, err := c.Setup(t).PersistentVolumeClaims(ns).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeClaimList(t *testing.T) { - ns := api.NamespaceDefault - persistentVolumeList := &api.PersistentVolumeClaimList{ - Items: []api.PersistentVolumeClaim{ - { - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "ns"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: persistentVolumeList}, - } - response, err := c.Setup(t).PersistentVolumeClaims(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeClaimUpdate(t *testing.T) { - ns := api.NamespaceDefault - persistentVolumeClaim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: persistentVolumeClaim}, - } - response, err := c.Setup(t).PersistentVolumeClaims(ns).Update(persistentVolumeClaim) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeClaimStatusUpdate(t *testing.T) { - ns := api.NamespaceDefault - persistentVolumeClaim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - }, - }, - Status: api.PersistentVolumeClaimStatus{ - Phase: api.ClaimBound, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, "abc") + "/status", - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: persistentVolumeClaim}, - } - response, err := c.Setup(t).PersistentVolumeClaims(ns).UpdateStatus(persistentVolumeClaim) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPersistentVolumeClaimDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getPersistentVolumeClaimsResoureName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).PersistentVolumeClaims(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestPersistentVolumeClaimWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", getPersistentVolumeClaimsResoureName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).PersistentVolumeClaims(api.NamespaceAll).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pet_sets_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pet_sets_test.go deleted file mode 100644 index 879aa5ce7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pet_sets_test.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getPetSetResourceName() string { - return "petsets" -} - -func TestListPetSets(t *testing.T) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Apps.ResourcePath(getPetSetResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &apps.PetSetList{ - Items: []apps.PetSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: apps.PetSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - }, - }, - } - receivedRSList, err := c.Setup(t).Apps().PetSets(ns).List(api.ListOptions{}) - c.Validate(t, receivedRSList, err) -} - -func TestGetPetSet(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Apps.ResourcePath(getPetSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &apps.PetSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: apps.PetSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Apps().PetSets(ns).Get("foo") - c.Validate(t, receivedRS, err) -} - -func TestGetPetSetWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Apps().PetSets(ns).Get("") - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestUpdatePetSet(t *testing.T) { - ns := api.NamespaceDefault - requestRS := &apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Apps.ResourcePath(getPetSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &apps.PetSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: apps.PetSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Apps().PetSets(ns).Update(requestRS) - c.Validate(t, receivedRS, err) -} - -func TestDeletePetSet(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Apps.ResourcePath(getPetSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Apps().PetSets(ns).Delete("foo", nil) - c.Validate(t, nil, err) -} - -func TestCreatePetSet(t *testing.T) { - ns := api.NamespaceDefault - requestRS := &apps.PetSet{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Apps.ResourcePath(getPetSetResourceName(), ns, ""), Body: requestRS, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &apps.PetSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: apps.PetSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Apps().PetSets(ns).Create(requestRS) - c.Validate(t, receivedRS, err) -} - -// TODO: Test Status actions. diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pod_templates_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pod_templates_test.go deleted file mode 100644 index c72f0a21c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pod_templates_test.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getPodTemplatesResoureName() string { - return "podtemplates" -} - -func TestPodTemplateCreate(t *testing.T) { - ns := api.NamespaceDefault - podTemplate := api.PodTemplate{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - Template: api.PodTemplateSpec{}, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getPodTemplatesResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: &podTemplate, - }, - Response: simple.Response{StatusCode: 200, Body: &podTemplate}, - } - - response, err := c.Setup(t).PodTemplates(ns).Create(&podTemplate) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPodTemplateGet(t *testing.T) { - ns := api.NamespaceDefault - podTemplate := &api.PodTemplate{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - }, - Template: api.PodTemplateSpec{}, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPodTemplatesResoureName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: podTemplate}, - } - - response, err := c.Setup(t).PodTemplates(ns).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestPodTemplateList(t *testing.T) { - ns := api.NamespaceDefault - podTemplateList := &api.PodTemplateList{ - Items: []api.PodTemplate{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getPodTemplatesResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: podTemplateList}, - } - response, err := c.Setup(t).PodTemplates(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPodTemplateUpdate(t *testing.T) { - ns := api.NamespaceDefault - podTemplate := &api.PodTemplate{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: ns, - ResourceVersion: "1", - }, - Template: api.PodTemplateSpec{}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getPodTemplatesResoureName(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: podTemplate}, - } - response, err := c.Setup(t).PodTemplates(ns).Update(podTemplate) - defer c.Close() - c.Validate(t, response, err) -} - -func TestPodTemplateDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getPodTemplatesResoureName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).PodTemplates(ns).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestPodTemplateWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", getPodTemplatesResoureName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).PodTemplates(api.NamespaceAll).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pods_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pods_test.go deleted file mode 100644 index 42a806502..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/pods_test.go +++ /dev/null @@ -1,226 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/http" - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" - "k8s.io/kubernetes/pkg/labels" -) - -func TestListEmptyPods(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath("pods", ns, ""), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: http.StatusOK, Body: &api.PodList{}}, - } - podList, err := c.Setup(t).Pods(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, podList, err) -} - -func TestListPods(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath("pods", ns, ""), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: http.StatusOK, - Body: &api.PodList{ - Items: []api.Pod{ - { - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - }, - }, - }, - }, - } - receivedPodList, err := c.Setup(t).Pods(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedPodList, err) -} - -func TestListPodsLabels(t *testing.T) { - ns := api.NamespaceDefault - labelSelectorQueryParamName := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("pods", ns, ""), - Query: simple.BuildQueryValues(url.Values{labelSelectorQueryParamName: []string{"foo=bar,name=baz"}})}, - Response: simple.Response{ - StatusCode: http.StatusOK, - Body: &api.PodList{ - Items: []api.Pod{ - { - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - }, - }, - }, - }, - } - c.Setup(t) - defer c.Close() - c.QueryValidator[labelSelectorQueryParamName] = simple.ValidateLabels - selector := labels.Set{"foo": "bar", "name": "baz"}.AsSelector() - options := api.ListOptions{LabelSelector: selector} - receivedPodList, err := c.Pods(ns).List(options) - c.Validate(t, receivedPodList, err) -} - -func TestGetPod(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath("pods", ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: http.StatusOK, - Body: &api.Pod{ - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - }, - }, - } - receivedPod, err := c.Setup(t).Pods(ns).Get("foo") - defer c.Close() - c.Validate(t, receivedPod, err) -} - -func TestGetPodWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Pods(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestDeletePod(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath("pods", ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: http.StatusOK}, - } - err := c.Setup(t).Pods(ns).Delete("foo", nil) - defer c.Close() - c.Validate(t, nil, err) -} - -func TestCreatePod(t *testing.T) { - ns := api.NamespaceDefault - requestPod := &api.Pod{ - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Default.ResourcePath("pods", ns, ""), Query: simple.BuildQueryValues(nil), Body: requestPod}, - Response: simple.Response{ - StatusCode: http.StatusOK, - Body: requestPod, - }, - } - receivedPod, err := c.Setup(t).Pods(ns).Create(requestPod) - defer c.Close() - c.Validate(t, receivedPod, err) -} - -func TestUpdatePod(t *testing.T) { - ns := api.NamespaceDefault - requestPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - ResourceVersion: "1", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath("pods", ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: http.StatusOK, Body: requestPod}, - } - receivedPod, err := c.Setup(t).Pods(ns).Update(requestPod) - defer c.Close() - c.Validate(t, receivedPod, err) -} - -func TestPodGetLogs(t *testing.T) { - ns := api.NamespaceDefault - opts := &api.PodLogOptions{ - Follow: true, - Timestamps: true, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("pods", ns, "podName") + "/log", - Query: url.Values{ - "follow": []string{"true"}, - "timestamps": []string{"true"}, - }, - }, - Response: simple.Response{StatusCode: http.StatusOK}, - } - - body, err := c.Setup(t).Pods(ns).GetLogs("podName", opts).Stream() - defer c.Close() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - defer body.Close() - c.ValidateCommon(t, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy_test.go deleted file mode 100644 index d51e2c5a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy_test.go +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "fmt" - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func TestPodSecurityPolicyCreate(t *testing.T) { - ns := api.NamespaceNone - scc := &extensions.PodSecurityPolicy{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - } - - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Extensions.ResourcePath(getPSPResourcename(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: scc, - }, - Response: simple.Response{StatusCode: 200, Body: scc}, - } - - response, err := c.Setup(t).PodSecurityPolicies().Create(scc) - c.Validate(t, response, err) -} - -func TestPodSecurityPolicyGet(t *testing.T) { - ns := api.NamespaceNone - scc := &extensions.PodSecurityPolicy{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getPSPResourcename(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: scc}, - } - - response, err := c.Setup(t).PodSecurityPolicies().Get("abc") - c.Validate(t, response, err) -} - -func TestPodSecurityPolicyList(t *testing.T) { - ns := api.NamespaceNone - sccList := &extensions.PodSecurityPolicyList{ - Items: []extensions.PodSecurityPolicy{ - { - ObjectMeta: api.ObjectMeta{ - Name: "abc", - }, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getPSPResourcename(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: sccList}, - } - response, err := c.Setup(t).PodSecurityPolicies().List(api.ListOptions{}) - c.Validate(t, response, err) -} - -func TestPodSecurityPolicyUpdate(t *testing.T) { - ns := api.NamespaceNone - scc := &extensions.PodSecurityPolicy{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - ResourceVersion: "1", - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getPSPResourcename(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: scc}, - } - response, err := c.Setup(t).PodSecurityPolicies().Update(scc) - c.Validate(t, response, err) -} - -func TestPodSecurityPolicyDelete(t *testing.T) { - ns := api.NamespaceNone - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Extensions.ResourcePath(getPSPResourcename(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).PodSecurityPolicies().Delete("foo") - c.Validate(t, nil, err) -} - -func TestPodSecurityPolicyWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: fmt.Sprintf("%s/watch/%s", testapi.Extensions.ResourcePath("", "", ""), getPSPResourcename()), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).PodSecurityPolicies().Watch(api.ListOptions{}) - c.Validate(t, nil, err) -} - -func getPSPResourcename() string { - return "podsecuritypolicies" -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/doc.go deleted file mode 100644 index 032f180f9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 portforward adds support for SSH-like port forwarding from the client's -// local host to remote containers. -package portforward diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward.go deleted file mode 100644 index a5ce32d34..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward.go +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 portforward - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "strconv" - "strings" - "sync" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/kubelet/server/portforward" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/runtime" -) - -// PortForwarder knows how to listen for local connections and forward them to -// a remote pod via an upgraded HTTP request. -type PortForwarder struct { - ports []ForwardedPort - stopChan <-chan struct{} - - dialer httpstream.Dialer - streamConn httpstream.Connection - listeners []io.Closer - Ready chan struct{} - requestIDLock sync.Mutex - requestID int - out io.Writer - errOut io.Writer -} - -// ForwardedPort contains a Local:Remote port pairing. -type ForwardedPort struct { - Local uint16 - Remote uint16 -} - -/* - valid port specifications: - - 5000 - - forwards from localhost:5000 to pod:5000 - - 8888:5000 - - forwards from localhost:8888 to pod:5000 - - 0:5000 - :5000 - - selects a random available local port, - forwards from localhost: to pod:5000 -*/ -func parsePorts(ports []string) ([]ForwardedPort, error) { - var forwards []ForwardedPort - for _, portString := range ports { - parts := strings.Split(portString, ":") - var localString, remoteString string - if len(parts) == 1 { - localString = parts[0] - remoteString = parts[0] - } else if len(parts) == 2 { - localString = parts[0] - if localString == "" { - // support :5000 - localString = "0" - } - remoteString = parts[1] - } else { - return nil, fmt.Errorf("Invalid port format '%s'", portString) - } - - localPort, err := strconv.ParseUint(localString, 10, 16) - if err != nil { - return nil, fmt.Errorf("Error parsing local port '%s': %s", localString, err) - } - - remotePort, err := strconv.ParseUint(remoteString, 10, 16) - if err != nil { - return nil, fmt.Errorf("Error parsing remote port '%s': %s", remoteString, err) - } - if remotePort == 0 { - return nil, fmt.Errorf("Remote port must be > 0") - } - - forwards = append(forwards, ForwardedPort{uint16(localPort), uint16(remotePort)}) - } - - return forwards, nil -} - -// New creates a new PortForwarder. -func New(dialer httpstream.Dialer, ports []string, stopChan <-chan struct{}, out, errOut io.Writer) (*PortForwarder, error) { - if len(ports) == 0 { - return nil, errors.New("You must specify at least 1 port") - } - parsedPorts, err := parsePorts(ports) - if err != nil { - return nil, err - } - return &PortForwarder{ - dialer: dialer, - ports: parsedPorts, - stopChan: stopChan, - Ready: make(chan struct{}), - out: out, - errOut: errOut, - }, nil -} - -// ForwardPorts formats and executes a port forwarding request. The connection will remain -// open until stopChan is closed. -func (pf *PortForwarder) ForwardPorts() error { - defer pf.Close() - - var err error - pf.streamConn, _, err = pf.dialer.Dial(portforward.PortForwardProtocolV1Name) - if err != nil { - return fmt.Errorf("error upgrading connection: %s", err) - } - defer pf.streamConn.Close() - - return pf.forward() -} - -// forward dials the remote host specific in req, upgrades the request, starts -// listeners for each port specified in ports, and forwards local connections -// to the remote host via streams. -func (pf *PortForwarder) forward() error { - var err error - - listenSuccess := false - for _, port := range pf.ports { - err = pf.listenOnPort(&port) - switch { - case err == nil: - listenSuccess = true - default: - if pf.errOut != nil { - fmt.Fprintf(pf.errOut, "Unable to listen on port %d: %v\n", port.Local, err) - } - } - } - - if !listenSuccess { - return fmt.Errorf("Unable to listen on any of the requested ports: %v", pf.ports) - } - - close(pf.Ready) - - // wait for interrupt or conn closure - select { - case <-pf.stopChan: - case <-pf.streamConn.CloseChan(): - runtime.HandleError(errors.New("lost connection to pod")) - } - - return nil -} - -// listenOnPort delegates tcp4 and tcp6 listener creation and waits for connections on both of these addresses. -// If both listener creation fail, an error is raised. -func (pf *PortForwarder) listenOnPort(port *ForwardedPort) error { - errTcp4 := pf.listenOnPortAndAddress(port, "tcp4", "127.0.0.1") - errTcp6 := pf.listenOnPortAndAddress(port, "tcp6", "[::1]") - if errTcp4 != nil && errTcp6 != nil { - return fmt.Errorf("All listeners failed to create with the following errors: %s, %s", errTcp4, errTcp6) - } - return nil -} - -// listenOnPortAndAddress delegates listener creation and waits for new connections -// in the background f -func (pf *PortForwarder) listenOnPortAndAddress(port *ForwardedPort, protocol string, address string) error { - listener, err := pf.getListener(protocol, address, port) - if err != nil { - return err - } - pf.listeners = append(pf.listeners, listener) - go pf.waitForConnection(listener, *port) - return nil -} - -// getListener creates a listener on the interface targeted by the given hostname on the given port with -// the given protocol. protocol is in net.Listen style which basically admits values like tcp, tcp4, tcp6 -func (pf *PortForwarder) getListener(protocol string, hostname string, port *ForwardedPort) (net.Listener, error) { - listener, err := net.Listen(protocol, fmt.Sprintf("%s:%d", hostname, port.Local)) - if err != nil { - runtime.HandleError(fmt.Errorf("Unable to create listener: Error %s", err)) - return nil, err - } - listenerAddress := listener.Addr().String() - host, localPort, _ := net.SplitHostPort(listenerAddress) - localPortUInt, err := strconv.ParseUint(localPort, 10, 16) - - if err != nil { - return nil, fmt.Errorf("Error parsing local port: %s from %s (%s)", err, listenerAddress, host) - } - port.Local = uint16(localPortUInt) - if pf.out != nil { - fmt.Fprintf(pf.out, "Forwarding from %s:%d -> %d\n", hostname, localPortUInt, port.Remote) - } - - return listener, nil -} - -// waitForConnection waits for new connections to listener and handles them in -// the background. -func (pf *PortForwarder) waitForConnection(listener net.Listener, port ForwardedPort) { - for { - conn, err := listener.Accept() - if err != nil { - // TODO consider using something like https://github.com/hydrogen18/stoppableListener? - if !strings.Contains(strings.ToLower(err.Error()), "use of closed network connection") { - runtime.HandleError(fmt.Errorf("Error accepting connection on port %d: %v", port.Local, err)) - } - return - } - go pf.handleConnection(conn, port) - } -} - -func (pf *PortForwarder) nextRequestID() int { - pf.requestIDLock.Lock() - defer pf.requestIDLock.Unlock() - id := pf.requestID - pf.requestID++ - return id -} - -// handleConnection copies data between the local connection and the stream to -// the remote server. -func (pf *PortForwarder) handleConnection(conn net.Conn, port ForwardedPort) { - defer conn.Close() - - if pf.out != nil { - fmt.Fprintf(pf.out, "Handling connection for %d\n", port.Local) - } - - requestID := pf.nextRequestID() - - // create error stream - headers := http.Header{} - headers.Set(api.StreamType, api.StreamTypeError) - headers.Set(api.PortHeader, fmt.Sprintf("%d", port.Remote)) - headers.Set(api.PortForwardRequestIDHeader, strconv.Itoa(requestID)) - errorStream, err := pf.streamConn.CreateStream(headers) - if err != nil { - runtime.HandleError(fmt.Errorf("error creating error stream for port %d -> %d: %v", port.Local, port.Remote, err)) - return - } - // we're not writing to this stream - errorStream.Close() - - errorChan := make(chan error) - go func() { - message, err := ioutil.ReadAll(errorStream) - switch { - case err != nil: - errorChan <- fmt.Errorf("error reading from error stream for port %d -> %d: %v", port.Local, port.Remote, err) - case len(message) > 0: - errorChan <- fmt.Errorf("an error occurred forwarding %d -> %d: %v", port.Local, port.Remote, string(message)) - } - close(errorChan) - }() - - // create data stream - headers.Set(api.StreamType, api.StreamTypeData) - dataStream, err := pf.streamConn.CreateStream(headers) - if err != nil { - runtime.HandleError(fmt.Errorf("error creating forwarding stream for port %d -> %d: %v", port.Local, port.Remote, err)) - return - } - - localError := make(chan struct{}) - remoteDone := make(chan struct{}) - - go func() { - // Copy from the remote side to the local port. - if _, err := io.Copy(conn, dataStream); err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - runtime.HandleError(fmt.Errorf("error copying from remote stream to local connection: %v", err)) - } - - // inform the select below that the remote copy is done - close(remoteDone) - }() - - go func() { - // inform server we're not sending any more data after copy unblocks - defer dataStream.Close() - - // Copy from the local port to the remote side. - if _, err := io.Copy(dataStream, conn); err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - runtime.HandleError(fmt.Errorf("error copying from local connection to remote stream: %v", err)) - // break out of the select below without waiting for the other copy to finish - close(localError) - } - }() - - // wait for either a local->remote error or for copying from remote->local to finish - select { - case <-remoteDone: - case <-localError: - } - - // always expect something on errorChan (it may be nil) - err = <-errorChan - if err != nil { - runtime.HandleError(err) - } -} - -func (pf *PortForwarder) Close() { - // stop all listeners - for _, l := range pf.listeners { - if err := l.Close(); err != nil { - runtime.HandleError(fmt.Errorf("error closing listener: %v", err)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward_test.go deleted file mode 100644 index 31689eed2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/portforward/portforward_test.go +++ /dev/null @@ -1,394 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 portforward - -import ( - "bytes" - "fmt" - "io" - "net" - "net/http" - "net/http/httptest" - "net/url" - "os" - "reflect" - "strings" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" - kubeletserver "k8s.io/kubernetes/pkg/kubelet/server" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/httpstream" -) - -type fakeDialer struct { - dialed bool - conn httpstream.Connection - err error - negotiatedProtocol string -} - -func (d *fakeDialer) Dial(protocols ...string) (httpstream.Connection, string, error) { - d.dialed = true - return d.conn, d.negotiatedProtocol, d.err -} - -func TestParsePortsAndNew(t *testing.T) { - tests := []struct { - input []string - expected []ForwardedPort - expectParseError bool - expectNewError bool - }{ - {input: []string{}, expectNewError: true}, - {input: []string{"a"}, expectParseError: true, expectNewError: true}, - {input: []string{":a"}, expectParseError: true, expectNewError: true}, - {input: []string{"-1"}, expectParseError: true, expectNewError: true}, - {input: []string{"65536"}, expectParseError: true, expectNewError: true}, - {input: []string{"0"}, expectParseError: true, expectNewError: true}, - {input: []string{"0:0"}, expectParseError: true, expectNewError: true}, - {input: []string{"a:5000"}, expectParseError: true, expectNewError: true}, - {input: []string{"5000:a"}, expectParseError: true, expectNewError: true}, - { - input: []string{"5000", "5000:5000", "8888:5000", "5000:8888", ":5000", "0:5000"}, - expected: []ForwardedPort{ - {5000, 5000}, - {5000, 5000}, - {8888, 5000}, - {5000, 8888}, - {0, 5000}, - {0, 5000}, - }, - }, - } - - for i, test := range tests { - parsed, err := parsePorts(test.input) - haveError := err != nil - if e, a := test.expectParseError, haveError; e != a { - t.Fatalf("%d: parsePorts: error expected=%t, got %t: %s", i, e, a, err) - } - - dialer := &fakeDialer{} - expectedStopChan := make(chan struct{}) - pf, err := New(dialer, test.input, expectedStopChan, os.Stdout, os.Stderr) - haveError = err != nil - if e, a := test.expectNewError, haveError; e != a { - t.Fatalf("%d: New: error expected=%t, got %t: %s", i, e, a, err) - } - - if test.expectParseError || test.expectNewError { - continue - } - - for pi, expectedPort := range test.expected { - if e, a := expectedPort.Local, parsed[pi].Local; e != a { - t.Fatalf("%d: local expected: %d, got: %d", i, e, a) - } - if e, a := expectedPort.Remote, parsed[pi].Remote; e != a { - t.Fatalf("%d: remote expected: %d, got: %d", i, e, a) - } - } - - if dialer.dialed { - t.Fatalf("%d: expected not dialed", i) - } - if e, a := test.expected, pf.ports; !reflect.DeepEqual(e, a) { - t.Fatalf("%d: ports: expected %#v, got %#v", i, e, a) - } - if e, a := expectedStopChan, pf.stopChan; e != a { - t.Fatalf("%d: stopChan: expected %#v, got %#v", i, e, a) - } - if pf.Ready == nil { - t.Fatalf("%d: Ready should be non-nil", i) - } - } -} - -type GetListenerTestCase struct { - Hostname string - Protocol string - ShouldRaiseError bool - ExpectedListenerAddress string -} - -func TestGetListener(t *testing.T) { - var pf PortForwarder - testCases := []GetListenerTestCase{ - { - Hostname: "localhost", - Protocol: "tcp4", - ShouldRaiseError: false, - ExpectedListenerAddress: "127.0.0.1", - }, - { - Hostname: "127.0.0.1", - Protocol: "tcp4", - ShouldRaiseError: false, - ExpectedListenerAddress: "127.0.0.1", - }, - { - Hostname: "[::1]", - Protocol: "tcp6", - ShouldRaiseError: false, - ExpectedListenerAddress: "::1", - }, - { - Hostname: "[::1]", - Protocol: "tcp4", - ShouldRaiseError: true, - }, - { - Hostname: "127.0.0.1", - Protocol: "tcp6", - ShouldRaiseError: true, - }, - { - // IPv6 address must be put into brackets. This test reveals this. - Hostname: "::1", - Protocol: "tcp6", - ShouldRaiseError: true, - }, - } - - for i, testCase := range testCases { - expectedListenerPort := "12345" - listener, err := pf.getListener(testCase.Protocol, testCase.Hostname, &ForwardedPort{12345, 12345}) - if err != nil && strings.Contains(err.Error(), "cannot assign requested address") { - t.Logf("Can't test #%d: %v", i, err) - continue - } - errorRaised := err != nil - - if testCase.ShouldRaiseError != errorRaised { - t.Errorf("Test case #%d failed: Data %v an error has been raised(%t) where it should not (or reciprocally): %v", i, testCase, testCase.ShouldRaiseError, err) - continue - } - if errorRaised { - continue - } - - if listener == nil { - t.Errorf("Test case #%d did not raise an error but failed in initializing listener", i) - continue - } - - host, port, _ := net.SplitHostPort(listener.Addr().String()) - t.Logf("Asked a %s forward for: %s:%v, got listener %s:%s, expected: %s", testCase.Protocol, testCase.Hostname, 12345, host, port, expectedListenerPort) - if host != testCase.ExpectedListenerAddress { - t.Errorf("Test case #%d failed: Listener does not listen on exepected address: asked %v got %v", i, testCase.ExpectedListenerAddress, host) - } - if port != expectedListenerPort { - t.Errorf("Test case #%d failed: Listener does not listen on exepected port: asked %v got %v", i, expectedListenerPort, port) - - } - listener.Close() - - } -} - -// fakePortForwarder simulates port forwarding for testing. It implements -// kubeletserver.PortForwarder. -type fakePortForwarder struct { - lock sync.Mutex - // stores data expected from the stream per port - expected map[uint16]string - // stores data received from the stream per port - received map[uint16]string - // data to be sent to the stream per port - send map[uint16]string -} - -var _ kubeletserver.PortForwarder = &fakePortForwarder{} - -func (pf *fakePortForwarder) PortForward(name string, uid types.UID, port uint16, stream io.ReadWriteCloser) error { - defer stream.Close() - - // read from the client - received := make([]byte, len(pf.expected[port])) - n, err := stream.Read(received) - if err != nil { - return fmt.Errorf("error reading from client for port %d: %v", port, err) - } - if n != len(pf.expected[port]) { - return fmt.Errorf("unexpected length read from client for port %d: got %d, expected %d. data=%q", port, n, len(pf.expected[port]), string(received)) - } - - // store the received content - pf.lock.Lock() - pf.received[port] = string(received) - pf.lock.Unlock() - - // send the hardcoded data to the client - io.Copy(stream, strings.NewReader(pf.send[port])) - - return nil -} - -// fakePortForwardServer creates an HTTP server that can handle port forwarding -// requests. -func fakePortForwardServer(t *testing.T, testName string, serverSends, expectedFromClient map[uint16]string) http.HandlerFunc { - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - pf := &fakePortForwarder{ - expected: expectedFromClient, - received: make(map[uint16]string), - send: serverSends, - } - kubeletserver.ServePortForward(w, req, pf, "pod", "uid", 0, 10*time.Second) - - for port, expected := range expectedFromClient { - actual, ok := pf.received[port] - if !ok { - t.Errorf("%s: server didn't receive any data for port %d", testName, port) - continue - } - - if expected != actual { - t.Errorf("%s: server expected to receive %q, got %q for port %d", testName, expected, actual, port) - } - } - - for port, actual := range pf.received { - if _, ok := expectedFromClient[port]; !ok { - t.Errorf("%s: server unexpectedly received %q for port %d", testName, actual, port) - } - } - }) -} - -func TestForwardPorts(t *testing.T) { - tests := map[string]struct { - ports []string - clientSends map[uint16]string - serverSends map[uint16]string - }{ - "forward 1 port with no data either direction": { - ports: []string{"5000"}, - }, - "forward 2 ports with bidirectional data": { - ports: []string{"5001", "6000"}, - clientSends: map[uint16]string{ - 5001: "abcd", - 6000: "ghij", - }, - serverSends: map[uint16]string{ - 5001: "1234", - 6000: "5678", - }, - }, - } - - for testName, test := range tests { - server := httptest.NewServer(fakePortForwardServer(t, testName, test.serverSends, test.clientSends)) - - url, _ := url.Parse(server.URL) - exec, err := remotecommand.NewExecutor(&restclient.Config{}, "POST", url) - if err != nil { - t.Fatal(err) - } - - stopChan := make(chan struct{}, 1) - - pf, err := New(exec, test.ports, stopChan, os.Stdout, os.Stderr) - if err != nil { - t.Fatalf("%s: unexpected error calling New: %v", testName, err) - } - - doneChan := make(chan error) - go func() { - doneChan <- pf.ForwardPorts() - }() - <-pf.Ready - - for port, data := range test.clientSends { - clientConn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port)) - if err != nil { - t.Errorf("%s: error dialing %d: %s", testName, port, err) - server.Close() - continue - } - defer clientConn.Close() - - n, err := clientConn.Write([]byte(data)) - if err != nil && err != io.EOF { - t.Errorf("%s: Error sending data '%s': %s", testName, data, err) - server.Close() - continue - } - if n == 0 { - t.Errorf("%s: unexpected write of 0 bytes", testName) - server.Close() - continue - } - b := make([]byte, 4) - n, err = clientConn.Read(b) - if err != nil && err != io.EOF { - t.Errorf("%s: Error reading data: %s", testName, err) - server.Close() - continue - } - if !bytes.Equal([]byte(test.serverSends[port]), b) { - t.Errorf("%s: expected to read '%s', got '%s'", testName, test.serverSends[port], b) - server.Close() - continue - } - } - // tell r.ForwardPorts to stop - close(stopChan) - - // wait for r.ForwardPorts to actually return - err = <-doneChan - if err != nil { - t.Errorf("%s: unexpected error: %s", testName, err) - } - server.Close() - } - -} - -func TestForwardPortsReturnsErrorWhenAllBindsFailed(t *testing.T) { - server := httptest.NewServer(fakePortForwardServer(t, "allBindsFailed", nil, nil)) - defer server.Close() - - url, _ := url.Parse(server.URL) - exec, err := remotecommand.NewExecutor(&restclient.Config{}, "POST", url) - if err != nil { - t.Fatal(err) - } - - stopChan1 := make(chan struct{}, 1) - defer close(stopChan1) - - pf1, err := New(exec, []string{"5555"}, stopChan1, os.Stdout, os.Stderr) - if err != nil { - t.Fatalf("error creating pf1: %v", err) - } - go pf1.ForwardPorts() - <-pf1.Ready - - stopChan2 := make(chan struct{}, 1) - pf2, err := New(exec, []string{"5555"}, stopChan2, os.Stdout, os.Stderr) - if err != nil { - t.Fatalf("error creating pf2: %v", err) - } - if err := pf2.ForwardPorts(); err == nil { - t.Fatal("expected non-nil error for pf2.ForwardPorts") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/doc.go deleted file mode 100644 index 88197ed0d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 remotecommand adds support for executing commands in containers, -// with support for separate stdin, stdout, and stderr streams, as well as -// TTY. -package remotecommand diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand.go deleted file mode 100644 index 7144f3093..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 remotecommand - -import ( - "fmt" - "io" - "net/http" - "net/url" - - "github.com/golang/glog" - - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/transport" - "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/httpstream/spdy" -) - -// Executor is an interface for transporting shell-style streams. -type Executor interface { - // Stream initiates the transport of the standard shell streams. It will transport any - // non-nil stream to a remote system, and return an error if a problem occurs. If tty - // is set, the stderr stream is not used (raw TTY manages stdout and stderr over the - // stdout stream). - Stream(supportedProtocols []string, stdin io.Reader, stdout, stderr io.Writer, tty bool) error -} - -// StreamExecutor supports the ability to dial an httpstream connection and the ability to -// run a command line stream protocol over that dialer. -type StreamExecutor interface { - Executor - httpstream.Dialer -} - -// streamExecutor handles transporting standard shell streams over an httpstream connection. -type streamExecutor struct { - upgrader httpstream.UpgradeRoundTripper - transport http.RoundTripper - - method string - url *url.URL -} - -// NewExecutor connects to the provided server and upgrades the connection to -// multiplexed bidirectional streams. The current implementation uses SPDY, -// but this could be replaced with HTTP/2 once it's available, or something else. -// TODO: the common code between this and portforward could be abstracted. -func NewExecutor(config *restclient.Config, method string, url *url.URL) (StreamExecutor, error) { - tlsConfig, err := restclient.TLSConfigFor(config) - if err != nil { - return nil, err - } - - upgradeRoundTripper := spdy.NewRoundTripper(tlsConfig) - wrapper, err := restclient.HTTPWrappersForConfig(config, upgradeRoundTripper) - if err != nil { - return nil, err - } - - return &streamExecutor{ - upgrader: upgradeRoundTripper, - transport: wrapper, - method: method, - url: url, - }, nil -} - -// NewStreamExecutor upgrades the request so that it supports multiplexed bidirectional -// streams. This method takes a stream upgrader and an optional function that is invoked -// to wrap the round tripper. This method may be used by clients that are lower level than -// Kubernetes clients or need to provide their own upgrade round tripper. -func NewStreamExecutor(upgrader httpstream.UpgradeRoundTripper, fn func(http.RoundTripper) http.RoundTripper, method string, url *url.URL) (StreamExecutor, error) { - var rt http.RoundTripper = upgrader - if fn != nil { - rt = fn(rt) - } - return &streamExecutor{ - upgrader: upgrader, - transport: rt, - method: method, - url: url, - }, nil -} - -// Dial opens a connection to a remote server and attempts to negotiate a SPDY -// connection. Upon success, it returns the connection and the protocol -// selected by the server. -func (e *streamExecutor) Dial(protocols ...string) (httpstream.Connection, string, error) { - rt := transport.DebugWrappers(e.transport) - - // TODO the client probably shouldn't be created here, as it doesn't allow - // flexibility to allow callers to configure it. - client := &http.Client{Transport: rt} - - req, err := http.NewRequest(e.method, e.url.String(), nil) - if err != nil { - return nil, "", fmt.Errorf("error creating request: %v", err) - } - for i := range protocols { - req.Header.Add(httpstream.HeaderProtocolVersion, protocols[i]) - } - - resp, err := client.Do(req) - if err != nil { - return nil, "", fmt.Errorf("error sending request: %v", err) - } - defer resp.Body.Close() - - conn, err := e.upgrader.NewConnection(resp) - if err != nil { - return nil, "", err - } - - return conn, resp.Header.Get(httpstream.HeaderProtocolVersion), nil -} - -type streamProtocolHandler interface { - stream(httpstream.Connection) error -} - -// Stream opens a protocol streamer to the server and streams until a client closes -// the connection or the server disconnects. -func (e *streamExecutor) Stream(supportedProtocols []string, stdin io.Reader, stdout, stderr io.Writer, tty bool) error { - conn, protocol, err := e.Dial(supportedProtocols...) - if err != nil { - return err - } - defer conn.Close() - - var streamer streamProtocolHandler - - switch protocol { - case remotecommand.StreamProtocolV2Name: - streamer = &streamProtocolV2{ - stdin: stdin, - stdout: stdout, - stderr: stderr, - tty: tty, - } - case "": - glog.V(4).Infof("The server did not negotiate a streaming protocol version. Falling back to %s", remotecommand.StreamProtocolV1Name) - fallthrough - case remotecommand.StreamProtocolV1Name: - streamer = &streamProtocolV1{ - stdin: stdin, - stdout: stdout, - stderr: stderr, - tty: tty, - } - } - - return streamer.stream(conn) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand_test.go deleted file mode 100644 index f231a7f49..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/remotecommand_test.go +++ /dev/null @@ -1,357 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 remotecommand - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/httpstream" -) - -type fakeExecutor struct { - t *testing.T - testName string - errorData string - stdoutData string - stderrData string - expectStdin bool - stdinReceived bytes.Buffer - tty bool - messageCount int - command []string - exec bool -} - -func (ex *fakeExecutor) ExecInContainer(name string, uid types.UID, container string, cmd []string, in io.Reader, out, err io.WriteCloser, tty bool) error { - return ex.run(name, uid, container, cmd, in, out, err, tty) -} - -func (ex *fakeExecutor) AttachContainer(name string, uid types.UID, container string, in io.Reader, out, err io.WriteCloser, tty bool) error { - return ex.run(name, uid, container, nil, in, out, err, tty) -} - -func (ex *fakeExecutor) run(name string, uid types.UID, container string, cmd []string, in io.Reader, out, err io.WriteCloser, tty bool) error { - ex.command = cmd - ex.tty = tty - - if e, a := "pod", name; e != a { - ex.t.Errorf("%s: pod: expected %q, got %q", ex.testName, e, a) - } - if e, a := "uid", uid; e != string(a) { - ex.t.Errorf("%s: uid: expected %q, got %q", ex.testName, e, a) - } - if ex.exec { - if e, a := "ls /", strings.Join(ex.command, " "); e != a { - ex.t.Errorf("%s: command: expected %q, got %q", ex.testName, e, a) - } - } else { - if len(ex.command) > 0 { - ex.t.Errorf("%s: command: expected nothing, got %v", ex.testName, ex.command) - } - } - - if len(ex.errorData) > 0 { - return errors.New(ex.errorData) - } - - if len(ex.stdoutData) > 0 { - for i := 0; i < ex.messageCount; i++ { - fmt.Fprint(out, ex.stdoutData) - } - } - - if len(ex.stderrData) > 0 { - for i := 0; i < ex.messageCount; i++ { - fmt.Fprint(err, ex.stderrData) - } - } - - if ex.expectStdin { - io.Copy(&ex.stdinReceived, in) - } - - return nil -} - -func fakeServer(t *testing.T, testName string, exec bool, stdinData, stdoutData, stderrData, errorData string, tty bool, messageCount int, serverProtocols []string) http.HandlerFunc { - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - executor := &fakeExecutor{ - t: t, - testName: testName, - errorData: errorData, - stdoutData: stdoutData, - stderrData: stderrData, - expectStdin: len(stdinData) > 0, - tty: tty, - messageCount: messageCount, - exec: exec, - } - - if exec { - remotecommand.ServeExec(w, req, executor, "pod", "uid", "container", 0, 10*time.Second, serverProtocols) - } else { - remotecommand.ServeAttach(w, req, executor, "pod", "uid", "container", 0, 10*time.Second, serverProtocols) - } - - if e, a := strings.Repeat(stdinData, messageCount), executor.stdinReceived.String(); e != a { - t.Errorf("%s: stdin: expected %q, got %q", testName, e, a) - } - }) -} - -func TestStream(t *testing.T) { - testCases := []struct { - TestName string - Stdin string - Stdout string - Stderr string - Error string - Tty bool - MessageCount int - ClientProtocols []string - ServerProtocols []string - }{ - { - TestName: "error", - Error: "bail", - Stdout: "a", - ClientProtocols: []string{remotecommand.StreamProtocolV2Name}, - ServerProtocols: []string{remotecommand.StreamProtocolV2Name}, - }, - { - TestName: "in/out/err", - Stdin: "a", - Stdout: "b", - Stderr: "c", - MessageCount: 100, - ClientProtocols: []string{remotecommand.StreamProtocolV2Name}, - ServerProtocols: []string{remotecommand.StreamProtocolV2Name}, - }, - { - TestName: "in/out/tty", - Stdin: "a", - Stdout: "b", - Tty: true, - MessageCount: 100, - ClientProtocols: []string{remotecommand.StreamProtocolV2Name}, - ServerProtocols: []string{remotecommand.StreamProtocolV2Name}, - }, - { - // 1.0 kubectl, 1.0 kubelet - TestName: "unversioned client, unversioned server", - Stdout: "b", - Stderr: "c", - MessageCount: 1, - ClientProtocols: []string{}, - ServerProtocols: []string{}, - }, - { - // 1.0 kubectl, 1.1+ kubelet - TestName: "unversioned client, versioned server", - Stdout: "b", - Stderr: "c", - MessageCount: 1, - ClientProtocols: []string{}, - ServerProtocols: []string{remotecommand.StreamProtocolV2Name, remotecommand.StreamProtocolV1Name}, - }, - { - // 1.1+ kubectl, 1.0 kubelet - TestName: "versioned client, unversioned server", - Stdout: "b", - Stderr: "c", - MessageCount: 1, - ClientProtocols: []string{remotecommand.StreamProtocolV2Name, remotecommand.StreamProtocolV1Name}, - ServerProtocols: []string{}, - }, - } - - for _, testCase := range testCases { - for _, exec := range []bool{true, false} { - var name string - if exec { - name = testCase.TestName + " (exec)" - } else { - name = testCase.TestName + " (attach)" - } - var ( - streamIn io.Reader - streamOut, streamErr io.Writer - ) - localOut := &bytes.Buffer{} - localErr := &bytes.Buffer{} - - server := httptest.NewServer(fakeServer(t, name, exec, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, testCase.MessageCount, testCase.ServerProtocols)) - - url, _ := url.ParseRequestURI(server.URL) - config := restclient.ContentConfig{ - GroupVersion: &unversioned.GroupVersion{Group: "x"}, - NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), - } - c, err := restclient.NewRESTClient(url, "", config, -1, -1, nil, nil) - if err != nil { - t.Fatalf("failed to create a client: %v", err) - } - req := c.Post().Resource("testing") - - if exec { - req.Param("command", "ls") - req.Param("command", "/") - } - - if len(testCase.Stdin) > 0 { - req.Param(api.ExecStdinParam, "1") - streamIn = strings.NewReader(strings.Repeat(testCase.Stdin, testCase.MessageCount)) - } - - if len(testCase.Stdout) > 0 { - req.Param(api.ExecStdoutParam, "1") - streamOut = localOut - } - - if testCase.Tty { - req.Param(api.ExecTTYParam, "1") - } else if len(testCase.Stderr) > 0 { - req.Param(api.ExecStderrParam, "1") - streamErr = localErr - } - - conf := &restclient.Config{ - Host: server.URL, - } - e, err := NewExecutor(conf, "POST", req.URL()) - if err != nil { - t.Errorf("%s: unexpected error: %v", name, err) - continue - } - err = e.Stream(testCase.ClientProtocols, streamIn, streamOut, streamErr, testCase.Tty) - hasErr := err != nil - - if len(testCase.Error) > 0 { - if !hasErr { - t.Errorf("%s: expected an error", name) - } else { - if e, a := testCase.Error, err.Error(); !strings.Contains(a, e) { - t.Errorf("%s: expected error stream read %q, got %q", name, e, a) - } - } - - server.Close() - continue - } - - if hasErr { - t.Errorf("%s: unexpected error: %v", name, err) - server.Close() - continue - } - - if len(testCase.Stdout) > 0 { - if e, a := strings.Repeat(testCase.Stdout, testCase.MessageCount), localOut; e != a.String() { - t.Errorf("%s: expected stdout data '%s', got '%s'", name, e, a) - } - } - - if testCase.Stderr != "" { - if e, a := strings.Repeat(testCase.Stderr, testCase.MessageCount), localErr; e != a.String() { - t.Errorf("%s: expected stderr data '%s', got '%s'", name, e, a) - } - } - - server.Close() - } - } -} - -type fakeUpgrader struct { - req *http.Request - resp *http.Response - conn httpstream.Connection - err, connErr error - checkResponse bool - - t *testing.T -} - -func (u *fakeUpgrader) RoundTrip(req *http.Request) (*http.Response, error) { - u.req = req - return u.resp, u.err -} - -func (u *fakeUpgrader) NewConnection(resp *http.Response) (httpstream.Connection, error) { - if u.checkResponse && u.resp != resp { - u.t.Errorf("response objects passed did not match: %#v", resp) - } - return u.conn, u.connErr -} - -type fakeConnection struct { - httpstream.Connection -} - -// Dial is the common functionality between any stream based upgrader, regardless of protocol. -// This method ensures that someone can use a generic stream executor without being dependent -// on the core Kube client config behavior. -func TestDial(t *testing.T) { - upgrader := &fakeUpgrader{ - t: t, - checkResponse: true, - conn: &fakeConnection{}, - resp: &http.Response{ - StatusCode: http.StatusSwitchingProtocols, - Body: ioutil.NopCloser(&bytes.Buffer{}), - }, - } - var called bool - testFn := func(rt http.RoundTripper) http.RoundTripper { - if rt != upgrader { - t.Fatalf("unexpected round tripper: %#v", rt) - } - called = true - return rt - } - exec, err := NewStreamExecutor(upgrader, testFn, "POST", &url.URL{Host: "something.com", Scheme: "https"}) - if err != nil { - t.Fatal(err) - } - conn, protocol, err := exec.Dial("protocol1") - if err != nil { - t.Fatal(err) - } - if conn != upgrader.conn { - t.Errorf("unexpected connection: %#v", conn) - } - if !called { - t.Errorf("wrapper not called") - } - _ = protocol -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v1.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v1.go deleted file mode 100644 index f5428e0f9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v1.go +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 remotecommand - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/util/httpstream" -) - -// streamProtocolV1 implements the first version of the streaming exec & attach -// protocol. This version has some bugs, such as not being able to detecte when -// non-interactive stdin data has ended. See http://issues.k8s.io/13394 and -// http://issues.k8s.io/13395 for more details. -type streamProtocolV1 struct { - stdin io.Reader - stdout io.Writer - stderr io.Writer - tty bool -} - -var _ streamProtocolHandler = &streamProtocolV1{} - -func (e *streamProtocolV1) stream(conn httpstream.Connection) error { - doneChan := make(chan struct{}, 2) - errorChan := make(chan error) - - cp := func(s string, dst io.Writer, src io.Reader) { - glog.V(6).Infof("Copying %s", s) - defer glog.V(6).Infof("Done copying %s", s) - if _, err := io.Copy(dst, src); err != nil && err != io.EOF { - glog.Errorf("Error copying %s: %v", s, err) - } - if s == api.StreamTypeStdout || s == api.StreamTypeStderr { - doneChan <- struct{}{} - } - } - - var ( - err error - errorStream, remoteStdin, remoteStdout, remoteStderr httpstream.Stream - ) - - // set up all the streams first - headers := http.Header{} - headers.Set(api.StreamType, api.StreamTypeError) - errorStream, err = conn.CreateStream(headers) - if err != nil { - return err - } - defer errorStream.Reset() - - // Create all the streams first, then start the copy goroutines. The server doesn't start its copy - // goroutines until it's received all of the streams. If the client creates the stdin stream and - // immediately begins copying stdin data to the server, it's possible to overwhelm and wedge the - // spdy frame handler in the server so that it is full of unprocessed frames. The frames aren't - // getting processed because the server hasn't started its copying, and it won't do that until it - // gets all the streams. By creating all the streams first, we ensure that the server is ready to - // process data before the client starts sending any. See https://issues.k8s.io/16373 for more info. - if e.stdin != nil { - headers.Set(api.StreamType, api.StreamTypeStdin) - remoteStdin, err = conn.CreateStream(headers) - if err != nil { - return err - } - defer remoteStdin.Reset() - } - - if e.stdout != nil { - headers.Set(api.StreamType, api.StreamTypeStdout) - remoteStdout, err = conn.CreateStream(headers) - if err != nil { - return err - } - defer remoteStdout.Reset() - } - - if e.stderr != nil && !e.tty { - headers.Set(api.StreamType, api.StreamTypeStderr) - remoteStderr, err = conn.CreateStream(headers) - if err != nil { - return err - } - defer remoteStderr.Reset() - } - - // now that all the streams have been created, proceed with reading & copying - - // always read from errorStream - go func() { - message, err := ioutil.ReadAll(errorStream) - if err != nil && err != io.EOF { - errorChan <- fmt.Errorf("Error reading from error stream: %s", err) - return - } - if len(message) > 0 { - errorChan <- fmt.Errorf("Error executing remote command: %s", message) - return - } - }() - - if e.stdin != nil { - // TODO this goroutine will never exit cleanly (the io.Copy never unblocks) - // because stdin is not closed until the process exits. If we try to call - // stdin.Close(), it returns no error but doesn't unblock the copy. It will - // exit when the process exits, instead. - go cp(api.StreamTypeStdin, remoteStdin, e.stdin) - } - - waitCount := 0 - completedStreams := 0 - - if e.stdout != nil { - waitCount++ - go cp(api.StreamTypeStdout, e.stdout, remoteStdout) - } - - if e.stderr != nil && !e.tty { - waitCount++ - go cp(api.StreamTypeStderr, e.stderr, remoteStderr) - } - -Loop: - for { - select { - case <-doneChan: - completedStreams++ - if completedStreams == waitCount { - break Loop - } - case err := <-errorChan: - return err - } - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v2.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v2.go deleted file mode 100644 index 67e8637cf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/remotecommand/v2.go +++ /dev/null @@ -1,166 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 remotecommand - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - "sync" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/runtime" -) - -// streamProtocolV2 implements version 2 of the streaming protocol for attach -// and exec. The original streaming protocol was unversioned. As a result, this -// version is referred to as version 2, even though it is the first actual -// numbered version. -type streamProtocolV2 struct { - stdin io.Reader - stdout io.Writer - stderr io.Writer - tty bool -} - -var _ streamProtocolHandler = &streamProtocolV2{} - -func (e *streamProtocolV2) stream(conn httpstream.Connection) error { - var ( - err error - errorStream, remoteStdin, remoteStdout, remoteStderr httpstream.Stream - ) - - headers := http.Header{} - - // set up all the streams first - // set up error stream - errorChan := make(chan error) - headers.Set(api.StreamType, api.StreamTypeError) - errorStream, err = conn.CreateStream(headers) - if err != nil { - return err - } - - // set up stdin stream - if e.stdin != nil { - headers.Set(api.StreamType, api.StreamTypeStdin) - remoteStdin, err = conn.CreateStream(headers) - if err != nil { - return err - } - } - - // set up stdout stream - if e.stdout != nil { - headers.Set(api.StreamType, api.StreamTypeStdout) - remoteStdout, err = conn.CreateStream(headers) - if err != nil { - return err - } - } - - // set up stderr stream - if e.stderr != nil && !e.tty { - headers.Set(api.StreamType, api.StreamTypeStderr) - remoteStderr, err = conn.CreateStream(headers) - if err != nil { - return err - } - } - - // now that all the streams have been created, proceed with reading & copying - - // always read from errorStream - go func() { - message, err := ioutil.ReadAll(errorStream) - switch { - case err != nil && err != io.EOF: - errorChan <- fmt.Errorf("error reading from error stream: %s", err) - case len(message) > 0: - errorChan <- fmt.Errorf("error executing remote command: %s", message) - default: - errorChan <- nil - } - close(errorChan) - }() - - var wg sync.WaitGroup - var once sync.Once - - if e.stdin != nil { - // copy from client's stdin to container's stdin - go func() { - // if e.stdin is noninteractive, e.g. `echo abc | kubectl exec -i -- cat`, make sure - // we close remoteStdin as soon as the copy from e.stdin to remoteStdin finishes. Otherwise - // the executed command will remain running. - defer once.Do(func() { remoteStdin.Close() }) - - if _, err := io.Copy(remoteStdin, e.stdin); err != nil { - runtime.HandleError(err) - } - }() - - // read from remoteStdin until the stream is closed. this is essential to - // be able to exit interactive sessions cleanly and not leak goroutines or - // hang the client's terminal. - // - // go-dockerclient's current hijack implementation - // (https://github.com/fsouza/go-dockerclient/blob/89f3d56d93788dfe85f864a44f85d9738fca0670/client.go#L564) - // waits for all three streams (stdin/stdout/stderr) to finish copying - // before returning. When hijack finishes copying stdout/stderr, it calls - // Close() on its side of remoteStdin, which allows this copy to complete. - // When that happens, we must Close() on our side of remoteStdin, to - // allow the copy in hijack to complete, and hijack to return. - go func() { - defer once.Do(func() { remoteStdin.Close() }) - // this "copy" doesn't actually read anything - it's just here to wait for - // the server to close remoteStdin. - if _, err := io.Copy(ioutil.Discard, remoteStdin); err != nil { - runtime.HandleError(err) - } - }() - } - - if e.stdout != nil { - wg.Add(1) - go func() { - defer wg.Done() - if _, err := io.Copy(e.stdout, remoteStdout); err != nil { - runtime.HandleError(err) - } - }() - } - - if e.stderr != nil && !e.tty { - wg.Add(1) - go func() { - defer wg.Done() - if _, err := io.Copy(e.stderr, remoteStderr); err != nil { - runtime.HandleError(err) - } - }() - } - - // we're waiting for stdout/stderr to finish copying - wg.Wait() - - // waits for errorStream to finish reading with an error or nil - return <-errorChan -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replica_sets_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replica_sets_test.go deleted file mode 100644 index 2a0e8142c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replica_sets_test.go +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getReplicaSetResourceName() string { - return "replicasets" -} - -func TestListReplicaSets(t *testing.T) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &extensions.ReplicaSetList{ - Items: []extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - }, - }, - } - receivedRSList, err := c.Setup(t).Extensions().ReplicaSets(ns).List(api.ListOptions{}) - c.Validate(t, receivedRSList, err) -} - -func TestGetReplicaSet(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Extensions().ReplicaSets(ns).Get("foo") - c.Validate(t, receivedRS, err) -} - -func TestGetReplicaSetWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Extensions().ReplicaSets(ns).Get("") - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestUpdateReplicaSet(t *testing.T) { - ns := api.NamespaceDefault - requestRS := &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Extensions().ReplicaSets(ns).Update(requestRS) - c.Validate(t, receivedRS, err) -} - -func TestUpdateStatusReplicaSet(t *testing.T) { - ns := api.NamespaceDefault - requestRS := &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, "foo") + "/status", Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - Status: extensions.ReplicaSetStatus{ - Replicas: 2, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Extensions().ReplicaSets(ns).UpdateStatus(requestRS) - c.Validate(t, receivedRS, err) -} -func TestDeleteReplicaSet(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Extensions().ReplicaSets(ns).Delete("foo", nil) - c.Validate(t, nil, err) -} - -func TestCreateReplicaSet(t *testing.T) { - ns := api.NamespaceDefault - requestRS := &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Extensions.ResourcePath(getReplicaSetResourceName(), ns, ""), Body: requestRS, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 2, - Template: api.PodTemplateSpec{}, - }, - }, - }, - } - receivedRS, err := c.Setup(t).Extensions().ReplicaSets(ns).Create(requestRS) - c.Validate(t, receivedRS, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers_test.go deleted file mode 100644 index de0458ce4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers_test.go +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getRCResourceName() string { - return "replicationcontrollers" -} - -func TestListControllers(t *testing.T) { - ns := api.NamespaceAll - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getRCResourceName(), ns, ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{}, - }, - }, - }, - }, - }, - } - receivedControllerList, err := c.Setup(t).ReplicationControllers(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedControllerList, err) - -} - -func TestGetController(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Default.ResourcePath(getRCResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{}, - }, - }, - }, - } - receivedController, err := c.Setup(t).ReplicationControllers(ns).Get("foo") - defer c.Close() - c.Validate(t, receivedController, err) -} - -func TestGetControllerWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).ReplicationControllers(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestUpdateController(t *testing.T) { - ns := api.NamespaceDefault - requestController := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getRCResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{}, - }, - }, - }, - } - receivedController, err := c.Setup(t).ReplicationControllers(ns).Update(requestController) - defer c.Close() - c.Validate(t, receivedController, err) -} - -func TestUpdateStatusController(t *testing.T) { - ns := api.NamespaceDefault - requestController := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getRCResourceName(), ns, "foo") + "/status", Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{}, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 2, - }, - }, - }, - } - receivedController, err := c.Setup(t).ReplicationControllers(ns).UpdateStatus(requestController) - defer c.Close() - c.Validate(t, receivedController, err) -} -func TestDeleteController(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getRCResourceName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).ReplicationControllers(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestCreateController(t *testing.T) { - ns := api.NamespaceDefault - requestController := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Default.ResourcePath(getRCResourceName(), ns, ""), Body: requestController, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{}, - }, - }, - }, - } - receivedController, err := c.Setup(t).ReplicationControllers(ns).Create(requestController) - defer c.Close() - c.Validate(t, receivedController, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas_test.go deleted file mode 100644 index 73dba8dfb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas_test.go +++ /dev/null @@ -1,204 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getResourceQuotasResoureName() string { - return "resourcequotas" -} - -func TestResourceQuotaCreate(t *testing.T) { - ns := api.NamespaceDefault - resourceQuota := &api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - api.ResourcePods: resource.MustParse("10"), - api.ResourceServices: resource.MustParse("10"), - api.ResourceReplicationControllers: resource.MustParse("10"), - api.ResourceQuotas: resource.MustParse("10"), - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: resourceQuota, - }, - Response: simple.Response{StatusCode: 200, Body: resourceQuota}, - } - - response, err := c.Setup(t).ResourceQuotas(ns).Create(resourceQuota) - defer c.Close() - c.Validate(t, response, err) -} - -func TestResourceQuotaGet(t *testing.T) { - ns := api.NamespaceDefault - resourceQuota := &api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - }, - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - api.ResourcePods: resource.MustParse("10"), - api.ResourceServices: resource.MustParse("10"), - api.ResourceReplicationControllers: resource.MustParse("10"), - api.ResourceQuotas: resource.MustParse("10"), - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, "abc"), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: resourceQuota}, - } - - response, err := c.Setup(t).ResourceQuotas(ns).Get("abc") - defer c.Close() - c.Validate(t, response, err) -} - -func TestResourceQuotaList(t *testing.T) { - ns := api.NamespaceDefault - - resourceQuotaList := &api.ResourceQuotaList{ - Items: []api.ResourceQuota{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, ""), - Query: simple.BuildQueryValues(nil), - Body: nil, - }, - Response: simple.Response{StatusCode: 200, Body: resourceQuotaList}, - } - response, err := c.Setup(t).ResourceQuotas(ns).List(api.ListOptions{}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestResourceQuotaUpdate(t *testing.T) { - ns := api.NamespaceDefault - resourceQuota := &api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - ResourceVersion: "1", - }, - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - api.ResourcePods: resource.MustParse("10"), - api.ResourceServices: resource.MustParse("10"), - api.ResourceReplicationControllers: resource.MustParse("10"), - api.ResourceQuotas: resource.MustParse("10"), - }, - }, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, "abc"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: resourceQuota}, - } - response, err := c.Setup(t).ResourceQuotas(ns).Update(resourceQuota) - defer c.Close() - c.Validate(t, response, err) -} - -func TestResourceQuotaStatusUpdate(t *testing.T) { - ns := api.NamespaceDefault - resourceQuota := &api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{ - Name: "abc", - Namespace: "foo", - ResourceVersion: "1", - }, - Status: api.ResourceQuotaStatus{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100"), - api.ResourceMemory: resource.MustParse("10000"), - api.ResourcePods: resource.MustParse("10"), - api.ResourceServices: resource.MustParse("10"), - api.ResourceReplicationControllers: resource.MustParse("10"), - api.ResourceQuotas: resource.MustParse("10"), - }, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, "abc") + "/status", - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: resourceQuota}, - } - response, err := c.Setup(t).ResourceQuotas(ns).UpdateStatus(resourceQuota) - defer c.Close() - c.Validate(t, response, err) -} - -func TestResourceQuotaDelete(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath(getResourceQuotasResoureName(), ns, "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).ResourceQuotas(ns).Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestResourceQuotaWatch(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePathWithPrefix("watch", getResourceQuotasResoureName(), "", ""), - Query: url.Values{"resourceVersion": []string{}}}, - Response: simple.Response{StatusCode: 200}, - } - _, err := c.Setup(t).ResourceQuotas(api.NamespaceAll).Watch(api.ListOptions{}) - defer c.Close() - c.Validate(t, nil, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/services_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/services_test.go deleted file mode 100644 index fadfe2be4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/services_test.go +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "net/url" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" - "k8s.io/kubernetes/pkg/labels" -) - -func TestListServices(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("services", ns, ""), - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, - Body: &api.ServiceList{ - Items: []api.Service{ - { - ObjectMeta: api.ObjectMeta{ - Name: "name", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "one": "two", - }, - }, - }, - }, - }, - }, - } - receivedServiceList, err := c.Setup(t).Services(ns).List(api.ListOptions{}) - defer c.Close() - t.Logf("received services: %v %#v", err, receivedServiceList) - c.Validate(t, receivedServiceList, err) -} - -func TestListServicesLabels(t *testing.T) { - ns := api.NamespaceDefault - labelSelectorQueryParamName := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("services", ns, ""), - Query: simple.BuildQueryValues(url.Values{labelSelectorQueryParamName: []string{"foo=bar,name=baz"}})}, - Response: simple.Response{StatusCode: 200, - Body: &api.ServiceList{ - Items: []api.Service{ - { - ObjectMeta: api.ObjectMeta{ - Name: "name", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "one": "two", - }, - }, - }, - }, - }, - }, - } - c.Setup(t) - defer c.Close() - c.QueryValidator[labelSelectorQueryParamName] = simple.ValidateLabels - selector := labels.Set{"foo": "bar", "name": "baz"}.AsSelector() - options := api.ListOptions{LabelSelector: selector} - receivedServiceList, err := c.Services(ns).List(options) - c.Validate(t, receivedServiceList, err) -} - -func TestGetService(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("services", ns, "1"), - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: &api.Service{ObjectMeta: api.ObjectMeta{Name: "service-1"}}}, - } - response, err := c.Setup(t).Services(ns).Get("1") - defer c.Close() - c.Validate(t, response, err) -} - -func TestGetServiceWithNoName(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Services(ns).Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestCreateService(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "POST", - Path: testapi.Default.ResourcePath("services", ns, ""), - Body: &api.Service{ObjectMeta: api.ObjectMeta{Name: "service-1"}}, - Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: &api.Service{ObjectMeta: api.ObjectMeta{Name: "service-1"}}}, - } - response, err := c.Setup(t).Services(ns).Create(&api.Service{ObjectMeta: api.ObjectMeta{Name: "service-1"}}) - defer c.Close() - c.Validate(t, response, err) -} - -func TestUpdateService(t *testing.T) { - ns := api.NamespaceDefault - svc := &api.Service{ObjectMeta: api.ObjectMeta{Name: "service-1", ResourceVersion: "1"}} - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Default.ResourcePath("services", ns, "service-1"), Body: svc, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200, Body: svc}, - } - response, err := c.Setup(t).Services(ns).Update(svc) - defer c.Close() - c.Validate(t, response, err) -} - -func TestDeleteService(t *testing.T) { - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Default.ResourcePath("services", ns, "1"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Services(ns).Delete("1") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestUpdateServiceStatus(t *testing.T) { - ns := api.NamespaceDefault - lbStatus := api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - {IP: "127.0.0.1"}, - }, - } - requestService := &api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Status: api.ServiceStatus{ - LoadBalancer: lbStatus, - }, - } - c := &simple.Client{ - Request: simple.Request{ - Method: "PUT", - Path: testapi.Default.ResourcePath("services", ns, "foo") + "/status", - Query: simple.BuildQueryValues(nil), - }, - Response: simple.Response{ - StatusCode: 200, - Body: &api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Spec: api.ServiceSpec{}, - Status: api.ServiceStatus{ - LoadBalancer: lbStatus, - }, - }, - }, - } - receivedService, err := c.Setup(t).Services(ns).UpdateStatus(requestService) - defer c.Close() - c.Validate(t, receivedService, err) -} - -func TestServiceProxyGet(t *testing.T) { - body := "OK" - ns := api.NamespaceDefault - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("services", ns, "service-1") + "/proxy/foo", - Query: simple.BuildQueryValues(url.Values{"param-name": []string{"param-value"}}), - }, - Response: simple.Response{StatusCode: 200, RawBody: &body}, - } - response, err := c.Setup(t).Services(ns).ProxyGet("", "service-1", "", "foo", map[string]string{"param-name": "param-value"}).DoRaw() - defer c.Close() - c.ValidateRaw(t, response, err) - - // With scheme and port specified - c = &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Default.ResourcePath("services", ns, "https:service-1:my-port") + "/proxy/foo", - Query: simple.BuildQueryValues(url.Values{"param-name": []string{"param-value"}}), - }, - Response: simple.Response{StatusCode: 200, RawBody: &body}, - } - response, err = c.Setup(t).Services(ns).ProxyGet("https", "service-1", "my-port", "foo", map[string]string{"param-name": "param-value"}).DoRaw() - defer c.Close() - c.ValidateRaw(t, response, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/actions.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/actions.go deleted file mode 100644 index 1e5a5e470..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/actions.go +++ /dev/null @@ -1,446 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "strings" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" -) - -func NewRootGetAction(resource, name string) GetActionImpl { - action := GetActionImpl{} - action.Verb = "get" - action.Resource = resource - action.Name = name - - return action -} - -func NewGetAction(resource, namespace, name string) GetActionImpl { - action := GetActionImpl{} - action.Verb = "get" - action.Resource = resource - action.Namespace = namespace - action.Name = name - - return action -} - -func NewRootListAction(resource string, opts api.ListOptions) ListActionImpl { - action := ListActionImpl{} - action.Verb = "list" - action.Resource = resource - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} - - return action -} - -func NewListAction(resource, namespace string, opts api.ListOptions) ListActionImpl { - action := ListActionImpl{} - action.Verb = "list" - action.Resource = resource - action.Namespace = namespace - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} - - return action -} - -func NewRootCreateAction(resource string, object runtime.Object) CreateActionImpl { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = resource - action.Object = object - - return action -} - -func NewCreateAction(resource, namespace string, object runtime.Object) CreateActionImpl { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = resource - action.Namespace = namespace - action.Object = object - - return action -} - -func NewRootUpdateAction(resource string, object runtime.Object) UpdateActionImpl { - action := UpdateActionImpl{} - action.Verb = "update" - action.Resource = resource - action.Object = object - - return action -} - -func NewUpdateAction(resource, namespace string, object runtime.Object) UpdateActionImpl { - action := UpdateActionImpl{} - action.Verb = "update" - action.Resource = resource - action.Namespace = namespace - action.Object = object - - return action -} - -func NewRootPatchAction(resource string, object runtime.Object) PatchActionImpl { - action := PatchActionImpl{} - action.Verb = "patch" - action.Resource = resource - action.Object = object - - return action -} - -func NewPatchAction(resource, namespace string, object runtime.Object) PatchActionImpl { - action := PatchActionImpl{} - action.Verb = "patch" - action.Resource = resource - action.Namespace = namespace - action.Object = object - - return action -} - -func NewUpdateSubresourceAction(resource, subresource, namespace string, object runtime.Object) UpdateActionImpl { - action := UpdateActionImpl{} - action.Verb = "update" - action.Resource = resource - action.Subresource = subresource - action.Namespace = namespace - action.Object = object - - return action -} - -func NewRootDeleteAction(resource, name string) DeleteActionImpl { - action := DeleteActionImpl{} - action.Verb = "delete" - action.Resource = resource - action.Name = name - - return action -} - -func NewDeleteAction(resource, namespace, name string) DeleteActionImpl { - action := DeleteActionImpl{} - action.Verb = "delete" - action.Resource = resource - action.Namespace = namespace - action.Name = name - - return action -} - -func NewRootDeleteCollectionAction(resource string, opts api.ListOptions) DeleteCollectionActionImpl { - action := DeleteCollectionActionImpl{} - action.Verb = "delete-collection" - action.Resource = resource - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} - - return action -} - -func NewDeleteCollectionAction(resource, namespace string, opts api.ListOptions) DeleteCollectionActionImpl { - action := DeleteCollectionActionImpl{} - action.Verb = "delete-collection" - action.Resource = resource - action.Namespace = namespace - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} - - return action -} - -func NewRootWatchAction(resource string, opts api.ListOptions) WatchActionImpl { - action := WatchActionImpl{} - action.Verb = "watch" - action.Resource = resource - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, opts.ResourceVersion} - - return action -} - -func NewWatchAction(resource, namespace string, opts api.ListOptions) WatchActionImpl { - action := WatchActionImpl{} - action.Verb = "watch" - action.Resource = resource - action.Namespace = namespace - labelSelector := opts.LabelSelector - if labelSelector == nil { - labelSelector = labels.Everything() - } - fieldSelector := opts.FieldSelector - if fieldSelector == nil { - fieldSelector = fields.Everything() - } - action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, opts.ResourceVersion} - - return action -} - -func NewProxyGetAction(resource, namespace, scheme, name, port, path string, params map[string]string) ProxyGetActionImpl { - action := ProxyGetActionImpl{} - action.Verb = "get" - action.Resource = resource - action.Namespace = namespace - action.Scheme = scheme - action.Name = name - action.Port = port - action.Path = path - action.Params = params - return action -} - -type ListRestrictions struct { - Labels labels.Selector - Fields fields.Selector -} -type WatchRestrictions struct { - Labels labels.Selector - Fields fields.Selector - ResourceVersion string -} - -type Action interface { - GetNamespace() string - GetVerb() string - GetResource() string - GetSubresource() string - Matches(verb, resource string) bool -} - -type GenericAction interface { - Action - GetValue() interface{} -} - -type GetAction interface { - Action - GetName() string -} - -type ListAction interface { - Action - GetListRestrictions() ListRestrictions -} - -type CreateAction interface { - Action - GetObject() runtime.Object -} - -type UpdateAction interface { - Action - GetObject() runtime.Object -} - -type DeleteAction interface { - Action - GetName() string -} - -type WatchAction interface { - Action - GetWatchRestrictions() WatchRestrictions -} - -type ProxyGetAction interface { - Action - GetScheme() string - GetName() string - GetPort() string - GetPath() string - GetParams() map[string]string -} - -type ActionImpl struct { - Namespace string - Verb string - Resource string - Subresource string -} - -func (a ActionImpl) GetNamespace() string { - return a.Namespace -} -func (a ActionImpl) GetVerb() string { - return a.Verb -} -func (a ActionImpl) GetResource() string { - return a.Resource -} -func (a ActionImpl) GetSubresource() string { - return a.Subresource -} -func (a ActionImpl) Matches(verb, resource string) bool { - return strings.ToLower(verb) == strings.ToLower(a.Verb) && - strings.ToLower(resource) == strings.ToLower(a.Resource) -} - -type GenericActionImpl struct { - ActionImpl - Value interface{} -} - -func (a GenericActionImpl) GetValue() interface{} { - return a.Value -} - -type GetActionImpl struct { - ActionImpl - Name string -} - -func (a GetActionImpl) GetName() string { - return a.Name -} - -type ListActionImpl struct { - ActionImpl - ListRestrictions ListRestrictions -} - -func (a ListActionImpl) GetListRestrictions() ListRestrictions { - return a.ListRestrictions -} - -type CreateActionImpl struct { - ActionImpl - Object runtime.Object -} - -func (a CreateActionImpl) GetObject() runtime.Object { - return a.Object -} - -type UpdateActionImpl struct { - ActionImpl - Object runtime.Object -} - -func (a UpdateActionImpl) GetObject() runtime.Object { - return a.Object -} - -type PatchActionImpl struct { - ActionImpl - Object runtime.Object -} - -func (a PatchActionImpl) GetObject() runtime.Object { - return a.Object -} - -type DeleteActionImpl struct { - ActionImpl - Name string -} - -func (a DeleteActionImpl) GetName() string { - return a.Name -} - -type DeleteCollectionActionImpl struct { - ActionImpl - ListRestrictions ListRestrictions -} - -func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions { - return a.ListRestrictions -} - -type WatchActionImpl struct { - ActionImpl - WatchRestrictions WatchRestrictions -} - -func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions { - return a.WatchRestrictions -} - -type ProxyGetActionImpl struct { - ActionImpl - Scheme string - Name string - Port string - Path string - Params map[string]string -} - -func (a ProxyGetActionImpl) GetScheme() string { - return a.Scheme -} - -func (a ProxyGetActionImpl) GetName() string { - return a.Name -} - -func (a ProxyGetActionImpl) GetPort() string { - return a.Port -} - -func (a ProxyGetActionImpl) GetPath() string { - return a.Path -} - -func (a ProxyGetActionImpl) GetParams() map[string]string { - return a.Params -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_componentstatuses.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_componentstatuses.go deleted file mode 100644 index 34bf210d4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_componentstatuses.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" -) - -// Fake implements ComponentStatusInterface. -type FakeComponentStatuses struct { - Fake *Fake -} - -func (c *FakeComponentStatuses) Get(name string) (*api.ComponentStatus, error) { - obj, err := c.Fake.Invokes(NewRootGetAction("componentstatuses", name), &api.ComponentStatus{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ComponentStatus), err -} - -func (c *FakeComponentStatuses) List(opts api.ListOptions) (result *api.ComponentStatusList, err error) { - obj, err := c.Fake.Invokes(NewRootListAction("componentstatuses", opts), &api.ComponentStatusList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ComponentStatusList), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_configmaps.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_configmaps.go deleted file mode 100644 index 17a5bfeb8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_configmaps.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - configMapResourceName string = "configMaps" -) - -// FakeConfigMaps implements ConfigMapInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeConfigMaps struct { - Fake *Fake - Namespace string -} - -func (c *FakeConfigMaps) Get(name string) (*api.ConfigMap, error) { - obj, err := c.Fake.Invokes(NewGetAction(configMapResourceName, c.Namespace, name), &api.ConfigMap{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) List(opts api.ListOptions) (*api.ConfigMapList, error) { - obj, err := c.Fake.Invokes(NewListAction(configMapResourceName, c.Namespace, opts), &api.ConfigMapList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ConfigMapList), err -} - -func (c *FakeConfigMaps) Create(cfg *api.ConfigMap) (*api.ConfigMap, error) { - obj, err := c.Fake.Invokes(NewCreateAction(configMapResourceName, c.Namespace, cfg), cfg) - if obj == nil { - return nil, err - } - - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) Update(cfg *api.ConfigMap) (*api.ConfigMap, error) { - obj, err := c.Fake.Invokes(NewUpdateAction(configMapResourceName, c.Namespace, cfg), cfg) - if obj == nil { - return nil, err - } - - return obj.(*api.ConfigMap), err -} - -func (c *FakeConfigMaps) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction(configMapResourceName, c.Namespace, name), &api.ConfigMap{}) - return err -} - -func (c *FakeConfigMaps) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction(configMapResourceName, c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_daemon_sets.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_daemon_sets.go deleted file mode 100644 index d0e1e73e1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_daemon_sets.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - kclientlib "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeDaemonSet implements DaemonInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeDaemonSets struct { - Fake *FakeExperimental - Namespace string -} - -// Ensure statically that FakeDaemonSets implements DaemonInterface. -var _ kclientlib.DaemonSetInterface = &FakeDaemonSets{} - -func (c *FakeDaemonSets) Get(name string) (*extensions.DaemonSet, error) { - obj, err := c.Fake.Invokes(NewGetAction("daemonsets", c.Namespace, name), &extensions.DaemonSet{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) List(opts api.ListOptions) (*extensions.DaemonSetList, error) { - obj, err := c.Fake.Invokes(NewListAction("daemonsets", c.Namespace, opts), &extensions.DaemonSetList{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSetList), err -} - -func (c *FakeDaemonSets) Create(daemon *extensions.DaemonSet) (*extensions.DaemonSet, error) { - obj, err := c.Fake.Invokes(NewCreateAction("daemonsets", c.Namespace, daemon), &extensions.DaemonSet{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) Update(daemon *extensions.DaemonSet) (*extensions.DaemonSet, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("daemonsets", c.Namespace, daemon), &extensions.DaemonSet{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) UpdateStatus(daemon *extensions.DaemonSet) (*extensions.DaemonSet, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("daemonsets", "status", c.Namespace, daemon), &extensions.DaemonSet{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.DaemonSet), err -} - -func (c *FakeDaemonSets) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("daemonsets", c.Namespace, name), &extensions.DaemonSet{}) - return err -} - -func (c *FakeDaemonSets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("daemonsets", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_deployments.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_deployments.go deleted file mode 100644 index f53f27198..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_deployments.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeDeployments implements DeploymentsInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeDeployments struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeDeployments) Get(name string) (*extensions.Deployment, error) { - obj, err := c.Fake.Invokes(NewGetAction("deployments", c.Namespace, name), &extensions.Deployment{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) List(opts api.ListOptions) (*extensions.DeploymentList, error) { - obj, err := c.Fake.Invokes(NewListAction("deployments", c.Namespace, opts), &extensions.DeploymentList{}) - if obj == nil { - return nil, err - } - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.DeploymentList{} - for _, deployment := range obj.(*extensions.DeploymentList).Items { - if label.Matches(labels.Set(deployment.Labels)) { - list.Items = append(list.Items, deployment) - } - } - return list, err -} - -func (c *FakeDeployments) Create(deployment *extensions.Deployment) (*extensions.Deployment, error) { - obj, err := c.Fake.Invokes(NewCreateAction("deployments", c.Namespace, deployment), deployment) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) Update(deployment *extensions.Deployment) (*extensions.Deployment, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("deployments", c.Namespace, deployment), deployment) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) UpdateStatus(deployment *extensions.Deployment) (*extensions.Deployment, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("deployments", "status", c.Namespace, deployment), deployment) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Deployment), err -} - -func (c *FakeDeployments) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("deployments", c.Namespace, name), &extensions.Deployment{}) - return err -} - -func (c *FakeDeployments) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("deployments", c.Namespace, opts)) -} - -func (c *FakeDeployments) Rollback(deploymentRollback *extensions.DeploymentRollback) error { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = "deployments" - action.Subresource = "rollback" - action.Object = deploymentRollback - - _, err := c.Fake.Invokes(action, deploymentRollback) - return err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_endpoints.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_endpoints.go deleted file mode 100644 index 68f6178f7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_endpoints.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeEndpoints implements EndpointInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeEndpoints struct { - Fake *Fake - Namespace string -} - -func (c *FakeEndpoints) Get(name string) (*api.Endpoints, error) { - obj, err := c.Fake.Invokes(NewGetAction("endpoints", c.Namespace, name), &api.Endpoints{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) List(opts api.ListOptions) (*api.EndpointsList, error) { - obj, err := c.Fake.Invokes(NewListAction("endpoints", c.Namespace, opts), &api.EndpointsList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.EndpointsList), err -} - -func (c *FakeEndpoints) Create(endpoints *api.Endpoints) (*api.Endpoints, error) { - obj, err := c.Fake.Invokes(NewCreateAction("endpoints", c.Namespace, endpoints), endpoints) - if obj == nil { - return nil, err - } - - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) Update(endpoints *api.Endpoints) (*api.Endpoints, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("endpoints", c.Namespace, endpoints), endpoints) - if obj == nil { - return nil, err - } - - return obj.(*api.Endpoints), err -} - -func (c *FakeEndpoints) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("endpoints", c.Namespace, name), &api.Endpoints{}) - return err -} - -func (c *FakeEndpoints) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("endpoints", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_events.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_events.go deleted file mode 100644 index 3da2143fc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_events.go +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeEvents implements EventInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeEvents struct { - Fake *Fake - Namespace string -} - -// Get returns the given event, or an error. -func (c *FakeEvents) Get(name string) (*api.Event, error) { - action := NewRootGetAction("events", name) - if c.Namespace != "" { - action = NewGetAction("events", c.Namespace, name) - } - obj, err := c.Fake.Invokes(action, &api.Event{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// List returns a list of events matching the selectors. -func (c *FakeEvents) List(opts api.ListOptions) (*api.EventList, error) { - action := NewRootListAction("events", opts) - if c.Namespace != "" { - action = NewListAction("events", c.Namespace, opts) - } - obj, err := c.Fake.Invokes(action, &api.EventList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.EventList), err -} - -// Create makes a new event. Returns the copy of the event the server returns, or an error. -func (c *FakeEvents) Create(event *api.Event) (*api.Event, error) { - action := NewRootCreateAction("events", event) - if c.Namespace != "" { - action = NewCreateAction("events", c.Namespace, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// Update replaces an existing event. Returns the copy of the event the server returns, or an error. -func (c *FakeEvents) Update(event *api.Event) (*api.Event, error) { - action := NewRootUpdateAction("events", event) - if c.Namespace != "" { - action = NewUpdateAction("events", c.Namespace, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -// Patch patches an existing event. Returns the copy of the event the server returns, or an error. -func (c *FakeEvents) Patch(event *api.Event, data []byte) (*api.Event, error) { - action := NewRootPatchAction("events", event) - if c.Namespace != "" { - action = NewPatchAction("events", c.Namespace, event) - } - obj, err := c.Fake.Invokes(action, event) - if obj == nil { - return nil, err - } - - return obj.(*api.Event), err -} - -func (c *FakeEvents) Delete(name string) error { - action := NewRootDeleteAction("events", name) - if c.Namespace != "" { - action = NewDeleteAction("events", c.Namespace, name) - } - _, err := c.Fake.Invokes(action, &api.Event{}) - return err -} - -func (c *FakeEvents) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error { - action := NewRootDeleteCollectionAction("events", listOptions) - if c.Namespace != "" { - action = NewDeleteCollectionAction("events", c.Namespace, listOptions) - } - _, err := c.Fake.Invokes(action, &api.EventList{}) - return err -} - -// Watch starts watching for events matching the given selectors. -func (c *FakeEvents) Watch(opts api.ListOptions) (watch.Interface, error) { - action := NewRootWatchAction("events", opts) - if c.Namespace != "" { - action = NewWatchAction("events", c.Namespace, opts) - } - return c.Fake.InvokesWatch(action) -} - -// Search returns a list of events matching the specified object. -func (c *FakeEvents) Search(objOrRef runtime.Object) (*api.EventList, error) { - action := NewRootListAction("events", api.ListOptions{}) - if c.Namespace != "" { - action = NewListAction("events", c.Namespace, api.ListOptions{}) - } - obj, err := c.Fake.Invokes(action, &api.EventList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.EventList), err -} - -func (c *FakeEvents) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector { - action := GenericActionImpl{} - action.Verb = "get-field-selector" - action.Resource = "events" - - c.Fake.Invokes(action, nil) - return fields.Everything() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_horizontal_pod_autoscalers.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_horizontal_pod_autoscalers.go deleted file mode 100644 index e50b326d9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_horizontal_pod_autoscalers.go +++ /dev/null @@ -1,164 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeHorizontalPodAutoscalers implements HorizontalPodAutoscalerInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeHorizontalPodAutoscalers struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeHorizontalPodAutoscalers) Get(name string) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewGetAction("horizontalpodautoscalers", c.Namespace, name), &extensions.HorizontalPodAutoscaler{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) List(opts api.ListOptions) (*extensions.HorizontalPodAutoscalerList, error) { - obj, err := c.Fake.Invokes(NewListAction("horizontalpodautoscalers", c.Namespace, opts), &extensions.HorizontalPodAutoscalerList{}) - if obj == nil { - return nil, err - } - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.HorizontalPodAutoscalerList{} - for _, a := range obj.(*extensions.HorizontalPodAutoscalerList).Items { - if label.Matches(labels.Set(a.Labels)) { - list.Items = append(list.Items, a) - } - } - return list, err -} - -func (c *FakeHorizontalPodAutoscalers) Create(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewCreateAction("horizontalpodautoscalers", c.Namespace, a), a) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) Update(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("horizontalpodautoscalers", c.Namespace, a), a) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) UpdateStatus(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("horizontalpodautoscalers", "status", c.Namespace, a), &extensions.HorizontalPodAutoscaler{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalers) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("horizontalpodautoscalers", c.Namespace, name), &extensions.HorizontalPodAutoscaler{}) - return err -} - -func (c *FakeHorizontalPodAutoscalers) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("horizontalpodautoscalers", c.Namespace, opts)) -} - -// FakeHorizontalPodAutoscalers implements HorizontalPodAutoscalerInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -// This is a test implementation of HorizontalPodAutoscalersV1 -// TODO(piosz): get back to one client implementation once HPA will be graduated to GA completely -type FakeHorizontalPodAutoscalersV1 struct { - Fake *FakeAutoscaling - Namespace string -} - -func (c *FakeHorizontalPodAutoscalersV1) Get(name string) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewGetAction("horizontalpodautoscalers", c.Namespace, name), &extensions.HorizontalPodAutoscaler{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalersV1) List(opts api.ListOptions) (*extensions.HorizontalPodAutoscalerList, error) { - obj, err := c.Fake.Invokes(NewListAction("horizontalpodautoscalers", c.Namespace, opts), &extensions.HorizontalPodAutoscalerList{}) - if obj == nil { - return nil, err - } - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &extensions.HorizontalPodAutoscalerList{} - for _, a := range obj.(*extensions.HorizontalPodAutoscalerList).Items { - if label.Matches(labels.Set(a.Labels)) { - list.Items = append(list.Items, a) - } - } - return list, err -} - -func (c *FakeHorizontalPodAutoscalersV1) Create(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewCreateAction("horizontalpodautoscalers", c.Namespace, a), a) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalersV1) Update(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("horizontalpodautoscalers", c.Namespace, a), a) - if obj == nil { - return nil, err - } - - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalersV1) UpdateStatus(a *extensions.HorizontalPodAutoscaler) (*extensions.HorizontalPodAutoscaler, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("horizontalpodautoscalers", "status", c.Namespace, a), &extensions.HorizontalPodAutoscaler{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.HorizontalPodAutoscaler), err -} - -func (c *FakeHorizontalPodAutoscalersV1) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("horizontalpodautoscalers", c.Namespace, name), &extensions.HorizontalPodAutoscaler{}) - return err -} - -func (c *FakeHorizontalPodAutoscalersV1) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("horizontalpodautoscalers", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_ingress.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_ingress.go deleted file mode 100644 index b15458997..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_ingress.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeIngress implements IngressInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeIngress struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeIngress) Get(name string) (*extensions.Ingress, error) { - obj, err := c.Fake.Invokes(NewGetAction("ingresses", c.Namespace, name), &extensions.Ingress{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngress) List(opts api.ListOptions) (*extensions.IngressList, error) { - obj, err := c.Fake.Invokes(NewListAction("ingresses", c.Namespace, opts), &extensions.IngressList{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.IngressList), err -} - -func (c *FakeIngress) Create(ingress *extensions.Ingress) (*extensions.Ingress, error) { - obj, err := c.Fake.Invokes(NewCreateAction("ingresses", c.Namespace, ingress), ingress) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngress) Update(ingress *extensions.Ingress) (*extensions.Ingress, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("ingresses", c.Namespace, ingress), ingress) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Ingress), err -} - -func (c *FakeIngress) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("ingresses", c.Namespace, name), &extensions.Ingress{}) - return err -} - -func (c *FakeIngress) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("ingresses", c.Namespace, opts)) -} - -func (c *FakeIngress) UpdateStatus(ingress *extensions.Ingress) (result *extensions.Ingress, err error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("ingresses", "status", c.Namespace, ingress), ingress) - if obj == nil { - return nil, err - } - - return obj.(*extensions.Ingress), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_jobs.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_jobs.go deleted file mode 100644 index dedde9dc3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_jobs.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeJobs implements JobInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeJobs struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeJobs) Get(name string) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewGetAction("jobs", c.Namespace, name), &batch.Job{}) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobs) List(opts api.ListOptions) (*batch.JobList, error) { - obj, err := c.Fake.Invokes(NewListAction("jobs", c.Namespace, opts), &batch.JobList{}) - if obj == nil { - return nil, err - } - - return obj.(*batch.JobList), err -} - -func (c *FakeJobs) Create(job *batch.Job) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewCreateAction("jobs", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobs) Update(job *batch.Job) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("jobs", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobs) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("jobs", c.Namespace, name), &batch.Job{}) - return err -} - -func (c *FakeJobs) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("jobs", c.Namespace, opts)) -} - -func (c *FakeJobs) UpdateStatus(job *batch.Job) (result *batch.Job, err error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("jobs", "status", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -// FakeJobs implements JobInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -// This is a test implementation of JobsV1 -// TODO(piosz): get back to one client implementation once HPA will be graduated to GA completely -type FakeJobsV1 struct { - Fake *FakeBatch - Namespace string -} - -func (c *FakeJobsV1) Get(name string) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewGetAction("jobs", c.Namespace, name), &batch.Job{}) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobsV1) List(opts api.ListOptions) (*batch.JobList, error) { - obj, err := c.Fake.Invokes(NewListAction("jobs", c.Namespace, opts), &batch.JobList{}) - if obj == nil { - return nil, err - } - - return obj.(*batch.JobList), err -} - -func (c *FakeJobsV1) Create(job *batch.Job) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewCreateAction("jobs", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobsV1) Update(job *batch.Job) (*batch.Job, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("jobs", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} - -func (c *FakeJobsV1) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("jobs", c.Namespace, name), &batch.Job{}) - return err -} - -func (c *FakeJobsV1) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("jobs", c.Namespace, opts)) -} - -func (c *FakeJobsV1) UpdateStatus(job *batch.Job) (result *batch.Job, err error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("jobs", "status", c.Namespace, job), job) - if obj == nil { - return nil, err - } - - return obj.(*batch.Job), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_limit_ranges.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_limit_ranges.go deleted file mode 100644 index 3669f5ff8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_limit_ranges.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeLimitRanges implements PodsInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeLimitRanges struct { - Fake *Fake - Namespace string -} - -func (c *FakeLimitRanges) Get(name string) (*api.LimitRange, error) { - obj, err := c.Fake.Invokes(NewGetAction("limitranges", c.Namespace, name), &api.LimitRange{}) - if obj == nil { - return nil, err - } - - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) List(opts api.ListOptions) (*api.LimitRangeList, error) { - obj, err := c.Fake.Invokes(NewListAction("limitranges", c.Namespace, opts), &api.LimitRangeList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.LimitRangeList), err -} - -func (c *FakeLimitRanges) Create(limitRange *api.LimitRange) (*api.LimitRange, error) { - obj, err := c.Fake.Invokes(NewCreateAction("limitranges", c.Namespace, limitRange), limitRange) - if obj == nil { - return nil, err - } - - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) Update(limitRange *api.LimitRange) (*api.LimitRange, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("limitranges", c.Namespace, limitRange), limitRange) - if obj == nil { - return nil, err - } - - return obj.(*api.LimitRange), err -} - -func (c *FakeLimitRanges) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("limitranges", c.Namespace, name), &api.LimitRange{}) - return err -} - -func (c *FakeLimitRanges) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("limitranges", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_namespaces.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_namespaces.go deleted file mode 100644 index 8c4ac1ac2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_namespaces.go +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeNamespaces implements NamespacesInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeNamespaces struct { - Fake *Fake -} - -func (c *FakeNamespaces) Get(name string) (*api.Namespace, error) { - obj, err := c.Fake.Invokes(NewRootGetAction("namespaces", name), &api.Namespace{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) List(opts api.ListOptions) (*api.NamespaceList, error) { - obj, err := c.Fake.Invokes(NewRootListAction("namespaces", opts), &api.NamespaceList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.NamespaceList), err -} - -func (c *FakeNamespaces) Create(namespace *api.Namespace) (*api.Namespace, error) { - obj, err := c.Fake.Invokes(NewRootCreateAction("namespaces", namespace), namespace) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) Update(namespace *api.Namespace) (*api.Namespace, error) { - obj, err := c.Fake.Invokes(NewRootUpdateAction("namespaces", namespace), namespace) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) Delete(name string) error { - _, err := c.Fake.Invokes(NewRootDeleteAction("namespaces", name), &api.Namespace{}) - return err -} - -func (c *FakeNamespaces) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewRootWatchAction("namespaces", opts)) -} - -func (c *FakeNamespaces) Finalize(namespace *api.Namespace) (*api.Namespace, error) { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = "namespaces" - action.Subresource = "finalize" - action.Object = namespace - - obj, err := c.Fake.Invokes(action, namespace) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} - -func (c *FakeNamespaces) Status(namespace *api.Namespace) (*api.Namespace, error) { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = "namespaces" - action.Subresource = "status" - action.Object = namespace - - obj, err := c.Fake.Invokes(action, namespace) - if obj == nil { - return nil, err - } - - return obj.(*api.Namespace), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_nodes.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_nodes.go deleted file mode 100644 index b1943366e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_nodes.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeNodes implements NodeInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeNodes struct { - Fake *Fake -} - -func (c *FakeNodes) Get(name string) (*api.Node, error) { - obj, err := c.Fake.Invokes(NewRootGetAction("nodes", name), &api.Node{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Node), err -} - -func (c *FakeNodes) List(opts api.ListOptions) (*api.NodeList, error) { - obj, err := c.Fake.Invokes(NewRootListAction("nodes", opts), &api.NodeList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.NodeList), err -} - -func (c *FakeNodes) Create(node *api.Node) (*api.Node, error) { - obj, err := c.Fake.Invokes(NewRootCreateAction("nodes", node), node) - if obj == nil { - return nil, err - } - - return obj.(*api.Node), err -} - -func (c *FakeNodes) Update(node *api.Node) (*api.Node, error) { - obj, err := c.Fake.Invokes(NewRootUpdateAction("nodes", node), node) - if obj == nil { - return nil, err - } - - return obj.(*api.Node), err -} - -func (c *FakeNodes) Delete(name string) error { - _, err := c.Fake.Invokes(NewRootDeleteAction("nodes", name), &api.Node{}) - return err -} - -func (c *FakeNodes) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewRootWatchAction("nodes", opts)) -} - -func (c *FakeNodes) UpdateStatus(node *api.Node) (*api.Node, error) { - action := CreateActionImpl{} - action.Verb = "update" - action.Resource = "nodes" - action.Subresource = "status" - action.Object = node - - obj, err := c.Fake.Invokes(action, node) - if obj == nil { - return nil, err - } - - return obj.(*api.Node), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volume_claims.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volume_claims.go deleted file mode 100644 index cadfb084c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volume_claims.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -type FakePersistentVolumeClaims struct { - Fake *Fake - Namespace string -} - -func (c *FakePersistentVolumeClaims) Get(name string) (*api.PersistentVolumeClaim, error) { - obj, err := c.Fake.Invokes(NewGetAction("persistentvolumeclaims", c.Namespace, name), &api.PersistentVolumeClaim{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) List(opts api.ListOptions) (*api.PersistentVolumeClaimList, error) { - obj, err := c.Fake.Invokes(NewListAction("persistentvolumeclaims", c.Namespace, opts), &api.PersistentVolumeClaimList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeClaimList), err -} - -func (c *FakePersistentVolumeClaims) Create(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - obj, err := c.Fake.Invokes(NewCreateAction("persistentvolumeclaims", c.Namespace, claim), claim) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) Update(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("persistentvolumeclaims", c.Namespace, claim), claim) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeClaim), err -} - -func (c *FakePersistentVolumeClaims) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("persistentvolumeclaims", c.Namespace, name), &api.PersistentVolumeClaim{}) - return err -} - -func (c *FakePersistentVolumeClaims) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("persistentvolumeclaims", c.Namespace, opts)) -} - -func (c *FakePersistentVolumeClaims) UpdateStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("persistentvolumeclaims", "status", c.Namespace, claim), claim) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeClaim), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volumes.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volumes.go deleted file mode 100644 index cb184bc44..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_persistent_volumes.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -type FakePersistentVolumes struct { - Fake *Fake -} - -func (c *FakePersistentVolumes) Get(name string) (*api.PersistentVolume, error) { - obj, err := c.Fake.Invokes(NewRootGetAction("persistentvolumes", name), &api.PersistentVolume{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) List(opts api.ListOptions) (*api.PersistentVolumeList, error) { - obj, err := c.Fake.Invokes(NewRootListAction("persistentvolumes", opts), &api.PersistentVolumeList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolumeList), err -} - -func (c *FakePersistentVolumes) Create(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - obj, err := c.Fake.Invokes(NewRootCreateAction("persistentvolumes", pv), pv) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) Update(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - obj, err := c.Fake.Invokes(NewRootUpdateAction("persistentvolumes", pv), pv) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolume), err -} - -func (c *FakePersistentVolumes) Delete(name string) error { - _, err := c.Fake.Invokes(NewRootDeleteAction("persistentvolumes", name), &api.PersistentVolume{}) - return err -} - -func (c *FakePersistentVolumes) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewRootWatchAction("persistentvolumes", opts)) -} - -func (c *FakePersistentVolumes) UpdateStatus(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - action := UpdateActionImpl{} - action.Verb = "update" - action.Resource = "persistentvolumes" - action.Subresource = "status" - action.Object = pv - - obj, err := c.Fake.Invokes(action, pv) - if obj == nil { - return nil, err - } - - return obj.(*api.PersistentVolume), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pod_templates.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pod_templates.go deleted file mode 100644 index 47ff3d8ac..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pod_templates.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakePodTemplates implements PodTemplatesInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakePodTemplates struct { - Fake *Fake - Namespace string -} - -func (c *FakePodTemplates) Get(name string) (*api.PodTemplate, error) { - obj, err := c.Fake.Invokes(NewGetAction("podtemplates", c.Namespace, name), &api.PodTemplate{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) List(opts api.ListOptions) (*api.PodTemplateList, error) { - obj, err := c.Fake.Invokes(NewListAction("podtemplates", c.Namespace, opts), &api.PodTemplateList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.PodTemplateList), err -} - -func (c *FakePodTemplates) Create(pod *api.PodTemplate) (*api.PodTemplate, error) { - obj, err := c.Fake.Invokes(NewCreateAction("podtemplates", c.Namespace, pod), pod) - if obj == nil { - return nil, err - } - - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) Update(pod *api.PodTemplate) (*api.PodTemplate, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("podtemplates", c.Namespace, pod), pod) - if obj == nil { - return nil, err - } - - return obj.(*api.PodTemplate), err -} - -func (c *FakePodTemplates) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("podtemplates", c.Namespace, name), &api.PodTemplate{}) - return err -} - -func (c *FakePodTemplates) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("podtemplates", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pods.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pods.go deleted file mode 100644 index e634030c8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_pods.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/watch" -) - -// FakePods implements PodsInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakePods struct { - Fake *Fake - Namespace string -} - -func (c *FakePods) Get(name string) (*api.Pod, error) { - obj, err := c.Fake.Invokes(NewGetAction("pods", c.Namespace, name), &api.Pod{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Pod), err -} - -func (c *FakePods) List(opts api.ListOptions) (*api.PodList, error) { - obj, err := c.Fake.Invokes(NewListAction("pods", c.Namespace, opts), &api.PodList{}) - if obj == nil { - return nil, err - } - label := opts.LabelSelector - if label == nil { - label = labels.Everything() - } - list := &api.PodList{} - for _, pod := range obj.(*api.PodList).Items { - if label.Matches(labels.Set(pod.Labels)) { - list.Items = append(list.Items, pod) - } - } - return list, err -} - -func (c *FakePods) Create(pod *api.Pod) (*api.Pod, error) { - obj, err := c.Fake.Invokes(NewCreateAction("pods", c.Namespace, pod), pod) - if obj == nil { - return nil, err - } - - return obj.(*api.Pod), err -} - -func (c *FakePods) Update(pod *api.Pod) (*api.Pod, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("pods", c.Namespace, pod), pod) - if obj == nil { - return nil, err - } - - return obj.(*api.Pod), err -} - -func (c *FakePods) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("pods", c.Namespace, name), &api.Pod{}) - return err -} - -func (c *FakePods) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("pods", c.Namespace, opts)) -} - -func (c *FakePods) Bind(binding *api.Binding) error { - action := CreateActionImpl{} - action.Verb = "create" - action.Resource = "pods" - action.Subresource = "bindings" - action.Object = binding - - _, err := c.Fake.Invokes(action, binding) - return err -} - -func (c *FakePods) UpdateStatus(pod *api.Pod) (*api.Pod, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("pods", "status", c.Namespace, pod), pod) - if obj == nil { - return nil, err - } - - return obj.(*api.Pod), err -} - -func (c *FakePods) GetLogs(name string, opts *api.PodLogOptions) *restclient.Request { - action := GenericActionImpl{} - action.Verb = "get" - action.Namespace = c.Namespace - action.Resource = "pod" - action.Subresource = "logs" - action.Value = opts - - _, _ = c.Fake.Invokes(action, &api.Pod{}) - return &restclient.Request{} -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_podsecuritypolicy.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_podsecuritypolicy.go deleted file mode 100644 index bb611d322..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_podsecuritypolicy.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/watch" -) - -// FakePodSecurityPolicy implements PodSecurityPolicyInterface. Meant to be -// embedded into a struct to get a default implementation. This makes faking out just -// the method you want to test easier. -type FakePodSecurityPolicy struct { - Fake *Fake - Namespace string -} - -func (c *FakePodSecurityPolicy) List(opts api.ListOptions) (*extensions.PodSecurityPolicyList, error) { - obj, err := c.Fake.Invokes(NewListAction("podsecuritypolicies", c.Namespace, opts), &extensions.PodSecurityPolicyList{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.PodSecurityPolicyList), err -} - -func (c *FakePodSecurityPolicy) Get(name string) (*extensions.PodSecurityPolicy, error) { - obj, err := c.Fake.Invokes(NewGetAction("podsecuritypolicies", c.Namespace, name), &extensions.PodSecurityPolicy{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.PodSecurityPolicy), err -} - -func (c *FakePodSecurityPolicy) Create(scc *extensions.PodSecurityPolicy) (*extensions.PodSecurityPolicy, error) { - obj, err := c.Fake.Invokes(NewCreateAction("podsecuritypolicies", c.Namespace, scc), &extensions.PodSecurityPolicy{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.PodSecurityPolicy), err -} - -func (c *FakePodSecurityPolicy) Update(scc *extensions.PodSecurityPolicy) (*extensions.PodSecurityPolicy, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("podsecuritypolicies", c.Namespace, scc), &extensions.PodSecurityPolicy{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.PodSecurityPolicy), err -} - -func (c *FakePodSecurityPolicy) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("podsecuritypolicies", c.Namespace, name), &extensions.PodSecurityPolicy{}) - return err -} - -func (c *FakePodSecurityPolicy) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("podsecuritypolicies", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replica_sets.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replica_sets.go deleted file mode 100644 index 29c985c8c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replica_sets.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeReplicaSets implements ReplicaSetsInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeReplicaSets struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeReplicaSets) Get(name string) (*extensions.ReplicaSet, error) { - obj, err := c.Fake.Invokes(NewGetAction("replicasets", c.Namespace, name), &extensions.ReplicaSet{}) - if obj == nil { - return nil, err - } - - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) List(opts api.ListOptions) (*extensions.ReplicaSetList, error) { - obj, err := c.Fake.Invokes(NewListAction("replicasets", c.Namespace, opts), &extensions.ReplicaSetList{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ReplicaSetList), err -} - -func (c *FakeReplicaSets) Create(rs *extensions.ReplicaSet) (*extensions.ReplicaSet, error) { - obj, err := c.Fake.Invokes(NewCreateAction("replicasets", c.Namespace, rs), rs) - if obj == nil { - return nil, err - } - - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) Update(rs *extensions.ReplicaSet) (*extensions.ReplicaSet, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("replicasets", c.Namespace, rs), rs) - if obj == nil { - return nil, err - } - - return obj.(*extensions.ReplicaSet), err -} - -func (c *FakeReplicaSets) Delete(name string, options *api.DeleteOptions) error { - _, err := c.Fake.Invokes(NewDeleteAction("replicasets", c.Namespace, name), &extensions.ReplicaSet{}) - return err -} - -func (c *FakeReplicaSets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("replicasets", c.Namespace, opts)) -} - -func (c *FakeReplicaSets) UpdateStatus(rs *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("replicasets", "status", c.Namespace, rs), rs) - if obj == nil { - return nil, err - } - - return obj.(*extensions.ReplicaSet), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replication_controllers.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replication_controllers.go deleted file mode 100644 index e44b82615..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_replication_controllers.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeReplicationControllers implements ReplicationControllerInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeReplicationControllers struct { - Fake *Fake - Namespace string -} - -func (c *FakeReplicationControllers) Get(name string) (*api.ReplicationController, error) { - obj, err := c.Fake.Invokes(NewGetAction("replicationcontrollers", c.Namespace, name), &api.ReplicationController{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) List(opts api.ListOptions) (*api.ReplicationControllerList, error) { - obj, err := c.Fake.Invokes(NewListAction("replicationcontrollers", c.Namespace, opts), &api.ReplicationControllerList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ReplicationControllerList), err -} - -func (c *FakeReplicationControllers) Create(controller *api.ReplicationController) (*api.ReplicationController, error) { - obj, err := c.Fake.Invokes(NewCreateAction("replicationcontrollers", c.Namespace, controller), controller) - if obj == nil { - return nil, err - } - - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) Update(controller *api.ReplicationController) (*api.ReplicationController, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("replicationcontrollers", c.Namespace, controller), controller) - if obj == nil { - return nil, err - } - - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) UpdateStatus(controller *api.ReplicationController) (*api.ReplicationController, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("replicationcontrollers", "status", c.Namespace, controller), &api.ReplicationController{}) - if obj == nil { - return nil, err - } - return obj.(*api.ReplicationController), err -} - -func (c *FakeReplicationControllers) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("replicationcontrollers", c.Namespace, name), &api.ReplicationController{}) - return err -} - -func (c *FakeReplicationControllers) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("replicationcontrollers", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_resource_quotas.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_resource_quotas.go deleted file mode 100644 index d5090f0d0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_resource_quotas.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeResourceQuotas implements ResourceQuotaInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeResourceQuotas struct { - Fake *Fake - Namespace string -} - -func (c *FakeResourceQuotas) Get(name string) (*api.ResourceQuota, error) { - obj, err := c.Fake.Invokes(NewGetAction("resourcequotas", c.Namespace, name), &api.ResourceQuota{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) List(opts api.ListOptions) (*api.ResourceQuotaList, error) { - obj, err := c.Fake.Invokes(NewListAction("resourcequotas", c.Namespace, opts), &api.ResourceQuotaList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ResourceQuotaList), err -} - -func (c *FakeResourceQuotas) Create(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error) { - obj, err := c.Fake.Invokes(NewCreateAction("resourcequotas", c.Namespace, resourceQuota), resourceQuota) - if obj == nil { - return nil, err - } - - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) Update(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("resourcequotas", c.Namespace, resourceQuota), resourceQuota) - if obj == nil { - return nil, err - } - - return obj.(*api.ResourceQuota), err -} - -func (c *FakeResourceQuotas) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("resourcequotas", c.Namespace, name), &api.ResourceQuota{}) - return err -} - -func (c *FakeResourceQuotas) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("resourcequotas", c.Namespace, opts)) -} - -func (c *FakeResourceQuotas) UpdateStatus(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("resourcequotas", "status", c.Namespace, resourceQuota), resourceQuota) - if obj == nil { - return nil, err - } - - return obj.(*api.ResourceQuota), err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_scales.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_scales.go deleted file mode 100644 index 53ff5f87d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_scales.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/apis/extensions" -) - -// FakeScales implements ScaleInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the methods you want to test easier. -type FakeScales struct { - Fake *FakeExperimental - Namespace string -} - -func (c *FakeScales) Get(kind string, name string) (result *extensions.Scale, err error) { - action := GetActionImpl{} - action.Verb = "get" - action.Namespace = c.Namespace - action.Resource = kind - action.Subresource = "scale" - action.Name = name - obj, err := c.Fake.Invokes(action, &extensions.Scale{}) - result = obj.(*extensions.Scale) - return -} - -func (c *FakeScales) Update(kind string, scale *extensions.Scale) (result *extensions.Scale, err error) { - action := UpdateActionImpl{} - action.Verb = "update" - action.Namespace = c.Namespace - action.Resource = kind - action.Subresource = "scale" - action.Object = scale - obj, err := c.Fake.Invokes(action, scale) - result = obj.(*extensions.Scale) - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_secrets.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_secrets.go deleted file mode 100644 index f54cffb87..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_secrets.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// Fake implements SecretInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeSecrets struct { - Fake *Fake - Namespace string -} - -func (c *FakeSecrets) Get(name string) (*api.Secret, error) { - obj, err := c.Fake.Invokes(NewGetAction("secrets", c.Namespace, name), &api.Secret{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) List(opts api.ListOptions) (*api.SecretList, error) { - obj, err := c.Fake.Invokes(NewListAction("secrets", c.Namespace, opts), &api.SecretList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.SecretList), err -} - -func (c *FakeSecrets) Create(secret *api.Secret) (*api.Secret, error) { - obj, err := c.Fake.Invokes(NewCreateAction("secrets", c.Namespace, secret), secret) - if obj == nil { - return nil, err - } - - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) Update(secret *api.Secret) (*api.Secret, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("secrets", c.Namespace, secret), secret) - if obj == nil { - return nil, err - } - - return obj.(*api.Secret), err -} - -func (c *FakeSecrets) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("secrets", c.Namespace, name), &api.Secret{}) - return err -} - -func (c *FakeSecrets) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("secrets", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_service_accounts.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_service_accounts.go deleted file mode 100644 index e40641668..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_service_accounts.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeServiceAccounts implements ServiceAccountsInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeServiceAccounts struct { - Fake *Fake - Namespace string -} - -func (c *FakeServiceAccounts) Get(name string) (*api.ServiceAccount, error) { - obj, err := c.Fake.Invokes(NewGetAction("serviceaccounts", c.Namespace, name), &api.ServiceAccount{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) List(opts api.ListOptions) (*api.ServiceAccountList, error) { - obj, err := c.Fake.Invokes(NewListAction("serviceaccounts", c.Namespace, opts), &api.ServiceAccountList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ServiceAccountList), err -} - -func (c *FakeServiceAccounts) Create(serviceAccount *api.ServiceAccount) (*api.ServiceAccount, error) { - obj, err := c.Fake.Invokes(NewCreateAction("serviceaccounts", c.Namespace, serviceAccount), serviceAccount) - if obj == nil { - return nil, err - } - - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) Update(serviceAccount *api.ServiceAccount) (*api.ServiceAccount, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("serviceaccounts", c.Namespace, serviceAccount), serviceAccount) - if obj == nil { - return nil, err - } - - return obj.(*api.ServiceAccount), err -} - -func (c *FakeServiceAccounts) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("serviceaccounts", c.Namespace, name), &api.ServiceAccount{}) - return err -} - -func (c *FakeServiceAccounts) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("serviceaccounts", c.Namespace, opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_services.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_services.go deleted file mode 100644 index fd4861ba1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_services.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/watch" -) - -// Fake implements ServiceInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeServices struct { - Fake *Fake - Namespace string -} - -func (c *FakeServices) Get(name string) (*api.Service, error) { - obj, err := c.Fake.Invokes(NewGetAction("services", c.Namespace, name), &api.Service{}) - if obj == nil { - return nil, err - } - - return obj.(*api.Service), err -} - -func (c *FakeServices) List(opts api.ListOptions) (*api.ServiceList, error) { - obj, err := c.Fake.Invokes(NewListAction("services", c.Namespace, opts), &api.ServiceList{}) - if obj == nil { - return nil, err - } - - return obj.(*api.ServiceList), err -} - -func (c *FakeServices) Create(service *api.Service) (*api.Service, error) { - obj, err := c.Fake.Invokes(NewCreateAction("services", c.Namespace, service), service) - if obj == nil { - return nil, err - } - - return obj.(*api.Service), err -} - -func (c *FakeServices) Update(service *api.Service) (*api.Service, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("services", c.Namespace, service), service) - if obj == nil { - return nil, err - } - - return obj.(*api.Service), err -} - -func (c *FakeServices) UpdateStatus(service *api.Service) (result *api.Service, err error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("services", "status", c.Namespace, service), service) - if obj == nil { - return nil, err - } - - return obj.(*api.Service), err -} - -func (c *FakeServices) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("services", c.Namespace, name), &api.Service{}) - return err -} - -func (c *FakeServices) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("services", c.Namespace, opts)) -} - -func (c *FakeServices) ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper { - return c.Fake.InvokesProxy(NewProxyGetAction("services", c.Namespace, scheme, name, port, path, params)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_test.go deleted file mode 100644 index 303d6d786..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_test.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "testing" - - client "k8s.io/kubernetes/pkg/client/unversioned" -) - -// This test file just ensures that Fake and structs it is embedded in -// implement Interface. - -func TestFakeImplementsInterface(t *testing.T) { - _ = client.Interface(&Fake{}) -} - -type MyFake struct { - *Fake -} - -func TestEmbeddedFakeImplementsInterface(t *testing.T) { - _ = client.Interface(MyFake{&Fake{}}) - _ = client.Interface(&MyFake{&Fake{}}) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_thirdpartyresources.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_thirdpartyresources.go deleted file mode 100644 index cb4a15572..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fake_thirdpartyresources.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - kclientlib "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/watch" -) - -// FakeThirdPartyResources implements ThirdPartyResourceInterface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type FakeThirdPartyResources struct { - Fake *FakeExperimental -} - -// Ensure statically that FakeThirdPartyResources implements DaemonInterface. -var _ kclientlib.ThirdPartyResourceInterface = &FakeThirdPartyResources{} - -func (c *FakeThirdPartyResources) Get(name string) (*extensions.ThirdPartyResource, error) { - obj, err := c.Fake.Invokes(NewGetAction("thirdpartyresources", "", name), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) List(opts api.ListOptions) (*extensions.ThirdPartyResourceList, error) { - obj, err := c.Fake.Invokes(NewListAction("thirdpartyresources", "", opts), &extensions.ThirdPartyResourceList{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResourceList), err -} - -func (c *FakeThirdPartyResources) Create(daemon *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error) { - obj, err := c.Fake.Invokes(NewCreateAction("thirdpartyresources", "", daemon), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) Update(daemon *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error) { - obj, err := c.Fake.Invokes(NewUpdateAction("thirdpartyresources", "", daemon), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) UpdateStatus(daemon *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error) { - obj, err := c.Fake.Invokes(NewUpdateSubresourceAction("thirdpartyresources", "status", "", daemon), &extensions.ThirdPartyResource{}) - if obj == nil { - return nil, err - } - return obj.(*extensions.ThirdPartyResource), err -} - -func (c *FakeThirdPartyResources) Delete(name string) error { - _, err := c.Fake.Invokes(NewDeleteAction("thirdpartyresources", "", name), &extensions.ThirdPartyResource{}) - return err -} - -func (c *FakeThirdPartyResources) Watch(opts api.ListOptions) (watch.Interface, error) { - return c.Fake.InvokesWatch(NewWatchAction("thirdpartyresources", "", opts)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fixture.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fixture.go deleted file mode 100644 index bb02e96d1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/fixture.go +++ /dev/null @@ -1,313 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "fmt" - "io/ioutil" - "reflect" - "strings" - - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/yaml" - "k8s.io/kubernetes/pkg/watch" -) - -// ObjectRetriever abstracts the implementation for retrieving or setting generic -// objects. It is intended to be used to fake calls to a server by returning -// objects based on their kind and name. -type ObjectRetriever interface { - // Kind should return a resource or a list of resources (depending on the provided kind and - // name). It should return an error if the caller should communicate an error to the server. - Kind(gvk unversioned.GroupVersionKind, name string) (runtime.Object, error) - // Add adds a runtime object for test purposes into this object. - Add(runtime.Object) error -} - -// ObjectScheme abstracts the implementation of common operations on objects. -type ObjectScheme interface { - runtime.ObjectCreater - runtime.ObjectCopier - runtime.ObjectTyper -} - -// ObjectReaction returns a ReactionFunc that takes a generic action string of the form -// - or -- and attempts to return a runtime -// Object or error that matches the requested action. For instance, list-replicationControllers -// should attempt to return a list of replication controllers. This method delegates to the -// ObjectRetriever interface to satisfy retrieval of lists or retrieval of single items. -// TODO: add support for sub resources -func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc { - - return func(action Action) (bool, runtime.Object, error) { - kind, err := mapper.KindFor(unversioned.GroupVersionResource{Resource: action.GetResource()}) - if err != nil { - return false, nil, fmt.Errorf("unrecognized action %s: %v", action.GetResource(), err) - } - - // TODO: have mapper return a Kind for a subresource? - switch castAction := action.(type) { - case ListAction: - kind.Kind += "List" - resource, err := o.Kind(kind, "") - return true, resource, err - - case GetAction: - resource, err := o.Kind(kind, castAction.GetName()) - return true, resource, err - - case DeleteAction: - resource, err := o.Kind(kind, castAction.GetName()) - return true, resource, err - - case CreateAction: - accessor, err := meta.Accessor(castAction.GetObject()) - if err != nil { - return true, nil, err - } - resource, err := o.Kind(kind, accessor.GetName()) - return true, resource, err - - case UpdateAction: - accessor, err := meta.Accessor(castAction.GetObject()) - if err != nil { - return true, nil, err - } - resource, err := o.Kind(kind, accessor.GetName()) - return true, resource, err - - default: - return false, nil, fmt.Errorf("no reaction implemented for %s", action) - } - } -} - -// AddObjectsFromPath loads the JSON or YAML file containing Kubernetes API resources -// and adds them to the provided ObjectRetriever. -func AddObjectsFromPath(path string, o ObjectRetriever, decoder runtime.Decoder) error { - data, err := ioutil.ReadFile(path) - if err != nil { - return err - } - data, err = yaml.ToJSON(data) - if err != nil { - return err - } - obj, err := runtime.Decode(decoder, data) - if err != nil { - return err - } - if err := o.Add(obj); err != nil { - return err - } - return nil -} - -type objects struct { - types map[string][]runtime.Object - last map[string]int - scheme ObjectScheme - decoder runtime.Decoder -} - -var _ ObjectRetriever = &objects{} - -// NewObjects implements the ObjectRetriever interface by introspecting the -// objects provided to Add() and returning them when the Kind method is invoked. -// If an api.List object is provided to Add(), each child item is added. If an -// object is added that is itself a list (PodList, ServiceList) then that is added -// to the "PodList" kind. If no PodList is added, the retriever will take any loaded -// Pods and return them in a list. If an api.Status is added, and the Details.Kind field -// is set, that status will be returned instead (as an error if Status != Success, or -// as a runtime.Object if Status == Success). If multiple PodLists are provided, they -// will be returned in order by the Kind call, and the last PodList will be reused for -// subsequent calls. -func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever { - return objects{ - types: make(map[string][]runtime.Object), - last: make(map[string]int), - scheme: scheme, - decoder: decoder, - } -} - -func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) { - kind.Version = runtime.APIVersionInternal - - empty, _ := o.scheme.New(kind) - nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object) - - arr, ok := o.types[kind.Kind] - if !ok { - if strings.HasSuffix(kind.Kind, "List") { - itemKind := kind.Kind[:len(kind.Kind)-4] - arr, ok := o.types[itemKind] - if !ok { - return empty, nil - } - out, err := o.scheme.New(kind) - if err != nil { - return nilValue, err - } - if err := meta.SetList(out, arr); err != nil { - return nilValue, err - } - if out, err = o.scheme.Copy(out); err != nil { - return nilValue, err - } - return out, nil - } - return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) - } - - index := o.last[kind.Kind] - if index >= len(arr) { - index = len(arr) - 1 - } - if index < 0 { - return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) - } - out, err := o.scheme.Copy(arr[index]) - if err != nil { - return nilValue, err - } - o.last[kind.Kind] = index + 1 - - if status, ok := out.(*unversioned.Status); ok { - if status.Details != nil { - status.Details.Kind = kind.Kind - } - if status.Status != unversioned.StatusSuccess { - return nilValue, &errors.StatusError{ErrStatus: *status} - } - } - - return out, nil -} - -func (o objects) Add(obj runtime.Object) error { - gvk, err := o.scheme.ObjectKind(obj) - if err != nil { - return err - } - kind := gvk.Kind - - switch { - case meta.IsListType(obj): - if kind != "List" { - o.types[kind] = append(o.types[kind], obj) - } - - list, err := meta.ExtractList(obj) - if err != nil { - return err - } - if errs := runtime.DecodeList(list, o.decoder); len(errs) > 0 { - return errs[0] - } - for _, obj := range list { - if err := o.Add(obj); err != nil { - return err - } - } - default: - if status, ok := obj.(*unversioned.Status); ok && status.Details != nil { - kind = status.Details.Kind - } - o.types[kind] = append(o.types[kind], obj) - } - - return nil -} - -func DefaultWatchReactor(watchInterface watch.Interface, err error) WatchReactionFunc { - return func(action Action) (bool, watch.Interface, error) { - return true, watchInterface, err - } -} - -// SimpleReactor is a Reactor. Each reaction function is attached to a given verb,resource tuple. "*" in either field matches everything for that value. -// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions -type SimpleReactor struct { - Verb string - Resource string - - Reaction ReactionFunc -} - -func (r *SimpleReactor) Handles(action Action) bool { - verbCovers := r.Verb == "*" || r.Verb == action.GetVerb() - if !verbCovers { - return false - } - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource() - if !resourceCovers { - return false - } - - return true -} - -func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) { - return r.Reaction(action) -} - -// SimpleWatchReactor is a WatchReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. -// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions -type SimpleWatchReactor struct { - Resource string - - Reaction WatchReactionFunc -} - -func (r *SimpleWatchReactor) Handles(action Action) bool { - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource() - if !resourceCovers { - return false - } - - return true -} - -func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) { - return r.Reaction(action) -} - -// SimpleProxyReactor is a ProxyReactor. Each reaction function is attached to a given resource. "*" matches everything for that value. -// For instance, *,pods matches all verbs on pods. This allows for easier composition of reaction functions. -type SimpleProxyReactor struct { - Resource string - - Reaction ProxyReactionFunc -} - -func (r *SimpleProxyReactor) Handles(action Action) bool { - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource() - if !resourceCovers { - return false - } - - return true -} - -func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { - return r.Reaction(action) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/simple/simple_testclient.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/simple/simple_testclient.go deleted file mode 100644 index b35a34427..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/simple/simple_testclient.go +++ /dev/null @@ -1,244 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 simple - -import ( - "net/http/httptest" - "net/url" - "path" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - utiltesting "k8s.io/kubernetes/pkg/util/testing" -) - -const NameRequiredError = "resource name may not be empty" - -type Request struct { - Method string - Path string - Header string - Query url.Values - Body runtime.Object - RawBody *string -} - -type Response struct { - StatusCode int - Body runtime.Object - RawBody *string -} - -type Client struct { - *client.Client - Clientset *clientset.Clientset - Request Request - Response Response - Error bool - Created bool - server *httptest.Server - handler *utiltesting.FakeHandler - // For query args, an optional function to validate the contents - // useful when the contents can change but still be correct. - // Maps from query arg key to validator. - // If no validator is present, string equality is used. - QueryValidator map[string]func(string, string) bool - - // If your object could exist in multiple groups, set this to - // correspond to the URL you're testing it with. - ResourceGroup string -} - -func (c *Client) Setup(t *testing.T) *Client { - c.handler = &utiltesting.FakeHandler{ - StatusCode: c.Response.StatusCode, - } - if responseBody := c.body(t, c.Response.Body, c.Response.RawBody); responseBody != nil { - c.handler.ResponseBody = *responseBody - } - c.server = httptest.NewServer(c.handler) - if c.Client == nil { - c.Client = client.NewOrDie(&restclient.Config{ - Host: c.server.URL, - ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}, - }) - - // TODO: caesarxuchao: hacky way to specify version of Experimental client. - // We will fix this by supporting multiple group versions in Config - c.AutoscalingClient = client.NewAutoscalingOrDie(&restclient.Config{ - Host: c.server.URL, - ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Autoscaling.GroupVersion()}, - }) - c.BatchClient = client.NewBatchOrDie(&restclient.Config{ - Host: c.server.URL, - ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Batch.GroupVersion()}, - }) - c.ExtensionsClient = client.NewExtensionsOrDie(&restclient.Config{ - Host: c.server.URL, - ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Extensions.GroupVersion()}, - }) - - c.Clientset = clientset.NewForConfigOrDie(&restclient.Config{Host: c.server.URL}) - } - c.QueryValidator = map[string]func(string, string) bool{} - return c -} - -func (c *Client) Close() { - if c.server != nil { - c.server.Close() - } -} - -func (c *Client) ServerURL() string { - return c.server.URL -} - -func (c *Client) Validate(t *testing.T, received runtime.Object, err error) { - c.ValidateCommon(t, err) - - if c.Response.Body != nil && !api.Semantic.DeepDerivative(c.Response.Body, received) { - t.Errorf("bad response for request %#v: \nexpected %#v\ngot %#v\n", c.Request, c.Response.Body, received) - } -} - -func (c *Client) ValidateRaw(t *testing.T, received []byte, err error) { - c.ValidateCommon(t, err) - - if c.Response.Body != nil && !reflect.DeepEqual(c.Response.Body, received) { - t.Errorf("bad response for request %#v: expected %#v, got %#v", c.Request, c.Response.Body, received) - } -} - -func (c *Client) ValidateCommon(t *testing.T, err error) { - if c.Error { - if err == nil { - t.Errorf("error expected for %#v, got none", c.Request) - } - return - } - if err != nil { - t.Errorf("no error expected for %#v, got: %v", c.Request, err) - } - - if c.handler.RequestReceived == nil { - t.Errorf("handler had an empty request, %#v", c) - return - } - - requestBody := c.body(t, c.Request.Body, c.Request.RawBody) - actualQuery := c.handler.RequestReceived.URL.Query() - t.Logf("got query: %v", actualQuery) - t.Logf("path: %v", c.Request.Path) - // We check the query manually, so blank it out so that FakeHandler.ValidateRequest - // won't check it. - c.handler.RequestReceived.URL.RawQuery = "" - c.handler.ValidateRequest(t, path.Join(c.Request.Path), c.Request.Method, requestBody) - for key, values := range c.Request.Query { - validator, ok := c.QueryValidator[key] - if !ok { - switch key { - case unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()): - validator = ValidateLabels - case unversioned.FieldSelectorQueryParam(testapi.Default.GroupVersion().String()): - validator = validateFields - default: - validator = func(a, b string) bool { return a == b } - } - } - observed := actualQuery.Get(key) - wanted := strings.Join(values, "") - if !validator(wanted, observed) { - t.Errorf("Unexpected query arg for key: %s. Expected %s, Received %s", key, wanted, observed) - } - } - if c.Request.Header != "" { - if c.handler.RequestReceived.Header.Get(c.Request.Header) == "" { - t.Errorf("header %q not found in request %#v", c.Request.Header, c.handler.RequestReceived) - } - } - - if expected, received := requestBody, c.handler.RequestBody; expected != nil && *expected != received { - t.Errorf("bad body for request %#v: expected %s, got %s", c.Request, *expected, received) - } -} - -// buildQueryValues is a convenience function for knowing if a namespace should be in a query param or not -func BuildQueryValues(query url.Values) url.Values { - v := url.Values{} - if query != nil { - for key, values := range query { - for _, value := range values { - v.Add(key, value) - } - } - } - return v -} - -func ValidateLabels(a, b string) bool { - sA, eA := labels.Parse(a) - if eA != nil { - return false - } - sB, eB := labels.Parse(b) - if eB != nil { - return false - } - return sA.String() == sB.String() -} - -func validateFields(a, b string) bool { - sA, _ := fields.ParseSelector(a) - sB, _ := fields.ParseSelector(b) - return sA.String() == sB.String() -} - -func (c *Client) body(t *testing.T, obj runtime.Object, raw *string) *string { - if obj != nil { - fqKind, err := api.Scheme.ObjectKind(obj) - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - } - groupName := fqKind.GroupVersion().Group - if c.ResourceGroup != "" { - groupName = c.ResourceGroup - } - var bs []byte - g, found := testapi.Groups[groupName] - if !found { - t.Errorf("Group %s is not registered in testapi", groupName) - } - bs, err = runtime.Encode(g.Codec(), obj) - if err != nil { - t.Errorf("unexpected encoding error: %v", err) - } - body := string(bs) - return &body - } - return raw -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient.go deleted file mode 100644 index 258a0f5af..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient.go +++ /dev/null @@ -1,419 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "fmt" - "sync" - - "github.com/emicklei/go-restful/swagger" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/typed/discovery" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/version" - "k8s.io/kubernetes/pkg/watch" -) - -// NewSimpleFake returns a client that will respond with the provided objects -func NewSimpleFake(objects ...runtime.Object) *Fake { - o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder()) - for _, obj := range objects { - if err := o.Add(obj); err != nil { - panic(err) - } - } - - fakeClient := &Fake{} - fakeClient.AddReactor("*", "*", ObjectReaction(o, registered.RESTMapper())) - - fakeClient.AddWatchReactor("*", DefaultWatchReactor(watch.NewFake(), nil)) - - return fakeClient -} - -// Fake implements client.Interface. Meant to be embedded into a struct to get a default -// implementation. This makes faking out just the method you want to test easier. -type Fake struct { - sync.RWMutex - actions []Action // these may be castable to other types, but "Action" is the minimum - - // ReactionChain is the list of reactors that will be attempted for every request in the order they are tried - ReactionChain []Reactor - // WatchReactionChain is the list of watch reactors that will be attempted for every request in the order they are tried - WatchReactionChain []WatchReactor - // ProxyReactionChain is the list of proxy reactors that will be attempted for every request in the order they are tried - ProxyReactionChain []ProxyReactor - - Resources map[string]*unversioned.APIResourceList -} - -// Reactor is an interface to allow the composition of reaction functions. -type Reactor interface { - // Handles indicates whether or not this Reactor deals with a given action - Handles(action Action) bool - // React handles the action and returns results. It may choose to delegate by indicated handled=false - React(action Action) (handled bool, ret runtime.Object, err error) -} - -// WatchReactor is an interface to allow the composition of watch functions. -type WatchReactor interface { - // Handles indicates whether or not this Reactor deals with a given action - Handles(action Action) bool - // React handles a watch action and returns results. It may choose to delegate by indicated handled=false - React(action Action) (handled bool, ret watch.Interface, err error) -} - -// ProxyReactor is an interface to allow the composition of proxy get functions. -type ProxyReactor interface { - // Handles indicates whether or not this Reactor deals with a given action - Handles(action Action) bool - // React handles a watch action and returns results. It may choose to delegate by indicated handled=false - React(action Action) (handled bool, ret restclient.ResponseWrapper, err error) -} - -// ReactionFunc is a function that returns an object or error for a given Action. If "handled" is false, -// then the test client will continue ignore the results and continue to the next ReactionFunc -type ReactionFunc func(action Action) (handled bool, ret runtime.Object, err error) - -// WatchReactionFunc is a function that returns a watch interface. If "handled" is false, -// then the test client will continue ignore the results and continue to the next ReactionFunc -type WatchReactionFunc func(action Action) (handled bool, ret watch.Interface, err error) - -// ProxyReactionFunc is a function that returns a ResponseWrapper interface for a given Action. If "handled" is false, -// then the test client will continue ignore the results and continue to the next ProxyReactionFunc -type ProxyReactionFunc func(action Action) (handled bool, ret restclient.ResponseWrapper, err error) - -// AddReactor appends a reactor to the end of the chain -func (c *Fake) AddReactor(verb, resource string, reaction ReactionFunc) { - c.ReactionChain = append(c.ReactionChain, &SimpleReactor{verb, resource, reaction}) -} - -// PrependReactor adds a reactor to the beginning of the chain -func (c *Fake) PrependReactor(verb, resource string, reaction ReactionFunc) { - c.ReactionChain = append([]Reactor{&SimpleReactor{verb, resource, reaction}}, c.ReactionChain...) -} - -// AddWatchReactor appends a reactor to the end of the chain -func (c *Fake) AddWatchReactor(resource string, reaction WatchReactionFunc) { - c.WatchReactionChain = append(c.WatchReactionChain, &SimpleWatchReactor{resource, reaction}) -} - -// PrependWatchReactor adds a reactor to the beginning of the chain -func (c *Fake) PrependWatchReactor(resource string, reaction WatchReactionFunc) { - c.WatchReactionChain = append([]WatchReactor{&SimpleWatchReactor{resource, reaction}}, c.WatchReactionChain...) -} - -// AddProxyReactor appends a reactor to the end of the chain -func (c *Fake) AddProxyReactor(resource string, reaction ProxyReactionFunc) { - c.ProxyReactionChain = append(c.ProxyReactionChain, &SimpleProxyReactor{resource, reaction}) -} - -// PrependProxyReactor adds a reactor to the beginning of the chain -func (c *Fake) PrependProxyReactor(resource string, reaction ProxyReactionFunc) { - c.ProxyReactionChain = append([]ProxyReactor{&SimpleProxyReactor{resource, reaction}}, c.ProxyReactionChain...) -} - -// Invokes records the provided Action and then invokes the ReactFn (if provided). -// defaultReturnObj is expected to be of the same type a normal call would return. -func (c *Fake) Invokes(action Action, defaultReturnObj runtime.Object) (runtime.Object, error) { - c.Lock() - defer c.Unlock() - - c.actions = append(c.actions, action) - for _, reactor := range c.ReactionChain { - if !reactor.Handles(action) { - continue - } - - handled, ret, err := reactor.React(action) - if !handled { - continue - } - - return ret, err - } - - return defaultReturnObj, nil -} - -// InvokesWatch records the provided Action and then invokes the ReactFn (if provided). -func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { - c.Lock() - defer c.Unlock() - - c.actions = append(c.actions, action) - for _, reactor := range c.WatchReactionChain { - if !reactor.Handles(action) { - continue - } - - handled, ret, err := reactor.React(action) - if !handled { - continue - } - - return ret, err - } - - return nil, fmt.Errorf("unhandled watch: %#v", action) -} - -// InvokesProxy records the provided Action and then invokes the ReactFn (if provided). -func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { - c.Lock() - defer c.Unlock() - - c.actions = append(c.actions, action) - for _, reactor := range c.ProxyReactionChain { - if !reactor.Handles(action) { - continue - } - - handled, ret, err := reactor.React(action) - if !handled || err != nil { - continue - } - - return ret - } - - return nil -} - -// ClearActions clears the history of actions called on the fake client -func (c *Fake) ClearActions() { - c.Lock() - c.Unlock() - - c.actions = make([]Action, 0) -} - -// Actions returns a chronologically ordered slice fake actions called on the fake client -func (c *Fake) Actions() []Action { - c.RLock() - defer c.RUnlock() - fa := make([]Action, len(c.actions)) - copy(fa, c.actions) - return fa -} - -func (c *Fake) LimitRanges(namespace string) client.LimitRangeInterface { - return &FakeLimitRanges{Fake: c, Namespace: namespace} -} - -func (c *Fake) ResourceQuotas(namespace string) client.ResourceQuotaInterface { - return &FakeResourceQuotas{Fake: c, Namespace: namespace} -} - -func (c *Fake) ReplicationControllers(namespace string) client.ReplicationControllerInterface { - return &FakeReplicationControllers{Fake: c, Namespace: namespace} -} - -func (c *Fake) Nodes() client.NodeInterface { - return &FakeNodes{Fake: c} -} - -func (c *Fake) PodSecurityPolicies() client.PodSecurityPolicyInterface { - return &FakePodSecurityPolicy{Fake: c} -} - -func (c *Fake) Events(namespace string) client.EventInterface { - return &FakeEvents{Fake: c, Namespace: namespace} -} - -func (c *Fake) Endpoints(namespace string) client.EndpointsInterface { - return &FakeEndpoints{Fake: c, Namespace: namespace} -} - -func (c *Fake) PersistentVolumes() client.PersistentVolumeInterface { - return &FakePersistentVolumes{Fake: c} -} - -func (c *Fake) PersistentVolumeClaims(namespace string) client.PersistentVolumeClaimInterface { - return &FakePersistentVolumeClaims{Fake: c, Namespace: namespace} -} - -func (c *Fake) Pods(namespace string) client.PodInterface { - return &FakePods{Fake: c, Namespace: namespace} -} - -func (c *Fake) PodTemplates(namespace string) client.PodTemplateInterface { - return &FakePodTemplates{Fake: c, Namespace: namespace} -} - -func (c *Fake) Services(namespace string) client.ServiceInterface { - return &FakeServices{Fake: c, Namespace: namespace} -} - -func (c *Fake) ServiceAccounts(namespace string) client.ServiceAccountsInterface { - return &FakeServiceAccounts{Fake: c, Namespace: namespace} -} - -func (c *Fake) Secrets(namespace string) client.SecretsInterface { - return &FakeSecrets{Fake: c, Namespace: namespace} -} - -func (c *Fake) Namespaces() client.NamespaceInterface { - return &FakeNamespaces{Fake: c} -} - -func (c *Fake) Autoscaling() client.AutoscalingInterface { - return &FakeAutoscaling{c} -} - -func (c *Fake) Batch() client.BatchInterface { - return &FakeBatch{c} -} - -func (c *Fake) Extensions() client.ExtensionsInterface { - return &FakeExperimental{c} -} - -func (c *Fake) Discovery() discovery.DiscoveryInterface { - return &FakeDiscovery{c} -} - -func (c *Fake) ComponentStatuses() client.ComponentStatusInterface { - return &FakeComponentStatuses{Fake: c} -} - -func (c *Fake) ConfigMaps(namespace string) client.ConfigMapsInterface { - return &FakeConfigMaps{Fake: c, Namespace: namespace} -} - -// SwaggerSchema returns an empty swagger.ApiDeclaration for testing -func (c *Fake) SwaggerSchema(version unversioned.GroupVersion) (*swagger.ApiDeclaration, error) { - action := ActionImpl{} - action.Verb = "get" - if version == v1.SchemeGroupVersion { - action.Resource = "/swaggerapi/api/" + version.Version - } else { - action.Resource = "/swaggerapi/apis/" + version.Group + "/" + version.Version - } - - c.Invokes(action, nil) - return &swagger.ApiDeclaration{}, nil -} - -// NewSimpleFakeAutoscaling returns a client that will respond with the provided objects -func NewSimpleFakeAutoscaling(objects ...runtime.Object) *FakeAutoscaling { - return &FakeAutoscaling{Fake: NewSimpleFake(objects...)} -} - -type FakeAutoscaling struct { - *Fake -} - -func (c *FakeAutoscaling) HorizontalPodAutoscalers(namespace string) client.HorizontalPodAutoscalerInterface { - return &FakeHorizontalPodAutoscalersV1{Fake: c, Namespace: namespace} -} - -// NewSimpleFakeBatch returns a client that will respond with the provided objects -func NewSimpleFakeBatch(objects ...runtime.Object) *FakeBatch { - return &FakeBatch{Fake: NewSimpleFake(objects...)} -} - -type FakeBatch struct { - *Fake -} - -func (c *FakeBatch) Jobs(namespace string) client.JobInterface { - return &FakeJobsV1{Fake: c, Namespace: namespace} -} - -// NewSimpleFakeExp returns a client that will respond with the provided objects -func NewSimpleFakeExp(objects ...runtime.Object) *FakeExperimental { - return &FakeExperimental{Fake: NewSimpleFake(objects...)} -} - -type FakeExperimental struct { - *Fake -} - -func (c *FakeExperimental) DaemonSets(namespace string) client.DaemonSetInterface { - return &FakeDaemonSets{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) HorizontalPodAutoscalers(namespace string) client.HorizontalPodAutoscalerInterface { - return &FakeHorizontalPodAutoscalers{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) Deployments(namespace string) client.DeploymentInterface { - return &FakeDeployments{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) Scales(namespace string) client.ScaleInterface { - return &FakeScales{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) Jobs(namespace string) client.JobInterface { - return &FakeJobs{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) Ingress(namespace string) client.IngressInterface { - return &FakeIngress{Fake: c, Namespace: namespace} -} - -func (c *FakeExperimental) ThirdPartyResources() client.ThirdPartyResourceInterface { - return &FakeThirdPartyResources{Fake: c} -} - -func (c *FakeExperimental) ReplicaSets(namespace string) client.ReplicaSetInterface { - return &FakeReplicaSets{Fake: c, Namespace: namespace} -} - -type FakeDiscovery struct { - *Fake -} - -func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*unversioned.APIResourceList, error) { - action := ActionImpl{ - Verb: "get", - Resource: "resource", - } - c.Invokes(action, nil) - return c.Resources[groupVersion], nil -} - -func (c *FakeDiscovery) ServerResources() (map[string]*unversioned.APIResourceList, error) { - action := ActionImpl{ - Verb: "get", - Resource: "resource", - } - c.Invokes(action, nil) - return c.Resources, nil -} - -func (c *FakeDiscovery) ServerGroups() (*unversioned.APIGroupList, error) { - return nil, nil -} - -func (c *FakeDiscovery) ServerVersion() (*version.Info, error) { - action := ActionImpl{} - action.Verb = "get" - action.Resource = "version" - - c.Invokes(action, nil) - versionInfo := version.Get() - return &versionInfo, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient_test.go deleted file mode 100644 index b31bdc213..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/testclient/testclient_test.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testclient - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestNewClient(t *testing.T) { - o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder()) - if err := AddObjectsFromPath("../../../../examples/guestbook/frontend-service.yaml", o, api.Codecs.UniversalDecoder()); err != nil { - t.Fatal(err) - } - client := &Fake{} - client.AddReactor("*", "*", ObjectReaction(o, testapi.Default.RESTMapper())) - list, err := client.Services("test").List(api.ListOptions{}) - if err != nil { - t.Fatal(err) - } - if len(list.Items) != 1 { - t.Fatalf("unexpected list %#v", list) - } - - // When list is invoked a second time, the same results are returned. - list, err = client.Services("test").List(api.ListOptions{}) - if err != nil { - t.Fatal(err) - } - if len(list.Items) != 1 { - t.Fatalf("unexpected list %#v", list) - } - t.Logf("list: %#v", list) -} - -func TestErrors(t *testing.T) { - o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder()) - o.Add(&api.List{ - Items: []runtime.Object{ - // This first call to List will return this error - &(errors.NewNotFound(api.Resource("ServiceList"), "").(*errors.StatusError).ErrStatus), - // The second call to List will return this error - &(errors.NewForbidden(api.Resource("ServiceList"), "", nil).(*errors.StatusError).ErrStatus), - }, - }) - client := &Fake{} - client.AddReactor("*", "*", ObjectReaction(o, testapi.Default.RESTMapper())) - _, err := client.Services("test").List(api.ListOptions{}) - if !errors.IsNotFound(err) { - t.Fatalf("unexpected error: %v", err) - } - t.Logf("error: %#v", err.(*errors.StatusError).Status()) - _, err = client.Services("test").List(api.ListOptions{}) - if !errors.IsForbidden(err) { - t.Fatalf("unexpected error: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources_test.go deleted file mode 100644 index 266ff4ae8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources_test.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 unversioned_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/testclient/simple" -) - -func getThirdPartyResourceName() string { - return "thirdpartyresources" -} - -func TestListThirdPartyResources(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{ - Method: "GET", - Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", ""), - }, - Response: simple.Response{StatusCode: 200, - Body: &extensions.ThirdPartyResourceList{ - Items: []extensions.ThirdPartyResource{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Description: "test third party resource", - }, - }, - }, - }, - } - receivedDSs, err := c.Setup(t).Extensions().ThirdPartyResources().List(api.ListOptions{}) - defer c.Close() - c.Validate(t, receivedDSs, err) - -} - -func TestGetThirdPartyResource(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{Method: "GET", Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Description: "test third party resource", - }, - }, - } - receivedThirdPartyResource, err := c.Setup(t).Extensions().ThirdPartyResources().Get("foo") - defer c.Close() - c.Validate(t, receivedThirdPartyResource, err) -} - -func TestGetThirdPartyResourceWithNoName(t *testing.T) { - c := &simple.Client{Error: true} - receivedPod, err := c.Setup(t).Extensions().ThirdPartyResources().Get("") - defer c.Close() - if (err != nil) && (err.Error() != simple.NameRequiredError) { - t.Errorf("Expected error: %v, but got %v", simple.NameRequiredError, err) - } - - c.Validate(t, receivedPod, err) -} - -func TestUpdateThirdPartyResource(t *testing.T) { - requestThirdPartyResource := &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Description: "test third party resource", - }, - }, - } - receivedThirdPartyResource, err := c.Setup(t).Extensions().ThirdPartyResources().Update(requestThirdPartyResource) - defer c.Close() - c.Validate(t, receivedThirdPartyResource, err) -} - -func TestUpdateThirdPartyResourceUpdateStatus(t *testing.T) { - requestThirdPartyResource := &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "PUT", Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", "foo") + "/status", Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Description: "test third party resource", - }, - }, - } - receivedThirdPartyResource, err := c.Setup(t).Extensions().ThirdPartyResources().UpdateStatus(requestThirdPartyResource) - defer c.Close() - c.Validate(t, receivedThirdPartyResource, err) -} - -func TestDeleteThirdPartyResource(t *testing.T) { - c := &simple.Client{ - Request: simple.Request{Method: "DELETE", Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", "foo"), Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{StatusCode: 200}, - } - err := c.Setup(t).Extensions().ThirdPartyResources().Delete("foo") - defer c.Close() - c.Validate(t, nil, err) -} - -func TestCreateThirdPartyResource(t *testing.T) { - requestThirdPartyResource := &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - c := &simple.Client{ - Request: simple.Request{Method: "POST", Path: testapi.Extensions.ResourcePath(getThirdPartyResourceName(), "", ""), Body: requestThirdPartyResource, Query: simple.BuildQueryValues(nil)}, - Response: simple.Response{ - StatusCode: 200, - Body: &extensions.ThirdPartyResource{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{ - "foo": "bar", - "name": "baz", - }, - }, - Description: "test third party resource", - }, - }, - } - receivedThirdPartyResource, err := c.Setup(t).Extensions().ThirdPartyResources().Create(requestThirdPartyResource) - defer c.Close() - c.Validate(t, receivedThirdPartyResource, err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/OWNERS b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/OWNERS deleted file mode 100644 index 3c625f946..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -assignees: - - justinsb diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws.go deleted file mode 100644 index e0cae84b4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws.go +++ /dev/null @@ -1,2725 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "errors" - "fmt" - "io" - "net" - "net/url" - "os" - "regexp" - "strings" - "sync" - "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/credentials/ec2rolecreds" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/autoscaling" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/elb" - "gopkg.in/gcfg.v1" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/credentialprovider/aws" - "k8s.io/kubernetes/pkg/types" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api/service" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -const ProviderName = "aws" - -// The tag name we use to differentiate multiple logically independent clusters running in the same AZ -const TagNameKubernetesCluster = "KubernetesCluster" - -// The tag name we use to differentiate multiple services. Used currently for ELBs only. -const TagNameKubernetesService = "kubernetes.io/service-name" - -// The tag name used on a subnet to designate that it should be used for internal ELBs -const TagNameSubnetInternalELB = "kubernetes.io/role/internal-elb" - -// The tag name used on a subnet to designate that it should be used for internet ELBs -const TagNameSubnetPublicELB = "kubernetes.io/role/elb" - -// Annotation used on the service to indicate that we want an internal ELB. -// Currently we accept only the value "0.0.0.0/0" - other values are an error. -// This lets us define more advanced semantics in future. -const ServiceAnnotationLoadBalancerInternal = "service.beta.kubernetes.io/aws-load-balancer-internal" - -// We sometimes read to see if something exists; then try to create it if we didn't find it -// This can fail once in a consistent system if done in parallel -// In an eventually consistent system, it could fail unboundedly -// MaxReadThenCreateRetries sets the maximum number of attempts we will make -const MaxReadThenCreateRetries = 30 - -// Default volume type for newly created Volumes -// TODO: Remove when user/admin can configure volume types and thus we don't -// need hardcoded defaults. -const DefaultVolumeType = "gp2" - -// Amazon recommends having no more that 40 volumes attached to an instance, -// and at least one of those is for the system root volume. -// See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html#linux-specific-volume-limits -const DefaultMaxEBSVolumes = 39 - -// Used to call aws_credentials.Init() just once -var once sync.Once - -// Abstraction over AWS, to allow mocking/other implementations -type AWSServices interface { - Compute(region string) (EC2, error) - LoadBalancing(region string) (ELB, error) - Autoscaling(region string) (ASG, error) - Metadata() (EC2Metadata, error) -} - -// TODO: Should we rename this to AWS (EBS & ELB are not technically part of EC2) -// Abstraction over EC2, to allow mocking/other implementations -// Note that the DescribeX functions return a list, so callers don't need to deal with paging -type EC2 interface { - // Query EC2 for instances matching the filter - DescribeInstances(request *ec2.DescribeInstancesInput) ([]*ec2.Instance, error) - - // Attach a volume to an instance - AttachVolume(*ec2.AttachVolumeInput) (*ec2.VolumeAttachment, error) - // Detach a volume from an instance it is attached to - DetachVolume(request *ec2.DetachVolumeInput) (resp *ec2.VolumeAttachment, err error) - // Lists volumes - DescribeVolumes(request *ec2.DescribeVolumesInput) ([]*ec2.Volume, error) - // Create an EBS volume - CreateVolume(request *ec2.CreateVolumeInput) (resp *ec2.Volume, err error) - // Delete an EBS volume - DeleteVolume(*ec2.DeleteVolumeInput) (*ec2.DeleteVolumeOutput, error) - - DescribeSecurityGroups(request *ec2.DescribeSecurityGroupsInput) ([]*ec2.SecurityGroup, error) - - CreateSecurityGroup(*ec2.CreateSecurityGroupInput) (*ec2.CreateSecurityGroupOutput, error) - DeleteSecurityGroup(request *ec2.DeleteSecurityGroupInput) (*ec2.DeleteSecurityGroupOutput, error) - - AuthorizeSecurityGroupIngress(*ec2.AuthorizeSecurityGroupIngressInput) (*ec2.AuthorizeSecurityGroupIngressOutput, error) - RevokeSecurityGroupIngress(*ec2.RevokeSecurityGroupIngressInput) (*ec2.RevokeSecurityGroupIngressOutput, error) - - DescribeSubnets(*ec2.DescribeSubnetsInput) ([]*ec2.Subnet, error) - - CreateTags(*ec2.CreateTagsInput) (*ec2.CreateTagsOutput, error) - - DescribeRouteTables(request *ec2.DescribeRouteTablesInput) ([]*ec2.RouteTable, error) - CreateRoute(request *ec2.CreateRouteInput) (*ec2.CreateRouteOutput, error) - DeleteRoute(request *ec2.DeleteRouteInput) (*ec2.DeleteRouteOutput, error) - - ModifyInstanceAttribute(request *ec2.ModifyInstanceAttributeInput) (*ec2.ModifyInstanceAttributeOutput, error) -} - -// This is a simple pass-through of the ELB client interface, which allows for testing -type ELB interface { - CreateLoadBalancer(*elb.CreateLoadBalancerInput) (*elb.CreateLoadBalancerOutput, error) - DeleteLoadBalancer(*elb.DeleteLoadBalancerInput) (*elb.DeleteLoadBalancerOutput, error) - DescribeLoadBalancers(*elb.DescribeLoadBalancersInput) (*elb.DescribeLoadBalancersOutput, error) - RegisterInstancesWithLoadBalancer(*elb.RegisterInstancesWithLoadBalancerInput) (*elb.RegisterInstancesWithLoadBalancerOutput, error) - DeregisterInstancesFromLoadBalancer(*elb.DeregisterInstancesFromLoadBalancerInput) (*elb.DeregisterInstancesFromLoadBalancerOutput, error) - - DetachLoadBalancerFromSubnets(*elb.DetachLoadBalancerFromSubnetsInput) (*elb.DetachLoadBalancerFromSubnetsOutput, error) - AttachLoadBalancerToSubnets(*elb.AttachLoadBalancerToSubnetsInput) (*elb.AttachLoadBalancerToSubnetsOutput, error) - - CreateLoadBalancerListeners(*elb.CreateLoadBalancerListenersInput) (*elb.CreateLoadBalancerListenersOutput, error) - DeleteLoadBalancerListeners(*elb.DeleteLoadBalancerListenersInput) (*elb.DeleteLoadBalancerListenersOutput, error) - - ApplySecurityGroupsToLoadBalancer(*elb.ApplySecurityGroupsToLoadBalancerInput) (*elb.ApplySecurityGroupsToLoadBalancerOutput, error) - - ConfigureHealthCheck(*elb.ConfigureHealthCheckInput) (*elb.ConfigureHealthCheckOutput, error) -} - -// This is a simple pass-through of the Autoscaling client interface, which allows for testing -type ASG interface { - UpdateAutoScalingGroup(*autoscaling.UpdateAutoScalingGroupInput) (*autoscaling.UpdateAutoScalingGroupOutput, error) - DescribeAutoScalingGroups(*autoscaling.DescribeAutoScalingGroupsInput) (*autoscaling.DescribeAutoScalingGroupsOutput, error) -} - -// Abstraction over the AWS metadata service -type EC2Metadata interface { - // Query the EC2 metadata service (used to discover instance-id etc) - GetMetadata(path string) (string, error) -} - -type VolumeOptions struct { - CapacityGB int - Tags map[string]string -} - -// Volumes is an interface for managing cloud-provisioned volumes -// TODO: Allow other clouds to implement this -type Volumes interface { - // Attach the disk to the specified instance - // instanceName can be empty to mean "the instance on which we are running" - // Returns the device (e.g. /dev/xvdf) where we attached the volume - AttachDisk(diskName string, instanceName string, readOnly bool) (string, error) - // Detach the disk from the specified instance - // instanceName can be empty to mean "the instance on which we are running" - // Returns the device where the volume was attached - DetachDisk(diskName string, instanceName string) (string, error) - - // Create a volume with the specified options - CreateDisk(volumeOptions *VolumeOptions) (volumeName string, err error) - // Delete the specified volume - // Returns true iff the volume was deleted - // If the was not found, returns (false, nil) - DeleteDisk(volumeName string) (bool, error) - - // Get labels to apply to volume on creation - GetVolumeLabels(volumeName string) (map[string]string, error) -} - -// InstanceGroups is an interface for managing cloud-managed instance groups / autoscaling instance groups -// TODO: Allow other clouds to implement this -type InstanceGroups interface { - // Set the size to the fixed size - ResizeInstanceGroup(instanceGroupName string, size int) error - // Queries the cloud provider for information about the specified instance group - DescribeInstanceGroup(instanceGroupName string) (InstanceGroupInfo, error) -} - -// InstanceGroupInfo is returned by InstanceGroups.Describe, and exposes information about the group. -type InstanceGroupInfo interface { - // The number of instances currently running under control of this group - CurrentSize() (int, error) -} - -// AWSCloud is an implementation of Interface, LoadBalancer and Instances for Amazon Web Services. -type AWSCloud struct { - ec2 EC2 - elb ELB - asg ASG - metadata EC2Metadata - cfg *AWSCloudConfig - region string - vpcID string - - filterTags map[string]string - - // The AWS instance that we are running on - // Note that we cache some state in awsInstance (mountpoints), so we must preserve the instance - selfAWSInstance *awsInstance - - mutex sync.Mutex -} - -var _ Volumes = &AWSCloud{} - -type AWSCloudConfig struct { - Global struct { - // TODO: Is there any use for this? We can get it from the instance metadata service - // Maybe if we're not running on AWS, e.g. bootstrap; for now it is not very useful - Zone string - - KubernetesClusterTag string - - //The aws provider creates an inbound rule per load balancer on the node security - //group. However, this can run into the AWS security group rule limit of 50 if - //many LoadBalancers are created. - // - //This flag disables the automatic ingress creation. It requires that the user - //has setup a rule that allows inbound traffic on kubelet ports from the - //local VPC subnet (so load balancers can access it). E.g. 10.82.0.0/16 30000-32000. - DisableSecurityGroupIngress bool - } -} - -// awsSdkEC2 is an implementation of the EC2 interface, backed by aws-sdk-go -type awsSdkEC2 struct { - ec2 *ec2.EC2 -} - -type awsSDKProvider struct { - creds *credentials.Credentials - - mutex sync.Mutex - regionDelayers map[string]*CrossRequestRetryDelay -} - -func newAWSSDKProvider(creds *credentials.Credentials) *awsSDKProvider { - return &awsSDKProvider{ - creds: creds, - regionDelayers: make(map[string]*CrossRequestRetryDelay), - } -} - -func (p *awsSDKProvider) addHandlers(regionName string, h *request.Handlers) { - h.Sign.PushFrontNamed(request.NamedHandler{ - Name: "k8s/logger", - Fn: awsHandlerLogger, - }) - - delayer := p.getCrossRequestRetryDelay(regionName) - if delayer != nil { - h.Sign.PushFrontNamed(request.NamedHandler{ - Name: "k8s/delay-presign", - Fn: delayer.BeforeSign, - }) - - h.AfterRetry.PushFrontNamed(request.NamedHandler{ - Name: "k8s/delay-afterretry", - Fn: delayer.AfterRetry, - }) - } -} - -// Get a CrossRequestRetryDelay, scoped to the region, not to the request. -// This means that when we hit a limit on a call, we will delay _all_ calls to the API. -// We do this to protect the AWS account from becoming overloaded and effectively locked. -// We also log when we hit request limits. -// Note that this delays the current goroutine; this is bad behaviour and will -// likely cause k8s to become slow or unresponsive for cloud operations. -// However, this throttle is intended only as a last resort. When we observe -// this throttling, we need to address the root cause (e.g. add a delay to a -// controller retry loop) -func (p *awsSDKProvider) getCrossRequestRetryDelay(regionName string) *CrossRequestRetryDelay { - p.mutex.Lock() - defer p.mutex.Unlock() - - delayer, found := p.regionDelayers[regionName] - if !found { - delayer = NewCrossRequestRetryDelay() - p.regionDelayers[regionName] = delayer - } - return delayer -} - -func (p *awsSDKProvider) Compute(regionName string) (EC2, error) { - service := ec2.New(session.New(&aws.Config{ - Region: ®ionName, - Credentials: p.creds, - })) - - p.addHandlers(regionName, &service.Handlers) - - ec2 := &awsSdkEC2{ - ec2: service, - } - return ec2, nil -} - -func (p *awsSDKProvider) LoadBalancing(regionName string) (ELB, error) { - elbClient := elb.New(session.New(&aws.Config{ - Region: ®ionName, - Credentials: p.creds, - })) - - p.addHandlers(regionName, &elbClient.Handlers) - - return elbClient, nil -} - -func (p *awsSDKProvider) Autoscaling(regionName string) (ASG, error) { - client := autoscaling.New(session.New(&aws.Config{ - Region: ®ionName, - Credentials: p.creds, - })) - - p.addHandlers(regionName, &client.Handlers) - - return client, nil -} - -func (p *awsSDKProvider) Metadata() (EC2Metadata, error) { - client := ec2metadata.New(session.New(&aws.Config{})) - return client, nil -} - -func stringPointerArray(orig []string) []*string { - if orig == nil { - return nil - } - n := make([]*string, len(orig)) - for i := range orig { - n[i] = &orig[i] - } - return n -} - -func isNilOrEmpty(s *string) bool { - return s == nil || *s == "" -} - -func orEmpty(s *string) string { - if s == nil { - return "" - } - return *s -} - -func newEc2Filter(name string, value string) *ec2.Filter { - filter := &ec2.Filter{ - Name: aws.String(name), - Values: []*string{ - aws.String(value), - }, - } - return filter -} - -func (self *AWSCloud) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} - -func (c *AWSCloud) CurrentNodeName(hostname string) (string, error) { - return c.selfAWSInstance.nodeName, nil -} - -// Implementation of EC2.Instances -func (self *awsSdkEC2) DescribeInstances(request *ec2.DescribeInstancesInput) ([]*ec2.Instance, error) { - // Instances are paged - results := []*ec2.Instance{} - var nextToken *string - - for { - response, err := self.ec2.DescribeInstances(request) - if err != nil { - return nil, fmt.Errorf("error listing AWS instances: %v", err) - } - - for _, reservation := range response.Reservations { - results = append(results, reservation.Instances...) - } - - nextToken = response.NextToken - if isNilOrEmpty(nextToken) { - break - } - request.NextToken = nextToken - } - - return results, nil -} - -// Implements EC2.DescribeSecurityGroups -func (s *awsSdkEC2) DescribeSecurityGroups(request *ec2.DescribeSecurityGroupsInput) ([]*ec2.SecurityGroup, error) { - // Security groups are not paged - response, err := s.ec2.DescribeSecurityGroups(request) - if err != nil { - return nil, fmt.Errorf("error listing AWS security groups: %v", err) - } - return response.SecurityGroups, nil -} - -func (s *awsSdkEC2) AttachVolume(request *ec2.AttachVolumeInput) (*ec2.VolumeAttachment, error) { - return s.ec2.AttachVolume(request) -} - -func (s *awsSdkEC2) DetachVolume(request *ec2.DetachVolumeInput) (*ec2.VolumeAttachment, error) { - return s.ec2.DetachVolume(request) -} - -func (s *awsSdkEC2) DescribeVolumes(request *ec2.DescribeVolumesInput) ([]*ec2.Volume, error) { - // Volumes are paged - results := []*ec2.Volume{} - var nextToken *string - - for { - response, err := s.ec2.DescribeVolumes(request) - - if err != nil { - return nil, fmt.Errorf("error listing AWS volumes: %v", err) - } - - results = append(results, response.Volumes...) - - nextToken = response.NextToken - if isNilOrEmpty(nextToken) { - break - } - request.NextToken = nextToken - } - - return results, nil -} - -func (s *awsSdkEC2) CreateVolume(request *ec2.CreateVolumeInput) (resp *ec2.Volume, err error) { - return s.ec2.CreateVolume(request) -} - -func (s *awsSdkEC2) DeleteVolume(request *ec2.DeleteVolumeInput) (*ec2.DeleteVolumeOutput, error) { - return s.ec2.DeleteVolume(request) -} - -func (s *awsSdkEC2) DescribeSubnets(request *ec2.DescribeSubnetsInput) ([]*ec2.Subnet, error) { - // Subnets are not paged - response, err := s.ec2.DescribeSubnets(request) - if err != nil { - return nil, fmt.Errorf("error listing AWS subnets: %v", err) - } - return response.Subnets, nil -} - -func (s *awsSdkEC2) CreateSecurityGroup(request *ec2.CreateSecurityGroupInput) (*ec2.CreateSecurityGroupOutput, error) { - return s.ec2.CreateSecurityGroup(request) -} - -func (s *awsSdkEC2) DeleteSecurityGroup(request *ec2.DeleteSecurityGroupInput) (*ec2.DeleteSecurityGroupOutput, error) { - return s.ec2.DeleteSecurityGroup(request) -} - -func (s *awsSdkEC2) AuthorizeSecurityGroupIngress(request *ec2.AuthorizeSecurityGroupIngressInput) (*ec2.AuthorizeSecurityGroupIngressOutput, error) { - return s.ec2.AuthorizeSecurityGroupIngress(request) -} - -func (s *awsSdkEC2) RevokeSecurityGroupIngress(request *ec2.RevokeSecurityGroupIngressInput) (*ec2.RevokeSecurityGroupIngressOutput, error) { - return s.ec2.RevokeSecurityGroupIngress(request) -} - -func (s *awsSdkEC2) CreateTags(request *ec2.CreateTagsInput) (*ec2.CreateTagsOutput, error) { - return s.ec2.CreateTags(request) -} - -func (s *awsSdkEC2) DescribeRouteTables(request *ec2.DescribeRouteTablesInput) ([]*ec2.RouteTable, error) { - // Not paged - response, err := s.ec2.DescribeRouteTables(request) - if err != nil { - return nil, fmt.Errorf("error listing AWS route tables: %v", err) - } - return response.RouteTables, nil -} - -func (s *awsSdkEC2) CreateRoute(request *ec2.CreateRouteInput) (*ec2.CreateRouteOutput, error) { - return s.ec2.CreateRoute(request) -} - -func (s *awsSdkEC2) DeleteRoute(request *ec2.DeleteRouteInput) (*ec2.DeleteRouteOutput, error) { - return s.ec2.DeleteRoute(request) -} - -func (s *awsSdkEC2) ModifyInstanceAttribute(request *ec2.ModifyInstanceAttributeInput) (*ec2.ModifyInstanceAttributeOutput, error) { - return s.ec2.ModifyInstanceAttribute(request) -} - -func init() { - cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) { - creds := credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.EnvProvider{}, - &ec2rolecreds.EC2RoleProvider{ - Client: ec2metadata.New(session.New(&aws.Config{})), - }, - &credentials.SharedCredentialsProvider{}, - }) - aws := newAWSSDKProvider(creds) - return newAWSCloud(config, aws) - }) -} - -// readAWSCloudConfig reads an instance of AWSCloudConfig from config reader. -func readAWSCloudConfig(config io.Reader, metadata EC2Metadata) (*AWSCloudConfig, error) { - var cfg AWSCloudConfig - var err error - - if config != nil { - err = gcfg.ReadInto(&cfg, config) - if err != nil { - return nil, err - } - } - - if cfg.Global.Zone == "" { - if metadata != nil { - glog.Info("Zone not specified in configuration file; querying AWS metadata service") - cfg.Global.Zone, err = getAvailabilityZone(metadata) - if err != nil { - return nil, err - } - } - if cfg.Global.Zone == "" { - return nil, fmt.Errorf("no zone specified in configuration file") - } - } - - return &cfg, nil -} - -func getInstanceType(metadata EC2Metadata) (string, error) { - return metadata.GetMetadata("instance-type") -} - -func getAvailabilityZone(metadata EC2Metadata) (string, error) { - return metadata.GetMetadata("placement/availability-zone") -} - -func isRegionValid(region string) bool { - regions := [...]string{ - "us-east-1", - "us-west-1", - "us-west-2", - "eu-west-1", - "eu-central-1", - "ap-southeast-1", - "ap-southeast-2", - "ap-northeast-1", - "ap-northeast-2", - "cn-north-1", - "us-gov-west-1", - "sa-east-1", - } - for _, r := range regions { - if r == region { - return true - } - } - return false -} - -// Derives the region from a valid az name. -// Returns an error if the az is known invalid (empty) -func azToRegion(az string) (string, error) { - if len(az) < 1 { - return "", fmt.Errorf("invalid (empty) AZ") - } - region := az[:len(az)-1] - return region, nil -} - -// newAWSCloud creates a new instance of AWSCloud. -// AWSProvider and instanceId are primarily for tests -func newAWSCloud(config io.Reader, awsServices AWSServices) (*AWSCloud, error) { - metadata, err := awsServices.Metadata() - if err != nil { - return nil, fmt.Errorf("error creating AWS metadata client: %v", err) - } - - cfg, err := readAWSCloudConfig(config, metadata) - if err != nil { - return nil, fmt.Errorf("unable to read AWS cloud provider config file: %v", err) - } - - zone := cfg.Global.Zone - if len(zone) <= 1 { - return nil, fmt.Errorf("invalid AWS zone in config file: %s", zone) - } - regionName, err := azToRegion(zone) - if err != nil { - return nil, err - } - - valid := isRegionValid(regionName) - if !valid { - return nil, fmt.Errorf("not a valid AWS zone (unknown region): %s", zone) - } - - ec2, err := awsServices.Compute(regionName) - if err != nil { - return nil, fmt.Errorf("error creating AWS EC2 client: %v", err) - } - - elb, err := awsServices.LoadBalancing(regionName) - if err != nil { - return nil, fmt.Errorf("error creating AWS ELB client: %v", err) - } - - asg, err := awsServices.Autoscaling(regionName) - if err != nil { - return nil, fmt.Errorf("error creating AWS autoscaling client: %v", err) - } - - awsCloud := &AWSCloud{ - ec2: ec2, - elb: elb, - asg: asg, - metadata: metadata, - cfg: cfg, - region: regionName, - } - - selfAWSInstance, err := awsCloud.buildSelfAWSInstance() - if err != nil { - return nil, err - } - - awsCloud.selfAWSInstance = selfAWSInstance - awsCloud.vpcID = selfAWSInstance.vpcID - - filterTags := map[string]string{} - if cfg.Global.KubernetesClusterTag != "" { - filterTags[TagNameKubernetesCluster] = cfg.Global.KubernetesClusterTag - } else { - // TODO: Clean up double-API query - info, err := selfAWSInstance.describeInstance() - if err != nil { - return nil, err - } - for _, tag := range info.Tags { - if orEmpty(tag.Key) == TagNameKubernetesCluster { - filterTags[TagNameKubernetesCluster] = orEmpty(tag.Value) - } - } - } - - if filterTags[TagNameKubernetesCluster] == "" { - glog.Errorf("Tag %q not found; Kuberentes may behave unexpectedly.", TagNameKubernetesCluster) - } - - awsCloud.filterTags = filterTags - if len(filterTags) > 0 { - glog.Infof("AWS cloud filtering on tags: %v", filterTags) - } else { - glog.Infof("AWS cloud - no tag filtering") - } - - // Register handler for ECR credentials - once.Do(func() { - aws_credentials.Init() - }) - - return awsCloud, nil -} - -func (aws *AWSCloud) Clusters() (cloudprovider.Clusters, bool) { - return nil, false -} - -// ProviderName returns the cloud provider ID. -func (aws *AWSCloud) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (aws *AWSCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -// LoadBalancer returns an implementation of LoadBalancer for Amazon Web Services. -func (s *AWSCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - return s, true -} - -// Instances returns an implementation of Instances for Amazon Web Services. -func (aws *AWSCloud) Instances() (cloudprovider.Instances, bool) { - return aws, true -} - -// Zones returns an implementation of Zones for Amazon Web Services. -func (aws *AWSCloud) Zones() (cloudprovider.Zones, bool) { - return aws, true -} - -// Routes returns an implementation of Routes for Amazon Web Services. -func (aws *AWSCloud) Routes() (cloudprovider.Routes, bool) { - return aws, true -} - -// NodeAddresses is an implementation of Instances.NodeAddresses. -func (c *AWSCloud) NodeAddresses(name string) ([]api.NodeAddress, error) { - if c.selfAWSInstance.nodeName == name || len(name) == 0 { - addresses := []api.NodeAddress{} - - internalIP, err := c.metadata.GetMetadata("local-ipv4") - if err != nil { - return nil, err - } - addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: internalIP}) - // Legacy compatibility: the private ip was the legacy host ip - addresses = append(addresses, api.NodeAddress{Type: api.NodeLegacyHostIP, Address: internalIP}) - - externalIP, err := c.metadata.GetMetadata("public-ipv4") - if err != nil { - //TODO: It would be nice to be able to determine the reason for the failure, - // but the AWS client masks all failures with the same error description. - glog.V(2).Info("Could not determine public IP from AWS metadata.") - } else { - addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: externalIP}) - } - - return addresses, nil - } - instance, err := c.getInstanceByNodeName(name) - if err != nil { - return nil, err - } - - addresses := []api.NodeAddress{} - - if !isNilOrEmpty(instance.PrivateIpAddress) { - ipAddress := *instance.PrivateIpAddress - ip := net.ParseIP(ipAddress) - if ip == nil { - return nil, fmt.Errorf("EC2 instance had invalid private address: %s (%s)", orEmpty(instance.InstanceId), ipAddress) - } - addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) - - // Legacy compatibility: the private ip was the legacy host ip - addresses = append(addresses, api.NodeAddress{Type: api.NodeLegacyHostIP, Address: ip.String()}) - } - - // TODO: Other IP addresses (multiple ips)? - if !isNilOrEmpty(instance.PublicIpAddress) { - ipAddress := *instance.PublicIpAddress - ip := net.ParseIP(ipAddress) - if ip == nil { - return nil, fmt.Errorf("EC2 instance had invalid public address: %s (%s)", orEmpty(instance.InstanceId), ipAddress) - } - addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) - } - - return addresses, nil -} - -// ExternalID returns the cloud provider ID of the specified instance (deprecated). -func (c *AWSCloud) ExternalID(name string) (string, error) { - if c.selfAWSInstance.nodeName == name { - // We assume that if this is run on the instance itself, the instance exists and is alive - return c.selfAWSInstance.awsID, nil - } else { - // We must verify that the instance still exists - // Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound) - instance, err := c.findInstanceByNodeName(name) - if err != nil { - return "", err - } - if instance == nil { - return "", cloudprovider.InstanceNotFound - } - return orEmpty(instance.InstanceId), nil - } -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (c *AWSCloud) InstanceID(name string) (string, error) { - // In the future it is possible to also return an endpoint as: - // // - if c.selfAWSInstance.nodeName == name { - return "/" + c.selfAWSInstance.availabilityZone + "/" + c.selfAWSInstance.awsID, nil - } else { - inst, err := c.getInstanceByNodeName(name) - if err != nil { - return "", err - } - return "/" + orEmpty(inst.Placement.AvailabilityZone) + "/" + orEmpty(inst.InstanceId), nil - } -} - -// InstanceType returns the type of the specified instance. -func (c *AWSCloud) InstanceType(name string) (string, error) { - if c.selfAWSInstance.nodeName == name { - return c.selfAWSInstance.instanceType, nil - } else { - inst, err := c.getInstanceByNodeName(name) - if err != nil { - return "", err - } - return orEmpty(inst.InstanceType), nil - } -} - -// Return a list of instances matching regex string. -func (s *AWSCloud) getInstancesByRegex(regex string) ([]string, error) { - filters := []*ec2.Filter{newEc2Filter("instance-state-name", "running")} - filters = s.addFilters(filters) - request := &ec2.DescribeInstancesInput{ - Filters: filters, - } - - instances, err := s.ec2.DescribeInstances(request) - if err != nil { - return []string{}, err - } - if len(instances) == 0 { - return []string{}, fmt.Errorf("no instances returned") - } - - if strings.HasPrefix(regex, "'") && strings.HasSuffix(regex, "'") { - glog.Infof("Stripping quotes around regex (%s)", regex) - regex = regex[1 : len(regex)-1] - } - - re, err := regexp.Compile(regex) - if err != nil { - return []string{}, err - } - - matchingInstances := []string{} - for _, instance := range instances { - // Only return fully-ready instances when listing instances - // (vs a query by name, where we will return it if we find it) - if orEmpty(instance.State.Name) == "pending" { - glog.V(2).Infof("Skipping EC2 instance (pending): %s", *instance.InstanceId) - continue - } - - privateDNSName := orEmpty(instance.PrivateDnsName) - if privateDNSName == "" { - glog.V(2).Infof("Skipping EC2 instance (no PrivateDNSName): %s", - orEmpty(instance.InstanceId)) - continue - } - - for _, tag := range instance.Tags { - if orEmpty(tag.Key) == "Name" && re.MatchString(orEmpty(tag.Value)) { - matchingInstances = append(matchingInstances, privateDNSName) - break - } - } - } - glog.V(2).Infof("Matched EC2 instances: %s", matchingInstances) - return matchingInstances, nil -} - -// List is an implementation of Instances.List. -func (aws *AWSCloud) List(filter string) ([]string, error) { - // TODO: Should really use tag query. No need to go regexp. - return aws.getInstancesByRegex(filter) -} - -// GetZone implements Zones.GetZone -func (c *AWSCloud) GetZone() (cloudprovider.Zone, error) { - return cloudprovider.Zone{ - FailureDomain: c.selfAWSInstance.availabilityZone, - Region: c.region, - }, nil -} - -// Abstraction around AWS Instance Types -// There isn't an API to get information for a particular instance type (that I know of) -type awsInstanceType struct { -} - -// Used to represent a mount device for attaching an EBS volume -// This should be stored as a single letter (i.e. c, not sdc or /dev/sdc) -type mountDevice string - -// TODO: Also return number of mounts allowed? -func (self *awsInstanceType) getEBSMountDevices() []mountDevice { - // See: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html - // We will generate "ba", "bb", "bc"..."bz", "ca", ..., up to DefaultMaxEBSVolumes - devices := []mountDevice{} - count := 0 - for first := 'b'; count < DefaultMaxEBSVolumes; first++ { - for second := 'a'; count < DefaultMaxEBSVolumes && second <= 'z'; second++ { - device := mountDevice(fmt.Sprintf("%c%c", first, second)) - devices = append(devices, device) - count++ - } - } - - return devices -} - -type awsInstance struct { - ec2 EC2 - - // id in AWS - awsID string - - // node name in k8s - nodeName string - - // availability zone the instance resides in - availabilityZone string - - // ID of VPC the instance resides in - vpcID string - - // ID of subnet the instance resides in - subnetID string - - // instance type - instanceType string - - mutex sync.Mutex - - // We keep an active list of devices we have assigned but not yet - // attached, to avoid a race condition where we assign a device mapping - // and then get a second request before we attach the volume - attaching map[mountDevice]string -} - -// newAWSInstance creates a new awsInstance object -func newAWSInstance(ec2Service EC2, instance *ec2.Instance) *awsInstance { - az := "" - if instance.Placement != nil { - az = aws.StringValue(instance.Placement.AvailabilityZone) - } - self := &awsInstance{ - ec2: ec2Service, - awsID: aws.StringValue(instance.InstanceId), - nodeName: aws.StringValue(instance.PrivateDnsName), - availabilityZone: az, - instanceType: aws.StringValue(instance.InstanceType), - vpcID: aws.StringValue(instance.VpcId), - subnetID: aws.StringValue(instance.SubnetId), - } - - self.attaching = make(map[mountDevice]string) - - return self -} - -// Gets the awsInstanceType that models the instance type of this instance -func (self *awsInstance) getInstanceType() *awsInstanceType { - // TODO: Make this real - awsInstanceType := &awsInstanceType{} - return awsInstanceType -} - -// Gets the full information about this instance from the EC2 API -func (self *awsInstance) describeInstance() (*ec2.Instance, error) { - instanceID := self.awsID - request := &ec2.DescribeInstancesInput{ - InstanceIds: []*string{&instanceID}, - } - - instances, err := self.ec2.DescribeInstances(request) - if err != nil { - return nil, err - } - if len(instances) == 0 { - return nil, fmt.Errorf("no instances found for instance: %s", self.awsID) - } - if len(instances) > 1 { - return nil, fmt.Errorf("multiple instances found for instance: %s", self.awsID) - } - return instances[0], nil -} - -// Gets the mountDevice already assigned to the volume, or assigns an unused mountDevice. -// If the volume is already assigned, this will return the existing mountDevice with alreadyAttached=true. -// Otherwise the mountDevice is assigned by finding the first available mountDevice, and it is returned with alreadyAttached=false. -func (self *awsInstance) getMountDevice(volumeID string, assign bool) (assigned mountDevice, alreadyAttached bool, err error) { - instanceType := self.getInstanceType() - if instanceType == nil { - return "", false, fmt.Errorf("could not get instance type for instance: %s", self.awsID) - } - - // We lock to prevent concurrent mounts from conflicting - // We may still conflict if someone calls the API concurrently, - // but the AWS API will then fail one of the two attach operations - self.mutex.Lock() - defer self.mutex.Unlock() - - info, err := self.describeInstance() - if err != nil { - return "", false, err - } - deviceMappings := map[mountDevice]string{} - for _, blockDevice := range info.BlockDeviceMappings { - name := aws.StringValue(blockDevice.DeviceName) - if strings.HasPrefix(name, "/dev/sd") { - name = name[7:] - } - if strings.HasPrefix(name, "/dev/xvd") { - name = name[8:] - } - if len(name) < 1 || len(name) > 2 { - glog.Warningf("Unexpected EBS DeviceName: %q", aws.StringValue(blockDevice.DeviceName)) - } - deviceMappings[mountDevice(name)] = aws.StringValue(blockDevice.Ebs.VolumeId) - } - - for mountDevice, volume := range self.attaching { - deviceMappings[mountDevice] = volume - } - - // Check to see if this volume is already assigned a device on this machine - for mountDevice, mappingVolumeID := range deviceMappings { - if volumeID == mappingVolumeID { - if assign { - glog.Warningf("Got assignment call for already-assigned volume: %s@%s", mountDevice, mappingVolumeID) - } - return mountDevice, true, nil - } - } - - if !assign { - return mountDevice(""), false, nil - } - - // Check all the valid mountpoints to see if any of them are free - valid := instanceType.getEBSMountDevices() - chosen := mountDevice("") - for _, mountDevice := range valid { - _, found := deviceMappings[mountDevice] - if !found { - chosen = mountDevice - break - } - } - - if chosen == "" { - glog.Warningf("Could not assign a mount device (all in use?). mappings=%v, valid=%v", deviceMappings, valid) - return "", false, fmt.Errorf("Too many EBS volumes attached to node %s.", self.nodeName) - } - - self.attaching[chosen] = volumeID - glog.V(2).Infof("Assigned mount device %s -> volume %s", chosen, volumeID) - - return chosen, false, nil -} - -func (self *awsInstance) endAttaching(volumeID string, mountDevice mountDevice) { - self.mutex.Lock() - defer self.mutex.Unlock() - - existingVolumeID, found := self.attaching[mountDevice] - if !found { - glog.Errorf("endAttaching on non-allocated device") - return - } - if volumeID != existingVolumeID { - glog.Errorf("endAttaching on device assigned to different volume") - return - } - glog.V(2).Infof("Releasing mount device mapping: %s -> volume %s", mountDevice, volumeID) - delete(self.attaching, mountDevice) -} - -type awsDisk struct { - ec2 EC2 - - // Name in k8s - name string - // id in AWS - awsID string -} - -func newAWSDisk(aws *AWSCloud, name string) (*awsDisk, error) { - // name looks like aws://availability-zone/id - - // The original idea of the URL-style name was to put the AZ into the - // host, so we could find the AZ immediately from the name without - // querying the API. But it turns out we don't actually need it for - // Ubernetes-Lite, as we put the AZ into the labels on the PV instead. - // However, if in future we want to support Ubernetes-Lite - // volume-awareness without using PersistentVolumes, we likely will - // want the AZ in the host. - - if !strings.HasPrefix(name, "aws://") { - name = "aws://" + "" + "/" + name - } - url, err := url.Parse(name) - if err != nil { - // TODO: Maybe we should pass a URL into the Volume functions - return nil, fmt.Errorf("Invalid disk name (%s): %v", name, err) - } - if url.Scheme != "aws" { - return nil, fmt.Errorf("Invalid scheme for AWS volume (%s)", name) - } - - awsID := url.Path - if len(awsID) > 1 && awsID[0] == '/' { - awsID = awsID[1:] - } - - // TODO: Regex match? - if strings.Contains(awsID, "/") || !strings.HasPrefix(awsID, "vol-") { - return nil, fmt.Errorf("Invalid format for AWS volume (%s)", name) - } - - disk := &awsDisk{ec2: aws.ec2, name: name, awsID: awsID} - return disk, nil -} - -// Gets the full information about this volume from the EC2 API -func (self *awsDisk) describeVolume() (*ec2.Volume, error) { - volumeID := self.awsID - - request := &ec2.DescribeVolumesInput{ - VolumeIds: []*string{&volumeID}, - } - - volumes, err := self.ec2.DescribeVolumes(request) - if err != nil { - return nil, fmt.Errorf("error querying ec2 for volume info: %v", err) - } - if len(volumes) == 0 { - return nil, fmt.Errorf("no volumes found for volume: %s", self.awsID) - } - if len(volumes) > 1 { - return nil, fmt.Errorf("multiple volumes found for volume: %s", self.awsID) - } - return volumes[0], nil -} - -// waitForAttachmentStatus polls until the attachment status is the expected value -// TODO(justinsb): return (bool, error) -func (self *awsDisk) waitForAttachmentStatus(status string) error { - // TODO: There may be a faster way to get this when we're attaching locally - attempt := 0 - maxAttempts := 60 - - for { - info, err := self.describeVolume() - if err != nil { - return err - } - if len(info.Attachments) > 1 { - glog.Warningf("Found multiple attachments for volume: %v", info) - } - attachmentStatus := "" - for _, attachment := range info.Attachments { - if attachmentStatus != "" { - glog.Warning("Found multiple attachments: ", info) - } - if attachment.State != nil { - attachmentStatus = *attachment.State - } else { - // Shouldn't happen, but don't panic... - glog.Warning("Ignoring nil attachment state: ", attachment) - } - } - if attachmentStatus == "" { - attachmentStatus = "detached" - } - if attachmentStatus == status { - return nil - } - - glog.V(2).Infof("Waiting for volume state: actual=%s, desired=%s", attachmentStatus, status) - - attempt++ - if attempt > maxAttempts { - glog.Warningf("Timeout waiting for volume state: actual=%s, desired=%s", attachmentStatus, status) - return errors.New("Timeout waiting for volume state") - } - - time.Sleep(1 * time.Second) - } -} - -// Deletes the EBS disk -func (self *awsDisk) deleteVolume() (bool, error) { - request := &ec2.DeleteVolumeInput{VolumeId: aws.String(self.awsID)} - _, err := self.ec2.DeleteVolume(request) - if err != nil { - if awsError, ok := err.(awserr.Error); ok { - if awsError.Code() == "InvalidVolume.NotFound" { - return false, nil - } - } - return false, fmt.Errorf("error deleting EBS volumes: %v", err) - } - return true, nil -} - -// Builds the awsInstance for the EC2 instance on which we are running. -// This is called when the AWSCloud is initialized, and should not be called otherwise (because the awsInstance for the local instance is a singleton with drive mapping state) -func (c *AWSCloud) buildSelfAWSInstance() (*awsInstance, error) { - if c.selfAWSInstance != nil { - panic("do not call buildSelfAWSInstance directly") - } - instanceId, err := c.metadata.GetMetadata("instance-id") - if err != nil { - return nil, fmt.Errorf("error fetching instance-id from ec2 metadata service: %v", err) - } - - // We want to fetch the hostname via the EC2 metadata service - // (`GetMetadata("local-hostname")`): But see #11543 - we need to use - // the EC2 API to get the privateDnsName in case of a private DNS zone - // e.g. mydomain.io, because the metadata service returns the wrong - // hostname. Once we're doing that, we might as well get all our - // information from the instance returned by the EC2 API - it is a - // single API call to get all the information, and it means we don't - // have two code paths. - instance, err := c.getInstanceByID(instanceId) - if err != nil { - return nil, fmt.Errorf("error finding instance %s: %v", instanceId, err) - } - return newAWSInstance(c.ec2, instance), nil -} - -// Gets the awsInstance with node-name nodeName, or the 'self' instance if nodeName == "" -func (c *AWSCloud) getAwsInstance(nodeName string) (*awsInstance, error) { - var awsInstance *awsInstance - if nodeName == "" { - awsInstance = c.selfAWSInstance - } else { - instance, err := c.getInstanceByNodeName(nodeName) - if err != nil { - return nil, fmt.Errorf("error finding instance %s: %v", nodeName, err) - } - - awsInstance = newAWSInstance(c.ec2, instance) - } - - return awsInstance, nil -} - -// Implements Volumes.AttachDisk -func (c *AWSCloud) AttachDisk(diskName string, instanceName string, readOnly bool) (string, error) { - disk, err := newAWSDisk(c, diskName) - if err != nil { - return "", err - } - - awsInstance, err := c.getAwsInstance(instanceName) - if err != nil { - return "", err - } - - if readOnly { - // TODO: We could enforce this when we mount the volume (?) - // TODO: We could also snapshot the volume and attach copies of it - return "", errors.New("AWS volumes cannot be mounted read-only") - } - - mountDevice, alreadyAttached, err := awsInstance.getMountDevice(disk.awsID, true) - if err != nil { - return "", err - } - - // Inside the instance, the mountpoint always looks like /dev/xvdX (?) - hostDevice := "/dev/xvd" + string(mountDevice) - // In the EC2 API, it is sometimes is /dev/sdX and sometimes /dev/xvdX - // We are running on the node here, so we check if /dev/xvda exists to determine this - ec2Device := "/dev/xvd" + string(mountDevice) - if _, err := os.Stat("/dev/xvda"); os.IsNotExist(err) { - ec2Device = "/dev/sd" + string(mountDevice) - } - - // attachEnded is set to true if the attach operation completed - // (successfully or not) - attachEnded := false - defer func() { - if attachEnded { - awsInstance.endAttaching(disk.awsID, mountDevice) - } - }() - - if !alreadyAttached { - request := &ec2.AttachVolumeInput{ - Device: aws.String(ec2Device), - InstanceId: aws.String(awsInstance.awsID), - VolumeId: aws.String(disk.awsID), - } - - attachResponse, err := c.ec2.AttachVolume(request) - if err != nil { - attachEnded = true - // TODO: Check if the volume was concurrently attached? - return "", fmt.Errorf("Error attaching EBS volume: %v", err) - } - - glog.V(2).Infof("AttachVolume request returned %v", attachResponse) - } - - err = disk.waitForAttachmentStatus("attached") - if err != nil { - return "", err - } - - attachEnded = true - - return hostDevice, nil -} - -// Implements Volumes.DetachDisk -func (aws *AWSCloud) DetachDisk(diskName string, instanceName string) (string, error) { - disk, err := newAWSDisk(aws, diskName) - if err != nil { - return "", err - } - - awsInstance, err := aws.getAwsInstance(instanceName) - if err != nil { - return "", err - } - - mountDevice, alreadyAttached, err := awsInstance.getMountDevice(disk.awsID, false) - if err != nil { - return "", err - } - - if !alreadyAttached { - glog.Warning("DetachDisk called on non-attached disk: ", diskName) - // TODO: Continue? Tolerate non-attached error in DetachVolume? - } - - request := ec2.DetachVolumeInput{ - InstanceId: &awsInstance.awsID, - VolumeId: &disk.awsID, - } - - response, err := aws.ec2.DetachVolume(&request) - if err != nil { - return "", fmt.Errorf("error detaching EBS volume: %v", err) - } - if response == nil { - return "", errors.New("no response from DetachVolume") - } - - err = disk.waitForAttachmentStatus("detached") - if err != nil { - return "", err - } - - if mountDevice != "" { - awsInstance.endAttaching(disk.awsID, mountDevice) - } - - hostDevicePath := "/dev/xvd" + string(mountDevice) - return hostDevicePath, err -} - -// Implements Volumes.CreateVolume -func (s *AWSCloud) CreateDisk(volumeOptions *VolumeOptions) (string, error) { - // Default to creating in the current zone - // TODO: Spread across zones? - createAZ := s.selfAWSInstance.availabilityZone - - // TODO: Should we tag this with the cluster id (so it gets deleted when the cluster does?) - request := &ec2.CreateVolumeInput{} - request.AvailabilityZone = &createAZ - volSize := int64(volumeOptions.CapacityGB) - request.Size = &volSize - request.VolumeType = aws.String(DefaultVolumeType) - response, err := s.ec2.CreateVolume(request) - if err != nil { - return "", err - } - - az := orEmpty(response.AvailabilityZone) - awsID := orEmpty(response.VolumeId) - - volumeName := "aws://" + az + "/" + awsID - - // apply tags - tags := make(map[string]string) - for k, v := range volumeOptions.Tags { - tags[k] = v - } - - if s.getClusterName() != "" { - tags[TagNameKubernetesCluster] = s.getClusterName() - } - - if len(tags) != 0 { - if err := s.createTags(awsID, tags); err != nil { - // delete the volume and hope it succeeds - _, delerr := s.DeleteDisk(volumeName) - if delerr != nil { - // delete did not succeed, we have a stray volume! - return "", fmt.Errorf("error tagging volume %s, could not delete the volume: %v", volumeName, delerr) - } - return "", fmt.Errorf("error tagging volume %s: %v", volumeName, err) - } - } - return volumeName, nil -} - -// Implements Volumes.DeleteDisk -func (c *AWSCloud) DeleteDisk(volumeName string) (bool, error) { - awsDisk, err := newAWSDisk(c, volumeName) - if err != nil { - return false, err - } - return awsDisk.deleteVolume() -} - -// Implements Volumes.GetVolumeLabels -func (c *AWSCloud) GetVolumeLabels(volumeName string) (map[string]string, error) { - awsDisk, err := newAWSDisk(c, volumeName) - if err != nil { - return nil, err - } - info, err := awsDisk.describeVolume() - if err != nil { - return nil, err - } - labels := make(map[string]string) - az := aws.StringValue(info.AvailabilityZone) - if az == "" { - return nil, fmt.Errorf("volume did not have AZ information: %q", info.VolumeId) - } - - labels[unversioned.LabelZoneFailureDomain] = az - region, err := azToRegion(az) - if err != nil { - return nil, err - } - labels[unversioned.LabelZoneRegion] = region - - return labels, nil -} - -// Gets the current load balancer state -func (s *AWSCloud) describeLoadBalancer(name string) (*elb.LoadBalancerDescription, error) { - request := &elb.DescribeLoadBalancersInput{} - request.LoadBalancerNames = []*string{&name} - - response, err := s.elb.DescribeLoadBalancers(request) - if err != nil { - if awsError, ok := err.(awserr.Error); ok { - if awsError.Code() == "LoadBalancerNotFound" { - return nil, nil - } - } - return nil, err - } - - var ret *elb.LoadBalancerDescription - for _, loadBalancer := range response.LoadBalancerDescriptions { - if ret != nil { - glog.Errorf("Found multiple load balancers with name: %s", name) - } - ret = loadBalancer - } - return ret, nil -} - -// Retrieves instance's vpc id from metadata -func (self *AWSCloud) findVPCID() (string, error) { - macs, err := self.metadata.GetMetadata("network/interfaces/macs/") - if err != nil { - return "", fmt.Errorf("Could not list interfaces of the instance: %v", err) - } - - // loop over interfaces, first vpc id returned wins - for _, macPath := range strings.Split(macs, "\n") { - if len(macPath) == 0 { - continue - } - url := fmt.Sprintf("network/interfaces/macs/%svpc-id", macPath) - vpcID, err := self.metadata.GetMetadata(url) - if err != nil { - continue - } - return vpcID, nil - } - return "", fmt.Errorf("Could not find VPC ID in instance metadata") -} - -// Retrieves the specified security group from the AWS API, or returns nil if not found -func (s *AWSCloud) findSecurityGroup(securityGroupId string) (*ec2.SecurityGroup, error) { - describeSecurityGroupsRequest := &ec2.DescribeSecurityGroupsInput{ - GroupIds: []*string{&securityGroupId}, - } - // We don't apply our tag filters because we are retrieving by ID - - groups, err := s.ec2.DescribeSecurityGroups(describeSecurityGroupsRequest) - if err != nil { - glog.Warningf("Error retrieving security group: %q", err) - return nil, err - } - - if len(groups) == 0 { - return nil, nil - } - if len(groups) != 1 { - // This should not be possible - ids should be unique - return nil, fmt.Errorf("multiple security groups found with same id %q", securityGroupId) - } - group := groups[0] - return group, nil -} - -func isEqualIntPointer(l, r *int64) bool { - if l == nil { - return r == nil - } - if r == nil { - return l == nil - } - return *l == *r -} - -func isEqualStringPointer(l, r *string) bool { - if l == nil { - return r == nil - } - if r == nil { - return l == nil - } - return *l == *r -} - -func ipPermissionExists(newPermission, existing *ec2.IpPermission, compareGroupUserIDs bool) bool { - if !isEqualIntPointer(newPermission.FromPort, existing.FromPort) { - return false - } - if !isEqualIntPointer(newPermission.ToPort, existing.ToPort) { - return false - } - if !isEqualStringPointer(newPermission.IpProtocol, existing.IpProtocol) { - return false - } - // Check only if newPermission is a subset of existing. Usually it has zero or one elements. - // Not doing actual CIDR math yet; not clear it's needed, either. - glog.V(4).Infof("Comparing %v to %v", newPermission, existing) - if len(newPermission.IpRanges) > len(existing.IpRanges) { - return false - } - - for j := range newPermission.IpRanges { - found := false - for k := range existing.IpRanges { - if isEqualStringPointer(newPermission.IpRanges[j].CidrIp, existing.IpRanges[k].CidrIp) { - found = true - break - } - } - if found == false { - return false - } - } - for _, leftPair := range newPermission.UserIdGroupPairs { - for _, rightPair := range existing.UserIdGroupPairs { - if isEqualUserGroupPair(leftPair, rightPair, compareGroupUserIDs) { - return true - } - } - return false - } - - return true -} - -func isEqualUserGroupPair(l, r *ec2.UserIdGroupPair, compareGroupUserIDs bool) bool { - glog.V(2).Infof("Comparing %v to %v", *l.GroupId, *r.GroupId) - if isEqualStringPointer(l.GroupId, r.GroupId) { - if compareGroupUserIDs { - if isEqualStringPointer(l.UserId, r.UserId) { - return true - } - } else { - return true - } - } - - return false -} - -// Makes sure the security group ingress is exactly the specified permissions -// Returns true if and only if changes were made -// The security group must already exist -func (s *AWSCloud) setSecurityGroupIngress(securityGroupId string, permissions IPPermissionSet) (bool, error) { - group, err := s.findSecurityGroup(securityGroupId) - if err != nil { - glog.Warning("Error retrieving security group", err) - return false, err - } - - if group == nil { - return false, fmt.Errorf("security group not found: %s", securityGroupId) - } - - glog.V(2).Infof("Existing security group ingress: %s %v", securityGroupId, group.IpPermissions) - - actual := NewIPPermissionSet(group.IpPermissions...) - - // EC2 groups rules together, for example combining: - // - // { Port=80, Range=[A] } and { Port=80, Range=[B] } - // - // into { Port=80, Range=[A,B] } - // - // We have to ungroup them, because otherwise the logic becomes really - // complicated, and also because if we have Range=[A,B] and we try to - // add Range=[A] then EC2 complains about a duplicate rule. - permissions = permissions.Ungroup() - actual = actual.Ungroup() - - remove := actual.Difference(permissions) - add := permissions.Difference(actual) - - if add.Len() == 0 && remove.Len() == 0 { - return false, nil - } - - // TODO: There is a limit in VPC of 100 rules per security group, so we - // probably should try grouping or combining to fit under this limit. - // But this is only used on the ELB security group currently, so it - // would require (ports * CIDRS) > 100. Also, it isn't obvious exactly - // how removing single permissions from compound rules works, and we - // don't want to accidentally open more than intended while we're - // applying changes. - if add.Len() != 0 { - glog.V(2).Infof("Adding security group ingress: %s %v", securityGroupId, add.List()) - - request := &ec2.AuthorizeSecurityGroupIngressInput{} - request.GroupId = &securityGroupId - request.IpPermissions = add.List() - _, err = s.ec2.AuthorizeSecurityGroupIngress(request) - if err != nil { - return false, fmt.Errorf("error authorizing security group ingress: %v", err) - } - } - if remove.Len() != 0 { - glog.V(2).Infof("Remove security group ingress: %s %v", securityGroupId, remove.List()) - - request := &ec2.RevokeSecurityGroupIngressInput{} - request.GroupId = &securityGroupId - request.IpPermissions = remove.List() - _, err = s.ec2.RevokeSecurityGroupIngress(request) - if err != nil { - return false, fmt.Errorf("error revoking security group ingress: %v", err) - } - } - - return true, nil -} - -// Makes sure the security group includes the specified permissions -// Returns true if and only if changes were made -// The security group must already exist -func (s *AWSCloud) addSecurityGroupIngress(securityGroupId string, addPermissions []*ec2.IpPermission) (bool, error) { - group, err := s.findSecurityGroup(securityGroupId) - if err != nil { - glog.Warningf("Error retrieving security group: %v", err) - return false, err - } - - if group == nil { - return false, fmt.Errorf("security group not found: %s", securityGroupId) - } - - glog.V(2).Infof("Existing security group ingress: %s %v", securityGroupId, group.IpPermissions) - - changes := []*ec2.IpPermission{} - for _, addPermission := range addPermissions { - hasUserID := false - for i := range addPermission.UserIdGroupPairs { - if addPermission.UserIdGroupPairs[i].UserId != nil { - hasUserID = true - } - } - - found := false - for _, groupPermission := range group.IpPermissions { - if ipPermissionExists(addPermission, groupPermission, hasUserID) { - found = true - break - } - } - - if !found { - changes = append(changes, addPermission) - } - } - - if len(changes) == 0 { - return false, nil - } - - glog.V(2).Infof("Adding security group ingress: %s %v", securityGroupId, changes) - - request := &ec2.AuthorizeSecurityGroupIngressInput{} - request.GroupId = &securityGroupId - request.IpPermissions = changes - _, err = s.ec2.AuthorizeSecurityGroupIngress(request) - if err != nil { - glog.Warning("Error authorizing security group ingress", err) - return false, fmt.Errorf("error authorizing security group ingress: %v", err) - } - - return true, nil -} - -// Makes sure the security group no longer includes the specified permissions -// Returns true if and only if changes were made -// If the security group no longer exists, will return (false, nil) -func (s *AWSCloud) removeSecurityGroupIngress(securityGroupId string, removePermissions []*ec2.IpPermission) (bool, error) { - group, err := s.findSecurityGroup(securityGroupId) - if err != nil { - glog.Warningf("Error retrieving security group: %v", err) - return false, err - } - - if group == nil { - glog.Warning("Security group not found: ", securityGroupId) - return false, nil - } - - changes := []*ec2.IpPermission{} - for _, removePermission := range removePermissions { - hasUserID := false - for i := range removePermission.UserIdGroupPairs { - if removePermission.UserIdGroupPairs[i].UserId != nil { - hasUserID = true - } - } - - var found *ec2.IpPermission - for _, groupPermission := range group.IpPermissions { - if ipPermissionExists(removePermission, groupPermission, hasUserID) { - found = removePermission - break - } - } - - if found != nil { - changes = append(changes, found) - } - } - - if len(changes) == 0 { - return false, nil - } - - glog.V(2).Infof("Removing security group ingress: %s %v", securityGroupId, changes) - - request := &ec2.RevokeSecurityGroupIngressInput{} - request.GroupId = &securityGroupId - request.IpPermissions = changes - _, err = s.ec2.RevokeSecurityGroupIngress(request) - if err != nil { - glog.Warningf("Error revoking security group ingress: %v", err) - return false, err - } - - return true, nil -} - -// Ensure that a resource has the correct tags -// If it has no tags, we assume that this was a problem caused by an error in between creation and tagging, -// and we add the tags. If it has a different cluster's tags, that is an error. -func (s *AWSCloud) ensureClusterTags(resourceID string, tags []*ec2.Tag) error { - actualTags := make(map[string]string) - for _, tag := range tags { - actualTags[aws.StringValue(tag.Key)] = aws.StringValue(tag.Value) - } - - addTags := make(map[string]string) - for k, expected := range s.filterTags { - actual := actualTags[k] - if actual == expected { - continue - } - if actual == "" { - glog.Warningf("Resource %q was missing expected cluster tag %q. Will add (with value %q)", resourceID, k, expected) - addTags[k] = expected - } else { - return fmt.Errorf("resource %q has tag belonging to another cluster: %q=%q (expected %q)", resourceID, k, actual, expected) - } - } - - if err := s.createTags(resourceID, addTags); err != nil { - return fmt.Errorf("error adding missing tags to resource %q: %v", resourceID, err) - } - - return nil -} - -// Makes sure the security group exists. -// For multi-cluster isolation, name must be globally unique, for example derived from the service UUID. -// Returns the security group id or error -func (s *AWSCloud) ensureSecurityGroup(name string, description string) (string, error) { - groupID := "" - attempt := 0 - for { - attempt++ - - request := &ec2.DescribeSecurityGroupsInput{} - filters := []*ec2.Filter{ - newEc2Filter("group-name", name), - newEc2Filter("vpc-id", s.vpcID), - } - // Note that we do _not_ add our tag filters; group-name + vpc-id is the EC2 primary key. - // However, we do check that it matches our tags. - // If it doesn't have any tags, we tag it; this is how we recover if we failed to tag before. - // If it has a different cluster's tags, that is an error. - // This shouldn't happen because name is expected to be globally unique (UUID derived) - request.Filters = filters - - securityGroups, err := s.ec2.DescribeSecurityGroups(request) - if err != nil { - return "", err - } - - if len(securityGroups) >= 1 { - if len(securityGroups) > 1 { - glog.Warningf("Found multiple security groups with name: %q", name) - } - err := s.ensureClusterTags(aws.StringValue(securityGroups[0].GroupId), securityGroups[0].Tags) - if err != nil { - return "", err - } - - return aws.StringValue(securityGroups[0].GroupId), nil - } - - createRequest := &ec2.CreateSecurityGroupInput{} - createRequest.VpcId = &s.vpcID - createRequest.GroupName = &name - createRequest.Description = &description - - createResponse, err := s.ec2.CreateSecurityGroup(createRequest) - if err != nil { - ignore := false - switch err := err.(type) { - case awserr.Error: - if err.Code() == "InvalidGroup.Duplicate" && attempt < MaxReadThenCreateRetries { - glog.V(2).Infof("Got InvalidGroup.Duplicate while creating security group (race?); will retry") - ignore = true - } - } - if !ignore { - glog.Error("Error creating security group: ", err) - return "", err - } - time.Sleep(1 * time.Second) - } else { - groupID = orEmpty(createResponse.GroupId) - break - } - } - if groupID == "" { - return "", fmt.Errorf("created security group, but id was not returned: %s", name) - } - - err := s.createTags(groupID, s.filterTags) - if err != nil { - // If we retry, ensureClusterTags will recover from this - it - // will add the missing tags. We could delete the security - // group here, but that doesn't feel like the right thing, as - // the caller is likely to retry the create - return "", fmt.Errorf("error tagging security group: %v", err) - } - return groupID, nil -} - -// createTags calls EC2 CreateTags, but adds retry-on-failure logic -// We retry mainly because if we create an object, we cannot tag it until it is "fully created" (eventual consistency) -// The error code varies though (depending on what we are tagging), so we simply retry on all errors -func (s *AWSCloud) createTags(resourceID string, tags map[string]string) error { - if tags == nil || len(tags) == 0 { - return nil - } - - var awsTags []*ec2.Tag - for k, v := range tags { - tag := &ec2.Tag{ - Key: aws.String(k), - Value: aws.String(v), - } - awsTags = append(awsTags, tag) - } - - request := &ec2.CreateTagsInput{} - request.Resources = []*string{&resourceID} - request.Tags = awsTags - - // TODO: We really should do exponential backoff here - attempt := 0 - maxAttempts := 60 - - for { - _, err := s.ec2.CreateTags(request) - if err == nil { - return nil - } - - // We could check that the error is retryable, but the error code changes based on what we are tagging - // SecurityGroup: InvalidGroup.NotFound - attempt++ - if attempt > maxAttempts { - glog.Warningf("Failed to create tags (too many attempts): %v", err) - return err - } - glog.V(2).Infof("Failed to create tags; will retry. Error was %v", err) - time.Sleep(1 * time.Second) - } -} - -// Finds the value for a given tag. -func findTag(tags []*ec2.Tag, key string) (string, bool) { - for _, tag := range tags { - if aws.StringValue(tag.Key) == key { - return aws.StringValue(tag.Value), true - } - } - return "", false -} - -// Finds the subnets associated with the cluster, by matching tags. -// For maximal backwards compatibility, if no subnets are tagged, it will fall-back to the current subnet. -// However, in future this will likely be treated as an error. -func (c *AWSCloud) findSubnets() ([]*ec2.Subnet, error) { - request := &ec2.DescribeSubnetsInput{} - vpcIDFilter := newEc2Filter("vpc-id", c.vpcID) - filters := []*ec2.Filter{vpcIDFilter} - filters = c.addFilters(filters) - request.Filters = filters - - subnets, err := c.ec2.DescribeSubnets(request) - if err != nil { - return nil, fmt.Errorf("error describing subnets: %v", err) - } - - if len(subnets) != 0 { - return subnets, nil - } - - // Fall back to the current instance subnets, if nothing is tagged - glog.Warningf("No tagged subnets found; will fall-back to the current subnet only. This is likely to be an error in a future version of k8s.") - - request = &ec2.DescribeSubnetsInput{} - filters = []*ec2.Filter{newEc2Filter("subnet-id", c.selfAWSInstance.subnetID)} - request.Filters = filters - - subnets, err = c.ec2.DescribeSubnets(request) - if err != nil { - return nil, fmt.Errorf("error describing subnets: %v", err) - } - - return subnets, nil -} - -// Finds the subnets to use for an ELB we are creating. -// Normal (Internet-facing) ELBs must use public subnets, so we skip private subnets. -// Internal ELBs can use public or private subnets, but if we have a private subnet we should prefer that. -func (s *AWSCloud) findELBSubnets(internalELB bool) ([]string, error) { - vpcIDFilter := newEc2Filter("vpc-id", s.vpcID) - - subnets, err := s.findSubnets() - if err != nil { - return nil, err - } - - rRequest := &ec2.DescribeRouteTablesInput{} - rRequest.Filters = []*ec2.Filter{vpcIDFilter} - rt, err := s.ec2.DescribeRouteTables(rRequest) - if err != nil { - return nil, fmt.Errorf("error describe route table: %v", err) - } - - subnetsByAZ := make(map[string]*ec2.Subnet) - for _, subnet := range subnets { - az := aws.StringValue(subnet.AvailabilityZone) - id := aws.StringValue(subnet.SubnetId) - if az == "" || id == "" { - glog.Warningf("Ignoring subnet with empty az/id: %v", subnet) - continue - } - - isPublic, err := isSubnetPublic(rt, id) - if err != nil { - return nil, err - } - if !internalELB && !isPublic { - glog.V(2).Infof("Ignoring private subnet for public ELB %q", id) - continue - } - - existing := subnetsByAZ[az] - if existing == nil { - subnetsByAZ[az] = subnet - continue - } - - // Try to break the tie using a tag - var tagName string - if internalELB { - tagName = TagNameSubnetInternalELB - } else { - tagName = TagNameSubnetPublicELB - } - - _, existingHasTag := findTag(existing.Tags, tagName) - _, subnetHasTag := findTag(subnet.Tags, tagName) - - if existingHasTag != subnetHasTag { - if subnetHasTag { - subnetsByAZ[az] = subnet - } - continue - } - - // TODO: Should this be an error? - glog.Warningf("Found multiple subnets in AZ %q; making arbitrary choice between subnets %q and %q", az, *existing.SubnetId, *subnet.SubnetId) - continue - } - - var subnetIDs []string - for _, subnet := range subnetsByAZ { - subnetIDs = append(subnetIDs, aws.StringValue(subnet.SubnetId)) - } - - return subnetIDs, nil -} - -func isSubnetPublic(rt []*ec2.RouteTable, subnetID string) (bool, error) { - var subnetTable *ec2.RouteTable - for _, table := range rt { - for _, assoc := range table.Associations { - if aws.StringValue(assoc.SubnetId) == subnetID { - subnetTable = table - break - } - } - } - - if subnetTable == nil { - // If there is no explicit association, the subnet will be implicitly - // associated with the VPC's main routing table. - for _, table := range rt { - for _, assoc := range table.Associations { - if aws.BoolValue(assoc.Main) == true { - glog.V(4).Infof("Assuming implicit use of main routing table %s for %s", - aws.StringValue(table.RouteTableId), subnetID) - subnetTable = table - break - } - } - } - } - - if subnetTable == nil { - return false, fmt.Errorf("Could not locate routing table for subnet %s", subnetID) - } - - for _, route := range subnetTable.Routes { - // There is no direct way in the AWS API to determine if a subnet is public or private. - // A public subnet is one which has an internet gateway route - // we look for the gatewayId and make sure it has the prefix of igw to differentiate - // from the default in-subnet route which is called "local" - // or other virtual gateway (starting with vgv) - // or vpc peering connections (starting with pcx). - if strings.HasPrefix(aws.StringValue(route.GatewayId), "igw") { - return true, nil - } - } - - return false, nil -} - -// EnsureLoadBalancer implements LoadBalancer.EnsureLoadBalancer -func (s *AWSCloud) EnsureLoadBalancer(apiService *api.Service, hosts []string, annotations map[string]string) (*api.LoadBalancerStatus, error) { - glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", - apiService.Namespace, apiService.Name, s.region, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, annotations) - - if apiService.Spec.SessionAffinity != api.ServiceAffinityNone { - // ELB supports sticky sessions, but only when configured for HTTP/HTTPS - return nil, fmt.Errorf("unsupported load balancer affinity: %v", apiService.Spec.SessionAffinity) - } - - if len(apiService.Spec.Ports) == 0 { - return nil, fmt.Errorf("requested load balancer with no ports") - } - - for _, port := range apiService.Spec.Ports { - if port.Protocol != api.ProtocolTCP { - return nil, fmt.Errorf("Only TCP LoadBalancer is supported for AWS ELB") - } - } - - if apiService.Spec.LoadBalancerIP != "" { - return nil, fmt.Errorf("LoadBalancerIP cannot be specified for AWS ELB") - } - - instances, err := s.getInstancesByNodeNames(hosts) - if err != nil { - return nil, err - } - - sourceRanges, err := service.GetLoadBalancerSourceRanges(annotations) - if err != nil { - return nil, err - } - - // Determine if this is tagged as an Internal ELB - internalELB := false - internalAnnotation := annotations[ServiceAnnotationLoadBalancerInternal] - if internalAnnotation != "" { - if internalAnnotation != "0.0.0.0/0" { - return nil, fmt.Errorf("annotation %q=%q detected, but the only value supported currently is 0.0.0.0/0", ServiceAnnotationLoadBalancerInternal, internalAnnotation) - } - if !service.IsAllowAll(sourceRanges) { - // TODO: Unify the two annotations - return nil, fmt.Errorf("source-range annotation cannot be combined with the internal-elb annotation") - } - internalELB = true - } - - // Find the subnets that the ELB will live in - subnetIDs, err := s.findELBSubnets(internalELB) - if err != nil { - glog.Error("Error listing subnets in VPC: ", err) - return nil, err - } - - // Bail out early if there are no subnets - if len(subnetIDs) == 0 { - return nil, fmt.Errorf("could not find any suitable subnets for creating the ELB") - } - - loadBalancerName := cloudprovider.GetLoadBalancerName(apiService) - serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name} - - // Create a security group for the load balancer - var securityGroupID string - { - sgName := "k8s-elb-" + loadBalancerName - sgDescription := fmt.Sprintf("Security group for Kubernetes ELB %s (%v)", loadBalancerName, serviceName) - securityGroupID, err = s.ensureSecurityGroup(sgName, sgDescription) - if err != nil { - glog.Error("Error creating load balancer security group: ", err) - return nil, err - } - - ec2SourceRanges := []*ec2.IpRange{} - for _, sourceRange := range sourceRanges.StringSlice() { - ec2SourceRanges = append(ec2SourceRanges, &ec2.IpRange{CidrIp: aws.String(sourceRange)}) - } - - permissions := NewIPPermissionSet() - for _, port := range apiService.Spec.Ports { - portInt64 := int64(port.Port) - protocol := strings.ToLower(string(port.Protocol)) - - permission := &ec2.IpPermission{} - permission.FromPort = &portInt64 - permission.ToPort = &portInt64 - permission.IpRanges = ec2SourceRanges - permission.IpProtocol = &protocol - - permissions.Insert(permission) - } - _, err = s.setSecurityGroupIngress(securityGroupID, permissions) - if err != nil { - return nil, err - } - } - securityGroupIDs := []string{securityGroupID} - - // Figure out what mappings we want on the load balancer - listeners := []*elb.Listener{} - for _, port := range apiService.Spec.Ports { - if port.NodePort == 0 { - glog.Errorf("Ignoring port without NodePort defined: %v", port) - continue - } - instancePort := int64(port.NodePort) - loadBalancerPort := int64(port.Port) - protocol := strings.ToLower(string(port.Protocol)) - - listener := &elb.Listener{} - listener.InstancePort = &instancePort - listener.LoadBalancerPort = &loadBalancerPort - listener.Protocol = &protocol - listener.InstanceProtocol = &protocol - - listeners = append(listeners, listener) - } - - // Build the load balancer itself - loadBalancer, err := s.ensureLoadBalancer(serviceName, loadBalancerName, listeners, subnetIDs, securityGroupIDs, internalELB) - if err != nil { - return nil, err - } - - err = s.ensureLoadBalancerHealthCheck(loadBalancer, listeners) - if err != nil { - return nil, err - } - - err = s.updateInstanceSecurityGroupsForLoadBalancer(loadBalancer, instances) - if err != nil { - glog.Warningf("Error opening ingress rules for the load balancer to the instances: %v", err) - return nil, err - } - - err = s.ensureLoadBalancerInstances(orEmpty(loadBalancer.LoadBalancerName), loadBalancer.Instances, instances) - if err != nil { - glog.Warningf("Error registering instances with the load balancer: %v", err) - return nil, err - } - - glog.V(1).Infof("Loadbalancer %s (%v) has DNS name %s", loadBalancerName, serviceName, orEmpty(loadBalancer.DNSName)) - - // TODO: Wait for creation? - - status := toStatus(loadBalancer) - return status, nil -} - -// GetLoadBalancer is an implementation of LoadBalancer.GetLoadBalancer -func (s *AWSCloud) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - lb, err := s.describeLoadBalancer(loadBalancerName) - if err != nil { - return nil, false, err - } - - if lb == nil { - return nil, false, nil - } - - status := toStatus(lb) - return status, true, nil -} - -func toStatus(lb *elb.LoadBalancerDescription) *api.LoadBalancerStatus { - status := &api.LoadBalancerStatus{} - - if !isNilOrEmpty(lb.DNSName) { - var ingress api.LoadBalancerIngress - ingress.Hostname = orEmpty(lb.DNSName) - status.Ingress = []api.LoadBalancerIngress{ingress} - } - - return status -} - -// Returns the first security group for an instance, or nil -// We only create instances with one security group, so we don't expect multiple security groups. -// However, if there are multiple security groups, we will choose the one tagged with our cluster filter. -// Otherwise we will return an error. -func findSecurityGroupForInstance(instance *ec2.Instance, taggedSecurityGroups map[string]*ec2.SecurityGroup) (*ec2.GroupIdentifier, error) { - instanceID := aws.StringValue(instance.InstanceId) - - var tagged []*ec2.GroupIdentifier - var untagged []*ec2.GroupIdentifier - for _, group := range instance.SecurityGroups { - groupID := aws.StringValue(group.GroupId) - if groupID == "" { - glog.Warningf("Ignoring security group without id for instance %q: %v", instanceID, group) - continue - } - _, isTagged := taggedSecurityGroups[groupID] - if isTagged { - tagged = append(tagged, group) - } else { - untagged = append(untagged, group) - } - } - - if len(tagged) > 0 { - // We create instances with one SG - // If users create multiple SGs, they must tag one of them as being k8s owned - if len(tagged) != 1 { - return nil, fmt.Errorf("Multiple tagged security groups found for instance %s; ensure only the k8s security group is tagged", instanceID) - } - return tagged[0], nil - } - - if len(untagged) > 0 { - // For back-compat, we will allow a single untagged SG - if len(untagged) != 1 { - return nil, fmt.Errorf("Multiple untagged security groups found for instance %s; ensure the k8s security group is tagged", instanceID) - } - return untagged[0], nil - } - - glog.Warningf("No security group found for instance %q", instanceID) - return nil, nil -} - -// Return all the security groups that are tagged as being part of our cluster -func (s *AWSCloud) getTaggedSecurityGroups() (map[string]*ec2.SecurityGroup, error) { - request := &ec2.DescribeSecurityGroupsInput{} - request.Filters = s.addFilters(nil) - groups, err := s.ec2.DescribeSecurityGroups(request) - if err != nil { - return nil, fmt.Errorf("error querying security groups: %v", err) - } - - m := make(map[string]*ec2.SecurityGroup) - for _, group := range groups { - id := aws.StringValue(group.GroupId) - if id == "" { - glog.Warningf("Ignoring group without id: %v", group) - continue - } - m[id] = group - } - return m, nil -} - -// Open security group ingress rules on the instances so that the load balancer can talk to them -// Will also remove any security groups ingress rules for the load balancer that are _not_ needed for allInstances -func (s *AWSCloud) updateInstanceSecurityGroupsForLoadBalancer(lb *elb.LoadBalancerDescription, allInstances []*ec2.Instance) error { - if s.cfg.Global.DisableSecurityGroupIngress { - return nil - } - - // Determine the load balancer security group id - loadBalancerSecurityGroupId := "" - for _, securityGroup := range lb.SecurityGroups { - if isNilOrEmpty(securityGroup) { - continue - } - if loadBalancerSecurityGroupId != "" { - // We create LBs with one SG - glog.Warningf("Multiple security groups for load balancer: %q", orEmpty(lb.LoadBalancerName)) - } - loadBalancerSecurityGroupId = *securityGroup - } - if loadBalancerSecurityGroupId == "" { - return fmt.Errorf("Could not determine security group for load balancer: %s", orEmpty(lb.LoadBalancerName)) - } - - // Get the actual list of groups that allow ingress from the load-balancer - describeRequest := &ec2.DescribeSecurityGroupsInput{} - filters := []*ec2.Filter{} - filters = append(filters, newEc2Filter("ip-permission.group-id", loadBalancerSecurityGroupId)) - describeRequest.Filters = s.addFilters(filters) - actualGroups, err := s.ec2.DescribeSecurityGroups(describeRequest) - if err != nil { - return fmt.Errorf("error querying security groups for ELB: %v", err) - } - - taggedSecurityGroups, err := s.getTaggedSecurityGroups() - if err != nil { - return fmt.Errorf("error querying for tagged security groups: %v", err) - } - - // Open the firewall from the load balancer to the instance - // We don't actually have a trivial way to know in advance which security group the instance is in - // (it is probably the minion security group, but we don't easily have that). - // However, we _do_ have the list of security groups on the instance records. - - // Map containing the changes we want to make; true to add, false to remove - instanceSecurityGroupIds := map[string]bool{} - - // Scan instances for groups we want open - for _, instance := range allInstances { - securityGroup, err := findSecurityGroupForInstance(instance, taggedSecurityGroups) - if err != nil { - return err - } - - if securityGroup == nil { - glog.Warning("Ignoring instance without security group: ", orEmpty(instance.InstanceId)) - continue - } - id := aws.StringValue(securityGroup.GroupId) - if id == "" { - glog.Warningf("found security group without id: %v", securityGroup) - continue - } - - instanceSecurityGroupIds[id] = true - } - - // Compare to actual groups - for _, actualGroup := range actualGroups { - actualGroupID := aws.StringValue(actualGroup.GroupId) - if actualGroupID == "" { - glog.Warning("Ignoring group without ID: ", actualGroup) - continue - } - - adding, found := instanceSecurityGroupIds[actualGroupID] - if found && adding { - // We don't need to make a change; the permission is already in place - delete(instanceSecurityGroupIds, actualGroupID) - } else { - // This group is not needed by allInstances; delete it - instanceSecurityGroupIds[actualGroupID] = false - } - } - - for instanceSecurityGroupId, add := range instanceSecurityGroupIds { - if add { - glog.V(2).Infof("Adding rule for traffic from the load balancer (%s) to instances (%s)", loadBalancerSecurityGroupId, instanceSecurityGroupId) - } else { - glog.V(2).Infof("Removing rule for traffic from the load balancer (%s) to instance (%s)", loadBalancerSecurityGroupId, instanceSecurityGroupId) - } - sourceGroupId := &ec2.UserIdGroupPair{} - sourceGroupId.GroupId = &loadBalancerSecurityGroupId - - allProtocols := "-1" - - permission := &ec2.IpPermission{} - permission.IpProtocol = &allProtocols - permission.UserIdGroupPairs = []*ec2.UserIdGroupPair{sourceGroupId} - - permissions := []*ec2.IpPermission{permission} - - if add { - changed, err := s.addSecurityGroupIngress(instanceSecurityGroupId, permissions) - if err != nil { - return err - } - if !changed { - glog.Warning("Allowing ingress was not needed; concurrent change? groupId=", instanceSecurityGroupId) - } - } else { - changed, err := s.removeSecurityGroupIngress(instanceSecurityGroupId, permissions) - if err != nil { - return err - } - if !changed { - glog.Warning("Revoking ingress was not needed; concurrent change? groupId=", instanceSecurityGroupId) - } - } - } - - return nil -} - -// EnsureLoadBalancerDeleted implements LoadBalancer.EnsureLoadBalancerDeleted. -func (s *AWSCloud) EnsureLoadBalancerDeleted(service *api.Service) error { - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - lb, err := s.describeLoadBalancer(loadBalancerName) - if err != nil { - return err - } - - if lb == nil { - glog.Info("Load balancer already deleted: ", loadBalancerName) - return nil - } - - { - // De-authorize the load balancer security group from the instances security group - err = s.updateInstanceSecurityGroupsForLoadBalancer(lb, nil) - if err != nil { - glog.Error("Error deregistering load balancer from instance security groups: ", err) - return err - } - } - - { - // Delete the load balancer itself - request := &elb.DeleteLoadBalancerInput{} - request.LoadBalancerName = lb.LoadBalancerName - - _, err = s.elb.DeleteLoadBalancer(request) - if err != nil { - // TODO: Check if error was because load balancer was concurrently deleted - glog.Error("Error deleting load balancer: ", err) - return err - } - } - - { - // Delete the security group(s) for the load balancer - // Note that this is annoying: the load balancer disappears from the API immediately, but it is still - // deleting in the background. We get a DependencyViolation until the load balancer has deleted itself - - // Collect the security groups to delete - securityGroupIDs := map[string]struct{}{} - for _, securityGroupID := range lb.SecurityGroups { - if isNilOrEmpty(securityGroupID) { - glog.Warning("Ignoring empty security group in ", service.Name) - continue - } - securityGroupIDs[*securityGroupID] = struct{}{} - } - - // Loop through and try to delete them - timeoutAt := time.Now().Add(time.Second * 600) - for { - for securityGroupID := range securityGroupIDs { - request := &ec2.DeleteSecurityGroupInput{} - request.GroupId = &securityGroupID - _, err := s.ec2.DeleteSecurityGroup(request) - if err == nil { - delete(securityGroupIDs, securityGroupID) - } else { - ignore := false - if awsError, ok := err.(awserr.Error); ok { - if awsError.Code() == "DependencyViolation" { - glog.V(2).Infof("Ignoring DependencyViolation while deleting load-balancer security group (%s), assuming because LB is in process of deleting", securityGroupID) - ignore = true - } - } - if !ignore { - return fmt.Errorf("error while deleting load balancer security group (%s): %v", securityGroupID, err) - } - } - } - - if len(securityGroupIDs) == 0 { - glog.V(2).Info("Deleted all security groups for load balancer: ", service.Name) - break - } - - if time.Now().After(timeoutAt) { - ids := []string{} - for id := range securityGroupIDs { - ids = append(ids, id) - } - - return fmt.Errorf("timed out deleting ELB: %s. Could not delete security groups %v", service.Name, strings.Join(ids, ",")) - } - - glog.V(2).Info("Waiting for load-balancer to delete so we can delete security groups: ", service.Name) - - time.Sleep(10 * time.Second) - } - } - - return nil -} - -// UpdateLoadBalancer implements LoadBalancer.UpdateLoadBalancer -func (s *AWSCloud) UpdateLoadBalancer(service *api.Service, hosts []string) error { - instances, err := s.getInstancesByNodeNames(hosts) - if err != nil { - return err - } - - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - lb, err := s.describeLoadBalancer(loadBalancerName) - if err != nil { - return err - } - - if lb == nil { - return fmt.Errorf("Load balancer not found") - } - - err = s.ensureLoadBalancerInstances(orEmpty(lb.LoadBalancerName), lb.Instances, instances) - if err != nil { - return nil - } - - err = s.updateInstanceSecurityGroupsForLoadBalancer(lb, instances) - if err != nil { - return err - } - - return nil -} - -// Returns the instance with the specified ID -func (a *AWSCloud) getInstanceByID(instanceID string) (*ec2.Instance, error) { - instances, err := a.getInstancesByIDs([]*string{&instanceID}) - if err != nil { - return nil, err - } - - if len(instances) == 0 { - return nil, fmt.Errorf("no instances found for instance: %s", instanceID) - } - if len(instances) > 1 { - return nil, fmt.Errorf("multiple instances found for instance: %s", instanceID) - } - - return instances[instanceID], nil -} - -func (a *AWSCloud) getInstancesByIDs(instanceIDs []*string) (map[string]*ec2.Instance, error) { - instancesByID := make(map[string]*ec2.Instance) - if len(instanceIDs) == 0 { - return instancesByID, nil - } - - request := &ec2.DescribeInstancesInput{ - InstanceIds: instanceIDs, - } - - instances, err := a.ec2.DescribeInstances(request) - if err != nil { - return nil, err - } - - for _, instance := range instances { - instanceID := orEmpty(instance.InstanceId) - if instanceID == "" { - continue - } - - instancesByID[instanceID] = instance - } - - return instancesByID, nil -} - -// Fetches instances by node names; returns an error if any cannot be found. -// This is implemented with a multi value filter on the node names, fetching the desired instances with a single query. -func (a *AWSCloud) getInstancesByNodeNames(nodeNames []string) ([]*ec2.Instance, error) { - names := aws.StringSlice(nodeNames) - - nodeNameFilter := &ec2.Filter{ - Name: aws.String("private-dns-name"), - Values: names, - } - - filters := []*ec2.Filter{ - nodeNameFilter, - newEc2Filter("instance-state-name", "running"), - } - - filters = a.addFilters(filters) - request := &ec2.DescribeInstancesInput{ - Filters: filters, - } - - instances, err := a.ec2.DescribeInstances(request) - if err != nil { - glog.V(2).Infof("Failed to describe instances %v", nodeNames) - return nil, err - } - - if len(instances) == 0 { - glog.V(3).Infof("Failed to find any instances %v", nodeNames) - return nil, nil - } - - return instances, nil -} - -// Returns the instance with the specified node name -// Returns nil if it does not exist -func (a *AWSCloud) findInstanceByNodeName(nodeName string) (*ec2.Instance, error) { - filters := []*ec2.Filter{ - newEc2Filter("private-dns-name", nodeName), - newEc2Filter("instance-state-name", "running"), - } - filters = a.addFilters(filters) - request := &ec2.DescribeInstancesInput{ - Filters: filters, - } - - instances, err := a.ec2.DescribeInstances(request) - if err != nil { - return nil, err - } - if len(instances) == 0 { - return nil, nil - } - if len(instances) > 1 { - return nil, fmt.Errorf("multiple instances found for name: %s", nodeName) - } - return instances[0], nil -} - -// Returns the instance with the specified node name -// Like findInstanceByNodeName, but returns error if node not found -func (a *AWSCloud) getInstanceByNodeName(nodeName string) (*ec2.Instance, error) { - instance, err := a.findInstanceByNodeName(nodeName) - if err == nil && instance == nil { - return nil, fmt.Errorf("no instances found for name: %s", nodeName) - } - return instance, err -} - -// Add additional filters, to match on our tags -// This lets us run multiple k8s clusters in a single EC2 AZ -func (s *AWSCloud) addFilters(filters []*ec2.Filter) []*ec2.Filter { - for k, v := range s.filterTags { - filters = append(filters, newEc2Filter("tag:"+k, v)) - } - if len(filters) == 0 { - // We can't pass a zero-length Filters to AWS (it's an error) - // So if we end up with no filters; just return nil - return nil - } - - return filters -} - -// Returns the cluster name or an empty string -func (s *AWSCloud) getClusterName() string { - return s.filterTags[TagNameKubernetesCluster] -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_instancegroups.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_instancegroups.go deleted file mode 100644 index 563c90de1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_instancegroups.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/autoscaling" - "github.com/golang/glog" -) - -// AWSCloud implements InstanceGroups -var _ InstanceGroups = &AWSCloud{} - -// ResizeInstanceGroup sets the size of the specificed instancegroup Exported -// so it can be used by the e2e tests, which don't want to instantiate a full -// cloudprovider. -func ResizeInstanceGroup(asg ASG, instanceGroupName string, size int) error { - request := &autoscaling.UpdateAutoScalingGroupInput{ - AutoScalingGroupName: aws.String(instanceGroupName), - MinSize: aws.Int64(int64(size)), - MaxSize: aws.Int64(int64(size)), - } - if _, err := asg.UpdateAutoScalingGroup(request); err != nil { - return fmt.Errorf("error resizing AWS autoscaling group: %v", err) - } - return nil -} - -// Implement InstanceGroups.ResizeInstanceGroup -// Set the size to the fixed size -func (a *AWSCloud) ResizeInstanceGroup(instanceGroupName string, size int) error { - return ResizeInstanceGroup(a.asg, instanceGroupName, size) -} - -// DescribeInstanceGroup gets info about the specified instancegroup -// Exported so it can be used by the e2e tests, -// which don't want to instantiate a full cloudprovider. -func DescribeInstanceGroup(asg ASG, instanceGroupName string) (InstanceGroupInfo, error) { - request := &autoscaling.DescribeAutoScalingGroupsInput{ - AutoScalingGroupNames: []*string{aws.String(instanceGroupName)}, - } - response, err := asg.DescribeAutoScalingGroups(request) - if err != nil { - return nil, fmt.Errorf("error listing AWS autoscaling group (%s): %v", instanceGroupName, err) - } - - if len(response.AutoScalingGroups) == 0 { - return nil, nil - } - if len(response.AutoScalingGroups) > 1 { - glog.Warning("AWS returned multiple autoscaling groups with name ", instanceGroupName) - } - group := response.AutoScalingGroups[0] - return &awsInstanceGroup{group: group}, nil -} - -// Implement InstanceGroups.DescribeInstanceGroup -// Queries the cloud provider for information about the specified instance group -func (a *AWSCloud) DescribeInstanceGroup(instanceGroupName string) (InstanceGroupInfo, error) { - return DescribeInstanceGroup(a.asg, instanceGroupName) -} - -// awsInstanceGroup implements InstanceGroupInfo -var _ InstanceGroupInfo = &awsInstanceGroup{} - -type awsInstanceGroup struct { - group *autoscaling.Group -} - -// Implement InstanceGroupInfo.CurrentSize -// The number of instances currently running under control of this group -func (g *awsInstanceGroup) CurrentSize() (int, error) { - return len(g.group.Instances), nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_loadbalancer.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_loadbalancer.go deleted file mode 100644 index fe48045cf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_loadbalancer.go +++ /dev/null @@ -1,310 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "fmt" - "strconv" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/elb" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/sets" -) - -func (s *AWSCloud) ensureLoadBalancer(namespacedName types.NamespacedName, loadBalancerName string, listeners []*elb.Listener, subnetIDs []string, securityGroupIDs []string, internalELB bool) (*elb.LoadBalancerDescription, error) { - loadBalancer, err := s.describeLoadBalancer(loadBalancerName) - if err != nil { - return nil, err - } - - dirty := false - - if loadBalancer == nil { - createRequest := &elb.CreateLoadBalancerInput{} - createRequest.LoadBalancerName = aws.String(loadBalancerName) - - createRequest.Listeners = listeners - - if internalELB { - createRequest.Scheme = aws.String("internal") - } - - // We are supposed to specify one subnet per AZ. - // TODO: What happens if we have more than one subnet per AZ? - createRequest.Subnets = stringPointerArray(subnetIDs) - - createRequest.SecurityGroups = stringPointerArray(securityGroupIDs) - - createRequest.Tags = []*elb.Tag{ - {Key: aws.String(TagNameKubernetesCluster), Value: aws.String(s.getClusterName())}, - {Key: aws.String(TagNameKubernetesService), Value: aws.String(namespacedName.String())}, - } - - glog.Infof("Creating load balancer for %v with name: ", namespacedName, loadBalancerName) - _, err := s.elb.CreateLoadBalancer(createRequest) - if err != nil { - return nil, err - } - dirty = true - } else { - // TODO: Sync internal vs non-internal - - { - // Sync subnets - expected := sets.NewString(subnetIDs...) - actual := stringSetFromPointers(loadBalancer.Subnets) - - additions := expected.Difference(actual) - removals := actual.Difference(expected) - - if removals.Len() != 0 { - request := &elb.DetachLoadBalancerFromSubnetsInput{} - request.LoadBalancerName = aws.String(loadBalancerName) - request.Subnets = stringSetToPointers(removals) - glog.V(2).Info("Detaching load balancer from removed subnets") - _, err := s.elb.DetachLoadBalancerFromSubnets(request) - if err != nil { - return nil, fmt.Errorf("error detaching AWS loadbalancer from subnets: %v", err) - } - dirty = true - } - - if additions.Len() != 0 { - request := &elb.AttachLoadBalancerToSubnetsInput{} - request.LoadBalancerName = aws.String(loadBalancerName) - request.Subnets = stringSetToPointers(additions) - glog.V(2).Info("Attaching load balancer to added subnets") - _, err := s.elb.AttachLoadBalancerToSubnets(request) - if err != nil { - return nil, fmt.Errorf("error attaching AWS loadbalancer to subnets: %v", err) - } - dirty = true - } - } - - { - // Sync security groups - expected := sets.NewString(securityGroupIDs...) - actual := stringSetFromPointers(loadBalancer.SecurityGroups) - - if !expected.Equal(actual) { - // This call just replaces the security groups, unlike e.g. subnets (!) - request := &elb.ApplySecurityGroupsToLoadBalancerInput{} - request.LoadBalancerName = aws.String(loadBalancerName) - request.SecurityGroups = stringPointerArray(securityGroupIDs) - glog.V(2).Info("Applying updated security groups to load balancer") - _, err := s.elb.ApplySecurityGroupsToLoadBalancer(request) - if err != nil { - return nil, fmt.Errorf("error applying AWS loadbalancer security groups: %v", err) - } - dirty = true - } - } - - { - // Sync listeners - listenerDescriptions := loadBalancer.ListenerDescriptions - - foundSet := make(map[int]bool) - removals := []*int64{} - for _, listenerDescription := range listenerDescriptions { - actual := listenerDescription.Listener - if actual == nil { - glog.Warning("Ignoring empty listener in AWS loadbalancer: ", loadBalancerName) - continue - } - - found := -1 - for i, expected := range listeners { - if orEmpty(actual.Protocol) != orEmpty(expected.Protocol) { - continue - } - if orEmpty(actual.InstanceProtocol) != orEmpty(expected.InstanceProtocol) { - continue - } - if orZero(actual.InstancePort) != orZero(expected.InstancePort) { - continue - } - if orZero(actual.LoadBalancerPort) != orZero(expected.LoadBalancerPort) { - continue - } - if orEmpty(actual.SSLCertificateId) != orEmpty(expected.SSLCertificateId) { - continue - } - found = i - } - if found != -1 { - foundSet[found] = true - } else { - removals = append(removals, actual.LoadBalancerPort) - } - } - - additions := []*elb.Listener{} - for i := range listeners { - if foundSet[i] { - continue - } - additions = append(additions, listeners[i]) - } - - if len(removals) != 0 { - request := &elb.DeleteLoadBalancerListenersInput{} - request.LoadBalancerName = aws.String(loadBalancerName) - request.LoadBalancerPorts = removals - glog.V(2).Info("Deleting removed load balancer listeners") - _, err := s.elb.DeleteLoadBalancerListeners(request) - if err != nil { - return nil, fmt.Errorf("error deleting AWS loadbalancer listeners: %v", err) - } - dirty = true - } - - if len(additions) != 0 { - request := &elb.CreateLoadBalancerListenersInput{} - request.LoadBalancerName = aws.String(loadBalancerName) - request.Listeners = additions - glog.V(2).Info("Creating added load balancer listeners") - _, err := s.elb.CreateLoadBalancerListeners(request) - if err != nil { - return nil, fmt.Errorf("error creating AWS loadbalancer listeners: %v", err) - } - dirty = true - } - } - } - - if dirty { - loadBalancer, err = s.describeLoadBalancer(loadBalancerName) - if err != nil { - glog.Warning("Unable to retrieve load balancer after creation/update") - return nil, err - } - } - - return loadBalancer, nil -} - -// Makes sure that the health check for an ELB matches the configured listeners -func (s *AWSCloud) ensureLoadBalancerHealthCheck(loadBalancer *elb.LoadBalancerDescription, listeners []*elb.Listener) error { - actual := loadBalancer.HealthCheck - - // Default AWS settings - expectedHealthyThreshold := int64(2) - expectedUnhealthyThreshold := int64(6) - expectedTimeout := int64(5) - expectedInterval := int64(10) - - // We only configure a TCP health-check on the first port - expectedTarget := "" - for _, listener := range listeners { - if listener.InstancePort == nil { - continue - } - expectedTarget = "TCP:" + strconv.FormatInt(*listener.InstancePort, 10) - break - } - - if expectedTarget == "" { - return fmt.Errorf("unable to determine health check port (no valid listeners)") - } - - if expectedTarget == orEmpty(actual.Target) && - expectedHealthyThreshold == orZero(actual.HealthyThreshold) && - expectedUnhealthyThreshold == orZero(actual.UnhealthyThreshold) && - expectedTimeout == orZero(actual.Timeout) && - expectedInterval == orZero(actual.Interval) { - return nil - } - - glog.V(2).Info("Updating load-balancer health-check") - - healthCheck := &elb.HealthCheck{} - healthCheck.HealthyThreshold = &expectedHealthyThreshold - healthCheck.UnhealthyThreshold = &expectedUnhealthyThreshold - healthCheck.Timeout = &expectedTimeout - healthCheck.Interval = &expectedInterval - healthCheck.Target = &expectedTarget - - request := &elb.ConfigureHealthCheckInput{} - request.HealthCheck = healthCheck - request.LoadBalancerName = loadBalancer.LoadBalancerName - - _, err := s.elb.ConfigureHealthCheck(request) - if err != nil { - return fmt.Errorf("error configuring load-balancer health-check: %v", err) - } - - return nil -} - -// Makes sure that exactly the specified hosts are registered as instances with the load balancer -func (s *AWSCloud) ensureLoadBalancerInstances(loadBalancerName string, lbInstances []*elb.Instance, instances []*ec2.Instance) error { - expected := sets.NewString() - for _, instance := range instances { - expected.Insert(orEmpty(instance.InstanceId)) - } - - actual := sets.NewString() - for _, lbInstance := range lbInstances { - actual.Insert(orEmpty(lbInstance.InstanceId)) - } - - additions := expected.Difference(actual) - removals := actual.Difference(expected) - - addInstances := []*elb.Instance{} - for _, instanceId := range additions.List() { - addInstance := &elb.Instance{} - addInstance.InstanceId = aws.String(instanceId) - addInstances = append(addInstances, addInstance) - } - - removeInstances := []*elb.Instance{} - for _, instanceId := range removals.List() { - removeInstance := &elb.Instance{} - removeInstance.InstanceId = aws.String(instanceId) - removeInstances = append(removeInstances, removeInstance) - } - - if len(addInstances) > 0 { - registerRequest := &elb.RegisterInstancesWithLoadBalancerInput{} - registerRequest.Instances = addInstances - registerRequest.LoadBalancerName = aws.String(loadBalancerName) - _, err := s.elb.RegisterInstancesWithLoadBalancer(registerRequest) - if err != nil { - return err - } - glog.V(1).Infof("Instances added to load-balancer %s", loadBalancerName) - } - - if len(removeInstances) > 0 { - deregisterRequest := &elb.DeregisterInstancesFromLoadBalancerInput{} - deregisterRequest.Instances = removeInstances - deregisterRequest.LoadBalancerName = aws.String(loadBalancerName) - _, err := s.elb.DeregisterInstancesFromLoadBalancer(deregisterRequest) - if err != nil { - return err - } - glog.V(1).Infof("Instances removed from load-balancer %s", loadBalancerName) - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_routes.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_routes.go deleted file mode 100644 index a469e5f70..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_routes.go +++ /dev/null @@ -1,188 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -func (s *AWSCloud) findRouteTable(clusterName string) (*ec2.RouteTable, error) { - // This should be unnecessary (we already filter on TagNameKubernetesCluster, - // and something is broken if cluster name doesn't match, but anyway... - // TODO: All clouds should be cluster-aware by default - filters := []*ec2.Filter{newEc2Filter("tag:"+TagNameKubernetesCluster, clusterName)} - request := &ec2.DescribeRouteTablesInput{Filters: s.addFilters(filters)} - - tables, err := s.ec2.DescribeRouteTables(request) - if err != nil { - return nil, err - } - - if len(tables) == 0 { - return nil, fmt.Errorf("unable to find route table for AWS cluster: %s", clusterName) - } - - if len(tables) != 1 { - return nil, fmt.Errorf("found multiple matching AWS route tables for AWS cluster: %s", clusterName) - } - return tables[0], nil -} - -// ListRoutes implements Routes.ListRoutes -// List all routes that match the filter -func (s *AWSCloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, error) { - table, err := s.findRouteTable(clusterName) - if err != nil { - return nil, err - } - - var routes []*cloudprovider.Route - var instanceIDs []*string - - for _, r := range table.Routes { - instanceID := orEmpty(r.InstanceId) - - if instanceID == "" { - continue - } - - instanceIDs = append(instanceIDs, &instanceID) - } - - instances, err := s.getInstancesByIDs(instanceIDs) - if err != nil { - return nil, err - } - - for _, r := range table.Routes { - instanceID := orEmpty(r.InstanceId) - destinationCIDR := orEmpty(r.DestinationCidrBlock) - - if instanceID == "" || destinationCIDR == "" { - continue - } - - instance, found := instances[instanceID] - if !found { - glog.Warningf("unable to find instance ID %s in the list of instances being routed to", instanceID) - continue - } - instanceName := orEmpty(instance.PrivateDnsName) - routeName := clusterName + "-" + destinationCIDR - routes = append(routes, &cloudprovider.Route{Name: routeName, TargetInstance: instanceName, DestinationCIDR: destinationCIDR}) - } - - return routes, nil -} - -// Sets the instance attribute "source-dest-check" to the specified value -func (s *AWSCloud) configureInstanceSourceDestCheck(instanceID string, sourceDestCheck bool) error { - request := &ec2.ModifyInstanceAttributeInput{} - request.InstanceId = aws.String(instanceID) - request.SourceDestCheck = &ec2.AttributeBooleanValue{Value: aws.Bool(sourceDestCheck)} - - _, err := s.ec2.ModifyInstanceAttribute(request) - if err != nil { - return fmt.Errorf("error configuring source-dest-check on instance %s: %v", instanceID, err) - } - return nil -} - -// CreateRoute implements Routes.CreateRoute -// Create the described route -func (s *AWSCloud) CreateRoute(clusterName string, nameHint string, route *cloudprovider.Route) error { - instance, err := s.getInstanceByNodeName(route.TargetInstance) - if err != nil { - return err - } - - // In addition to configuring the route itself, we also need to configure the instance to accept that traffic - // On AWS, this requires turning source-dest checks off - err = s.configureInstanceSourceDestCheck(orEmpty(instance.InstanceId), false) - if err != nil { - return err - } - - table, err := s.findRouteTable(clusterName) - if err != nil { - return err - } - - var deleteRoute *ec2.Route - for _, r := range table.Routes { - destinationCIDR := aws.StringValue(r.DestinationCidrBlock) - - if destinationCIDR != route.DestinationCIDR { - continue - } - - if aws.StringValue(r.State) == ec2.RouteStateBlackhole { - deleteRoute = r - } - } - - if deleteRoute != nil { - glog.Infof("deleting blackholed route: %s", aws.StringValue(deleteRoute.DestinationCidrBlock)) - - request := &ec2.DeleteRouteInput{} - request.DestinationCidrBlock = deleteRoute.DestinationCidrBlock - request.RouteTableId = table.RouteTableId - - _, err = s.ec2.DeleteRoute(request) - if err != nil { - return fmt.Errorf("error deleting blackholed AWS route (%s): %v", aws.StringValue(deleteRoute.DestinationCidrBlock), err) - } - } - - request := &ec2.CreateRouteInput{} - // TODO: use ClientToken for idempotency? - request.DestinationCidrBlock = aws.String(route.DestinationCIDR) - request.InstanceId = instance.InstanceId - request.RouteTableId = table.RouteTableId - - _, err = s.ec2.CreateRoute(request) - if err != nil { - return fmt.Errorf("error creating AWS route (%s): %v", route.DestinationCIDR, err) - } - - return nil -} - -// DeleteRoute implements Routes.DeleteRoute -// Delete the specified route -func (s *AWSCloud) DeleteRoute(clusterName string, route *cloudprovider.Route) error { - table, err := s.findRouteTable(clusterName) - if err != nil { - return err - } - - request := &ec2.DeleteRouteInput{} - request.DestinationCidrBlock = aws.String(route.DestinationCIDR) - request.RouteTableId = table.RouteTableId - - _, err = s.ec2.DeleteRoute(request) - if err != nil { - return fmt.Errorf("error deleting AWS route (%s): %v", route.DestinationCIDR, err) - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_test.go deleted file mode 100644 index 338886530..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_test.go +++ /dev/null @@ -1,1201 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "io" - "reflect" - "strings" - "testing" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/aws/aws-sdk-go/service/elb" - - "github.com/aws/aws-sdk-go/service/autoscaling" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" -) - -const TestClusterId = "clusterid.test" - -func TestReadAWSCloudConfig(t *testing.T) { - tests := []struct { - name string - - reader io.Reader - aws AWSServices - - expectError bool - zone string - }{ - { - "No config reader", - nil, nil, - true, "", - }, - { - "Empty config, no metadata", - strings.NewReader(""), nil, - true, "", - }, - { - "No zone in config, no metadata", - strings.NewReader("[global]\n"), nil, - true, "", - }, - { - "Zone in config, no metadata", - strings.NewReader("[global]\nzone = eu-west-1a"), nil, - false, "eu-west-1a", - }, - { - "No zone in config, metadata does not have zone", - strings.NewReader("[global]\n"), NewFakeAWSServices().withAz(""), - true, "", - }, - { - "No zone in config, metadata has zone", - strings.NewReader("[global]\n"), NewFakeAWSServices(), - false, "us-east-1a", - }, - { - "Zone in config should take precedence over metadata", - strings.NewReader("[global]\nzone = eu-west-1a"), NewFakeAWSServices(), - false, "eu-west-1a", - }, - } - - for _, test := range tests { - t.Logf("Running test case %s", test.name) - var metadata EC2Metadata - if test.aws != nil { - metadata, _ = test.aws.Metadata() - } - cfg, err := readAWSCloudConfig(test.reader, metadata) - if test.expectError { - if err == nil { - t.Errorf("Should error for case %s (cfg=%v)", test.name, cfg) - } - } else { - if err != nil { - t.Errorf("Should succeed for case: %s", test.name) - } - if cfg.Global.Zone != test.zone { - t.Errorf("Incorrect zone value (%s vs %s) for case: %s", - cfg.Global.Zone, test.zone, test.name) - } - } - } -} - -type FakeAWSServices struct { - region string - instances []*ec2.Instance - selfInstance *ec2.Instance - networkInterfacesMacs []string - networkInterfacesVpcIDs []string - - ec2 *FakeEC2 - elb *FakeELB - asg *FakeASG - metadata *FakeMetadata -} - -func NewFakeAWSServices() *FakeAWSServices { - s := &FakeAWSServices{} - s.region = "us-east-1" - s.ec2 = &FakeEC2{aws: s} - s.elb = &FakeELB{aws: s} - s.asg = &FakeASG{aws: s} - s.metadata = &FakeMetadata{aws: s} - - s.networkInterfacesMacs = []string{"aa:bb:cc:dd:ee:00", "aa:bb:cc:dd:ee:01"} - s.networkInterfacesVpcIDs = []string{"vpc-mac0", "vpc-mac1"} - - selfInstance := &ec2.Instance{} - selfInstance.InstanceId = aws.String("i-self") - selfInstance.Placement = &ec2.Placement{ - AvailabilityZone: aws.String("us-east-1a"), - } - selfInstance.PrivateDnsName = aws.String("ip-172-20-0-100.ec2.internal") - selfInstance.PrivateIpAddress = aws.String("192.168.0.1") - selfInstance.PublicIpAddress = aws.String("1.2.3.4") - s.selfInstance = selfInstance - s.instances = []*ec2.Instance{selfInstance} - - var tag ec2.Tag - tag.Key = aws.String(TagNameKubernetesCluster) - tag.Value = aws.String(TestClusterId) - selfInstance.Tags = []*ec2.Tag{&tag} - - return s -} - -func (s *FakeAWSServices) withAz(az string) *FakeAWSServices { - if s.selfInstance.Placement == nil { - s.selfInstance.Placement = &ec2.Placement{} - } - s.selfInstance.Placement.AvailabilityZone = aws.String(az) - return s -} - -func (s *FakeAWSServices) Compute(region string) (EC2, error) { - return s.ec2, nil -} - -func (s *FakeAWSServices) LoadBalancing(region string) (ELB, error) { - return s.elb, nil -} - -func (s *FakeAWSServices) Autoscaling(region string) (ASG, error) { - return s.asg, nil -} - -func (s *FakeAWSServices) Metadata() (EC2Metadata, error) { - return s.metadata, nil -} - -func TestFilterTags(t *testing.T) { - awsServices := NewFakeAWSServices() - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - if err != nil { - t.Errorf("Error building aws cloud: %v", err) - return - } - - if len(c.filterTags) != 1 { - t.Errorf("unexpected filter tags: %v", c.filterTags) - return - } - - if c.filterTags[TagNameKubernetesCluster] != TestClusterId { - t.Errorf("unexpected filter tags: %v", c.filterTags) - } -} - -func TestNewAWSCloud(t *testing.T) { - tests := []struct { - name string - - reader io.Reader - awsServices AWSServices - - expectError bool - region string - }{ - { - "No config reader", - nil, NewFakeAWSServices().withAz(""), - true, "", - }, - { - "Config specified invalid zone", - strings.NewReader("[global]\nzone = blahonga"), NewFakeAWSServices(), - true, "", - }, - { - "Config specifies valid zone", - strings.NewReader("[global]\nzone = eu-west-1a"), NewFakeAWSServices(), - false, "eu-west-1", - }, - { - "Gets zone from metadata when not in config", - strings.NewReader("[global]\n"), - NewFakeAWSServices(), - false, "us-east-1", - }, - { - "No zone in config or metadata", - strings.NewReader("[global]\n"), - NewFakeAWSServices().withAz(""), - true, "", - }, - } - - for _, test := range tests { - t.Logf("Running test case %s", test.name) - c, err := newAWSCloud(test.reader, test.awsServices) - if test.expectError { - if err == nil { - t.Errorf("Should error for case %s", test.name) - } - } else { - if err != nil { - t.Errorf("Should succeed for case: %s, got %v", test.name, err) - } else if c.region != test.region { - t.Errorf("Incorrect region value (%s vs %s) for case: %s", - c.region, test.region, test.name) - } - } - } -} - -type FakeEC2 struct { - aws *FakeAWSServices - Subnets []*ec2.Subnet - DescribeSubnetsInput *ec2.DescribeSubnetsInput - RouteTables []*ec2.RouteTable - DescribeRouteTablesInput *ec2.DescribeRouteTablesInput - mock.Mock -} - -func contains(haystack []*string, needle string) bool { - for _, s := range haystack { - // (deliberately panic if s == nil) - if needle == *s { - return true - } - } - return false -} - -func instanceMatchesFilter(instance *ec2.Instance, filter *ec2.Filter) bool { - name := *filter.Name - if name == "private-dns-name" { - if instance.PrivateDnsName == nil { - return false - } - return contains(filter.Values, *instance.PrivateDnsName) - } - - if name == "instance-state-name" { - return contains(filter.Values, *instance.State.Name) - } - - if strings.HasPrefix(name, "tag:") { - tagName := name[4:] - for _, instanceTag := range instance.Tags { - if aws.StringValue(instanceTag.Key) == tagName && contains(filter.Values, aws.StringValue(instanceTag.Value)) { - return true - } - } - } - panic("Unknown filter name: " + name) -} - -func (self *FakeEC2) DescribeInstances(request *ec2.DescribeInstancesInput) ([]*ec2.Instance, error) { - matches := []*ec2.Instance{} - for _, instance := range self.aws.instances { - if request.InstanceIds != nil { - if instance.InstanceId == nil { - glog.Warning("Instance with no instance id: ", instance) - continue - } - - found := false - for _, instanceID := range request.InstanceIds { - if *instanceID == *instance.InstanceId { - found = true - break - } - } - if !found { - continue - } - } - if request.Filters != nil { - allMatch := true - for _, filter := range request.Filters { - if !instanceMatchesFilter(instance, filter) { - allMatch = false - break - } - } - if !allMatch { - continue - } - } - matches = append(matches, instance) - } - - return matches, nil -} - -type FakeMetadata struct { - aws *FakeAWSServices -} - -func (self *FakeMetadata) GetMetadata(key string) (string, error) { - networkInterfacesPrefix := "network/interfaces/macs/" - i := self.aws.selfInstance - if key == "placement/availability-zone" { - az := "" - if i.Placement != nil { - az = aws.StringValue(i.Placement.AvailabilityZone) - } - return az, nil - } else if key == "instance-id" { - return aws.StringValue(i.InstanceId), nil - } else if key == "local-hostname" { - return aws.StringValue(i.PrivateDnsName), nil - } else if key == "local-ipv4" { - return aws.StringValue(i.PrivateIpAddress), nil - } else if key == "public-ipv4" { - return aws.StringValue(i.PublicIpAddress), nil - } else if strings.HasPrefix(key, networkInterfacesPrefix) { - if key == networkInterfacesPrefix { - return strings.Join(self.aws.networkInterfacesMacs, "/\n") + "/\n", nil - } else { - keySplit := strings.Split(key, "/") - macParam := keySplit[3] - if len(keySplit) == 5 && keySplit[4] == "vpc-id" { - for i, macElem := range self.aws.networkInterfacesMacs { - if macParam == macElem { - return self.aws.networkInterfacesVpcIDs[i], nil - } - } - } - return "", nil - } - } else { - return "", nil - } -} - -func (ec2 *FakeEC2) AttachVolume(request *ec2.AttachVolumeInput) (resp *ec2.VolumeAttachment, err error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DetachVolume(request *ec2.DetachVolumeInput) (resp *ec2.VolumeAttachment, err error) { - panic("Not implemented") -} - -func (e *FakeEC2) DescribeVolumes(request *ec2.DescribeVolumesInput) ([]*ec2.Volume, error) { - args := e.Called(request) - return args.Get(0).([]*ec2.Volume), nil -} - -func (ec2 *FakeEC2) CreateVolume(request *ec2.CreateVolumeInput) (resp *ec2.Volume, err error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DeleteVolume(request *ec2.DeleteVolumeInput) (resp *ec2.DeleteVolumeOutput, err error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DescribeSecurityGroups(request *ec2.DescribeSecurityGroupsInput) ([]*ec2.SecurityGroup, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) CreateSecurityGroup(*ec2.CreateSecurityGroupInput) (*ec2.CreateSecurityGroupOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DeleteSecurityGroup(*ec2.DeleteSecurityGroupInput) (*ec2.DeleteSecurityGroupOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) AuthorizeSecurityGroupIngress(*ec2.AuthorizeSecurityGroupIngressInput) (*ec2.AuthorizeSecurityGroupIngressOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) RevokeSecurityGroupIngress(*ec2.RevokeSecurityGroupIngressInput) (*ec2.RevokeSecurityGroupIngressOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DescribeSubnets(request *ec2.DescribeSubnetsInput) ([]*ec2.Subnet, error) { - ec2.DescribeSubnetsInput = request - return ec2.Subnets, nil -} - -func (ec2 *FakeEC2) CreateTags(*ec2.CreateTagsInput) (*ec2.CreateTagsOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeEC2) DescribeRouteTables(request *ec2.DescribeRouteTablesInput) ([]*ec2.RouteTable, error) { - ec2.DescribeRouteTablesInput = request - return ec2.RouteTables, nil -} - -func (s *FakeEC2) CreateRoute(request *ec2.CreateRouteInput) (*ec2.CreateRouteOutput, error) { - panic("Not implemented") -} - -func (s *FakeEC2) DeleteRoute(request *ec2.DeleteRouteInput) (*ec2.DeleteRouteOutput, error) { - panic("Not implemented") -} - -func (s *FakeEC2) ModifyInstanceAttribute(request *ec2.ModifyInstanceAttributeInput) (*ec2.ModifyInstanceAttributeOutput, error) { - panic("Not implemented") -} - -type FakeELB struct { - aws *FakeAWSServices - mock.Mock -} - -func (ec2 *FakeELB) CreateLoadBalancer(*elb.CreateLoadBalancerInput) (*elb.CreateLoadBalancerOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) DeleteLoadBalancer(input *elb.DeleteLoadBalancerInput) (*elb.DeleteLoadBalancerOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) DescribeLoadBalancers(input *elb.DescribeLoadBalancersInput) (*elb.DescribeLoadBalancersOutput, error) { - args := ec2.Called(input) - return args.Get(0).(*elb.DescribeLoadBalancersOutput), nil -} -func (ec2 *FakeELB) RegisterInstancesWithLoadBalancer(*elb.RegisterInstancesWithLoadBalancerInput) (*elb.RegisterInstancesWithLoadBalancerOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) DeregisterInstancesFromLoadBalancer(*elb.DeregisterInstancesFromLoadBalancerInput) (*elb.DeregisterInstancesFromLoadBalancerOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) DetachLoadBalancerFromSubnets(*elb.DetachLoadBalancerFromSubnetsInput) (*elb.DetachLoadBalancerFromSubnetsOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) AttachLoadBalancerToSubnets(*elb.AttachLoadBalancerToSubnetsInput) (*elb.AttachLoadBalancerToSubnetsOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) CreateLoadBalancerListeners(*elb.CreateLoadBalancerListenersInput) (*elb.CreateLoadBalancerListenersOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) DeleteLoadBalancerListeners(*elb.DeleteLoadBalancerListenersInput) (*elb.DeleteLoadBalancerListenersOutput, error) { - panic("Not implemented") -} - -func (ec2 *FakeELB) ApplySecurityGroupsToLoadBalancer(*elb.ApplySecurityGroupsToLoadBalancerInput) (*elb.ApplySecurityGroupsToLoadBalancerOutput, error) { - panic("Not implemented") -} - -func (elb *FakeELB) ConfigureHealthCheck(*elb.ConfigureHealthCheckInput) (*elb.ConfigureHealthCheckOutput, error) { - panic("Not implemented") -} - -type FakeASG struct { - aws *FakeAWSServices -} - -func (a *FakeASG) UpdateAutoScalingGroup(*autoscaling.UpdateAutoScalingGroupInput) (*autoscaling.UpdateAutoScalingGroupOutput, error) { - panic("Not implemented") -} - -func (a *FakeASG) DescribeAutoScalingGroups(*autoscaling.DescribeAutoScalingGroupsInput) (*autoscaling.DescribeAutoScalingGroupsOutput, error) { - panic("Not implemented") -} - -func mockInstancesResp(selfInstance *ec2.Instance, instances []*ec2.Instance) (*AWSCloud, *FakeAWSServices) { - awsServices := NewFakeAWSServices() - awsServices.instances = instances - awsServices.selfInstance = selfInstance - awsCloud, err := newAWSCloud(nil, awsServices) - if err != nil { - panic(err) - } - return awsCloud, awsServices -} - -func mockAvailabilityZone(availabilityZone string) *AWSCloud { - awsServices := NewFakeAWSServices().withAz(availabilityZone) - awsCloud, err := newAWSCloud(nil, awsServices) - if err != nil { - panic(err) - } - return awsCloud -} - -func TestList(t *testing.T) { - // TODO this setup is not very clean and could probably be improved - var instance0 ec2.Instance - var instance1 ec2.Instance - var instance2 ec2.Instance - var instance3 ec2.Instance - - //0 - tag0 := ec2.Tag{ - Key: aws.String("Name"), - Value: aws.String("foo"), - } - instance0.Tags = []*ec2.Tag{&tag0} - instance0.InstanceId = aws.String("instance0") - instance0.PrivateDnsName = aws.String("instance0.ec2.internal") - instance0.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state0 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance0.State = &state0 - - //1 - tag1 := ec2.Tag{ - Key: aws.String("Name"), - Value: aws.String("bar"), - } - instance1.Tags = []*ec2.Tag{&tag1} - instance1.InstanceId = aws.String("instance1") - instance1.PrivateDnsName = aws.String("instance1.ec2.internal") - instance1.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state1 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance1.State = &state1 - - //2 - tag2 := ec2.Tag{ - Key: aws.String("Name"), - Value: aws.String("baz"), - } - instance2.Tags = []*ec2.Tag{&tag2} - instance2.InstanceId = aws.String("instance2") - instance2.PrivateDnsName = aws.String("instance2.ec2.internal") - instance2.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state2 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance2.State = &state2 - - //3 - tag3 := ec2.Tag{ - Key: aws.String("Name"), - Value: aws.String("quux"), - } - instance3.Tags = []*ec2.Tag{&tag3} - instance3.InstanceId = aws.String("instance3") - instance3.PrivateDnsName = aws.String("instance3.ec2.internal") - instance3.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state3 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance3.State = &state3 - - instances := []*ec2.Instance{&instance0, &instance1, &instance2, &instance3} - aws, _ := mockInstancesResp(&instance0, instances) - - table := []struct { - input string - expect []string - }{ - {"blahonga", []string{}}, - {"quux", []string{"instance3.ec2.internal"}}, - {"a", []string{"instance1.ec2.internal", "instance2.ec2.internal"}}, - } - - for _, item := range table { - result, err := aws.List(item.input) - if err != nil { - t.Errorf("Expected call with %v to succeed, failed with %s", item.input, err) - } - if e, a := item.expect, result; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %v, got %v", e, a) - } - } -} - -func testHasNodeAddress(t *testing.T, addrs []api.NodeAddress, addressType api.NodeAddressType, address string) { - for _, addr := range addrs { - if addr.Type == addressType && addr.Address == address { - return - } - } - t.Errorf("Did not find expected address: %s:%s in %v", addressType, address, addrs) -} - -func TestNodeAddresses(t *testing.T) { - // Note these instances have the same name - // (we test that this produces an error) - var instance0 ec2.Instance - var instance1 ec2.Instance - var instance2 ec2.Instance - - //0 - instance0.InstanceId = aws.String("i-0") - instance0.PrivateDnsName = aws.String("instance-same.ec2.internal") - instance0.PrivateIpAddress = aws.String("192.168.0.1") - instance0.PublicIpAddress = aws.String("1.2.3.4") - instance0.InstanceType = aws.String("c3.large") - instance0.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state0 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance0.State = &state0 - - //1 - instance1.InstanceId = aws.String("i-1") - instance1.PrivateDnsName = aws.String("instance-same.ec2.internal") - instance1.PrivateIpAddress = aws.String("192.168.0.2") - instance1.InstanceType = aws.String("c3.large") - instance1.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state1 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance1.State = &state1 - - //2 - instance2.InstanceId = aws.String("i-2") - instance2.PrivateDnsName = aws.String("instance-other.ec2.internal") - instance2.PrivateIpAddress = aws.String("192.168.0.1") - instance2.PublicIpAddress = aws.String("1.2.3.4") - instance2.InstanceType = aws.String("c3.large") - instance2.Placement = &ec2.Placement{AvailabilityZone: aws.String("us-east-1a")} - state2 := ec2.InstanceState{ - Name: aws.String("running"), - } - instance2.State = &state2 - - instances := []*ec2.Instance{&instance0, &instance1, &instance2} - - aws1, _ := mockInstancesResp(&instance0, []*ec2.Instance{&instance0}) - _, err1 := aws1.NodeAddresses("instance-mismatch.ec2.internal") - if err1 == nil { - t.Errorf("Should error when no instance found") - } - - aws2, _ := mockInstancesResp(&instance2, instances) - _, err2 := aws2.NodeAddresses("instance-same.ec2.internal") - if err2 == nil { - t.Errorf("Should error when multiple instances found") - } - - aws3, _ := mockInstancesResp(&instance0, instances[0:1]) - addrs3, err3 := aws3.NodeAddresses("instance-same.ec2.internal") - if err3 != nil { - t.Errorf("Should not error when instance found") - } - if len(addrs3) != 3 { - t.Errorf("Should return exactly 3 NodeAddresses") - } - testHasNodeAddress(t, addrs3, api.NodeInternalIP, "192.168.0.1") - testHasNodeAddress(t, addrs3, api.NodeLegacyHostIP, "192.168.0.1") - testHasNodeAddress(t, addrs3, api.NodeExternalIP, "1.2.3.4") - - // Fetch from metadata - aws4, fakeServices := mockInstancesResp(&instance0, []*ec2.Instance{&instance0}) - fakeServices.selfInstance.PublicIpAddress = aws.String("2.3.4.5") - fakeServices.selfInstance.PrivateIpAddress = aws.String("192.168.0.2") - - addrs4, err4 := aws4.NodeAddresses(*instance0.PrivateDnsName) - if err4 != nil { - t.Errorf("unexpected error: %v", err4) - } - testHasNodeAddress(t, addrs4, api.NodeInternalIP, "192.168.0.2") - testHasNodeAddress(t, addrs4, api.NodeExternalIP, "2.3.4.5") -} - -func TestGetRegion(t *testing.T) { - aws := mockAvailabilityZone("us-west-2e") - zones, ok := aws.Zones() - if !ok { - t.Fatalf("Unexpected missing zones impl") - } - zone, err := zones.GetZone() - if err != nil { - t.Fatalf("unexpected error %v", err) - } - if zone.Region != "us-west-2" { - t.Errorf("Unexpected region: %s", zone.Region) - } - if zone.FailureDomain != "us-west-2e" { - t.Errorf("Unexpected FailureDomain: %s", zone.FailureDomain) - } -} - -func TestFindVPCID(t *testing.T) { - awsServices := NewFakeAWSServices() - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - if err != nil { - t.Errorf("Error building aws cloud: %v", err) - return - } - vpcID, err := c.findVPCID() - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - if vpcID != "vpc-mac0" { - t.Errorf("Unexpected vpcID: %s", vpcID) - } -} - -func constructSubnets(subnetsIn map[int]map[string]string) (subnetsOut []*ec2.Subnet) { - for i := range subnetsIn { - subnetsOut = append( - subnetsOut, - constructSubnet( - subnetsIn[i]["id"], - subnetsIn[i]["az"], - ), - ) - } - return -} - -func constructSubnet(id string, az string) *ec2.Subnet { - return &ec2.Subnet{ - SubnetId: &id, - AvailabilityZone: &az, - } -} - -func constructRouteTables(routeTablesIn map[string]bool) (routeTablesOut []*ec2.RouteTable) { - routeTablesOut = append(routeTablesOut, - &ec2.RouteTable{ - Associations: []*ec2.RouteTableAssociation{{Main: aws.Bool(true)}}, - Routes: []*ec2.Route{{ - DestinationCidrBlock: aws.String("0.0.0.0/0"), - GatewayId: aws.String("igw-main"), - }}, - }) - - for subnetID := range routeTablesIn { - routeTablesOut = append( - routeTablesOut, - constructRouteTable( - subnetID, - routeTablesIn[subnetID], - ), - ) - } - return -} - -func constructRouteTable(subnetID string, public bool) *ec2.RouteTable { - var gatewayID string - if public { - gatewayID = "igw-" + subnetID[len(subnetID)-8:8] - } else { - gatewayID = "vgw-" + subnetID[len(subnetID)-8:8] - } - return &ec2.RouteTable{ - Associations: []*ec2.RouteTableAssociation{{SubnetId: aws.String(subnetID)}}, - Routes: []*ec2.Route{{ - DestinationCidrBlock: aws.String("0.0.0.0/0"), - GatewayId: aws.String(gatewayID), - }}, - } -} - -func TestSubnetIDsinVPC(t *testing.T) { - awsServices := NewFakeAWSServices() - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - if err != nil { - t.Errorf("Error building aws cloud: %v", err) - return - } - - // test with 3 subnets from 3 different AZs - subnets := make(map[int]map[string]string) - subnets[0] = make(map[string]string) - subnets[0]["id"] = "subnet-a0000001" - subnets[0]["az"] = "af-south-1a" - subnets[1] = make(map[string]string) - subnets[1]["id"] = "subnet-b0000001" - subnets[1]["az"] = "af-south-1b" - subnets[2] = make(map[string]string) - subnets[2]["id"] = "subnet-c0000001" - subnets[2]["az"] = "af-south-1c" - awsServices.ec2.Subnets = constructSubnets(subnets) - - routeTables := map[string]bool{ - "subnet-a0000001": true, - "subnet-b0000001": true, - "subnet-c0000001": true, - } - awsServices.ec2.RouteTables = constructRouteTables(routeTables) - - result, err := c.findELBSubnets(false) - if err != nil { - t.Errorf("Error listing subnets: %v", err) - return - } - - if len(result) != 3 { - t.Errorf("Expected 3 subnets but got %d", len(result)) - return - } - - result_set := make(map[string]bool) - for _, v := range result { - result_set[v] = true - } - - for i := range subnets { - if !result_set[subnets[i]["id"]] { - t.Errorf("Expected subnet%d '%s' in result: %v", i, subnets[i]["id"], result) - return - } - } - - // test implicit routing table - when subnets are not explicitly linked to a table they should use main - awsServices.ec2.RouteTables = constructRouteTables(map[string]bool{}) - - result, err = c.findELBSubnets(false) - if err != nil { - t.Errorf("Error listing subnets: %v", err) - return - } - - if len(result) != 3 { - t.Errorf("Expected 3 subnets but got %d", len(result)) - return - } - - result_set = make(map[string]bool) - for _, v := range result { - result_set[v] = true - } - - for i := range subnets { - if !result_set[subnets[i]["id"]] { - t.Errorf("Expected subnet%d '%s' in result: %v", i, subnets[i]["id"], result) - return - } - } - - // test with 4 subnets from 3 different AZs - // add duplicate az subnet - subnets[3] = make(map[string]string) - subnets[3]["id"] = "subnet-c0000002" - subnets[3]["az"] = "af-south-1c" - awsServices.ec2.Subnets = constructSubnets(subnets) - routeTables["subnet-c0000002"] = true - awsServices.ec2.RouteTables = constructRouteTables(routeTables) - - result, err = c.findELBSubnets(false) - if err != nil { - t.Errorf("Error listing subnets: %v", err) - return - } - - if len(result) != 3 { - t.Errorf("Expected 3 subnets but got %d", len(result)) - return - } - - // test with 6 subnets from 3 different AZs - // with 3 private subnets - subnets[4] = make(map[string]string) - subnets[4]["id"] = "subnet-d0000001" - subnets[4]["az"] = "af-south-1a" - subnets[5] = make(map[string]string) - subnets[5]["id"] = "subnet-d0000002" - subnets[5]["az"] = "af-south-1b" - - awsServices.ec2.Subnets = constructSubnets(subnets) - routeTables["subnet-a0000001"] = false - routeTables["subnet-b0000001"] = false - routeTables["subnet-c0000001"] = false - routeTables["subnet-c0000002"] = true - routeTables["subnet-d0000001"] = true - routeTables["subnet-d0000002"] = true - awsServices.ec2.RouteTables = constructRouteTables(routeTables) - result, err = c.findELBSubnets(false) - if err != nil { - t.Errorf("Error listing subnets: %v", err) - return - } - - if len(result) != 3 { - t.Errorf("Expected 3 subnets but got %d", len(result)) - return - } - - expected := []*string{aws.String("subnet-c0000002"), aws.String("subnet-d0000001"), aws.String("subnet-d0000002")} - for _, s := range result { - if !contains(expected, s) { - t.Errorf("Unexpected subnet '%s' found", s) - return - } - } -} - -func TestIpPermissionExistsHandlesMultipleGroupIds(t *testing.T) { - oldIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("firstGroupId")}, - {GroupId: aws.String("secondGroupId")}, - {GroupId: aws.String("thirdGroupId")}, - }, - } - - existingIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("secondGroupId")}, - }, - } - - newIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("fourthGroupId")}, - }, - } - - equals := ipPermissionExists(&existingIpPermission, &oldIpPermission, false) - if !equals { - t.Errorf("Should have been considered equal since first is in the second array of groups") - } - - equals = ipPermissionExists(&newIpPermission, &oldIpPermission, false) - if equals { - t.Errorf("Should have not been considered equal since first is not in the second array of groups") - } -} - -func TestIpPermissionExistsHandlesRangeSubsets(t *testing.T) { - // Two existing scenarios we'll test against - emptyIpPermission := ec2.IpPermission{} - - oldIpPermission := ec2.IpPermission{ - IpRanges: []*ec2.IpRange{ - {CidrIp: aws.String("10.0.0.0/8")}, - {CidrIp: aws.String("192.168.1.0/24")}, - }, - } - - // Two already existing ranges and a new one - existingIpPermission := ec2.IpPermission{ - IpRanges: []*ec2.IpRange{ - {CidrIp: aws.String("10.0.0.0/8")}, - }, - } - existingIpPermission2 := ec2.IpPermission{ - IpRanges: []*ec2.IpRange{ - {CidrIp: aws.String("192.168.1.0/24")}, - }, - } - - newIpPermission := ec2.IpPermission{ - IpRanges: []*ec2.IpRange{ - {CidrIp: aws.String("172.16.0.0/16")}, - }, - } - - exists := ipPermissionExists(&emptyIpPermission, &emptyIpPermission, false) - if !exists { - t.Errorf("Should have been considered existing since we're comparing a range array against itself") - } - exists = ipPermissionExists(&oldIpPermission, &oldIpPermission, false) - if !exists { - t.Errorf("Should have been considered existing since we're comparing a range array against itself") - } - - exists = ipPermissionExists(&existingIpPermission, &oldIpPermission, false) - if !exists { - t.Errorf("Should have been considered existing since 10.* is in oldIpPermission's array of ranges") - } - exists = ipPermissionExists(&existingIpPermission2, &oldIpPermission, false) - if !exists { - t.Errorf("Should have been considered existing since 192.* is in oldIpPermission2's array of ranges") - } - - exists = ipPermissionExists(&newIpPermission, &emptyIpPermission, false) - if exists { - t.Errorf("Should have not been considered existing since we compared against a missing array of ranges") - } - exists = ipPermissionExists(&newIpPermission, &oldIpPermission, false) - if exists { - t.Errorf("Should have not been considered existing since 172.* is not in oldIpPermission's array of ranges") - } -} - -func TestIpPermissionExistsHandlesMultipleGroupIdsWithUserIds(t *testing.T) { - oldIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("firstGroupId"), UserId: aws.String("firstUserId")}, - {GroupId: aws.String("secondGroupId"), UserId: aws.String("secondUserId")}, - {GroupId: aws.String("thirdGroupId"), UserId: aws.String("thirdUserId")}, - }, - } - - existingIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("secondGroupId"), UserId: aws.String("secondUserId")}, - }, - } - - newIpPermission := ec2.IpPermission{ - UserIdGroupPairs: []*ec2.UserIdGroupPair{ - {GroupId: aws.String("secondGroupId"), UserId: aws.String("anotherUserId")}, - }, - } - - equals := ipPermissionExists(&existingIpPermission, &oldIpPermission, true) - if !equals { - t.Errorf("Should have been considered equal since first is in the second array of groups") - } - - equals = ipPermissionExists(&newIpPermission, &oldIpPermission, true) - if equals { - t.Errorf("Should have not been considered equal since first is not in the second array of groups") - } -} -func TestFindInstanceByNodeNameExcludesTerminatedInstances(t *testing.T) { - awsServices := NewFakeAWSServices() - - nodeName := "my-dns.internal" - - var tag ec2.Tag - tag.Key = aws.String(TagNameKubernetesCluster) - tag.Value = aws.String(TestClusterId) - tags := []*ec2.Tag{&tag} - - var runningInstance ec2.Instance - runningInstance.InstanceId = aws.String("i-running") - runningInstance.PrivateDnsName = aws.String(nodeName) - runningInstance.State = &ec2.InstanceState{Code: aws.Int64(16), Name: aws.String("running")} - runningInstance.Tags = tags - - var terminatedInstance ec2.Instance - terminatedInstance.InstanceId = aws.String("i-terminated") - terminatedInstance.PrivateDnsName = aws.String(nodeName) - terminatedInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("terminated")} - terminatedInstance.Tags = tags - - instances := []*ec2.Instance{&terminatedInstance, &runningInstance} - awsServices.instances = append(awsServices.instances, instances...) - - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - if err != nil { - t.Errorf("Error building aws cloud: %v", err) - return - } - - instance, err := c.findInstanceByNodeName(nodeName) - - if err != nil { - t.Errorf("Failed to find instance: %v", err) - return - } - - if *instance.InstanceId != "i-running" { - t.Errorf("Expected running instance but got %v", *instance.InstanceId) - } -} - -func TestFindInstancesByNodeName(t *testing.T) { - awsServices := NewFakeAWSServices() - - nodeNameOne := "my-dns.internal" - nodeNameTwo := "my-dns-two.internal" - - var tag ec2.Tag - tag.Key = aws.String(TagNameKubernetesCluster) - tag.Value = aws.String(TestClusterId) - tags := []*ec2.Tag{&tag} - - var runningInstance ec2.Instance - runningInstance.InstanceId = aws.String("i-running") - runningInstance.PrivateDnsName = aws.String(nodeNameOne) - runningInstance.State = &ec2.InstanceState{Code: aws.Int64(16), Name: aws.String("running")} - runningInstance.Tags = tags - - var secondInstance ec2.Instance - - secondInstance.InstanceId = aws.String("i-running") - secondInstance.PrivateDnsName = aws.String(nodeNameTwo) - secondInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("running")} - secondInstance.Tags = tags - - var terminatedInstance ec2.Instance - terminatedInstance.InstanceId = aws.String("i-terminated") - terminatedInstance.PrivateDnsName = aws.String(nodeNameOne) - terminatedInstance.State = &ec2.InstanceState{Code: aws.Int64(48), Name: aws.String("terminated")} - terminatedInstance.Tags = tags - - instances := []*ec2.Instance{&secondInstance, &runningInstance, &terminatedInstance} - awsServices.instances = append(awsServices.instances, instances...) - - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - if err != nil { - t.Errorf("Error building aws cloud: %v", err) - return - } - - nodeNames := []string{nodeNameOne} - returnedInstances, errr := c.getInstancesByNodeNames(nodeNames) - - if errr != nil { - t.Errorf("Failed to find instance: %v", err) - return - } - - if len(returnedInstances) != 1 { - t.Errorf("Expected a single isntance but found: %v", returnedInstances) - } - - if *returnedInstances[0].PrivateDnsName != nodeNameOne { - t.Errorf("Expected node name %v but got %v", nodeNameOne, returnedInstances[0].PrivateDnsName) - } -} - -func TestGetVolumeLabels(t *testing.T) { - awsServices := NewFakeAWSServices() - c, err := newAWSCloud(strings.NewReader("[global]"), awsServices) - assert.Nil(t, err, "Error building aws cloud: %v", err) - volumeId := aws.String("vol-VolumeId") - expectedVolumeRequest := &ec2.DescribeVolumesInput{VolumeIds: []*string{volumeId}} - awsServices.ec2.On("DescribeVolumes", expectedVolumeRequest).Return([]*ec2.Volume{ - { - VolumeId: volumeId, - AvailabilityZone: aws.String("us-east-1a"), - }, - }) - - labels, err := c.GetVolumeLabels(*volumeId) - - assert.Nil(t, err, "Error creating Volume %v", err) - assert.Equal(t, map[string]string{ - unversioned.LabelZoneFailureDomain: "us-east-1a", - unversioned.LabelZoneRegion: "us-east-1"}, labels) - awsServices.ec2.AssertExpectations(t) -} - -func (self *FakeELB) expectDescribeLoadBalancers(loadBalancerName string) { - self.On("DescribeLoadBalancers", &elb.DescribeLoadBalancersInput{LoadBalancerNames: []*string{aws.String(loadBalancerName)}}).Return(&elb.DescribeLoadBalancersOutput{ - LoadBalancerDescriptions: []*elb.LoadBalancerDescription{{}}, - }) -} - -func TestDescribeLoadBalancerOnDelete(t *testing.T) { - awsServices := NewFakeAWSServices() - c, _ := newAWSCloud(strings.NewReader("[global]"), awsServices) - awsServices.elb.expectDescribeLoadBalancers("aid") - - c.EnsureLoadBalancerDeleted(&api.Service{ObjectMeta: api.ObjectMeta{Name: "myservice", UID: "id"}}) -} - -func TestDescribeLoadBalancerOnUpdate(t *testing.T) { - awsServices := NewFakeAWSServices() - c, _ := newAWSCloud(strings.NewReader("[global]"), awsServices) - awsServices.elb.expectDescribeLoadBalancers("aid") - - c.UpdateLoadBalancer(&api.Service{ObjectMeta: api.ObjectMeta{Name: "myservice", UID: "id"}}, []string{}) -} - -func TestDescribeLoadBalancerOnGet(t *testing.T) { - awsServices := NewFakeAWSServices() - c, _ := newAWSCloud(strings.NewReader("[global]"), awsServices) - awsServices.elb.expectDescribeLoadBalancers("aid") - - c.GetLoadBalancer(&api.Service{ObjectMeta: api.ObjectMeta{Name: "myservice", UID: "id"}}) -} - -func TestDescribeLoadBalancerOnEnsure(t *testing.T) { - awsServices := NewFakeAWSServices() - c, _ := newAWSCloud(strings.NewReader("[global]"), awsServices) - awsServices.elb.expectDescribeLoadBalancers("aid") - - c.EnsureLoadBalancer(&api.Service{ObjectMeta: api.ObjectMeta{Name: "myservice", UID: "id"}}, []string{}, map[string]string{}) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_utils.go deleted file mode 100644 index 310b4898e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/aws_utils.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "github.com/aws/aws-sdk-go/aws" - "k8s.io/kubernetes/pkg/util/sets" -) - -func stringSetToPointers(in sets.String) []*string { - if in == nil { - return nil - } - out := make([]*string, len(in)) - for k := range in { - out = append(out, aws.String(k)) - } - return out -} - -func stringSetFromPointers(in []*string) sets.String { - if in == nil { - return nil - } - out := sets.NewString() - for i := range in { - out.Insert(orEmpty(in[i])) - } - return out -} - -func orZero(v *int64) int64 { - if v == nil { - return 0 - } - return *v -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/log_handler.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/log_handler.go deleted file mode 100644 index 177c7074a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/log_handler.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "github.com/aws/aws-sdk-go/aws/request" - "github.com/golang/glog" -) - -// Handler for aws-sdk-go that logs all requests -func awsHandlerLogger(req *request.Request) { - service := req.ClientInfo.ServiceName - - name := "?" - if req.Operation != nil { - name = req.Operation.Name - } - - glog.V(4).Infof("AWS request: %s %s", service, name) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler.go deleted file mode 100644 index 6e6657bf0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "math" - "sync" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/golang/glog" -) - -const ( - decayIntervalSeconds = 20 - decayFraction = 0.8 - maxDelay = 60 * time.Second -) - -// CrossRequestRetryDelay inserts delays before AWS calls, when we are observing RequestLimitExceeded errors -// Note that we share a CrossRequestRetryDelay across multiple AWS requests; this is a process-wide back-off, -// whereas the aws-sdk-go implements a per-request exponential backoff/retry -type CrossRequestRetryDelay struct { - backoff Backoff -} - -// Create a new CrossRequestRetryDelay -func NewCrossRequestRetryDelay() *CrossRequestRetryDelay { - c := &CrossRequestRetryDelay{} - c.backoff.init(decayIntervalSeconds, decayFraction, maxDelay) - return c -} - -// Added to the Sign chain; called before each request -func (c *CrossRequestRetryDelay) BeforeSign(r *request.Request) { - now := time.Now() - delay := c.backoff.ComputeDelayForRequest(now) - if delay > 0 { - glog.Warningf("Inserting delay before AWS request (%s) to avoid RequestLimitExceeded: %s", - describeRequest(r), delay.String()) - r.Config.SleepDelay(delay) - - // Avoid clock skew problems - r.Time = now - } -} - -// Return a user-friendly string describing the request, for use in log messages -func describeRequest(r *request.Request) string { - service := r.ClientInfo.ServiceName - - name := "?" - if r.Operation != nil { - name = r.Operation.Name - } - - return service + "::" + name -} - -// Added to the AfterRetry chain; called after any error -func (c *CrossRequestRetryDelay) AfterRetry(r *request.Request) { - if r.Error == nil { - return - } - awsError, ok := r.Error.(awserr.Error) - if !ok { - return - } - if awsError.Code() == "RequestLimitExceeded" { - c.backoff.ReportError() - glog.Warningf("Got RequestLimitExceeded error on AWS request (%s)", - describeRequest(r)) - } -} - -// Backoff manages a backoff that varies based on the recently observed failures -type Backoff struct { - decayIntervalSeconds int64 - decayFraction float64 - maxDelay time.Duration - - mutex sync.Mutex - - // We count all requests & the number of requests which hit a - // RequestLimit. We only really care about 'recent' requests, so we - // decay the counts exponentially to bias towards recent values. - countErrorsRequestLimit float32 - countRequests float32 - lastDecay int64 -} - -func (b *Backoff) init(decayIntervalSeconds int, decayFraction float64, maxDelay time.Duration) { - b.lastDecay = time.Now().Unix() - // Bias so that if the first request hits the limit we don't immediately apply the full delay - b.countRequests = 4 - b.decayIntervalSeconds = int64(decayIntervalSeconds) - b.decayFraction = decayFraction - b.maxDelay = maxDelay -} - -// Computes the delay required for a request, also updating internal state to count this request -func (b *Backoff) ComputeDelayForRequest(now time.Time) time.Duration { - b.mutex.Lock() - defer b.mutex.Unlock() - - // Apply exponential decay to the counters - timeDeltaSeconds := now.Unix() - b.lastDecay - if timeDeltaSeconds > b.decayIntervalSeconds { - intervals := float64(timeDeltaSeconds) / float64(b.decayIntervalSeconds) - decay := float32(math.Pow(b.decayFraction, intervals)) - b.countErrorsRequestLimit *= decay - b.countRequests *= decay - b.lastDecay = now.Unix() - } - - // Count this request - b.countRequests += 1.0 - - // Compute the failure rate - errorFraction := float32(0.0) - if b.countRequests > 0.5 { - // Avoid tiny residuals & rounding errors - errorFraction = b.countErrorsRequestLimit / b.countRequests - } - - // Ignore a low fraction of errors - // This also allows them to time-out - if errorFraction < 0.1 { - return time.Duration(0) - } - - // Delay by the max delay multiplied by the recent error rate - // (i.e. we apply a linear delay function) - // TODO: This is pretty arbitrary - delay := time.Nanosecond * time.Duration(float32(b.maxDelay.Nanoseconds())*errorFraction) - // Round down to the nearest second for sanity - return time.Second * time.Duration(int(delay.Seconds())) -} - -// Called when we observe a throttling error -func (b *Backoff) ReportError() { - b.mutex.Lock() - defer b.mutex.Unlock() - - b.countErrorsRequestLimit += 1.0 -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler_test.go deleted file mode 100644 index e02b52d6d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/retry_handler_test.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "testing" - "time" -) - -// There follows a group of tests for the backoff logic. There's nothing -// particularly special about the values chosen: if we tweak the values in the -// backoff logic then we might well have to update the tests. However the key -// behavioural elements should remain (e.g. no errors => no backoff), and these -// are each tested by one of the tests below. - -// Test that we don't apply any delays when there are no errors -func TestBackoffNoErrors(t *testing.T) { - b := &Backoff{} - b.init(decayIntervalSeconds, decayFraction, maxDelay) - - now := time.Now() - for i := 0; i < 100; i++ { - d := b.ComputeDelayForRequest(now) - if d.Nanoseconds() != 0 { - t.Fatalf("unexpected delay during no-error case") - } - now = now.Add(time.Second) - } -} - -// Test that we always apply a delay when there are errors, and also that we -// don't "flap" - that our own delay doesn't cause us to oscillate between -// delay and no-delay. -func TestBackoffAllErrors(t *testing.T) { - b := &Backoff{} - b.init(decayIntervalSeconds, decayFraction, maxDelay) - - now := time.Now() - // Warm up - for i := 0; i < 10; i++ { - _ = b.ComputeDelayForRequest(now) - b.ReportError() - now = now.Add(time.Second) - } - - for i := 0; i < 100; i++ { - d := b.ComputeDelayForRequest(now) - b.ReportError() - if d.Seconds() < 5 { - t.Fatalf("unexpected short-delay during all-error case: %v", d) - } - t.Logf("delay @%d %v", i, d) - now = now.Add(d) - } -} - -// Test that we do come close to our max delay, when we see all errors at 1 -// second intervals (this simulates multiple concurrent requests, because we -// don't wait for delay in between requests) -func TestBackoffHitsMax(t *testing.T) { - b := &Backoff{} - b.init(decayIntervalSeconds, decayFraction, maxDelay) - - now := time.Now() - for i := 0; i < 100; i++ { - _ = b.ComputeDelayForRequest(now) - b.ReportError() - now = now.Add(time.Second) - } - - for i := 0; i < 10; i++ { - d := b.ComputeDelayForRequest(now) - b.ReportError() - if float32(d.Nanoseconds()) < (float32(maxDelay.Nanoseconds()) * 0.95) { - t.Fatalf("expected delay to be >= 95 percent of max delay, was %v", d) - } - t.Logf("delay @%d %v", i, d) - now = now.Add(time.Second) - } -} - -// Test that after a phase of errors, we eventually stop applying a delay once there are -// no more errors. -func TestBackoffRecovers(t *testing.T) { - b := &Backoff{} - b.init(decayIntervalSeconds, decayFraction, maxDelay) - - now := time.Now() - - // Phase of all-errors - for i := 0; i < 100; i++ { - _ = b.ComputeDelayForRequest(now) - b.ReportError() - now = now.Add(time.Second) - } - - for i := 0; i < 10; i++ { - d := b.ComputeDelayForRequest(now) - b.ReportError() - if d.Seconds() < 5 { - t.Fatalf("unexpected short-delay during all-error phase: %v", d) - } - t.Logf("error phase delay @%d %v", i, d) - now = now.Add(time.Second) - } - - // Phase of no errors - for i := 0; i < 100; i++ { - _ = b.ComputeDelayForRequest(now) - now = now.Add(3 * time.Second) - } - - for i := 0; i < 10; i++ { - d := b.ComputeDelayForRequest(now) - if d.Seconds() != 0 { - t.Fatalf("unexpected delay during error recovery phase: %v", d) - } - t.Logf("no-error phase delay @%d %v", i, d) - now = now.Add(time.Second) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/sets_ippermissions.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/sets_ippermissions.go deleted file mode 100644 index 2e1343ff8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/aws/sets_ippermissions.go +++ /dev/null @@ -1,146 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 aws - -import ( - "encoding/json" - "fmt" - - "github.com/aws/aws-sdk-go/service/ec2" -) - -type IPPermissionSet map[string]*ec2.IpPermission - -func NewIPPermissionSet(items ...*ec2.IpPermission) IPPermissionSet { - s := make(IPPermissionSet) - s.Insert(items...) - return s -} - -// Ungroup splits permissions out into individual permissions -// EC2 will combine permissions with the same port but different SourceRanges together, for example -// We ungroup them so we can process them -func (s IPPermissionSet) Ungroup() IPPermissionSet { - l := []*ec2.IpPermission{} - for _, p := range s.List() { - if len(p.IpRanges) <= 1 { - l = append(l, p) - continue - } - for _, ipRange := range p.IpRanges { - c := &ec2.IpPermission{} - *c = *p - c.IpRanges = []*ec2.IpRange{ipRange} - l = append(l, c) - } - } - - l2 := []*ec2.IpPermission{} - for _, p := range l { - if len(p.UserIdGroupPairs) <= 1 { - l2 = append(l2, p) - continue - } - for _, u := range p.UserIdGroupPairs { - c := &ec2.IpPermission{} - *c = *p - c.UserIdGroupPairs = []*ec2.UserIdGroupPair{u} - l2 = append(l, c) - } - } - - l3 := []*ec2.IpPermission{} - for _, p := range l2 { - if len(p.PrefixListIds) <= 1 { - l3 = append(l3, p) - continue - } - for _, v := range p.PrefixListIds { - c := &ec2.IpPermission{} - *c = *p - c.PrefixListIds = []*ec2.PrefixListId{v} - l3 = append(l3, c) - } - } - - return NewIPPermissionSet(l3...) -} - -// Insert adds items to the set. -func (s IPPermissionSet) Insert(items ...*ec2.IpPermission) { - for _, p := range items { - k := keyForIPPermission(p) - s[k] = p - } -} - -// List returns the contents as a slice. Order is not defined. -func (s IPPermissionSet) List() []*ec2.IpPermission { - res := make([]*ec2.IpPermission, 0, len(s)) - for _, v := range s { - res = append(res, v) - } - return res -} - -// IsSuperset returns true if and only if s1 is a superset of s2. -func (s1 IPPermissionSet) IsSuperset(s2 IPPermissionSet) bool { - for k := range s2 { - _, found := s1[k] - if !found { - return false - } - } - return true -} - -// Equal returns true if and only if s1 is equal (as a set) to s2. -// Two sets are equal if their membership is identical. -// (In practice, this means same elements, order doesn't matter) -func (s1 IPPermissionSet) Equal(s2 IPPermissionSet) bool { - return len(s1) == len(s2) && s1.IsSuperset(s2) -} - -// Difference returns a set of objects that are not in s2 -// For example: -// s1 = {a1, a2, a3} -// s2 = {a1, a2, a4, a5} -// s1.Difference(s2) = {a3} -// s2.Difference(s1) = {a4, a5} -func (s IPPermissionSet) Difference(s2 IPPermissionSet) IPPermissionSet { - result := NewIPPermissionSet() - for k, v := range s { - _, found := s2[k] - if !found { - result[k] = v - } - } - return result -} - -// Len returns the size of the set. -func (s IPPermissionSet) Len() int { - return len(s) -} - -func keyForIPPermission(p *ec2.IpPermission) string { - v, err := json.Marshal(p) - if err != nil { - panic(fmt.Sprintf("error building JSON representation of ec2.IpPermission: %v", err)) - } - return string(v) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/doc.go deleted file mode 100644 index ff22d568f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake is a test-double implementation of cloudprovider -// Interface, LoadBalancer and Instances. It is useful for testing. -package fake diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/fake.go deleted file mode 100644 index 6bc0a0e76..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/fake/fake.go +++ /dev/null @@ -1,267 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 fake - -import ( - "errors" - "fmt" - "net" - "regexp" - "sync" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -const ProviderName = "fake" - -// FakeBalancer is a fake storage of balancer information -type FakeBalancer struct { - Name string - Region string - LoadBalancerIP string - Ports []api.ServicePort - Hosts []string -} - -type FakeUpdateBalancerCall struct { - Service *api.Service - Hosts []string -} - -// FakeCloud is a test-double implementation of Interface, LoadBalancer, Instances, and Routes. It is useful for testing. -type FakeCloud struct { - Exists bool - Err error - Calls []string - Addresses []api.NodeAddress - ExtID map[string]string - InstanceTypes map[string]string - Machines []string - NodeResources *api.NodeResources - ClusterList []string - MasterName string - ExternalIP net.IP - Balancers map[string]FakeBalancer - UpdateCalls []FakeUpdateBalancerCall - RouteMap map[string]*FakeRoute - Lock sync.Mutex - cloudprovider.Zone -} - -type FakeRoute struct { - ClusterName string - Route cloudprovider.Route -} - -func (f *FakeCloud) addCall(desc string) { - f.Calls = append(f.Calls, desc) -} - -// ClearCalls clears internal record of method calls to this FakeCloud. -func (f *FakeCloud) ClearCalls() { - f.Calls = []string{} -} - -func (f *FakeCloud) ListClusters() ([]string, error) { - return f.ClusterList, f.Err -} - -func (f *FakeCloud) Master(name string) (string, error) { - return f.MasterName, f.Err -} - -func (f *FakeCloud) Clusters() (cloudprovider.Clusters, bool) { - return f, true -} - -// ProviderName returns the cloud provider ID. -func (f *FakeCloud) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (f *FakeCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -// LoadBalancer returns a fake implementation of LoadBalancer. -// Actually it just returns f itself. -func (f *FakeCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - return f, true -} - -// Instances returns a fake implementation of Instances. -// -// Actually it just returns f itself. -func (f *FakeCloud) Instances() (cloudprovider.Instances, bool) { - return f, true -} - -func (f *FakeCloud) Zones() (cloudprovider.Zones, bool) { - return f, true -} - -func (f *FakeCloud) Routes() (cloudprovider.Routes, bool) { - return f, true -} - -// GetLoadBalancer is a stub implementation of LoadBalancer.GetLoadBalancer. -func (f *FakeCloud) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { - status := &api.LoadBalancerStatus{} - status.Ingress = []api.LoadBalancerIngress{{IP: f.ExternalIP.String()}} - - return status, f.Exists, f.Err -} - -// EnsureLoadBalancer is a test-spy implementation of LoadBalancer.EnsureLoadBalancer. -// It adds an entry "create" into the internal method call record. -func (f *FakeCloud) EnsureLoadBalancer(service *api.Service, hosts []string, annotations map[string]string) (*api.LoadBalancerStatus, error) { - f.addCall("create") - if f.Balancers == nil { - f.Balancers = make(map[string]FakeBalancer) - } - - name := cloudprovider.GetLoadBalancerName(service) - spec := service.Spec - - zone, err := f.GetZone() - if err != nil { - return nil, err - } - region := zone.Region - - f.Balancers[name] = FakeBalancer{name, region, spec.LoadBalancerIP, spec.Ports, hosts} - - status := &api.LoadBalancerStatus{} - status.Ingress = []api.LoadBalancerIngress{{IP: f.ExternalIP.String()}} - - return status, f.Err -} - -// UpdateLoadBalancer is a test-spy implementation of LoadBalancer.UpdateLoadBalancer. -// It adds an entry "update" into the internal method call record. -func (f *FakeCloud) UpdateLoadBalancer(service *api.Service, hosts []string) error { - f.addCall("update") - f.UpdateCalls = append(f.UpdateCalls, FakeUpdateBalancerCall{service, hosts}) - return f.Err -} - -// EnsureLoadBalancerDeleted is a test-spy implementation of LoadBalancer.EnsureLoadBalancerDeleted. -// It adds an entry "delete" into the internal method call record. -func (f *FakeCloud) EnsureLoadBalancerDeleted(service *api.Service) error { - f.addCall("delete") - return f.Err -} - -func (f *FakeCloud) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} - -// Implementation of Instances.CurrentNodeName -func (f *FakeCloud) CurrentNodeName(hostname string) (string, error) { - return hostname, nil -} - -// NodeAddresses is a test-spy implementation of Instances.NodeAddresses. -// It adds an entry "node-addresses" into the internal method call record. -func (f *FakeCloud) NodeAddresses(instance string) ([]api.NodeAddress, error) { - f.addCall("node-addresses") - return f.Addresses, f.Err -} - -// ExternalID is a test-spy implementation of Instances.ExternalID. -// It adds an entry "external-id" into the internal method call record. -// It returns an external id to the mapped instance name, if not found, it will return "ext-{instance}" -func (f *FakeCloud) ExternalID(instance string) (string, error) { - f.addCall("external-id") - return f.ExtID[instance], f.Err -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (f *FakeCloud) InstanceID(instance string) (string, error) { - f.addCall("instance-id") - return f.ExtID[instance], nil -} - -// InstanceType returns the type of the specified instance. -func (f *FakeCloud) InstanceType(instance string) (string, error) { - f.addCall("instance-type") - return f.InstanceTypes[instance], nil -} - -// List is a test-spy implementation of Instances.List. -// It adds an entry "list" into the internal method call record. -func (f *FakeCloud) List(filter string) ([]string, error) { - f.addCall("list") - result := []string{} - for _, machine := range f.Machines { - if match, _ := regexp.MatchString(filter, machine); match { - result = append(result, machine) - } - } - return result, f.Err -} - -func (f *FakeCloud) GetZone() (cloudprovider.Zone, error) { - f.addCall("get-zone") - return f.Zone, f.Err -} - -func (f *FakeCloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, error) { - f.Lock.Lock() - defer f.Lock.Unlock() - f.addCall("list-routes") - var routes []*cloudprovider.Route - for _, fakeRoute := range f.RouteMap { - if clusterName == fakeRoute.ClusterName { - routeCopy := fakeRoute.Route - routes = append(routes, &routeCopy) - } - } - return routes, f.Err -} - -func (f *FakeCloud) CreateRoute(clusterName string, nameHint string, route *cloudprovider.Route) error { - f.Lock.Lock() - defer f.Lock.Unlock() - f.addCall("create-route") - name := clusterName + "-" + nameHint - if _, exists := f.RouteMap[name]; exists { - f.Err = fmt.Errorf("route %q already exists", name) - return f.Err - } - fakeRoute := FakeRoute{} - fakeRoute.Route = *route - fakeRoute.Route.Name = name - fakeRoute.ClusterName = clusterName - f.RouteMap[name] = &fakeRoute - return nil -} - -func (f *FakeCloud) DeleteRoute(clusterName string, route *cloudprovider.Route) error { - f.Lock.Lock() - defer f.Lock.Unlock() - f.addCall("delete-route") - name := route.Name - if _, exists := f.RouteMap[name]; !exists { - f.Err = fmt.Errorf("no route found with name %q", name) - return f.Err - } - delete(f.RouteMap, name) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce_test.go deleted file mode 100644 index f1633d889..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce_test.go +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gce - -import ( - "reflect" - "testing" -) - -func TestGetRegion(t *testing.T) { - zoneName := "us-central1-b" - regionName, err := GetGCERegion(zoneName) - if err != nil { - t.Fatalf("unexpected error from GetGCERegion: %v", err) - } - if regionName != "us-central1" { - t.Errorf("Unexpected region from GetGCERegion: %s", regionName) - } - gce := &GCECloud{ - localZone: zoneName, - region: regionName, - } - zones, ok := gce.Zones() - if !ok { - t.Fatalf("Unexpected missing zones impl") - } - zone, err := zones.GetZone() - if err != nil { - t.Fatalf("unexpected error %v", err) - } - if zone.Region != "us-central1" { - t.Errorf("Unexpected region: %s", zone.Region) - } -} - -func TestComparingHostURLs(t *testing.T) { - tests := []struct { - host1 string - zone string - name string - expectEqual bool - }{ - { - host1: "https://www.googleapis.com/compute/v1/projects/1234567/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-f", - name: "kubernetes-node-fhx1", - expectEqual: true, - }, - { - host1: "https://www.googleapis.com/compute/v1/projects/cool-project/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-f", - name: "kubernetes-node-fhx1", - expectEqual: true, - }, - { - host1: "https://www.googleapis.com/compute/v23/projects/1234567/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-f", - name: "kubernetes-node-fhx1", - expectEqual: true, - }, - { - host1: "https://www.googleapis.com/compute/v24/projects/1234567/regions/us-central1/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-f", - name: "kubernetes-node-fhx1", - expectEqual: true, - }, - { - host1: "https://www.googleapis.com/compute/v1/projects/1234567/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-c", - name: "kubernetes-node-fhx1", - expectEqual: false, - }, - { - host1: "https://www.googleapis.com/compute/v1/projects/1234567/zones/us-central1-f/instances/kubernetes-node-fhx", - zone: "us-central1-f", - name: "kubernetes-node-fhx1", - expectEqual: false, - }, - { - host1: "https://www.googleapis.com/compute/v1/projects/1234567/zones/us-central1-f/instances/kubernetes-node-fhx1", - zone: "us-central1-f", - name: "kubernetes-node-fhx", - expectEqual: false, - }, - } - - for _, test := range tests { - link1 := hostURLToComparablePath(test.host1) - testInstance := &gceInstance{ - Name: canonicalizeInstanceName(test.name), - Zone: test.zone, - } - link2 := testInstance.makeComparableHostPath() - if test.expectEqual && link1 != link2 { - t.Errorf("expected link1 and link2 to be equal, got %s and %s", link1, link2) - } else if !test.expectEqual && link1 == link2 { - t.Errorf("expected link1 and link2 not to be equal, got %s and %s", link1, link2) - } - } -} - -func TestScrubDNS(t *testing.T) { - tcs := []struct { - nameserversIn []string - searchesIn []string - nameserversOut []string - searchesOut []string - }{ - { - nameserversIn: []string{"1.2.3.4", "5.6.7.8"}, - nameserversOut: []string{"1.2.3.4", "5.6.7.8"}, - }, - { - searchesIn: []string{"c.prj.internal.", "12345678910.google.internal.", "google.internal."}, - searchesOut: []string{"c.prj.internal.", "google.internal."}, - }, - { - searchesIn: []string{"c.prj.internal.", "12345678910.google.internal.", "zone.c.prj.internal.", "google.internal."}, - searchesOut: []string{"c.prj.internal.", "zone.c.prj.internal.", "google.internal."}, - }, - { - searchesIn: []string{"c.prj.internal.", "12345678910.google.internal.", "zone.c.prj.internal.", "google.internal.", "unexpected"}, - searchesOut: []string{"c.prj.internal.", "zone.c.prj.internal.", "google.internal.", "unexpected"}, - }, - } - gce := &GCECloud{} - for i := range tcs { - n, s := gce.ScrubDNS(tcs[i].nameserversIn, tcs[i].searchesIn) - if !reflect.DeepEqual(n, tcs[i].nameserversOut) { - t.Errorf("Expected %v, got %v", tcs[i].nameserversOut, n) - } - if !reflect.DeepEqual(s, tcs[i].searchesOut) { - t.Errorf("Expected %v, got %v", tcs[i].searchesOut, s) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client.go deleted file mode 100644 index 1b488bc62..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client.go +++ /dev/null @@ -1,376 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "encoding/binary" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net" - "net/http" - "sync" - "time" - - log "github.com/golang/glog" - "github.com/mesos/mesos-go/detector" - mesos "github.com/mesos/mesos-go/mesosproto" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - utilnet "k8s.io/kubernetes/pkg/util/net" -) - -const defaultClusterName = "mesos" - -var noLeadingMasterError = errors.New("there is no current leading master available to query") - -type mesosClient struct { - masterLock sync.RWMutex - master string // host:port formatted address - httpClient *http.Client - tr *http.Transport - initialMaster <-chan struct{} // signal chan, closes once an initial, non-nil master is found - state *stateCache -} - -type slaveNode struct { - hostname string - kubeletRunning bool - resources *api.NodeResources -} - -type mesosState struct { - clusterName string - nodes map[string]*slaveNode // by hostname -} - -type stateCache struct { - sync.Mutex - expiresAt time.Time - cached *mesosState - err error - ttl time.Duration - refill func(context.Context) (*mesosState, error) -} - -// reloadCache reloads the state cache if it has expired. -func (c *stateCache) reloadCache(ctx context.Context) { - now := time.Now() - c.Lock() - defer c.Unlock() - if c.expiresAt.Before(now) { - log.V(4).Infof("Reloading cached Mesos state") - c.cached, c.err = c.refill(ctx) - c.expiresAt = now.Add(c.ttl) - } else { - log.V(4).Infof("Using cached Mesos state") - } -} - -// cachedState returns the cached Mesos state. -func (c *stateCache) cachedState(ctx context.Context) (*mesosState, error) { - c.reloadCache(ctx) - return c.cached, c.err -} - -// clusterName returns the cached Mesos cluster name. -func (c *stateCache) clusterName(ctx context.Context) (string, error) { - cached, err := c.cachedState(ctx) - if err != nil { - return "", err - } - return cached.clusterName, nil -} - -// nodes returns the cached list of slave nodes. -func (c *stateCache) nodes(ctx context.Context) (map[string]*slaveNode, error) { - cached, err := c.cachedState(ctx) - if err != nil { - return nil, err - } - return cached.nodes, nil -} - -func newMesosClient( - md detector.Master, - mesosHttpClientTimeout, stateCacheTTL time.Duration) (*mesosClient, error) { - - tr := utilnet.SetTransportDefaults(&http.Transport{}) - httpClient := &http.Client{ - Transport: tr, - Timeout: mesosHttpClientTimeout, - } - return createMesosClient(md, httpClient, tr, stateCacheTTL) -} - -func createMesosClient( - md detector.Master, - httpClient *http.Client, - tr *http.Transport, - stateCacheTTL time.Duration) (*mesosClient, error) { - - initialMaster := make(chan struct{}) - client := &mesosClient{ - httpClient: httpClient, - tr: tr, - initialMaster: initialMaster, - state: &stateCache{ - ttl: stateCacheTTL, - }, - } - client.state.refill = client.pollMasterForState - first := true - if err := md.Detect(detector.OnMasterChanged(func(info *mesos.MasterInfo) { - host, port := extractMasterAddress(info) - if len(host) > 0 { - client.masterLock.Lock() - defer client.masterLock.Unlock() - client.master = fmt.Sprintf("%s:%d", host, port) - if first { - first = false - close(initialMaster) - } - } - log.Infof("cloud master changed to '%v'", client.master) - })); err != nil { - log.V(1).Infof("detector initialization failed: %v", err) - return nil, err - } - return client, nil -} - -func extractMasterAddress(info *mesos.MasterInfo) (host string, port int) { - if info != nil { - host = info.GetAddress().GetHostname() - if host == "" { - host = info.GetAddress().GetIp() - } - - if host != "" { - // use port from Address - port = int(info.GetAddress().GetPort()) - } else { - // deprecated: get host and port directly from MasterInfo (and not Address) - host = info.GetHostname() - if host == "" { - host = unpackIPv4(info.GetIp()) - } - port = int(info.GetPort()) - } - } - return -} - -func unpackIPv4(ip uint32) string { - octets := make([]byte, 4, 4) - binary.BigEndian.PutUint32(octets, ip) - ipv4 := net.IP(octets) - return ipv4.String() -} - -// listSlaves returns a (possibly cached) map of slave nodes by hostname. -// Callers must not mutate the contents of the returned slice. -func (c *mesosClient) listSlaves(ctx context.Context) (map[string]*slaveNode, error) { - return c.state.nodes(ctx) -} - -// clusterName returns a (possibly cached) cluster name. -func (c *mesosClient) clusterName(ctx context.Context) (string, error) { - return c.state.clusterName(ctx) -} - -// pollMasterForState returns an array of slave nodes -func (c *mesosClient) pollMasterForState(ctx context.Context) (*mesosState, error) { - // wait for initial master detection - select { - case <-c.initialMaster: // noop - case <-ctx.Done(): - return nil, ctx.Err() - } - - master := func() string { - c.masterLock.RLock() - defer c.masterLock.RUnlock() - return c.master - }() - if master == "" { - return nil, noLeadingMasterError - } - - //TODO(jdef) should not assume master uses http (what about https?) - - var state *mesosState - successHandler := func(res *http.Response) error { - blob, err1 := ioutil.ReadAll(res.Body) - if err1 != nil { - return err1 - } - log.V(3).Infof("Got mesos state, content length %v", len(blob)) - state, err1 = parseMesosState(blob) - return err1 - } - // thinking here is that we may get some other status codes from mesos at some point: - // - authentication - // - redirection (possibly from http to https) - // ... - for _, tt := range []struct { - uri string - handlers map[int]func(*http.Response) error - }{ - { - uri: fmt.Sprintf("http://%s/state", master), - handlers: map[int]func(*http.Response) error{ - 200: successHandler, - }, - }, - { - uri: fmt.Sprintf("http://%s/state.json", master), - handlers: map[int]func(*http.Response) error{ - 200: successHandler, - }, - }, - } { - req, err := http.NewRequest("GET", tt.uri, nil) - if err != nil { - return nil, err - } - err = c.httpDo(ctx, req, func(res *http.Response, err error) error { - if err != nil { - return err - } - defer res.Body.Close() - if handler, ok := tt.handlers[res.StatusCode]; ok { - err1 := handler(res) - if err1 != nil { - return err1 - } - } - // no handler for this error code, proceed to the next connection type - return nil - }) - if state != nil || err != nil { - return state, err - } - } - return nil, errors.New("failed to sync with Mesos master") -} - -func parseMesosState(blob []byte) (*mesosState, error) { - type State struct { - ClusterName string `json:"cluster"` - Slaves []*struct { - Id string `json:"id"` // ex: 20150106-162714-3815890698-5050-2453-S2 - Pid string `json:"pid"` // ex: slave(1)@10.22.211.18:5051 - Hostname string `json:"hostname"` // ex: 10.22.211.18, or slave-123.nowhere.com - Resources map[string]interface{} `json:"resources"` // ex: {"mem": 123, "ports": "[31000-3200]"} - } `json:"slaves"` - Frameworks []*struct { - Id string `json:"id"` // ex: 20151105-093752-3745622208-5050-1-0000 - Pid string `json:"pid"` // ex: scheduler(1)@192.168.65.228:57124 - Executors []*struct { - SlaveId string `json:"slave_id"` // ex: 20151105-093752-3745622208-5050-1-S1 - ExecutorId string `json:"executor_id"` // ex: 6704d375c68fee1e_k8sm-executor - Name string `json:"name"` // ex: Kubelet-Executor - } `json:"executors"` - } `json:"frameworks"` - } - - state := &State{ClusterName: defaultClusterName} - if err := json.Unmarshal(blob, state); err != nil { - return nil, err - } - - executorSlaveIds := map[string]struct{}{} - for _, f := range state.Frameworks { - for _, e := range f.Executors { - // Note that this simple comparison breaks when we support more than one - // k8s instance in a cluster. At the moment this is not possible for - // a number of reasons. - // TODO(sttts): find way to detect executors of this k8s instance - if e.Name == KubernetesExecutorName { - executorSlaveIds[e.SlaveId] = struct{}{} - } - } - } - - nodes := map[string]*slaveNode{} // by hostname - for _, slave := range state.Slaves { - if slave.Hostname == "" { - continue - } - node := &slaveNode{hostname: slave.Hostname} - cap := api.ResourceList{} - if slave.Resources != nil && len(slave.Resources) > 0 { - // attempt to translate CPU (cores) and memory (MB) resources - if cpu, found := slave.Resources["cpus"]; found { - if cpuNum, ok := cpu.(float64); ok { - cap[api.ResourceCPU] = *resource.NewQuantity(int64(cpuNum), resource.DecimalSI) - } else { - log.Warningf("unexpected slave cpu resource type %T: %v", cpu, cpu) - } - } else { - log.Warningf("slave failed to report cpu resource") - } - if mem, found := slave.Resources["mem"]; found { - if memNum, ok := mem.(float64); ok { - cap[api.ResourceMemory] = *resource.NewQuantity(int64(memNum), resource.BinarySI) - } else { - log.Warningf("unexpected slave mem resource type %T: %v", mem, mem) - } - } else { - log.Warningf("slave failed to report mem resource") - } - } - if len(cap) > 0 { - node.resources = &api.NodeResources{ - Capacity: cap, - } - log.V(4).Infof("node %q reporting capacity %v", node.hostname, cap) - } - if _, ok := executorSlaveIds[slave.Id]; ok { - node.kubeletRunning = true - } - nodes[node.hostname] = node - } - - result := &mesosState{ - clusterName: state.ClusterName, - nodes: nodes, - } - - return result, nil -} - -type responseHandler func(*http.Response, error) error - -// httpDo executes an HTTP request in the given context, canceling an ongoing request if the context -// is canceled prior to completion of the request. hacked from https://blog.golang.org/context -func (c *mesosClient) httpDo(ctx context.Context, req *http.Request, f responseHandler) error { - // Run the HTTP request in a goroutine and pass the response to f. - ch := make(chan error, 1) - go func() { ch <- f(c.httpClient.Do(req)) }() - select { - case <-ctx.Done(): - c.tr.CancelRequest(req) - <-ch // Wait for f to return. - return ctx.Err() - case err := <-ch: - return err - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client_test.go deleted file mode 100644 index 849a039ca..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/client_test.go +++ /dev/null @@ -1,269 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "testing" - "time" - - log "github.com/golang/glog" - "github.com/mesos/mesos-go/detector" - "github.com/mesos/mesos-go/mesosutil" - "golang.org/x/net/context" - - utilnet "k8s.io/kubernetes/pkg/util/net" -) - -// Test data - -const ( - TEST_MASTER_ID = "master-12345" - TEST_MASTER_IP = 177048842 // 10.141.141.10 - TEST_MASTER_PORT = 5050 - - TEST_STATE_JSON = ` - { - "version": "0.22.0", - "unregistered_frameworks": [], - "started_tasks": 0, - "start_time": 1429456501.61141, - "staged_tasks": 0, - "slaves": [ - { - "resources": { - "ports": "[31000-32000]", - "mem": 15360, - "disk": 470842, - "cpus": 8 - }, - "registered_time": 1429456502.46999, - "pid": "slave(1)@mesos1.internal.company.com:5050", - "id": "20150419-081501-16777343-5050-16383-S2", - "hostname": "mesos1.internal.company.com", - "attributes": {}, - "active": true - }, - { - "resources": { - "ports": "[31000-32000]", - "mem": 15360, - "disk": 470842, - "cpus": 8 - }, - "registered_time": 1429456502.4144, - "pid": "slave(1)@mesos2.internal.company.com:5050", - "id": "20150419-081501-16777343-5050-16383-S1", - "hostname": "mesos2.internal.company.com", - "attributes": {}, - "active": true - }, - { - "resources": { - "ports": "[31000-32000]", - "mem": 15360, - "disk": 470842, - "cpus": 8 - }, - "registered_time": 1429456502.02879, - "pid": "slave(1)@mesos3.internal.company.com:5050", - "id": "20150419-081501-16777343-5050-16383-S0", - "hostname": "mesos3.internal.company.com", - "attributes": {}, - "active": true - } - ], - "pid": "master@mesos-master0.internal.company.com:5050", - "orphan_tasks": [], - "lost_tasks": 0, - "leader": "master@mesos-master0.internal.company.com:5050", - "killed_tasks": 0, - "failed_tasks": 0, - "elected_time": 1429456501.61638, - "deactivated_slaves": 0, - "completed_frameworks": [], - "build_user": "buildbot", - "build_time": 1425085311, - "build_date": "2015-02-27 17:01:51", - "activated_slaves": 3, - "finished_tasks": 0, - "flags": { - "zk_session_timeout": "10secs", - "work_dir": "/somepath/mesos/local/Lc9arz", - "webui_dir": "/usr/local/share/mesos/webui", - "version": "false", - "user_sorter": "drf", - "slave_reregister_timeout": "10mins", - "logbufsecs": "0", - "log_auto_initialize": "true", - "initialize_driver_logging": "true", - "framework_sorter": "drf", - "authenticators": "crammd5", - "authenticate_slaves": "false", - "authenticate": "false", - "allocation_interval": "1secs", - "logging_level": "INFO", - "quiet": "false", - "recovery_slave_removal_limit": "100%", - "registry": "replicated_log", - "registry_fetch_timeout": "1mins", - "registry_store_timeout": "5secs", - "registry_strict": "false", - "root_submissions": "true" - }, - "frameworks": [], - "git_branch": "refs/heads/0.22.0-rc1", - "git_sha": "46834faca67f877631e1beb7d61be5c080ec3dc2", - "git_tag": "0.22.0-rc1", - "hostname": "localhost", - "id": "20150419-081501-16777343-5050-16383" - }` -) - -// Mocks - -type FakeMasterDetector struct { - callback detector.MasterChanged - done chan struct{} -} - -func newFakeMasterDetector() *FakeMasterDetector { - return &FakeMasterDetector{ - done: make(chan struct{}), - } -} - -func (md FakeMasterDetector) Cancel() { - close(md.done) -} - -func (md FakeMasterDetector) Detect(cb detector.MasterChanged) error { - md.callback = cb - leadingMaster := mesosutil.NewMasterInfo(TEST_MASTER_ID, TEST_MASTER_IP, TEST_MASTER_PORT) - cb.OnMasterChanged(leadingMaster) - return nil -} - -func (md FakeMasterDetector) Done() <-chan struct{} { - return md.done -} - -// Auxiliary functions - -func makeHttpMocks() (*httptest.Server, *http.Client, *http.Transport) { - httpServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - log.V(4).Infof("Mocking response for HTTP request: %#v", r) - if r.URL.Path == "/state.json" { - w.WriteHeader(200) // OK - w.Header().Set("Content-Type", "application/json") - fmt.Fprintln(w, TEST_STATE_JSON) - } else { - w.WriteHeader(400) - fmt.Fprintln(w, "Bad Request") - } - })) - - // Intercept all client requests and feed them to the test server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(httpServer.URL) - }, - }) - - httpClient := &http.Client{Transport: transport} - - return httpServer, httpClient, transport -} - -// Tests - -// test mesos.parseMesosState -func Test_parseMesosState(t *testing.T) { - state, err := parseMesosState([]byte(TEST_STATE_JSON)) - - if err != nil { - t.Fatalf("parseMesosState does not yield an error") - } - if state == nil { - t.Fatalf("parseMesosState yields a non-nil state") - } - if len(state.nodes) != 3 { - t.Fatalf("parseMesosState yields a state with 3 nodes") - } -} - -// test mesos.listSlaves -func Test_listSlaves(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - - if err != nil { - t.Fatalf("createMesosClient does not yield an error") - } - - slaveNodes, err := mesosClient.listSlaves(context.TODO()) - - if err != nil { - t.Fatalf("listSlaves does not yield an error") - } - if len(slaveNodes) != 3 { - t.Fatalf("listSlaves yields a collection of size 3") - } - - expectedHostnames := map[string]struct{}{ - "mesos1.internal.company.com": {}, - "mesos2.internal.company.com": {}, - "mesos3.internal.company.com": {}, - } - - actualHostnames := make(map[string]struct{}) - for _, node := range slaveNodes { - actualHostnames[node.hostname] = struct{}{} - } - - if !reflect.DeepEqual(expectedHostnames, actualHostnames) { - t.Fatalf("listSlaves yields a collection with the expected hostnames") - } -} - -// test mesos.clusterName -func Test_clusterName(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - - name, err := mesosClient.clusterName(context.TODO()) - - if err != nil { - t.Fatalf("clusterName does not yield an error") - } - if name != defaultClusterName { - t.Fatalf("clusterName yields the expected (default) value") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config.go deleted file mode 100644 index 9edbc8f5f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "io" - "time" - - "gopkg.in/gcfg.v1" -) - -const ( - DefaultMesosMaster = "localhost:5050" - DefaultHttpClientTimeout = time.Duration(10) * time.Second - DefaultStateCacheTTL = time.Duration(5) * time.Second -) - -// Example Mesos cloud provider configuration file: -// -// [mesos-cloud] -// mesos-master = leader.mesos:5050 -// http-client-timeout = 500ms -// state-cache-ttl = 1h - -type ConfigWrapper struct { - Mesos_Cloud Config -} - -type Config struct { - MesosMaster string `gcfg:"mesos-master"` - MesosHttpClientTimeout Duration `gcfg:"http-client-timeout"` - StateCacheTTL Duration `gcfg:"state-cache-ttl"` -} - -type Duration struct { - Duration time.Duration `gcfg:"duration"` -} - -func (d *Duration) UnmarshalText(data []byte) error { - underlying, err := time.ParseDuration(string(data)) - if err == nil { - d.Duration = underlying - } - return err -} - -func createDefaultConfig() *Config { - return &Config{ - MesosMaster: DefaultMesosMaster, - MesosHttpClientTimeout: Duration{Duration: DefaultHttpClientTimeout}, - StateCacheTTL: Duration{Duration: DefaultStateCacheTTL}, - } -} - -func readConfig(configReader io.Reader) (*Config, error) { - config := createDefaultConfig() - wrapper := &ConfigWrapper{Mesos_Cloud: *config} - if configReader != nil { - if err := gcfg.ReadInto(wrapper, configReader); err != nil { - return nil, err - } - config = &(wrapper.Mesos_Cloud) - } - return config, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config_test.go deleted file mode 100644 index d1013471c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/config_test.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "bytes" - "testing" - "time" - - log "github.com/golang/glog" -) - -// test mesos.createDefaultConfig -func Test_createDefaultConfig(t *testing.T) { - defer log.Flush() - - config := createDefaultConfig() - - if config.MesosMaster != DefaultMesosMaster { - t.Fatalf("Default config has the expected MesosMaster value") - } - - if config.MesosHttpClientTimeout.Duration != DefaultHttpClientTimeout { - t.Fatalf("Default config has the expected MesosHttpClientTimeout value") - } - - if config.StateCacheTTL.Duration != DefaultStateCacheTTL { - t.Fatalf("Default config has the expected StateCacheTTL value") - } -} - -// test mesos.readConfig -func Test_readConfig(t *testing.T) { - defer log.Flush() - - configString := ` -[mesos-cloud] - mesos-master = leader.mesos:5050 - http-client-timeout = 500ms - state-cache-ttl = 1h` - - reader := bytes.NewBufferString(configString) - - config, err := readConfig(reader) - - if err != nil { - t.Fatalf("Reading configuration does not yield an error: %#v", err) - } - - if config.MesosMaster != "leader.mesos:5050" { - t.Fatalf("Parsed config has the expected MesosMaster value") - } - - if config.MesosHttpClientTimeout.Duration != time.Duration(500)*time.Millisecond { - t.Fatalf("Parsed config has the expected MesosHttpClientTimeout value") - } - - if config.StateCacheTTL.Duration != time.Duration(1)*time.Hour { - t.Fatalf("Parsed config has the expected StateCacheTTL value") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos.go deleted file mode 100644 index 20285843b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos.go +++ /dev/null @@ -1,283 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "errors" - "fmt" - "io" - "net" - "regexp" - - log "github.com/golang/glog" - "github.com/mesos/mesos-go/detector" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -const ( - ProviderName = "mesos" - - // KubernetesExecutorName is shared between contrib/mesos and Mesos cloud provider. - // Because cloud provider -> contrib dependencies are forbidden, this constant - // is defined here, not in contrib. - KubernetesExecutorName = "Kubelet-Executor" -) - -var ( - CloudProvider *MesosCloud - - noHostNameSpecified = errors.New("No hostname specified") -) - -func init() { - cloudprovider.RegisterCloudProvider( - ProviderName, - func(configReader io.Reader) (cloudprovider.Interface, error) { - provider, err := newMesosCloud(configReader) - if err == nil { - CloudProvider = provider - } - return provider, err - }) -} - -type MesosCloud struct { - client *mesosClient - config *Config -} - -func (c *MesosCloud) MasterURI() string { - return c.config.MesosMaster -} - -func newMesosCloud(configReader io.Reader) (*MesosCloud, error) { - config, err := readConfig(configReader) - if err != nil { - return nil, err - } - - log.V(1).Infof("new mesos cloud, master='%v'", config.MesosMaster) - if d, err := detector.New(config.MesosMaster); err != nil { - log.V(1).Infof("failed to create master detector: %v", err) - return nil, err - } else if cl, err := newMesosClient(d, - config.MesosHttpClientTimeout.Duration, - config.StateCacheTTL.Duration); err != nil { - log.V(1).Infof("failed to create mesos cloud client: %v", err) - return nil, err - } else { - return &MesosCloud{client: cl, config: config}, nil - } -} - -// Implementation of Instances.CurrentNodeName -func (c *MesosCloud) CurrentNodeName(hostname string) (string, error) { - return hostname, nil -} - -func (c *MesosCloud) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} - -// Instances returns a copy of the Mesos cloud Instances implementation. -// Mesos natively provides minimal cloud-type resources. More robust cloud -// support requires a combination of Mesos and cloud-specific knowledge. -func (c *MesosCloud) Instances() (cloudprovider.Instances, bool) { - return c, true -} - -// LoadBalancer always returns nil, false in this implementation. -// Mesos does not provide any type of native load balancing by default, -// so this implementation always returns (nil, false). -func (c *MesosCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - return nil, false -} - -// Zones always returns nil, false in this implementation. -// Mesos does not provide any type of native region or zone awareness, -// so this implementation always returns (nil, false). -func (c *MesosCloud) Zones() (cloudprovider.Zones, bool) { - return nil, false -} - -// Clusters returns a copy of the Mesos cloud Clusters implementation. -// Mesos does not provide support for multiple clusters. -func (c *MesosCloud) Clusters() (cloudprovider.Clusters, bool) { - return c, true -} - -// Routes always returns nil, false in this implementation. -func (c *MesosCloud) Routes() (cloudprovider.Routes, bool) { - return nil, false -} - -// ProviderName returns the cloud provider ID. -func (c *MesosCloud) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (c *MesosCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -// ListClusters lists the names of the available Mesos clusters. -func (c *MesosCloud) ListClusters() ([]string, error) { - // Always returns a single cluster (this one!) - ctx, cancel := context.WithCancel(context.TODO()) - defer cancel() - name, err := c.client.clusterName(ctx) - return []string{name}, err -} - -// Master gets back the address (either DNS name or IP address) of the leading Mesos master node for the cluster. -func (c *MesosCloud) Master(clusterName string) (string, error) { - clusters, err := c.ListClusters() - if err != nil { - return "", err - } - for _, name := range clusters { - if name == clusterName { - if c.client.master == "" { - return "", errors.New("The currently leading master is unknown.") - } - - host, _, err := net.SplitHostPort(c.client.master) - if err != nil { - return "", err - } - - return host, nil - } - } - return "", errors.New(fmt.Sprintf("The supplied cluster '%v' does not exist", clusterName)) -} - -// ipAddress returns an IP address of the specified instance. -func ipAddress(name string) (net.IP, error) { - if name == "" { - return nil, noHostNameSpecified - } - ipaddr := net.ParseIP(name) - if ipaddr != nil { - return ipaddr, nil - } - iplist, err := net.LookupIP(name) - if err != nil { - log.V(2).Infof("failed to resolve IP from host name '%v': %v", name, err) - return nil, err - } - ipaddr = iplist[0] - log.V(2).Infof("resolved host '%v' to '%v'", name, ipaddr) - return ipaddr, nil -} - -// ExternalID returns the cloud provider ID of the specified instance (deprecated). -func (c *MesosCloud) ExternalID(instance string) (string, error) { - //TODO(jdef) use a timeout here? 15s? - ctx, cancel := context.WithCancel(context.TODO()) - defer cancel() - - nodes, err := c.client.listSlaves(ctx) - if err != nil { - return "", err - } - - node := nodes[instance] - if node == nil { - return "", cloudprovider.InstanceNotFound - } - - ip, err := ipAddress(node.hostname) - if err != nil { - return "", err - } - return ip.String(), nil -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (c *MesosCloud) InstanceID(name string) (string, error) { - return "", nil -} - -// InstanceType returns the type of the specified instance. -func (c *MesosCloud) InstanceType(name string) (string, error) { - return "", nil -} - -func (c *MesosCloud) listNodes() (map[string]*slaveNode, error) { - //TODO(jdef) use a timeout here? 15s? - ctx, cancel := context.WithCancel(context.TODO()) - defer cancel() - - nodes, err := c.client.listSlaves(ctx) - if err != nil { - return nil, err - } - if len(nodes) == 0 { - log.V(2).Info("no slaves found, are any running?") - return nil, nil - } - return nodes, nil -} - -// List lists instances that match 'filter' which is a regular expression -// which must match the entire instance name (fqdn). -func (c *MesosCloud) List(filter string) ([]string, error) { - nodes, err := c.listNodes() - if err != nil { - return nil, err - } - filterRegex, err := regexp.Compile(filter) - if err != nil { - return nil, err - } - addr := []string{} - for _, node := range nodes { - if filterRegex.MatchString(node.hostname) { - addr = append(addr, node.hostname) - } - } - return addr, nil -} - -// ListWithKubelet list those instance which have no running kubelet, i.e. the -// Kubernetes executor. -func (c *MesosCloud) ListWithoutKubelet() ([]string, error) { - nodes, err := c.listNodes() - if err != nil { - return nil, err - } - addr := make([]string, 0, len(nodes)) - for _, n := range nodes { - if !n.kubeletRunning { - addr = append(addr, n.hostname) - } - } - return addr, nil -} - -// NodeAddresses returns the addresses of the specified instance. -func (c *MesosCloud) NodeAddresses(name string) ([]api.NodeAddress, error) { - ip, err := ipAddress(name) - if err != nil { - return nil, err - } - return []api.NodeAddress{{Type: api.NodeLegacyHostIP, Address: ip.String()}}, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos_test.go deleted file mode 100644 index b504f4ef0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/mesos_test.go +++ /dev/null @@ -1,279 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - "bytes" - "net" - "reflect" - "testing" - "time" - - log "github.com/golang/glog" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -func TestIPAddress(t *testing.T) { - expected4 := net.IPv4(127, 0, 0, 1) - ip, err := ipAddress("127.0.0.1") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(ip, expected4) { - t.Fatalf("expected %#v instead of %#v", expected4, ip) - } - - expected6 := net.ParseIP("::1") - if expected6 == nil { - t.Fatalf("failed to parse ipv6 ::1") - } - ip, err = ipAddress("::1") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(ip, expected6) { - t.Fatalf("expected %#v instead of %#v", expected6, ip) - } - - ip, err = ipAddress("localhost") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !reflect.DeepEqual(ip, expected4) && !reflect.DeepEqual(ip, expected6) { - t.Fatalf("expected %#v or %#v instead of %#v", expected4, expected6, ip) - } - - _, err = ipAddress("") - if err != noHostNameSpecified { - t.Fatalf("expected error noHostNameSpecified but got none") - } -} - -// test mesos.newMesosCloud with no config -func Test_newMesosCloud_NoConfig(t *testing.T) { - defer log.Flush() - mesosCloud, err := newMesosCloud(nil) - - if err != nil { - t.Fatalf("Creating a new Mesos cloud provider without config does not yield an error: %#v", err) - } - - if mesosCloud.client.httpClient.Timeout != DefaultHttpClientTimeout { - t.Fatalf("Creating a new Mesos cloud provider without config does not yield an error: %#v", err) - } - - if mesosCloud.client.state.ttl != DefaultStateCacheTTL { - t.Fatalf("Mesos client with default config has the expected state cache TTL value") - } -} - -// test mesos.newMesosCloud with custom config -func Test_newMesosCloud_WithConfig(t *testing.T) { - defer log.Flush() - - configString := ` -[mesos-cloud] - http-client-timeout = 500ms - state-cache-ttl = 1h` - - reader := bytes.NewBufferString(configString) - - mesosCloud, err := newMesosCloud(reader) - - if err != nil { - t.Fatalf("Creating a new Mesos cloud provider with a custom config does not yield an error: %#v", err) - } - - if mesosCloud.client.httpClient.Timeout != time.Duration(500)*time.Millisecond { - t.Fatalf("Mesos client with a custom config has the expected HTTP client timeout value") - } - - if mesosCloud.client.state.ttl != time.Duration(1)*time.Hour { - t.Fatalf("Mesos client with a custom config has the expected state cache TTL value") - } -} - -// tests for capability reporting functions - -// test mesos.Instances -func Test_Instances(t *testing.T) { - defer log.Flush() - mesosCloud, _ := newMesosCloud(nil) - - instances, supports_instances := mesosCloud.Instances() - - if !supports_instances || instances == nil { - t.Fatalf("MesosCloud provides an implementation of Instances") - } -} - -// test mesos.LoadBalancer -func Test_TcpLoadBalancer(t *testing.T) { - defer log.Flush() - mesosCloud, _ := newMesosCloud(nil) - - lb, supports_lb := mesosCloud.LoadBalancer() - - if supports_lb || lb != nil { - t.Fatalf("MesosCloud does not provide an implementation of LoadBalancer") - } -} - -// test mesos.Zones -func Test_Zones(t *testing.T) { - defer log.Flush() - mesosCloud, _ := newMesosCloud(nil) - - zones, supports_zones := mesosCloud.Zones() - - if supports_zones || zones != nil { - t.Fatalf("MesosCloud does not provide an implementation of Zones") - } -} - -// test mesos.Clusters -func Test_Clusters(t *testing.T) { - defer log.Flush() - mesosCloud, _ := newMesosCloud(nil) - - clusters, supports_clusters := mesosCloud.Clusters() - - if !supports_clusters || clusters == nil { - t.Fatalf("MesosCloud does not provide an implementation of Clusters") - } -} - -// test mesos.MasterURI -func Test_MasterURI(t *testing.T) { - defer log.Flush() - mesosCloud, _ := newMesosCloud(nil) - - uri := mesosCloud.MasterURI() - - if uri != DefaultMesosMaster { - t.Fatalf("MasterURI returns the expected master URI (expected \"localhost\", actual \"%s\"", uri) - } -} - -// test mesos.ListClusters -func Test_ListClusters(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - mesosCloud := &MesosCloud{client: mesosClient, config: createDefaultConfig()} - - clusters, err := mesosCloud.ListClusters() - - if err != nil { - t.Fatalf("ListClusters does not yield an error: %#v", err) - } - - if len(clusters) != 1 { - t.Fatalf("ListClusters should return a list of size 1: (actual: %#v)", clusters) - } - - expectedClusterNames := []string{"mesos"} - - if !reflect.DeepEqual(clusters, expectedClusterNames) { - t.Fatalf("ListClusters should return the expected list of names: (expected: %#v, actual: %#v)", - expectedClusterNames, - clusters) - } -} - -// test mesos.Master -func Test_Master(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - mesosCloud := &MesosCloud{client: mesosClient, config: createDefaultConfig()} - - clusters, err := mesosCloud.ListClusters() - clusterName := clusters[0] - master, err := mesosCloud.Master(clusterName) - - if err != nil { - t.Fatalf("Master does not yield an error: %#v", err) - } - - expectedMaster := unpackIPv4(TEST_MASTER_IP) - - if master != expectedMaster { - t.Fatalf("Master returns the expected value: (expected: %#v, actual: %#v", expectedMaster, master) - } -} - -// test mesos.List -func Test_List(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - mesosCloud := &MesosCloud{client: mesosClient, config: createDefaultConfig()} - - clusters, err := mesosCloud.List(".*") // recognizes the language of all strings - - if err != nil { - t.Fatalf("List does not yield an error: %#v", err) - } - - if len(clusters) != 3 { - t.Fatalf("List with a catch-all filter should return a list of size 3: (actual: %#v)", clusters) - } - - clusters, err = mesosCloud.List("$^") // end-of-string followed by start-of-string: recognizes the empty language - - if err != nil { - t.Fatalf("List does not yield an error: %#v", err) - } - - if len(clusters) != 0 { - t.Fatalf("List with a reject-all filter should return a list of size 0: (actual: %#v)", clusters) - } -} - -func Test_ExternalID(t *testing.T) { - defer log.Flush() - md := FakeMasterDetector{} - httpServer, httpClient, httpTransport := makeHttpMocks() - defer httpServer.Close() - cacheTTL := 500 * time.Millisecond - mesosClient, err := createMesosClient(md, httpClient, httpTransport, cacheTTL) - mesosCloud := &MesosCloud{client: mesosClient, config: createDefaultConfig()} - - _, err = mesosCloud.ExternalID("unknown") - if err != cloudprovider.InstanceNotFound { - t.Fatalf("ExternalID did not return InstanceNotFound on an unknown instance") - } - - slaveName := "mesos3.internal.company.com" - id, err := mesosCloud.ExternalID(slaveName) - if id != "" { - t.Fatalf("ExternalID should not be able to resolve %q", slaveName) - } - if err == cloudprovider.InstanceNotFound { - t.Fatalf("ExternalID should find %q", slaveName) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/plugins.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/plugins.go deleted file mode 100644 index 2baf7b47f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/mesos/plugins.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mesos - -import ( - _ "github.com/mesos/mesos-go/detector/zoo" -) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/MAINTAINERS.md b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/MAINTAINERS.md deleted file mode 100644 index f71afec99..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/MAINTAINERS.md +++ /dev/null @@ -1,6 +0,0 @@ -# Maintainers - -* [Angus Lees](https://github.com/anguslees) - - -[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/pkg/cloudprovider/providers/openstack/MAINTAINERS.md?pixel)]() diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack.go deleted file mode 100644 index 8c5b8ac4c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack.go +++ /dev/null @@ -1,1125 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 openstack - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "path" - "regexp" - "strings" - "time" - - "github.com/rackspace/gophercloud" - "github.com/rackspace/gophercloud/openstack" - "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes" - "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach" - "github.com/rackspace/gophercloud/openstack/compute/v2/flavors" - "github.com/rackspace/gophercloud/openstack/compute/v2/servers" - "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/layer3/floatingips" - "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/lbaas/members" - "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/lbaas/monitors" - "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/lbaas/pools" - "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/lbaas/vips" - "github.com/rackspace/gophercloud/pagination" - "gopkg.in/gcfg.v1" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/service" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -const ProviderName = "openstack" - -// metadataUrl is URL to OpenStack metadata server. It's hadrcoded IPv4 -// link-local address as documented in "OpenStack Cloud Administrator Guide", -// chapter Compute - Networking with nova-network. -// http://docs.openstack.org/admin-guide-cloud/compute-networking-nova.html#metadata-service -const metadataUrl = "http://169.254.169.254/openstack/2012-08-10/meta_data.json" - -var ErrNotFound = errors.New("Failed to find object") -var ErrMultipleResults = errors.New("Multiple results where only one expected") -var ErrNoAddressFound = errors.New("No address found for host") -var ErrAttrNotFound = errors.New("Expected attribute not found") - -const ( - MiB = 1024 * 1024 - GB = 1000 * 1000 * 1000 -) - -// encoding.TextUnmarshaler interface for time.Duration -type MyDuration struct { - time.Duration -} - -func (d *MyDuration) UnmarshalText(text []byte) error { - res, err := time.ParseDuration(string(text)) - if err != nil { - return err - } - d.Duration = res - return nil -} - -type LoadBalancerOpts struct { - SubnetId string `gcfg:"subnet-id"` // required - FloatingNetworkId string `gcfg:"floating-network-id"` - LBMethod string `gcfg:"lb-method"` - CreateMonitor bool `gcfg:"create-monitor"` - MonitorDelay MyDuration `gcfg:"monitor-delay"` - MonitorTimeout MyDuration `gcfg:"monitor-timeout"` - MonitorMaxRetries uint `gcfg:"monitor-max-retries"` -} - -// OpenStack is an implementation of cloud provider Interface for OpenStack. -type OpenStack struct { - provider *gophercloud.ProviderClient - region string - lbOpts LoadBalancerOpts - // InstanceID of the server where this OpenStack object is instantiated. - localInstanceID string -} - -type Config struct { - Global struct { - AuthUrl string `gcfg:"auth-url"` - Username string - UserId string `gcfg:"user-id"` - Password string - ApiKey string `gcfg:"api-key"` - TenantId string `gcfg:"tenant-id"` - TenantName string `gcfg:"tenant-name"` - DomainId string `gcfg:"domain-id"` - DomainName string `gcfg:"domain-name"` - Region string - } - LoadBalancer LoadBalancerOpts -} - -func init() { - cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) { - cfg, err := readConfig(config) - if err != nil { - return nil, err - } - return newOpenStack(cfg) - }) -} - -func (cfg Config) toAuthOptions() gophercloud.AuthOptions { - return gophercloud.AuthOptions{ - IdentityEndpoint: cfg.Global.AuthUrl, - Username: cfg.Global.Username, - UserID: cfg.Global.UserId, - Password: cfg.Global.Password, - APIKey: cfg.Global.ApiKey, - TenantID: cfg.Global.TenantId, - TenantName: cfg.Global.TenantName, - DomainID: cfg.Global.DomainId, - DomainName: cfg.Global.DomainName, - - // Persistent service, so we need to be able to renew tokens. - AllowReauth: true, - } -} - -func readConfig(config io.Reader) (Config, error) { - if config == nil { - err := fmt.Errorf("no OpenStack cloud provider config file given") - return Config{}, err - } - - var cfg Config - err := gcfg.ReadInto(&cfg, config) - return cfg, err -} - -// parseMetadataUUID reads JSON from OpenStack metadata server and parses -// instance ID out of it. -func parseMetadataUUID(jsonData []byte) (string, error) { - // We should receive an object with { 'uuid': '' } and couple of other - // properties (which we ignore). - - obj := struct{ UUID string }{} - err := json.Unmarshal(jsonData, &obj) - if err != nil { - return "", err - } - - uuid := obj.UUID - if uuid == "" { - err = fmt.Errorf("cannot parse OpenStack metadata, got empty uuid") - return "", err - } - - return uuid, nil -} - -func readInstanceID() (string, error) { - // Try to find instance ID on the local filesystem (created by cloud-init) - const instanceIDFile = "/var/lib/cloud/data/instance-id" - idBytes, err := ioutil.ReadFile(instanceIDFile) - if err == nil { - instanceID := string(idBytes) - instanceID = strings.TrimSpace(instanceID) - glog.V(3).Infof("Got instance id from %s: %s", instanceIDFile, instanceID) - if instanceID != "" { - return instanceID, nil - } - // Fall through with empty instanceID and try metadata server. - } - glog.V(5).Infof("Cannot read %s: '%v', trying metadata server", instanceIDFile, err) - - // Try to get JSON from metdata server. - resp, err := http.Get(metadataUrl) - if err != nil { - glog.V(3).Infof("Cannot read %s: %v", metadataUrl, err) - return "", err - } - - if resp.StatusCode != 200 { - err = fmt.Errorf("got unexpected status code when reading metadata from %s: %s", metadataUrl, resp.Status) - glog.V(3).Infof("%v", err) - return "", err - } - - defer resp.Body.Close() - bodyBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - glog.V(3).Infof("Cannot get HTTP response body from %s: %v", metadataUrl, err) - return "", err - } - instanceID, err := parseMetadataUUID(bodyBytes) - if err != nil { - glog.V(3).Infof("Cannot parse instance ID from metadata from %s: %v", metadataUrl, err) - return "", err - } - - glog.V(3).Infof("Got instance id from %s: %s", metadataUrl, instanceID) - return instanceID, nil -} - -func newOpenStack(cfg Config) (*OpenStack, error) { - provider, err := openstack.AuthenticatedClient(cfg.toAuthOptions()) - if err != nil { - return nil, err - } - - id, err := readInstanceID() - if err != nil { - return nil, err - } - - os := OpenStack{ - provider: provider, - region: cfg.Global.Region, - lbOpts: cfg.LoadBalancer, - localInstanceID: id, - } - - return &os, nil -} - -type Instances struct { - compute *gophercloud.ServiceClient - flavor_to_resource map[string]*api.NodeResources // keyed by flavor id -} - -// Instances returns an implementation of Instances for OpenStack. -func (os *OpenStack) Instances() (cloudprovider.Instances, bool) { - glog.V(4).Info("openstack.Instances() called") - - compute, err := openstack.NewComputeV2(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - if err != nil { - glog.Warningf("Failed to find compute endpoint: %v", err) - return nil, false - } - - pager := flavors.ListDetail(compute, nil) - - flavor_to_resource := make(map[string]*api.NodeResources) - err = pager.EachPage(func(page pagination.Page) (bool, error) { - flavorList, err := flavors.ExtractFlavors(page) - if err != nil { - return false, err - } - for _, flavor := range flavorList { - rsrc := api.NodeResources{ - Capacity: api.ResourceList{ - api.ResourceCPU: *resource.NewQuantity(int64(flavor.VCPUs), resource.DecimalSI), - api.ResourceMemory: *resource.NewQuantity(int64(flavor.RAM)*MiB, resource.BinarySI), - "openstack.org/disk": *resource.NewQuantity(int64(flavor.Disk)*GB, resource.DecimalSI), - "openstack.org/rxTxFactor": *resource.NewMilliQuantity(int64(flavor.RxTxFactor)*1000, resource.DecimalSI), - "openstack.org/swap": *resource.NewQuantity(int64(flavor.Swap)*MiB, resource.BinarySI), - }, - } - flavor_to_resource[flavor.ID] = &rsrc - } - return true, nil - }) - if err != nil { - glog.Warningf("Failed to find compute flavors: %v", err) - return nil, false - } - - glog.V(3).Infof("Found %v compute flavors", len(flavor_to_resource)) - glog.V(1).Info("Claiming to support Instances") - - return &Instances{compute, flavor_to_resource}, true -} - -func (i *Instances) List(name_filter string) ([]string, error) { - glog.V(4).Infof("openstack List(%v) called", name_filter) - - opts := servers.ListOpts{ - Name: name_filter, - Status: "ACTIVE", - } - pager := servers.List(i.compute, opts) - - ret := make([]string, 0) - err := pager.EachPage(func(page pagination.Page) (bool, error) { - sList, err := servers.ExtractServers(page) - if err != nil { - return false, err - } - for _, server := range sList { - ret = append(ret, server.Name) - } - return true, nil - }) - if err != nil { - return nil, err - } - - glog.V(3).Infof("Found %v instances matching %v: %v", - len(ret), name_filter, ret) - - return ret, nil -} - -func getServerByName(client *gophercloud.ServiceClient, name string) (*servers.Server, error) { - opts := servers.ListOpts{ - Name: fmt.Sprintf("^%s$", regexp.QuoteMeta(name)), - Status: "ACTIVE", - } - pager := servers.List(client, opts) - - serverList := make([]servers.Server, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - s, err := servers.ExtractServers(page) - if err != nil { - return false, err - } - serverList = append(serverList, s...) - if len(serverList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - return nil, err - } - - if len(serverList) == 0 { - return nil, ErrNotFound - } else if len(serverList) > 1 { - return nil, ErrMultipleResults - } - - return &serverList[0], nil -} - -func getAddressesByName(client *gophercloud.ServiceClient, name string) ([]api.NodeAddress, error) { - srv, err := getServerByName(client, name) - if err != nil { - return nil, err - } - - addrs := []api.NodeAddress{} - - for network, netblob := range srv.Addresses { - list, ok := netblob.([]interface{}) - if !ok { - continue - } - - for _, item := range list { - var addressType api.NodeAddressType - - props, ok := item.(map[string]interface{}) - if !ok { - continue - } - - extIPType, ok := props["OS-EXT-IPS:type"] - if (ok && extIPType == "floating") || (!ok && network == "public") { - addressType = api.NodeExternalIP - } else { - addressType = api.NodeInternalIP - } - - tmp, ok := props["addr"] - if !ok { - continue - } - addr, ok := tmp.(string) - if !ok { - continue - } - - api.AddToNodeAddresses(&addrs, - api.NodeAddress{ - Type: addressType, - Address: addr, - }, - ) - } - } - - // AccessIPs are usually duplicates of "public" addresses. - if srv.AccessIPv4 != "" { - api.AddToNodeAddresses(&addrs, - api.NodeAddress{ - Type: api.NodeExternalIP, - Address: srv.AccessIPv4, - }, - ) - } - - if srv.AccessIPv6 != "" { - api.AddToNodeAddresses(&addrs, - api.NodeAddress{ - Type: api.NodeExternalIP, - Address: srv.AccessIPv6, - }, - ) - } - - return addrs, nil -} - -func getAddressByName(client *gophercloud.ServiceClient, name string) (string, error) { - addrs, err := getAddressesByName(client, name) - if err != nil { - return "", err - } else if len(addrs) == 0 { - return "", ErrNoAddressFound - } - - for _, addr := range addrs { - if addr.Type == api.NodeInternalIP { - return addr.Address, nil - } - } - - return addrs[0].Address, nil -} - -// Implementation of Instances.CurrentNodeName -func (i *Instances) CurrentNodeName(hostname string) (string, error) { - return hostname, nil -} - -func (i *Instances) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} - -func (i *Instances) NodeAddresses(name string) ([]api.NodeAddress, error) { - glog.V(4).Infof("NodeAddresses(%v) called", name) - - addrs, err := getAddressesByName(i.compute, name) - if err != nil { - return nil, err - } - - glog.V(4).Infof("NodeAddresses(%v) => %v", name, addrs) - return addrs, nil -} - -// ExternalID returns the cloud provider ID of the specified instance (deprecated). -func (i *Instances) ExternalID(name string) (string, error) { - srv, err := getServerByName(i.compute, name) - if err != nil { - return "", err - } - return srv.ID, nil -} - -// InstanceID returns the kubelet's cloud provider ID. -func (os *OpenStack) InstanceID() (string, error) { - return os.localInstanceID, nil -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (i *Instances) InstanceID(name string) (string, error) { - srv, err := getServerByName(i.compute, name) - if err != nil { - return "", err - } - // In the future it is possible to also return an endpoint as: - // / - return "/" + srv.ID, nil -} - -// InstanceType returns the type of the specified instance. -func (i *Instances) InstanceType(name string) (string, error) { - return "", nil -} - -func (os *OpenStack) Clusters() (cloudprovider.Clusters, bool) { - return nil, false -} - -// ProviderName returns the cloud provider ID. -func (os *OpenStack) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (os *OpenStack) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -type LoadBalancer struct { - network *gophercloud.ServiceClient - compute *gophercloud.ServiceClient - opts LoadBalancerOpts -} - -func (os *OpenStack) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - glog.V(4).Info("openstack.LoadBalancer() called") - - // TODO: Search for and support Rackspace loadbalancer API, and others. - network, err := openstack.NewNetworkV2(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - if err != nil { - glog.Warningf("Failed to find neutron endpoint: %v", err) - return nil, false - } - - compute, err := openstack.NewComputeV2(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - if err != nil { - glog.Warningf("Failed to find compute endpoint: %v", err) - return nil, false - } - - glog.V(1).Info("Claiming to support LoadBalancer") - - return &LoadBalancer{network, compute, os.lbOpts}, true -} - -func isNotFound(err error) bool { - e, ok := err.(*gophercloud.UnexpectedResponseCodeError) - return ok && e.Actual == http.StatusNotFound -} - -func getPoolByName(client *gophercloud.ServiceClient, name string) (*pools.Pool, error) { - opts := pools.ListOpts{ - Name: name, - } - pager := pools.List(client, opts) - - poolList := make([]pools.Pool, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - p, err := pools.ExtractPools(page) - if err != nil { - return false, err - } - poolList = append(poolList, p...) - if len(poolList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - if isNotFound(err) { - return nil, ErrNotFound - } - return nil, err - } - - if len(poolList) == 0 { - return nil, ErrNotFound - } else if len(poolList) > 1 { - return nil, ErrMultipleResults - } - - return &poolList[0], nil -} - -func getVipByName(client *gophercloud.ServiceClient, name string) (*vips.VirtualIP, error) { - opts := vips.ListOpts{ - Name: name, - } - pager := vips.List(client, opts) - - vipList := make([]vips.VirtualIP, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - v, err := vips.ExtractVIPs(page) - if err != nil { - return false, err - } - vipList = append(vipList, v...) - if len(vipList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - if isNotFound(err) { - return nil, ErrNotFound - } - return nil, err - } - - if len(vipList) == 0 { - return nil, ErrNotFound - } else if len(vipList) > 1 { - return nil, ErrMultipleResults - } - - return &vipList[0], nil -} - -func getFloatingIPByPortID(client *gophercloud.ServiceClient, portID string) (*floatingips.FloatingIP, error) { - opts := floatingips.ListOpts{ - PortID: portID, - } - pager := floatingips.List(client, opts) - - floatingIPList := make([]floatingips.FloatingIP, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - f, err := floatingips.ExtractFloatingIPs(page) - if err != nil { - return false, err - } - floatingIPList = append(floatingIPList, f...) - if len(floatingIPList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - if isNotFound(err) { - return nil, ErrNotFound - } - return nil, err - } - - if len(floatingIPList) == 0 { - return nil, ErrNotFound - } else if len(floatingIPList) > 1 { - return nil, ErrMultipleResults - } - - return &floatingIPList[0], nil -} - -func (lb *LoadBalancer) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - vip, err := getVipByName(lb.network, loadBalancerName) - if err == ErrNotFound { - return nil, false, nil - } - if vip == nil { - return nil, false, err - } - - status := &api.LoadBalancerStatus{} - status.Ingress = []api.LoadBalancerIngress{{IP: vip.Address}} - - return status, true, err -} - -// TODO: This code currently ignores 'region' and always creates a -// loadbalancer in only the current OpenStack region. We should take -// a list of regions (from config) and query/create loadbalancers in -// each region. - -func (lb *LoadBalancer) EnsureLoadBalancer(apiService *api.Service, hosts []string, annotations map[string]string) (*api.LoadBalancerStatus, error) { - glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v)", apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, annotations) - - ports := apiService.Spec.Ports - if len(ports) > 1 { - return nil, fmt.Errorf("multiple ports are not yet supported in openstack load balancers") - } else if len(ports) == 0 { - return nil, fmt.Errorf("no ports provided to openstack load balancer") - } - - // The service controller verified all the protocols match on the ports, just check and use the first one - // TODO: Convert all error messages to use an event recorder - if ports[0].Protocol != api.ProtocolTCP { - return nil, fmt.Errorf("Only TCP LoadBalancer is supported for openstack load balancers") - } - - affinity := apiService.Spec.SessionAffinity - var persistence *vips.SessionPersistence - switch affinity { - case api.ServiceAffinityNone: - persistence = nil - case api.ServiceAffinityClientIP: - persistence = &vips.SessionPersistence{Type: "SOURCE_IP"} - default: - return nil, fmt.Errorf("unsupported load balancer affinity: %v", affinity) - } - - sourceRanges, err := service.GetLoadBalancerSourceRanges(annotations) - if err != nil { - return nil, err - } - - if !service.IsAllowAll(sourceRanges) { - return nil, fmt.Errorf("Source range restrictions are not supported for openstack load balancers") - } - - glog.V(2).Infof("Checking if openstack load balancer already exists: %s", cloudprovider.GetLoadBalancerName(apiService)) - _, exists, err := lb.GetLoadBalancer(apiService) - if err != nil { - return nil, fmt.Errorf("error checking if openstack load balancer already exists: %v", err) - } - - // TODO: Implement a more efficient update strategy for common changes than delete & create - // In particular, if we implement hosts update, we can get rid of UpdateHosts - if exists { - err := lb.EnsureLoadBalancerDeleted(apiService) - if err != nil { - return nil, fmt.Errorf("error deleting existing openstack load balancer: %v", err) - } - } - - lbmethod := lb.opts.LBMethod - if lbmethod == "" { - lbmethod = pools.LBMethodRoundRobin - } - name := cloudprovider.GetLoadBalancerName(apiService) - pool, err := pools.Create(lb.network, pools.CreateOpts{ - Name: name, - Protocol: pools.ProtocolTCP, - SubnetID: lb.opts.SubnetId, - LBMethod: lbmethod, - }).Extract() - if err != nil { - return nil, err - } - - for _, host := range hosts { - addr, err := getAddressByName(lb.compute, host) - if err != nil { - return nil, err - } - - _, err = members.Create(lb.network, members.CreateOpts{ - PoolID: pool.ID, - ProtocolPort: int(ports[0].NodePort), //TODO: need to handle multi-port - Address: addr, - }).Extract() - if err != nil { - pools.Delete(lb.network, pool.ID) - return nil, err - } - } - - var mon *monitors.Monitor - if lb.opts.CreateMonitor { - mon, err = monitors.Create(lb.network, monitors.CreateOpts{ - Type: monitors.TypeTCP, - Delay: int(lb.opts.MonitorDelay.Duration.Seconds()), - Timeout: int(lb.opts.MonitorTimeout.Duration.Seconds()), - MaxRetries: int(lb.opts.MonitorMaxRetries), - }).Extract() - if err != nil { - pools.Delete(lb.network, pool.ID) - return nil, err - } - - _, err = pools.AssociateMonitor(lb.network, pool.ID, mon.ID).Extract() - if err != nil { - monitors.Delete(lb.network, mon.ID) - pools.Delete(lb.network, pool.ID) - return nil, err - } - } - - createOpts := vips.CreateOpts{ - Name: name, - Description: fmt.Sprintf("Kubernetes external service %s", name), - Protocol: "TCP", - ProtocolPort: int(ports[0].Port), //TODO: need to handle multi-port - PoolID: pool.ID, - SubnetID: lb.opts.SubnetId, - Persistence: persistence, - } - - loadBalancerIP := apiService.Spec.LoadBalancerIP - if loadBalancerIP != "" { - createOpts.Address = loadBalancerIP - } - - vip, err := vips.Create(lb.network, createOpts).Extract() - if err != nil { - if mon != nil { - monitors.Delete(lb.network, mon.ID) - } - pools.Delete(lb.network, pool.ID) - return nil, err - } - - status := &api.LoadBalancerStatus{} - - status.Ingress = []api.LoadBalancerIngress{{IP: vip.Address}} - - if lb.opts.FloatingNetworkId != "" { - floatIPOpts := floatingips.CreateOpts{ - FloatingNetworkID: lb.opts.FloatingNetworkId, - PortID: vip.PortID, - } - floatIP, err := floatingips.Create(lb.network, floatIPOpts).Extract() - if err != nil { - return nil, err - } - - status.Ingress = append(status.Ingress, api.LoadBalancerIngress{IP: floatIP.FloatingIP}) - } - - return status, nil - -} - -func (lb *LoadBalancer) UpdateLoadBalancer(service *api.Service, hosts []string) error { - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("UpdateLoadBalancer(%v, %v)", loadBalancerName, hosts) - - vip, err := getVipByName(lb.network, loadBalancerName) - if err != nil { - return err - } - - // Set of member (addresses) that _should_ exist - addrs := map[string]bool{} - for _, host := range hosts { - addr, err := getAddressByName(lb.compute, host) - if err != nil { - return err - } - - addrs[addr] = true - } - - // Iterate over members that _do_ exist - pager := members.List(lb.network, members.ListOpts{PoolID: vip.PoolID}) - err = pager.EachPage(func(page pagination.Page) (bool, error) { - memList, err := members.ExtractMembers(page) - if err != nil { - return false, err - } - - for _, member := range memList { - if _, found := addrs[member.Address]; found { - // Member already exists - delete(addrs, member.Address) - } else { - // Member needs to be deleted - err = members.Delete(lb.network, member.ID).ExtractErr() - if err != nil { - return false, err - } - } - } - - return true, nil - }) - if err != nil { - return err - } - - // Anything left in addrs is a new member that needs to be added - for addr := range addrs { - _, err := members.Create(lb.network, members.CreateOpts{ - PoolID: vip.PoolID, - Address: addr, - ProtocolPort: vip.ProtocolPort, - }).Extract() - if err != nil { - return err - } - } - - return nil -} - -func (lb *LoadBalancer) EnsureLoadBalancerDeleted(service *api.Service) error { - loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("EnsureLoadBalancerDeleted(%v)", loadBalancerName) - - vip, err := getVipByName(lb.network, loadBalancerName) - if err != nil && err != ErrNotFound { - return err - } - - if lb.opts.FloatingNetworkId != "" && vip != nil { - floatingIP, err := getFloatingIPByPortID(lb.network, vip.PortID) - if err != nil && !isNotFound(err) { - return err - } - if floatingIP != nil { - err = floatingips.Delete(lb.network, floatingIP.ID).ExtractErr() - if err != nil && !isNotFound(err) { - return err - } - } - } - - // We have to delete the VIP before the pool can be deleted, - // so no point continuing if this fails. - if vip != nil { - err := vips.Delete(lb.network, vip.ID).ExtractErr() - if err != nil && !isNotFound(err) { - return err - } - } - - var pool *pools.Pool - if vip != nil { - pool, err = pools.Get(lb.network, vip.PoolID).Extract() - if err != nil && !isNotFound(err) { - return err - } - } else { - // The VIP is gone, but it is conceivable that a Pool - // still exists that we failed to delete on some - // previous occasion. Make a best effort attempt to - // cleanup any pools with the same name as the VIP. - pool, err = getPoolByName(lb.network, service.Name) - if err != nil && err != ErrNotFound { - return err - } - } - - if pool != nil { - for _, monId := range pool.MonitorIDs { - _, err = pools.DisassociateMonitor(lb.network, pool.ID, monId).Extract() - if err != nil { - return err - } - - err = monitors.Delete(lb.network, monId).ExtractErr() - if err != nil && !isNotFound(err) { - return err - } - } - err = pools.Delete(lb.network, pool.ID).ExtractErr() - if err != nil && !isNotFound(err) { - return err - } - } - - return nil -} - -func (os *OpenStack) Zones() (cloudprovider.Zones, bool) { - glog.V(1).Info("Claiming to support Zones") - - return os, true -} -func (os *OpenStack) GetZone() (cloudprovider.Zone, error) { - glog.V(1).Infof("Current zone is %v", os.region) - - return cloudprovider.Zone{Region: os.region}, nil -} - -func (os *OpenStack) Routes() (cloudprovider.Routes, bool) { - return nil, false -} - -// Attaches given cinder volume to the compute running kubelet -func (os *OpenStack) AttachDisk(instanceID string, diskName string) (string, error) { - disk, err := os.getVolume(diskName) - if err != nil { - return "", err - } - cClient, err := openstack.NewComputeV2(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - if err != nil || cClient == nil { - glog.Errorf("Unable to initialize nova client for region: %s", os.region) - return "", err - } - - if len(disk.Attachments) > 0 && disk.Attachments[0]["server_id"] != nil { - if instanceID == disk.Attachments[0]["server_id"] { - glog.V(4).Infof("Disk: %q is already attached to compute: %q", diskName, instanceID) - return disk.ID, nil - } else { - errMsg := fmt.Sprintf("Disk %q is attached to a different compute: %q, should be detached before proceeding", diskName, disk.Attachments[0]["server_id"]) - glog.Errorf(errMsg) - return "", errors.New(errMsg) - } - } - // add read only flag here if possible spothanis - _, err = volumeattach.Create(cClient, instanceID, &volumeattach.CreateOpts{ - VolumeID: disk.ID, - }).Extract() - if err != nil { - glog.Errorf("Failed to attach %s volume to %s compute", diskName, instanceID) - return "", err - } - glog.V(2).Infof("Successfully attached %s volume to %s compute", diskName, instanceID) - return disk.ID, nil -} - -// Detaches given cinder volume from the compute running kubelet -func (os *OpenStack) DetachDisk(instanceID string, partialDiskId string) error { - disk, err := os.getVolume(partialDiskId) - if err != nil { - return err - } - cClient, err := openstack.NewComputeV2(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - if err != nil || cClient == nil { - glog.Errorf("Unable to initialize nova client for region: %s", os.region) - return err - } - if len(disk.Attachments) > 0 && disk.Attachments[0]["server_id"] != nil && instanceID == disk.Attachments[0]["server_id"] { - // This is a blocking call and effects kubelet's performance directly. - // We should consider kicking it out into a separate routine, if it is bad. - err = volumeattach.Delete(cClient, instanceID, disk.ID).ExtractErr() - if err != nil { - glog.Errorf("Failed to delete volume %s from compute %s attached %v", disk.ID, instanceID, err) - return err - } - glog.V(2).Infof("Successfully detached volume: %s from compute: %s", disk.ID, instanceID) - } else { - errMsg := fmt.Sprintf("Disk: %s has no attachments or is not attached to compute: %s", disk.Name, instanceID) - glog.Errorf(errMsg) - return errors.New(errMsg) - } - return nil -} - -// Takes a partial/full disk id or diskname -func (os *OpenStack) getVolume(diskName string) (volumes.Volume, error) { - sClient, err := openstack.NewBlockStorageV1(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - - var volume volumes.Volume - if err != nil || sClient == nil { - glog.Errorf("Unable to initialize cinder client for region: %s", os.region) - return volume, err - } - - err = volumes.List(sClient, nil).EachPage(func(page pagination.Page) (bool, error) { - vols, err := volumes.ExtractVolumes(page) - if err != nil { - glog.Errorf("Failed to extract volumes: %v", err) - return false, err - } else { - for _, v := range vols { - glog.V(4).Infof("%s %s %v", v.ID, v.Name, v.Attachments) - if v.Name == diskName || strings.Contains(v.ID, diskName) { - volume = v - return true, nil - } - } - } - // if it reached here then no disk with the given name was found. - errmsg := fmt.Sprintf("Unable to find disk: %s in region %s", diskName, os.region) - return false, errors.New(errmsg) - }) - if err != nil { - glog.Errorf("Error occured getting volume: %s", diskName) - return volume, err - } - return volume, err -} - -// Create a volume of given size (in GiB) -func (os *OpenStack) CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error) { - - sClient, err := openstack.NewBlockStorageV1(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - - if err != nil || sClient == nil { - glog.Errorf("Unable to initialize cinder client for region: %s", os.region) - return "", err - } - - opts := volumes.CreateOpts{ - Name: name, - Size: size, - } - if tags != nil { - opts.Metadata = *tags - } - vol, err := volumes.Create(sClient, opts).Extract() - if err != nil { - glog.Errorf("Failed to create a %d GB volume: %v", size, err) - return "", err - } - glog.Infof("Created volume %v", vol.ID) - return vol.ID, err -} - -// GetDevicePath returns the path of an attached block storage volume, specified by its id. -func (os *OpenStack) GetDevicePath(diskId string) string { - files, _ := ioutil.ReadDir("/dev/disk/by-id/") - for _, f := range files { - if strings.Contains(f.Name(), "virtio-") { - devid_prefix := f.Name()[len("virtio-"):len(f.Name())] - if strings.Contains(diskId, devid_prefix) { - glog.V(4).Infof("Found disk attached as %q; full devicepath: %s\n", f.Name(), path.Join("/dev/disk/by-id/", f.Name())) - return path.Join("/dev/disk/by-id/", f.Name()) - } - } - } - glog.Warningf("Failed to find device for the diskid: %q\n", diskId) - return "" -} - -func (os *OpenStack) DeleteVolume(volumeName string) error { - sClient, err := openstack.NewBlockStorageV1(os.provider, gophercloud.EndpointOpts{ - Region: os.region, - }) - - if err != nil || sClient == nil { - glog.Errorf("Unable to initialize cinder client for region: %s", os.region) - return err - } - err = volumes.Delete(sClient, volumeName).ExtractErr() - if err != nil { - glog.Errorf("Cannot delete volume %s: %v", volumeName, err) - } - return err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack_test.go deleted file mode 100644 index 06f618e45..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/openstack/openstack_test.go +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 openstack - -import ( - "os" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/rand" - - "github.com/rackspace/gophercloud" - "k8s.io/kubernetes/pkg/api" -) - -const volumeAvailableStatus = "available" -const volumeInUseStatus = "in-use" -const volumeCreateTimeoutSeconds = 30 - -func WaitForVolumeStatus(t *testing.T, os *OpenStack, volumeName string, status string, timeoutSeconds int) { - timeout := timeoutSeconds - start := time.Now().Second() - for { - time.Sleep(1 * time.Second) - - if timeout >= 0 && time.Now().Second()-start >= timeout { - t.Logf("Volume (%s) status did not change to %s after %v seconds\n", - volumeName, - status, - timeout) - return - } - - getVol, err := os.getVolume(volumeName) - if err != nil { - t.Fatalf("Cannot get existing Cinder volume (%s): %v", volumeName, err) - } - if getVol.Status == status { - t.Logf("Volume (%s) status changed to %s after %v seconds\n", - volumeName, - status, - timeout) - return - } - } -} - -func TestReadConfig(t *testing.T) { - _, err := readConfig(nil) - if err == nil { - t.Errorf("Should fail when no config is provided: %s", err) - } - - cfg, err := readConfig(strings.NewReader(` -[Global] -auth-url = http://auth.url -username = user -[LoadBalancer] -create-monitor = yes -monitor-delay = 1m -monitor-timeout = 30s -monitor-max-retries = 3 -`)) - if err != nil { - t.Fatalf("Should succeed when a valid config is provided: %s", err) - } - if cfg.Global.AuthUrl != "http://auth.url" { - t.Errorf("incorrect authurl: %s", cfg.Global.AuthUrl) - } - - if !cfg.LoadBalancer.CreateMonitor { - t.Errorf("incorrect lb.createmonitor: %t", cfg.LoadBalancer.CreateMonitor) - } - if cfg.LoadBalancer.MonitorDelay.Duration != 1*time.Minute { - t.Errorf("incorrect lb.monitordelay: %s", cfg.LoadBalancer.MonitorDelay) - } - if cfg.LoadBalancer.MonitorTimeout.Duration != 30*time.Second { - t.Errorf("incorrect lb.monitortimeout: %s", cfg.LoadBalancer.MonitorTimeout) - } - if cfg.LoadBalancer.MonitorMaxRetries != 3 { - t.Errorf("incorrect lb.monitormaxretries: %d", cfg.LoadBalancer.MonitorMaxRetries) - } -} - -func TestToAuthOptions(t *testing.T) { - cfg := Config{} - cfg.Global.Username = "user" - // etc. - - ao := cfg.toAuthOptions() - - if !ao.AllowReauth { - t.Errorf("Will need to be able to reauthenticate") - } - if ao.Username != cfg.Global.Username { - t.Errorf("Username %s != %s", ao.Username, cfg.Global.Username) - } -} - -// This allows acceptance testing against an existing OpenStack -// install, using the standard OS_* OpenStack client environment -// variables. -// FIXME: it would be better to hermetically test against canned JSON -// requests/responses. -func configFromEnv() (cfg Config, ok bool) { - cfg.Global.AuthUrl = os.Getenv("OS_AUTH_URL") - - cfg.Global.TenantId = os.Getenv("OS_TENANT_ID") - // Rax/nova _insists_ that we don't specify both tenant ID and name - if cfg.Global.TenantId == "" { - cfg.Global.TenantName = os.Getenv("OS_TENANT_NAME") - } - - cfg.Global.Username = os.Getenv("OS_USERNAME") - cfg.Global.Password = os.Getenv("OS_PASSWORD") - cfg.Global.ApiKey = os.Getenv("OS_API_KEY") - cfg.Global.Region = os.Getenv("OS_REGION_NAME") - cfg.Global.DomainId = os.Getenv("OS_DOMAIN_ID") - cfg.Global.DomainName = os.Getenv("OS_DOMAIN_NAME") - - ok = (cfg.Global.AuthUrl != "" && - cfg.Global.Username != "" && - (cfg.Global.Password != "" || cfg.Global.ApiKey != "") && - (cfg.Global.TenantId != "" || cfg.Global.TenantName != "" || - cfg.Global.DomainId != "" || cfg.Global.DomainName != "")) - - return -} - -func TestNewOpenStack(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - _, err := newOpenStack(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate OpenStack: %s", err) - } -} - -func TestInstances(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - os, err := newOpenStack(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate OpenStack: %s", err) - } - - i, ok := os.Instances() - if !ok { - t.Fatalf("Instances() returned false") - } - - srvs, err := i.List(".") - if err != nil { - t.Fatalf("Instances.List() failed: %s", err) - } - if len(srvs) == 0 { - t.Fatalf("Instances.List() returned zero servers") - } - t.Logf("Found servers (%d): %s\n", len(srvs), srvs) - - srvExternalId, err := i.ExternalID(srvs[0]) - if err != nil { - t.Fatalf("Instances.ExternalId(%s) failed: %s", srvs[0], err) - } - t.Logf("Found server (%s), with external id: %s\n", srvs[0], srvExternalId) - - srvInstanceId, err := i.InstanceID(srvs[0]) - if err != nil { - t.Fatalf("Instance.InstanceId(%s) failed: %s", srvs[0], err) - } - t.Logf("Found server (%s), with instance id: %s\n", srvs[0], srvInstanceId) - - addrs, err := i.NodeAddresses(srvs[0]) - if err != nil { - t.Fatalf("Instances.NodeAddresses(%s) failed: %s", srvs[0], err) - } - t.Logf("Found NodeAddresses(%s) = %s\n", srvs[0], addrs) -} - -func TestLoadBalancer(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - os, err := newOpenStack(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate OpenStack: %s", err) - } - - lb, ok := os.LoadBalancer() - if !ok { - t.Fatalf("LoadBalancer() returned false - perhaps your stack doesn't support Neutron?") - } - - _, exists, err := lb.GetLoadBalancer(&api.Service{ObjectMeta: api.ObjectMeta{Name: "noexist"}}) - if err != nil { - t.Fatalf("GetLoadBalancer(\"noexist\") returned error: %s", err) - } - if exists { - t.Fatalf("GetLoadBalancer(\"noexist\") returned exists") - } -} - -func TestZones(t *testing.T) { - os := OpenStack{ - provider: &gophercloud.ProviderClient{ - IdentityBase: "http://auth.url/", - }, - region: "myRegion", - } - - z, ok := os.Zones() - if !ok { - t.Fatalf("Zones() returned false") - } - - zone, err := z.GetZone() - if err != nil { - t.Fatalf("GetZone() returned error: %s", err) - } - - if zone.Region != "myRegion" { - t.Fatalf("GetZone() returned wrong region (%s)", zone.Region) - } -} - -func TestVolumes(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - os, err := newOpenStack(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate OpenStack: %s", err) - } - - tags := map[string]string{ - "test": "value", - } - vol, err := os.CreateVolume("kubernetes-test-volume-"+rand.String(10), 1, &tags) - if err != nil { - t.Fatalf("Cannot create a new Cinder volume: %v", err) - } - t.Logf("Volume (%s) created\n", vol) - - WaitForVolumeStatus(t, os, vol, volumeAvailableStatus, volumeCreateTimeoutSeconds) - - diskId, err := os.AttachDisk(os.localInstanceID, vol) - if err != nil { - t.Fatalf("Cannot AttachDisk Cinder volume %s: %v", vol, err) - } - t.Logf("Volume (%s) attached, disk ID: %s\n", vol, diskId) - - WaitForVolumeStatus(t, os, vol, volumeInUseStatus, volumeCreateTimeoutSeconds) - - err = os.DetachDisk(os.localInstanceID, vol) - if err != nil { - t.Fatalf("Cannot DetachDisk Cinder volume %s: %v", vol, err) - } - t.Logf("Volume (%s) detached\n", vol) - - WaitForVolumeStatus(t, os, vol, volumeAvailableStatus, volumeCreateTimeoutSeconds) - - err = os.DeleteVolume(vol) - if err != nil { - t.Fatalf("Cannot delete Cinder volume %s: %v", vol, err) - } - t.Logf("Volume (%s) deleted\n", vol) - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt.go deleted file mode 100644 index d2ba03c10..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt.go +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ovirt - -import ( - "encoding/xml" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "path" - "sort" - "strings" - - "gopkg.in/gcfg.v1" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -const ProviderName = "ovirt" - -type OVirtInstance struct { - UUID string - Name string - IPAddress string -} - -type OVirtInstanceMap map[string]OVirtInstance - -type OVirtCloud struct { - VmsRequest *url.URL - HostsRequest *url.URL -} - -type OVirtApiConfig struct { - Connection struct { - ApiEntry string `gcfg:"uri"` - Username string `gcfg:"username"` - Password string `gcfg:"password"` - } - Filters struct { - VmsQuery string `gcfg:"vms"` - } -} - -type XmlVmAddress struct { - Address string `xml:"address,attr"` -} - -type XmlVmInfo struct { - UUID string `xml:"id,attr"` - Name string `xml:"name"` - Hostname string `xml:"guest_info>fqdn"` - Addresses []XmlVmAddress `xml:"guest_info>ips>ip"` - State string `xml:"status>state"` -} - -type XmlVmsList struct { - XMLName xml.Name `xml:"vms"` - Vm []XmlVmInfo `xml:"vm"` -} - -func init() { - cloudprovider.RegisterCloudProvider(ProviderName, - func(config io.Reader) (cloudprovider.Interface, error) { - return newOVirtCloud(config) - }) -} - -func newOVirtCloud(config io.Reader) (*OVirtCloud, error) { - if config == nil { - return nil, fmt.Errorf("missing configuration file for ovirt cloud provider") - } - - oVirtConfig := OVirtApiConfig{} - - /* defaults */ - oVirtConfig.Connection.Username = "admin@internal" - - if err := gcfg.ReadInto(&oVirtConfig, config); err != nil { - return nil, err - } - - if oVirtConfig.Connection.ApiEntry == "" { - return nil, fmt.Errorf("missing ovirt uri in cloud provider configuration") - } - - request, err := url.Parse(oVirtConfig.Connection.ApiEntry) - if err != nil { - return nil, err - } - - request.Path = path.Join(request.Path, "vms") - request.User = url.UserPassword(oVirtConfig.Connection.Username, oVirtConfig.Connection.Password) - request.RawQuery = url.Values{"search": {oVirtConfig.Filters.VmsQuery}}.Encode() - - return &OVirtCloud{VmsRequest: request}, nil -} - -func (aws *OVirtCloud) Clusters() (cloudprovider.Clusters, bool) { - return nil, false -} - -// ProviderName returns the cloud provider ID. -func (v *OVirtCloud) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (v *OVirtCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -// LoadBalancer returns an implementation of LoadBalancer for oVirt cloud -func (v *OVirtCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - return nil, false -} - -// Instances returns an implementation of Instances for oVirt cloud -func (v *OVirtCloud) Instances() (cloudprovider.Instances, bool) { - return v, true -} - -// Zones returns an implementation of Zones for oVirt cloud -func (v *OVirtCloud) Zones() (cloudprovider.Zones, bool) { - return nil, false -} - -// Routes returns an implementation of Routes for oVirt cloud -func (v *OVirtCloud) Routes() (cloudprovider.Routes, bool) { - return nil, false -} - -// NodeAddresses returns the NodeAddresses of a particular machine instance -func (v *OVirtCloud) NodeAddresses(name string) ([]api.NodeAddress, error) { - instance, err := v.fetchInstance(name) - if err != nil { - return nil, err - } - - var address net.IP - - if instance.IPAddress != "" { - address = net.ParseIP(instance.IPAddress) - if address == nil { - return nil, fmt.Errorf("couldn't parse address: %s", instance.IPAddress) - } - } else { - resolved, err := net.LookupIP(name) - if err != nil || len(resolved) < 1 { - return nil, fmt.Errorf("couldn't lookup address: %s", name) - } - address = resolved[0] - } - - return []api.NodeAddress{{Type: api.NodeLegacyHostIP, Address: address.String()}}, nil -} - -// ExternalID returns the cloud provider ID of the specified instance (deprecated). -func (v *OVirtCloud) ExternalID(name string) (string, error) { - instance, err := v.fetchInstance(name) - if err != nil { - return "", err - } - return instance.UUID, nil -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (v *OVirtCloud) InstanceID(name string) (string, error) { - instance, err := v.fetchInstance(name) - if err != nil { - return "", err - } - // TODO: define a way to identify the provider instance to complete - // the format /. - return "/" + instance.UUID, err -} - -// InstanceType returns the type of the specified instance. -func (v *OVirtCloud) InstanceType(name string) (string, error) { - return "", nil -} - -func getInstancesFromXml(body io.Reader) (OVirtInstanceMap, error) { - if body == nil { - return nil, fmt.Errorf("ovirt rest-api response body is missing") - } - - content, err := ioutil.ReadAll(body) - if err != nil { - return nil, err - } - - vmlist := XmlVmsList{} - - if err := xml.Unmarshal(content, &vmlist); err != nil { - return nil, err - } - - instances := make(OVirtInstanceMap) - - for _, vm := range vmlist.Vm { - // Always return only vms that are up and running - if vm.Hostname != "" && strings.ToLower(vm.State) == "up" { - address := "" - if len(vm.Addresses) > 0 { - address = vm.Addresses[0].Address - } - - instances[vm.Hostname] = OVirtInstance{ - UUID: vm.UUID, - Name: vm.Name, - IPAddress: address, - } - } - } - - return instances, nil -} - -func (v *OVirtCloud) fetchAllInstances() (OVirtInstanceMap, error) { - response, err := http.Get(v.VmsRequest.String()) - if err != nil { - return nil, err - } - - defer response.Body.Close() - - return getInstancesFromXml(response.Body) -} - -func (v *OVirtCloud) fetchInstance(name string) (*OVirtInstance, error) { - allInstances, err := v.fetchAllInstances() - if err != nil { - return nil, err - } - - instance, found := allInstances[name] - if !found { - return nil, fmt.Errorf("cannot find instance: %s", name) - } - - return &instance, nil -} - -func (m *OVirtInstanceMap) ListSortedNames() []string { - var names []string - - for k := range *m { - names = append(names, k) - } - - sort.Strings(names) - - return names -} - -// List enumerates the set of minions instances known by the cloud provider -func (v *OVirtCloud) List(filter string) ([]string, error) { - instances, err := v.fetchAllInstances() - if err != nil { - return nil, err - } - return instances.ListSortedNames(), nil -} - -// Implementation of Instances.CurrentNodeName -func (v *OVirtCloud) CurrentNodeName(hostname string) (string, error) { - return hostname, nil -} - -func (v *OVirtCloud) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt_test.go deleted file mode 100644 index c76bde726..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt/ovirt_test.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ovirt - -import ( - "io" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/cloudprovider" -) - -func TestOVirtCloudConfiguration(t *testing.T) { - config1 := (io.Reader)(nil) - - _, err1 := cloudprovider.GetCloudProvider("ovirt", config1) - if err1 == nil { - t.Fatalf("An error is expected when the configuration is missing") - } - - config2 := strings.NewReader("") - - _, err2 := cloudprovider.GetCloudProvider("ovirt", config2) - if err2 == nil { - t.Fatalf("An error is expected when the configuration is empty") - } - - config3 := strings.NewReader(` -[connection] - `) - - _, err3 := cloudprovider.GetCloudProvider("ovirt", config3) - if err3 == nil { - t.Fatalf("An error is expected when the uri is missing") - } - - config4 := strings.NewReader(` -[connection] -uri = https://localhost:8443/ovirt-engine/api -`) - - _, err4 := cloudprovider.GetCloudProvider("ovirt", config4) - if err4 != nil { - t.Fatalf("Unexpected error creating the provider: %s", err4) - } -} - -func TestOVirtCloudXmlParsing(t *testing.T) { - body1 := (io.Reader)(nil) - - _, err1 := getInstancesFromXml(body1) - if err1 == nil { - t.Fatalf("An error is expected when body is missing") - } - - body2 := strings.NewReader("") - - _, err2 := getInstancesFromXml(body2) - if err2 == nil { - t.Fatalf("An error is expected when body is empty") - } - - body3 := strings.NewReader(` - - - -`) - - instances3, err3 := getInstancesFromXml(body3) - if err3 != nil { - t.Fatalf("Unexpected error listing instances: %s", err3) - } - if len(instances3) > 0 { - t.Fatalf("Unexpected number of instance(s): %d", len(instances3)) - } - - body4 := strings.NewReader(` - - - Up - host1 - - - - - - Up - - - Down - host2 - - - Up - host3 - - -`) - - instances4, err4 := getInstancesFromXml(body4) - if err4 != nil { - t.Fatalf("Unexpected error listing instances: %s", err4) - } - if len(instances4) != 2 { - t.Fatalf("Unexpected number of instance(s): %d", len(instances4)) - } - - names := instances4.ListSortedNames() - if names[0] != "host1" || names[1] != "host3" { - t.Fatalf("Unexpected instance(s): %s", instances4) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/providers.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/providers.go deleted file mode 100644 index 6664e8903..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/providers.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cloudprovider - -import ( - // Cloud providers - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/aws" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/gce" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/mesos" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace" -) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/MAINTAINERS.md b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/MAINTAINERS.md deleted file mode 100644 index 4c72c1a0a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/MAINTAINERS.md +++ /dev/null @@ -1,6 +0,0 @@ -# Maintainers - -* [Thom May](https://github.com/thommay) - - -[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/pkg/cloudprovider/providers/rackspace/MAINTAINERS.md?pixel)]() diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace.go deleted file mode 100644 index 35d4e1e3b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace.go +++ /dev/null @@ -1,614 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rackspace - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "regexp" - "strings" - "time" - - "github.com/rackspace/gophercloud" - osvolumeattach "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach" - osservers "github.com/rackspace/gophercloud/openstack/compute/v2/servers" - "github.com/rackspace/gophercloud/pagination" - "github.com/rackspace/gophercloud/rackspace" - "github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes" - "github.com/rackspace/gophercloud/rackspace/compute/v2/servers" - "github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach" - "gopkg.in/gcfg.v1" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" -) - -const ProviderName = "rackspace" -const metaDataPath = "/media/configdrive/openstack/latest/meta_data.json" - -var ErrNotFound = errors.New("Failed to find object") -var ErrMultipleResults = errors.New("Multiple results where only one expected") -var ErrNoAddressFound = errors.New("No address found for host") -var ErrAttrNotFound = errors.New("Expected attribute not found") - -// encoding.TextUnmarshaler interface for time.Duration -type MyDuration struct { - time.Duration -} - -func (d *MyDuration) UnmarshalText(text []byte) error { - res, err := time.ParseDuration(string(text)) - if err != nil { - return err - } - d.Duration = res - return nil -} - -type MetaData struct { - UUID string `json:"uuid"` - Name string `json:"name"` -} - -type LoadBalancerOpts struct { - SubnetId string `gcfg:"subnet-id"` // required - CreateMonitor bool `gcfg:"create-monitor"` - MonitorDelay MyDuration `gcfg:"monitor-delay"` - MonitorTimeout MyDuration `gcfg:"monitor-timeout"` - MonitorMaxRetries uint `gcfg:"monitor-max-retries"` -} - -// Rackspace is an implementation of cloud provider Interface for Rackspace. -type Rackspace struct { - provider *gophercloud.ProviderClient - region string - lbOpts LoadBalancerOpts -} - -type Config struct { - Global struct { - AuthUrl string `gcfg:"auth-url"` - Username string - UserId string `gcfg:"user-id"` - Password string - ApiKey string `gcfg:"api-key"` - TenantId string `gcfg:"tenant-id"` - TenantName string `gcfg:"tenant-name"` - DomainId string `gcfg:"domain-id"` - DomainName string `gcfg:"domain-name"` - Region string - } - LoadBalancer LoadBalancerOpts -} - -func probeNodeAddress(compute *gophercloud.ServiceClient, name string) (string, error) { - id, err := readInstanceID() - if err == nil { - srv, err := servers.Get(compute, id).Extract() - if err != nil { - return "", err - } - return getAddressByServer(srv) - } - - ip, err := getAddressByName(compute, name) - if err != nil { - return "", err - } - - return ip, nil -} - -func probeInstanceID(client *gophercloud.ServiceClient, name string) (string, error) { - // Attempt to read id from config drive. - id, err := readInstanceID() - if err == nil { - return id, nil - } - - // Attempt to get the server by the name from the API - server, err := getServerByName(client, name) - if err != nil { - return "", err - } - - return server.ID, nil -} - -func parseMetaData(file io.Reader) (string, error) { - metaDataBytes, err := ioutil.ReadAll(file) - if err != nil { - return "", fmt.Errorf("Cannot read %s: %v", file, err) - } - - metaData := MetaData{} - err = json.Unmarshal(metaDataBytes, &metaData) - if err != nil { - return "", fmt.Errorf("Cannot parse %s: %v", metaDataPath, err) - } - - return metaData.UUID, nil -} - -func readInstanceID() (string, error) { - file, err := os.Open(metaDataPath) - if err != nil { - return "", fmt.Errorf("Cannot open %s: %v", metaDataPath, err) - } - - return parseMetaData(file) -} - -func init() { - cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) { - cfg, err := readConfig(config) - if err != nil { - return nil, err - } - return newRackspace(cfg) - }) -} - -func (cfg Config) toAuthOptions() gophercloud.AuthOptions { - return gophercloud.AuthOptions{ - IdentityEndpoint: cfg.Global.AuthUrl, - Username: cfg.Global.Username, - UserID: cfg.Global.UserId, - Password: cfg.Global.Password, - APIKey: cfg.Global.ApiKey, - TenantID: cfg.Global.TenantId, - TenantName: cfg.Global.TenantName, - - // Persistent service, so we need to be able to renew tokens - AllowReauth: true, - } -} - -func readConfig(config io.Reader) (Config, error) { - if config == nil { - err := fmt.Errorf("no Rackspace cloud provider config file given") - return Config{}, err - } - - var cfg Config - err := gcfg.ReadInto(&cfg, config) - return cfg, err -} - -func newRackspace(cfg Config) (*Rackspace, error) { - provider, err := rackspace.AuthenticatedClient(cfg.toAuthOptions()) - if err != nil { - return nil, err - } - - os := Rackspace{ - provider: provider, - region: cfg.Global.Region, - lbOpts: cfg.LoadBalancer, - } - - return &os, nil -} - -type Instances struct { - compute *gophercloud.ServiceClient -} - -// Instances returns an implementation of Instances for Rackspace. -func (os *Rackspace) Instances() (cloudprovider.Instances, bool) { - glog.V(2).Info("rackspace.Instances() called") - - compute, err := os.getComputeClient() - if err != nil { - glog.Warningf("Failed to find compute endpoint: %v", err) - return nil, false - } - glog.V(1).Info("Claiming to support Instances") - - return &Instances{compute}, true -} - -func (i *Instances) List(name_filter string) ([]string, error) { - glog.V(2).Infof("rackspace List(%v) called", name_filter) - - opts := osservers.ListOpts{ - Name: name_filter, - Status: "ACTIVE", - } - pager := servers.List(i.compute, opts) - - ret := make([]string, 0) - err := pager.EachPage(func(page pagination.Page) (bool, error) { - sList, err := servers.ExtractServers(page) - if err != nil { - return false, err - } - for _, server := range sList { - ret = append(ret, server.Name) - } - return true, nil - }) - if err != nil { - return nil, err - } - - glog.V(2).Infof("Found %v entries: %v", len(ret), ret) - - return ret, nil -} - -func serverHasAddress(srv osservers.Server, ip string) bool { - if ip == firstAddr(srv.Addresses["private"]) { - return true - } - if ip == firstAddr(srv.Addresses["public"]) { - return true - } - if ip == srv.AccessIPv4 { - return true - } - if ip == srv.AccessIPv6 { - return true - } - return false -} - -func getServerByAddress(client *gophercloud.ServiceClient, name string) (*osservers.Server, error) { - pager := servers.List(client, nil) - - serverList := make([]osservers.Server, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - s, err := servers.ExtractServers(page) - if err != nil { - return false, err - } - for _, v := range s { - if serverHasAddress(v, name) { - serverList = append(serverList, v) - } - } - if len(serverList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - return nil, err - } - - if len(serverList) == 0 { - return nil, ErrNotFound - } else if len(serverList) > 1 { - return nil, ErrMultipleResults - } - - return &serverList[0], nil -} - -func getServerByName(client *gophercloud.ServiceClient, name string) (*osservers.Server, error) { - if net.ParseIP(name) != nil { - // we're an IP, so we'll have to walk the full list of servers to - // figure out which one we are. - return getServerByAddress(client, name) - } - opts := osservers.ListOpts{ - Name: fmt.Sprintf("^%s$", regexp.QuoteMeta(name)), - Status: "ACTIVE", - } - pager := servers.List(client, opts) - - serverList := make([]osservers.Server, 0, 1) - - err := pager.EachPage(func(page pagination.Page) (bool, error) { - s, err := servers.ExtractServers(page) - if err != nil { - return false, err - } - serverList = append(serverList, s...) - if len(serverList) > 1 { - return false, ErrMultipleResults - } - return true, nil - }) - if err != nil { - return nil, err - } - - if len(serverList) == 0 { - return nil, ErrNotFound - } else if len(serverList) > 1 { - return nil, ErrMultipleResults - } - - return &serverList[0], nil -} - -func firstAddr(netblob interface{}) string { - // Run-time types for the win :( - list, ok := netblob.([]interface{}) - if !ok || len(list) < 1 { - return "" - } - props, ok := list[0].(map[string]interface{}) - if !ok { - return "" - } - tmp, ok := props["addr"] - if !ok { - return "" - } - addr, ok := tmp.(string) - if !ok { - return "" - } - return addr -} - -func getAddressByServer(srv *osservers.Server) (string, error) { - var s string - if s == "" { - s = firstAddr(srv.Addresses["private"]) - } - if s == "" { - s = firstAddr(srv.Addresses["public"]) - } - if s == "" { - s = srv.AccessIPv4 - } - if s == "" { - s = srv.AccessIPv6 - } - if s == "" { - return "", ErrNoAddressFound - } - return s, nil -} - -func getAddressByName(api *gophercloud.ServiceClient, name string) (string, error) { - srv, err := getServerByName(api, name) - if err != nil { - return "", err - } - - return getAddressByServer(srv) -} - -func (i *Instances) NodeAddresses(name string) ([]api.NodeAddress, error) { - glog.V(2).Infof("NodeAddresses(%v) called", name) - - ip, err := probeNodeAddress(i.compute, name) - if err != nil { - return nil, err - } - - glog.V(2).Infof("NodeAddresses(%v) => %v", name, ip) - - // net.ParseIP().String() is to maintain compatibility with the old code - return []api.NodeAddress{{Type: api.NodeLegacyHostIP, Address: net.ParseIP(ip).String()}}, nil -} - -// ExternalID returns the cloud provider ID of the specified instance (deprecated). -func (i *Instances) ExternalID(name string) (string, error) { - return probeInstanceID(i.compute, name) -} - -// InstanceID returns the cloud provider ID of the kubelet's instance. -func (rs *Rackspace) InstanceID() (string, error) { - return readInstanceID() -} - -// InstanceID returns the cloud provider ID of the specified instance. -func (i *Instances) InstanceID(name string) (string, error) { - return probeInstanceID(i.compute, name) -} - -// InstanceType returns the type of the specified instance. -func (i *Instances) InstanceType(name string) (string, error) { - return "", nil -} - -func (i *Instances) AddSSHKeyToAllInstances(user string, keyData []byte) error { - return errors.New("unimplemented") -} - -// Implementation of Instances.CurrentNodeName -func (i *Instances) CurrentNodeName(hostname string) (string, error) { - // Beware when changing this, nodename == hostname assumption is crucial to - // apiserver => kubelet communication. - return hostname, nil -} - -func (os *Rackspace) Clusters() (cloudprovider.Clusters, bool) { - return nil, false -} - -// ProviderName returns the cloud provider ID. -func (os *Rackspace) ProviderName() string { - return ProviderName -} - -// ScrubDNS filters DNS settings for pods. -func (os *Rackspace) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) { - return nameservers, searches -} - -func (os *Rackspace) LoadBalancer() (cloudprovider.LoadBalancer, bool) { - return nil, false -} - -func (os *Rackspace) Zones() (cloudprovider.Zones, bool) { - glog.V(1).Info("Claiming to support Zones") - - return os, true -} - -func (os *Rackspace) Routes() (cloudprovider.Routes, bool) { - return nil, false -} - -func (os *Rackspace) GetZone() (cloudprovider.Zone, error) { - glog.V(1).Infof("Current zone is %v", os.region) - - return cloudprovider.Zone{Region: os.region}, nil -} - -// Create a volume of given size (in GiB) -func (rs *Rackspace) CreateVolume(name string, size int, tags *map[string]string) (volumeName string, err error) { - return "", errors.New("unimplemented") -} - -func (rs *Rackspace) DeleteVolume(volumeName string) error { - return errors.New("unimplemented") -} - -// Attaches given cinder volume to the compute running kubelet -func (rs *Rackspace) AttachDisk(instanceID string, diskName string) (string, error) { - disk, err := rs.getVolume(diskName) - if err != nil { - return "", err - } - - compute, err := rs.getComputeClient() - if err != nil { - return "", err - } - - if len(disk.Attachments) > 0 { - if instanceID == disk.Attachments[0]["server_id"] { - glog.V(4).Infof("Disk: %q is already attached to compute: %q", diskName, instanceID) - return disk.ID, nil - } - - errMsg := fmt.Sprintf("Disk %q is attached to a different compute: %q, should be detached before proceeding", diskName, disk.Attachments[0]["server_id"]) - glog.Errorf(errMsg) - return "", errors.New(errMsg) - } - - _, err = volumeattach.Create(compute, instanceID, &osvolumeattach.CreateOpts{ - VolumeID: disk.ID, - }).Extract() - if err != nil { - glog.Errorf("Failed to attach %s volume to %s compute", diskName, instanceID) - return "", err - } - glog.V(2).Infof("Successfully attached %s volume to %s compute", diskName, instanceID) - return disk.ID, nil -} - -// GetDevicePath returns the path of an attached block storage volume, specified by its id. -func (rs *Rackspace) GetDevicePath(diskId string) string { - volume, err := rs.getVolume(diskId) - if err != nil { - return "" - } - attachments := volume.Attachments - if len(attachments) != 1 { - glog.Warningf("Unexpected number of volume attachments on %s: %d", diskId, len(attachments)) - return "" - } - return attachments[0]["device"].(string) -} - -// Takes a partial/full disk id or diskname -func (rs *Rackspace) getVolume(diskName string) (volumes.Volume, error) { - sClient, err := rackspace.NewBlockStorageV1(rs.provider, gophercloud.EndpointOpts{ - Region: rs.region, - }) - - var volume volumes.Volume - if err != nil || sClient == nil { - glog.Errorf("Unable to initialize cinder client for region: %s", rs.region) - return volume, err - } - - err = volumes.List(sClient).EachPage(func(page pagination.Page) (bool, error) { - vols, err := volumes.ExtractVolumes(page) - if err != nil { - glog.Errorf("Failed to extract volumes: %v", err) - return false, err - } - - for _, v := range vols { - glog.V(4).Infof("%s %s %v", v.ID, v.Name, v.Attachments) - if v.Name == diskName || strings.Contains(v.ID, diskName) { - volume = v - return true, nil - } - } - - // if it reached here then no disk with the given name was found. - errmsg := fmt.Sprintf("Unable to find disk: %s in region %s", diskName, rs.region) - return false, errors.New(errmsg) - }) - if err != nil { - glog.Errorf("Error occured getting volume: %s", diskName) - } - return volume, err -} - -func (rs *Rackspace) getComputeClient() (*gophercloud.ServiceClient, error) { - client, err := rackspace.NewComputeV2(rs.provider, gophercloud.EndpointOpts{ - Region: rs.region, - }) - if err != nil || client == nil { - glog.Errorf("Unable to initialize nova client for region: %s", rs.region) - } - return client, nil -} - -// Detaches given cinder volume from the compute running kubelet -func (rs *Rackspace) DetachDisk(instanceID string, partialDiskId string) error { - disk, err := rs.getVolume(partialDiskId) - if err != nil { - return err - } - - compute, err := rs.getComputeClient() - if err != nil { - return err - } - - if len(disk.Attachments) > 1 { - // Rackspace does not support "multiattach", this is a sanity check. - errmsg := fmt.Sprintf("Volume %s is attached to multiple instances, which is not supported by this provider.", disk.ID) - return errors.New(errmsg) - } - - if len(disk.Attachments) > 0 && instanceID == disk.Attachments[0]["server_id"] { - // This is a blocking call and effects kubelet's performance directly. - // We should consider kicking it out into a separate routine, if it is bad. - err = volumeattach.Delete(compute, instanceID, disk.ID).ExtractErr() - if err != nil { - glog.Errorf("Failed to delete volume %s from compute %s attached %v", disk.ID, instanceID, err) - return err - } - glog.V(2).Infof("Successfully detached volume: %s from compute: %s", disk.ID, instanceID) - } else { - errMsg := fmt.Sprintf("Disk: %s has no attachments or is not attached to compute: %s", disk.Name, instanceID) - glog.Errorf(errMsg) - return errors.New(errMsg) - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace_test.go deleted file mode 100644 index 1b00b1330..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace/rackspace_test.go +++ /dev/null @@ -1,196 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rackspace - -import ( - "os" - "strings" - "testing" - "time" - - "github.com/rackspace/gophercloud" -) - -func TestReadConfig(t *testing.T) { - _, err := readConfig(nil) - if err == nil { - t.Errorf("Should fail when no config is provided: %s", err) - } - - cfg, err := readConfig(strings.NewReader(` -[Global] -auth-url = http://auth.url -username = user -[LoadBalancer] -create-monitor = yes -monitor-delay = 1m -monitor-timeout = 30s -monitor-max-retries = 3 -`)) - if err != nil { - t.Fatalf("Should succeed when a valid config is provided: %s", err) - } - if cfg.Global.AuthUrl != "http://auth.url" { - t.Errorf("incorrect authurl: %s", cfg.Global.AuthUrl) - } - - if !cfg.LoadBalancer.CreateMonitor { - t.Errorf("incorrect lb.createmonitor: %t", cfg.LoadBalancer.CreateMonitor) - } - if cfg.LoadBalancer.MonitorDelay.Duration != 1*time.Minute { - t.Errorf("incorrect lb.monitordelay: %s", cfg.LoadBalancer.MonitorDelay) - } - if cfg.LoadBalancer.MonitorTimeout.Duration != 30*time.Second { - t.Errorf("incorrect lb.monitortimeout: %s", cfg.LoadBalancer.MonitorTimeout) - } - if cfg.LoadBalancer.MonitorMaxRetries != 3 { - t.Errorf("incorrect lb.monitormaxretries: %d", cfg.LoadBalancer.MonitorMaxRetries) - } -} - -func TestToAuthOptions(t *testing.T) { - cfg := Config{} - cfg.Global.Username = "user" - // etc. - - ao := cfg.toAuthOptions() - - if !ao.AllowReauth { - t.Errorf("Will need to be able to reauthenticate") - } - if ao.Username != cfg.Global.Username { - t.Errorf("Username %s != %s", ao.Username, cfg.Global.Username) - } -} - -// This allows acceptance testing against an existing Rackspace -// install, using the standard OS_* Rackspace client environment -// variables. -// FIXME: it would be better to hermetically test against canned JSON -// requests/responses. -func configFromEnv() (cfg Config, ok bool) { - cfg.Global.AuthUrl = os.Getenv("OS_AUTH_URL") - - cfg.Global.TenantId = os.Getenv("OS_TENANT_ID") - // Rax/nova _insists_ that we don't specify both tenant ID and name - if cfg.Global.TenantId == "" { - cfg.Global.TenantName = os.Getenv("OS_TENANT_NAME") - } - - cfg.Global.Username = os.Getenv("OS_USERNAME") - cfg.Global.Password = os.Getenv("OS_PASSWORD") - cfg.Global.ApiKey = os.Getenv("OS_API_KEY") - cfg.Global.Region = os.Getenv("OS_REGION_NAME") - cfg.Global.DomainId = os.Getenv("OS_DOMAIN_ID") - cfg.Global.DomainName = os.Getenv("OS_DOMAIN_NAME") - - ok = (cfg.Global.AuthUrl != "" && - cfg.Global.Username != "" && - (cfg.Global.Password != "" || cfg.Global.ApiKey != "") && - (cfg.Global.TenantId != "" || cfg.Global.TenantName != "" || - cfg.Global.DomainId != "" || cfg.Global.DomainName != "")) - - return -} - -func TestParseMetaData(t *testing.T) { - _, err := parseMetaData(strings.NewReader("")) - if err == nil { - t.Errorf("Should fail when invalid meta data is provided: %s", err) - } - - id, err := parseMetaData(strings.NewReader(` - { - "UUID":"someuuid", - "name":"somename", - "project_id":"someprojectid" - } - `)) - if err != nil { - t.Fatalf("Should succeed when valid meta data is provided: %s", err) - } - if id != "someuuid" { - t.Errorf("incorrect uuid: %s", id) - } -} - -func TestNewRackspace(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - _, err := newRackspace(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate Rackspace: %s", err) - } -} - -func TestInstances(t *testing.T) { - cfg, ok := configFromEnv() - if !ok { - t.Skipf("No config found in environment") - } - - os, err := newRackspace(cfg) - if err != nil { - t.Fatalf("Failed to construct/authenticate Rackspace: %s", err) - } - - i, ok := os.Instances() - if !ok { - t.Fatalf("Instances() returned false") - } - - srvs, err := i.List(".") - if err != nil { - t.Fatalf("Instances.List() failed: %s", err) - } - if len(srvs) == 0 { - t.Fatalf("Instances.List() returned zero servers") - } - t.Logf("Found servers (%d): %s\n", len(srvs), srvs) - - addrs, err := i.NodeAddresses(srvs[0]) - if err != nil { - t.Fatalf("Instances.NodeAddresses(%s) failed: %s", srvs[0], err) - } - t.Logf("Found NodeAddresses(%s) = %s\n", srvs[0], addrs) -} - -func TestZones(t *testing.T) { - os := Rackspace{ - provider: &gophercloud.ProviderClient{ - IdentityBase: "http://auth.url/", - }, - region: "myRegion", - } - - z, ok := os.Zones() - if !ok { - t.Fatalf("Zones() returned false") - } - - zone, err := z.GetZone() - if err != nil { - t.Fatalf("GetZone() returned error: %s", err) - } - - if zone.Region != "myRegion" { - t.Fatalf("GetZone() returned wrong region (%s)", zone.Region) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/controller_utils_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/controller_utils_test.go deleted file mode 100644 index 423e42703..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/controller_utils_test.go +++ /dev/null @@ -1,372 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 controller - -import ( - "fmt" - "math/rand" - "net/http/httptest" - "reflect" - "sort" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/securitycontext" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/sets" - utiltesting "k8s.io/kubernetes/pkg/util/testing" -) - -// NewFakeControllerExpectationsLookup creates a fake store for PodExpectations. -func NewFakeControllerExpectationsLookup(ttl time.Duration) (*ControllerExpectations, *util.FakeClock) { - fakeTime := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) - fakeClock := util.NewFakeClock(fakeTime) - ttlPolicy := &cache.TTLPolicy{Ttl: ttl, Clock: fakeClock} - ttlStore := cache.NewFakeExpirationStore( - ExpKeyFunc, nil, ttlPolicy, fakeClock) - return &ControllerExpectations{ttlStore}, fakeClock -} - -func newReplicationController(replicas int) *api.ReplicationController { - rc := &api.ReplicationController{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - UID: util.NewUUID(), - Name: "foobar", - Namespace: api.NamespaceDefault, - ResourceVersion: "18", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: int32(replicas), - Selector: map[string]string{"foo": "bar"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "name": "foo", - "type": "production", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), - }, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSDefault, - NodeSelector: map[string]string{ - "baz": "blah", - }, - }, - }, - }, - } - return rc -} - -// create count pods with the given phase for the given rc (same selectors and namespace), and add them to the store. -func newPodList(store cache.Store, count int, status api.PodPhase, rc *api.ReplicationController) *api.PodList { - pods := []api.Pod{} - for i := 0; i < count; i++ { - newPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("pod%d", i), - Labels: rc.Spec.Selector, - Namespace: rc.Namespace, - }, - Status: api.PodStatus{Phase: status}, - } - if store != nil { - store.Add(&newPod) - } - pods = append(pods, newPod) - } - return &api.PodList{ - Items: pods, - } -} - -func TestControllerExpectations(t *testing.T) { - ttl := 30 * time.Second - e, fakeClock := NewFakeControllerExpectationsLookup(ttl) - // In practice we can't really have add and delete expectations since we only either create or - // delete replicas in one rc pass, and the rc goes to sleep soon after until the expectations are - // either fulfilled or timeout. - adds, dels := 10, 30 - rc := newReplicationController(1) - - // RC fires off adds and deletes at apiserver, then sets expectations - rcKey, err := KeyFunc(rc) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rc, err) - } - e.SetExpectations(rcKey, adds, dels) - var wg sync.WaitGroup - for i := 0; i < adds+1; i++ { - wg.Add(1) - go func() { - // In prod this can happen either because of a failed create by the rc - // or after having observed a create via informer - e.CreationObserved(rcKey) - wg.Done() - }() - } - wg.Wait() - - // There are still delete expectations - if e.SatisfiedExpectations(rcKey) { - t.Errorf("Rc will sync before expectations are met") - } - for i := 0; i < dels+1; i++ { - wg.Add(1) - go func() { - e.DeletionObserved(rcKey) - wg.Done() - }() - } - wg.Wait() - - // Expectations have been surpassed - if podExp, exists, err := e.GetExpectations(rcKey); err == nil && exists { - add, del := podExp.GetExpectations() - if add != -1 || del != -1 { - t.Errorf("Unexpected pod expectations %#v", podExp) - } - } else { - t.Errorf("Could not get expectations for rc, exists %v and err %v", exists, err) - } - if !e.SatisfiedExpectations(rcKey) { - t.Errorf("Expectations are met but the rc will not sync") - } - - // Next round of rc sync, old expectations are cleared - e.SetExpectations(rcKey, 1, 2) - if podExp, exists, err := e.GetExpectations(rcKey); err == nil && exists { - add, del := podExp.GetExpectations() - if add != 1 || del != 2 { - t.Errorf("Unexpected pod expectations %#v", podExp) - } - } else { - t.Errorf("Could not get expectations for rc, exists %v and err %v", exists, err) - } - - // Expectations have expired because of ttl - fakeClock.Step(ttl + 1) - if !e.SatisfiedExpectations(rcKey) { - t.Errorf("Expectations should have expired but didn't") - } -} - -func TestUIDExpectations(t *testing.T) { - uidExp := NewUIDTrackingControllerExpectations(NewControllerExpectations()) - rcList := []*api.ReplicationController{ - newReplicationController(2), - newReplicationController(1), - newReplicationController(0), - newReplicationController(5), - } - rcToPods := map[string][]string{} - rcKeys := []string{} - for i := range rcList { - rc := rcList[i] - rcName := fmt.Sprintf("rc-%v", i) - rc.Name = rcName - rc.Spec.Selector[rcName] = rcName - podList := newPodList(nil, 5, api.PodRunning, rc) - rcKey, err := KeyFunc(rc) - if err != nil { - t.Fatalf("Couldn't get key for object %+v: %v", rc, err) - } - rcKeys = append(rcKeys, rcKey) - rcPodNames := []string{} - for i := range podList.Items { - p := &podList.Items[i] - p.Name = fmt.Sprintf("%v-%v", p.Name, rc.Name) - rcPodNames = append(rcPodNames, PodKey(p)) - } - rcToPods[rcKey] = rcPodNames - uidExp.ExpectDeletions(rcKey, rcPodNames) - } - for i := range rcKeys { - j := rand.Intn(i + 1) - rcKeys[i], rcKeys[j] = rcKeys[j], rcKeys[i] - } - for _, rcKey := range rcKeys { - if uidExp.SatisfiedExpectations(rcKey) { - t.Errorf("Controller %v satisfied expectations before deletion", rcKey) - } - for _, p := range rcToPods[rcKey] { - uidExp.DeletionObserved(rcKey, p) - } - if !uidExp.SatisfiedExpectations(rcKey) { - t.Errorf("Controller %v didn't satisfy expectations after deletion", rcKey) - } - uidExp.DeleteExpectations(rcKey) - if uidExp.GetUIDs(rcKey) != nil { - t.Errorf("Failed to delete uid expectations for %v", rcKey) - } - } -} - -func TestCreatePods(t *testing.T) { - ns := api.NamespaceDefault - body := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Name: "empty_pod"}}) - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: string(body), - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - - podControl := RealPodControl{ - KubeClient: clientset, - Recorder: &record.FakeRecorder{}, - } - - controllerSpec := newReplicationController(1) - - // Make sure createReplica sends a POST to the apiserver with a pod from the controllers pod template - podControl.CreatePods(ns, controllerSpec.Spec.Template, controllerSpec) - - expectedPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: controllerSpec.Spec.Template.Labels, - GenerateName: fmt.Sprintf("%s-", controllerSpec.Name), - }, - Spec: controllerSpec.Spec.Template.Spec, - } - fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath("pods", api.NamespaceDefault, ""), "POST", nil) - actualPod, err := runtime.Decode(testapi.Default.Codec(), []byte(fakeHandler.RequestBody)) - if err != nil { - t.Errorf("Unexpected error: %#v", err) - } - if !api.Semantic.DeepDerivative(&expectedPod, actualPod) { - t.Logf("Body: %s", fakeHandler.RequestBody) - t.Errorf("Unexpected mismatch. Expected\n %#v,\n Got:\n %#v", &expectedPod, actualPod) - } -} - -func TestActivePodFiltering(t *testing.T) { - // This rc is not needed by the test, only the newPodList to give the pods labels/a namespace. - rc := newReplicationController(0) - podList := newPodList(nil, 5, api.PodRunning, rc) - podList.Items[0].Status.Phase = api.PodSucceeded - podList.Items[1].Status.Phase = api.PodFailed - expectedNames := sets.NewString() - for _, pod := range podList.Items[2:] { - expectedNames.Insert(pod.Name) - } - - got := FilterActivePods(podList.Items) - gotNames := sets.NewString() - for _, pod := range got { - gotNames.Insert(pod.Name) - } - if expectedNames.Difference(gotNames).Len() != 0 || gotNames.Difference(expectedNames).Len() != 0 { - t.Errorf("expected %v, got %v", expectedNames.List(), gotNames.List()) - } -} - -func TestSortingActivePods(t *testing.T) { - numPods := 9 - // This rc is not needed by the test, only the newPodList to give the pods labels/a namespace. - rc := newReplicationController(0) - podList := newPodList(nil, numPods, api.PodRunning, rc) - - pods := make([]*api.Pod, len(podList.Items)) - for i := range podList.Items { - pods[i] = &podList.Items[i] - } - // pods[0] is not scheduled yet. - pods[0].Spec.NodeName = "" - pods[0].Status.Phase = api.PodPending - // pods[1] is scheduled but pending. - pods[1].Spec.NodeName = "bar" - pods[1].Status.Phase = api.PodPending - // pods[2] is unknown. - pods[2].Spec.NodeName = "foo" - pods[2].Status.Phase = api.PodUnknown - // pods[3] is running but not ready. - pods[3].Spec.NodeName = "foo" - pods[3].Status.Phase = api.PodRunning - // pods[4] is running and ready but without LastTransitionTime. - now := unversioned.Now() - pods[4].Spec.NodeName = "foo" - pods[4].Status.Phase = api.PodRunning - pods[4].Status.Conditions = []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue}} - pods[4].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 3}, {RestartCount: 0}} - // pods[5] is running and ready and with LastTransitionTime. - pods[5].Spec.NodeName = "foo" - pods[5].Status.Phase = api.PodRunning - pods[5].Status.Conditions = []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue, LastTransitionTime: now}} - pods[5].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 3}, {RestartCount: 0}} - // pods[6] is running ready for a longer time than pods[5]. - then := unversioned.Time{Time: now.AddDate(0, -1, 0)} - pods[6].Spec.NodeName = "foo" - pods[6].Status.Phase = api.PodRunning - pods[6].Status.Conditions = []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue, LastTransitionTime: then}} - pods[6].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 3}, {RestartCount: 0}} - // pods[7] has lower container restart count than pods[6]. - pods[7].Spec.NodeName = "foo" - pods[7].Status.Phase = api.PodRunning - pods[7].Status.Conditions = []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue, LastTransitionTime: then}} - pods[7].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 2}, {RestartCount: 1}} - pods[7].CreationTimestamp = now - // pods[8] is older than pods[7]. - pods[8].Spec.NodeName = "foo" - pods[8].Status.Phase = api.PodRunning - pods[8].Status.Conditions = []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue, LastTransitionTime: then}} - pods[8].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 2}, {RestartCount: 1}} - pods[8].CreationTimestamp = then - - getOrder := func(pods []*api.Pod) []string { - names := make([]string, len(pods)) - for i := range pods { - names[i] = pods[i].Name - } - return names - } - - expected := getOrder(pods) - - for i := 0; i < 20; i++ { - idx := rand.Perm(numPods) - randomizedPods := make([]*api.Pod, numPods) - for j := 0; j < numPods; j++ { - randomizedPods[j] = pods[idx[j]] - } - sort.Sort(ActivePods(randomizedPods)) - actual := getOrder(randomizedPods) - - if !reflect.DeepEqual(actual, expected) { - t.Errorf("expected %v, got %v", expected, actual) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller.go deleted file mode 100644 index 0066fd086..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller.go +++ /dev/null @@ -1,742 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 daemon - -import ( - "reflect" - "sort" - "sync" - "time" - - "fmt" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - unversionedextensions "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/controller/framework/informers" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates" -) - -const ( - // Daemon sets will periodically check that their daemon pods are running as expected. - FullDaemonSetResyncPeriod = 30 * time.Second // TODO: Figure out if this time seems reasonable. - - // Realistic value of the burstReplica field for the replication manager based off - // performance requirements for kubernetes 1.0. - BurstReplicas = 500 - - // We must avoid counting pods until the pod store has synced. If it hasn't synced, to - // avoid a hot loop, we'll wait this long between checks. - PodStoreSyncedPollPeriod = 100 * time.Millisecond - - // If sending a status upate to API server fails, we retry a finite number of times. - StatusUpdateRetries = 1 -) - -// DaemonSetsController is responsible for synchronizing DaemonSet objects stored -// in the system with actual running pods. -type DaemonSetsController struct { - kubeClient clientset.Interface - eventRecorder record.EventRecorder - podControl controller.PodControlInterface - - // internalPodInformer is used to hold a personal informer. If we're using - // a normal shared informer, then the informer will be started for us. If - // we have a personal informer, we must start it ourselves. If you start - // the controller using NewDaemonSetsController(passing SharedInformer), this - // will be null - internalPodInformer framework.SharedInformer - - // An dsc is temporarily suspended after creating/deleting these many replicas. - // It resumes normal action after observing the watch events for them. - burstReplicas int - - // To allow injection of syncDaemonSet for testing. - syncHandler func(dsKey string) error - // A TTLCache of pod creates/deletes each ds expects to see - expectations controller.ControllerExpectationsInterface - // A store of daemon sets - dsStore cache.StoreToDaemonSetLister - // A store of pods - podStore cache.StoreToPodLister - // A store of nodes - nodeStore cache.StoreToNodeLister - // Watches changes to all daemon sets. - dsController *framework.Controller - // Watches changes to all pods - podController framework.ControllerInterface - // Watches changes to all nodes. - nodeController *framework.Controller - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool - - lookupCache *controller.MatchingCache - - // Daemon sets that need to be synced. - queue *workqueue.Type -} - -func NewDaemonSetsController(podInformer framework.SharedIndexInformer, kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, lookupCacheSize int) *DaemonSetsController { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - // TODO: remove the wrapper when every clients have moved to use the clientset. - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("daemon_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - dsc := &DaemonSetsController{ - kubeClient: kubeClient, - eventRecorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "daemonset-controller"}), - podControl: controller.RealPodControl{ - KubeClient: kubeClient, - Recorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "daemon-set"}), - }, - burstReplicas: BurstReplicas, - expectations: controller.NewControllerExpectations(), - queue: workqueue.New(), - } - // Manage addition/update of daemon sets. - dsc.dsStore.Store, dsc.dsController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return dsc.kubeClient.Extensions().DaemonSets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return dsc.kubeClient.Extensions().DaemonSets(api.NamespaceAll).Watch(options) - }, - }, - &extensions.DaemonSet{}, - // TODO: Can we have much longer period here? - FullDaemonSetResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - ds := obj.(*extensions.DaemonSet) - glog.V(4).Infof("Adding daemon set %s", ds.Name) - dsc.enqueueDaemonSet(ds) - }, - UpdateFunc: func(old, cur interface{}) { - oldDS := old.(*extensions.DaemonSet) - curDS := cur.(*extensions.DaemonSet) - // We should invalidate the whole lookup cache if a DS's selector has been updated. - // - // Imagine that you have two RSs: - // * old DS1 - // * new DS2 - // You also have a pod that is attached to DS2 (because it doesn't match DS1 selector). - // Now imagine that you are changing DS1 selector so that it is now matching that pod, - // in such case we must invalidate the whole cache so that pod could be adopted by DS1 - // - // This makes the lookup cache less helpful, but selector update does not happen often, - // so it's not a big problem - if !reflect.DeepEqual(oldDS.Spec.Selector, curDS.Spec.Selector) { - dsc.lookupCache.InvalidateAll() - } - - glog.V(4).Infof("Updating daemon set %s", oldDS.Name) - dsc.enqueueDaemonSet(curDS) - }, - DeleteFunc: func(obj interface{}) { - ds := obj.(*extensions.DaemonSet) - glog.V(4).Infof("Deleting daemon set %s", ds.Name) - dsc.enqueueDaemonSet(ds) - }, - }, - ) - - // Watch for creation/deletion of pods. The reason we watch is that we don't want a daemon set to create/delete - // more pods until all the effects (expectations) of a daemon set's create/delete have been observed. - podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - AddFunc: dsc.addPod, - UpdateFunc: dsc.updatePod, - DeleteFunc: dsc.deletePod, - }) - dsc.podStore.Indexer = podInformer.GetIndexer() - dsc.podController = podInformer.GetController() - dsc.podStoreSynced = podInformer.HasSynced - - // Watch for new nodes or updates to nodes - daemon pods are launched on new nodes, and possibly when labels on nodes change, - dsc.nodeStore.Store, dsc.nodeController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return dsc.kubeClient.Core().Nodes().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return dsc.kubeClient.Core().Nodes().Watch(options) - }, - }, - &api.Node{}, - resyncPeriod(), - framework.ResourceEventHandlerFuncs{ - AddFunc: dsc.addNode, - UpdateFunc: dsc.updateNode, - }, - ) - dsc.syncHandler = dsc.syncDaemonSet - dsc.lookupCache = controller.NewMatchingCache(lookupCacheSize) - return dsc -} - -func NewDaemonSetsControllerFromClient(kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, lookupCacheSize int) *DaemonSetsController { - podInformer := informers.CreateSharedPodIndexInformer(kubeClient, resyncPeriod()) - dsc := NewDaemonSetsController(podInformer, kubeClient, resyncPeriod, lookupCacheSize) - dsc.internalPodInformer = podInformer - - return dsc -} - -// Run begins watching and syncing daemon sets. -func (dsc *DaemonSetsController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - glog.Infof("Starting Daemon Sets controller manager") - go dsc.dsController.Run(stopCh) - go dsc.podController.Run(stopCh) - go dsc.nodeController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(dsc.worker, time.Second, stopCh) - } - - if dsc.internalPodInformer != nil { - go dsc.internalPodInformer.Run(stopCh) - } - - <-stopCh - glog.Infof("Shutting down Daemon Set Controller") - dsc.queue.ShutDown() -} - -func (dsc *DaemonSetsController) worker() { - for { - func() { - dsKey, quit := dsc.queue.Get() - if quit { - return - } - defer dsc.queue.Done(dsKey) - err := dsc.syncHandler(dsKey.(string)) - if err != nil { - glog.Errorf("Error syncing daemon set with key %s: %v", dsKey.(string), err) - } - }() - } -} - -func (dsc *DaemonSetsController) enqueueAllDaemonSets() { - glog.V(4).Infof("Enqueueing all daemon sets") - ds, err := dsc.dsStore.List() - if err != nil { - glog.Errorf("Error enqueueing daemon sets: %v", err) - return - } - for i := range ds.Items { - dsc.enqueueDaemonSet(&ds.Items[i]) - } -} - -func (dsc *DaemonSetsController) enqueueDaemonSet(ds *extensions.DaemonSet) { - key, err := controller.KeyFunc(ds) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", ds, err) - return - } - - // TODO: Handle overlapping controllers better. See comment in ReplicationManager. - dsc.queue.Add(key) -} - -func (dsc *DaemonSetsController) getPodDaemonSet(pod *api.Pod) *extensions.DaemonSet { - // look up in the cache, if cached and the cache is valid, just return cached value - if obj, cached := dsc.lookupCache.GetMatchingObject(pod); cached { - ds, ok := obj.(*extensions.DaemonSet) - if !ok { - // This should not happen - glog.Errorf("lookup cache does not retuen a ReplicationController object") - return nil - } - if cached && dsc.isCacheValid(pod, ds) { - return ds - } - } - sets, err := dsc.dsStore.GetPodDaemonSets(pod) - if err != nil { - glog.V(4).Infof("No daemon sets found for pod %v, daemon set controller will avoid syncing", pod.Name) - return nil - } - if len(sets) > 1 { - // More than two items in this list indicates user error. If two daemon - // sets overlap, sort by creation timestamp, subsort by name, then pick - // the first. - glog.Errorf("user error! more than one daemon is selecting pods with labels: %+v", pod.Labels) - sort.Sort(byCreationTimestamp(sets)) - } - - // update lookup cache - dsc.lookupCache.Update(pod, &sets[0]) - - return &sets[0] -} - -// isCacheValid check if the cache is valid -func (dsc *DaemonSetsController) isCacheValid(pod *api.Pod, cachedDS *extensions.DaemonSet) bool { - _, exists, err := dsc.dsStore.Get(cachedDS) - // ds has been deleted or updated, cache is invalid - if err != nil || !exists || !isDaemonSetMatch(pod, cachedDS) { - return false - } - return true -} - -// isDaemonSetMatch take a Pod and DaemonSet, return whether the Pod and DaemonSet are matching -// TODO(mqliang): This logic is a copy from GetPodDaemonSets(), remove the duplication -func isDaemonSetMatch(pod *api.Pod, ds *extensions.DaemonSet) bool { - if ds.Namespace != pod.Namespace { - return false - } - selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector) - if err != nil { - err = fmt.Errorf("invalid selector: %v", err) - return false - } - - // If a ReplicaSet with a nil or empty selector creeps in, it should match nothing, not everything. - if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { - return false - } - return true -} - -func (dsc *DaemonSetsController) addPod(obj interface{}) { - pod := obj.(*api.Pod) - glog.V(4).Infof("Pod %s added.", pod.Name) - if ds := dsc.getPodDaemonSet(pod); ds != nil { - dsKey, err := controller.KeyFunc(ds) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", ds, err) - return - } - dsc.expectations.CreationObserved(dsKey) - dsc.enqueueDaemonSet(ds) - } -} - -// When a pod is updated, figure out what sets manage it and wake them -// up. If the labels of the pod have changed we need to awaken both the old -// and new set. old and cur must be *api.Pod types. -func (dsc *DaemonSetsController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - // A periodic relist will send update events for all known pods. - return - } - curPod := cur.(*api.Pod) - glog.V(4).Infof("Pod %s updated.", curPod.Name) - if curDS := dsc.getPodDaemonSet(curPod); curDS != nil { - dsc.enqueueDaemonSet(curDS) - } - oldPod := old.(*api.Pod) - // If the labels have not changed, then the daemon set responsible for - // the pod is the same as it was before. In that case we have enqueued the daemon - // set above, and do not have to enqueue the set again. - if !reflect.DeepEqual(curPod.Labels, oldPod.Labels) { - // It's ok if both oldDS and curDS are the same, because curDS will set - // the expectations on its run so oldDS will have no effect. - if oldDS := dsc.getPodDaemonSet(oldPod); oldDS != nil { - dsc.enqueueDaemonSet(oldDS) - } - } -} - -func (dsc *DaemonSetsController) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new daemonset will not be woken up till the periodic - // resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a pod %+v", obj) - return - } - } - glog.V(4).Infof("Pod %s deleted.", pod.Name) - if ds := dsc.getPodDaemonSet(pod); ds != nil { - dsKey, err := controller.KeyFunc(ds) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", ds, err) - return - } - dsc.expectations.DeletionObserved(dsKey) - dsc.enqueueDaemonSet(ds) - } -} - -func (dsc *DaemonSetsController) addNode(obj interface{}) { - // TODO: it'd be nice to pass a hint with these enqueues, so that each ds would only examine the added node (unless it has other work to do, too). - dsList, err := dsc.dsStore.List() - if err != nil { - glog.V(4).Infof("Error enqueueing daemon sets: %v", err) - return - } - node := obj.(*api.Node) - for i := range dsList.Items { - ds := &dsList.Items[i] - shouldEnqueue := dsc.nodeShouldRunDaemonPod(node, ds) - if shouldEnqueue { - dsc.enqueueDaemonSet(ds) - } - } -} - -func (dsc *DaemonSetsController) updateNode(old, cur interface{}) { - oldNode := old.(*api.Node) - curNode := cur.(*api.Node) - if api.Semantic.DeepEqual(oldNode.Name, curNode.Name) && api.Semantic.DeepEqual(oldNode.Namespace, curNode.Namespace) && api.Semantic.DeepEqual(oldNode.Labels, curNode.Labels) { - // A periodic relist will send update events for all known pods. - return - } - dsList, err := dsc.dsStore.List() - if err != nil { - glog.V(4).Infof("Error enqueueing daemon sets: %v", err) - return - } - for i := range dsList.Items { - ds := &dsList.Items[i] - shouldEnqueue := (dsc.nodeShouldRunDaemonPod(oldNode, ds) != dsc.nodeShouldRunDaemonPod(curNode, ds)) - if shouldEnqueue { - dsc.enqueueDaemonSet(ds) - } - } - // TODO: it'd be nice to pass a hint with these enqueues, so that each ds would only examine the added node (unless it has other work to do, too). -} - -// getNodesToDaemonSetPods returns a map from nodes to daemon pods (corresponding to ds) running on the nodes. -func (dsc *DaemonSetsController) getNodesToDaemonPods(ds *extensions.DaemonSet) (map[string][]*api.Pod, error) { - nodeToDaemonPods := make(map[string][]*api.Pod) - selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector) - if err != nil { - return nil, err - } - daemonPods, err := dsc.podStore.Pods(ds.Namespace).List(selector) - if err != nil { - return nodeToDaemonPods, err - } - for i := range daemonPods.Items { - nodeName := daemonPods.Items[i].Spec.NodeName - nodeToDaemonPods[nodeName] = append(nodeToDaemonPods[nodeName], &daemonPods.Items[i]) - } - return nodeToDaemonPods, nil -} - -func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet) { - // Find out which nodes are running the daemon pods selected by ds. - nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds) - if err != nil { - glog.Errorf("Error getting node to daemon pod mapping for daemon set %+v: %v", ds, err) - } - - // For each node, if the node is running the daemon pod but isn't supposed to, kill the daemon - // pod. If the node is supposed to run the daemon pod, but isn't, create the daemon pod on the node. - nodeList, err := dsc.nodeStore.List() - if err != nil { - glog.Errorf("Couldn't get list of nodes when syncing daemon set %+v: %v", ds, err) - } - var nodesNeedingDaemonPods, podsToDelete []string - for _, node := range nodeList.Items { - shouldRun := dsc.nodeShouldRunDaemonPod(&node, ds) - - daemonPods, isRunning := nodeToDaemonPods[node.Name] - - if shouldRun && !isRunning { - // If daemon pod is supposed to be running on node, but isn't, create daemon pod. - nodesNeedingDaemonPods = append(nodesNeedingDaemonPods, node.Name) - } else if shouldRun && len(daemonPods) > 1 { - // If daemon pod is supposed to be running on node, but more than 1 daemon pod is running, delete the excess daemon pods. - // Sort the daemon pods by creation time, so the the oldest is preserved. - sort.Sort(podByCreationTimestamp(daemonPods)) - for i := 1; i < len(daemonPods); i++ { - podsToDelete = append(podsToDelete, daemonPods[i].Name) - } - } else if !shouldRun && isRunning { - // If daemon pod isn't supposed to run on node, but it is, delete all daemon pods on node. - for i := range daemonPods { - podsToDelete = append(podsToDelete, daemonPods[i].Name) - } - } - } - - // We need to set expectations before creating/deleting pods to avoid race conditions. - dsKey, err := controller.KeyFunc(ds) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", ds, err) - return - } - - createDiff := len(nodesNeedingDaemonPods) - deleteDiff := len(podsToDelete) - - if createDiff > dsc.burstReplicas { - createDiff = dsc.burstReplicas - } - if deleteDiff > dsc.burstReplicas { - deleteDiff = dsc.burstReplicas - } - - dsc.expectations.SetExpectations(dsKey, createDiff, deleteDiff) - - glog.V(4).Infof("Nodes needing daemon pods for daemon set %s: %+v, creating %d", ds.Name, nodesNeedingDaemonPods, createDiff) - createWait := sync.WaitGroup{} - createWait.Add(createDiff) - for i := 0; i < createDiff; i++ { - go func(ix int) { - defer createWait.Done() - if err := dsc.podControl.CreatePodsOnNode(nodesNeedingDaemonPods[ix], ds.Namespace, &ds.Spec.Template, ds); err != nil { - glog.V(2).Infof("Failed creation, decrementing expectations for set %q/%q", ds.Namespace, ds.Name) - dsc.expectations.CreationObserved(dsKey) - utilruntime.HandleError(err) - } - }(i) - } - createWait.Wait() - - glog.V(4).Infof("Pods to delete for daemon set %s: %+v, deleting %d", ds.Name, podsToDelete, deleteDiff) - deleteWait := sync.WaitGroup{} - deleteWait.Add(deleteDiff) - for i := 0; i < deleteDiff; i++ { - go func(ix int) { - defer deleteWait.Done() - if err := dsc.podControl.DeletePod(ds.Namespace, podsToDelete[ix], ds); err != nil { - glog.V(2).Infof("Failed deletion, decrementing expectations for set %q/%q", ds.Namespace, ds.Name) - dsc.expectations.DeletionObserved(dsKey) - utilruntime.HandleError(err) - } - }(i) - } - deleteWait.Wait() -} - -func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds *extensions.DaemonSet, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled int) error { - if int(ds.Status.DesiredNumberScheduled) == desiredNumberScheduled && int(ds.Status.CurrentNumberScheduled) == currentNumberScheduled && int(ds.Status.NumberMisscheduled) == numberMisscheduled { - return nil - } - - var updateErr, getErr error - for i := 0; i <= StatusUpdateRetries; i++ { - ds.Status.DesiredNumberScheduled = int32(desiredNumberScheduled) - ds.Status.CurrentNumberScheduled = int32(currentNumberScheduled) - ds.Status.NumberMisscheduled = int32(numberMisscheduled) - - _, updateErr = dsClient.UpdateStatus(ds) - if updateErr == nil { - // successful update - return nil - } - // Update the set with the latest resource version for the next poll - if ds, getErr = dsClient.Get(ds.Name); getErr != nil { - // If the GET fails we can't trust status.Replicas anymore. This error - // is bound to be more interesting than the update failure. - return getErr - } - } - return updateErr -} - -func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet) { - glog.V(4).Infof("Updating daemon set status") - nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds) - if err != nil { - glog.Errorf("Error getting node to daemon pod mapping for daemon set %+v: %v", ds, err) - } - - nodeList, err := dsc.nodeStore.List() - if err != nil { - glog.Errorf("Couldn't get list of nodes when updating daemon set %+v: %v", ds, err) - } - - var desiredNumberScheduled, currentNumberScheduled, numberMisscheduled int - for _, node := range nodeList.Items { - shouldRun := dsc.nodeShouldRunDaemonPod(&node, ds) - - numDaemonPods := len(nodeToDaemonPods[node.Name]) - - if shouldRun && numDaemonPods > 0 { - currentNumberScheduled++ - } - - if shouldRun { - desiredNumberScheduled++ - } - - if !shouldRun && numDaemonPods > 0 { - numberMisscheduled++ - } - } - - err = storeDaemonSetStatus(dsc.kubeClient.Extensions().DaemonSets(ds.Namespace), ds, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled) - if err != nil { - glog.Errorf("Error storing status for daemon set %+v: %v", ds, err) - } -} - -func (dsc *DaemonSetsController) syncDaemonSet(key string) error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing daemon set %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !dsc.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(PodStoreSyncedPollPeriod) - glog.Infof("Waiting for pods controller to sync, requeuing ds %v", key) - dsc.queue.Add(key) - return nil - } - - obj, exists, err := dsc.dsStore.Store.GetByKey(key) - if err != nil { - glog.Infof("Unable to retrieve ds %v from store: %v", key, err) - dsc.queue.Add(key) - return err - } - if !exists { - glog.V(3).Infof("daemon set has been deleted %v", key) - dsc.expectations.DeleteExpectations(key) - return nil - } - ds := obj.(*extensions.DaemonSet) - - everything := unversioned.LabelSelector{} - if reflect.DeepEqual(ds.Spec.Selector, &everything) { - dsc.eventRecorder.Eventf(ds, api.EventTypeWarning, "SelectingAll", "This daemon set is selecting all pods. A non-empty selector is required.") - return nil - } - - // Don't process a daemon set until all its creations and deletions have been processed. - // For example if daemon set foo asked for 3 new daemon pods in the previous call to manage, - // then we do not want to call manage on foo until the daemon pods have been created. - dsKey, err := controller.KeyFunc(ds) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", ds, err) - return err - } - dsNeedsSync := dsc.expectations.SatisfiedExpectations(dsKey) - if dsNeedsSync { - dsc.manage(ds) - } - - dsc.updateDaemonSetStatus(ds) - return nil -} - -func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *api.Node, ds *extensions.DaemonSet) bool { - // Check if the node satisfies the daemon set's node selector. - nodeSelector := labels.Set(ds.Spec.Template.Spec.NodeSelector).AsSelector() - if !nodeSelector.Matches(labels.Set(node.Labels)) { - return false - } - // If the daemon set specifies a node name, check that it matches with node.Name. - if !(ds.Spec.Template.Spec.NodeName == "" || ds.Spec.Template.Spec.NodeName == node.Name) { - return false - } - - for _, c := range node.Status.Conditions { - if c.Type == api.NodeOutOfDisk && c.Status == api.ConditionTrue { - return false - } - } - - newPod := &api.Pod{Spec: ds.Spec.Template.Spec} - newPod.Spec.NodeName = node.Name - pods := []*api.Pod{newPod} - - for _, m := range dsc.podStore.Indexer.List() { - pod := m.(*api.Pod) - if pod.Spec.NodeName != node.Name { - continue - } - if pod.Status.Phase == api.PodSucceeded || pod.Status.Phase == api.PodFailed { - continue - } - // ignore pods that belong to the daemonset when taking into account wheter - // a daemonset should bind to a node. - if pds := dsc.getPodDaemonSet(pod); pds != nil && ds.Name == pds.Name { - continue - } - pods = append(pods, pod) - } - _, notFittingCPU, notFittingMemory := predicates.CheckPodsExceedingFreeResources(pods, node.Status.Allocatable) - if len(notFittingCPU)+len(notFittingMemory) != 0 { - dsc.eventRecorder.Eventf(ds, api.EventTypeNormal, "FailedPlacement", "failed to place pod on %q: insufficent free resources", node.ObjectMeta.Name) - return false - } - ports := sets.String{} - for _, pod := range pods { - if errs := validation.AccumulateUniqueHostPorts(pod.Spec.Containers, &ports, field.NewPath("spec", "containers")); len(errs) > 0 { - dsc.eventRecorder.Eventf(ds, api.EventTypeNormal, "FailedPlacement", "failed to place pod on %q: host port conflict", node.ObjectMeta.Name) - return false - } - } - return true -} - -// byCreationTimestamp sorts a list by creation timestamp, using their names as a tie breaker. -type byCreationTimestamp []extensions.DaemonSet - -func (o byCreationTimestamp) Len() int { return len(o) } -func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} - -type podByCreationTimestamp []*api.Pod - -func (o podByCreationTimestamp) Len() int { return len(o) } -func (o podByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o podByCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller_test.go deleted file mode 100644 index d47545dff..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/controller_test.go +++ /dev/null @@ -1,551 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 daemon - -import ( - "fmt" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/securitycontext" -) - -var ( - simpleDaemonSetLabel = map[string]string{"name": "simple-daemon", "type": "production"} - simpleDaemonSetLabel2 = map[string]string{"name": "simple-daemon", "type": "test"} - simpleNodeLabel = map[string]string{"color": "blue", "speed": "fast"} - simpleNodeLabel2 = map[string]string{"color": "red", "speed": "fast"} - alwaysReady = func() bool { return true } -) - -func getKey(ds *extensions.DaemonSet, t *testing.T) string { - if key, err := controller.KeyFunc(ds); err != nil { - t.Errorf("Unexpected error getting key for ds %v: %v", ds.Name, err) - return "" - } else { - return key - } -} - -func newDaemonSet(name string) *extensions.DaemonSet { - return &extensions.DaemonSet{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Extensions.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: api.NamespaceDefault, - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: simpleDaemonSetLabel}, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: simpleDaemonSetLabel, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), - }, - }, - DNSPolicy: api.DNSDefault, - }, - }, - }, - } -} - -func newNode(name string, label map[string]string) *api.Node { - return &api.Node{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - Name: name, - Labels: label, - Namespace: api.NamespaceDefault, - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - {Type: api.NodeReady, Status: api.ConditionTrue}, - }, - }, - } -} - -func addNodes(nodeStore cache.Store, startIndex, numNodes int, label map[string]string) { - for i := startIndex; i < startIndex+numNodes; i++ { - nodeStore.Add(newNode(fmt.Sprintf("node-%d", i), label)) - } -} - -func newPod(podName string, nodeName string, label map[string]string) *api.Pod { - pod := &api.Pod{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - GenerateName: podName, - Labels: label, - Namespace: api.NamespaceDefault, - }, - Spec: api.PodSpec{ - NodeName: nodeName, - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), - }, - }, - DNSPolicy: api.DNSDefault, - }, - } - api.GenerateName(api.SimpleNameGenerator, &pod.ObjectMeta) - return pod -} - -func addPods(podStore cache.Store, nodeName string, label map[string]string, number int) { - for i := 0; i < number; i++ { - podStore.Add(newPod(fmt.Sprintf("%s-", nodeName), nodeName, label)) - } -} - -func newTestController() (*DaemonSetsController, *controller.FakePodControl) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewDaemonSetsControllerFromClient(clientset, controller.NoResyncPeriodFunc, 0) - manager.podStoreSynced = alwaysReady - podControl := &controller.FakePodControl{} - manager.podControl = podControl - return manager, podControl -} - -func validateSyncDaemonSets(t *testing.T, fakePodControl *controller.FakePodControl, expectedCreates, expectedDeletes int) { - if len(fakePodControl.Templates) != expectedCreates { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", expectedCreates, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != expectedDeletes { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", expectedDeletes, len(fakePodControl.DeletePodName)) - } -} - -func syncAndValidateDaemonSets(t *testing.T, manager *DaemonSetsController, ds *extensions.DaemonSet, podControl *controller.FakePodControl, expectedCreates, expectedDeletes int) { - key, err := controller.KeyFunc(ds) - if err != nil { - t.Errorf("Could not get key for daemon.") - } - manager.syncHandler(key) - validateSyncDaemonSets(t, podControl, expectedCreates, expectedDeletes) -} - -// DaemonSets without node selectors should launch pods on every node. -func TestSimpleDaemonSetLaunchesPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 5, 0) -} - -// DaemonSets should do nothing if there aren't any nodes -func TestNoNodesDoesNothing(t *testing.T) { - manager, podControl := newTestController() - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// DaemonSets without node selectors should launch on a single node in a -// single node cluster. -func TestOneNodeDaemonLaunchesPod(t *testing.T) { - manager, podControl := newTestController() - manager.nodeStore.Add(newNode("only-node", nil)) - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSets should place onto NotReady nodes -func TestNotReadNodeDaemonDoesNotLaunchPod(t *testing.T) { - manager, podControl := newTestController() - node := newNode("not-ready", nil) - node.Status = api.NodeStatus{ - Conditions: []api.NodeCondition{ - {Type: api.NodeReady, Status: api.ConditionFalse}, - }, - } - manager.nodeStore.Add(node) - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSets should not place onto OutOfDisk nodes -func TestOutOfDiskNodeDaemonDoesNotLaunchPod(t *testing.T) { - manager, podControl := newTestController() - node := newNode("not-enough-disk", nil) - node.Status.Conditions = []api.NodeCondition{{Type: api.NodeOutOfDisk, Status: api.ConditionTrue}} - manager.nodeStore.Add(node) - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// DaemonSets should not place onto nodes with insufficient free resource -func TestInsufficentCapacityNodeDaemonDoesNotLaunchPod(t *testing.T) { - podSpec := api.PodSpec{ - NodeName: "too-much-mem", - Containers: []api.Container{{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceMemory: resource.MustParse("75M"), - api.ResourceCPU: resource.MustParse("75m"), - }, - }, - }}, - } - manager, podControl := newTestController() - node := newNode("too-much-mem", nil) - node.Status.Allocatable = api.ResourceList{ - api.ResourceMemory: resource.MustParse("100M"), - api.ResourceCPU: resource.MustParse("200m"), - } - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - Spec: podSpec, - }) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -func TestSufficentCapacityWithTerminatedPodsDaemonLaunchesPod(t *testing.T) { - podSpec := api.PodSpec{ - NodeName: "too-much-mem", - Containers: []api.Container{{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceMemory: resource.MustParse("75M"), - api.ResourceCPU: resource.MustParse("75m"), - }, - }, - }}, - } - manager, podControl := newTestController() - node := newNode("too-much-mem", nil) - node.Status.Allocatable = api.ResourceList{ - api.ResourceMemory: resource.MustParse("100M"), - api.ResourceCPU: resource.MustParse("200m"), - } - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - Spec: podSpec, - Status: api.PodStatus{Phase: api.PodSucceeded}, - }) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSets should place onto nodes with sufficient free resource -func TestSufficentCapacityNodeDaemonLaunchesPod(t *testing.T) { - podSpec := api.PodSpec{ - NodeName: "not-too-much-mem", - Containers: []api.Container{{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceMemory: resource.MustParse("75M"), - api.ResourceCPU: resource.MustParse("75m"), - }, - }, - }}, - } - manager, podControl := newTestController() - node := newNode("not-too-much-mem", nil) - node.Status.Allocatable = api.ResourceList{ - api.ResourceMemory: resource.MustParse("200M"), - api.ResourceCPU: resource.MustParse("200m"), - } - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - Spec: podSpec, - }) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSets should not place onto nodes that would cause port conflicts -func TestPortConflictNodeDaemonDoesNotLaunchPod(t *testing.T) { - podSpec := api.PodSpec{ - NodeName: "port-conflict", - Containers: []api.Container{{ - Ports: []api.ContainerPort{{ - HostPort: 666, - }}, - }}, - } - manager, podControl := newTestController() - node := newNode("port-conflict", nil) - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - Spec: podSpec, - }) - - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// Test that if the node is already scheduled with a pod using a host port -// but belonging to the same daemonset, we don't delete that pod -// -// Issue: https://github.com/kubernetes/kubernetes/issues/22309 -func TestPortConflictWithSameDaemonPodDoesNotDeletePod(t *testing.T) { - podSpec := api.PodSpec{ - NodeName: "port-conflict", - Containers: []api.Container{{ - Ports: []api.ContainerPort{{ - HostPort: 666, - }}, - }}, - } - manager, podControl := newTestController() - node := newNode("port-conflict", nil) - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: simpleDaemonSetLabel, - Namespace: api.NamespaceDefault, - }, - Spec: podSpec, - }) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// DaemonSets should place onto nodes that would not cause port conflicts -func TestNoPortConflictNodeDaemonLaunchesPod(t *testing.T) { - podSpec1 := api.PodSpec{ - NodeName: "no-port-conflict", - Containers: []api.Container{{ - Ports: []api.ContainerPort{{ - HostPort: 6661, - }}, - }}, - } - podSpec2 := api.PodSpec{ - NodeName: "no-port-conflict", - Containers: []api.Container{{ - Ports: []api.ContainerPort{{ - HostPort: 6662, - }}, - }}, - } - manager, podControl := newTestController() - node := newNode("no-port-conflict", nil) - manager.nodeStore.Add(node) - manager.podStore.Add(&api.Pod{ - Spec: podSpec1, - }) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec = podSpec2 - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSetController should not sync DaemonSets with empty pod selectors. -// -// issue https://github.com/kubernetes/kubernetes/pull/23223 -func TestPodIsNotDeletedByDaemonsetWithEmptyLabelSelector(t *testing.T) { - manager, podControl := newTestController() - manager.nodeStore.Store.Add(newNode("node1", nil)) - // Create pod not controlled by a daemonset. - manager.podStore.Add(&api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"bang": "boom"}, - Namespace: api.NamespaceDefault, - }, - Spec: api.PodSpec{ - NodeName: "node1", - }, - }) - - // Create a misconfigured DaemonSet. An empty pod selector is invalid but could happen - // if we upgrade and make a backwards incompatible change. - // - // The node selector matches no nodes which mimics the behavior of kubectl delete. - // - // The DaemonSet should not schedule pods and should not delete scheduled pods in - // this case even though it's empty pod selector matches all pods. The DaemonSetController - // should detect this misconfiguration and choose not to sync the DaemonSet. We should - // not observe a deletion of the pod on node1. - ds := newDaemonSet("foo") - ls := unversioned.LabelSelector{} - ds.Spec.Selector = &ls - ds.Spec.Template.Spec.NodeSelector = map[string]string{"foo": "bar"} - manager.dsStore.Add(ds) - - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// Controller should not create pods on nodes which have daemon pods, and should remove excess pods from nodes that have extra pods. -func TestDealsWithExistingPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel, 1) - addPods(manager.podStore.Indexer, "node-2", simpleDaemonSetLabel, 2) - addPods(manager.podStore.Indexer, "node-3", simpleDaemonSetLabel, 5) - addPods(manager.podStore.Indexer, "node-4", simpleDaemonSetLabel2, 2) - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 2, 5) -} - -// Daemon with node selector should launch pods on nodes matching selector. -func TestSelectorDaemonLaunchesPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 4, nil) - addNodes(manager.nodeStore.Store, 4, 3, simpleNodeLabel) - daemon := newDaemonSet("foo") - daemon.Spec.Template.Spec.NodeSelector = simpleNodeLabel - manager.dsStore.Add(daemon) - syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0) -} - -// Daemon with node selector should delete pods from nodes that do not satisfy selector. -func TestSelectorDaemonDeletesUnselectedPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - addNodes(manager.nodeStore.Store, 5, 5, simpleNodeLabel) - addPods(manager.podStore.Indexer, "node-0", simpleDaemonSetLabel2, 2) - addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel, 3) - addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel2, 1) - addPods(manager.podStore.Indexer, "node-4", simpleDaemonSetLabel, 1) - daemon := newDaemonSet("foo") - daemon.Spec.Template.Spec.NodeSelector = simpleNodeLabel - manager.dsStore.Add(daemon) - syncAndValidateDaemonSets(t, manager, daemon, podControl, 5, 4) -} - -// DaemonSet with node selector should launch pods on nodes matching selector, but also deal with existing pods on nodes. -func TestSelectorDaemonDealsWithExistingPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - addNodes(manager.nodeStore.Store, 5, 5, simpleNodeLabel) - addPods(manager.podStore.Indexer, "node-0", simpleDaemonSetLabel, 1) - addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel, 3) - addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel2, 2) - addPods(manager.podStore.Indexer, "node-2", simpleDaemonSetLabel, 4) - addPods(manager.podStore.Indexer, "node-6", simpleDaemonSetLabel, 13) - addPods(manager.podStore.Indexer, "node-7", simpleDaemonSetLabel2, 4) - addPods(manager.podStore.Indexer, "node-9", simpleDaemonSetLabel, 1) - addPods(manager.podStore.Indexer, "node-9", simpleDaemonSetLabel2, 1) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 3, 20) -} - -// DaemonSet with node selector which does not match any node labels should not launch pods. -func TestBadSelectorDaemonDoesNothing(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 4, nil) - addNodes(manager.nodeStore.Store, 4, 3, simpleNodeLabel) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel2 - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// DaemonSet with node name should launch pod on node with corresponding name. -func TestNameDaemonSetLaunchesPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeName = "node-0" - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSet with node name that does not exist should not launch pods. -func TestBadNameDaemonSetDoesNothing(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 5, nil) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeName = "node-10" - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -// DaemonSet with node selector, and node name, matching a node, should launch a pod on the node. -func TestNameAndSelectorDaemonSetLaunchesPods(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 4, nil) - addNodes(manager.nodeStore.Store, 4, 3, simpleNodeLabel) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel - ds.Spec.Template.Spec.NodeName = "node-6" - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} - -// DaemonSet with node selector that matches some nodes, and node name that matches a different node, should do nothing. -func TestInconsistentNameSelectorDaemonSetDoesNothing(t *testing.T) { - manager, podControl := newTestController() - addNodes(manager.nodeStore.Store, 0, 4, nil) - addNodes(manager.nodeStore.Store, 4, 3, simpleNodeLabel) - ds := newDaemonSet("foo") - ds.Spec.Template.Spec.NodeSelector = simpleNodeLabel - ds.Spec.Template.Spec.NodeName = "node-0" - manager.dsStore.Add(ds) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) -} - -func TestDSManagerNotReady(t *testing.T) { - manager, podControl := newTestController() - manager.podStoreSynced = func() bool { return false } - addNodes(manager.nodeStore.Store, 0, 1, nil) - - // Simulates the ds reflector running before the pod reflector. We don't - // want to end up creating daemon pods in this case until the pod reflector - // has synced, so the ds manager should just requeue the ds. - ds := newDaemonSet("foo") - manager.dsStore.Add(ds) - - dsKey := getKey(ds, t) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) - queueDS, _ := manager.queue.Get() - if queueDS != dsKey { - t.Fatalf("Expected to find key %v in queue, found %v", dsKey, queueDS) - } - - manager.podStoreSynced = alwaysReady - syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/doc.go deleted file mode 100644 index db689ac1b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/daemon/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 daemon contains logic for watching and synchronizing -// daemons. -package daemon diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller.go deleted file mode 100644 index 2897583fd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller.go +++ /dev/null @@ -1,1296 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 deployment - -import ( - "fmt" - "reflect" - "sort" - "strconv" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/kubectl" - "k8s.io/kubernetes/pkg/runtime" - deploymentutil "k8s.io/kubernetes/pkg/util/deployment" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - "k8s.io/kubernetes/pkg/util/integer" - labelsutil "k8s.io/kubernetes/pkg/util/labels" - "k8s.io/kubernetes/pkg/util/metrics" - podutil "k8s.io/kubernetes/pkg/util/pod" - rsutil "k8s.io/kubernetes/pkg/util/replicaset" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - // FullDeploymentResyncPeriod means we'll attempt to recompute the required replicas - // of all deployments. - // This recomputation happens based on contents in the local caches. - FullDeploymentResyncPeriod = 30 * time.Second - // We must avoid creating new replica set / counting pods until the replica set / pods store has synced. - // If it hasn't synced, to avoid a hot loop, we'll wait this long between checks. - StoreSyncedPollPeriod = 100 * time.Millisecond -) - -// DeploymentController is responsible for synchronizing Deployment objects stored -// in the system with actual running replica sets and pods. -type DeploymentController struct { - client clientset.Interface - eventRecorder record.EventRecorder - - // To allow injection of syncDeployment for testing. - syncHandler func(dKey string) error - - // A store of deployments, populated by the dController - dStore cache.StoreToDeploymentLister - // Watches changes to all deployments - dController *framework.Controller - // A store of ReplicaSets, populated by the rsController - rsStore cache.StoreToReplicaSetLister - // Watches changes to all ReplicaSets - rsController *framework.Controller - // rsStoreSynced returns true if the ReplicaSet store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - rsStoreSynced func() bool - // A store of pods, populated by the podController - podStore cache.StoreToPodLister - // Watches changes to all pods - podController *framework.Controller - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool - - // Deployments that need to be synced - queue *workqueue.Type -} - -// NewDeploymentController creates a new DeploymentController. -func NewDeploymentController(client clientset.Interface, resyncPeriod controller.ResyncPeriodFunc) *DeploymentController { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - // TODO: remove the wrapper when every clients have moved to use the clientset. - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: client.Core().Events("")}) - - if client != nil && client.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("deployment_controller", client.Core().GetRESTClient().GetRateLimiter()) - } - dc := &DeploymentController{ - client: client, - eventRecorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "deployment-controller"}), - queue: workqueue.New(), - } - - dc.dStore.Store, dc.dController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return dc.client.Extensions().Deployments(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return dc.client.Extensions().Deployments(api.NamespaceAll).Watch(options) - }, - }, - &extensions.Deployment{}, - FullDeploymentResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: dc.addDeploymentNotification, - UpdateFunc: dc.updateDeploymentNotification, - // This will enter the sync loop and no-op, because the deployment has been deleted from the store. - DeleteFunc: dc.deleteDeploymentNotification, - }, - ) - - dc.rsStore.Store, dc.rsController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return dc.client.Extensions().ReplicaSets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return dc.client.Extensions().ReplicaSets(api.NamespaceAll).Watch(options) - }, - }, - &extensions.ReplicaSet{}, - resyncPeriod(), - framework.ResourceEventHandlerFuncs{ - AddFunc: dc.addReplicaSet, - UpdateFunc: dc.updateReplicaSet, - DeleteFunc: dc.deleteReplicaSet, - }, - ) - - dc.podStore.Indexer, dc.podController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return dc.client.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return dc.client.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - resyncPeriod(), - framework.ResourceEventHandlerFuncs{ - AddFunc: dc.addPod, - UpdateFunc: dc.updatePod, - DeleteFunc: dc.deletePod, - }, - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - - dc.syncHandler = dc.syncDeployment - dc.rsStoreSynced = dc.rsController.HasSynced - dc.podStoreSynced = dc.podController.HasSynced - return dc -} - -// Run begins watching and syncing. -func (dc *DeploymentController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go dc.dController.Run(stopCh) - go dc.rsController.Run(stopCh) - go dc.podController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(dc.worker, time.Second, stopCh) - } - <-stopCh - glog.Infof("Shutting down deployment controller") - dc.queue.ShutDown() -} - -func (dc *DeploymentController) addDeploymentNotification(obj interface{}) { - d := obj.(*extensions.Deployment) - glog.V(4).Infof("Adding deployment %s", d.Name) - dc.enqueueDeployment(d) -} - -func (dc *DeploymentController) updateDeploymentNotification(old, cur interface{}) { - oldD := old.(*extensions.Deployment) - glog.V(4).Infof("Updating deployment %s", oldD.Name) - // Resync on deployment object relist. - dc.enqueueDeployment(cur.(*extensions.Deployment)) -} - -func (dc *DeploymentController) deleteDeploymentNotification(obj interface{}) { - d, ok := obj.(*extensions.Deployment) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - d, ok = tombstone.Obj.(*extensions.Deployment) - if !ok { - glog.Errorf("Tombstone contained object that is not a Deployment %+v", obj) - return - } - } - glog.V(4).Infof("Deleting deployment %s", d.Name) - dc.enqueueDeployment(d) -} - -// addReplicaSet enqueues the deployment that manages a ReplicaSet when the ReplicaSet is created. -func (dc *DeploymentController) addReplicaSet(obj interface{}) { - rs := obj.(*extensions.ReplicaSet) - glog.V(4).Infof("ReplicaSet %s added.", rs.Name) - if d := dc.getDeploymentForReplicaSet(rs); d != nil { - dc.enqueueDeployment(d) - } -} - -// getDeploymentForReplicaSet returns the deployment managing the given ReplicaSet. -// TODO: Surface that we are ignoring multiple deployments for a given ReplicaSet. -func (dc *DeploymentController) getDeploymentForReplicaSet(rs *extensions.ReplicaSet) *extensions.Deployment { - deployments, err := dc.dStore.GetDeploymentsForReplicaSet(rs) - if err != nil || len(deployments) == 0 { - glog.V(4).Infof("Error: %v. No deployment found for ReplicaSet %v, deployment controller will avoid syncing.", err, rs.Name) - return nil - } - // Because all ReplicaSet's belonging to a deployment should have a unique label key, - // there should never be more than one deployment returned by the above method. - // If that happens we should probably dynamically repair the situation by ultimately - // trying to clean up one of the controllers, for now we just return one of the two, - // likely randomly. - return &deployments[0] -} - -// updateReplicaSet figures out what deployment(s) manage a ReplicaSet when the ReplicaSet -// is updated and wake them up. If the anything of the ReplicaSets have changed, we need to -// awaken both the old and new deployments. old and cur must be *extensions.ReplicaSet -// types. -func (dc *DeploymentController) updateReplicaSet(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - // A periodic relist will send update events for all known controllers. - return - } - // TODO: Write a unittest for this case - curRS := cur.(*extensions.ReplicaSet) - glog.V(4).Infof("ReplicaSet %s updated.", curRS.Name) - if d := dc.getDeploymentForReplicaSet(curRS); d != nil { - dc.enqueueDeployment(d) - } - // A number of things could affect the old deployment: labels changing, - // pod template changing, etc. - oldRS := old.(*extensions.ReplicaSet) - if !api.Semantic.DeepEqual(oldRS, curRS) { - if oldD := dc.getDeploymentForReplicaSet(oldRS); oldD != nil { - dc.enqueueDeployment(oldD) - } - } -} - -// deleteReplicaSet enqueues the deployment that manages a ReplicaSet when -// the ReplicaSet is deleted. obj could be an *extensions.ReplicaSet, or -// a DeletionFinalStateUnknown marker item. -func (dc *DeploymentController) deleteReplicaSet(obj interface{}) { - rs, ok := obj.(*extensions.ReplicaSet) - - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the ReplicaSet - // changed labels the new deployment will not be woken up till the periodic resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v, could take up to %v before a deployment recreates/updates replicasets", obj, FullDeploymentResyncPeriod) - return - } - rs, ok = tombstone.Obj.(*extensions.ReplicaSet) - if !ok { - glog.Errorf("Tombstone contained object that is not a ReplicaSet %+v, could take up to %v before a deployment recreates/updates replicasets", obj, FullDeploymentResyncPeriod) - return - } - } - glog.V(4).Infof("ReplicaSet %s deleted.", rs.Name) - if d := dc.getDeploymentForReplicaSet(rs); d != nil { - dc.enqueueDeployment(d) - } -} - -// getDeploymentForPod returns the deployment managing the ReplicaSet that manages the given Pod. -// TODO: Surface that we are ignoring multiple deployments for a given Pod. -func (dc *DeploymentController) getDeploymentForPod(pod *api.Pod) *extensions.Deployment { - rss, err := dc.rsStore.GetPodReplicaSets(pod) - if err != nil { - glog.V(4).Infof("Error: %v. No ReplicaSets found for pod %v, deployment controller will avoid syncing.", err, pod.Name) - return nil - } - for _, rs := range rss { - deployments, err := dc.dStore.GetDeploymentsForReplicaSet(&rs) - if err == nil && len(deployments) > 0 { - return &deployments[0] - } - } - glog.V(4).Infof("No deployments found for pod %v, deployment controller will avoid syncing.", pod.Name) - return nil -} - -// When a pod is created, ensure its controller syncs -func (dc *DeploymentController) addPod(obj interface{}) { - pod, ok := obj.(*api.Pod) - if !ok { - return - } - glog.V(4).Infof("Pod %s created: %+v.", pod.Name, pod) - if d := dc.getDeploymentForPod(pod); d != nil { - dc.enqueueDeployment(d) - } -} - -// updatePod figures out what deployment(s) manage the ReplicaSet that manages the Pod when the Pod -// is updated and wake them up. If anything of the Pods have changed, we need to awaken both -// the old and new deployments. old and cur must be *api.Pod types. -func (dc *DeploymentController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - return - } - curPod := cur.(*api.Pod) - oldPod := old.(*api.Pod) - glog.V(4).Infof("Pod %s updated %+v -> %+v.", curPod.Name, oldPod, curPod) - if d := dc.getDeploymentForPod(curPod); d != nil { - dc.enqueueDeployment(d) - } - if !api.Semantic.DeepEqual(oldPod, curPod) { - if oldD := dc.getDeploymentForPod(oldPod); oldD != nil { - dc.enqueueDeployment(oldD) - } - } -} - -// When a pod is deleted, ensure its controller syncs. -// obj could be an *api.Pod, or a DeletionFinalStateUnknown marker item. -func (dc *DeploymentController) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new ReplicaSet will not be woken up till the periodic - // resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a pod %+v", obj) - return - } - } - glog.V(4).Infof("Pod %s deleted: %+v.", pod.Name, pod) - if d := dc.getDeploymentForPod(pod); d != nil { - dc.enqueueDeployment(d) - } -} - -func (dc *DeploymentController) enqueueDeployment(deployment *extensions.Deployment) { - key, err := controller.KeyFunc(deployment) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", deployment, err) - return - } - - // TODO: Handle overlapping deployments better. Either disallow them at admission time or - // deterministically avoid syncing deployments that fight over ReplicaSet's. Currently, we - // only ensure that the same deployment is synced for a given ReplicaSet. When we - // periodically relist all deployments there will still be some ReplicaSet instability. One - // way to handle this is by querying the store for all deployments that this deployment - // overlaps, as well as all deployments that overlap this deployments, and sorting them. - dc.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (dc *DeploymentController) worker() { - for { - func() { - key, quit := dc.queue.Get() - if quit { - return - } - defer dc.queue.Done(key) - err := dc.syncHandler(key.(string)) - if err != nil { - glog.Errorf("Error syncing deployment %v: %v", key, err) - } - }() - } -} - -// syncDeployment will sync the deployment with the given key. -// This function is not meant to be invoked concurrently with the same key. -func (dc *DeploymentController) syncDeployment(key string) error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing deployment %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !dc.rsStoreSynced() || !dc.podStoreSynced() { - // Sleep so we give the replica set / pod reflector goroutine a chance to run. - time.Sleep(StoreSyncedPollPeriod) - glog.Infof("Waiting for replica set / pod controller to sync, requeuing deployment %s", key) - dc.queue.Add(key) - return nil - } - - obj, exists, err := dc.dStore.Store.GetByKey(key) - if err != nil { - glog.Infof("Unable to retrieve deployment %v from store: %v", key, err) - dc.queue.Add(key) - return err - } - if !exists { - glog.Infof("Deployment has been deleted %v", key) - return nil - } - - d := obj.(*extensions.Deployment) - everything := unversioned.LabelSelector{} - if reflect.DeepEqual(d.Spec.Selector, &everything) { - dc.eventRecorder.Eventf(d, api.EventTypeWarning, "SelectingAll", "This deployment is selecting all pods. A non-empty selector is required.") - return nil - } - - if d.Spec.Paused { - // TODO: Implement scaling for paused deployments. - // Don't take any action for paused deployment. - // But keep the status up-to-date. - // Ignore paused deployments - glog.V(4).Infof("Updating status only for paused deployment %s/%s", d.Namespace, d.Name) - return dc.syncPausedDeploymentStatus(d) - } - if d.Spec.RollbackTo != nil { - revision := d.Spec.RollbackTo.Revision - if _, err = dc.rollback(d, &revision); err != nil { - return err - } - } - - switch d.Spec.Strategy.Type { - case extensions.RecreateDeploymentStrategyType: - return dc.syncRecreateDeployment(d) - case extensions.RollingUpdateDeploymentStrategyType: - return dc.syncRollingUpdateDeployment(d) - } - return fmt.Errorf("unexpected deployment strategy type: %s", d.Spec.Strategy.Type) -} - -// Updates the status of a paused deployment -func (dc *DeploymentController) syncPausedDeploymentStatus(deployment *extensions.Deployment) error { - newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, false) - if err != nil { - return err - } - allRSs := append(controller.FilterActiveReplicaSets(oldRSs), newRS) - - // Sync deployment status - return dc.syncDeploymentStatus(allRSs, newRS, deployment) -} - -// Rolling back to a revision; no-op if the toRevision is deployment's current revision -func (dc *DeploymentController) rollback(deployment *extensions.Deployment, toRevision *int64) (*extensions.Deployment, error) { - newRS, allOldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, true) - if err != nil { - return nil, err - } - allRSs := append(allOldRSs, newRS) - // If rollback revision is 0, rollback to the last revision - if *toRevision == 0 { - if *toRevision = lastRevision(allRSs); *toRevision == 0 { - // If we still can't find the last revision, gives up rollback - dc.emitRollbackWarningEvent(deployment, deploymentutil.RollbackRevisionNotFound, "Unable to find last revision.") - // Gives up rollback - return dc.updateDeploymentAndClearRollbackTo(deployment) - } - } - for _, rs := range allRSs { - v, err := deploymentutil.Revision(rs) - if err != nil { - glog.V(4).Infof("Unable to extract revision from deployment's replica set %q: %v", rs.Name, err) - continue - } - if v == *toRevision { - glog.V(4).Infof("Found replica set %q with desired revision %d", rs.Name, v) - // rollback by copying podTemplate.Spec from the replica set, and increment revision number by 1 - // no-op if the the spec matches current deployment's podTemplate.Spec - deployment, performedRollback, err := dc.rollbackToTemplate(deployment, rs) - if performedRollback && err == nil { - dc.emitRollbackNormalEvent(deployment, fmt.Sprintf("Rolled back deployment %q to revision %d", deployment.Name, *toRevision)) - } - return deployment, err - } - } - dc.emitRollbackWarningEvent(deployment, deploymentutil.RollbackRevisionNotFound, "Unable to find the revision to rollback to.") - // Gives up rollback - return dc.updateDeploymentAndClearRollbackTo(deployment) -} - -func (dc *DeploymentController) emitRollbackWarningEvent(deployment *extensions.Deployment, reason, message string) { - dc.eventRecorder.Eventf(deployment, api.EventTypeWarning, reason, message) -} - -func (dc *DeploymentController) emitRollbackNormalEvent(deployment *extensions.Deployment, message string) { - dc.eventRecorder.Eventf(deployment, api.EventTypeNormal, deploymentutil.RollbackDone, message) -} - -// updateDeploymentAndClearRollbackTo sets .spec.rollbackTo to nil and update the input deployment -func (dc *DeploymentController) updateDeploymentAndClearRollbackTo(deployment *extensions.Deployment) (*extensions.Deployment, error) { - glog.V(4).Infof("Cleans up rollbackTo of deployment %s", deployment.Name) - deployment.Spec.RollbackTo = nil - return dc.updateDeployment(deployment) -} - -func (dc *DeploymentController) syncRecreateDeployment(deployment *extensions.Deployment) error { - // Don't create a new RS if not already existed, so that we avoid scaling up before scaling down - newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, false) - if err != nil { - return err - } - allRSs := append(controller.FilterActiveReplicaSets(oldRSs), newRS) - - // scale down old replica sets - scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(controller.FilterActiveReplicaSets(oldRSs), deployment) - if err != nil { - return err - } - if scaledDown { - // Update DeploymentStatus - return dc.updateDeploymentStatus(allRSs, newRS, deployment) - } - - // If we need to create a new RS, create it now - // TODO: Create a new RS without re-listing all RSs. - if newRS == nil { - newRS, oldRSs, err = dc.getAllReplicaSetsAndSyncRevision(deployment, true) - if err != nil { - return err - } - allRSs = append(oldRSs, newRS) - } - - // scale up new replica set - scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, deployment) - if err != nil { - return err - } - if scaledUp { - // Update DeploymentStatus - return dc.updateDeploymentStatus(allRSs, newRS, deployment) - } - - if deployment.Spec.RevisionHistoryLimit != nil { - // Cleanup old replica sets - dc.cleanupOldReplicaSets(oldRSs, deployment) - } - - // Sync deployment status - return dc.syncDeploymentStatus(allRSs, newRS, deployment) -} - -func (dc *DeploymentController) syncRollingUpdateDeployment(deployment *extensions.Deployment) error { - newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, true) - if err != nil { - return err - } - allRSs := append(controller.FilterActiveReplicaSets(oldRSs), newRS) - - // Scale up, if we can. - scaledUp, err := dc.reconcileNewReplicaSet(allRSs, newRS, deployment) - if err != nil { - return err - } - if scaledUp { - // Update DeploymentStatus - return dc.updateDeploymentStatus(allRSs, newRS, deployment) - } - - // Scale down, if we can. - scaledDown, err := dc.reconcileOldReplicaSets(allRSs, controller.FilterActiveReplicaSets(oldRSs), newRS, deployment) - if err != nil { - return err - } - if scaledDown { - // Update DeploymentStatus - return dc.updateDeploymentStatus(allRSs, newRS, deployment) - } - - if deployment.Spec.RevisionHistoryLimit != nil { - // Cleanup old replicas sets - dc.cleanupOldReplicaSets(oldRSs, deployment) - } - - // Sync deployment status - return dc.syncDeploymentStatus(allRSs, newRS, deployment) -} - -// syncDeploymentStatus checks if the status is up-to-date and sync it if necessary -func (dc *DeploymentController) syncDeploymentStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, d *extensions.Deployment) error { - totalActualReplicas, updatedReplicas, availableReplicas, _, err := dc.calculateStatus(allRSs, newRS, d) - if err != nil { - return err - } - if d.Generation > d.Status.ObservedGeneration || d.Status.Replicas != totalActualReplicas || d.Status.UpdatedReplicas != updatedReplicas || d.Status.AvailableReplicas != availableReplicas { - return dc.updateDeploymentStatus(allRSs, newRS, d) - } - return nil -} - -// getAllReplicaSetsAndSyncRevision returns all the replica sets for the provided deployment (new and all old), with new RS's and deployment's revision updated. -// 1. Get all old RSes this deployment targets, and calculate the max revision number among them (maxOldV). -// 2. Get new RS this deployment targets (whose pod template matches deployment's), and update new RS's revision number to (maxOldV + 1), -// only if its revision number is smaller than (maxOldV + 1). If this step failed, we'll update it in the next deployment sync loop. -// 3. Copy new RS's revision number to deployment (update deployment's revision). If this step failed, we'll update it in the next deployment sync loop. -func (dc *DeploymentController) getAllReplicaSetsAndSyncRevision(deployment *extensions.Deployment, createIfNotExisted bool) (*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { - _, allOldRSs, err := dc.getOldReplicaSets(deployment) - if err != nil { - return nil, nil, err - } - - // Calculate the max revision number among all old RSes - maxOldV := maxRevision(allOldRSs) - - // Get new replica set with the updated revision number - newRS, err := dc.getNewReplicaSet(deployment, maxOldV, allOldRSs, createIfNotExisted) - if err != nil { - return nil, nil, err - } - - // Sync deployment's revision number with new replica set - if newRS != nil && newRS.Annotations != nil && len(newRS.Annotations[deploymentutil.RevisionAnnotation]) > 0 && - (deployment.Annotations == nil || deployment.Annotations[deploymentutil.RevisionAnnotation] != newRS.Annotations[deploymentutil.RevisionAnnotation]) { - if err = dc.updateDeploymentRevision(deployment, newRS.Annotations[deploymentutil.RevisionAnnotation]); err != nil { - glog.V(4).Infof("Error: %v. Unable to update deployment revision, will retry later.", err) - } - } - - return newRS, allOldRSs, nil -} - -func maxRevision(allRSs []*extensions.ReplicaSet) int64 { - max := int64(0) - for _, rs := range allRSs { - if v, err := deploymentutil.Revision(rs); err != nil { - // Skip the replica sets when it failed to parse their revision information - glog.V(4).Infof("Error: %v. Couldn't parse revision for replica set %#v, deployment controller will skip it when reconciling revisions.", err, rs) - } else if v > max { - max = v - } - } - return max -} - -// lastRevision finds the second max revision number in all replica sets (the last revision) -func lastRevision(allRSs []*extensions.ReplicaSet) int64 { - max, secMax := int64(0), int64(0) - for _, rs := range allRSs { - if v, err := deploymentutil.Revision(rs); err != nil { - // Skip the replica sets when it failed to parse their revision information - glog.V(4).Infof("Error: %v. Couldn't parse revision for replica set %#v, deployment controller will skip it when reconciling revisions.", err, rs) - } else if v >= max { - secMax = max - max = v - } else if v > secMax { - secMax = v - } - } - return secMax -} - -// getOldReplicaSets returns two sets of old replica sets of the deployment. The first set of old replica sets doesn't include -// the ones with no pods, and the second set of old replica sets include all old replica sets. -// Note that the pod-template-hash will be added to adopted RSes and pods. -func (dc *DeploymentController) getOldReplicaSets(deployment *extensions.Deployment) ([]*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { - // List the deployment's RSes & Pods and apply pod-template-hash info to deployment's adopted RSes/Pods - rsList, podList, err := dc.rsAndPodsWithHashKeySynced(deployment) - if err != nil { - return nil, nil, fmt.Errorf("error labeling replica sets and pods with pod-template-hash: %v", err) - } - return deploymentutil.FindOldReplicaSets(deployment, rsList, podList) -} - -// Returns a replica set that matches the intent of the given deployment. Returns nil if the new replica set doesn't exist yet. -// 1. Get existing new RS (the RS that the given deployment targets, whose pod template is the same as deployment's). -// 2. If there's existing new RS, update its revision number if it's smaller than (maxOldRevision + 1), where maxOldRevision is the max revision number among all old RSes. -// 3. If there's no existing new RS and createIfNotExisted is true, create one with appropriate revision number (maxOldRevision + 1) and replicas. -// Note that the pod-template-hash will be added to adopted RSes and pods. -func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployment, maxOldRevision int64, oldRSs []*extensions.ReplicaSet, createIfNotExisted bool) (*extensions.ReplicaSet, error) { - // Calculate revision number for this new replica set - newRevision := strconv.FormatInt(maxOldRevision+1, 10) - - // List the deployment's RSes and apply pod-template-hash info to deployment's adopted RSes/Pods - rsList, _, err := dc.rsAndPodsWithHashKeySynced(deployment) - if err != nil { - return nil, fmt.Errorf("error labeling replica sets and pods with pod-template-hash: %v", err) - } - existingNewRS, err := deploymentutil.FindNewReplicaSet(deployment, rsList) - if err != nil { - return nil, err - } else if existingNewRS != nil { - // Set existing new replica set's annotation - if setNewReplicaSetAnnotations(deployment, existingNewRS, newRevision) { - return dc.client.Extensions().ReplicaSets(deployment.ObjectMeta.Namespace).Update(existingNewRS) - } - return existingNewRS, nil - } - - if !createIfNotExisted { - return nil, nil - } - - // new ReplicaSet does not exist, create one. - namespace := deployment.ObjectMeta.Namespace - podTemplateSpecHash := podutil.GetPodTemplateSpecHash(deployment.Spec.Template) - newRSTemplate := deploymentutil.GetNewReplicaSetTemplate(deployment) - // Add podTemplateHash label to selector. - newRSSelector := labelsutil.CloneSelectorAndAddLabel(deployment.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash) - - // Create new ReplicaSet - newRS := extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - // Make the name deterministic, to ensure idempotence - Name: deployment.Name + "-" + fmt.Sprintf("%d", podTemplateSpecHash), - Namespace: namespace, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: newRSSelector, - Template: newRSTemplate, - }, - } - // Set new replica set's annotation - setNewReplicaSetAnnotations(deployment, &newRS, newRevision) - allRSs := append(oldRSs, &newRS) - newReplicasCount, err := deploymentutil.NewRSNewReplicas(deployment, allRSs, &newRS) - if err != nil { - return nil, err - } - - newRS.Spec.Replicas = newReplicasCount - createdRS, err := dc.client.Extensions().ReplicaSets(namespace).Create(&newRS) - if err != nil { - dc.enqueueDeployment(deployment) - return nil, fmt.Errorf("error creating replica set %v: %v", deployment.Name, err) - } - if newReplicasCount > 0 { - dc.eventRecorder.Eventf(deployment, api.EventTypeNormal, "ScalingReplicaSet", "Scaled %s replica set %s to %d", "up", createdRS.Name, newReplicasCount) - } - - return createdRS, dc.updateDeploymentRevision(deployment, newRevision) -} - -// rsAndPodsWithHashKeySynced returns the RSes and pods the given deployment targets, with pod-template-hash information synced. -func (dc *DeploymentController) rsAndPodsWithHashKeySynced(deployment *extensions.Deployment) ([]extensions.ReplicaSet, *api.PodList, error) { - rsList, err := deploymentutil.ListReplicaSets(deployment, - func(namespace string, options api.ListOptions) ([]extensions.ReplicaSet, error) { - return dc.rsStore.ReplicaSets(namespace).List(options.LabelSelector) - }) - if err != nil { - return nil, nil, fmt.Errorf("error listing ReplicaSets: %v", err) - } - syncedRSList := []extensions.ReplicaSet{} - for _, rs := range rsList { - // Add pod-template-hash information if it's not in the RS. - // Otherwise, new RS produced by Deployment will overlap with pre-existing ones - // that aren't constrained by the pod-template-hash. - syncedRS, err := dc.addHashKeyToRSAndPods(rs) - if err != nil { - return nil, nil, err - } - syncedRSList = append(syncedRSList, *syncedRS) - } - syncedPodList, err := deploymentutil.ListPods(deployment, - func(namespace string, options api.ListOptions) (*api.PodList, error) { - podList, err := dc.podStore.Pods(namespace).List(options.LabelSelector) - return &podList, err - }) - - if err != nil { - return nil, nil, err - } - return syncedRSList, syncedPodList, nil -} - -// addHashKeyToRSAndPods adds pod-template-hash information to the given rs, if it's not already there, with the following steps: -// 1. Add hash label to the rs's pod template, and make sure the controller sees this update so that no orphaned pods will be created -// 2. Add hash label to all pods this rs owns, wait until replicaset controller reports rs.Status.FullyLabeledReplicas equal to the desired number of replicas -// 3. Add hash label to the rs's label and selector -func (dc *DeploymentController) addHashKeyToRSAndPods(rs extensions.ReplicaSet) (updatedRS *extensions.ReplicaSet, err error) { - updatedRS = &rs - // If the rs already has the new hash label in its selector, it's done syncing - if labelsutil.SelectorHasLabel(rs.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey) { - return - } - namespace := rs.Namespace - hash := rsutil.GetPodTemplateSpecHash(rs) - rsUpdated := false - // 1. Add hash template label to the rs. This ensures that any newly created pods will have the new label. - updatedRS, rsUpdated, err = rsutil.UpdateRSWithRetries(dc.client.Extensions().ReplicaSets(namespace), updatedRS, - func(updated *extensions.ReplicaSet) error { - // Precondition: the RS doesn't contain the new hash in its pod template label. - if updated.Spec.Template.Labels[extensions.DefaultDeploymentUniqueLabelKey] == hash { - return utilerrors.ErrPreconditionViolated - } - updated.Spec.Template.Labels = labelsutil.AddLabel(updated.Spec.Template.Labels, extensions.DefaultDeploymentUniqueLabelKey, hash) - return nil - }) - if err != nil { - return nil, fmt.Errorf("error updating %s %s/%s pod template label with template hash: %v", updatedRS.Kind, updatedRS.Namespace, updatedRS.Name, err) - } - if !rsUpdated { - // If RS wasn't updated but didn't return error in step 1, we've hit a RS not found error. - // Return here and retry in the next sync loop. - return &rs, nil - } - // Make sure rs pod template is updated so that it won't create pods without the new label (orphaned pods). - if updatedRS.Generation > updatedRS.Status.ObservedGeneration { - if err = deploymentutil.WaitForReplicaSetUpdated(dc.client, updatedRS.Generation, namespace, updatedRS.Name); err != nil { - return nil, fmt.Errorf("error waiting for %s %s/%s generation %d observed by controller: %v", updatedRS.Kind, updatedRS.Namespace, updatedRS.Name, updatedRS.Generation, err) - } - } - glog.V(4).Infof("Observed the update of %s %s/%s's pod template with hash %s.", rs.Kind, rs.Namespace, rs.Name, hash) - - // 2. Update all pods managed by the rs to have the new hash label, so they will be correctly adopted. - selector, err := unversioned.LabelSelectorAsSelector(updatedRS.Spec.Selector) - if err != nil { - return nil, fmt.Errorf("error in converting selector to label selector for replica set %s: %s", updatedRS.Name, err) - } - options := api.ListOptions{LabelSelector: selector} - podList, err := dc.podStore.Pods(namespace).List(options.LabelSelector) - if err != nil { - return nil, fmt.Errorf("error in getting pod list for namespace %s and list options %+v: %s", namespace, options, err) - } - allPodsLabeled := false - if allPodsLabeled, err = deploymentutil.LabelPodsWithHash(&podList, updatedRS, dc.client, namespace, hash); err != nil { - return nil, fmt.Errorf("error in adding template hash label %s to pods %+v: %s", hash, podList, err) - } - // If not all pods are labeled but didn't return error in step 2, we've hit at least one pod not found error. - // Return here and retry in the next sync loop. - if !allPodsLabeled { - return updatedRS, nil - } - - // We need to wait for the replicaset controller to observe the pods being - // labeled with pod template hash. Because previously we've called - // WaitForReplicaSetUpdated, the replicaset controller should have dropped - // FullyLabeledReplicas to 0 already, we only need to wait it to increase - // back to the number of replicas in the spec. - if err = deploymentutil.WaitForPodsHashPopulated(dc.client, updatedRS.Generation, namespace, updatedRS.Name); err != nil { - return nil, fmt.Errorf("%s %s/%s: error waiting for replicaset controller to observe pods being labeled with template hash: %v", updatedRS.Kind, updatedRS.Namespace, updatedRS.Name, err) - } - - // 3. Update rs label and selector to include the new hash label - // Copy the old selector, so that we can scrub out any orphaned pods - if updatedRS, rsUpdated, err = rsutil.UpdateRSWithRetries(dc.client.Extensions().ReplicaSets(namespace), updatedRS, - func(updated *extensions.ReplicaSet) error { - // Precondition: the RS doesn't contain the new hash in its label or selector. - if updated.Labels[extensions.DefaultDeploymentUniqueLabelKey] == hash && updated.Spec.Selector.MatchLabels[extensions.DefaultDeploymentUniqueLabelKey] == hash { - return utilerrors.ErrPreconditionViolated - } - updated.Labels = labelsutil.AddLabel(updated.Labels, extensions.DefaultDeploymentUniqueLabelKey, hash) - updated.Spec.Selector = labelsutil.AddLabelToSelector(updated.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, hash) - return nil - }); err != nil { - return nil, fmt.Errorf("error updating %s %s/%s label and selector with template hash: %v", updatedRS.Kind, updatedRS.Namespace, updatedRS.Name, err) - } - if rsUpdated { - glog.V(4).Infof("Updated %s %s/%s's selector and label with hash %s.", rs.Kind, rs.Namespace, rs.Name, hash) - } - // If the RS isn't actually updated in step 3, that's okay, we'll retry in the next sync loop since its selector isn't updated yet. - - // TODO: look for orphaned pods and label them in the background somewhere else periodically - - return updatedRS, nil -} - -// setNewReplicaSetAnnotations sets new replica set's annotations appropriately by updating its revision and -// copying required deployment annotations to it; it returns true if replica set's annotation is changed. -func setNewReplicaSetAnnotations(deployment *extensions.Deployment, newRS *extensions.ReplicaSet, newRevision string) bool { - // First, copy deployment's annotations (except for apply and revision annotations) - annotationChanged := copyDeploymentAnnotationsToReplicaSet(deployment, newRS) - // Then, update replica set's revision annotation - if newRS.Annotations == nil { - newRS.Annotations = make(map[string]string) - } - // The newRS's revision should be the greatest among all RSes. Usually, its revision number is newRevision (the max revision number - // of all old RSes + 1). However, it's possible that some of the old RSes are deleted after the newRS revision being updated, and - // newRevision becomes smaller than newRS's revision. We should only update newRS revision when it's smaller than newRevision. - if newRS.Annotations[deploymentutil.RevisionAnnotation] < newRevision { - newRS.Annotations[deploymentutil.RevisionAnnotation] = newRevision - annotationChanged = true - glog.V(4).Infof("updating replica set %q's revision to %s - %+v\n", newRS.Name, newRevision, newRS) - } - return annotationChanged -} - -// skipCopyAnnotation returns true if we should skip copying the annotation with the given annotation key -// TODO: How to decide which annotations should / should not be copied? -// See https://github.com/kubernetes/kubernetes/pull/20035#issuecomment-179558615 -func skipCopyAnnotation(key string) bool { - // Skip apply annotations and revision annotations. - return key == kubectl.LastAppliedConfigAnnotation || key == deploymentutil.RevisionAnnotation -} - -func getSkippedAnnotations(annotations map[string]string) map[string]string { - skippedAnnotations := make(map[string]string) - for k, v := range annotations { - if skipCopyAnnotation(k) { - skippedAnnotations[k] = v - } - } - return skippedAnnotations -} - -// copyDeploymentAnnotationsToReplicaSet copies deployment's annotations to replica set's annotations, -// and returns true if replica set's annotation is changed. -// Note that apply and revision annotations are not copied. -func copyDeploymentAnnotationsToReplicaSet(deployment *extensions.Deployment, rs *extensions.ReplicaSet) bool { - rsAnnotationsChanged := false - if rs.Annotations == nil { - rs.Annotations = make(map[string]string) - } - for k, v := range deployment.Annotations { - // newRS revision is updated automatically in getNewReplicaSet, and the deployment's revision number is then updated - // by copying its newRS revision number. We should not copy deployment's revision to its newRS, since the update of - // deployment revision number may fail (revision becomes stale) and the revision number in newRS is more reliable. - if skipCopyAnnotation(k) || rs.Annotations[k] == v { - continue - } - rs.Annotations[k] = v - rsAnnotationsChanged = true - } - return rsAnnotationsChanged -} - -// setDeploymentAnnotationsTo sets deployment's annotations as given RS's annotations. -// This action should be done if and only if the deployment is rolling back to this rs. -// Note that apply and revision annotations are not changed. -func setDeploymentAnnotationsTo(deployment *extensions.Deployment, rollbackToRS *extensions.ReplicaSet) { - deployment.Annotations = getSkippedAnnotations(deployment.Annotations) - for k, v := range rollbackToRS.Annotations { - if !skipCopyAnnotation(k) { - deployment.Annotations[k] = v - } - } -} - -func (dc *DeploymentController) updateDeploymentRevision(deployment *extensions.Deployment, revision string) error { - if deployment.Annotations == nil { - deployment.Annotations = make(map[string]string) - } - if deployment.Annotations[deploymentutil.RevisionAnnotation] != revision { - deployment.Annotations[deploymentutil.RevisionAnnotation] = revision - _, err := dc.updateDeployment(deployment) - return err - } - return nil -} - -func (dc *DeploymentController) reconcileNewReplicaSet(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) { - if newRS.Spec.Replicas == deployment.Spec.Replicas { - // Scaling not required. - return false, nil - } - if newRS.Spec.Replicas > deployment.Spec.Replicas { - // Scale down. - scaled, _, err := dc.scaleReplicaSetAndRecordEvent(newRS, deployment.Spec.Replicas, deployment) - return scaled, err - } - newReplicasCount, err := deploymentutil.NewRSNewReplicas(deployment, allRSs, newRS) - if err != nil { - return false, err - } - scaled, _, err := dc.scaleReplicaSetAndRecordEvent(newRS, newReplicasCount, deployment) - return scaled, err -} - -func (dc *DeploymentController) reconcileOldReplicaSets(allRSs []*extensions.ReplicaSet, oldRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) { - oldPodsCount := deploymentutil.GetReplicaCountForReplicaSets(oldRSs) - if oldPodsCount == 0 { - // Can't scale down further - return false, nil - } - - minReadySeconds := deployment.Spec.MinReadySeconds - allPodsCount := deploymentutil.GetReplicaCountForReplicaSets(allRSs) - newRSAvailablePodCount, err := deploymentutil.GetAvailablePodsForReplicaSets(dc.client, []*extensions.ReplicaSet{newRS}, minReadySeconds) - if err != nil { - return false, fmt.Errorf("could not find available pods: %v", err) - } - - _, maxUnavailable, err := deploymentutil.ResolveFenceposts(&deployment.Spec.Strategy.RollingUpdate.MaxSurge, &deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, deployment.Spec.Replicas) - if err != nil { - return false, err - } - - // Check if we can scale down. We can scale down in the following 2 cases: - // * Some old replica sets have unhealthy replicas, we could safely scale down those unhealthy replicas since that won't further - // increase unavailability. - // * New replica set has scaled up and it's replicas becomes ready, then we can scale down old replica sets in a further step. - // - // maxScaledDown := allPodsCount - minAvailable - newReplicaSetPodsUnavailable - // take into account not only maxUnavailable and any surge pods that have been created, but also unavailable pods from - // the newRS, so that the unavailable pods from the newRS would not make us scale down old replica sets in a further - // step(that will increase unavailability). - // - // Concrete example: - // - // * 10 replicas - // * 2 maxUnavailable (absolute number, not percent) - // * 3 maxSurge (absolute number, not percent) - // - // case 1: - // * Deployment is updated, newRS is created with 3 replicas, oldRS is scaled down to 8, and newRS is scaled up to 5. - // * The new replica set pods crashloop and never become available. - // * allPodsCount is 13. minAvailable is 8. newRSPodsUnavailable is 5. - // * A node fails and causes one of the oldRS pods to become unavailable. However, 13 - 8 - 5 = 0, so the oldRS won't be scaled down. - // * The user notices the crashloop and does kubectl rollout undo to rollback. - // * newRSPodsUnavailable is 1, since we rolled back to the good replica set, so maxScaledDown = 13 - 8 - 1 = 4. 4 of the crashlooping pods will be scaled down. - // * The total number of pods will then be 9 and the newRS can be scaled up to 10. - // - // case 2: - // Same example, but pushing a new pod template instead of rolling back (aka "roll over"): - // * The new replica set created must start with 0 replicas because allPodsCount is already at 13. - // * However, newRSPodsUnavailable would also be 0, so the 2 old replica sets could be scaled down by 5 (13 - 8 - 0), which would then - // allow the new replica set to be scaled up by 5. - minAvailable := deployment.Spec.Replicas - maxUnavailable - newRSUnavailablePodCount := newRS.Spec.Replicas - newRSAvailablePodCount - maxScaledDown := allPodsCount - minAvailable - newRSUnavailablePodCount - if maxScaledDown <= 0 { - return false, nil - } - - // Clean up unhealthy replicas first, otherwise unhealthy replicas will block deployment - // and cause timeout. See https://github.com/kubernetes/kubernetes/issues/16737 - oldRSs, cleanupCount, err := dc.cleanupUnhealthyReplicas(oldRSs, deployment, maxScaledDown) - if err != nil { - return false, nil - } - glog.V(4).Infof("Cleaned up unhealthy replicas from old RSes by %d", cleanupCount) - - // Scale down old replica sets, need check maxUnavailable to ensure we can scale down - allRSs = append(oldRSs, newRS) - scaledDownCount, err := dc.scaleDownOldReplicaSetsForRollingUpdate(allRSs, oldRSs, deployment) - if err != nil { - return false, nil - } - glog.V(4).Infof("Scaled down old RSes by %d", scaledDownCount) - - totalScaledDown := cleanupCount + scaledDownCount - return totalScaledDown > 0, nil -} - -// cleanupUnhealthyReplicas will scale down old replica sets with unhealthy replicas, so that all unhealthy replicas will be deleted. -func (dc *DeploymentController) cleanupUnhealthyReplicas(oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment, maxCleanupCount int32) ([]*extensions.ReplicaSet, int32, error) { - sort.Sort(controller.ReplicaSetsByCreationTimestamp(oldRSs)) - // Safely scale down all old replica sets with unhealthy replicas. Replica set will sort the pods in the order - // such that not-ready < ready, unscheduled < scheduled, and pending < running. This ensures that unhealthy replicas will - // been deleted first and won't increase unavailability. - totalScaledDown := int32(0) - for i, targetRS := range oldRSs { - if totalScaledDown >= maxCleanupCount { - break - } - if targetRS.Spec.Replicas == 0 { - // cannot scale down this replica set. - continue - } - readyPodCount, err := deploymentutil.GetAvailablePodsForReplicaSets(dc.client, []*extensions.ReplicaSet{targetRS}, 0) - if err != nil { - return nil, totalScaledDown, fmt.Errorf("could not find available pods: %v", err) - } - if targetRS.Spec.Replicas == readyPodCount { - // no unhealthy replicas found, no scaling required. - continue - } - - scaledDownCount := int32(integer.IntMin(int(maxCleanupCount-totalScaledDown), int(targetRS.Spec.Replicas-readyPodCount))) - newReplicasCount := targetRS.Spec.Replicas - scaledDownCount - if newReplicasCount > targetRS.Spec.Replicas { - return nil, 0, fmt.Errorf("when cleaning up unhealthy replicas, got invalid request to scale down %s/%s %d -> %d", targetRS.Namespace, targetRS.Name, targetRS.Spec.Replicas, newReplicasCount) - } - _, updatedOldRS, err := dc.scaleReplicaSetAndRecordEvent(targetRS, newReplicasCount, deployment) - if err != nil { - return nil, totalScaledDown, err - } - totalScaledDown += scaledDownCount - oldRSs[i] = updatedOldRS - } - return oldRSs, totalScaledDown, nil -} - -// scaleDownOldReplicaSetsForRollingUpdate scales down old replica sets when deployment strategy is "RollingUpdate". -// Need check maxUnavailable to ensure availability -func (dc *DeploymentController) scaleDownOldReplicaSetsForRollingUpdate(allRSs []*extensions.ReplicaSet, oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment) (int32, error) { - _, maxUnavailable, err := deploymentutil.ResolveFenceposts(&deployment.Spec.Strategy.RollingUpdate.MaxSurge, &deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, deployment.Spec.Replicas) - if err != nil { - return 0, err - } - - // Check if we can scale down. - minAvailable := deployment.Spec.Replicas - maxUnavailable - minReadySeconds := deployment.Spec.MinReadySeconds - // Find the number of ready pods. - readyPodCount, err := deploymentutil.GetAvailablePodsForReplicaSets(dc.client, allRSs, minReadySeconds) - if err != nil { - return 0, fmt.Errorf("could not find available pods: %v", err) - } - if readyPodCount <= minAvailable { - // Cannot scale down. - return 0, nil - } - - sort.Sort(controller.ReplicaSetsByCreationTimestamp(oldRSs)) - - totalScaledDown := int32(0) - totalScaleDownCount := readyPodCount - minAvailable - for _, targetRS := range oldRSs { - if totalScaledDown >= totalScaleDownCount { - // No further scaling required. - break - } - if targetRS.Spec.Replicas == 0 { - // cannot scale down this ReplicaSet. - continue - } - // Scale down. - scaleDownCount := int32(integer.IntMin(int(targetRS.Spec.Replicas), int(totalScaleDownCount-totalScaledDown))) - newReplicasCount := targetRS.Spec.Replicas - scaleDownCount - if newReplicasCount > targetRS.Spec.Replicas { - return 0, fmt.Errorf("when scaling down old RS, got invalid request to scale down %s/%s %d -> %d", targetRS.Namespace, targetRS.Name, targetRS.Spec.Replicas, newReplicasCount) - } - _, _, err = dc.scaleReplicaSetAndRecordEvent(targetRS, newReplicasCount, deployment) - if err != nil { - return totalScaledDown, err - } - - totalScaledDown += scaleDownCount - } - - return totalScaledDown, nil -} - -// scaleDownOldReplicaSetsForRecreate scales down old replica sets when deployment strategy is "Recreate" -func (dc *DeploymentController) scaleDownOldReplicaSetsForRecreate(oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) { - scaled := false - for _, rs := range oldRSs { - // Scaling not required. - if rs.Spec.Replicas == 0 { - continue - } - scaledRS, _, err := dc.scaleReplicaSetAndRecordEvent(rs, 0, deployment) - if err != nil { - return false, err - } - if scaledRS { - scaled = true - } - } - return scaled, nil -} - -// scaleUpNewReplicaSetForRecreate scales up new replica set when deployment strategy is "Recreate" -func (dc *DeploymentController) scaleUpNewReplicaSetForRecreate(newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) { - scaled, _, err := dc.scaleReplicaSetAndRecordEvent(newRS, deployment.Spec.Replicas, deployment) - return scaled, err -} - -func (dc *DeploymentController) cleanupOldReplicaSets(oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment) error { - diff := int32(len(oldRSs)) - *deployment.Spec.RevisionHistoryLimit - if diff <= 0 { - return nil - } - - sort.Sort(controller.ReplicaSetsByCreationTimestamp(oldRSs)) - - var errList []error - // TODO: This should be parallelized. - for i := int32(0); i < diff; i++ { - rs := oldRSs[i] - // Avoid delete replica set with non-zero replica counts - if rs.Status.Replicas != 0 || rs.Spec.Replicas != 0 || rs.Generation > rs.Status.ObservedGeneration { - continue - } - if err := dc.client.Extensions().ReplicaSets(rs.Namespace).Delete(rs.Name, nil); err != nil && !errors.IsNotFound(err) { - glog.V(2).Infof("Failed deleting old replica set %v for deployment %v: %v", rs.Name, deployment.Name, err) - errList = append(errList, err) - } - } - - return utilerrors.NewAggregate(errList) -} - -func (dc *DeploymentController) updateDeploymentStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) error { - totalActualReplicas, updatedReplicas, availableReplicas, unavailableReplicas, err := dc.calculateStatus(allRSs, newRS, deployment) - if err != nil { - return err - } - newDeployment := *deployment - // TODO: Reconcile this with API definition. API definition talks about ready pods, while this just computes created pods. - newDeployment.Status = extensions.DeploymentStatus{ - // TODO: Ensure that if we start retrying status updates, we won't pick up a new Generation value. - ObservedGeneration: deployment.Generation, - Replicas: totalActualReplicas, - UpdatedReplicas: updatedReplicas, - AvailableReplicas: availableReplicas, - UnavailableReplicas: unavailableReplicas, - } - _, err = dc.client.Extensions().Deployments(deployment.ObjectMeta.Namespace).UpdateStatus(&newDeployment) - return err -} - -func (dc *DeploymentController) calculateStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (totalActualReplicas, updatedReplicas, availableReplicas, unavailableReplicas int32, err error) { - totalActualReplicas = deploymentutil.GetActualReplicaCountForReplicaSets(allRSs) - updatedReplicas = deploymentutil.GetActualReplicaCountForReplicaSets([]*extensions.ReplicaSet{newRS}) - minReadySeconds := deployment.Spec.MinReadySeconds - availableReplicas, err = deploymentutil.GetAvailablePodsForReplicaSets(dc.client, allRSs, minReadySeconds) - if err != nil { - err = fmt.Errorf("failed to count available pods: %v", err) - return - } - totalReplicas := deploymentutil.GetReplicaCountForReplicaSets(allRSs) - unavailableReplicas = totalReplicas - availableReplicas - return -} - -func (dc *DeploymentController) scaleReplicaSetAndRecordEvent(rs *extensions.ReplicaSet, newScale int32, deployment *extensions.Deployment) (bool, *extensions.ReplicaSet, error) { - // No need to scale - if rs.Spec.Replicas == newScale { - return false, rs, nil - } - var scalingOperation string - if rs.Spec.Replicas < newScale { - scalingOperation = "up" - } else { - scalingOperation = "down" - } - newRS, err := dc.scaleReplicaSet(rs, newScale) - if err == nil { - dc.eventRecorder.Eventf(deployment, api.EventTypeNormal, "ScalingReplicaSet", "Scaled %s replica set %s to %d", scalingOperation, rs.Name, newScale) - } else { - dc.enqueueDeployment(deployment) - } - return true, newRS, err -} - -func (dc *DeploymentController) scaleReplicaSet(rs *extensions.ReplicaSet, newScale int32) (*extensions.ReplicaSet, error) { - // TODO: Using client for now, update to use store when it is ready. - // NOTE: This mutates the ReplicaSet passed in. Not sure if that's a good idea. - rs.Spec.Replicas = newScale - return dc.client.Extensions().ReplicaSets(rs.ObjectMeta.Namespace).Update(rs) -} - -func (dc *DeploymentController) updateDeployment(deployment *extensions.Deployment) (*extensions.Deployment, error) { - // TODO: Using client for now, update to use store when it is ready. - return dc.client.Extensions().Deployments(deployment.ObjectMeta.Namespace).Update(deployment) -} - -func (dc *DeploymentController) rollbackToTemplate(deployment *extensions.Deployment, rs *extensions.ReplicaSet) (d *extensions.Deployment, performedRollback bool, err error) { - if !reflect.DeepEqual(deploymentutil.GetNewReplicaSetTemplate(deployment), rs.Spec.Template) { - glog.Infof("Rolling back deployment %s to template spec %+v", deployment.Name, rs.Spec.Template.Spec) - deploymentutil.SetFromReplicaSetTemplate(deployment, rs.Spec.Template) - // set RS (the old RS we'll rolling back to) annotations back to the deployment; - // otherwise, the deployment's current annotations (should be the same as current new RS) will be copied to the RS after the rollback. - // - // For example, - // A Deployment has old RS1 with annotation {change-cause:create}, and new RS2 {change-cause:edit}. - // Note that both annotations are copied from Deployment, and the Deployment should be annotated {change-cause:edit} as well. - // Now, rollback Deployment to RS1, we should update Deployment's pod-template and also copy annotation from RS1. - // Deployment is now annotated {change-cause:create}, and we have new RS1 {change-cause:create}, old RS2 {change-cause:edit}. - // - // If we don't copy the annotations back from RS to deployment on rollback, the Deployment will stay as {change-cause:edit}, - // and new RS1 becomes {change-cause:edit} (copied from deployment after rollback), old RS2 {change-cause:edit}, which is not correct. - setDeploymentAnnotationsTo(deployment, rs) - performedRollback = true - } else { - glog.V(4).Infof("Rolling back to a revision that contains the same template as current deployment %s, skipping rollback...", deployment.Name) - dc.emitRollbackWarningEvent(deployment, deploymentutil.RollbackTemplateUnchanged, fmt.Sprintf("The rollback revision contains the same template as current deployment %q", deployment.Name)) - } - d, err = dc.updateDeploymentAndClearRollbackTo(deployment) - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller_test.go deleted file mode 100644 index 0dc92fb93..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/deployment/deployment_controller_test.go +++ /dev/null @@ -1,820 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 deployment - -import ( - "fmt" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - exp "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func rs(name string, replicas int, selector map[string]string) *exp.ReplicaSet { - return &exp.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - Spec: exp.ReplicaSetSpec{ - Replicas: int32(replicas), - Selector: &unversioned.LabelSelector{MatchLabels: selector}, - Template: api.PodTemplateSpec{}, - }, - } -} - -func newRSWithStatus(name string, specReplicas, statusReplicas int, selector map[string]string) *exp.ReplicaSet { - rs := rs(name, specReplicas, selector) - rs.Status = exp.ReplicaSetStatus{ - Replicas: int32(statusReplicas), - } - return rs -} - -func deployment(name string, replicas int, maxSurge, maxUnavailable intstr.IntOrString) exp.Deployment { - return exp.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - Spec: exp.DeploymentSpec{ - Replicas: int32(replicas), - Strategy: exp.DeploymentStrategy{ - Type: exp.RollingUpdateDeploymentStrategyType, - RollingUpdate: &exp.RollingUpdateDeployment{ - MaxSurge: maxSurge, - MaxUnavailable: maxUnavailable, - }, - }, - }, - } -} - -var alwaysReady = func() bool { return true } - -func newDeployment(replicas int, revisionHistoryLimit *int) *exp.Deployment { - var v *int32 - if revisionHistoryLimit != nil { - v = new(int32) - *v = int32(*revisionHistoryLimit) - } - d := exp.Deployment{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - UID: util.NewUUID(), - Name: "foobar", - Namespace: api.NamespaceDefault, - ResourceVersion: "18", - }, - Spec: exp.DeploymentSpec{ - Strategy: exp.DeploymentStrategy{ - Type: exp.RollingUpdateDeploymentStrategyType, - RollingUpdate: &exp.RollingUpdateDeployment{}, - }, - Replicas: int32(replicas), - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "name": "foo", - "type": "production", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - }, - }, - }, - }, - RevisionHistoryLimit: v, - }, - } - return &d -} - -func newReplicaSet(d *exp.Deployment, name string, replicas int) *exp.ReplicaSet { - return &exp.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: api.NamespaceDefault, - }, - Spec: exp.ReplicaSetSpec{ - Replicas: int32(replicas), - Template: d.Spec.Template, - }, - } - -} - -func newListOptions() api.ListOptions { - return api.ListOptions{} -} - -func TestDeploymentController_reconcileNewReplicaSet(t *testing.T) { - tests := []struct { - deploymentReplicas int - maxSurge intstr.IntOrString - oldReplicas int - newReplicas int - scaleExpected bool - expectedNewReplicas int - }{ - { - // Should not scale up. - deploymentReplicas: 10, - maxSurge: intstr.FromInt(0), - oldReplicas: 10, - newReplicas: 0, - scaleExpected: false, - }, - { - deploymentReplicas: 10, - maxSurge: intstr.FromInt(2), - oldReplicas: 10, - newReplicas: 0, - scaleExpected: true, - expectedNewReplicas: 2, - }, - { - deploymentReplicas: 10, - maxSurge: intstr.FromInt(2), - oldReplicas: 5, - newReplicas: 0, - scaleExpected: true, - expectedNewReplicas: 7, - }, - { - deploymentReplicas: 10, - maxSurge: intstr.FromInt(2), - oldReplicas: 10, - newReplicas: 2, - scaleExpected: false, - }, - { - // Should scale down. - deploymentReplicas: 10, - maxSurge: intstr.FromInt(2), - oldReplicas: 2, - newReplicas: 11, - scaleExpected: true, - expectedNewReplicas: 10, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - newRS := rs("foo-v2", test.newReplicas, nil) - oldRS := rs("foo-v2", test.oldReplicas, nil) - allRSs := []*exp.ReplicaSet{newRS, oldRS} - deployment := deployment("foo", test.deploymentReplicas, test.maxSurge, intstr.FromInt(0)) - fake := fake.Clientset{} - controller := &DeploymentController{ - client: &fake, - eventRecorder: &record.FakeRecorder{}, - } - scaled, err := controller.reconcileNewReplicaSet(allRSs, newRS, &deployment) - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - if !test.scaleExpected { - if scaled || len(fake.Actions()) > 0 { - t.Errorf("unexpected scaling: %v", fake.Actions()) - } - continue - } - if test.scaleExpected && !scaled { - t.Errorf("expected scaling to occur") - continue - } - if len(fake.Actions()) != 1 { - t.Errorf("expected 1 action during scale, got: %v", fake.Actions()) - continue - } - updated := fake.Actions()[0].(core.UpdateAction).GetObject().(*exp.ReplicaSet) - if e, a := test.expectedNewReplicas, int(updated.Spec.Replicas); e != a { - t.Errorf("expected update to %d replicas, got %d", e, a) - } - } -} - -func TestDeploymentController_reconcileOldReplicaSets(t *testing.T) { - tests := []struct { - deploymentReplicas int - maxUnavailable intstr.IntOrString - oldReplicas int - newReplicas int - readyPodsFromOldRS int - readyPodsFromNewRS int - scaleExpected bool - expectedOldReplicas int - }{ - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(0), - oldReplicas: 10, - newReplicas: 0, - readyPodsFromOldRS: 10, - readyPodsFromNewRS: 0, - scaleExpected: true, - expectedOldReplicas: 9, - }, - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - oldReplicas: 10, - newReplicas: 0, - readyPodsFromOldRS: 10, - readyPodsFromNewRS: 0, - scaleExpected: true, - expectedOldReplicas: 8, - }, - { // expect unhealthy replicas from old replica sets been cleaned up - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - oldReplicas: 10, - newReplicas: 0, - readyPodsFromOldRS: 8, - readyPodsFromNewRS: 0, - scaleExpected: true, - expectedOldReplicas: 8, - }, - { // expect 1 unhealthy replica from old replica sets been cleaned up, and 1 ready pod been scaled down - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - oldReplicas: 10, - newReplicas: 0, - readyPodsFromOldRS: 9, - readyPodsFromNewRS: 0, - scaleExpected: true, - expectedOldReplicas: 8, - }, - { // the unavailable pods from the newRS would not make us scale down old RSs in a further step - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - oldReplicas: 8, - newReplicas: 2, - readyPodsFromOldRS: 8, - readyPodsFromNewRS: 0, - scaleExpected: false, - }, - } - for i, test := range tests { - t.Logf("executing scenario %d", i) - - newSelector := map[string]string{"foo": "new"} - oldSelector := map[string]string{"foo": "old"} - newRS := rs("foo-new", test.newReplicas, newSelector) - oldRS := rs("foo-old", test.oldReplicas, oldSelector) - oldRSs := []*exp.ReplicaSet{oldRS} - allRSs := []*exp.ReplicaSet{oldRS, newRS} - - deployment := deployment("foo", test.deploymentReplicas, intstr.FromInt(0), test.maxUnavailable) - fakeClientset := fake.Clientset{} - fakeClientset.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - switch action.(type) { - case core.ListAction: - podList := &api.PodList{} - for podIndex := 0; podIndex < test.readyPodsFromOldRS; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-oldReadyPod-%d", oldRS.Name, podIndex), - Labels: oldSelector, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionTrue, - }, - }, - }, - }) - } - for podIndex := 0; podIndex < test.oldReplicas-test.readyPodsFromOldRS; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-oldUnhealthyPod-%d", oldRS.Name, podIndex), - Labels: oldSelector, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionFalse, - }, - }, - }, - }) - } - for podIndex := 0; podIndex < test.readyPodsFromNewRS; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-newReadyPod-%d", oldRS.Name, podIndex), - Labels: newSelector, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionTrue, - }, - }, - }, - }) - } - for podIndex := 0; podIndex < test.oldReplicas-test.readyPodsFromOldRS; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-newUnhealthyPod-%d", oldRS.Name, podIndex), - Labels: newSelector, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionFalse, - }, - }, - }, - }) - } - return true, podList, nil - } - return false, nil, nil - }) - controller := &DeploymentController{ - client: &fakeClientset, - eventRecorder: &record.FakeRecorder{}, - } - - scaled, err := controller.reconcileOldReplicaSets(allRSs, oldRSs, newRS, &deployment) - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - if !test.scaleExpected && scaled { - t.Errorf("unexpected scaling: %v", fakeClientset.Actions()) - } - if test.scaleExpected && !scaled { - t.Errorf("expected scaling to occur") - continue - } - continue - } -} - -func TestDeploymentController_cleanupUnhealthyReplicas(t *testing.T) { - tests := []struct { - oldReplicas int - readyPods int - unHealthyPods int - maxCleanupCount int - cleanupCountExpected int - }{ - { - oldReplicas: 10, - readyPods: 8, - unHealthyPods: 2, - maxCleanupCount: 1, - cleanupCountExpected: 1, - }, - { - oldReplicas: 10, - readyPods: 8, - unHealthyPods: 2, - maxCleanupCount: 3, - cleanupCountExpected: 2, - }, - { - oldReplicas: 10, - readyPods: 8, - unHealthyPods: 2, - maxCleanupCount: 0, - cleanupCountExpected: 0, - }, - { - oldReplicas: 10, - readyPods: 10, - unHealthyPods: 0, - maxCleanupCount: 3, - cleanupCountExpected: 0, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - oldRS := rs("foo-v2", test.oldReplicas, nil) - oldRSs := []*exp.ReplicaSet{oldRS} - deployment := deployment("foo", 10, intstr.FromInt(2), intstr.FromInt(2)) - fakeClientset := fake.Clientset{} - fakeClientset.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - switch action.(type) { - case core.ListAction: - podList := &api.PodList{} - for podIndex := 0; podIndex < test.readyPods; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-readyPod-%d", oldRS.Name, podIndex), - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionTrue, - }, - }, - }, - }) - } - for podIndex := 0; podIndex < test.unHealthyPods; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-unHealthyPod-%d", oldRS.Name, podIndex), - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionFalse, - }, - }, - }, - }) - } - return true, podList, nil - } - return false, nil, nil - }) - - controller := &DeploymentController{ - client: &fakeClientset, - eventRecorder: &record.FakeRecorder{}, - } - _, cleanupCount, err := controller.cleanupUnhealthyReplicas(oldRSs, &deployment, int32(test.maxCleanupCount)) - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - if int(cleanupCount) != test.cleanupCountExpected { - t.Errorf("expected %v unhealthy replicas been cleaned up, got %v", test.cleanupCountExpected, cleanupCount) - continue - } - } -} - -func TestDeploymentController_scaleDownOldReplicaSetsForRollingUpdate(t *testing.T) { - tests := []struct { - deploymentReplicas int - maxUnavailable intstr.IntOrString - readyPods int - oldReplicas int - scaleExpected bool - expectedOldReplicas int - }{ - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(0), - readyPods: 10, - oldReplicas: 10, - scaleExpected: true, - expectedOldReplicas: 9, - }, - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - readyPods: 10, - oldReplicas: 10, - scaleExpected: true, - expectedOldReplicas: 8, - }, - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - readyPods: 8, - oldReplicas: 10, - scaleExpected: false, - }, - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - readyPods: 10, - oldReplicas: 0, - scaleExpected: false, - }, - { - deploymentReplicas: 10, - maxUnavailable: intstr.FromInt(2), - readyPods: 1, - oldReplicas: 10, - scaleExpected: false, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - oldRS := rs("foo-v2", test.oldReplicas, nil) - allRSs := []*exp.ReplicaSet{oldRS} - oldRSs := []*exp.ReplicaSet{oldRS} - deployment := deployment("foo", test.deploymentReplicas, intstr.FromInt(0), test.maxUnavailable) - fakeClientset := fake.Clientset{} - fakeClientset.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - switch action.(type) { - case core.ListAction: - podList := &api.PodList{} - for podIndex := 0; podIndex < test.readyPods; podIndex++ { - podList.Items = append(podList.Items, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s-pod-%d", oldRS.Name, podIndex), - Labels: map[string]string{"foo": "bar"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionTrue, - }, - }, - }, - }) - } - return true, podList, nil - } - return false, nil, nil - }) - controller := &DeploymentController{ - client: &fakeClientset, - eventRecorder: &record.FakeRecorder{}, - } - scaled, err := controller.scaleDownOldReplicaSetsForRollingUpdate(allRSs, oldRSs, &deployment) - if err != nil { - t.Errorf("unexpected error: %v", err) - continue - } - if !test.scaleExpected { - if scaled != 0 { - t.Errorf("unexpected scaling: %v", fakeClientset.Actions()) - } - continue - } - if test.scaleExpected && scaled == 0 { - t.Errorf("expected scaling to occur; actions: %v", fakeClientset.Actions()) - continue - } - // There are both list and update actions logged, so extract the update - // action for verification. - var updateAction core.UpdateAction - for _, action := range fakeClientset.Actions() { - switch a := action.(type) { - case core.UpdateAction: - if updateAction != nil { - t.Errorf("expected only 1 update action; had %v and found %v", updateAction, a) - } else { - updateAction = a - } - } - } - if updateAction == nil { - t.Errorf("expected an update action") - continue - } - updated := updateAction.GetObject().(*exp.ReplicaSet) - if e, a := test.expectedOldReplicas, int(updated.Spec.Replicas); e != a { - t.Errorf("expected update to %d replicas, got %d", e, a) - } - } -} - -func TestDeploymentController_cleanupOldReplicaSets(t *testing.T) { - selector := map[string]string{"foo": "bar"} - - tests := []struct { - oldRSs []*exp.ReplicaSet - revisionHistoryLimit int - expectedDeletions int - }{ - { - oldRSs: []*exp.ReplicaSet{ - newRSWithStatus("foo-1", 0, 0, selector), - newRSWithStatus("foo-2", 0, 0, selector), - newRSWithStatus("foo-3", 0, 0, selector), - }, - revisionHistoryLimit: 1, - expectedDeletions: 2, - }, - { - // Only delete the replica set with Spec.Replicas = Status.Replicas = 0. - oldRSs: []*exp.ReplicaSet{ - newRSWithStatus("foo-1", 0, 0, selector), - newRSWithStatus("foo-2", 0, 1, selector), - newRSWithStatus("foo-3", 1, 0, selector), - newRSWithStatus("foo-4", 1, 1, selector), - }, - revisionHistoryLimit: 0, - expectedDeletions: 1, - }, - - { - oldRSs: []*exp.ReplicaSet{ - newRSWithStatus("foo-1", 0, 0, selector), - newRSWithStatus("foo-2", 0, 0, selector), - }, - revisionHistoryLimit: 0, - expectedDeletions: 2, - }, - { - oldRSs: []*exp.ReplicaSet{ - newRSWithStatus("foo-1", 1, 1, selector), - newRSWithStatus("foo-2", 1, 1, selector), - }, - revisionHistoryLimit: 0, - expectedDeletions: 0, - }, - } - - for i, test := range tests { - fake := &fake.Clientset{} - controller := NewDeploymentController(fake, controller.NoResyncPeriodFunc) - - controller.eventRecorder = &record.FakeRecorder{} - controller.rsStoreSynced = alwaysReady - controller.podStoreSynced = alwaysReady - for _, rs := range test.oldRSs { - controller.rsStore.Add(rs) - } - - d := newDeployment(1, &tests[i].revisionHistoryLimit) - controller.cleanupOldReplicaSets(test.oldRSs, d) - - gotDeletions := 0 - for _, action := range fake.Actions() { - if "delete" == action.GetVerb() { - gotDeletions++ - } - } - if gotDeletions != test.expectedDeletions { - t.Errorf("expect %v old replica sets been deleted, but got %v", test.expectedDeletions, gotDeletions) - continue - } - } -} - -func getKey(d *exp.Deployment, t *testing.T) string { - if key, err := controller.KeyFunc(d); err != nil { - t.Errorf("Unexpected error getting key for deployment %v: %v", d.Name, err) - return "" - } else { - return key - } -} - -type fixture struct { - t *testing.T - - client *fake.Clientset - // Objects to put in the store. - dStore []*exp.Deployment - rsStore []*exp.ReplicaSet - podStore []*api.Pod - - // Actions expected to happen on the client. Objects from here are also - // preloaded into NewSimpleFake. - actions []core.Action - objects *api.List -} - -func (f *fixture) expectUpdateDeploymentAction(d *exp.Deployment) { - f.actions = append(f.actions, core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "deployments"}, d.Namespace, d)) - f.objects.Items = append(f.objects.Items, d) -} - -func (f *fixture) expectCreateRSAction(rs *exp.ReplicaSet) { - f.actions = append(f.actions, core.NewCreateAction(unversioned.GroupVersionResource{Resource: "replicasets"}, rs.Namespace, rs)) - f.objects.Items = append(f.objects.Items, rs) -} - -func (f *fixture) expectUpdateRSAction(rs *exp.ReplicaSet) { - f.actions = append(f.actions, core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "replicasets"}, rs.Namespace, rs)) - f.objects.Items = append(f.objects.Items, rs) -} - -func (f *fixture) expectListPodAction(namespace string, opt api.ListOptions) { - f.actions = append(f.actions, core.NewListAction(unversioned.GroupVersionResource{Resource: "pods"}, namespace, opt)) -} - -func newFixture(t *testing.T) *fixture { - f := &fixture{} - f.t = t - f.objects = &api.List{} - return f -} - -func (f *fixture) run(deploymentName string) { - f.client = fake.NewSimpleClientset(f.objects) - c := NewDeploymentController(f.client, controller.NoResyncPeriodFunc) - c.eventRecorder = &record.FakeRecorder{} - c.rsStoreSynced = alwaysReady - c.podStoreSynced = alwaysReady - for _, d := range f.dStore { - c.dStore.Store.Add(d) - } - for _, rs := range f.rsStore { - c.rsStore.Store.Add(rs) - } - for _, pod := range f.podStore { - c.podStore.Indexer.Add(pod) - } - - err := c.syncDeployment(deploymentName) - if err != nil { - f.t.Errorf("error syncing deployment: %v", err) - } - - actions := f.client.Actions() - for i, action := range actions { - if len(f.actions) < i+1 { - f.t.Errorf("%d unexpected actions: %+v", len(actions)-len(f.actions), actions[i:]) - break - } - - expectedAction := f.actions[i] - if !expectedAction.Matches(action.GetVerb(), action.GetResource().Resource) { - f.t.Errorf("Expected\n\t%#v\ngot\n\t%#v", expectedAction, action) - continue - } - } - - if len(f.actions) > len(actions) { - f.t.Errorf("%d additional expected actions:%+v", len(f.actions)-len(actions), f.actions[len(actions):]) - } -} - -func TestSyncDeploymentCreatesReplicaSet(t *testing.T) { - f := newFixture(t) - - d := newDeployment(1, nil) - f.dStore = append(f.dStore, d) - - // expect that one ReplicaSet with zero replicas is created - // then is updated to 1 replica - rs := newReplicaSet(d, "deploymentrs-4186632231", 0) - updatedRS := newReplicaSet(d, "deploymentrs-4186632231", 1) - opt := newListOptions() - - f.expectCreateRSAction(rs) - f.expectUpdateDeploymentAction(d) - f.expectUpdateRSAction(updatedRS) - f.expectListPodAction(rs.Namespace, opt) - f.expectUpdateDeploymentAction(d) - - f.run(getKey(d, t)) -} - -// issue: https://github.com/kubernetes/kubernetes/issues/23218 -func TestDeploymentController_dontSyncDeploymentsWithEmptyPodSelector(t *testing.T) { - fake := &fake.Clientset{} - controller := NewDeploymentController(fake, controller.NoResyncPeriodFunc) - - controller.eventRecorder = &record.FakeRecorder{} - controller.rsStoreSynced = alwaysReady - controller.podStoreSynced = alwaysReady - - d := newDeployment(1, nil) - empty := unversioned.LabelSelector{} - d.Spec.Selector = &empty - controller.dStore.Store.Add(d) - // We expect the deployment controller to not take action here since it's configuration - // is invalid, even though no replicasets exist that match it's selector. - controller.syncDeployment(fmt.Sprintf("%s/%s", d.ObjectMeta.Namespace, d.ObjectMeta.Name)) - if len(fake.Actions()) == 0 { - return - } - for _, action := range fake.Actions() { - t.Logf("unexpected action: %#v", action) - } - t.Errorf("expected deployment controller to not take action") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/doc.go deleted file mode 100644 index c51ec6518..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 provides EndpointController implementation -// to manage and sync service endpoints. -package endpoint diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller.go deleted file mode 100644 index 5bb9119f9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller.go +++ /dev/null @@ -1,500 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// CAUTION: If you update code in this file, you may need to also update code -// in contrib/mesos/pkg/service/endpoints_controller.go -package endpoint - -import ( - "reflect" - "time" - - "encoding/json" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/endpoints" - "k8s.io/kubernetes/pkg/api/errors" - podutil "k8s.io/kubernetes/pkg/api/pod" - utilpod "k8s.io/kubernetes/pkg/api/pod" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/controller/framework/informers" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - // We'll attempt to recompute EVERY service's endpoints at least this - // often. Higher numbers = lower CPU/network load; lower numbers = - // shorter amount of time before a mistaken endpoint is corrected. - FullServiceResyncPeriod = 30 * time.Second - - // We must avoid syncing service until the pod store has synced. If it hasn't synced, to - // avoid a hot loop, we'll wait this long between checks. - PodStoreSyncedPollPeriod = 100 * time.Millisecond -) - -var ( - keyFunc = framework.DeletionHandlingMetaNamespaceKeyFunc -) - -// NewEndpointController returns a new *EndpointController. -func NewEndpointController(podInformer framework.SharedIndexInformer, client *clientset.Clientset) *EndpointController { - if client != nil && client.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("endpoint_controller", client.Core().GetRESTClient().GetRateLimiter()) - } - e := &EndpointController{ - client: client, - queue: workqueue.New(), - } - - e.serviceStore.Store, e.serviceController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return e.client.Core().Services(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return e.client.Core().Services(api.NamespaceAll).Watch(options) - }, - }, - &api.Service{}, - // TODO: Can we have much longer period here? - FullServiceResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: e.enqueueService, - UpdateFunc: func(old, cur interface{}) { - e.enqueueService(cur) - }, - DeleteFunc: e.enqueueService, - }, - ) - - podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - AddFunc: e.addPod, - UpdateFunc: e.updatePod, - DeleteFunc: e.deletePod, - }) - e.podStore.Indexer = podInformer.GetIndexer() - e.podController = podInformer.GetController() - e.podStoreSynced = podInformer.HasSynced - - return e -} - -// NewEndpointControllerFromClient returns a new *EndpointController that runs its own informer. -func NewEndpointControllerFromClient(client *clientset.Clientset, resyncPeriod controller.ResyncPeriodFunc) *EndpointController { - podInformer := informers.CreateSharedPodIndexInformer(client, resyncPeriod()) - e := NewEndpointController(podInformer, client) - e.internalPodInformer = podInformer - - return e -} - -// EndpointController manages selector-based service endpoints. -type EndpointController struct { - client *clientset.Clientset - - serviceStore cache.StoreToServiceLister - podStore cache.StoreToPodLister - - // internalPodInformer is used to hold a personal informer. If we're using - // a normal shared informer, then the informer will be started for us. If - // we have a personal informer, we must start it ourselves. If you start - // the controller using NewEndpointController(passing SharedInformer), this - // will be null - internalPodInformer framework.SharedIndexInformer - - // Services that need to be updated. A channel is inappropriate here, - // because it allows services with lots of pods to be serviced much - // more often than services with few pods; it also would cause a - // service that's inserted multiple times to be processed more than - // necessary. - queue *workqueue.Type - - // Since we join two objects, we'll watch both of them with - // controllers. - serviceController *framework.Controller - podController framework.ControllerInterface - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool -} - -// Runs e; will not return until stopCh is closed. workers determines how many -// endpoints will be handled in parallel. -func (e *EndpointController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go e.serviceController.Run(stopCh) - go e.podController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(e.worker, time.Second, stopCh) - } - go func() { - defer utilruntime.HandleCrash() - time.Sleep(5 * time.Minute) // give time for our cache to fill - e.checkLeftoverEndpoints() - }() - - if e.internalPodInformer != nil { - go e.internalPodInformer.Run(stopCh) - } - - <-stopCh - e.queue.ShutDown() -} - -func (e *EndpointController) getPodServiceMemberships(pod *api.Pod) (sets.String, error) { - set := sets.String{} - services, err := e.serviceStore.GetPodServices(pod) - if err != nil { - // don't log this error because this function makes pointless - // errors when no services match. - return set, nil - } - for i := range services { - key, err := keyFunc(&services[i]) - if err != nil { - return nil, err - } - set.Insert(key) - } - return set, nil -} - -// When a pod is added, figure out what services it will be a member of and -// enqueue them. obj must have *api.Pod type. -func (e *EndpointController) addPod(obj interface{}) { - pod := obj.(*api.Pod) - services, err := e.getPodServiceMemberships(pod) - if err != nil { - glog.Errorf("Unable to get pod %v/%v's service memberships: %v", pod.Namespace, pod.Name, err) - return - } - for key := range services { - e.queue.Add(key) - } -} - -// When a pod is updated, figure out what services it used to be a member of -// and what services it will be a member of, and enqueue the union of these. -// old and cur must be *api.Pod types. -func (e *EndpointController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - return - } - newPod := old.(*api.Pod) - services, err := e.getPodServiceMemberships(newPod) - if err != nil { - glog.Errorf("Unable to get pod %v/%v's service memberships: %v", newPod.Namespace, newPod.Name, err) - return - } - - oldPod := cur.(*api.Pod) - // Only need to get the old services if the labels changed. - if !reflect.DeepEqual(newPod.Labels, oldPod.Labels) || - !hostNameAndDomainAreEqual(newPod, oldPod) { - oldServices, err := e.getPodServiceMemberships(oldPod) - if err != nil { - glog.Errorf("Unable to get pod %v/%v's service memberships: %v", oldPod.Namespace, oldPod.Name, err) - return - } - services = services.Union(oldServices) - } - for key := range services { - e.queue.Add(key) - } -} - -func hostNameAndDomainAreEqual(pod1, pod2 *api.Pod) bool { - return getHostname(pod1) == getHostname(pod2) && - getSubdomain(pod1) == getSubdomain(pod2) -} - -func getHostname(pod *api.Pod) string { - if len(pod.Spec.Hostname) > 0 { - return pod.Spec.Hostname - } - if pod.Annotations != nil { - return pod.Annotations[utilpod.PodHostnameAnnotation] - } - return "" -} - -func getSubdomain(pod *api.Pod) string { - if len(pod.Spec.Subdomain) > 0 { - return pod.Spec.Subdomain - } - if pod.Annotations != nil { - return pod.Annotations[utilpod.PodSubdomainAnnotation] - } - return "" -} - -// When a pod is deleted, enqueue the services the pod used to be a member of. -// obj could be an *api.Pod, or a DeletionFinalStateUnknown marker item. -func (e *EndpointController) deletePod(obj interface{}) { - if _, ok := obj.(*api.Pod); ok { - // Enqueue all the services that the pod used to be a member - // of. This happens to be exactly the same thing we do when a - // pod is added. - e.addPod(obj) - return - } - podKey, err := keyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - } - glog.Infof("Pod %q was deleted but we don't have a record of its final state, so it will take up to %v before it will be removed from all endpoint records.", podKey, FullServiceResyncPeriod) - - // TODO: keep a map of pods to services to handle this condition. -} - -// obj could be an *api.Service, or a DeletionFinalStateUnknown marker item. -func (e *EndpointController) enqueueService(obj interface{}) { - key, err := keyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - } - - e.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and -// marks them done. You may run as many of these in parallel as you wish; the -// workqueue guarantees that they will not end up processing the same service -// at the same time. -func (e *EndpointController) worker() { - for { - func() { - key, quit := e.queue.Get() - if quit { - return - } - // Use defer: in the unlikely event that there's a - // panic, we'd still like this to get marked done-- - // otherwise the controller will not be able to sync - // this service again until it is restarted. - defer e.queue.Done(key) - e.syncService(key.(string)) - }() - } -} - -func (e *EndpointController) syncService(key string) { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing service %q endpoints. (%v)", key, time.Now().Sub(startTime)) - }() - - if !e.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(PodStoreSyncedPollPeriod) - glog.Infof("Waiting for pods controller to sync, requeuing rc %v", key) - e.queue.Add(key) - return - } - - obj, exists, err := e.serviceStore.Store.GetByKey(key) - if err != nil || !exists { - // Delete the corresponding endpoint, as the service has been deleted. - // TODO: Please note that this will delete an endpoint when a - // service is deleted. However, if we're down at the time when - // the service is deleted, we will miss that deletion, so this - // doesn't completely solve the problem. See #6877. - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - glog.Errorf("Need to delete endpoint with key %q, but couldn't understand the key: %v", key, err) - // Don't retry, as the key isn't going to magically become understandable. - return - } - err = e.client.Endpoints(namespace).Delete(name, nil) - if err != nil && !errors.IsNotFound(err) { - glog.Errorf("Error deleting endpoint %q: %v", key, err) - e.queue.Add(key) // Retry - } - return - } - - service := obj.(*api.Service) - if service.Spec.Selector == nil { - // services without a selector receive no endpoints from this controller; - // these services will receive the endpoints that are created out-of-band via the REST API. - return - } - - glog.V(5).Infof("About to update endpoints for service %q", key) - pods, err := e.podStore.Pods(service.Namespace).List(labels.Set(service.Spec.Selector).AsSelector()) - if err != nil { - // Since we're getting stuff from a local cache, it is - // basically impossible to get this error. - glog.Errorf("Error syncing service %q: %v", key, err) - e.queue.Add(key) // Retry - return - } - - subsets := []api.EndpointSubset{} - podHostNames := map[string]endpoints.HostRecord{} - - for i := range pods.Items { - pod := &pods.Items[i] - - for i := range service.Spec.Ports { - servicePort := &service.Spec.Ports[i] - - portName := servicePort.Name - portProto := servicePort.Protocol - portNum, err := podutil.FindPort(pod, servicePort) - if err != nil { - glog.V(4).Infof("Failed to find port for service %s/%s: %v", service.Namespace, service.Name, err) - continue - } - if len(pod.Status.PodIP) == 0 { - glog.V(5).Infof("Failed to find an IP for pod %s/%s", pod.Namespace, pod.Name) - continue - } - if pod.DeletionTimestamp != nil { - glog.V(5).Infof("Pod is being deleted %s/%s", pod.Namespace, pod.Name) - continue - } - - epp := api.EndpointPort{Name: portName, Port: int32(portNum), Protocol: portProto} - epa := api.EndpointAddress{ - IP: pod.Status.PodIP, - TargetRef: &api.ObjectReference{ - Kind: "Pod", - Namespace: pod.ObjectMeta.Namespace, - Name: pod.ObjectMeta.Name, - UID: pod.ObjectMeta.UID, - ResourceVersion: pod.ObjectMeta.ResourceVersion, - }} - - hostname := getHostname(pod) - if len(hostname) > 0 && - getSubdomain(pod) == service.Name && - service.Namespace == pod.Namespace { - hostRecord := endpoints.HostRecord{ - HostName: hostname, - } - // TODO: stop populating podHostNames annotation in 1.4 - podHostNames[string(pod.Status.PodIP)] = hostRecord - epa.Hostname = hostname - } - - if api.IsPodReady(pod) { - subsets = append(subsets, api.EndpointSubset{ - Addresses: []api.EndpointAddress{epa}, - Ports: []api.EndpointPort{epp}, - }) - } else { - glog.V(5).Infof("Pod is out of service: %v/%v", pod.Namespace, pod.Name) - subsets = append(subsets, api.EndpointSubset{ - NotReadyAddresses: []api.EndpointAddress{epa}, - Ports: []api.EndpointPort{epp}, - }) - } - } - } - subsets = endpoints.RepackSubsets(subsets) - - // See if there's actually an update here. - currentEndpoints, err := e.client.Endpoints(service.Namespace).Get(service.Name) - if err != nil { - if errors.IsNotFound(err) { - currentEndpoints = &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: service.Name, - Labels: service.Labels, - }, - } - } else { - glog.Errorf("Error getting endpoints: %v", err) - e.queue.Add(key) // Retry - return - } - } - - serializedPodHostNames := "" - if len(podHostNames) > 0 { - b, err := json.Marshal(podHostNames) - if err != nil { - glog.Errorf("Error updating endpoints. Marshalling of hostnames failed.: %v", err) - e.queue.Add(key) // Retry - return - } - serializedPodHostNames = string(b) - } - - newAnnotations := make(map[string]string) - newAnnotations[endpoints.PodHostnamesAnnotation] = serializedPodHostNames - if reflect.DeepEqual(currentEndpoints.Subsets, subsets) && - reflect.DeepEqual(currentEndpoints.Labels, service.Labels) { - glog.V(5).Infof("endpoints are equal for %s/%s, skipping update", service.Namespace, service.Name) - return - } - newEndpoints := currentEndpoints - newEndpoints.Subsets = subsets - newEndpoints.Labels = service.Labels - if newEndpoints.Annotations == nil { - newEndpoints.Annotations = make(map[string]string) - } - if len(serializedPodHostNames) == 0 { - delete(newEndpoints.Annotations, endpoints.PodHostnamesAnnotation) - } else { - newEndpoints.Annotations[endpoints.PodHostnamesAnnotation] = serializedPodHostNames - } - if len(currentEndpoints.ResourceVersion) == 0 { - // No previous endpoints, create them - _, err = e.client.Endpoints(service.Namespace).Create(newEndpoints) - } else { - // Pre-existing - _, err = e.client.Endpoints(service.Namespace).Update(newEndpoints) - } - if err != nil { - glog.Errorf("Error updating endpoints: %v", err) - e.queue.Add(key) // Retry - } -} - -// checkLeftoverEndpoints lists all currently existing endpoints and adds their -// service to the queue. This will detect endpoints that exist with no -// corresponding service; these endpoints need to be deleted. We only need to -// do this once on startup, because in steady-state these are detected (but -// some stragglers could have been left behind if the endpoint controller -// reboots). -func (e *EndpointController) checkLeftoverEndpoints() { - list, err := e.client.Endpoints(api.NamespaceAll).List(api.ListOptions{}) - if err != nil { - glog.Errorf("Unable to list endpoints (%v); orphaned endpoints will not be cleaned up. (They're pretty harmless, but you can restart this component if you want another attempt made.)", err) - return - } - for i := range list.Items { - ep := &list.Items[i] - key, err := keyFunc(ep) - if err != nil { - glog.Errorf("Unable to get key for endpoint %#v", ep) - continue - } - e.queue.Add(key) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller_test.go deleted file mode 100644 index e4097eb16..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/endpoint/endpoints_controller_test.go +++ /dev/null @@ -1,566 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 endpoint - -import ( - "fmt" - "net/http" - "net/http/httptest" - "testing" - - "k8s.io/kubernetes/pkg/api" - endptspkg "k8s.io/kubernetes/pkg/api/endpoints" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - _ "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" - utiltesting "k8s.io/kubernetes/pkg/util/testing" -) - -var alwaysReady = func() bool { return true } - -func addPods(store cache.Store, namespace string, nPods int, nPorts int, nNotReady int) { - for i := 0; i < nPods+nNotReady; i++ { - p := &api.Pod{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - Namespace: namespace, - Name: fmt.Sprintf("pod%d", i), - Labels: map[string]string{"foo": "bar"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{{Ports: []api.ContainerPort{}}}, - }, - Status: api.PodStatus{ - PodIP: fmt.Sprintf("1.2.3.%d", 4+i), - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: api.ConditionTrue, - }, - }, - }, - } - if i >= nPods { - p.Status.Conditions[0].Status = api.ConditionFalse - } - for j := 0; j < nPorts; j++ { - p.Spec.Containers[0].Ports = append(p.Spec.Containers[0].Ports, - api.ContainerPort{Name: fmt.Sprintf("port%d", i), ContainerPort: int32(8080 + j)}) - } - store.Add(p) - } -} - -type serverResponse struct { - statusCode int - obj interface{} -} - -func makeTestServer(t *testing.T, namespace string, endpointsResponse serverResponse) (*httptest.Server, *utiltesting.FakeHandler) { - fakeEndpointsHandler := utiltesting.FakeHandler{ - StatusCode: endpointsResponse.statusCode, - ResponseBody: runtime.EncodeOrDie(testapi.Default.Codec(), endpointsResponse.obj.(runtime.Object)), - } - mux := http.NewServeMux() - mux.Handle(testapi.Default.ResourcePath("endpoints", namespace, ""), &fakeEndpointsHandler) - mux.Handle(testapi.Default.ResourcePath("endpoints/", namespace, ""), &fakeEndpointsHandler) - mux.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) { - t.Errorf("unexpected request: %v", req.RequestURI) - res.WriteHeader(http.StatusNotFound) - }) - return httptest.NewServer(mux), &fakeEndpointsHandler -} - -func TestSyncEndpointsItemsPreserveNoSelector(t *testing.T) { - ns := api.NamespaceDefault - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{Ports: []api.ServicePort{{Port: 80}}}, - }) - endpoints.syncService(ns + "/foo") - endpointsHandler.ValidateRequestCount(t, 0) -} - -func TestCheckLeftoverEndpoints(t *testing.T) { - ns := api.NamespaceDefault - // Note that this requests *all* endpoints, therefore the NamespaceAll - // below. - testServer, _ := makeTestServer(t, api.NamespaceAll, - serverResponse{http.StatusOK, &api.EndpointsList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "1", - }, - Items: []api.Endpoints{{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000}}, - }}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - endpoints.checkLeftoverEndpoints() - - if e, a := 1, endpoints.queue.Len(); e != a { - t.Fatalf("Expected %v, got %v", e, a) - } - got, _ := endpoints.queue.Get() - if e, a := ns+"/foo", got; e != a { - t.Errorf("Expected %v, got %v", e, a) - } -} - -func TestSyncEndpointsProtocolTCP(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000, Protocol: "TCP"}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - - addPods(endpoints.podStore.Indexer, ns, 1, 1, 0) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - Ports: []api.ServicePort{{Port: 80, TargetPort: intstr.FromInt(8080), Protocol: "TCP"}}, - }, - }) - endpoints.syncService(ns + "/foo") - endpointsHandler.ValidateRequestCount(t, 2) - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsProtocolUDP(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000, Protocol: "UDP"}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 1, 1, 0) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - Ports: []api.ServicePort{{Port: 80, TargetPort: intstr.FromInt(8080), Protocol: "UDP"}}, - }, - }) - endpoints.syncService(ns + "/foo") - endpointsHandler.ValidateRequestCount(t, 2) - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "UDP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsItemsEmptySelectorSelectsAll(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 1, 1, 0) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsItemsEmptySelectorSelectsAllNotReady(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 0, 1, 1) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsItemsEmptySelectorSelectsAllMixed(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 1, 1, 1) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - NotReadyAddresses: []api.EndpointAddress{{IP: "1.2.3.5", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod1", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsItemsPreexisting(t *testing.T) { - ns := "bar" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 1, 1, 0) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"foo": "bar"}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} - -func TestSyncEndpointsItemsPreexistingIdentical(t *testing.T) { - ns := api.NamespaceDefault - testServer, endpointsHandler := makeTestServer(t, api.NamespaceDefault, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "1", - Name: "foo", - Namespace: ns, - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, api.NamespaceDefault, 1, 1, 0) - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: api.NamespaceDefault}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"foo": "bar"}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", api.NamespaceDefault, "foo"), "GET", nil) -} - -func TestSyncEndpointsItems(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{}}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 3, 2, 0) - addPods(endpoints.podStore.Indexer, "blah", 5, 2, 0) // make sure these aren't found! - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: ns}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"foo": "bar"}, - Ports: []api.ServicePort{ - {Name: "port0", Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}, - {Name: "port1", Port: 88, Protocol: "TCP", TargetPort: intstr.FromInt(8088)}, - }, - }, - }) - endpoints.syncService("other/foo") - expectedSubsets := []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}, - {IP: "1.2.3.5", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod1", Namespace: ns}}, - {IP: "1.2.3.6", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod2", Namespace: ns}}, - }, - Ports: []api.EndpointPort{ - {Name: "port0", Port: 8080, Protocol: "TCP"}, - {Name: "port1", Port: 8088, Protocol: "TCP"}, - }, - }} - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "", - }, - Subsets: endptspkg.SortSubsets(expectedSubsets), - }) - // endpointsHandler should get 2 requests - one for "GET" and the next for "POST". - endpointsHandler.ValidateRequestCount(t, 2) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, ""), "POST", &data) -} - -func TestSyncEndpointsItemsWithLabels(t *testing.T) { - ns := "other" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{}}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 3, 2, 0) - serviceLabels := map[string]string{"foo": "bar"} - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - Labels: serviceLabels, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"foo": "bar"}, - Ports: []api.ServicePort{ - {Name: "port0", Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}, - {Name: "port1", Port: 88, Protocol: "TCP", TargetPort: intstr.FromInt(8088)}, - }, - }, - }) - endpoints.syncService(ns + "/foo") - expectedSubsets := []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{ - {IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}, - {IP: "1.2.3.5", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod1", Namespace: ns}}, - {IP: "1.2.3.6", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod2", Namespace: ns}}, - }, - Ports: []api.EndpointPort{ - {Name: "port0", Port: 8080, Protocol: "TCP"}, - {Name: "port1", Port: 8088, Protocol: "TCP"}, - }, - }} - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "", - Labels: serviceLabels, - }, - Subsets: endptspkg.SortSubsets(expectedSubsets), - }) - // endpointsHandler should get 2 requests - one for "GET" and the next for "POST". - endpointsHandler.ValidateRequestCount(t, 2) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, ""), "POST", &data) -} - -func TestSyncEndpointsItemsPreexistingLabelsChange(t *testing.T) { - ns := "bar" - testServer, endpointsHandler := makeTestServer(t, ns, - serverResponse{http.StatusOK, &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - Labels: map[string]string{ - "foo": "bar", - }, - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "6.7.8.9"}}, - Ports: []api.EndpointPort{{Port: 1000}}, - }}, - }}) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - endpoints := NewEndpointControllerFromClient(client, controller.NoResyncPeriodFunc) - endpoints.podStoreSynced = alwaysReady - addPods(endpoints.podStore.Indexer, ns, 1, 1, 0) - serviceLabels := map[string]string{"baz": "blah"} - endpoints.serviceStore.Store.Add(&api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - Labels: serviceLabels, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{"foo": "bar"}, - Ports: []api.ServicePort{{Port: 80, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}}, - }, - }) - endpoints.syncService(ns + "/foo") - data := runtime.EncodeOrDie(testapi.Default.Codec(), &api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: ns, - ResourceVersion: "1", - Labels: serviceLabels, - }, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "1.2.3.4", TargetRef: &api.ObjectReference{Kind: "Pod", Name: "pod0", Namespace: ns}}}, - Ports: []api.EndpointPort{{Port: 8080, Protocol: "TCP"}}, - }}, - }) - endpointsHandler.ValidateRequest(t, testapi.Default.ResourcePath("endpoints", ns, "foo"), "PUT", &data) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/controller_test.go deleted file mode 100644 index fb132f8f3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/controller_test.go +++ /dev/null @@ -1,408 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 framework_test - -import ( - "fmt" - "math/rand" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - - "github.com/google/gofuzz" -) - -func Example() { - // source simulates an apiserver object endpoint. - source := framework.NewFakeControllerSource() - - // This will hold the downstream state, as we know it. - downstream := cache.NewStore(framework.DeletionHandlingMetaNamespaceKeyFunc) - - // This will hold incoming changes. Note how we pass downstream in as a - // KeyLister, that way resync operations will result in the correct set - // of update/delete deltas. - fifo := cache.NewDeltaFIFO(cache.MetaNamespaceKeyFunc, nil, downstream) - - // Let's do threadsafe output to get predictable test results. - deletionCounter := make(chan string, 1000) - - cfg := &framework.Config{ - Queue: fifo, - ListerWatcher: source, - ObjectType: &api.Pod{}, - FullResyncPeriod: time.Millisecond * 100, - RetryOnError: false, - - // Let's implement a simple controller that just deletes - // everything that comes in. - Process: func(obj interface{}) error { - // Obj is from the Pop method of the Queue we make above. - newest := obj.(cache.Deltas).Newest() - - if newest.Type != cache.Deleted { - // Update our downstream store. - err := downstream.Add(newest.Object) - if err != nil { - return err - } - - // Delete this object. - source.Delete(newest.Object.(runtime.Object)) - } else { - // Update our downstream store. - err := downstream.Delete(newest.Object) - if err != nil { - return err - } - - // fifo's KeyOf is easiest, because it handles - // DeletedFinalStateUnknown markers. - key, err := fifo.KeyOf(newest.Object) - if err != nil { - return err - } - - // Report this deletion. - deletionCounter <- key - } - return nil - }, - } - - // Create the controller and run it until we close stop. - stop := make(chan struct{}) - defer close(stop) - go framework.New(cfg).Run(stop) - - // Let's add a few objects to the source. - testIDs := []string{"a-hello", "b-controller", "c-framework"} - for _, name := range testIDs { - // Note that these pods are not valid-- the fake source doesn't - // call validation or anything. - source.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: name}}) - } - - // Let's wait for the controller to process the things we just added. - outputSet := sets.String{} - for i := 0; i < len(testIDs); i++ { - outputSet.Insert(<-deletionCounter) - } - - for _, key := range outputSet.List() { - fmt.Println(key) - } - // Output: - // a-hello - // b-controller - // c-framework -} - -func ExampleInformer() { - // source simulates an apiserver object endpoint. - source := framework.NewFakeControllerSource() - - // Let's do threadsafe output to get predictable test results. - deletionCounter := make(chan string, 1000) - - // Make a controller that immediately deletes anything added to it, and - // logs anything deleted. - _, controller := framework.NewInformer( - source, - &api.Pod{}, - time.Millisecond*100, - framework.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - source.Delete(obj.(runtime.Object)) - }, - DeleteFunc: func(obj interface{}) { - key, err := framework.DeletionHandlingMetaNamespaceKeyFunc(obj) - if err != nil { - key = "oops something went wrong with the key" - } - - // Report this deletion. - deletionCounter <- key - }, - }, - ) - - // Run the controller and run it until we close stop. - stop := make(chan struct{}) - defer close(stop) - go controller.Run(stop) - - // Let's add a few objects to the source. - testIDs := []string{"a-hello", "b-controller", "c-framework"} - for _, name := range testIDs { - // Note that these pods are not valid-- the fake source doesn't - // call validation or anything. - source.Add(&api.Pod{ObjectMeta: api.ObjectMeta{Name: name}}) - } - - // Let's wait for the controller to process the things we just added. - outputSet := sets.String{} - for i := 0; i < len(testIDs); i++ { - outputSet.Insert(<-deletionCounter) - } - - for _, key := range outputSet.List() { - fmt.Println(key) - } - // Output: - // a-hello - // b-controller - // c-framework -} - -func TestHammerController(t *testing.T) { - // This test executes a bunch of requests through the fake source and - // controller framework to make sure there's no locking/threading - // errors. If an error happens, it should hang forever or trigger the - // race detector. - - // source simulates an apiserver object endpoint. - source := framework.NewFakeControllerSource() - - // Let's do threadsafe output to get predictable test results. - outputSetLock := sync.Mutex{} - // map of key to operations done on the key - outputSet := map[string][]string{} - - recordFunc := func(eventType string, obj interface{}) { - key, err := framework.DeletionHandlingMetaNamespaceKeyFunc(obj) - if err != nil { - t.Errorf("something wrong with key: %v", err) - key = "oops something went wrong with the key" - } - - // Record some output when items are deleted. - outputSetLock.Lock() - defer outputSetLock.Unlock() - outputSet[key] = append(outputSet[key], eventType) - } - - // Make a controller which just logs all the changes it gets. - _, controller := framework.NewInformer( - source, - &api.Pod{}, - time.Millisecond*100, - framework.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { recordFunc("add", obj) }, - UpdateFunc: func(oldObj, newObj interface{}) { recordFunc("update", newObj) }, - DeleteFunc: func(obj interface{}) { recordFunc("delete", obj) }, - }, - ) - - if controller.HasSynced() { - t.Errorf("Expected HasSynced() to return false before we started the controller") - } - - // Run the controller and run it until we close stop. - stop := make(chan struct{}) - go controller.Run(stop) - - // Let's wait for the controller to do its initial sync - wait.Poll(100*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - return controller.HasSynced(), nil - }) - if !controller.HasSynced() { - t.Errorf("Expected HasSynced() to return true after the initial sync") - } - - wg := sync.WaitGroup{} - const threads = 3 - wg.Add(threads) - for i := 0; i < threads; i++ { - go func() { - defer wg.Done() - // Let's add a few objects to the source. - currentNames := sets.String{} - rs := rand.NewSource(rand.Int63()) - f := fuzz.New().NilChance(.5).NumElements(0, 2).RandSource(rs) - r := rand.New(rs) // Mustn't use r and f concurrently! - for i := 0; i < 100; i++ { - var name string - var isNew bool - if currentNames.Len() == 0 || r.Intn(3) == 1 { - f.Fuzz(&name) - isNew = true - } else { - l := currentNames.List() - name = l[r.Intn(len(l))] - } - - pod := &api.Pod{} - f.Fuzz(pod) - pod.ObjectMeta.Name = name - pod.ObjectMeta.Namespace = "default" - // Add, update, or delete randomly. - // Note that these pods are not valid-- the fake source doesn't - // call validation or perform any other checking. - if isNew { - currentNames.Insert(name) - source.Add(pod) - continue - } - switch r.Intn(2) { - case 0: - currentNames.Insert(name) - source.Modify(pod) - case 1: - currentNames.Delete(name) - source.Delete(pod) - } - } - }() - } - wg.Wait() - - // Let's wait for the controller to finish processing the things we just added. - // TODO: look in the queue to see how many items need to be processed. - time.Sleep(100 * time.Millisecond) - close(stop) - - outputSetLock.Lock() - t.Logf("got: %#v", outputSet) -} - -func TestUpdate(t *testing.T) { - // This test is going to exercise the various paths that result in a - // call to update. - - // source simulates an apiserver object endpoint. - source := framework.NewFakeControllerSource() - - const ( - FROM = "from" - ADD_MISSED = "missed the add event" - TO = "to" - ) - - // These are the transitions we expect to see; because this is - // asynchronous, there are a lot of valid possibilities. - type pair struct{ from, to string } - allowedTransitions := map[pair]bool{ - pair{FROM, TO}: true, - pair{FROM, ADD_MISSED}: true, - pair{ADD_MISSED, TO}: true, - - // Because a resync can happen when we've already observed one - // of the above but before the item is deleted. - pair{TO, TO}: true, - // Because a resync could happen before we observe an update. - pair{FROM, FROM}: true, - } - - pod := func(name, check string, final bool) *api.Pod { - p := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Labels: map[string]string{"check": check}, - }, - } - if final { - p.Labels["final"] = "true" - } - return p - } - deletePod := func(p *api.Pod) bool { - return p.Labels["final"] == "true" - } - - tests := []func(string){ - func(name string) { - name = "a-" + name - source.Add(pod(name, FROM, false)) - source.Modify(pod(name, TO, true)) - }, - func(name string) { - name = "b-" + name - source.Add(pod(name, FROM, false)) - source.ModifyDropWatch(pod(name, TO, true)) - }, - func(name string) { - name = "c-" + name - source.AddDropWatch(pod(name, FROM, false)) - source.Modify(pod(name, ADD_MISSED, false)) - source.Modify(pod(name, TO, true)) - }, - func(name string) { - name = "d-" + name - source.Add(pod(name, FROM, true)) - }, - } - - const threads = 3 - - var testDoneWG sync.WaitGroup - testDoneWG.Add(threads * len(tests)) - - // Make a controller that deletes things once it observes an update. - // It calls Done() on the wait group on deletions so we can tell when - // everything we've added has been deleted. - _, controller := framework.NewInformer( - source, - &api.Pod{}, - time.Millisecond*1, - framework.ResourceEventHandlerFuncs{ - UpdateFunc: func(oldObj, newObj interface{}) { - o, n := oldObj.(*api.Pod), newObj.(*api.Pod) - from, to := o.Labels["check"], n.Labels["check"] - if !allowedTransitions[pair{from, to}] { - t.Errorf("observed transition %q -> %q for %v", from, to, n.Name) - } - if deletePod(n) { - source.Delete(n) - } - }, - DeleteFunc: func(obj interface{}) { - testDoneWG.Done() - }, - }, - ) - - // Run the controller and run it until we close stop. - // Once Run() is called, calls to testDoneWG.Done() might start, so - // all testDoneWG.Add() calls must happen before this point - stop := make(chan struct{}) - go controller.Run(stop) - - // run every test a few times, in parallel - var wg sync.WaitGroup - wg.Add(threads * len(tests)) - for i := 0; i < threads; i++ { - for j, f := range tests { - go func(name string, f func(string)) { - defer wg.Done() - f(name) - }(fmt.Sprintf("%v-%v", i, j), f) - } - } - wg.Wait() - - // Let's wait for the controller to process the things we just added. - testDoneWG.Wait() - close(stop) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/fake_controller_source_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/fake_controller_source_test.go deleted file mode 100644 index 01269ce64..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/fake_controller_source_test.go +++ /dev/null @@ -1,94 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 framework - -import ( - "sync" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/watch" -) - -// ensure the watch delivers the requested and only the requested items. -func consume(t *testing.T, w watch.Interface, rvs []string, done *sync.WaitGroup) { - defer done.Done() - for _, rv := range rvs { - got, ok := <-w.ResultChan() - if !ok { - t.Errorf("%#v: unexpected channel close, wanted %v", rvs, rv) - return - } - gotRV := got.Object.(*api.Pod).ObjectMeta.ResourceVersion - if e, a := rv, gotRV; e != a { - t.Errorf("wanted %v, got %v", e, a) - } else { - t.Logf("Got %v as expected", gotRV) - } - } - // We should not get anything else. - got, open := <-w.ResultChan() - if open { - t.Errorf("%#v: unwanted object %#v", rvs, got) - } -} - -func TestRCNumber(t *testing.T) { - pod := func(name string) *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - } - } - - wg := &sync.WaitGroup{} - wg.Add(3) - - source := NewFakeControllerSource() - source.Add(pod("foo")) - source.Modify(pod("foo")) - source.Modify(pod("foo")) - - w, err := source.Watch(api.ListOptions{ResourceVersion: "1"}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - go consume(t, w, []string{"2", "3"}, wg) - - list, err := source.List(api.ListOptions{}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if e, a := "3", list.(*api.List).ResourceVersion; e != a { - t.Errorf("wanted %v, got %v", e, a) - } - - w2, err := source.Watch(api.ListOptions{ResourceVersion: "2"}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - go consume(t, w2, []string{"3"}, wg) - - w3, err := source.Watch(api.ListOptions{ResourceVersion: "3"}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - go consume(t, w3, []string{}, wg) - source.Shutdown() - wg.Wait() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/informers/factory.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/informers/factory.go deleted file mode 100644 index 3c3472cc5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/framework/informers/factory.go +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 informers - -import ( - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/watch" -) - -// CreateSharedPodInformer returns a SharedIndexInformer that lists and watches all pods -func CreateSharedPodInformer(client clientset.Interface, resyncPeriod time.Duration) framework.SharedIndexInformer { - sharedInformer := framework.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return client.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return client.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - resyncPeriod, - cache.Indexers{}, - ) - - return sharedInformer -} - -// CreateSharedPodIndexInformer returns a SharedIndexInformer that lists and watches all pods -func CreateSharedPodIndexInformer(client clientset.Interface, resyncPeriod time.Duration) framework.SharedIndexInformer { - sharedIndexInformer := framework.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return client.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return client.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - resyncPeriod, - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - - return sharedIndexInformer -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/doc.go deleted file mode 100644 index db08e7a36..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/doc.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 gc contains a very simple pod "garbage collector" implementation, -// GCController, that runs in the controller manager. If the number of pods -// in terminated phases (right now either Failed or Succeeded) surpasses a -// configurable threshold, the controller will delete pods in terminated state -// until the system reaches the allowed threshold again. The GCController -// prioritizes pods to delete by sorting by creation timestamp and deleting the -// oldest objects first. The GCController will not delete non-terminated pods. -package gc diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller.go deleted file mode 100644 index 485c326c1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 gc - -import ( - "sort" - "sync" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -const ( - gcCheckPeriod = 20 * time.Second -) - -type GCController struct { - kubeClient clientset.Interface - podStore cache.StoreToPodLister - podStoreSyncer *framework.Controller - deletePod func(namespace, name string) error - threshold int -} - -func New(kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, threshold int) *GCController { - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("gc_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - gcc := &GCController{ - kubeClient: kubeClient, - threshold: threshold, - deletePod: func(namespace, name string) error { - return kubeClient.Core().Pods(namespace).Delete(name, api.NewDeleteOptions(0)) - }, - } - - terminatedSelector := fields.ParseSelectorOrDie("status.phase!=" + string(api.PodPending) + ",status.phase!=" + string(api.PodRunning) + ",status.phase!=" + string(api.PodUnknown)) - - gcc.podStore.Indexer, gcc.podStoreSyncer = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - options.FieldSelector = terminatedSelector - return gcc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - options.FieldSelector = terminatedSelector - return gcc.kubeClient.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - resyncPeriod(), - framework.ResourceEventHandlerFuncs{}, - // We don't need to build a index for podStore here actually, but build one for consistency. - // It will ensure that if people start making use of the podStore in more specific ways, - // they'll get the benefits they expect. It will also reserve the name for future refactorings. - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - return gcc -} - -func (gcc *GCController) Run(stop <-chan struct{}) { - go gcc.podStoreSyncer.Run(stop) - go wait.Until(gcc.gc, gcCheckPeriod, stop) - <-stop -} - -func (gcc *GCController) gc() { - terminatedPods, _ := gcc.podStore.List(labels.Everything()) - terminatedPodCount := len(terminatedPods) - sort.Sort(byCreationTimestamp(terminatedPods)) - - deleteCount := terminatedPodCount - gcc.threshold - - if deleteCount > terminatedPodCount { - deleteCount = terminatedPodCount - } - if deleteCount > 0 { - glog.Infof("garbage collecting %v pods", deleteCount) - } - - var wait sync.WaitGroup - for i := 0; i < deleteCount; i++ { - wait.Add(1) - go func(namespace string, name string) { - defer wait.Done() - if err := gcc.deletePod(namespace, name); err != nil { - // ignore not founds - defer utilruntime.HandleError(err) - } - }(terminatedPods[i].Namespace, terminatedPods[i].Name) - } - wait.Wait() -} - -// byCreationTimestamp sorts a list by creation timestamp, using their names as a tie breaker. -type byCreationTimestamp []*api.Pod - -func (o byCreationTimestamp) Len() int { return len(o) } -func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller_test.go deleted file mode 100644 index e28c9cf03..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/gc/gc_controller_test.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 gc - -import ( - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/util/sets" -) - -func TestGC(t *testing.T) { - type nameToPhase struct { - name string - phase api.PodPhase - } - - testCases := []struct { - pods []nameToPhase - threshold int - deletedPodNames sets.String - }{ - { - pods: []nameToPhase{ - {name: "a", phase: api.PodFailed}, - {name: "b", phase: api.PodSucceeded}, - }, - threshold: 0, - deletedPodNames: sets.NewString("a", "b"), - }, - { - pods: []nameToPhase{ - {name: "a", phase: api.PodFailed}, - {name: "b", phase: api.PodSucceeded}, - }, - threshold: 1, - deletedPodNames: sets.NewString("a"), - }, - { - pods: []nameToPhase{ - {name: "a", phase: api.PodFailed}, - {name: "b", phase: api.PodSucceeded}, - }, - threshold: 5, - deletedPodNames: sets.NewString(), - }, - } - - for i, test := range testCases { - client := fake.NewSimpleClientset() - gcc := New(client, controller.NoResyncPeriodFunc, test.threshold) - deletedPodNames := make([]string, 0) - var lock sync.Mutex - gcc.deletePod = func(_, name string) error { - lock.Lock() - defer lock.Unlock() - deletedPodNames = append(deletedPodNames, name) - return nil - } - - creationTime := time.Unix(0, 0) - for _, pod := range test.pods { - creationTime = creationTime.Add(1 * time.Hour) - gcc.podStore.Indexer.Add(&api.Pod{ - ObjectMeta: api.ObjectMeta{Name: pod.name, CreationTimestamp: unversioned.Time{Time: creationTime}}, - Status: api.PodStatus{Phase: pod.phase}, - }) - } - - gcc.gc() - - pass := true - for _, pod := range deletedPodNames { - if !test.deletedPodNames.Has(pod) { - pass = false - } - } - if len(deletedPodNames) != len(test.deletedPodNames) { - pass = false - } - if !pass { - t.Errorf("[%v]pod's deleted expected and actual did not match.\n\texpected: %v\n\tactual: %v", i, test.deletedPodNames, deletedPodNames) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller.go deleted file mode 100644 index 964a4ec14..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller.go +++ /dev/null @@ -1,582 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 job - -import ( - "reflect" - "sort" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/controller/framework/informers" - replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -type JobController struct { - kubeClient clientset.Interface - podControl controller.PodControlInterface - - // internalPodInformer is used to hold a personal informer. If we're using - // a normal shared informer, then the informer will be started for us. If - // we have a personal informer, we must start it ourselves. If you start - // the controller using NewJobController(passing SharedInformer), this - // will be null - internalPodInformer framework.SharedInformer - - // To allow injection of updateJobStatus for testing. - updateHandler func(job *batch.Job) error - syncHandler func(jobKey string) error - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool - - // A TTLCache of pod creates/deletes each rc expects to see - expectations controller.ControllerExpectationsInterface - - // A store of job, populated by the jobController - jobStore cache.StoreToJobLister - // Watches changes to all jobs - jobController *framework.Controller - - // A store of pods, populated by the podController - podStore cache.StoreToPodLister - - // Jobs that need to be updated - queue *workqueue.Type - - recorder record.EventRecorder -} - -func NewJobController(podInformer framework.SharedIndexInformer, kubeClient clientset.Interface) *JobController { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - // TODO: remove the wrapper when every clients have moved to use the clientset. - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("job_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - jm := &JobController{ - kubeClient: kubeClient, - podControl: controller.RealPodControl{ - KubeClient: kubeClient, - Recorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "job-controller"}), - }, - expectations: controller.NewControllerExpectations(), - queue: workqueue.New(), - recorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "job-controller"}), - } - - jm.jobStore.Store, jm.jobController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return jm.kubeClient.Batch().Jobs(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return jm.kubeClient.Batch().Jobs(api.NamespaceAll).Watch(options) - }, - }, - &batch.Job{}, - // TODO: Can we have much longer period here? - replicationcontroller.FullControllerResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: jm.enqueueController, - UpdateFunc: func(old, cur interface{}) { - if job := cur.(*batch.Job); !isJobFinished(job) { - jm.enqueueController(job) - } - }, - DeleteFunc: jm.enqueueController, - }, - ) - - podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - AddFunc: jm.addPod, - UpdateFunc: jm.updatePod, - DeleteFunc: jm.deletePod, - }) - jm.podStore.Indexer = podInformer.GetIndexer() - jm.podStoreSynced = podInformer.HasSynced - - jm.updateHandler = jm.updateJobStatus - jm.syncHandler = jm.syncJob - return jm -} - -func NewJobControllerFromClient(kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc) *JobController { - podInformer := informers.CreateSharedPodIndexInformer(kubeClient, resyncPeriod()) - jm := NewJobController(podInformer, kubeClient) - jm.internalPodInformer = podInformer - - return jm -} - -// Run the main goroutine responsible for watching and syncing jobs. -func (jm *JobController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go jm.jobController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(jm.worker, time.Second, stopCh) - } - - if jm.internalPodInformer != nil { - go jm.internalPodInformer.Run(stopCh) - } - - <-stopCh - glog.Infof("Shutting down Job Manager") - jm.queue.ShutDown() -} - -// getPodJob returns the job managing the given pod. -func (jm *JobController) getPodJob(pod *api.Pod) *batch.Job { - jobs, err := jm.jobStore.GetPodJobs(pod) - if err != nil { - glog.V(4).Infof("No jobs found for pod %v, job controller will avoid syncing", pod.Name) - return nil - } - if len(jobs) > 1 { - glog.Errorf("user error! more than one job is selecting pods with labels: %+v", pod.Labels) - sort.Sort(byCreationTimestamp(jobs)) - } - return &jobs[0] -} - -// When a pod is created, enqueue the controller that manages it and update it's expectations. -func (jm *JobController) addPod(obj interface{}) { - pod := obj.(*api.Pod) - if pod.DeletionTimestamp != nil { - // on a restart of the controller controller, it's possible a new pod shows up in a state that - // is already pending deletion. Prevent the pod from being a creation observation. - jm.deletePod(pod) - return - } - if job := jm.getPodJob(pod); job != nil { - jobKey, err := controller.KeyFunc(job) - if err != nil { - glog.Errorf("Couldn't get key for job %#v: %v", job, err) - return - } - jm.expectations.CreationObserved(jobKey) - jm.enqueueController(job) - } -} - -// When a pod is updated, figure out what job/s manage it and wake them up. -// If the labels of the pod have changed we need to awaken both the old -// and new job. old and cur must be *api.Pod types. -func (jm *JobController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - // A periodic relist will send update events for all known pods. - return - } - curPod := cur.(*api.Pod) - if curPod.DeletionTimestamp != nil { - // when a pod is deleted gracefully it's deletion timestamp is first modified to reflect a grace period, - // and after such time has passed, the kubelet actually deletes it from the store. We receive an update - // for modification of the deletion timestamp and expect an job to create more pods asap, not wait - // until the kubelet actually deletes the pod. - jm.deletePod(curPod) - return - } - if job := jm.getPodJob(curPod); job != nil { - jm.enqueueController(job) - } - oldPod := old.(*api.Pod) - // Only need to get the old job if the labels changed. - if !reflect.DeepEqual(curPod.Labels, oldPod.Labels) { - // If the old and new job are the same, the first one that syncs - // will set expectations preventing any damage from the second. - if oldJob := jm.getPodJob(oldPod); oldJob != nil { - jm.enqueueController(oldJob) - } - } -} - -// When a pod is deleted, enqueue the job that manages the pod and update its expectations. -// obj could be an *api.Pod, or a DeletionFinalStateUnknown marker item. -func (jm *JobController) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new job will not be woken up till the periodic resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a pod %+v", obj) - return - } - } - if job := jm.getPodJob(pod); job != nil { - jobKey, err := controller.KeyFunc(job) - if err != nil { - glog.Errorf("Couldn't get key for job %#v: %v", job, err) - return - } - jm.expectations.DeletionObserved(jobKey) - jm.enqueueController(job) - } -} - -// obj could be an *batch.Job, or a DeletionFinalStateUnknown marker item. -func (jm *JobController) enqueueController(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - return - } - - // TODO: Handle overlapping controllers better. Either disallow them at admission time or - // deterministically avoid syncing controllers that fight over pods. Currently, we only - // ensure that the same controller is synced for a given pod. When we periodically relist - // all controllers there will still be some replica instability. One way to handle this is - // by querying the store for all controllers that this rc overlaps, as well as all - // controllers that overlap this rc, and sorting them. - jm.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (jm *JobController) worker() { - for { - func() { - key, quit := jm.queue.Get() - if quit { - return - } - defer jm.queue.Done(key) - err := jm.syncHandler(key.(string)) - if err != nil { - glog.Errorf("Error syncing job: %v", err) - } - }() - } -} - -// syncJob will sync the job with the given key if it has had its expectations fulfilled, meaning -// it did not expect to see any more of its pods created or deleted. This function is not meant to be invoked -// concurrently with the same key. -func (jm *JobController) syncJob(key string) error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing job %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !jm.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(replicationcontroller.PodStoreSyncedPollPeriod) - glog.V(4).Infof("Waiting for pods controller to sync, requeuing job %v", key) - jm.queue.Add(key) - return nil - } - - obj, exists, err := jm.jobStore.Store.GetByKey(key) - if !exists { - glog.V(4).Infof("Job has been deleted: %v", key) - jm.expectations.DeleteExpectations(key) - return nil - } - if err != nil { - glog.Errorf("Unable to retrieve job %v from store: %v", key, err) - jm.queue.Add(key) - return err - } - job := *obj.(*batch.Job) - - // Check the expectations of the job before counting active pods, otherwise a new pod can sneak in - // and update the expectations after we've retrieved active pods from the store. If a new pod enters - // the store after we've checked the expectation, the job sync is just deferred till the next relist. - jobKey, err := controller.KeyFunc(&job) - if err != nil { - glog.Errorf("Couldn't get key for job %#v: %v", job, err) - return err - } - jobNeedsSync := jm.expectations.SatisfiedExpectations(jobKey) - selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector) - podList, err := jm.podStore.Pods(job.Namespace).List(selector) - if err != nil { - glog.Errorf("Error getting pods for job %q: %v", key, err) - jm.queue.Add(key) - return err - } - - activePods := controller.FilterActivePods(podList.Items) - active := int32(len(activePods)) - succeeded, failed := getStatus(podList.Items) - conditions := len(job.Status.Conditions) - if job.Status.StartTime == nil { - now := unversioned.Now() - job.Status.StartTime = &now - } - // if job was finished previously, we don't want to redo the termination - if isJobFinished(&job) { - return nil - } - if pastActiveDeadline(&job) { - // TODO: below code should be replaced with pod termination resulting in - // pod failures, rather than killing pods. Unfortunately none such solution - // exists ATM. There's an open discussion in the topic in - // https://github.com/kubernetes/kubernetes/issues/14602 which might give - // some sort of solution to above problem. - // kill remaining active pods - wait := sync.WaitGroup{} - wait.Add(int(active)) - for i := int32(0); i < active; i++ { - go func(ix int32) { - defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name, &job); err != nil { - defer utilruntime.HandleError(err) - } - }(i) - } - wait.Wait() - // update status values accordingly - failed += active - active = 0 - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobFailed, "DeadlineExceeded", "Job was active longer than specified deadline")) - jm.recorder.Event(&job, api.EventTypeNormal, "DeadlineExceeded", "Job was active longer than specified deadline") - } else { - if jobNeedsSync { - active = jm.manageJob(activePods, succeeded, &job) - } - completions := succeeded - complete := false - if job.Spec.Completions == nil { - // This type of job is complete when any pod exits with success. - // Each pod is capable of - // determining whether or not the entire Job is done. Subsequent pods are - // not expected to fail, but if they do, the failure is ignored. Once any - // pod succeeds, the controller waits for remaining pods to finish, and - // then the job is complete. - if succeeded > 0 && active == 0 { - complete = true - } - } else { - // Job specifies a number of completions. This type of job signals - // success by having that number of successes. Since we do not - // start more pods than there are remaining completions, there should - // not be any remaining active pods once this count is reached. - if completions >= *job.Spec.Completions { - complete = true - if active > 0 { - jm.recorder.Event(&job, api.EventTypeWarning, "TooManyActivePods", "Too many active pods running after completion count reached") - } - if completions > *job.Spec.Completions { - jm.recorder.Event(&job, api.EventTypeWarning, "TooManySucceededPods", "Too many succeeded pods running after completion count reached") - } - } - } - if complete { - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobComplete, "", "")) - now := unversioned.Now() - job.Status.CompletionTime = &now - } - } - - // no need to update the job if the status hasn't changed since last time - if job.Status.Active != active || job.Status.Succeeded != succeeded || job.Status.Failed != failed || len(job.Status.Conditions) != conditions { - job.Status.Active = active - job.Status.Succeeded = succeeded - job.Status.Failed = failed - - if err := jm.updateHandler(&job); err != nil { - glog.Errorf("Failed to update job %v, requeuing. Error: %v", job.Name, err) - jm.enqueueController(&job) - } - } - return nil -} - -// pastActiveDeadline checks if job has ActiveDeadlineSeconds field set and if it is exceeded. -func pastActiveDeadline(job *batch.Job) bool { - if job.Spec.ActiveDeadlineSeconds == nil || job.Status.StartTime == nil { - return false - } - now := unversioned.Now() - start := job.Status.StartTime.Time - duration := now.Time.Sub(start) - allowedDuration := time.Duration(*job.Spec.ActiveDeadlineSeconds) * time.Second - return duration >= allowedDuration -} - -func newCondition(conditionType batch.JobConditionType, reason, message string) batch.JobCondition { - return batch.JobCondition{ - Type: conditionType, - Status: api.ConditionTrue, - LastProbeTime: unversioned.Now(), - LastTransitionTime: unversioned.Now(), - Reason: reason, - Message: message, - } -} - -// getStatus returns no of succeeded and failed pods running a job -func getStatus(pods []api.Pod) (succeeded, failed int32) { - succeeded = int32(filterPods(pods, api.PodSucceeded)) - failed = int32(filterPods(pods, api.PodFailed)) - return -} - -// manageJob is the core method responsible for managing the number of running -// pods according to what is specified in the job.Spec. -func (jm *JobController) manageJob(activePods []*api.Pod, succeeded int32, job *batch.Job) int32 { - var activeLock sync.Mutex - active := int32(len(activePods)) - parallelism := *job.Spec.Parallelism - jobKey, err := controller.KeyFunc(job) - if err != nil { - glog.Errorf("Couldn't get key for job %#v: %v", job, err) - return 0 - } - - if active > parallelism { - diff := active - parallelism - jm.expectations.ExpectDeletions(jobKey, int(diff)) - glog.V(4).Infof("Too many pods running job %q, need %d, deleting %d", jobKey, parallelism, diff) - // Sort the pods in the order such that not-ready < ready, unscheduled - // < scheduled, and pending < running. This ensures that we delete pods - // in the earlier stages whenever possible. - sort.Sort(controller.ActivePods(activePods)) - - active -= diff - wait := sync.WaitGroup{} - wait.Add(int(diff)) - for i := int32(0); i < diff; i++ { - go func(ix int32) { - defer wait.Done() - if err := jm.podControl.DeletePod(job.Namespace, activePods[ix].Name, job); err != nil { - defer utilruntime.HandleError(err) - // Decrement the expected number of deletes because the informer won't observe this deletion - jm.expectations.DeletionObserved(jobKey) - activeLock.Lock() - active++ - activeLock.Unlock() - } - }(i) - } - wait.Wait() - - } else if active < parallelism { - wantActive := int32(0) - if job.Spec.Completions == nil { - // Job does not specify a number of completions. Therefore, number active - // should be equal to parallelism, unless the job has seen at least - // once success, in which leave whatever is running, running. - if succeeded > 0 { - wantActive = active - } else { - wantActive = parallelism - } - } else { - // Job specifies a specific number of completions. Therefore, number - // active should not ever exceed number of remaining completions. - wantActive = *job.Spec.Completions - succeeded - if wantActive > parallelism { - wantActive = parallelism - } - } - diff := wantActive - active - if diff < 0 { - glog.Errorf("More active than wanted: job %q, want %d, have %d", jobKey, wantActive, active) - diff = 0 - } - jm.expectations.ExpectCreations(jobKey, int(diff)) - glog.V(4).Infof("Too few pods running job %q, need %d, creating %d", jobKey, wantActive, diff) - - active += diff - wait := sync.WaitGroup{} - wait.Add(int(diff)) - for i := int32(0); i < diff; i++ { - go func() { - defer wait.Done() - if err := jm.podControl.CreatePods(job.Namespace, &job.Spec.Template, job); err != nil { - defer utilruntime.HandleError(err) - // Decrement the expected number of creates because the informer won't observe this pod - jm.expectations.CreationObserved(jobKey) - activeLock.Lock() - active-- - activeLock.Unlock() - } - }() - } - wait.Wait() - } - - return active -} - -func (jm *JobController) updateJobStatus(job *batch.Job) error { - _, err := jm.kubeClient.Batch().Jobs(job.Namespace).UpdateStatus(job) - return err -} - -// filterPods returns pods based on their phase. -func filterPods(pods []api.Pod, phase api.PodPhase) int { - result := 0 - for i := range pods { - if phase == pods[i].Status.Phase { - result++ - } - } - return result -} - -func isJobFinished(j *batch.Job) bool { - for _, c := range j.Status.Conditions { - if (c.Type == batch.JobComplete || c.Type == batch.JobFailed) && c.Status == api.ConditionTrue { - return true - } - } - return false -} - -// byCreationTimestamp sorts a list by creation timestamp, using their names as a tie breaker. -type byCreationTimestamp []batch.Job - -func (o byCreationTimestamp) Len() int { return len(o) } -func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller_test.go deleted file mode 100644 index 95f0432b6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/controller_test.go +++ /dev/null @@ -1,711 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 job - -import ( - "fmt" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/util/rand" - "k8s.io/kubernetes/pkg/watch" -) - -var alwaysReady = func() bool { return true } - -func newJob(parallelism, completions int32) *batch.Job { - j := &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foobar", - Namespace: api.NamespaceDefault, - }, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - {Image: "foo/bar"}, - }, - }, - }, - }, - } - // Special case: -1 for either completions or parallelism means leave nil (negative is not allowed - // in practice by validation. - if completions >= 0 { - j.Spec.Completions = &completions - } else { - j.Spec.Completions = nil - } - if parallelism >= 0 { - j.Spec.Parallelism = ¶llelism - } else { - j.Spec.Parallelism = nil - } - return j -} - -func getKey(job *batch.Job, t *testing.T) string { - if key, err := controller.KeyFunc(job); err != nil { - t.Errorf("Unexpected error getting key for job %v: %v", job.Name, err) - return "" - } else { - return key - } -} - -// create count pods with the given phase for the given job -func newPodList(count int32, status api.PodPhase, job *batch.Job) []api.Pod { - pods := []api.Pod{} - for i := int32(0); i < count; i++ { - newPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("pod-%v", rand.String(10)), - Labels: job.Spec.Selector.MatchLabels, - Namespace: job.Namespace, - }, - Status: api.PodStatus{Phase: status}, - } - pods = append(pods, newPod) - } - return pods -} - -func TestControllerSyncJob(t *testing.T) { - testCases := map[string]struct { - // job setup - parallelism int32 - completions int32 - - // pod setup - podControllerError error - activePods int32 - succeededPods int32 - failedPods int32 - - // expectations - expectedCreations int32 - expectedDeletions int32 - expectedActive int32 - expectedSucceeded int32 - expectedFailed int32 - expectedComplete bool - }{ - "job start": { - 2, 5, - nil, 0, 0, 0, - 2, 0, 2, 0, 0, false, - }, - "WQ job start": { - 2, -1, - nil, 0, 0, 0, - 2, 0, 2, 0, 0, false, - }, - "correct # of pods": { - 2, 5, - nil, 2, 0, 0, - 0, 0, 2, 0, 0, false, - }, - "WQ job: correct # of pods": { - 2, -1, - nil, 2, 0, 0, - 0, 0, 2, 0, 0, false, - }, - "too few active pods": { - 2, 5, - nil, 1, 1, 0, - 1, 0, 2, 1, 0, false, - }, - "too few active pods with a dynamic job": { - 2, -1, - nil, 1, 0, 0, - 1, 0, 2, 0, 0, false, - }, - "too few active pods, with controller error": { - 2, 5, - fmt.Errorf("Fake error"), 1, 1, 0, - 0, 0, 1, 1, 0, false, - }, - "too many active pods": { - 2, 5, - nil, 3, 0, 0, - 0, 1, 2, 0, 0, false, - }, - "too many active pods, with controller error": { - 2, 5, - fmt.Errorf("Fake error"), 3, 0, 0, - 0, 0, 3, 0, 0, false, - }, - "failed pod": { - 2, 5, - nil, 1, 1, 1, - 1, 0, 2, 1, 1, false, - }, - "job finish": { - 2, 5, - nil, 0, 5, 0, - 0, 0, 0, 5, 0, true, - }, - "WQ job finishing": { - 2, -1, - nil, 1, 1, 0, - 0, 0, 1, 1, 0, false, - }, - "WQ job all finished": { - 2, -1, - nil, 0, 2, 0, - 0, 0, 0, 2, 0, true, - }, - "WQ job all finished despite one failure": { - 2, -1, - nil, 0, 1, 1, - 0, 0, 0, 1, 1, true, - }, - "more active pods than completions": { - 2, 5, - nil, 10, 0, 0, - 0, 8, 2, 0, 0, false, - }, - "status change": { - 2, 5, - nil, 2, 2, 0, - 0, 0, 2, 2, 0, false, - }, - } - - for name, tc := range testCases { - // job manager setup - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{Err: tc.podControllerError} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - var actual *batch.Job - manager.updateHandler = func(job *batch.Job) error { - actual = job - return nil - } - - // job & pods setup - job := newJob(tc.parallelism, tc.completions) - manager.jobStore.Store.Add(job) - for _, pod := range newPodList(tc.activePods, api.PodRunning, job) { - manager.podStore.Indexer.Add(&pod) - } - for _, pod := range newPodList(tc.succeededPods, api.PodSucceeded, job) { - manager.podStore.Indexer.Add(&pod) - } - for _, pod := range newPodList(tc.failedPods, api.PodFailed, job) { - manager.podStore.Indexer.Add(&pod) - } - - // run - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Errorf("%s: unexpected error when syncing jobs %v", name, err) - } - - // validate created/deleted pods - if int32(len(fakePodControl.Templates)) != tc.expectedCreations { - t.Errorf("%s: unexpected number of creates. Expected %d, saw %d\n", name, tc.expectedCreations, len(fakePodControl.Templates)) - } - if int32(len(fakePodControl.DeletePodName)) != tc.expectedDeletions { - t.Errorf("%s: unexpected number of deletes. Expected %d, saw %d\n", name, tc.expectedDeletions, len(fakePodControl.DeletePodName)) - } - // validate status - if actual.Status.Active != tc.expectedActive { - t.Errorf("%s: unexpected number of active pods. Expected %d, saw %d\n", name, tc.expectedActive, actual.Status.Active) - } - if actual.Status.Succeeded != tc.expectedSucceeded { - t.Errorf("%s: unexpected number of succeeded pods. Expected %d, saw %d\n", name, tc.expectedSucceeded, actual.Status.Succeeded) - } - if actual.Status.Failed != tc.expectedFailed { - t.Errorf("%s: unexpected number of failed pods. Expected %d, saw %d\n", name, tc.expectedFailed, actual.Status.Failed) - } - if actual.Status.StartTime == nil { - t.Errorf("%s: .status.startTime was not set", name) - } - // validate conditions - if tc.expectedComplete && !getCondition(actual, batch.JobComplete) { - t.Errorf("%s: expected completion condition. Got %#v", name, actual.Status.Conditions) - } - } -} - -func TestSyncJobPastDeadline(t *testing.T) { - testCases := map[string]struct { - // job setup - parallelism int32 - completions int32 - activeDeadlineSeconds int64 - startTime int64 - - // pod setup - activePods int32 - succeededPods int32 - failedPods int32 - - // expectations - expectedDeletions int32 - expectedActive int32 - expectedSucceeded int32 - expectedFailed int32 - }{ - "activeDeadlineSeconds less than single pod execution": { - 1, 1, 10, 15, - 1, 0, 0, - 1, 0, 0, 1, - }, - "activeDeadlineSeconds bigger than single pod execution": { - 1, 2, 10, 15, - 1, 1, 0, - 1, 0, 1, 1, - }, - "activeDeadlineSeconds times-out before any pod starts": { - 1, 1, 10, 10, - 0, 0, 0, - 0, 0, 0, 0, - }, - } - - for name, tc := range testCases { - // job manager setup - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - var actual *batch.Job - manager.updateHandler = func(job *batch.Job) error { - actual = job - return nil - } - - // job & pods setup - job := newJob(tc.parallelism, tc.completions) - job.Spec.ActiveDeadlineSeconds = &tc.activeDeadlineSeconds - start := unversioned.Unix(unversioned.Now().Time.Unix()-tc.startTime, 0) - job.Status.StartTime = &start - manager.jobStore.Store.Add(job) - for _, pod := range newPodList(tc.activePods, api.PodRunning, job) { - manager.podStore.Indexer.Add(&pod) - } - for _, pod := range newPodList(tc.succeededPods, api.PodSucceeded, job) { - manager.podStore.Indexer.Add(&pod) - } - for _, pod := range newPodList(tc.failedPods, api.PodFailed, job) { - manager.podStore.Indexer.Add(&pod) - } - - // run - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Errorf("%s: unexpected error when syncing jobs %v", name, err) - } - - // validate created/deleted pods - if int32(len(fakePodControl.Templates)) != 0 { - t.Errorf("%s: unexpected number of creates. Expected 0, saw %d\n", name, len(fakePodControl.Templates)) - } - if int32(len(fakePodControl.DeletePodName)) != tc.expectedDeletions { - t.Errorf("%s: unexpected number of deletes. Expected %d, saw %d\n", name, tc.expectedDeletions, len(fakePodControl.DeletePodName)) - } - // validate status - if actual.Status.Active != tc.expectedActive { - t.Errorf("%s: unexpected number of active pods. Expected %d, saw %d\n", name, tc.expectedActive, actual.Status.Active) - } - if actual.Status.Succeeded != tc.expectedSucceeded { - t.Errorf("%s: unexpected number of succeeded pods. Expected %d, saw %d\n", name, tc.expectedSucceeded, actual.Status.Succeeded) - } - if actual.Status.Failed != tc.expectedFailed { - t.Errorf("%s: unexpected number of failed pods. Expected %d, saw %d\n", name, tc.expectedFailed, actual.Status.Failed) - } - if actual.Status.StartTime == nil { - t.Errorf("%s: .status.startTime was not set", name) - } - // validate conditions - if !getCondition(actual, batch.JobFailed) { - t.Errorf("%s: expected fail condition. Got %#v", name, actual.Status.Conditions) - } - } -} - -func getCondition(job *batch.Job, condition batch.JobConditionType) bool { - for _, v := range job.Status.Conditions { - if v.Type == condition && v.Status == api.ConditionTrue { - return true - } - } - return false -} - -func TestSyncPastDeadlineJobFinished(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - var actual *batch.Job - manager.updateHandler = func(job *batch.Job) error { - actual = job - return nil - } - - job := newJob(1, 1) - activeDeadlineSeconds := int64(10) - job.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds - start := unversioned.Unix(unversioned.Now().Time.Unix()-15, 0) - job.Status.StartTime = &start - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobFailed, "DeadlineExceeded", "Job was active longer than specified deadline")) - manager.jobStore.Store.Add(job) - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Errorf("Unexpected error when syncing jobs %v", err) - } - if len(fakePodControl.Templates) != 0 { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", 0, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != 0 { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", 0, len(fakePodControl.DeletePodName)) - } - if actual != nil { - t.Error("Unexpected job modification") - } -} - -func TestSyncJobComplete(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - - job := newJob(1, 1) - job.Status.Conditions = append(job.Status.Conditions, newCondition(batch.JobComplete, "", "")) - manager.jobStore.Store.Add(job) - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Fatalf("Unexpected error when syncing jobs %v", err) - } - uncastJob, _, err := manager.jobStore.Store.Get(job) - if err != nil { - t.Fatalf("Unexpected error when trying to get job from the store: %v", err) - } - actual := uncastJob.(*batch.Job) - // Verify that after syncing a complete job, the conditions are the same. - if got, expected := len(actual.Status.Conditions), 1; got != expected { - t.Fatalf("Unexpected job status conditions amount; expected %d, got %d", expected, got) - } -} - -func TestSyncJobDeleted(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - manager.updateHandler = func(job *batch.Job) error { return nil } - job := newJob(2, 2) - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Errorf("Unexpected error when syncing jobs %v", err) - } - if len(fakePodControl.Templates) != 0 { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", 0, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != 0 { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", 0, len(fakePodControl.DeletePodName)) - } -} - -func TestSyncJobUpdateRequeue(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - manager.updateHandler = func(job *batch.Job) error { return fmt.Errorf("Fake error") } - job := newJob(2, 2) - manager.jobStore.Store.Add(job) - err := manager.syncJob(getKey(job, t)) - if err != nil { - t.Errorf("Unxpected error when syncing jobs, got %v", err) - } - t.Log("Waiting for a job in the queue") - key, _ := manager.queue.Get() - expectedKey := getKey(job, t) - if key != expectedKey { - t.Errorf("Expected requeue of job with key %s got %s", expectedKey, key) - } -} - -func TestJobPodLookup(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - manager.podStoreSynced = alwaysReady - testCases := []struct { - job *batch.Job - pod *api.Pod - - expectedName string - }{ - // pods without labels don't match any job - { - job: &batch.Job{ - ObjectMeta: api.ObjectMeta{Name: "basic"}, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo1", Namespace: api.NamespaceAll}, - }, - expectedName: "", - }, - // matching labels, different namespace - { - job: &batch.Job{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo2", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - }, - expectedName: "", - }, - // matching ns and labels returns - { - job: &batch.Job{ - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchExpressions: []unversioned.LabelSelectorRequirement{ - { - Key: "foo", - Operator: unversioned.LabelSelectorOpIn, - Values: []string{"bar"}, - }, - }, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo3", - Namespace: "ns", - Labels: map[string]string{"foo": "bar"}, - }, - }, - expectedName: "bar", - }, - } - for _, tc := range testCases { - manager.jobStore.Add(tc.job) - if job := manager.getPodJob(tc.pod); job != nil { - if tc.expectedName != job.Name { - t.Errorf("Got job %+v expected %+v", job.Name, tc.expectedName) - } - } else if tc.expectedName != "" { - t.Errorf("Expected a job %v pod %v, found none", tc.expectedName, tc.pod.Name) - } - } -} - -type FakeJobExpectations struct { - *controller.ControllerExpectations - satisfied bool - expSatisfied func() -} - -func (fe FakeJobExpectations) SatisfiedExpectations(controllerKey string) bool { - fe.expSatisfied() - return fe.satisfied -} - -// TestSyncJobExpectations tests that a pod cannot sneak in between counting active pods -// and checking expectations. -func TestSyncJobExpectations(t *testing.T) { - clientset := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.podStoreSynced = alwaysReady - manager.updateHandler = func(job *batch.Job) error { return nil } - - job := newJob(2, 2) - manager.jobStore.Store.Add(job) - pods := newPodList(2, api.PodPending, job) - manager.podStore.Indexer.Add(&pods[0]) - - manager.expectations = FakeJobExpectations{ - controller.NewControllerExpectations(), true, func() { - // If we check active pods before checking expectataions, the job - // will create a new replica because it doesn't see this pod, but - // has fulfilled its expectations. - manager.podStore.Indexer.Add(&pods[1]) - }, - } - manager.syncJob(getKey(job, t)) - if len(fakePodControl.Templates) != 0 { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", 0, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != 0 { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", 0, len(fakePodControl.DeletePodName)) - } -} - -type FakeWatcher struct { - w *watch.FakeWatcher - *testclient.Fake -} - -func TestWatchJobs(t *testing.T) { - clientset := fake.NewSimpleClientset() - fakeWatch := watch.NewFake() - clientset.PrependWatchReactor("jobs", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - manager.podStoreSynced = alwaysReady - - var testJob batch.Job - received := make(chan struct{}) - - // The update sent through the fakeWatcher should make its way into the workqueue, - // and eventually into the syncHandler. - manager.syncHandler = func(key string) error { - - obj, exists, err := manager.jobStore.Store.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find job under key %v", key) - } - job, ok := obj.(*batch.Job) - if !ok { - t.Fatalf("unexpected type: %v %#v", reflect.TypeOf(obj), obj) - } - if !api.Semantic.DeepDerivative(*job, testJob) { - t.Errorf("Expected %#v, but got %#v", testJob, *job) - } - close(received) - return nil - } - // Start only the job watcher and the workqueue, send a watch event, - // and make sure it hits the sync method. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.Run(1, stopCh) - - // We're sending new job to see if it reaches syncHandler. - testJob.Name = "foo" - fakeWatch.Add(&testJob) - t.Log("Waiting for job to reach syncHandler") - <-received -} - -func TestIsJobFinished(t *testing.T) { - job := &batch.Job{ - Status: batch.JobStatus{ - Conditions: []batch.JobCondition{{ - Type: batch.JobComplete, - Status: api.ConditionTrue, - }}, - }, - } - - if !isJobFinished(job) { - t.Error("Job was expected to be finished") - } - - job.Status.Conditions[0].Status = api.ConditionFalse - if isJobFinished(job) { - t.Error("Job was not expected to be finished") - } - - job.Status.Conditions[0].Status = api.ConditionUnknown - if isJobFinished(job) { - t.Error("Job was not expected to be finished") - } -} - -func TestWatchPods(t *testing.T) { - testJob := newJob(2, 2) - clientset := fake.NewSimpleClientset(testJob) - fakeWatch := watch.NewFake() - clientset.PrependWatchReactor("pods", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewJobControllerFromClient(clientset, controller.NoResyncPeriodFunc) - manager.podStoreSynced = alwaysReady - - // Put one job and one pod into the store - manager.jobStore.Store.Add(testJob) - received := make(chan struct{}) - // The pod update sent through the fakeWatcher should figure out the managing job and - // send it into the syncHandler. - manager.syncHandler = func(key string) error { - obj, exists, err := manager.jobStore.Store.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find job under key %v", key) - close(received) - return nil - } - job, ok := obj.(*batch.Job) - if !ok { - t.Errorf("unexpected type: %v %#v", reflect.TypeOf(obj), obj) - close(received) - return nil - } - if !api.Semantic.DeepDerivative(job, testJob) { - t.Errorf("\nExpected %#v,\nbut got %#v", testJob, job) - close(received) - return nil - } - close(received) - return nil - } - // Start only the pod watcher and the workqueue, send a watch event, - // and make sure it hits the sync method for the right job. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.Run(1, stopCh) - - pods := newPodList(1, api.PodRunning, testJob) - testPod := pods[0] - testPod.Status.Phase = api.PodFailed - fakeWatch.Add(&testPod) - - t.Log("Waiting for pod to reach syncHandler") - <-received -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/doc.go deleted file mode 100644 index 9c569bfc0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/job/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 job contains logic for watching and synchronizing jobs. -package job diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/doc.go deleted file mode 100644 index fea657af5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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. -*/ - -// namespace contains a controller that handles namespace lifecycle -package namespace diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller.go deleted file mode 100644 index 23d7fefeb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller.go +++ /dev/null @@ -1,180 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 namespace - -import ( - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/typed/dynamic" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -// NamespaceController is responsible for performing actions dependent upon a namespace phase -type NamespaceController struct { - // client that purges namespace content, must have list/delete privileges on all content - kubeClient clientset.Interface - // clientPool manages a pool of dynamic clients - clientPool dynamic.ClientPool - // store that holds the namespaces - store cache.Store - // controller that observes the namespaces - controller *framework.Controller - // namespaces that have been queued up for processing by workers - queue *workqueue.Type - // list of preferred group versions and their corresponding resource set for namespace deletion - groupVersionResources []unversioned.GroupVersionResource - // opCache is a cache to remember if a particular operation is not supported to aid dynamic client. - opCache operationNotSupportedCache - // finalizerToken is the finalizer token managed by this controller - finalizerToken api.FinalizerName -} - -// NewNamespaceController creates a new NamespaceController -func NewNamespaceController( - kubeClient clientset.Interface, - clientPool dynamic.ClientPool, - groupVersionResources []unversioned.GroupVersionResource, - resyncPeriod time.Duration, - finalizerToken api.FinalizerName) *NamespaceController { - // create the controller so we can inject the enqueue function - namespaceController := &NamespaceController{ - kubeClient: kubeClient, - clientPool: clientPool, - queue: workqueue.New(), - groupVersionResources: groupVersionResources, - opCache: operationNotSupportedCache{}, - finalizerToken: finalizerToken, - } - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("namespace_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - // configure the backing store/controller - store, controller := framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return kubeClient.Core().Namespaces().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return kubeClient.Core().Namespaces().Watch(options) - }, - }, - &api.Namespace{}, - resyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - namespace := obj.(*api.Namespace) - namespaceController.enqueueNamespace(namespace) - }, - UpdateFunc: func(oldObj, newObj interface{}) { - namespace := newObj.(*api.Namespace) - namespaceController.enqueueNamespace(namespace) - }, - }, - ) - - namespaceController.store = store - namespaceController.controller = controller - return namespaceController -} - -// enqueueNamespace adds an object to the controller work queue -// obj could be an *api.Namespace, or a DeletionFinalStateUnknown item. -func (nm *NamespaceController) enqueueNamespace(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - return - } - nm.queue.Add(key) -} - -// worker processes the queue of namespace objects. -// Each namespace can be in the queue at most once. -// The system ensures that no two workers can process -// the same namespace at the same time. -func (nm *NamespaceController) worker() { - for { - func() { - key, quit := nm.queue.Get() - if quit { - return - } - defer nm.queue.Done(key) - if err := nm.syncNamespaceFromKey(key.(string)); err != nil { - if estimate, ok := err.(*contentRemainingError); ok { - go func() { - defer utilruntime.HandleCrash() - t := estimate.Estimate/2 + 1 - glog.V(4).Infof("Content remaining in namespace %s, waiting %d seconds", key, t) - time.Sleep(time.Duration(t) * time.Second) - nm.queue.Add(key) - }() - } else { - // rather than wait for a full resync, re-add the namespace to the queue to be processed - nm.queue.Add(key) - utilruntime.HandleError(err) - } - } - }() - } -} - -// syncNamespaceFromKey looks for a namespace with the specified key in its store and synchronizes it -func (nm *NamespaceController) syncNamespaceFromKey(key string) (err error) { - startTime := time.Now() - defer glog.V(4).Infof("Finished syncing namespace %q (%v)", key, time.Now().Sub(startTime)) - - obj, exists, err := nm.store.GetByKey(key) - if !exists { - glog.Infof("Namespace has been deleted %v", key) - return nil - } - if err != nil { - glog.Infof("Unable to retrieve namespace %v from store: %v", key, err) - nm.queue.Add(key) - return err - } - namespace := obj.(*api.Namespace) - return syncNamespace(nm.kubeClient, nm.clientPool, nm.opCache, nm.groupVersionResources, namespace, nm.finalizerToken) -} - -// Run starts observing the system with the specified number of workers. -func (nm *NamespaceController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go nm.controller.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(nm.worker, time.Second, stopCh) - } - <-stopCh - glog.Infof("Shutting down NamespaceController") - nm.queue.ShutDown() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_test.go deleted file mode 100644 index b0dcd3fcf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_test.go +++ /dev/null @@ -1,282 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 namespace - -import ( - "fmt" - "net/http" - "net/http/httptest" - "path" - "strings" - "sync" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/client/typed/dynamic" - "k8s.io/kubernetes/pkg/util/sets" -) - -func TestFinalized(t *testing.T) { - testNamespace := &api.Namespace{ - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"a", "b"}, - }, - } - if finalized(testNamespace) { - t.Errorf("Unexpected result, namespace is not finalized") - } - testNamespace.Spec.Finalizers = []api.FinalizerName{} - if !finalized(testNamespace) { - t.Errorf("Expected object to be finalized") - } -} - -func TestFinalizeNamespaceFunc(t *testing.T) { - mockClient := &fake.Clientset{} - testNamespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - ResourceVersion: "1", - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"kubernetes", "other"}, - }, - } - finalizeNamespace(mockClient, testNamespace, api.FinalizerKubernetes) - actions := mockClient.Actions() - if len(actions) != 1 { - t.Errorf("Expected 1 mock client action, but got %v", len(actions)) - } - if !actions[0].Matches("create", "namespaces") || actions[0].GetSubresource() != "finalize" { - t.Errorf("Expected finalize-namespace action %v", actions[0]) - } - finalizers := actions[0].(core.CreateAction).GetObject().(*api.Namespace).Spec.Finalizers - if len(finalizers) != 1 { - t.Errorf("There should be a single finalizer remaining") - } - if "other" != string(finalizers[0]) { - t.Errorf("Unexpected finalizer value, %v", finalizers[0]) - } -} - -func testSyncNamespaceThatIsTerminating(t *testing.T, versions *unversioned.APIVersions) { - now := unversioned.Now() - namespaceName := "test" - testNamespacePendingFinalize := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: namespaceName, - ResourceVersion: "1", - DeletionTimestamp: &now, - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"kubernetes"}, - }, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - } - testNamespaceFinalizeComplete := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: namespaceName, - ResourceVersion: "1", - DeletionTimestamp: &now, - }, - Spec: api.NamespaceSpec{}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - } - - // when doing a delete all of content, we will do a GET of a collection, and DELETE of a collection by default - dynamicClientActionSet := sets.NewString() - groupVersionResources := testGroupVersionResources() - for _, groupVersionResource := range groupVersionResources { - urlPath := path.Join([]string{ - dynamic.LegacyAPIPathResolverFunc(groupVersionResource.GroupVersion()), - groupVersionResource.Group, - groupVersionResource.Version, - "namespaces", - namespaceName, - groupVersionResource.Resource, - }...) - dynamicClientActionSet.Insert((&fakeAction{method: "GET", path: urlPath}).String()) - dynamicClientActionSet.Insert((&fakeAction{method: "DELETE", path: urlPath}).String()) - } - - scenarios := map[string]struct { - testNamespace *api.Namespace - kubeClientActionSet sets.String - dynamicClientActionSet sets.String - }{ - "pending-finalize": { - testNamespace: testNamespacePendingFinalize, - kubeClientActionSet: sets.NewString( - strings.Join([]string{"get", "namespaces", ""}, "-"), - strings.Join([]string{"list", "pods", ""}, "-"), - strings.Join([]string{"create", "namespaces", "finalize"}, "-"), - ), - dynamicClientActionSet: dynamicClientActionSet, - }, - "complete-finalize": { - testNamespace: testNamespaceFinalizeComplete, - kubeClientActionSet: sets.NewString( - strings.Join([]string{"get", "namespaces", ""}, "-"), - strings.Join([]string{"delete", "namespaces", ""}, "-"), - ), - dynamicClientActionSet: sets.NewString(), - }, - } - - for scenario, testInput := range scenarios { - testHandler := &fakeActionHandler{statusCode: 200} - srv, clientConfig := testServerAndClientConfig(testHandler.ServeHTTP) - defer srv.Close() - - mockClient := fake.NewSimpleClientset(testInput.testNamespace) - clientPool := dynamic.NewClientPool(clientConfig, dynamic.LegacyAPIPathResolverFunc) - - err := syncNamespace(mockClient, clientPool, operationNotSupportedCache{}, groupVersionResources, testInput.testNamespace, api.FinalizerKubernetes) - if err != nil { - t.Errorf("scenario %s - Unexpected error when synching namespace %v", scenario, err) - } - - // validate traffic from kube client - actionSet := sets.NewString() - for _, action := range mockClient.Actions() { - actionSet.Insert(strings.Join([]string{action.GetVerb(), action.GetResource().Resource, action.GetSubresource()}, "-")) - } - if !actionSet.Equal(testInput.kubeClientActionSet) { - t.Errorf("scenario %s - mock client expected actions:\n%v\n but got:\n%v\nDifference:\n%v", scenario, - testInput.kubeClientActionSet, actionSet, testInput.kubeClientActionSet.Difference(actionSet)) - } - - // validate traffic from dynamic client - actionSet = sets.NewString() - for _, action := range testHandler.actions { - actionSet.Insert(action.String()) - } - if !actionSet.Equal(testInput.dynamicClientActionSet) { - t.Errorf("scenario %s - dynamic client expected actions:\n%v\n but got:\n%v\nDifference:\n%v", scenario, - testInput.dynamicClientActionSet, actionSet, testInput.dynamicClientActionSet.Difference(actionSet)) - } - } -} - -func TestRetryOnConflictError(t *testing.T) { - mockClient := &fake.Clientset{} - numTries := 0 - retryOnce := func(kubeClient clientset.Interface, namespace *api.Namespace) (*api.Namespace, error) { - numTries++ - if numTries <= 1 { - return namespace, errors.NewConflict(api.Resource("namespaces"), namespace.Name, fmt.Errorf("ERROR!")) - } - return namespace, nil - } - namespace := &api.Namespace{} - _, err := retryOnConflictError(mockClient, namespace, retryOnce) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - if numTries != 2 { - t.Errorf("Expected %v, but got %v", 2, numTries) - } -} - -func TestSyncNamespaceThatIsTerminatingNonExperimental(t *testing.T) { - testSyncNamespaceThatIsTerminating(t, &unversioned.APIVersions{}) -} - -func TestSyncNamespaceThatIsTerminatingV1Beta1(t *testing.T) { - testSyncNamespaceThatIsTerminating(t, &unversioned.APIVersions{Versions: []string{"extensions/v1beta1"}}) -} - -func TestSyncNamespaceThatIsActive(t *testing.T) { - mockClient := &fake.Clientset{} - testNamespace := &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - ResourceVersion: "1", - }, - Spec: api.NamespaceSpec{ - Finalizers: []api.FinalizerName{"kubernetes"}, - }, - Status: api.NamespaceStatus{ - Phase: api.NamespaceActive, - }, - } - err := syncNamespace(mockClient, nil, operationNotSupportedCache{}, testGroupVersionResources(), testNamespace, api.FinalizerKubernetes) - if err != nil { - t.Errorf("Unexpected error when synching namespace %v", err) - } - if len(mockClient.Actions()) != 0 { - t.Errorf("Expected no action from controller, but got: %v", mockClient.Actions()) - } -} - -// testServerAndClientConfig returns a server that listens and a config that can reference it -func testServerAndClientConfig(handler func(http.ResponseWriter, *http.Request)) (*httptest.Server, *restclient.Config) { - srv := httptest.NewServer(http.HandlerFunc(handler)) - config := &restclient.Config{ - Host: srv.URL, - } - return srv, config -} - -// fakeAction records information about requests to aid in testing. -type fakeAction struct { - method string - path string -} - -// String returns method=path to aid in testing -func (f *fakeAction) String() string { - return strings.Join([]string{f.method, f.path}, "=") -} - -// fakeActionHandler holds a list of fakeActions received -type fakeActionHandler struct { - // statusCode returned by this handler - statusCode int - - lock sync.Mutex - actions []fakeAction -} - -// ServeHTTP logs the action that occurred and always returns the associated status code -func (f *fakeActionHandler) ServeHTTP(response http.ResponseWriter, request *http.Request) { - f.lock.Lock() - defer f.lock.Unlock() - - f.actions = append(f.actions, fakeAction{method: request.Method, path: request.URL.Path}) - response.WriteHeader(f.statusCode) - response.Write([]byte("{\"kind\": \"List\"}")) -} - -// testGroupVersionResources returns a mocked up set of resources across different api groups for testing namespace controller. -func testGroupVersionResources() []unversioned.GroupVersionResource { - results := []unversioned.GroupVersionResource{} - results = append(results, unversioned.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) - results = append(results, unversioned.GroupVersionResource{Group: "", Version: "v1", Resource: "services"}) - results = append(results, unversioned.GroupVersionResource{Group: "extensions", Version: "v1beta1", Resource: "deployments"}) - return results -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_utils.go deleted file mode 100644 index dcc8b243d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/namespace/namespace_controller_utils.go +++ /dev/null @@ -1,484 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 namespace - -import ( - "fmt" - "strings" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/typed/discovery" - "k8s.io/kubernetes/pkg/client/typed/dynamic" - "k8s.io/kubernetes/pkg/runtime" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - "k8s.io/kubernetes/pkg/util/sets" - - "github.com/golang/glog" -) - -// contentRemainingError is used to inform the caller that content is not fully removed from the namespace -type contentRemainingError struct { - Estimate int64 -} - -func (e *contentRemainingError) Error() string { - return fmt.Sprintf("some content remains in the namespace, estimate %d seconds before it is removed", e.Estimate) -} - -// operation is used for caching if an operation is supported on a dynamic client. -type operation string - -const ( - operationDeleteCollection operation = "deleteCollection" - operationList operation = "list" -) - -// operationKey is an entry in a cache. -type operationKey struct { - op operation - gvr unversioned.GroupVersionResource -} - -// operationNotSupportedCache is a simple cache to remember if an operation is not supported for a resource. -// if the operationKey maps to true, it means the operation is not supported. -type operationNotSupportedCache map[operationKey]bool - -// isSupported returns true if the operation is supported -func (o operationNotSupportedCache) isSupported(key operationKey) bool { - return !o[key] -} - -// updateNamespaceFunc is a function that makes an update to a namespace -type updateNamespaceFunc func(kubeClient clientset.Interface, namespace *api.Namespace) (*api.Namespace, error) - -// retryOnConflictError retries the specified fn if there was a conflict error -// TODO RetryOnConflict should be a generic concept in client code -func retryOnConflictError(kubeClient clientset.Interface, namespace *api.Namespace, fn updateNamespaceFunc) (result *api.Namespace, err error) { - latestNamespace := namespace - for { - result, err = fn(kubeClient, latestNamespace) - if err == nil { - return result, nil - } - if !errors.IsConflict(err) { - return nil, err - } - latestNamespace, err = kubeClient.Core().Namespaces().Get(latestNamespace.Name) - if err != nil { - return nil, err - } - } -} - -// updateNamespaceStatusFunc will verify that the status of the namespace is correct -func updateNamespaceStatusFunc(kubeClient clientset.Interface, namespace *api.Namespace) (*api.Namespace, error) { - if namespace.DeletionTimestamp.IsZero() || namespace.Status.Phase == api.NamespaceTerminating { - return namespace, nil - } - newNamespace := api.Namespace{} - newNamespace.ObjectMeta = namespace.ObjectMeta - newNamespace.Status = namespace.Status - newNamespace.Status.Phase = api.NamespaceTerminating - return kubeClient.Core().Namespaces().UpdateStatus(&newNamespace) -} - -// finalized returns true if the namespace.Spec.Finalizers is an empty list -func finalized(namespace *api.Namespace) bool { - return len(namespace.Spec.Finalizers) == 0 -} - -// finalizeNamespaceFunc returns a function that knows how to finalize a namespace for specified token. -func finalizeNamespaceFunc(finalizerToken api.FinalizerName) updateNamespaceFunc { - return func(kubeClient clientset.Interface, namespace *api.Namespace) (*api.Namespace, error) { - return finalizeNamespace(kubeClient, namespace, finalizerToken) - } -} - -// finalizeNamespace removes the specified finalizerToken and finalizes the namespace -func finalizeNamespace(kubeClient clientset.Interface, namespace *api.Namespace, finalizerToken api.FinalizerName) (*api.Namespace, error) { - namespaceFinalize := api.Namespace{} - namespaceFinalize.ObjectMeta = namespace.ObjectMeta - namespaceFinalize.Spec = namespace.Spec - finalizerSet := sets.NewString() - for i := range namespace.Spec.Finalizers { - if namespace.Spec.Finalizers[i] != finalizerToken { - finalizerSet.Insert(string(namespace.Spec.Finalizers[i])) - } - } - namespaceFinalize.Spec.Finalizers = make([]api.FinalizerName, 0, len(finalizerSet)) - for _, value := range finalizerSet.List() { - namespaceFinalize.Spec.Finalizers = append(namespaceFinalize.Spec.Finalizers, api.FinalizerName(value)) - } - namespace, err := kubeClient.Core().Namespaces().Finalize(&namespaceFinalize) - if err != nil { - // it was removed already, so life is good - if errors.IsNotFound(err) { - return namespace, nil - } - } - return namespace, err -} - -// deleteCollection is a helper function that will delete the collection of resources -// it returns true if the operation was supported on the server. -// it returns an error if the operation was supported on the server but was unable to complete. -func deleteCollection( - dynamicClient *dynamic.Client, - opCache operationNotSupportedCache, - gvr unversioned.GroupVersionResource, - namespace string, -) (bool, error) { - glog.V(5).Infof("namespace controller - deleteCollection - namespace: %s, gvr: %v", namespace, gvr) - - key := operationKey{op: operationDeleteCollection, gvr: gvr} - if !opCache.isSupported(key) { - glog.V(5).Infof("namespace controller - deleteCollection ignored since not supported - namespace: %s, gvr: %v", namespace, gvr) - return false, nil - } - - apiResource := unversioned.APIResource{Name: gvr.Resource, Namespaced: true} - err := dynamicClient.Resource(&apiResource, namespace).DeleteCollection(nil, v1.ListOptions{}) - - if err == nil { - return true, nil - } - - // this is strange, but we need to special case for both MethodNotSupported and NotFound errors - // TODO: https://github.com/kubernetes/kubernetes/issues/22413 - // we have a resource returned in the discovery API that supports no top-level verbs: - // /apis/extensions/v1beta1/namespaces/default/replicationcontrollers - // when working with this resource type, we will get a literal not found error rather than expected method not supported - // remember next time that this resource does not support delete collection... - if errors.IsMethodNotSupported(err) || errors.IsNotFound(err) { - glog.V(5).Infof("namespace controller - deleteCollection not supported - namespace: %s, gvr: %v", namespace, gvr) - opCache[key] = true - return false, nil - } - - glog.V(5).Infof("namespace controller - deleteCollection unexpected error - namespace: %s, gvr: %v, error: %v", namespace, gvr, err) - return true, err -} - -// listCollection will list the items in the specified namespace -// it returns the following: -// the list of items in the collection (if found) -// a boolean if the operation is supported -// an error if the operation is supported but could not be completed. -func listCollection( - dynamicClient *dynamic.Client, - opCache operationNotSupportedCache, - gvr unversioned.GroupVersionResource, - namespace string, -) (*runtime.UnstructuredList, bool, error) { - glog.V(5).Infof("namespace controller - listCollection - namespace: %s, gvr: %v", namespace, gvr) - - key := operationKey{op: operationList, gvr: gvr} - if !opCache.isSupported(key) { - glog.V(5).Infof("namespace controller - listCollection ignored since not supported - namespace: %s, gvr: %v", namespace, gvr) - return nil, false, nil - } - - apiResource := unversioned.APIResource{Name: gvr.Resource, Namespaced: true} - unstructuredList, err := dynamicClient.Resource(&apiResource, namespace).List(v1.ListOptions{}) - if err == nil { - return unstructuredList, true, nil - } - - // this is strange, but we need to special case for both MethodNotSupported and NotFound errors - // TODO: https://github.com/kubernetes/kubernetes/issues/22413 - // we have a resource returned in the discovery API that supports no top-level verbs: - // /apis/extensions/v1beta1/namespaces/default/replicationcontrollers - // when working with this resource type, we will get a literal not found error rather than expected method not supported - // remember next time that this resource does not support delete collection... - if errors.IsMethodNotSupported(err) || errors.IsNotFound(err) { - glog.V(5).Infof("namespace controller - listCollection not supported - namespace: %s, gvr: %v", namespace, gvr) - opCache[key] = true - return nil, false, nil - } - - return nil, true, err -} - -// deleteEachItem is a helper function that will list the collection of resources and delete each item 1 by 1. -func deleteEachItem( - dynamicClient *dynamic.Client, - opCache operationNotSupportedCache, - gvr unversioned.GroupVersionResource, - namespace string, -) error { - glog.V(5).Infof("namespace controller - deleteEachItem - namespace: %s, gvr: %v", namespace, gvr) - - unstructuredList, listSupported, err := listCollection(dynamicClient, opCache, gvr, namespace) - if err != nil { - return err - } - if !listSupported { - return nil - } - apiResource := unversioned.APIResource{Name: gvr.Resource, Namespaced: true} - for _, item := range unstructuredList.Items { - if err = dynamicClient.Resource(&apiResource, namespace).Delete(item.GetName(), nil); err != nil && !errors.IsNotFound(err) && !errors.IsMethodNotSupported(err) { - return err - } - } - return nil -} - -// deleteAllContentForGroupVersionResource will use the dynamic client to delete each resource identified in gvr. -// It returns an estimate of the time remaining before the remaining resources are deleted. -// If estimate > 0, not all resources are guaranteed to be gone. -func deleteAllContentForGroupVersionResource( - kubeClient clientset.Interface, - clientPool dynamic.ClientPool, - opCache operationNotSupportedCache, - gvr unversioned.GroupVersionResource, - namespace string, - namespaceDeletedAt unversioned.Time, -) (int64, error) { - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - namespace: %s, gvr: %v", namespace, gvr) - - // estimate how long it will take for the resource to be deleted (needed for objects that support graceful delete) - estimate, err := estimateGracefulTermination(kubeClient, gvr, namespace, namespaceDeletedAt) - if err != nil { - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - unable to estimate - namespace: %s, gvr: %v, err: %v", namespace, gvr, err) - return estimate, err - } - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - estimate - namespace: %s, gvr: %v, estimate: %v", namespace, gvr, estimate) - - // get a client for this group version... - dynamicClient, err := clientPool.ClientForGroupVersion(gvr.GroupVersion()) - if err != nil { - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - unable to get client - namespace: %s, gvr: %v, err: %v", namespace, gvr, err) - return estimate, err - } - - // first try to delete the entire collection - deleteCollectionSupported, err := deleteCollection(dynamicClient, opCache, gvr, namespace) - if err != nil { - return estimate, err - } - - // delete collection was not supported, so we list and delete each item... - if !deleteCollectionSupported { - err = deleteEachItem(dynamicClient, opCache, gvr, namespace) - if err != nil { - return estimate, err - } - } - - // verify there are no more remaining items - // it is not an error condition for there to be remaining items if local estimate is non-zero - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - checking for no more items in namespace: %s, gvr: %v", namespace, gvr) - unstructuredList, listSupported, err := listCollection(dynamicClient, opCache, gvr, namespace) - if err != nil { - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - error verifying no items in namespace: %s, gvr: %v, err: %v", namespace, gvr, err) - return estimate, err - } - if !listSupported { - return estimate, nil - } - glog.V(5).Infof("namespace controller - deleteAllContentForGroupVersionResource - items remaining - namespace: %s, gvr: %v, items: %v", namespace, gvr, len(unstructuredList.Items)) - if len(unstructuredList.Items) != 0 && estimate == int64(0) { - return estimate, fmt.Errorf("unexpected items still remain in namespace: %s for gvr: %v", namespace, gvr) - } - return estimate, nil -} - -// deleteAllContent will use the dynamic client to delete each resource identified in groupVersionResources. -// It returns an estimate of the time remaining before the remaining resources are deleted. -// If estimate > 0, not all resources are guaranteed to be gone. -func deleteAllContent( - kubeClient clientset.Interface, - clientPool dynamic.ClientPool, - opCache operationNotSupportedCache, - groupVersionResources []unversioned.GroupVersionResource, - namespace string, - namespaceDeletedAt unversioned.Time, -) (int64, error) { - estimate := int64(0) - glog.V(4).Infof("namespace controller - deleteAllContent - namespace: %s, gvrs: %v", namespace, groupVersionResources) - // iterate over each group version, and attempt to delete all of its resources - for _, gvr := range groupVersionResources { - gvrEstimate, err := deleteAllContentForGroupVersionResource(kubeClient, clientPool, opCache, gvr, namespace, namespaceDeletedAt) - if err != nil { - return estimate, err - } - if gvrEstimate > estimate { - estimate = gvrEstimate - } - } - glog.V(4).Infof("namespace controller - deleteAllContent - namespace: %s, estimate: %v", namespace, estimate) - return estimate, nil -} - -// syncNamespace orchestrates deletion of a Namespace and its associated content. -func syncNamespace( - kubeClient clientset.Interface, - clientPool dynamic.ClientPool, - opCache operationNotSupportedCache, - groupVersionResources []unversioned.GroupVersionResource, - namespace *api.Namespace, - finalizerToken api.FinalizerName, -) error { - if namespace.DeletionTimestamp == nil { - return nil - } - - // multiple controllers may edit a namespace during termination - // first get the latest state of the namespace before proceeding - // if the namespace was deleted already, don't do anything - namespace, err := kubeClient.Core().Namespaces().Get(namespace.Name) - if err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - - glog.V(5).Infof("namespace controller - syncNamespace - namespace: %s, finalizerToken: %s", namespace.Name, finalizerToken) - - // ensure that the status is up to date on the namespace - // if we get a not found error, we assume the namespace is truly gone - namespace, err = retryOnConflictError(kubeClient, namespace, updateNamespaceStatusFunc) - if err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - - // if the namespace is already finalized, delete it - if finalized(namespace) { - err = kubeClient.Core().Namespaces().Delete(namespace.Name, nil) - if err != nil && !errors.IsNotFound(err) { - return err - } - return nil - } - - // there may still be content for us to remove - estimate, err := deleteAllContent(kubeClient, clientPool, opCache, groupVersionResources, namespace.Name, *namespace.DeletionTimestamp) - if err != nil { - return err - } - if estimate > 0 { - return &contentRemainingError{estimate} - } - - // we have removed content, so mark it finalized by us - result, err := retryOnConflictError(kubeClient, namespace, finalizeNamespaceFunc(finalizerToken)) - if err != nil { - // in normal practice, this should not be possible, but if a deployment is running - // two controllers to do namespace deletion that share a common finalizer token it's - // possible that a not found could occur since the other controller would have finished the delete. - if errors.IsNotFound(err) { - return nil - } - return err - } - - // now check if all finalizers have reported that we delete now - if finalized(result) { - err = kubeClient.Core().Namespaces().Delete(namespace.Name, nil) - if err != nil && !errors.IsNotFound(err) { - return err - } - } - - return nil -} - -// estimateGrracefulTermination will estimate the graceful termination required for the specific entity in the namespace -func estimateGracefulTermination(kubeClient clientset.Interface, groupVersionResource unversioned.GroupVersionResource, ns string, namespaceDeletedAt unversioned.Time) (int64, error) { - groupResource := groupVersionResource.GroupResource() - glog.V(5).Infof("namespace controller - estimateGracefulTermination - group %s, resource: %s", groupResource.Group, groupResource.Resource) - estimate := int64(0) - var err error - switch groupResource { - case unversioned.GroupResource{Group: "", Resource: "pods"}: - estimate, err = estimateGracefulTerminationForPods(kubeClient, ns) - } - if err != nil { - return estimate, err - } - // determine if the estimate is greater than the deletion timestamp - duration := time.Since(namespaceDeletedAt.Time) - allowedEstimate := time.Duration(estimate) * time.Second - if duration >= allowedEstimate { - estimate = int64(0) - } - return estimate, nil -} - -// estimateGracefulTerminationForPods determines the graceful termination period for pods in the namespace -func estimateGracefulTerminationForPods(kubeClient clientset.Interface, ns string) (int64, error) { - glog.V(5).Infof("namespace controller - estimateGracefulTerminationForPods - namespace %s", ns) - estimate := int64(0) - items, err := kubeClient.Core().Pods(ns).List(api.ListOptions{}) - if err != nil { - return estimate, err - } - for i := range items.Items { - // filter out terminal pods - phase := items.Items[i].Status.Phase - if api.PodSucceeded == phase || api.PodFailed == phase { - continue - } - if items.Items[i].Spec.TerminationGracePeriodSeconds != nil { - grace := *items.Items[i].Spec.TerminationGracePeriodSeconds - if grace > estimate { - estimate = grace - } - } - } - return estimate, nil -} - -// ServerPreferredNamespacedGroupVersionResources uses the specified client to discover the set of preferred groupVersionResources that are namespaced -func ServerPreferredNamespacedGroupVersionResources(discoveryClient discovery.DiscoveryInterface) ([]unversioned.GroupVersionResource, error) { - results := []unversioned.GroupVersionResource{} - serverGroupList, err := discoveryClient.ServerGroups() - if err != nil { - return results, err - } - - allErrs := []error{} - for _, apiGroup := range serverGroupList.Groups { - preferredVersion := apiGroup.PreferredVersion - apiResourceList, err := discoveryClient.ServerResourcesForGroupVersion(preferredVersion.GroupVersion) - if err != nil { - allErrs = append(allErrs, err) - continue - } - groupVersion := unversioned.GroupVersion{Group: apiGroup.Name, Version: preferredVersion.Version} - for _, apiResource := range apiResourceList.APIResources { - if !apiResource.Namespaced { - continue - } - if strings.Contains(apiResource.Name, "/") { - continue - } - results = append(results, groupVersion.WithResource(apiResource.Name)) - } - } - return results, utilerrors.NewAggregate(allErrs) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/doc.go deleted file mode 100644 index 084754e69..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 node contains code for syncing cloud instances with -// node registry -package node diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller.go deleted file mode 100644 index af87c3688..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller.go +++ /dev/null @@ -1,949 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 node - -import ( - "errors" - "fmt" - "net" - "strings" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/version" - "k8s.io/kubernetes/pkg/watch" -) - -var ( - ErrCloudInstance = errors.New("cloud provider doesn't support instances.") -) - -const ( - // nodeStatusUpdateRetry controls the number of retries of writing NodeStatus update. - nodeStatusUpdateRetry = 5 - // controls how often NodeController will try to evict Pods from non-responsive Nodes. - nodeEvictionPeriod = 100 * time.Millisecond -) - -type nodeStatusData struct { - probeTimestamp unversioned.Time - readyTransitionTimestamp unversioned.Time - status api.NodeStatus -} - -type NodeController struct { - allocateNodeCIDRs bool - cloud cloudprovider.Interface - clusterCIDR *net.IPNet - deletingPodsRateLimiter flowcontrol.RateLimiter - knownNodeSet sets.String - kubeClient clientset.Interface - // Method for easy mocking in unittest. - lookupIP func(host string) ([]net.IP, error) - // Value used if sync_nodes_status=False. NodeController will not proactively - // sync node status in this case, but will monitor node status updated from kubelet. If - // it doesn't receive update for this amount of time, it will start posting "NodeReady== - // ConditionUnknown". The amount of time before which NodeController start evicting pods - // is controlled via flag 'pod-eviction-timeout'. - // Note: be cautious when changing the constant, it must work with nodeStatusUpdateFrequency - // in kubelet. There are several constraints: - // 1. nodeMonitorGracePeriod must be N times more than nodeStatusUpdateFrequency, where - // N means number of retries allowed for kubelet to post node status. It is pointless - // to make nodeMonitorGracePeriod be less than nodeStatusUpdateFrequency, since there - // will only be fresh values from Kubelet at an interval of nodeStatusUpdateFrequency. - // The constant must be less than podEvictionTimeout. - // 2. nodeMonitorGracePeriod can't be too large for user experience - larger value takes - // longer for user to see up-to-date node status. - nodeMonitorGracePeriod time.Duration - // Value controlling NodeController monitoring period, i.e. how often does NodeController - // check node status posted from kubelet. This value should be lower than nodeMonitorGracePeriod. - // TODO: Change node status monitor to watch based. - nodeMonitorPeriod time.Duration - // Value used if sync_nodes_status=False, only for node startup. When node - // is just created, e.g. cluster bootstrap or node creation, we give a longer grace period. - nodeStartupGracePeriod time.Duration - // per Node map storing last observed Status together with a local time when it was observed. - // This timestamp is to be used instead of LastProbeTime stored in Condition. We do this - // to aviod the problem with time skew across the cluster. - nodeStatusMap map[string]nodeStatusData - now func() unversioned.Time - // Lock to access evictor workers - evictorLock *sync.Mutex - // workers that evicts pods from unresponsive nodes. - podEvictor *RateLimitedTimedQueue - terminationEvictor *RateLimitedTimedQueue - podEvictionTimeout time.Duration - // The maximum duration before a pod evicted from a node can be forcefully terminated. - maximumGracePeriod time.Duration - recorder record.EventRecorder - // Pod framework and store - podController *framework.Controller - podStore cache.StoreToPodLister - // Node framework and store - nodeController *framework.Controller - nodeStore cache.StoreToNodeLister - // DaemonSet framework and store - daemonSetController *framework.Controller - daemonSetStore cache.StoreToDaemonSetLister - - forcefullyDeletePod func(*api.Pod) error - nodeExistsInCloudProvider func(string) (bool, error) -} - -// NewNodeController returns a new node controller to sync instances from cloudprovider. -func NewNodeController( - cloud cloudprovider.Interface, - kubeClient clientset.Interface, - podEvictionTimeout time.Duration, - deletionEvictionLimiter flowcontrol.RateLimiter, - terminationEvictionLimiter flowcontrol.RateLimiter, - nodeMonitorGracePeriod time.Duration, - nodeStartupGracePeriod time.Duration, - nodeMonitorPeriod time.Duration, - clusterCIDR *net.IPNet, - allocateNodeCIDRs bool) *NodeController { - eventBroadcaster := record.NewBroadcaster() - recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "controllermanager"}) - eventBroadcaster.StartLogging(glog.Infof) - if kubeClient != nil { - glog.Infof("Sending events to api server.") - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - } else { - glog.Infof("No api server defined - no events will be sent to API server.") - } - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("node_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - if allocateNodeCIDRs && clusterCIDR == nil { - glog.Fatal("NodeController: Must specify clusterCIDR if allocateNodeCIDRs == true.") - } - evictorLock := sync.Mutex{} - - nc := &NodeController{ - cloud: cloud, - knownNodeSet: make(sets.String), - kubeClient: kubeClient, - recorder: recorder, - podEvictionTimeout: podEvictionTimeout, - maximumGracePeriod: 5 * time.Minute, - evictorLock: &evictorLock, - podEvictor: NewRateLimitedTimedQueue(deletionEvictionLimiter), - terminationEvictor: NewRateLimitedTimedQueue(terminationEvictionLimiter), - nodeStatusMap: make(map[string]nodeStatusData), - nodeMonitorGracePeriod: nodeMonitorGracePeriod, - nodeMonitorPeriod: nodeMonitorPeriod, - nodeStartupGracePeriod: nodeStartupGracePeriod, - lookupIP: net.LookupIP, - now: unversioned.Now, - clusterCIDR: clusterCIDR, - allocateNodeCIDRs: allocateNodeCIDRs, - forcefullyDeletePod: func(p *api.Pod) error { return forcefullyDeletePod(kubeClient, p) }, - nodeExistsInCloudProvider: func(nodeName string) (bool, error) { return nodeExistsInCloudProvider(cloud, nodeName) }, - } - - nc.podStore.Indexer, nc.podController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return nc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return nc.kubeClient.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - controller.NoResyncPeriodFunc(), - framework.ResourceEventHandlerFuncs{ - AddFunc: nc.maybeDeleteTerminatingPod, - UpdateFunc: func(_, obj interface{}) { nc.maybeDeleteTerminatingPod(obj) }, - }, - // We don't need to build a index for podStore here actually, but build one for consistency. - // It will ensure that if people start making use of the podStore in more specific ways, - // they'll get the benefits they expect. It will also reserve the name for future refactorings. - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - nc.nodeStore.Store, nc.nodeController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return nc.kubeClient.Core().Nodes().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return nc.kubeClient.Core().Nodes().Watch(options) - }, - }, - &api.Node{}, - controller.NoResyncPeriodFunc(), - framework.ResourceEventHandlerFuncs{}, - ) - nc.daemonSetStore.Store, nc.daemonSetController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return nc.kubeClient.Extensions().DaemonSets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return nc.kubeClient.Extensions().DaemonSets(api.NamespaceAll).Watch(options) - }, - }, - &extensions.DaemonSet{}, - controller.NoResyncPeriodFunc(), - framework.ResourceEventHandlerFuncs{}, - ) - return nc -} - -// Run starts an asynchronous loop that monitors the status of cluster nodes. -func (nc *NodeController) Run(period time.Duration) { - go nc.nodeController.Run(wait.NeverStop) - go nc.podController.Run(wait.NeverStop) - go nc.daemonSetController.Run(wait.NeverStop) - - // Incorporate the results of node status pushed from kubelet to master. - go wait.Until(func() { - if err := nc.monitorNodeStatus(); err != nil { - glog.Errorf("Error monitoring node status: %v", err) - } - }, nc.nodeMonitorPeriod, wait.NeverStop) - - // Managing eviction of nodes: - // 1. when we delete pods off a node, if the node was not empty at the time we then - // queue a termination watcher - // a. If we hit an error, retry deletion - // 2. The terminator loop ensures that pods are eventually cleaned and we never - // terminate a pod in a time period less than nc.maximumGracePeriod. AddedAt - // is the time from which we measure "has this pod been terminating too long", - // after which we will delete the pod with grace period 0 (force delete). - // a. If we hit errors, retry instantly - // b. If there are no pods left terminating, exit - // c. If there are pods still terminating, wait for their estimated completion - // before retrying - go wait.Until(func() { - nc.evictorLock.Lock() - defer nc.evictorLock.Unlock() - nc.podEvictor.Try(func(value TimedValue) (bool, time.Duration) { - remaining, err := nc.deletePods(value.Value) - if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to evict node %q: %v", value.Value, err)) - return false, 0 - } - - if remaining { - nc.terminationEvictor.Add(value.Value) - } - return true, 0 - }) - }, nodeEvictionPeriod, wait.NeverStop) - - // TODO: replace with a controller that ensures pods that are terminating complete - // in a particular time period - go wait.Until(func() { - nc.evictorLock.Lock() - defer nc.evictorLock.Unlock() - nc.terminationEvictor.Try(func(value TimedValue) (bool, time.Duration) { - completed, remaining, err := nc.terminatePods(value.Value, value.AddedAt) - if err != nil { - utilruntime.HandleError(fmt.Errorf("unable to terminate pods on node %q: %v", value.Value, err)) - return false, 0 - } - - if completed { - glog.Infof("All pods terminated on %s", value.Value) - nc.recordNodeEvent(value.Value, api.EventTypeNormal, "TerminatedAllPods", fmt.Sprintf("Terminated all Pods on Node %s.", value.Value)) - return true, 0 - } - - glog.V(2).Infof("Pods terminating since %s on %q, estimated completion %s", value.AddedAt, value.Value, remaining) - // clamp very short intervals - if remaining < nodeEvictionPeriod { - remaining = nodeEvictionPeriod - } - return false, remaining - }) - }, nodeEvictionPeriod, wait.NeverStop) - - go wait.Until(nc.cleanupOrphanedPods, 30*time.Second, wait.NeverStop) -} - -// Generates num pod CIDRs that could be assigned to nodes. -func generateCIDRs(clusterCIDR *net.IPNet, num int) sets.String { - res := sets.NewString() - cidrIP := clusterCIDR.IP.To4() - for i := 0; i < num; i++ { - // TODO: Make the CIDRs configurable. - b1 := byte(i >> 8) - b2 := byte(i % 256) - res.Insert(fmt.Sprintf("%d.%d.%d.0/24", cidrIP[0], cidrIP[1]+b1, cidrIP[2]+b2)) - } - return res -} - -// getCondition returns a condition object for the specific condition -// type, nil if the condition is not set. -func (nc *NodeController) getCondition(status *api.NodeStatus, conditionType api.NodeConditionType) *api.NodeCondition { - if status == nil { - return nil - } - for i := range status.Conditions { - if status.Conditions[i].Type == conditionType { - return &status.Conditions[i] - } - } - return nil -} - -var gracefulDeletionVersion = version.MustParse("v1.1.0") - -// maybeDeleteTerminatingPod non-gracefully deletes pods that are terminating -// that should not be gracefully terminated. -func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { - pod, ok := obj.(*api.Pod) - if !ok { - return - } - - // consider only terminating pods - if pod.DeletionTimestamp == nil { - return - } - - // delete terminating pods that have not yet been scheduled - if len(pod.Spec.NodeName) == 0 { - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } - - nodeObj, found, err := nc.nodeStore.GetByKey(pod.Spec.NodeName) - if err != nil { - // this can only happen if the Store.KeyFunc has a problem creating - // a key for the pod. If it happens once, it will happen again so - // don't bother requeuing the pod. - utilruntime.HandleError(err) - return - } - - // delete terminating pods that have been scheduled on - // nonexistent nodes - if !found { - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } - - // delete terminating pods that have been scheduled on - // nodes that do not support graceful termination - // TODO(mikedanese): this can be removed when we no longer - // guarantee backwards compatibility of master API to kubelets with - // versions less than 1.1.0 - node := nodeObj.(*api.Node) - v, err := version.Parse(node.Status.NodeInfo.KubeletVersion) - if err != nil { - glog.Infof("couldn't parse verions %q of minion: %v", node.Status.NodeInfo.KubeletVersion, err) - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } - if gracefulDeletionVersion.GT(v) { - utilruntime.HandleError(nc.forcefullyDeletePod(pod)) - return - } -} - -// cleanupOrphanedPods deletes pods that are bound to nodes that don't -// exist. -func (nc *NodeController) cleanupOrphanedPods() { - pods, err := nc.podStore.List(labels.Everything()) - if err != nil { - utilruntime.HandleError(err) - return - } - - for _, pod := range pods { - if pod.Spec.NodeName == "" { - continue - } - if _, exists, _ := nc.nodeStore.Store.GetByKey(pod.Spec.NodeName); exists { - continue - } - if err := nc.forcefullyDeletePod(pod); err != nil { - utilruntime.HandleError(err) - } - } -} - -func forcefullyDeletePod(c clientset.Interface, pod *api.Pod) error { - var zero int64 - err := c.Core().Pods(pod.Namespace).Delete(pod.Name, &api.DeleteOptions{GracePeriodSeconds: &zero}) - if err == nil { - glog.Infof("forceful deletion of %s succeeded", pod.Name) - } - return err -} - -// monitorNodeStatus verifies node status are constantly updated by kubelet, and if not, -// post "NodeReady==ConditionUnknown". It also evicts all pods if node is not ready or -// not reachable for a long period of time. -func (nc *NodeController) monitorNodeStatus() error { - nodes, err := nc.kubeClient.Core().Nodes().List(api.ListOptions{}) - if err != nil { - return err - } - for _, node := range nodes.Items { - if !nc.knownNodeSet.Has(node.Name) { - glog.V(1).Infof("NodeController observed a new Node: %#v", node) - nc.recordNodeEvent(node.Name, api.EventTypeNormal, "RegisteredNode", fmt.Sprintf("Registered Node %v in NodeController", node.Name)) - nc.cancelPodEviction(node.Name) - nc.knownNodeSet.Insert(node.Name) - } - } - // If there's a difference between lengths of known Nodes and observed nodes - // we must have removed some Node. - if len(nc.knownNodeSet) != len(nodes.Items) { - observedSet := make(sets.String) - for _, node := range nodes.Items { - observedSet.Insert(node.Name) - } - deleted := nc.knownNodeSet.Difference(observedSet) - for nodeName := range deleted { - glog.V(1).Infof("NodeController observed a Node deletion: %v", nodeName) - nc.recordNodeEvent(nodeName, api.EventTypeNormal, "RemovingNode", fmt.Sprintf("Removing Node %v from NodeController", nodeName)) - nc.evictPods(nodeName) - nc.knownNodeSet.Delete(nodeName) - } - } - - if nc.allocateNodeCIDRs { - // TODO (cjcullen): Use pkg/controller/framework to watch nodes and - // reduce lists/decouple this from monitoring status. - nc.reconcileNodeCIDRs(nodes) - } - for i := range nodes.Items { - var gracePeriod time.Duration - var lastReadyCondition api.NodeCondition - var readyCondition *api.NodeCondition - node := &nodes.Items[i] - for rep := 0; rep < nodeStatusUpdateRetry; rep++ { - gracePeriod, lastReadyCondition, readyCondition, err = nc.tryUpdateNodeStatus(node) - if err == nil { - break - } - name := node.Name - node, err = nc.kubeClient.Core().Nodes().Get(name) - if err != nil { - glog.Errorf("Failed while getting a Node to retry updating NodeStatus. Probably Node %s was deleted.", name) - break - } - } - if err != nil { - glog.Errorf("Update status of Node %v from NodeController exceeds retry count."+ - "Skipping - no pods will be evicted.", node.Name) - continue - } - - decisionTimestamp := nc.now() - - if readyCondition != nil { - // Check eviction timeout against decisionTimestamp - if lastReadyCondition.Status == api.ConditionFalse && - decisionTimestamp.After(nc.nodeStatusMap[node.Name].readyTransitionTimestamp.Add(nc.podEvictionTimeout)) { - if nc.evictPods(node.Name) { - glog.V(4).Infof("Evicting pods on node %s: %v is later than %v + %v", node.Name, decisionTimestamp, nc.nodeStatusMap[node.Name].readyTransitionTimestamp, nc.podEvictionTimeout) - } - } - if lastReadyCondition.Status == api.ConditionUnknown && - decisionTimestamp.After(nc.nodeStatusMap[node.Name].probeTimestamp.Add(nc.podEvictionTimeout)) { - if nc.evictPods(node.Name) { - glog.V(4).Infof("Evicting pods on node %s: %v is later than %v + %v", node.Name, decisionTimestamp, nc.nodeStatusMap[node.Name].readyTransitionTimestamp, nc.podEvictionTimeout-gracePeriod) - } - } - if lastReadyCondition.Status == api.ConditionTrue { - if nc.cancelPodEviction(node.Name) { - glog.V(2).Infof("Node %s is ready again, cancelled pod eviction", node.Name) - } - } - - // Report node event. - if readyCondition.Status != api.ConditionTrue && lastReadyCondition.Status == api.ConditionTrue { - nc.recordNodeStatusChange(node, "NodeNotReady") - if err = nc.markAllPodsNotReady(node.Name); err != nil { - utilruntime.HandleError(fmt.Errorf("Unable to mark all pods NotReady on node %v: %v", node.Name, err)) - } - } - - // Check with the cloud provider to see if the node still exists. If it - // doesn't, delete the node immediately. - if readyCondition.Status != api.ConditionTrue && nc.cloud != nil { - exists, err := nc.nodeExistsInCloudProvider(node.Name) - if err != nil { - glog.Errorf("Error determining if node %v exists in cloud: %v", node.Name, err) - continue - } - if !exists { - glog.Infof("Deleting node (no longer present in cloud provider): %s", node.Name) - nc.recordNodeEvent(node.Name, api.EventTypeNormal, "DeletingNode", fmt.Sprintf("Deleting Node %v because it's not present according to cloud provider", node.Name)) - go func(nodeName string) { - defer utilruntime.HandleCrash() - // Kubelet is not reporting and Cloud Provider says node - // is gone. Delete it without worrying about grace - // periods. - if err := nc.forcefullyDeleteNode(nodeName); err != nil { - glog.Errorf("Unable to forcefully delete node %q: %v", nodeName, err) - } - }(node.Name) - continue - } - } - } - } - return nil -} - -func nodeExistsInCloudProvider(cloud cloudprovider.Interface, nodeName string) (bool, error) { - instances, ok := cloud.Instances() - if !ok { - return false, fmt.Errorf("%v", ErrCloudInstance) - } - if _, err := instances.ExternalID(nodeName); err != nil { - if err == cloudprovider.InstanceNotFound { - return false, nil - } - return false, err - } - return true, nil -} - -// forcefullyDeleteNode immediately deletes all pods on the node, and then -// deletes the node itself. -func (nc *NodeController) forcefullyDeleteNode(nodeName string) error { - selector := fields.OneTermEqualSelector(api.PodHostField, nodeName) - options := api.ListOptions{FieldSelector: selector} - pods, err := nc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - if err != nil { - return fmt.Errorf("unable to list pods on node %q: %v", nodeName, err) - } - for _, pod := range pods.Items { - if pod.Spec.NodeName != nodeName { - continue - } - if err := nc.forcefullyDeletePod(&pod); err != nil { - return fmt.Errorf("unable to delete pod %q on node %q: %v", pod.Name, nodeName, err) - } - } - if err := nc.kubeClient.Core().Nodes().Delete(nodeName, nil); err != nil { - return fmt.Errorf("unable to delete node %q: %v", nodeName, err) - } - return nil -} - -// reconcileNodeCIDRs looks at each node and assigns it a valid CIDR -// if it doesn't currently have one. -func (nc *NodeController) reconcileNodeCIDRs(nodes *api.NodeList) { - glog.V(4).Infof("Reconciling cidrs for %d nodes", len(nodes.Items)) - // TODO(roberthbailey): This seems inefficient. Why re-calculate CIDRs - // on each sync period? - availableCIDRs := generateCIDRs(nc.clusterCIDR, len(nodes.Items)) - for _, node := range nodes.Items { - if node.Spec.PodCIDR != "" { - glog.V(4).Infof("CIDR %s is already being used by node %s", node.Spec.PodCIDR, node.Name) - availableCIDRs.Delete(node.Spec.PodCIDR) - } - } - for _, node := range nodes.Items { - if node.Spec.PodCIDR == "" { - // Re-GET node (because ours might be stale by now). - n, err := nc.kubeClient.Core().Nodes().Get(node.Name) - if err != nil { - glog.Errorf("Failed to get node %q: %v", node.Name, err) - continue - } - podCIDR, found := availableCIDRs.PopAny() - if !found { - nc.recordNodeStatusChange(n, "CIDRNotAvailable") - continue - } - glog.V(1).Infof("Assigning node %s CIDR %s", n.Name, podCIDR) - n.Spec.PodCIDR = podCIDR - if _, err := nc.kubeClient.Core().Nodes().Update(n); err != nil { - nc.recordNodeStatusChange(&node, "CIDRAssignmentFailed") - } - } - - } -} - -func (nc *NodeController) recordNodeEvent(nodeName, eventtype, reason, event string) { - ref := &api.ObjectReference{ - Kind: "Node", - Name: nodeName, - UID: types.UID(nodeName), - Namespace: "", - } - glog.V(2).Infof("Recording %s event message for node %s", event, nodeName) - nc.recorder.Eventf(ref, eventtype, reason, "Node %s event: %s", nodeName, event) -} - -func (nc *NodeController) recordNodeStatusChange(node *api.Node, new_status string) { - ref := &api.ObjectReference{ - Kind: "Node", - Name: node.Name, - UID: types.UID(node.Name), - Namespace: "", - } - glog.V(2).Infof("Recording status change %s event message for node %s", new_status, node.Name) - // TODO: This requires a transaction, either both node status is updated - // and event is recorded or neither should happen, see issue #6055. - nc.recorder.Eventf(ref, api.EventTypeNormal, new_status, "Node %s status is now: %s", node.Name, new_status) -} - -// For a given node checks its conditions and tries to update it. Returns grace period to which given node -// is entitled, state of current and last observed Ready Condition, and an error if it occurred. -func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, api.NodeCondition, *api.NodeCondition, error) { - var err error - var gracePeriod time.Duration - var lastReadyCondition api.NodeCondition - readyCondition := nc.getCondition(&node.Status, api.NodeReady) - if readyCondition == nil { - // If ready condition is nil, then kubelet (or nodecontroller) never posted node status. - // A fake ready condition is created, where LastProbeTime and LastTransitionTime is set - // to node.CreationTimestamp to avoid handle the corner case. - lastReadyCondition = api.NodeCondition{ - Type: api.NodeReady, - Status: api.ConditionUnknown, - LastHeartbeatTime: node.CreationTimestamp, - LastTransitionTime: node.CreationTimestamp, - } - gracePeriod = nc.nodeStartupGracePeriod - nc.nodeStatusMap[node.Name] = nodeStatusData{ - status: node.Status, - probeTimestamp: node.CreationTimestamp, - readyTransitionTimestamp: node.CreationTimestamp, - } - } else { - // If ready condition is not nil, make a copy of it, since we may modify it in place later. - lastReadyCondition = *readyCondition - gracePeriod = nc.nodeMonitorGracePeriod - } - - savedNodeStatus, found := nc.nodeStatusMap[node.Name] - // There are following cases to check: - // - both saved and new status have no Ready Condition set - we leave everything as it is, - // - saved status have no Ready Condition, but current one does - NodeController was restarted with Node data already present in etcd, - // - saved status have some Ready Condition, but current one does not - it's an error, but we fill it up because that's probably a good thing to do, - // - both saved and current statuses have Ready Conditions and they have the same LastProbeTime - nothing happened on that Node, it may be - // unresponsive, so we leave it as it is, - // - both saved and current statuses have Ready Conditions, they have different LastProbeTimes, but the same Ready Condition State - - // everything's in order, no transition occurred, we update only probeTimestamp, - // - both saved and current statuses have Ready Conditions, different LastProbeTimes and different Ready Condition State - - // Ready Condition changed it state since we last seen it, so we update both probeTimestamp and readyTransitionTimestamp. - // TODO: things to consider: - // - if 'LastProbeTime' have gone back in time its probably an error, currently we ignore it, - // - currently only correct Ready State transition outside of Node Controller is marking it ready by Kubelet, we don't check - // if that's the case, but it does not seem necessary. - var savedCondition *api.NodeCondition - if found { - savedCondition = nc.getCondition(&savedNodeStatus.status, api.NodeReady) - } - observedCondition := nc.getCondition(&node.Status, api.NodeReady) - if !found { - glog.Warningf("Missing timestamp for Node %s. Assuming now as a timestamp.", node.Name) - savedNodeStatus = nodeStatusData{ - status: node.Status, - probeTimestamp: nc.now(), - readyTransitionTimestamp: nc.now(), - } - nc.nodeStatusMap[node.Name] = savedNodeStatus - } else if savedCondition == nil && observedCondition != nil { - glog.V(1).Infof("Creating timestamp entry for newly observed Node %s", node.Name) - savedNodeStatus = nodeStatusData{ - status: node.Status, - probeTimestamp: nc.now(), - readyTransitionTimestamp: nc.now(), - } - nc.nodeStatusMap[node.Name] = savedNodeStatus - } else if savedCondition != nil && observedCondition == nil { - glog.Errorf("ReadyCondition was removed from Status of Node %s", node.Name) - // TODO: figure out what to do in this case. For now we do the same thing as above. - savedNodeStatus = nodeStatusData{ - status: node.Status, - probeTimestamp: nc.now(), - readyTransitionTimestamp: nc.now(), - } - nc.nodeStatusMap[node.Name] = savedNodeStatus - } else if savedCondition != nil && observedCondition != nil && savedCondition.LastHeartbeatTime != observedCondition.LastHeartbeatTime { - var transitionTime unversioned.Time - // If ReadyCondition changed since the last time we checked, we update the transition timestamp to "now", - // otherwise we leave it as it is. - if savedCondition.LastTransitionTime != observedCondition.LastTransitionTime { - glog.V(3).Infof("ReadyCondition for Node %s transitioned from %v to %v", node.Name, savedCondition.Status, observedCondition) - - transitionTime = nc.now() - } else { - transitionTime = savedNodeStatus.readyTransitionTimestamp - } - if glog.V(5) { - glog.Infof("Node %s ReadyCondition updated. Updating timestamp: %+v vs %+v.", node.Name, savedNodeStatus.status, node.Status) - } else { - glog.V(3).Infof("Node %s ReadyCondition updated. Updating timestamp.", node.Name) - } - savedNodeStatus = nodeStatusData{ - status: node.Status, - probeTimestamp: nc.now(), - readyTransitionTimestamp: transitionTime, - } - nc.nodeStatusMap[node.Name] = savedNodeStatus - } - - if nc.now().After(savedNodeStatus.probeTimestamp.Add(gracePeriod)) { - // NodeReady condition was last set longer ago than gracePeriod, so update it to Unknown - // (regardless of its current value) in the master. - if readyCondition == nil { - glog.V(2).Infof("node %v is never updated by kubelet", node.Name) - node.Status.Conditions = append(node.Status.Conditions, api.NodeCondition{ - Type: api.NodeReady, - Status: api.ConditionUnknown, - Reason: "NodeStatusNeverUpdated", - Message: fmt.Sprintf("Kubelet never posted node status."), - LastHeartbeatTime: node.CreationTimestamp, - LastTransitionTime: nc.now(), - }) - } else { - glog.V(4).Infof("node %v hasn't been updated for %+v. Last ready condition is: %+v", - node.Name, nc.now().Time.Sub(savedNodeStatus.probeTimestamp.Time), lastReadyCondition) - if lastReadyCondition.Status != api.ConditionUnknown { - readyCondition.Status = api.ConditionUnknown - readyCondition.Reason = "NodeStatusUnknown" - readyCondition.Message = fmt.Sprintf("Kubelet stopped posting node status.") - // LastProbeTime is the last time we heard from kubelet. - readyCondition.LastHeartbeatTime = lastReadyCondition.LastHeartbeatTime - readyCondition.LastTransitionTime = nc.now() - } - } - - // Like NodeReady condition, NodeOutOfDisk was last set longer ago than gracePeriod, so update - // it to Unknown (regardless of its current value) in the master. - // TODO(madhusudancs): Refactor this with readyCondition to remove duplicated code. - oodCondition := nc.getCondition(&node.Status, api.NodeOutOfDisk) - if oodCondition == nil { - glog.V(2).Infof("Out of disk condition of node %v is never updated by kubelet", node.Name) - node.Status.Conditions = append(node.Status.Conditions, api.NodeCondition{ - Type: api.NodeOutOfDisk, - Status: api.ConditionUnknown, - Reason: "NodeStatusNeverUpdated", - Message: fmt.Sprintf("Kubelet never posted node status."), - LastHeartbeatTime: node.CreationTimestamp, - LastTransitionTime: nc.now(), - }) - } else { - glog.V(4).Infof("node %v hasn't been updated for %+v. Last out of disk condition is: %+v", - node.Name, nc.now().Time.Sub(savedNodeStatus.probeTimestamp.Time), oodCondition) - if oodCondition.Status != api.ConditionUnknown { - oodCondition.Status = api.ConditionUnknown - oodCondition.Reason = "NodeStatusUnknown" - oodCondition.Message = fmt.Sprintf("Kubelet stopped posting node status.") - oodCondition.LastTransitionTime = nc.now() - } - } - - if !api.Semantic.DeepEqual(nc.getCondition(&node.Status, api.NodeReady), &lastReadyCondition) { - if _, err = nc.kubeClient.Core().Nodes().UpdateStatus(node); err != nil { - glog.Errorf("Error updating node %s: %v", node.Name, err) - return gracePeriod, lastReadyCondition, readyCondition, err - } else { - nc.nodeStatusMap[node.Name] = nodeStatusData{ - status: node.Status, - probeTimestamp: nc.nodeStatusMap[node.Name].probeTimestamp, - readyTransitionTimestamp: nc.now(), - } - return gracePeriod, lastReadyCondition, readyCondition, nil - } - } - } - - return gracePeriod, lastReadyCondition, readyCondition, err -} - -// evictPods queues an eviction for the provided node name, and returns false if the node is already -// queued for eviction. -func (nc *NodeController) evictPods(nodeName string) bool { - nc.evictorLock.Lock() - defer nc.evictorLock.Unlock() - return nc.podEvictor.Add(nodeName) -} - -// cancelPodEviction removes any queued evictions, typically because the node is available again. It -// returns true if an eviction was queued. -func (nc *NodeController) cancelPodEviction(nodeName string) bool { - nc.evictorLock.Lock() - defer nc.evictorLock.Unlock() - wasDeleting := nc.podEvictor.Remove(nodeName) - wasTerminating := nc.terminationEvictor.Remove(nodeName) - if wasDeleting || wasTerminating { - glog.V(2).Infof("Cancelling pod Eviction on Node: %v", nodeName) - return true - } - return false -} - -// deletePods will delete all pods from master running on given node, and return true -// if any pods were deleted. -func (nc *NodeController) deletePods(nodeName string) (bool, error) { - remaining := false - selector := fields.OneTermEqualSelector(api.PodHostField, nodeName) - options := api.ListOptions{FieldSelector: selector} - pods, err := nc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - if err != nil { - return remaining, err - } - - if len(pods.Items) > 0 { - nc.recordNodeEvent(nodeName, api.EventTypeNormal, "DeletingAllPods", fmt.Sprintf("Deleting all Pods from Node %v.", nodeName)) - } - - for _, pod := range pods.Items { - // Defensive check, also needed for tests. - if pod.Spec.NodeName != nodeName { - continue - } - // if the pod has already been deleted, ignore it - if pod.DeletionGracePeriodSeconds != nil { - continue - } - // if the pod is managed by a daemonset, ignore it - _, err := nc.daemonSetStore.GetPodDaemonSets(&pod) - if err == nil { // No error means at least one daemonset was found - continue - } - - glog.V(2).Infof("Starting deletion of pod %v", pod.Name) - nc.recorder.Eventf(&pod, api.EventTypeNormal, "NodeControllerEviction", "Marking for deletion Pod %s from Node %s", pod.Name, nodeName) - if err := nc.kubeClient.Core().Pods(pod.Namespace).Delete(pod.Name, nil); err != nil { - return false, err - } - remaining = true - } - return remaining, nil -} - -// update ready status of all pods running on given node from master -// return true if success -func (nc *NodeController) markAllPodsNotReady(nodeName string) error { - glog.V(2).Infof("Update ready status of pods on node [%v]", nodeName) - opts := api.ListOptions{FieldSelector: fields.OneTermEqualSelector(api.PodHostField, nodeName)} - pods, err := nc.kubeClient.Core().Pods(api.NamespaceAll).List(opts) - if err != nil { - return err - } - - errMsg := []string{} - for _, pod := range pods.Items { - // Defensive check, also needed for tests. - if pod.Spec.NodeName != nodeName { - continue - } - - for i, cond := range pod.Status.Conditions { - if cond.Type == api.PodReady { - pod.Status.Conditions[i].Status = api.ConditionFalse - glog.V(2).Infof("Updating ready status of pod %v to false", pod.Name) - pod, err := nc.kubeClient.Core().Pods(pod.Namespace).UpdateStatus(&pod) - if err != nil { - glog.Warningf("Failed to update status for pod %q: %v", format.Pod(pod), err) - errMsg = append(errMsg, fmt.Sprintf("%v", err)) - } - break - } - } - } - if len(errMsg) == 0 { - return nil - } - return fmt.Errorf("%v", strings.Join(errMsg, "; ")) -} - -// terminatePods will ensure all pods on the given node that are in terminating state are eventually -// cleaned up. Returns true if the node has no pods in terminating state, a duration that indicates how -// long before we should check again (the next deadline for a pod to complete), or an error. -func (nc *NodeController) terminatePods(nodeName string, since time.Time) (bool, time.Duration, error) { - // the time before we should try again - nextAttempt := time.Duration(0) - // have we deleted all pods - complete := true - - selector := fields.OneTermEqualSelector(api.PodHostField, nodeName) - options := api.ListOptions{FieldSelector: selector} - pods, err := nc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - if err != nil { - return false, nextAttempt, err - } - - now := time.Now() - elapsed := now.Sub(since) - for _, pod := range pods.Items { - // Defensive check, also needed for tests. - if pod.Spec.NodeName != nodeName { - continue - } - // only clean terminated pods - if pod.DeletionGracePeriodSeconds == nil { - continue - } - - // the user's requested grace period - grace := time.Duration(*pod.DeletionGracePeriodSeconds) * time.Second - if grace > nc.maximumGracePeriod { - grace = nc.maximumGracePeriod - } - - // the time remaining before the pod should have been deleted - remaining := grace - elapsed - if remaining < 0 { - remaining = 0 - glog.V(2).Infof("Removing pod %v after %s grace period", pod.Name, grace) - nc.recordNodeEvent(nodeName, api.EventTypeNormal, "TerminatingEvictedPod", fmt.Sprintf("Pod %s has exceeded the grace period for deletion after being evicted from Node %q and is being force killed", pod.Name, nodeName)) - if err := nc.kubeClient.Core().Pods(pod.Namespace).Delete(pod.Name, api.NewDeleteOptions(0)); err != nil { - glog.Errorf("Error completing deletion of pod %s: %v", pod.Name, err) - complete = false - } - } else { - glog.V(2).Infof("Pod %v still terminating, requested grace period %s, %s remaining", pod.Name, grace, remaining) - complete = false - } - - if nextAttempt < remaining { - nextAttempt = remaining - } - } - return complete, nextAttempt, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller_test.go deleted file mode 100644 index 4f43ac6af..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/nodecontroller_test.go +++ /dev/null @@ -1,1189 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 node - -import ( - "errors" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" - "k8s.io/kubernetes/pkg/util/diff" - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - testNodeMonitorGracePeriod = 40 * time.Second - testNodeStartupGracePeriod = 60 * time.Second - testNodeMonitorPeriod = 5 * time.Second -) - -// FakeNodeHandler is a fake implementation of NodesInterface and NodeInterface. It -// allows test cases to have fine-grained control over mock behaviors. We also need -// PodsInterface and PodInterface to test list & delet pods, which is implemented in -// the embedded client.Fake field. -type FakeNodeHandler struct { - *fake.Clientset - - // Input: Hooks determine if request is valid or not - CreateHook func(*FakeNodeHandler, *api.Node) bool - Existing []*api.Node - - // Output - CreatedNodes []*api.Node - DeletedNodes []*api.Node - UpdatedNodes []*api.Node - UpdatedNodeStatuses []*api.Node - RequestCount int - - // Synchronization - createLock sync.Mutex - deleteWaitChan chan struct{} -} - -type FakeLegacyHandler struct { - unversionedcore.CoreInterface - n *FakeNodeHandler -} - -func (c *FakeNodeHandler) Core() unversionedcore.CoreInterface { - return &FakeLegacyHandler{c.Clientset.Core(), c} -} - -func (m *FakeLegacyHandler) Nodes() unversionedcore.NodeInterface { - return m.n -} - -func (m *FakeNodeHandler) Create(node *api.Node) (*api.Node, error) { - m.createLock.Lock() - defer func() { - m.RequestCount++ - m.createLock.Unlock() - }() - for _, n := range m.Existing { - if n.Name == node.Name { - return nil, apierrors.NewAlreadyExists(api.Resource("nodes"), node.Name) - } - } - if m.CreateHook == nil || m.CreateHook(m, node) { - nodeCopy := *node - m.CreatedNodes = append(m.CreatedNodes, &nodeCopy) - return node, nil - } else { - return nil, errors.New("Create error.") - } -} - -func (m *FakeNodeHandler) Get(name string) (*api.Node, error) { - return nil, nil -} - -func (m *FakeNodeHandler) List(opts api.ListOptions) (*api.NodeList, error) { - defer func() { m.RequestCount++ }() - var nodes []*api.Node - for i := 0; i < len(m.UpdatedNodes); i++ { - if !contains(m.UpdatedNodes[i], m.DeletedNodes) { - nodes = append(nodes, m.UpdatedNodes[i]) - } - } - for i := 0; i < len(m.Existing); i++ { - if !contains(m.Existing[i], m.DeletedNodes) && !contains(m.Existing[i], nodes) { - nodes = append(nodes, m.Existing[i]) - } - } - for i := 0; i < len(m.CreatedNodes); i++ { - if !contains(m.Existing[i], m.DeletedNodes) && !contains(m.CreatedNodes[i], nodes) { - nodes = append(nodes, m.CreatedNodes[i]) - } - } - nodeList := &api.NodeList{} - for _, node := range nodes { - nodeList.Items = append(nodeList.Items, *node) - } - return nodeList, nil -} - -func (m *FakeNodeHandler) Delete(id string, opt *api.DeleteOptions) error { - defer func() { - if m.deleteWaitChan != nil { - m.deleteWaitChan <- struct{}{} - } - }() - m.DeletedNodes = append(m.DeletedNodes, newNode(id)) - m.RequestCount++ - return nil -} - -func (m *FakeNodeHandler) DeleteCollection(opt *api.DeleteOptions, listOpts api.ListOptions) error { - return nil -} - -func (m *FakeNodeHandler) Update(node *api.Node) (*api.Node, error) { - nodeCopy := *node - m.UpdatedNodes = append(m.UpdatedNodes, &nodeCopy) - m.RequestCount++ - return node, nil -} - -func (m *FakeNodeHandler) UpdateStatus(node *api.Node) (*api.Node, error) { - nodeCopy := *node - m.UpdatedNodeStatuses = append(m.UpdatedNodeStatuses, &nodeCopy) - m.RequestCount++ - return node, nil -} - -func (m *FakeNodeHandler) Watch(opts api.ListOptions) (watch.Interface, error) { - return nil, nil -} - -func TestMonitorNodeStatusEvictPods(t *testing.T) { - fakeNow := unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC) - evictionTimeout := 10 * time.Minute - - table := []struct { - fakeNodeHandler *FakeNodeHandler - daemonSets []extensions.DaemonSet - timeToPass time.Duration - newNodeStatus api.NodeStatus - expectedEvictPods bool - description string - }{ - // Node created recently, with no status (happens only at cluster startup). - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: fakeNow, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - daemonSets: nil, - timeToPass: 0, - newNodeStatus: api.NodeStatus{}, - expectedEvictPods: false, - description: "Node created recently, with no status.", - }, - // Node created long time ago, and kubelet posted NotReady for a short period of time. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - daemonSets: nil, - timeToPass: evictionTimeout, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - // Node status has just been updated, and is NotReady for 10min. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 9, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - expectedEvictPods: false, - description: "Node created long time ago, and kubelet posted NotReady for a short period of time.", - }, - // Pod is ds-managed, and kubelet posted NotReady for a long period of time. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset( - &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "pod0", - Namespace: "default", - Labels: map[string]string{"daemon": "yes"}, - }, - Spec: api.PodSpec{ - NodeName: "node0", - }, - }, - }, - }, - ), - }, - daemonSets: []extensions.DaemonSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: "ds0", - Namespace: "default", - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"daemon": "yes"}, - }, - }, - }, - }, - timeToPass: time.Hour, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - // Node status has just been updated, and is NotReady for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 59, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - expectedEvictPods: false, - description: "Pod is ds-managed, and kubelet posted NotReady for a long period of time.", - }, - // Node created long time ago, and kubelet posted NotReady for a long period of time. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - daemonSets: nil, - timeToPass: time.Hour, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionFalse, - // Node status has just been updated, and is NotReady for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 59, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - expectedEvictPods: true, - description: "Node created long time ago, and kubelet posted NotReady for a long period of time.", - }, - // Node created long time ago, node controller posted Unknown for a short period of time. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - daemonSets: nil, - timeToPass: evictionTimeout - testNodeMonitorGracePeriod, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - // Node status was updated by nodecontroller 10min ago - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - expectedEvictPods: false, - description: "Node created long time ago, node controller posted Unknown for a short period of time.", - }, - // Node created long time ago, node controller posted Unknown for a long period of time. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - daemonSets: nil, - timeToPass: 60 * time.Minute, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - // Node status was updated by nodecontroller 1hr ago - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - expectedEvictPods: true, - description: "Node created long time ago, node controller posted Unknown for a long period of time.", - }, - } - - for _, item := range table { - nodeController := NewNodeController(nil, item.fakeNodeHandler, - evictionTimeout, flowcontrol.NewFakeAlwaysRateLimiter(), flowcontrol.NewFakeAlwaysRateLimiter(), testNodeMonitorGracePeriod, - testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, false) - nodeController.now = func() unversioned.Time { return fakeNow } - for _, ds := range item.daemonSets { - nodeController.daemonSetStore.Add(&ds) - } - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - if item.timeToPass > 0 { - nodeController.now = func() unversioned.Time { return unversioned.Time{Time: fakeNow.Add(item.timeToPass)} } - item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus - } - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - - nodeController.podEvictor.Try(func(value TimedValue) (bool, time.Duration) { - remaining, _ := nodeController.deletePods(value.Value) - if remaining { - nodeController.terminationEvictor.Add(value.Value) - } - return true, 0 - }) - nodeController.podEvictor.Try(func(value TimedValue) (bool, time.Duration) { - nodeController.terminatePods(value.Value, value.AddedAt) - return true, 0 - }) - podEvicted := false - for _, action := range item.fakeNodeHandler.Actions() { - if action.GetVerb() == "delete" && action.GetResource().Resource == "pods" { - podEvicted = true - } - } - - if item.expectedEvictPods != podEvicted { - t.Errorf("expected pod eviction: %+v, got %+v for %+v", item.expectedEvictPods, - podEvicted, item.description) - } - } -} - -// TestCloudProviderNoRateLimit tests that monitorNodes() immediately deletes -// pods and the node when kubelet has not reported, and the cloudprovider says -// the node is gone. -func TestCloudProviderNoRateLimit(t *testing.T) { - fnh := &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0"), *newPod("pod1", "node0")}}), - deleteWaitChan: make(chan struct{}), - } - nodeController := NewNodeController(nil, fnh, 10*time.Minute, - flowcontrol.NewFakeAlwaysRateLimiter(), flowcontrol.NewFakeAlwaysRateLimiter(), - testNodeMonitorGracePeriod, testNodeStartupGracePeriod, - testNodeMonitorPeriod, nil, false) - nodeController.cloud = &fakecloud.FakeCloud{} - nodeController.now = func() unversioned.Time { return unversioned.Date(2016, 1, 1, 12, 0, 0, 0, time.UTC) } - nodeController.nodeExistsInCloudProvider = func(nodeName string) (bool, error) { - return false, nil - } - // monitorNodeStatus should allow this node to be immediately deleted - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - select { - case <-fnh.deleteWaitChan: - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Timed out waiting %v for node to be deleted", wait.ForeverTestTimeout) - } - if len(fnh.DeletedNodes) != 1 || fnh.DeletedNodes[0].Name != "node0" { - t.Errorf("Node was not deleted") - } - if nodeOnQueue := nodeController.podEvictor.Remove("node0"); nodeOnQueue { - t.Errorf("Node was queued for eviction. Should have been immediately deleted.") - } -} - -func TestMonitorNodeStatusUpdateStatus(t *testing.T) { - fakeNow := unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC) - table := []struct { - fakeNodeHandler *FakeNodeHandler - timeToPass time.Duration - newNodeStatus api.NodeStatus - expectedEvictPods bool - expectedRequestCount int - expectedNodes []*api.Node - }{ - // Node created long time ago, without status: - // Expect Unknown status posted from node controller. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedRequestCount: 2, // List+Update - expectedNodes: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - Reason: "NodeStatusNeverUpdated", - Message: "Kubelet never posted node status.", - LastHeartbeatTime: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - LastTransitionTime: fakeNow, - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionUnknown, - Reason: "NodeStatusNeverUpdated", - Message: "Kubelet never posted node status.", - LastHeartbeatTime: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - LastTransitionTime: fakeNow, - }, - }, - }, - }, - }, - }, - // Node created recently, without status. - // Expect no action from node controller (within startup grace period). - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: fakeNow, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedRequestCount: 1, // List - expectedNodes: nil, - }, - // Node created long time ago, with status updated by kubelet exceeds grace period. - // Expect Unknown status posted from node controller. - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionFalse, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedRequestCount: 3, // (List+)List+Update - timeToPass: time.Hour, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionFalse, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - expectedNodes: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionUnknown, - Reason: "NodeStatusUnknown", - Message: "Kubelet stopped posting node status.", - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Time{Time: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC).Add(time.Hour)}, - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionUnknown, - Reason: "NodeStatusUnknown", - Message: "Kubelet stopped posting node status.", - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Time{Time: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC).Add(time.Hour)}, - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - }, - // Node created long time ago, with status updated recently. - // Expect no action from node controller (within monitor grace period). - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status has just been updated. - LastHeartbeatTime: fakeNow, - LastTransitionTime: fakeNow, - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedRequestCount: 1, // List - expectedNodes: nil, - }, - } - - for i, item := range table { - nodeController := NewNodeController(nil, item.fakeNodeHandler, 5*time.Minute, flowcontrol.NewFakeAlwaysRateLimiter(), - flowcontrol.NewFakeAlwaysRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, false) - nodeController.now = func() unversioned.Time { return fakeNow } - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - if item.timeToPass > 0 { - nodeController.now = func() unversioned.Time { return unversioned.Time{Time: fakeNow.Add(item.timeToPass)} } - item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - } - if item.expectedRequestCount != item.fakeNodeHandler.RequestCount { - t.Errorf("expected %v call, but got %v.", item.expectedRequestCount, item.fakeNodeHandler.RequestCount) - } - if len(item.fakeNodeHandler.UpdatedNodes) > 0 && !api.Semantic.DeepEqual(item.expectedNodes, item.fakeNodeHandler.UpdatedNodes) { - t.Errorf("Case[%d] unexpected nodes: %s", i, diff.ObjectDiff(item.expectedNodes[0], item.fakeNodeHandler.UpdatedNodes[0])) - } - if len(item.fakeNodeHandler.UpdatedNodeStatuses) > 0 && !api.Semantic.DeepEqual(item.expectedNodes, item.fakeNodeHandler.UpdatedNodeStatuses) { - t.Errorf("Case[%d] unexpected nodes: %s", i, diff.ObjectDiff(item.expectedNodes[0], item.fakeNodeHandler.UpdatedNodeStatuses[0])) - } - } -} - -func TestMonitorNodeStatusMarkPodsNotReady(t *testing.T) { - fakeNow := unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC) - table := []struct { - fakeNodeHandler *FakeNodeHandler - timeToPass time.Duration - newNodeStatus api.NodeStatus - expectedPodStatusUpdate bool - }{ - // Node created recently, without status. - // Expect no action from node controller (within startup grace period). - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: fakeNow, - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedPodStatusUpdate: false, - }, - // Node created long time ago, with status updated recently. - // Expect no action from node controller (within monitor grace period). - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status has just been updated. - LastHeartbeatTime: fakeNow, - LastTransitionTime: fakeNow, - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - expectedPodStatusUpdate: false, - }, - // Node created long time ago, with status updated by kubelet exceeds grace period. - // Expect pods status updated and Unknown node status posted from node controller - { - fakeNodeHandler: &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionFalse, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0")}}), - }, - timeToPass: 1 * time.Minute, - newNodeStatus: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - { - Type: api.NodeOutOfDisk, - Status: api.ConditionFalse, - // Node status hasn't been updated for 1hr. - LastHeartbeatTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - LastTransitionTime: unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - expectedPodStatusUpdate: true, - }, - } - - for i, item := range table { - nodeController := NewNodeController(nil, item.fakeNodeHandler, 5*time.Minute, flowcontrol.NewFakeAlwaysRateLimiter(), - flowcontrol.NewFakeAlwaysRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, false) - nodeController.now = func() unversioned.Time { return fakeNow } - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("Case[%d] unexpected error: %v", i, err) - } - if item.timeToPass > 0 { - nodeController.now = func() unversioned.Time { return unversioned.Time{Time: fakeNow.Add(item.timeToPass)} } - item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("Case[%d] unexpected error: %v", i, err) - } - } - - podStatusUpdated := false - for _, action := range item.fakeNodeHandler.Actions() { - if action.GetVerb() == "update" && action.GetResource().Resource == "pods" && action.GetSubresource() == "status" { - podStatusUpdated = true - } - } - if podStatusUpdated != item.expectedPodStatusUpdate { - t.Errorf("Case[%d] expect pod status updated to be %v, but got %v", i, item.expectedPodStatusUpdate, podStatusUpdated) - } - } -} - -func TestNodeDeletion(t *testing.T) { - fakeNow := unversioned.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC) - fakeNodeHandler := &FakeNodeHandler{ - Existing: []*api.Node{ - { - ObjectMeta: api.ObjectMeta{ - Name: "node0", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status has just been updated. - LastHeartbeatTime: fakeNow, - LastTransitionTime: fakeNow, - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "node1", - CreationTimestamp: unversioned.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), - }, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - { - Type: api.NodeReady, - Status: api.ConditionTrue, - // Node status has just been updated. - LastHeartbeatTime: fakeNow, - LastTransitionTime: fakeNow, - }, - }, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - Spec: api.NodeSpec{ - ExternalID: "node0", - }, - }, - }, - Clientset: fake.NewSimpleClientset(&api.PodList{Items: []api.Pod{*newPod("pod0", "node0"), *newPod("pod1", "node1")}}), - } - - nodeController := NewNodeController(nil, fakeNodeHandler, 5*time.Minute, flowcontrol.NewFakeAlwaysRateLimiter(), flowcontrol.NewFakeAlwaysRateLimiter(), - testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, false) - nodeController.now = func() unversioned.Time { return fakeNow } - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - fakeNodeHandler.Delete("node1", nil) - if err := nodeController.monitorNodeStatus(); err != nil { - t.Errorf("unexpected error: %v", err) - } - nodeController.podEvictor.Try(func(value TimedValue) (bool, time.Duration) { - nodeController.deletePods(value.Value) - return true, 0 - }) - podEvicted := false - for _, action := range fakeNodeHandler.Actions() { - if action.GetVerb() == "delete" && action.GetResource().Resource == "pods" { - podEvicted = true - } - } - if !podEvicted { - t.Error("expected pods to be evicted from the deleted node") - } -} - -func TestCheckPod(t *testing.T) { - - tcs := []struct { - pod api.Pod - prune bool - }{ - - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: nil}, - Spec: api.PodSpec{NodeName: "new"}, - }, - prune: false, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: nil}, - Spec: api.PodSpec{NodeName: "old"}, - }, - prune: false, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: nil}, - Spec: api.PodSpec{NodeName: ""}, - }, - prune: false, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: nil}, - Spec: api.PodSpec{NodeName: "nonexistant"}, - }, - prune: false, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: "new"}, - }, - prune: false, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: "old"}, - }, - prune: true, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: "older"}, - }, - prune: true, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: "oldest"}, - }, - prune: true, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: ""}, - }, - prune: true, - }, - { - pod: api.Pod{ - ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, - Spec: api.PodSpec{NodeName: "nonexistant"}, - }, - prune: true, - }, - } - - nc := NewNodeController(nil, nil, 0, nil, nil, 0, 0, 0, nil, false) - nc.nodeStore.Store = cache.NewStore(cache.MetaNamespaceKeyFunc) - nc.nodeStore.Store.Add(&api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "new", - }, - Status: api.NodeStatus{ - NodeInfo: api.NodeSystemInfo{ - KubeletVersion: "v1.1.0", - }, - }, - }) - nc.nodeStore.Store.Add(&api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "old", - }, - Status: api.NodeStatus{ - NodeInfo: api.NodeSystemInfo{ - KubeletVersion: "v1.0.0", - }, - }, - }) - nc.nodeStore.Store.Add(&api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "older", - }, - Status: api.NodeStatus{ - NodeInfo: api.NodeSystemInfo{ - KubeletVersion: "v0.21.4", - }, - }, - }) - nc.nodeStore.Store.Add(&api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "oldest", - }, - Status: api.NodeStatus{ - NodeInfo: api.NodeSystemInfo{ - KubeletVersion: "v0.19.3", - }, - }, - }) - - for i, tc := range tcs { - var deleteCalls int - nc.forcefullyDeletePod = func(_ *api.Pod) error { - deleteCalls++ - return nil - } - - nc.maybeDeleteTerminatingPod(&tc.pod) - - if tc.prune && deleteCalls != 1 { - t.Errorf("[%v] expected number of delete calls to be 1 but got %v", i, deleteCalls) - } - if !tc.prune && deleteCalls != 0 { - t.Errorf("[%v] expected number of delete calls to be 0 but got %v", i, deleteCalls) - } - } -} - -func TestCleanupOrphanedPods(t *testing.T) { - newPod := func(name, node string) api.Pod { - return api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - Spec: api.PodSpec{ - NodeName: node, - }, - } - } - pods := []api.Pod{ - newPod("a", "foo"), - newPod("b", "bar"), - newPod("c", "gone"), - } - nc := NewNodeController(nil, nil, 0, nil, nil, 0, 0, 0, nil, false) - - nc.nodeStore.Store.Add(newNode("foo")) - nc.nodeStore.Store.Add(newNode("bar")) - for _, pod := range pods { - p := pod - nc.podStore.Indexer.Add(&p) - } - - var deleteCalls int - var deletedPodName string - nc.forcefullyDeletePod = func(p *api.Pod) error { - deleteCalls++ - deletedPodName = p.ObjectMeta.Name - return nil - } - nc.cleanupOrphanedPods() - - if deleteCalls != 1 { - t.Fatalf("expected one delete, got: %v", deleteCalls) - } - if deletedPodName != "c" { - t.Fatalf("expected deleted pod name to be 'c', but got: %q", deletedPodName) - } -} - -func newNode(name string) *api.Node { - return &api.Node{ - ObjectMeta: api.ObjectMeta{Name: name}, - Spec: api.NodeSpec{ - ExternalID: name, - }, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("10"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - } -} - -func newPod(name, host string) *api.Pod { - return &api.Pod{ObjectMeta: api.ObjectMeta{Name: name}, Spec: api.PodSpec{NodeName: host}, - Status: api.PodStatus{Conditions: []api.PodCondition{{Type: api.PodReady, Status: api.ConditionTrue}}}} -} - -func contains(node *api.Node, nodes []*api.Node) bool { - for i := 0; i < len(nodes); i++ { - if node.Name == nodes[i].Name { - return true - } - } - return false -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue.go deleted file mode 100644 index a3f007565..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue.go +++ /dev/null @@ -1,201 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 node - -import ( - "container/heap" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/sets" -) - -// TimedValue is a value that should be processed at a designated time. -type TimedValue struct { - Value string - AddedAt time.Time - ProcessAt time.Time -} - -// now is used to test time -var now func() time.Time = time.Now - -// TimedQueue is a priority heap where the lowest ProcessAt is at the front of the queue -type TimedQueue []*TimedValue - -func (h TimedQueue) Len() int { return len(h) } -func (h TimedQueue) Less(i, j int) bool { return h[i].ProcessAt.Before(h[j].ProcessAt) } -func (h TimedQueue) Swap(i, j int) { h[i], h[j] = h[j], h[i] } - -func (h *TimedQueue) Push(x interface{}) { - *h = append(*h, x.(*TimedValue)) -} - -func (h *TimedQueue) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} - -// A FIFO queue which additionally guarantees that any element can be added only once until -// it is removed. -type UniqueQueue struct { - lock sync.Mutex - queue TimedQueue - set sets.String -} - -// Adds a new value to the queue if it wasn't added before, or was explicitly removed by the -// Remove call. Returns true if new value was added. -func (q *UniqueQueue) Add(value TimedValue) bool { - q.lock.Lock() - defer q.lock.Unlock() - - if q.set.Has(value.Value) { - return false - } - heap.Push(&q.queue, &value) - q.set.Insert(value.Value) - return true -} - -// Replace replaces an existing value in the queue if it already exists, otherwise it does nothing. -// Returns true if the item was found. -func (q *UniqueQueue) Replace(value TimedValue) bool { - q.lock.Lock() - defer q.lock.Unlock() - - for i := range q.queue { - if q.queue[i].Value != value.Value { - continue - } - heap.Remove(&q.queue, i) - heap.Push(&q.queue, &value) - return true - } - return false -} - -// Removes the value from the queue, so Get() call won't return it, and allow subsequent addition -// of the given value. If the value is not present does nothing and returns false. -func (q *UniqueQueue) Remove(value string) bool { - q.lock.Lock() - defer q.lock.Unlock() - - q.set.Delete(value) - for i, val := range q.queue { - if val.Value == value { - heap.Remove(&q.queue, i) - return true - } - } - return false -} - -// Returns the oldest added value that wasn't returned yet. -func (q *UniqueQueue) Get() (TimedValue, bool) { - q.lock.Lock() - defer q.lock.Unlock() - if len(q.queue) == 0 { - return TimedValue{}, false - } - result := heap.Pop(&q.queue).(*TimedValue) - q.set.Delete(result.Value) - return *result, true -} - -// Head returns the oldest added value that wasn't returned yet without removing it. -func (q *UniqueQueue) Head() (TimedValue, bool) { - q.lock.Lock() - defer q.lock.Unlock() - if len(q.queue) == 0 { - return TimedValue{}, false - } - result := q.queue[0] - return *result, true -} - -// RateLimitedTimedQueue is a unique item priority queue ordered by the expected next time -// of execution. It is also rate limited. -type RateLimitedTimedQueue struct { - queue UniqueQueue - limiter flowcontrol.RateLimiter -} - -// Creates new queue which will use given RateLimiter to oversee execution. -func NewRateLimitedTimedQueue(limiter flowcontrol.RateLimiter) *RateLimitedTimedQueue { - return &RateLimitedTimedQueue{ - queue: UniqueQueue{ - queue: TimedQueue{}, - set: sets.NewString(), - }, - limiter: limiter, - } -} - -// ActionFunc takes a timed value and returns false if the item must be retried, with an optional -// time.Duration if some minimum wait interval should be used. -type ActionFunc func(TimedValue) (bool, time.Duration) - -// Try processes the queue. Ends prematurely if RateLimiter forbids an action and leak is true. -// Otherwise, requeues the item to be processed. Each value is processed once if fn returns true, -// otherwise it is added back to the queue. The returned remaining is used to identify the minimum -// time to execute the next item in the queue. -func (q *RateLimitedTimedQueue) Try(fn ActionFunc) { - val, ok := q.queue.Head() - for ok { - // rate limit the queue checking - if !q.limiter.TryAccept() { - glog.V(10).Info("Try rate limited...") - // Try again later - break - } - - now := now() - if now.Before(val.ProcessAt) { - break - } - - if ok, wait := fn(val); !ok { - val.ProcessAt = now.Add(wait + 1) - q.queue.Replace(val) - } else { - q.queue.Remove(val.Value) - } - val, ok = q.queue.Head() - } -} - -// Adds value to the queue to be processed. Won't add the same value a second time if it was already -// added and not removed. -func (q *RateLimitedTimedQueue) Add(value string) bool { - now := now() - return q.queue.Add(TimedValue{ - Value: value, - AddedAt: now, - ProcessAt: now, - }) -} - -// Removes Node from the Evictor. The Node won't be processed until added again. -func (q *RateLimitedTimedQueue) Remove(value string) bool { - return q.queue.Remove(value) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue_test.go deleted file mode 100644 index e6ed0bd12..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/node/rate_limited_queue_test.go +++ /dev/null @@ -1,263 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 node - -import ( - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/sets" -) - -func CheckQueueEq(lhs []string, rhs TimedQueue) bool { - for i := 0; i < len(lhs); i++ { - if rhs[i].Value != lhs[i] { - return false - } - } - return true -} - -func CheckSetEq(lhs, rhs sets.String) bool { - return lhs.HasAll(rhs.List()...) && rhs.HasAll(lhs.List()...) -} - -func TestAddNode(t *testing.T) { - evictor := NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - - queuePattern := []string{"first", "second", "third"} - if len(evictor.queue.queue) != len(queuePattern) { - t.Fatalf("Queue %v should have length %d", evictor.queue.queue, len(queuePattern)) - } - if !CheckQueueEq(queuePattern, evictor.queue.queue) { - t.Errorf("Invalid queue. Got %v, expected %v", evictor.queue.queue, queuePattern) - } - - setPattern := sets.NewString("first", "second", "third") - if len(evictor.queue.set) != len(setPattern) { - t.Fatalf("Map %v should have length %d", evictor.queue.set, len(setPattern)) - } - if !CheckSetEq(setPattern, evictor.queue.set) { - t.Errorf("Invalid map. Got %v, expected %v", evictor.queue.set, setPattern) - } -} - -func TestDelNode(t *testing.T) { - evictor := NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - evictor.Remove("first") - - queuePattern := []string{"second", "third"} - if len(evictor.queue.queue) != len(queuePattern) { - t.Fatalf("Queue %v should have length %d", evictor.queue.queue, len(queuePattern)) - } - if !CheckQueueEq(queuePattern, evictor.queue.queue) { - t.Errorf("Invalid queue. Got %v, expected %v", evictor.queue.queue, queuePattern) - } - - setPattern := sets.NewString("second", "third") - if len(evictor.queue.set) != len(setPattern) { - t.Fatalf("Map %v should have length %d", evictor.queue.set, len(setPattern)) - } - if !CheckSetEq(setPattern, evictor.queue.set) { - t.Errorf("Invalid map. Got %v, expected %v", evictor.queue.set, setPattern) - } - - evictor = NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - evictor.Remove("second") - - queuePattern = []string{"first", "third"} - if len(evictor.queue.queue) != len(queuePattern) { - t.Fatalf("Queue %v should have length %d", evictor.queue.queue, len(queuePattern)) - } - if !CheckQueueEq(queuePattern, evictor.queue.queue) { - t.Errorf("Invalid queue. Got %v, expected %v", evictor.queue.queue, queuePattern) - } - - setPattern = sets.NewString("first", "third") - if len(evictor.queue.set) != len(setPattern) { - t.Fatalf("Map %v should have length %d", evictor.queue.set, len(setPattern)) - } - if !CheckSetEq(setPattern, evictor.queue.set) { - t.Errorf("Invalid map. Got %v, expected %v", evictor.queue.set, setPattern) - } - - evictor = NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - evictor.Remove("third") - - queuePattern = []string{"first", "second"} - if len(evictor.queue.queue) != len(queuePattern) { - t.Fatalf("Queue %v should have length %d", evictor.queue.queue, len(queuePattern)) - } - if !CheckQueueEq(queuePattern, evictor.queue.queue) { - t.Errorf("Invalid queue. Got %v, expected %v", evictor.queue.queue, queuePattern) - } - - setPattern = sets.NewString("first", "second") - if len(evictor.queue.set) != len(setPattern) { - t.Fatalf("Map %v should have length %d", evictor.queue.set, len(setPattern)) - } - if !CheckSetEq(setPattern, evictor.queue.set) { - t.Errorf("Invalid map. Got %v, expected %v", evictor.queue.set, setPattern) - } -} - -func TestTry(t *testing.T) { - evictor := NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - evictor.Remove("second") - - deletedMap := sets.NewString() - evictor.Try(func(value TimedValue) (bool, time.Duration) { - deletedMap.Insert(value.Value) - return true, 0 - }) - - setPattern := sets.NewString("first", "third") - if len(deletedMap) != len(setPattern) { - t.Fatalf("Map %v should have length %d", evictor.queue.set, len(setPattern)) - } - if !CheckSetEq(setPattern, deletedMap) { - t.Errorf("Invalid map. Got %v, expected %v", deletedMap, setPattern) - } -} - -func TestTryOrdering(t *testing.T) { - defer func() { now = time.Now }() - current := time.Unix(0, 0) - delay := 0 - // the current time is incremented by 1ms every time now is invoked - now = func() time.Time { - if delay > 0 { - delay-- - } else { - current = current.Add(time.Millisecond) - } - t.Logf("time %d", current.UnixNano()) - return current - } - evictor := NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - - order := []string{} - count := 0 - hasQueued := false - evictor.Try(func(value TimedValue) (bool, time.Duration) { - count++ - t.Logf("eviction %d", count) - if value.ProcessAt.IsZero() { - t.Fatalf("processAt should not be zero") - } - switch value.Value { - case "first": - if !value.AddedAt.Equal(time.Unix(0, time.Millisecond.Nanoseconds())) { - t.Fatalf("added time for %s is %d", value.Value, value.AddedAt) - } - - case "second": - if !value.AddedAt.Equal(time.Unix(0, 2*time.Millisecond.Nanoseconds())) { - t.Fatalf("added time for %s is %d", value.Value, value.AddedAt) - } - if hasQueued { - if !value.ProcessAt.Equal(time.Unix(0, 6*time.Millisecond.Nanoseconds())) { - t.Fatalf("process time for %s is %d", value.Value, value.ProcessAt) - } - break - } - hasQueued = true - delay = 1 - t.Logf("going to delay") - return false, 2 * time.Millisecond - - case "third": - if !value.AddedAt.Equal(time.Unix(0, 3*time.Millisecond.Nanoseconds())) { - t.Fatalf("added time for %s is %d", value.Value, value.AddedAt) - } - } - order = append(order, value.Value) - return true, 0 - }) - if !reflect.DeepEqual(order, []string{"first", "third"}) { - t.Fatalf("order was wrong: %v", order) - } - if count != 3 { - t.Fatalf("unexpected iterations: %d", count) - } -} - -func TestTryRemovingWhileTry(t *testing.T) { - evictor := NewRateLimitedTimedQueue(flowcontrol.NewFakeAlwaysRateLimiter()) - evictor.Add("first") - evictor.Add("second") - evictor.Add("third") - - processing := make(chan struct{}) - wait := make(chan struct{}) - order := []string{} - count := 0 - queued := false - - // while the Try function is processing "second", remove it from the queue - // we should not see "second" retried. - go func() { - <-processing - evictor.Remove("second") - close(wait) - }() - - evictor.Try(func(value TimedValue) (bool, time.Duration) { - count++ - if value.AddedAt.IsZero() { - t.Fatalf("added should not be zero") - } - if value.ProcessAt.IsZero() { - t.Fatalf("next should not be zero") - } - if !queued && value.Value == "second" { - queued = true - close(processing) - <-wait - return false, time.Millisecond - } - order = append(order, value.Value) - return true, 0 - }) - - if !reflect.DeepEqual(order, []string{"first", "third"}) { - t.Fatalf("order was wrong: %v", order) - } - if count != 3 { - t.Fatalf("unexpected iterations: %d", count) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/OWNERS b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/OWNERS deleted file mode 100644 index b9e1568ab..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -assignees: - - saad-ali - - thockin diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/options/options.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/options/options.go deleted file mode 100644 index c3b6c175a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/options/options.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 options - -import ( - "time" - - "github.com/spf13/pflag" -) - -// VolumeConfigFlags is used to bind CLI flags to variables. This top-level struct contains *all* enumerated -// CLI flags meant to configure all volume plugins. From this config, the binary will create many instances -// of volume.VolumeConfig which are then passed to the appropriate plugin. The ControllerManager binary is the only -// part of the code which knows what plugins are supported and which CLI flags correspond to each plugin. -type VolumeConfigFlags struct { - PersistentVolumeRecyclerMaximumRetry int - PersistentVolumeRecyclerMinimumTimeoutNFS int - PersistentVolumeRecyclerPodTemplateFilePathNFS string - PersistentVolumeRecyclerIncrementTimeoutNFS int - PersistentVolumeRecyclerPodTemplateFilePathHostPath string - PersistentVolumeRecyclerMinimumTimeoutHostPath int - PersistentVolumeRecyclerIncrementTimeoutHostPath int - EnableHostPathProvisioning bool -} - -type PersistentVolumeControllerOptions struct { - PVClaimBinderSyncPeriod time.Duration - VolumeConfigFlags VolumeConfigFlags -} - -func NewPersistentVolumeControllerOptions() PersistentVolumeControllerOptions { - return PersistentVolumeControllerOptions{ - PVClaimBinderSyncPeriod: 10 * time.Minute, - VolumeConfigFlags: VolumeConfigFlags{ - // default values here - PersistentVolumeRecyclerMaximumRetry: 3, - PersistentVolumeRecyclerMinimumTimeoutNFS: 300, - PersistentVolumeRecyclerIncrementTimeoutNFS: 30, - PersistentVolumeRecyclerMinimumTimeoutHostPath: 60, - PersistentVolumeRecyclerIncrementTimeoutHostPath: 30, - EnableHostPathProvisioning: false, - }, - } -} - -func (o *PersistentVolumeControllerOptions) AddFlags(fs *pflag.FlagSet) { - fs.DurationVar(&o.PVClaimBinderSyncPeriod, "pvclaimbinder-sync-period", o.PVClaimBinderSyncPeriod, - "The period for syncing persistent volumes and persistent volume claims") - fs.StringVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerPodTemplateFilePathNFS, - "pv-recycler-pod-template-filepath-nfs", o.VolumeConfigFlags.PersistentVolumeRecyclerPodTemplateFilePathNFS, - "The file path to a pod definition used as a template for NFS persistent volume recycling") - fs.IntVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerMinimumTimeoutNFS, "pv-recycler-minimum-timeout-nfs", - o.VolumeConfigFlags.PersistentVolumeRecyclerMinimumTimeoutNFS, "The minimum ActiveDeadlineSeconds to use for an NFS Recycler pod") - fs.IntVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerIncrementTimeoutNFS, "pv-recycler-increment-timeout-nfs", - o.VolumeConfigFlags.PersistentVolumeRecyclerIncrementTimeoutNFS, "the increment of time added per Gi to ActiveDeadlineSeconds for an NFS scrubber pod") - fs.StringVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerPodTemplateFilePathHostPath, "pv-recycler-pod-template-filepath-hostpath", - o.VolumeConfigFlags.PersistentVolumeRecyclerPodTemplateFilePathHostPath, - "The file path to a pod definition used as a template for HostPath persistent volume recycling. "+ - "This is for development and testing only and will not work in a multi-node cluster.") - fs.IntVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerMinimumTimeoutHostPath, "pv-recycler-minimum-timeout-hostpath", - o.VolumeConfigFlags.PersistentVolumeRecyclerMinimumTimeoutHostPath, - "The minimum ActiveDeadlineSeconds to use for a HostPath Recycler pod. This is for development and testing only and will not work in a multi-node cluster.") - fs.IntVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerIncrementTimeoutHostPath, "pv-recycler-timeout-increment-hostpath", - o.VolumeConfigFlags.PersistentVolumeRecyclerIncrementTimeoutHostPath, - "the increment of time added per Gi to ActiveDeadlineSeconds for a HostPath scrubber pod. "+ - "This is for development and testing only and will not work in a multi-node cluster.") - fs.IntVar(&o.VolumeConfigFlags.PersistentVolumeRecyclerMaximumRetry, "pv-recycler-maximum-retry", - o.VolumeConfigFlags.PersistentVolumeRecyclerMaximumRetry, - "Maximum number of attempts to recycle or delete a persistent volume") - fs.BoolVar(&o.VolumeConfigFlags.EnableHostPathProvisioning, "enable-hostpath-provisioner", o.VolumeConfigFlags.EnableHostPathProvisioning, - "Enable HostPath PV provisioning when running without a cloud provider. This allows testing and development of provisioning features. "+ - "HostPath provisioning is not supported in any way, won't work in a multi-node cluster, and should not be used for anything other than testing or development.") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller.go deleted file mode 100644 index a0e105a09..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller.go +++ /dev/null @@ -1,530 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "sync" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -// PersistentVolumeClaimBinder is a controller that synchronizes PersistentVolumeClaims. -type PersistentVolumeClaimBinder struct { - volumeIndex *persistentVolumeOrderedIndex - volumeController *framework.Controller - claimController *framework.Controller - client binderClient - stopChannels map[string]chan struct{} - lock sync.RWMutex -} - -// NewPersistentVolumeClaimBinder creates a new PersistentVolumeClaimBinder -func NewPersistentVolumeClaimBinder(kubeClient clientset.Interface, syncPeriod time.Duration) *PersistentVolumeClaimBinder { - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("pv_claim_binder_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - volumeIndex := NewPersistentVolumeOrderedIndex() - binderClient := NewBinderClient(kubeClient) - binder := &PersistentVolumeClaimBinder{ - volumeIndex: volumeIndex, - client: binderClient, - } - - _, volumeController := framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return kubeClient.Core().PersistentVolumes().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return kubeClient.Core().PersistentVolumes().Watch(options) - }, - }, - &api.PersistentVolume{}, - // TODO: Can we have much longer period here? - syncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: binder.addVolume, - UpdateFunc: binder.updateVolume, - DeleteFunc: binder.deleteVolume, - }, - ) - _, claimController := framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return kubeClient.Core().PersistentVolumeClaims(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return kubeClient.Core().PersistentVolumeClaims(api.NamespaceAll).Watch(options) - }, - }, - &api.PersistentVolumeClaim{}, - // TODO: Can we have much longer period here? - syncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: binder.addClaim, - UpdateFunc: binder.updateClaim, - DeleteFunc: binder.deleteClaim, - }, - ) - - binder.claimController = claimController - binder.volumeController = volumeController - - return binder -} -func (binder *PersistentVolumeClaimBinder) addVolume(obj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - pv, ok := obj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Expected PersistentVolume but handler received %+v", obj) - return - } - if err := syncVolume(binder.volumeIndex, binder.client, pv); err != nil { - glog.Errorf("PVClaimBinder could not add volume %s: %+v", pv.Name, err) - } -} - -func (binder *PersistentVolumeClaimBinder) updateVolume(oldObj, newObj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - newVolume, ok := newObj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Expected PersistentVolume but handler received %+v", newObj) - return - } - if err := binder.volumeIndex.Update(newVolume); err != nil { - glog.Errorf("Error updating volume %s in index: %v", newVolume.Name, err) - return - } - if err := syncVolume(binder.volumeIndex, binder.client, newVolume); err != nil { - glog.Errorf("PVClaimBinder could not update volume %s: %+v", newVolume.Name, err) - } -} - -func (binder *PersistentVolumeClaimBinder) deleteVolume(obj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - volume, ok := obj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Expected PersistentVolume but handler received %+v", obj) - return - } - if err := binder.volumeIndex.Delete(volume); err != nil { - glog.Errorf("Error deleting volume %s from index: %v", volume.Name, err) - } -} - -func (binder *PersistentVolumeClaimBinder) addClaim(obj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - claim, ok := obj.(*api.PersistentVolumeClaim) - if !ok { - glog.Errorf("Expected PersistentVolumeClaim but handler received %+v", obj) - return - } - if err := syncClaim(binder.volumeIndex, binder.client, claim); err != nil { - glog.Errorf("PVClaimBinder could not add claim %s: %+v", claim.Name, err) - } -} - -func (binder *PersistentVolumeClaimBinder) updateClaim(oldObj, newObj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - newClaim, ok := newObj.(*api.PersistentVolumeClaim) - if !ok { - glog.Errorf("Expected PersistentVolumeClaim but handler received %+v", newObj) - return - } - if err := syncClaim(binder.volumeIndex, binder.client, newClaim); err != nil { - glog.Errorf("PVClaimBinder could not update claim %s: %+v", newClaim.Name, err) - } -} - -func (binder *PersistentVolumeClaimBinder) deleteClaim(obj interface{}) { - binder.lock.Lock() - defer binder.lock.Unlock() - var volume *api.PersistentVolume - if pvc, ok := obj.(*api.PersistentVolumeClaim); ok { - if pvObj, exists, _ := binder.volumeIndex.GetByKey(pvc.Spec.VolumeName); exists { - if pv, ok := pvObj.(*api.PersistentVolume); ok { - volume = pv - } - } - } - if unk, ok := obj.(cache.DeletedFinalStateUnknown); ok && unk.Obj != nil { - if pv, ok := unk.Obj.(*api.PersistentVolume); ok { - volume = pv - } - } - - // sync the volume when its claim is deleted. Explicitly sync'ing the volume here in response to - // claim deletion prevents the volume from waiting until the next sync period for its Release. - if volume != nil { - err := syncVolume(binder.volumeIndex, binder.client, volume) - if err != nil { - glog.Errorf("PVClaimBinder could not update volume %s from deleteClaim handler: %+v", volume.Name, err) - } - } -} - -func syncVolume(volumeIndex *persistentVolumeOrderedIndex, binderClient binderClient, volume *api.PersistentVolume) (err error) { - glog.V(5).Infof("Synchronizing PersistentVolume[%s], current phase: %s\n", volume.Name, volume.Status.Phase) - - // The PV may have been modified by parallel call to syncVolume, load - // the current version. - newPv, err := binderClient.GetPersistentVolume(volume.Name) - if err != nil { - return fmt.Errorf("Cannot reload volume %s: %v", volume.Name, err) - } - volume = newPv - - // volumes can be in one of the following states: - // - // VolumePending -- default value -- not bound to a claim and not yet processed through this controller. - // VolumeAvailable -- not bound to a claim, but processed at least once and found in this controller's volumeIndex. - // VolumeBound -- bound to a claim because volume.Spec.ClaimRef != nil. Claim status may not be correct. - // VolumeReleased -- volume.Spec.ClaimRef != nil but the claim has been deleted by the user. - // VolumeFailed -- volume.Spec.ClaimRef != nil and the volume failed processing in the recycler - currentPhase := volume.Status.Phase - nextPhase := currentPhase - - // Always store the newest volume state in local cache. - _, exists, err := volumeIndex.Get(volume) - if err != nil { - return err - } - if !exists { - volumeIndex.Add(volume) - } else { - volumeIndex.Update(volume) - } - - if isBeingProvisioned(volume) { - glog.V(4).Infof("Skipping PersistentVolume[%s], waiting for provisioning to finish", volume.Name) - return nil - } - - switch currentPhase { - case api.VolumePending: - - // 4 possible states: - // 1. ClaimRef != nil, Claim exists, Claim UID == ClaimRef UID: Prebound to claim. Make volume available for binding (it will match PVC). - // 2. ClaimRef != nil, Claim exists, Claim UID != ClaimRef UID: Recently recycled. Remove bind. Make volume available for new claim. - // 3. ClaimRef != nil, Claim !exists: Recently recycled. Remove bind. Make volume available for new claim. - // 4. ClaimRef == nil: Neither recycled nor prebound. Make volume available for binding. - nextPhase = api.VolumeAvailable - - if volume.Spec.ClaimRef != nil { - claim, err := binderClient.GetPersistentVolumeClaim(volume.Spec.ClaimRef.Namespace, volume.Spec.ClaimRef.Name) - switch { - case err != nil && !errors.IsNotFound(err): - return fmt.Errorf("Error getting PersistentVolumeClaim[%s/%s]: %v", volume.Spec.ClaimRef.Namespace, volume.Spec.ClaimRef.Name, err) - case errors.IsNotFound(err) || (claim != nil && claim.UID != volume.Spec.ClaimRef.UID): - glog.V(5).Infof("PersistentVolume[%s] has a claim ref to a claim which does not exist", volume.Name) - if volume.Spec.PersistentVolumeReclaimPolicy == api.PersistentVolumeReclaimRecycle { - // Pending volumes that have a ClaimRef where the claim is missing were recently recycled. - // The Recycler set the phase to VolumePending to start the volume at the beginning of this lifecycle. - // removing ClaimRef unbinds the volume - clone, err := conversion.NewCloner().DeepCopy(volume) - if err != nil { - return fmt.Errorf("Error cloning pv: %v", err) - } - volumeClone, ok := clone.(*api.PersistentVolume) - if !ok { - return fmt.Errorf("Unexpected pv cast error : %v\n", volumeClone) - } - glog.V(5).Infof("PersistentVolume[%s] is recently recycled; remove claimRef.", volume.Name) - volumeClone.Spec.ClaimRef = nil - - if updatedVolume, err := binderClient.UpdatePersistentVolume(volumeClone); err != nil { - return fmt.Errorf("Unexpected error saving PersistentVolume: %+v", err) - } else { - volume = updatedVolume - volumeIndex.Update(volume) - } - } else { - // Pending volumes that has a ClaimRef and the claim is missing and is was not recycled. - // It must have been freshly provisioned and the claim was deleted during the provisioning. - // Mark the volume as Released, it will be deleted. - nextPhase = api.VolumeReleased - } - } - - // Dynamically provisioned claims remain Pending until its volume is completely provisioned. - // The provisioner updates the PV and triggers this update for the volume. Explicitly sync'ing - // the claim here prevents the need to wait until the next sync period when the claim would normally - // advance to Bound phase. Otherwise, the maximum wait time for the claim to be Bound is the default sync period. - if claim != nil && claim.Status.Phase == api.ClaimPending && keyExists(qosProvisioningKey, claim.Annotations) && isProvisioningComplete(volume) { - syncClaim(volumeIndex, binderClient, claim) - } - } - glog.V(5).Infof("PersistentVolume[%s] is available\n", volume.Name) - - // available volumes await a claim - case api.VolumeAvailable: - if volume.Spec.ClaimRef != nil { - _, err := binderClient.GetPersistentVolumeClaim(volume.Spec.ClaimRef.Namespace, volume.Spec.ClaimRef.Name) - if err == nil { - // change of phase will trigger an update event with the newly bound volume - glog.V(5).Infof("PersistentVolume[%s] is now bound\n", volume.Name) - nextPhase = api.VolumeBound - } else { - if errors.IsNotFound(err) { - nextPhase = api.VolumeReleased - } - } - } - - //bound volumes require verification of their bound claims - case api.VolumeBound: - if volume.Spec.ClaimRef == nil { - return fmt.Errorf("PersistentVolume[%s] expected to be bound but found nil claimRef: %+v", volume.Name, volume) - } else { - claim, err := binderClient.GetPersistentVolumeClaim(volume.Spec.ClaimRef.Namespace, volume.Spec.ClaimRef.Name) - - // A volume is Released when its bound claim cannot be found in the API server. - // A claim by the same name can be found if deleted and recreated before this controller can release - // the volume from the original claim, so a UID check is necessary. - if err != nil { - if errors.IsNotFound(err) { - nextPhase = api.VolumeReleased - } else { - return err - } - } else if claim != nil && claim.UID != volume.Spec.ClaimRef.UID { - nextPhase = api.VolumeReleased - } - } - - // released volumes require recycling - case api.VolumeReleased: - if volume.Spec.ClaimRef == nil { - return fmt.Errorf("PersistentVolume[%s] expected to be bound but found nil claimRef: %+v", volume.Name, volume) - } else { - // another process is watching for released volumes. - // PersistentVolumeReclaimPolicy is set per PersistentVolume - // Recycle - sets the PV to Pending and back under this controller's management - // Delete - delete events are handled by this controller's watch. PVs are removed from the index. - } - - // volumes are removed by processes external to this binder and must be removed from the cluster - case api.VolumeFailed: - if volume.Spec.ClaimRef == nil { - return fmt.Errorf("PersistentVolume[%s] expected to be bound but found nil claimRef: %+v", volume.Name, volume) - } else { - glog.V(5).Infof("PersistentVolume[%s] previously failed recycling. Skipping.\n", volume.Name) - } - } - - if currentPhase != nextPhase { - volume.Status.Phase = nextPhase - - // a change in state will trigger another update through this controller. - // each pass through this controller evaluates current phase and decides whether or not to change to the next phase - glog.V(5).Infof("PersistentVolume[%s] changing phase from %s to %s\n", volume.Name, currentPhase, nextPhase) - volume, err := binderClient.UpdatePersistentVolumeStatus(volume) - if err != nil { - // Rollback to previous phase - volume.Status.Phase = currentPhase - } - volumeIndex.Update(volume) - } - - return nil -} - -func syncClaim(volumeIndex *persistentVolumeOrderedIndex, binderClient binderClient, claim *api.PersistentVolumeClaim) (err error) { - glog.V(5).Infof("Synchronizing PersistentVolumeClaim[%s] for binding", claim.Name) - - // The claim may have been modified by parallel call to syncClaim, load - // the current version. - newClaim, err := binderClient.GetPersistentVolumeClaim(claim.Namespace, claim.Name) - if err != nil { - return fmt.Errorf("Cannot reload claim %s/%s: %v", claim.Namespace, claim.Name, err) - } - claim = newClaim - - switch claim.Status.Phase { - case api.ClaimPending: - // claims w/ a storage-class annotation for provisioning with *only* match volumes with a ClaimRef of the claim. - volume, err := volumeIndex.findBestMatchForClaim(claim) - if err != nil { - return err - } - - if volume == nil { - glog.V(5).Infof("A volume match does not exist for persistent claim: %s", claim.Name) - return nil - } - - if isBeingProvisioned(volume) { - glog.V(5).Infof("PersistentVolume[%s] for PersistentVolumeClaim[%s/%s] is still being provisioned.", volume.Name, claim.Namespace, claim.Name) - return nil - } - - claimRef, err := api.GetReference(claim) - if err != nil { - return fmt.Errorf("Unexpected error getting claim reference: %v\n", err) - } - - // Make a binding reference to the claim by persisting claimRef on the volume. - // The local cache must be updated with the new bind to prevent subsequent - // claims from binding to the volume. - if volume.Spec.ClaimRef == nil { - clone, err := conversion.NewCloner().DeepCopy(volume) - if err != nil { - return fmt.Errorf("Error cloning pv: %v", err) - } - volumeClone, ok := clone.(*api.PersistentVolume) - if !ok { - return fmt.Errorf("Unexpected pv cast error : %v\n", volumeClone) - } - volumeClone.Spec.ClaimRef = claimRef - if updatedVolume, err := binderClient.UpdatePersistentVolume(volumeClone); err != nil { - return fmt.Errorf("Unexpected error saving PersistentVolume.Status: %+v", err) - } else { - volume = updatedVolume - volumeIndex.Update(updatedVolume) - } - } - - // the bind is persisted on the volume above and will always match the claim in a search. - // claim would remain Pending if the update fails, so processing this state is idempotent. - // this only needs to be processed once. - if claim.Spec.VolumeName != volume.Name { - claim.Spec.VolumeName = volume.Name - claim, err = binderClient.UpdatePersistentVolumeClaim(claim) - if err != nil { - return fmt.Errorf("Error updating claim with VolumeName %s: %+v\n", volume.Name, err) - } - } - - claim.Status.Phase = api.ClaimBound - claim.Status.AccessModes = volume.Spec.AccessModes - claim.Status.Capacity = volume.Spec.Capacity - _, err = binderClient.UpdatePersistentVolumeClaimStatus(claim) - if err != nil { - return fmt.Errorf("Unexpected error saving claim status: %+v", err) - } - - case api.ClaimBound: - // no-op. Claim is bound, values from PV are set. PVCs are technically mutable in the API server - // and we don't want to handle those changes at this time. - - default: - return fmt.Errorf("Unknown state for PVC: %#v", claim) - - } - - glog.V(5).Infof("PersistentVolumeClaim[%s] is bound\n", claim.Name) - return nil -} - -func isBeingProvisioned(volume *api.PersistentVolume) bool { - value, found := volume.Annotations[pvProvisioningRequiredAnnotationKey] - if found && value != pvProvisioningCompletedAnnotationValue { - return true - } - return false -} - -// Run starts all of this binder's control loops -func (controller *PersistentVolumeClaimBinder) Run() { - glog.V(5).Infof("Starting PersistentVolumeClaimBinder\n") - if controller.stopChannels == nil { - controller.stopChannels = make(map[string]chan struct{}) - } - - if _, exists := controller.stopChannels["volumes"]; !exists { - controller.stopChannels["volumes"] = make(chan struct{}) - go controller.volumeController.Run(controller.stopChannels["volumes"]) - } - - if _, exists := controller.stopChannels["claims"]; !exists { - controller.stopChannels["claims"] = make(chan struct{}) - go controller.claimController.Run(controller.stopChannels["claims"]) - } -} - -// Stop gracefully shuts down this binder -func (controller *PersistentVolumeClaimBinder) Stop() { - glog.V(5).Infof("Stopping PersistentVolumeClaimBinder\n") - for name, stopChan := range controller.stopChannels { - close(stopChan) - delete(controller.stopChannels, name) - } -} - -// binderClient abstracts access to PVs and PVCs -type binderClient interface { - GetPersistentVolume(name string) (*api.PersistentVolume, error) - UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) - DeletePersistentVolume(volume *api.PersistentVolume) error - UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) - GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) - UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) - UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) -} - -func NewBinderClient(c clientset.Interface) binderClient { - return &realBinderClient{c} -} - -type realBinderClient struct { - client clientset.Interface -} - -func (c *realBinderClient) GetPersistentVolume(name string) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Get(name) -} - -func (c *realBinderClient) UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Update(volume) -} - -func (c *realBinderClient) DeletePersistentVolume(volume *api.PersistentVolume) error { - return c.client.Core().PersistentVolumes().Delete(volume.Name, nil) -} - -func (c *realBinderClient) UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().UpdateStatus(volume) -} - -func (c *realBinderClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(namespace).Get(name) -} - -func (c *realBinderClient) UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(claim.Namespace).Update(claim) -} - -func (c *realBinderClient) UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(claim.Namespace).UpdateStatus(claim) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller_test.go deleted file mode 100644 index f01908c7f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_claim_binder_controller_test.go +++ /dev/null @@ -1,732 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "os" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/types" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/host_path" - volumetest "k8s.io/kubernetes/pkg/volume/testing" -) - -func TestRunStop(t *testing.T) { - clientset := fake.NewSimpleClientset() - binder := NewPersistentVolumeClaimBinder(clientset, 1*time.Second) - - if len(binder.stopChannels) != 0 { - t.Errorf("Non-running binder should not have any stopChannels. Got %v", len(binder.stopChannels)) - } - - binder.Run() - - if len(binder.stopChannels) != 2 { - t.Errorf("Running binder should have exactly 2 stopChannels. Got %v", len(binder.stopChannels)) - } - - binder.Stop() - - if len(binder.stopChannels) != 0 { - t.Errorf("Non-running binder should not have any stopChannels. Got %v", len(binder.stopChannels)) - } -} - -func TestClaimRace(t *testing.T) { - tmpDir, err := utiltesting.MkTmpdir("claimbinder-test") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - c1 := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "c1", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"), - }, - }, - }, - Status: api.PersistentVolumeClaimStatus{ - Phase: api.ClaimPending, - }, - } - c1.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - - c2 := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "c2", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"), - }, - }, - }, - Status: api.PersistentVolumeClaimStatus{ - Phase: api.ClaimPending, - }, - } - c2.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - - v := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PersistentVolumeSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: fmt.Sprintf("%s/data01", tmpDir), - }, - }, - }, - Status: api.PersistentVolumeStatus{ - Phase: api.VolumePending, - }, - } - - volumeIndex := NewPersistentVolumeOrderedIndex() - mockClient := &mockBinderClient{} - mockClient.volume = v - - plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) - // adds the volume to the index, making the volume available - syncVolume(volumeIndex, mockClient, v) - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - if _, exists, _ := volumeIndex.Get(v); !exists { - t.Errorf("Expected to find volume in index but it did not exist") - } - - // add the claim to fake API server - mockClient.UpdatePersistentVolumeClaim(c1) - // an initial sync for a claim matches the volume - err = syncClaim(volumeIndex, mockClient, c1) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - if c1.Status.Phase != api.ClaimBound { - t.Errorf("Expected phase %s but got %s", api.ClaimBound, c1.Status.Phase) - } - - // before the volume gets updated w/ claimRef, a 2nd claim can attempt to bind and find the same volume - // add the 2nd claim to fake API server - mockClient.UpdatePersistentVolumeClaim(c2) - err = syncClaim(volumeIndex, mockClient, c2) - if err != nil { - t.Errorf("unexpected error for unmatched claim: %v", err) - } - if c2.Status.Phase != api.ClaimPending { - t.Errorf("Expected phase %s but got %s", api.ClaimPending, c2.Status.Phase) - } -} - -func TestNewClaimWithSameNameAsOldClaim(t *testing.T) { - c1 := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "c1", - Namespace: "foo", - UID: "12345", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"), - }, - }, - }, - Status: api.PersistentVolumeClaimStatus{ - Phase: api.ClaimBound, - }, - } - c1.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - - v := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PersistentVolumeSpec{ - ClaimRef: &api.ObjectReference{ - Name: c1.Name, - Namespace: c1.Namespace, - UID: "45678", - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: "/tmp/data01", - }, - }, - }, - Status: api.PersistentVolumeStatus{ - Phase: api.VolumeBound, - }, - } - - volumeIndex := NewPersistentVolumeOrderedIndex() - mockClient := &mockBinderClient{ - claim: c1, - volume: v, - } - - plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) - - syncVolume(volumeIndex, mockClient, v) - if mockClient.volume.Status.Phase != api.VolumeReleased { - t.Errorf("Expected phase %s but got %s", api.VolumeReleased, mockClient.volume.Status.Phase) - } - -} - -func TestClaimSyncAfterVolumeProvisioning(t *testing.T) { - tmpDir, err := utiltesting.MkTmpdir("claimbinder-test") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - - // Tests that binder.syncVolume will also syncClaim if the PV has completed - // provisioning but the claim is still Pending. We want to advance to Bound - // without having to wait until the binder's next sync period. - claim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "bar", - Annotations: map[string]string{ - qosProvisioningKey: "foo", - }, - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"), - }, - }, - }, - Status: api.PersistentVolumeClaimStatus{ - Phase: api.ClaimPending, - }, - } - claim.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - claimRef, _ := api.GetReference(claim) - - pv := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Annotations: map[string]string{ - pvProvisioningRequiredAnnotationKey: pvProvisioningCompletedAnnotationValue, - }, - }, - Spec: api.PersistentVolumeSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: fmt.Sprintf("%s/data01", tmpDir), - }, - }, - ClaimRef: claimRef, - }, - Status: api.PersistentVolumeStatus{ - Phase: api.VolumePending, - }, - } - - volumeIndex := NewPersistentVolumeOrderedIndex() - mockClient := &mockBinderClient{ - claim: claim, - volume: pv, - } - - plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) - - // adds the volume to the index, making the volume available. - // pv also completed provisioning, so syncClaim should cause claim's phase to advance to Bound - syncVolume(volumeIndex, mockClient, pv) - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - if mockClient.claim.Status.Phase != api.ClaimBound { - t.Errorf("Expected phase %s but got %s", api.ClaimBound, claim.Status.Phase) - } -} - -func TestExampleObjects(t *testing.T) { - scenarios := map[string]struct { - expected interface{} - }{ - "claims/claim-01.yaml": { - expected: &api.PersistentVolumeClaim{ - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("3Gi"), - }, - }, - }, - }, - }, - "claims/claim-02.yaml": { - expected: &api.PersistentVolumeClaim{ - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("8Gi"), - }, - }, - }, - }, - }, - "volumes/local-01.yaml": { - expected: &api.PersistentVolume{ - Spec: api.PersistentVolumeSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: "/somepath/data01", - }, - }, - }, - }, - }, - "volumes/local-02.yaml": { - expected: &api.PersistentVolume{ - Spec: api.PersistentVolumeSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("8Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: "/somepath/data02", - }, - }, - PersistentVolumeReclaimPolicy: api.PersistentVolumeReclaimRecycle, - }, - }, - }, - } - - for name, scenario := range scenarios { - codec := api.Codecs.UniversalDecoder() - o := core.NewObjects(api.Scheme, codec) - if err := core.AddObjectsFromPath("../../../docs/user-guide/persistent-volumes/"+name, o, codec); err != nil { - t.Fatal(err) - } - - clientset := &fake.Clientset{} - clientset.AddReactor("*", "*", core.ObjectReaction(o, registered.RESTMapper())) - - if reflect.TypeOf(scenario.expected) == reflect.TypeOf(&api.PersistentVolumeClaim{}) { - pvc, err := clientset.Core().PersistentVolumeClaims("ns").Get("doesntmatter") - if err != nil { - t.Fatalf("Error retrieving object: %v", err) - } - - expected := scenario.expected.(*api.PersistentVolumeClaim) - if pvc.Spec.AccessModes[0] != expected.Spec.AccessModes[0] { - t.Errorf("Unexpected mismatch. Got %v wanted %v", pvc.Spec.AccessModes[0], expected.Spec.AccessModes[0]) - } - - aQty := pvc.Spec.Resources.Requests[api.ResourceStorage] - bQty := expected.Spec.Resources.Requests[api.ResourceStorage] - aSize := aQty.Value() - bSize := bQty.Value() - - if aSize != bSize { - t.Errorf("Unexpected mismatch. Got %v wanted %v", aSize, bSize) - } - } - - if reflect.TypeOf(scenario.expected) == reflect.TypeOf(&api.PersistentVolume{}) { - pv, err := clientset.Core().PersistentVolumes().Get("doesntmatter") - if err != nil { - t.Fatalf("Error retrieving object: %v", err) - } - - expected := scenario.expected.(*api.PersistentVolume) - if pv.Spec.AccessModes[0] != expected.Spec.AccessModes[0] { - t.Errorf("Unexpected mismatch. Got %v wanted %v", pv.Spec.AccessModes[0], expected.Spec.AccessModes[0]) - } - - aQty := pv.Spec.Capacity[api.ResourceStorage] - bQty := expected.Spec.Capacity[api.ResourceStorage] - aSize := aQty.Value() - bSize := bQty.Value() - - if aSize != bSize { - t.Errorf("Unexpected mismatch. Got %v wanted %v", aSize, bSize) - } - - if pv.Spec.HostPath.Path != expected.Spec.HostPath.Path { - t.Errorf("Unexpected mismatch. Got %v wanted %v", pv.Spec.HostPath.Path, expected.Spec.HostPath.Path) - } - } - } -} - -func TestBindingWithExamples(t *testing.T) { - tmpDir, err := utiltesting.MkTmpdir("claimbinder-test") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - - codec := api.Codecs.UniversalDecoder() - o := core.NewObjects(api.Scheme, codec) - if err := core.AddObjectsFromPath("../../../docs/user-guide/persistent-volumes/claims/claim-01.yaml", o, codec); err != nil { - t.Fatal(err) - } - if err := core.AddObjectsFromPath("../../../docs/user-guide/persistent-volumes/volumes/local-01.yaml", o, codec); err != nil { - t.Fatal(err) - } - - clientset := &fake.Clientset{} - clientset.AddReactor("*", "*", core.ObjectReaction(o, registered.RESTMapper())) - - pv, err := clientset.Core().PersistentVolumes().Get("any") - if err != nil { - t.Errorf("Unexpected error getting PV from client: %v", err) - } - pv.Spec.PersistentVolumeReclaimPolicy = api.PersistentVolumeReclaimRecycle - if err != nil { - t.Errorf("Unexpected error getting PV from client: %v", err) - } - pv.ObjectMeta.SelfLink = testapi.Default.SelfLink("pv", "") - - // the default value of the PV is Pending. if processed at least once, its status in etcd is Available. - // There was a bug where only Pending volumes were being indexed and made ready for claims. - // Test that !Pending gets correctly added - pv.Status.Phase = api.VolumeAvailable - - claim, error := clientset.Core().PersistentVolumeClaims("ns").Get("any") - if error != nil { - t.Errorf("Unexpected error getting PVC from client: %v", err) - } - claim.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - - volumeIndex := NewPersistentVolumeOrderedIndex() - mockClient := &mockBinderClient{ - volume: pv, - claim: claim, - } - - plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) - - recycler := &PersistentVolumeRecycler{ - kubeClient: clientset, - client: mockClient, - pluginMgr: plugMgr, - } - - // adds the volume to the index, making the volume available - syncVolume(volumeIndex, mockClient, pv) - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - - // add the claim to fake API server - mockClient.UpdatePersistentVolumeClaim(claim) - // an initial sync for a claim will bind it to an unbound volume - syncClaim(volumeIndex, mockClient, claim) - - // bind expected on pv.Spec but status update hasn't happened yet - if mockClient.volume.Spec.ClaimRef == nil { - t.Errorf("Expected ClaimRef but got nil for pv.Status.ClaimRef\n") - } - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - if mockClient.claim.Spec.VolumeName != pv.Name { - t.Errorf("Expected claim.Spec.VolumeName %s but got %s", mockClient.claim.Spec.VolumeName, pv.Name) - } - if mockClient.claim.Status.Phase != api.ClaimBound { - t.Errorf("Expected phase %s but got %s", api.ClaimBound, claim.Status.Phase) - } - - // state changes in pvc triggers sync that sets pv attributes to pvc.Status - syncClaim(volumeIndex, mockClient, claim) - if len(mockClient.claim.Status.AccessModes) == 0 { - t.Errorf("Expected %d access modes but got 0", len(pv.Spec.AccessModes)) - } - - // persisting the bind to pv.Spec.ClaimRef triggers a sync - syncVolume(volumeIndex, mockClient, mockClient.volume) - if mockClient.volume.Status.Phase != api.VolumeBound { - t.Errorf("Expected phase %s but got %s", api.VolumeBound, mockClient.volume.Status.Phase) - } - - // pretend the user deleted their claim. periodic resync picks it up. - mockClient.claim = nil - syncVolume(volumeIndex, mockClient, mockClient.volume) - - if mockClient.volume.Status.Phase != api.VolumeReleased { - t.Errorf("Expected phase %s but got %s", api.VolumeReleased, mockClient.volume.Status.Phase) - } - - // released volumes with a PersistentVolumeReclaimPolicy (recycle/delete) can have further processing - err = recycler.reclaimVolume(mockClient.volume) - if err != nil { - t.Errorf("Unexpected error reclaiming volume: %+v", err) - } - if mockClient.volume.Status.Phase != api.VolumePending { - t.Errorf("Expected phase %s but got %s", api.VolumePending, mockClient.volume.Status.Phase) - } - - // after the recycling changes the phase to Pending, the binder picks up again - // to remove any vestiges of binding and make the volume Available again - syncVolume(volumeIndex, mockClient, mockClient.volume) - - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - if mockClient.volume.Spec.ClaimRef != nil { - t.Errorf("Expected nil ClaimRef: %+v", mockClient.volume.Spec.ClaimRef) - } -} - -func TestCasting(t *testing.T) { - clientset := fake.NewSimpleClientset() - binder := NewPersistentVolumeClaimBinder(clientset, 1*time.Second) - - pv := &api.PersistentVolume{} - unk := cache.DeletedFinalStateUnknown{} - pvc := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Status: api.PersistentVolumeClaimStatus{Phase: api.ClaimBound}, - } - - // Inject mockClient into the binder. This prevents weird errors on stderr - // as the binder wants to load PV/PVC from API server. - mockClient := &mockBinderClient{ - volume: pv, - claim: pvc, - } - binder.client = mockClient - - // none of these should fail casting. - // the real test is not failing when passed DeletedFinalStateUnknown in the deleteHandler - binder.addVolume(pv) - binder.updateVolume(pv, pv) - binder.deleteVolume(pv) - binder.deleteVolume(unk) - binder.addClaim(pvc) - binder.updateClaim(pvc, pvc) -} - -func TestRecycledPersistentVolumeUID(t *testing.T) { - tmpDir, err := utiltesting.MkTmpdir("claimbinder-test") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - - codec := api.Codecs.UniversalDecoder() - o := core.NewObjects(api.Scheme, codec) - if err := core.AddObjectsFromPath("../../../docs/user-guide/persistent-volumes/claims/claim-01.yaml", o, codec); err != nil { - t.Fatal(err) - } - if err := core.AddObjectsFromPath("../../../docs/user-guide/persistent-volumes/volumes/local-01.yaml", o, codec); err != nil { - t.Fatal(err) - } - - clientset := &fake.Clientset{} - clientset.AddReactor("*", "*", core.ObjectReaction(o, registered.RESTMapper())) - - pv, err := clientset.Core().PersistentVolumes().Get("any") - if err != nil { - t.Errorf("Unexpected error getting PV from client: %v", err) - } - pv.Spec.PersistentVolumeReclaimPolicy = api.PersistentVolumeReclaimRecycle - if err != nil { - t.Errorf("Unexpected error getting PV from client: %v", err) - } - pv.ObjectMeta.SelfLink = testapi.Default.SelfLink("pv", "") - - // the default value of the PV is Pending. if processed at least once, its status in etcd is Available. - // There was a bug where only Pending volumes were being indexed and made ready for claims. - // Test that !Pending gets correctly added - pv.Status.Phase = api.VolumeAvailable - - claim, error := clientset.Core().PersistentVolumeClaims("ns").Get("any") - if error != nil { - t.Errorf("Unexpected error getting PVC from client: %v", err) - } - claim.ObjectMeta.SelfLink = testapi.Default.SelfLink("pvc", "") - claim.ObjectMeta.UID = types.UID("uid1") - - volumeIndex := NewPersistentVolumeOrderedIndex() - mockClient := &mockBinderClient{ - volume: pv, - claim: claim, - } - - plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) - - recycler := &PersistentVolumeRecycler{ - kubeClient: clientset, - client: mockClient, - pluginMgr: plugMgr, - } - - // adds the volume to the index, making the volume available - syncVolume(volumeIndex, mockClient, pv) - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - - // add the claim to fake API server - mockClient.UpdatePersistentVolumeClaim(claim) - // an initial sync for a claim will bind it to an unbound volume - syncClaim(volumeIndex, mockClient, claim) - - // pretend the user deleted their claim. periodic resync picks it up. - mockClient.claim = nil - syncVolume(volumeIndex, mockClient, mockClient.volume) - - if mockClient.volume.Status.Phase != api.VolumeReleased { - t.Errorf("Expected phase %s but got %s", api.VolumeReleased, mockClient.volume.Status.Phase) - } - - // released volumes with a PersistentVolumeReclaimPolicy (recycle/delete) can have further processing - err = recycler.reclaimVolume(mockClient.volume) - if err != nil { - t.Errorf("Unexpected error reclaiming volume: %+v", err) - } - if mockClient.volume.Status.Phase != api.VolumePending { - t.Errorf("Expected phase %s but got %s", api.VolumePending, mockClient.volume.Status.Phase) - } - - // after the recycling changes the phase to Pending, the binder picks up again - // to remove any vestiges of binding and make the volume Available again - // - // explicitly set the claim's UID to a different value to ensure that a new claim with the same - // name as what the PV was previously bound still yields an available volume - claim.ObjectMeta.UID = types.UID("uid2") - mockClient.claim = claim - syncVolume(volumeIndex, mockClient, mockClient.volume) - - if mockClient.volume.Status.Phase != api.VolumeAvailable { - t.Errorf("Expected phase %s but got %s", api.VolumeAvailable, mockClient.volume.Status.Phase) - } - if mockClient.volume.Spec.ClaimRef != nil { - t.Errorf("Expected nil ClaimRef: %+v", mockClient.volume.Spec.ClaimRef) - } -} - -type mockBinderClient struct { - volume *api.PersistentVolume - claim *api.PersistentVolumeClaim -} - -func (c *mockBinderClient) GetPersistentVolume(name string) (*api.PersistentVolume, error) { - return c.volume, nil -} - -func (c *mockBinderClient) UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - c.volume = volume - return c.volume, nil -} - -func (c *mockBinderClient) DeletePersistentVolume(volume *api.PersistentVolume) error { - c.volume = nil - return nil -} - -func (c *mockBinderClient) UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - c.volume = volume - return c.volume, nil -} - -func (c *mockBinderClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { - if c.claim != nil { - return c.claim, nil - } else { - return nil, errors.NewNotFound(api.Resource("persistentvolumes"), name) - } -} - -func (c *mockBinderClient) UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - c.claim = claim - return c.claim, nil -} - -func (c *mockBinderClient) UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - c.claim = claim - return c.claim, nil -} - -func newMockRecycler(spec *volume.Spec, host volume.VolumeHost, config volume.VolumeConfig) (volume.Recycler, error) { - return &mockRecycler{ - path: spec.PersistentVolume.Spec.HostPath.Path, - }, nil -} - -type mockRecycler struct { - path string - host volume.VolumeHost - volume.MetricsNil -} - -func (r *mockRecycler) GetPath() string { - return r.path -} - -func (r *mockRecycler) Recycle() error { - // return nil means recycle passed - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_index_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_index_test.go deleted file mode 100644 index 7bb6c5387..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_index_test.go +++ /dev/null @@ -1,549 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" -) - -func TestMatchVolume(t *testing.T) { - volList := NewPersistentVolumeOrderedIndex() - for _, pv := range createTestVolumes() { - volList.Add(pv) - } - - scenarios := map[string]struct { - expectedMatch string - claim *api.PersistentVolumeClaim - }{ - "successful-match-gce-10": { - expectedMatch: "gce-pd-10", - claim: &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("8G"), - }, - }, - }, - }, - }, - "successful-match-nfs-5": { - expectedMatch: "nfs-5", - claim: &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce, api.ReadWriteMany}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), - }, - }, - }, - }, - }, - "successful-skip-1g-bound-volume": { - expectedMatch: "gce-pd-5", - claim: &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - }, - }, - }, - }, - "successful-no-match": { - expectedMatch: "", - claim: &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("999G"), - }, - }, - }, - }, - }, - } - - for name, scenario := range scenarios { - volume, err := volList.findBestMatchForClaim(scenario.claim) - if err != nil { - t.Errorf("Unexpected error matching volume by claim: %v", err) - } - if len(scenario.expectedMatch) != 0 && volume == nil { - t.Errorf("Expected match but received nil volume for scenario: %s", name) - } - if len(scenario.expectedMatch) != 0 && volume != nil && string(volume.UID) != scenario.expectedMatch { - t.Errorf("Expected %s but got volume %s in scenario %s", scenario.expectedMatch, volume.UID, name) - } - if len(scenario.expectedMatch) == 0 && volume != nil { - t.Errorf("Unexpected match for scenario: %s", name) - } - } -} - -func TestMatchingWithBoundVolumes(t *testing.T) { - volumeIndex := NewPersistentVolumeOrderedIndex() - // two similar volumes, one is bound - pv1 := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-1", - Name: "gce001", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce, api.ReadOnlyMany}, - // this one we're pretending is already bound - ClaimRef: &api.ObjectReference{UID: "abc123"}, - }, - } - - pv2 := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-2", - Name: "gce002", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce, api.ReadOnlyMany}, - }, - } - - volumeIndex.Add(pv1) - volumeIndex.Add(pv2) - - claim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany, api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - }, - }, - } - - volume, err := volumeIndex.findBestMatchForClaim(claim) - if err != nil { - t.Fatalf("Unexpected error matching volume by claim: %v", err) - } - if volume == nil { - t.Fatalf("Unexpected nil volume. Expected %s", pv2.Name) - } - if pv2.Name != volume.Name { - t.Errorf("Expected %s but got volume %s instead", pv2.Name, volume.Name) - } -} - -func TestSort(t *testing.T) { - volList := NewPersistentVolumeOrderedIndex() - for _, pv := range createTestVolumes() { - volList.Add(pv) - } - - volumes, err := volList.ListByAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce, api.ReadOnlyMany}) - if err != nil { - t.Error("Unexpected error retrieving volumes by access modes:", err) - } - - for i, expected := range []string{"gce-pd-1", "gce-pd-5", "gce-pd-10"} { - if string(volumes[i].UID) != expected { - t.Errorf("Incorrect ordering of persistent volumes. Expected %s but got %s", expected, volumes[i].UID) - } - } - - volumes, err = volList.ListByAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce, api.ReadOnlyMany, api.ReadWriteMany}) - if err != nil { - t.Error("Unexpected error retrieving volumes by access modes:", err) - } - - for i, expected := range []string{"nfs-1", "nfs-5", "nfs-10"} { - if string(volumes[i].UID) != expected { - t.Errorf("Incorrect ordering of persistent volumes. Expected %s but got %s", expected, volumes[i].UID) - } - } -} - -func TestAllPossibleAccessModes(t *testing.T) { - index := NewPersistentVolumeOrderedIndex() - for _, pv := range createTestVolumes() { - index.Add(pv) - } - - // the mock PVs creates contain 2 types of accessmodes: RWO+ROX and RWO+ROW+RWX - possibleModes := index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteOnce}) - if len(possibleModes) != 2 { - t.Errorf("Expected 2 arrays of modes that match RWO, but got %v", len(possibleModes)) - } - for _, m := range possibleModes { - if !contains(m, api.ReadWriteOnce) { - t.Errorf("AccessModes does not contain %s", api.ReadWriteOnce) - } - } - - possibleModes = index.allPossibleMatchingAccessModes([]api.PersistentVolumeAccessMode{api.ReadWriteMany}) - if len(possibleModes) != 1 { - t.Errorf("Expected 1 array of modes that match RWX, but got %v", len(possibleModes)) - } - if !contains(possibleModes[0], api.ReadWriteMany) { - t.Errorf("AccessModes does not contain %s", api.ReadWriteOnce) - } - -} - -func TestFindingVolumeWithDifferentAccessModes(t *testing.T) { - gce := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{UID: "001", Name: "gce"}, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse("10G")}, - PersistentVolumeSource: api.PersistentVolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}}, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - }, - } - - ebs := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{UID: "002", Name: "ebs"}, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse("10G")}, - PersistentVolumeSource: api.PersistentVolumeSource{AWSElasticBlockStore: &api.AWSElasticBlockStoreVolumeSource{}}, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - }, - }, - } - - nfs := &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{UID: "003", Name: "nfs"}, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse("10G")}, - PersistentVolumeSource: api.PersistentVolumeSource{NFS: &api.NFSVolumeSource{}}, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - api.ReadWriteMany, - }, - }, - } - - claim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{Requests: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse("1G")}}, - }, - } - - index := NewPersistentVolumeOrderedIndex() - index.Add(gce) - index.Add(ebs) - index.Add(nfs) - - volume, _ := index.findBestMatchForClaim(claim) - if volume.Name != ebs.Name { - t.Errorf("Expected %s but got volume %s instead", ebs.Name, volume.Name) - } - - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadWriteOnce, api.ReadOnlyMany} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != gce.Name { - t.Errorf("Expected %s but got volume %s instead", gce.Name, volume.Name) - } - - // order of the requested modes should not matter - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadWriteMany, api.ReadWriteOnce, api.ReadOnlyMany} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != nfs.Name { - t.Errorf("Expected %s but got volume %s instead", nfs.Name, volume.Name) - } - - // fewer modes requested should still match - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadWriteMany} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != nfs.Name { - t.Errorf("Expected %s but got volume %s instead", nfs.Name, volume.Name) - } - - // pretend the exact match is bound. should get the next level up of modes. - ebs.Spec.ClaimRef = &api.ObjectReference{} - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadWriteOnce} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != gce.Name { - t.Errorf("Expected %s but got volume %s instead", gce.Name, volume.Name) - } - - // continue up the levels of modes. - gce.Spec.ClaimRef = &api.ObjectReference{} - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadWriteOnce} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != nfs.Name { - t.Errorf("Expected %s but got volume %s instead", nfs.Name, volume.Name) - } - - // partial mode request - gce.Spec.ClaimRef = nil - claim.Spec.AccessModes = []api.PersistentVolumeAccessMode{api.ReadOnlyMany} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != gce.Name { - t.Errorf("Expected %s but got volume %s instead", gce.Name, volume.Name) - } -} - -func createTestVolumes() []*api.PersistentVolume { - // these volumes are deliberately out-of-order to test indexing and sorting - return []*api.PersistentVolume{ - { - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-10", - Name: "gce003", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-20", - Name: "gce004", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("20G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - // this one we're pretending is already bound - ClaimRef: &api.ObjectReference{UID: "def456"}, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "nfs-5", - Name: "nfs002", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - Glusterfs: &api.GlusterfsVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - api.ReadWriteMany, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-1", - Name: "gce001", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - // this one we're pretending is already bound - ClaimRef: &api.ObjectReference{UID: "abc123"}, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "nfs-10", - Name: "nfs003", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - Glusterfs: &api.GlusterfsVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - api.ReadWriteMany, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "gce-pd-5", - Name: "gce002", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - UID: "nfs-1", - Name: "nfs001", - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - Glusterfs: &api.GlusterfsVolumeSource{}, - }, - AccessModes: []api.PersistentVolumeAccessMode{ - api.ReadWriteOnce, - api.ReadOnlyMany, - api.ReadWriteMany, - }, - }, - }, - } -} - -func testVolume(name, size string) *api.PersistentVolume { - return &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Annotations: map[string]string{}, - }, - Spec: api.PersistentVolumeSpec{ - Capacity: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse(size)}, - PersistentVolumeSource: api.PersistentVolumeSource{HostPath: &api.HostPathVolumeSource{}}, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - }, - } -} - -func TestFindingPreboundVolumes(t *testing.T) { - claim := &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: "claim01", - Namespace: "myns", - SelfLink: testapi.Default.SelfLink("pvc", ""), - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{Requests: api.ResourceList{api.ResourceName(api.ResourceStorage): resource.MustParse("1Gi")}}, - }, - } - claimRef, err := api.GetReference(claim) - if err != nil { - t.Errorf("error getting claimRef: %v", err) - } - - pv1 := testVolume("pv1", "1Gi") - pv5 := testVolume("pv5", "5Gi") - pv8 := testVolume("pv8", "8Gi") - - index := NewPersistentVolumeOrderedIndex() - index.Add(pv1) - index.Add(pv5) - index.Add(pv8) - - // expected exact match on size - volume, _ := index.findBestMatchForClaim(claim) - if volume.Name != pv1.Name { - t.Errorf("Expected %s but got volume %s instead", pv1.Name, volume.Name) - } - - // pretend the exact match is pre-bound. should get the next size up. - pv1.Spec.ClaimRef = &api.ObjectReference{Name: "foo", Namespace: "bar"} - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != pv5.Name { - t.Errorf("Expected %s but got volume %s instead", pv5.Name, volume.Name) - } - - // pretend the exact match is available but the largest volume is pre-bound to the claim. - pv1.Spec.ClaimRef = nil - pv8.Spec.ClaimRef = claimRef - volume, _ = index.findBestMatchForClaim(claim) - if volume.Name != pv8.Name { - t.Errorf("Expected %s but got volume %s instead", pv8.Name, volume.Name) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller.go deleted file mode 100644 index fdb7804a3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller.go +++ /dev/null @@ -1,536 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "sync" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/io" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -// PersistentVolumeProvisionerController reconciles the state of all PersistentVolumes and PersistentVolumeClaims. -type PersistentVolumeProvisionerController struct { - volumeController *framework.Controller - volumeStore cache.Store - claimController *framework.Controller - claimStore cache.Store - client controllerClient - cloud cloudprovider.Interface - provisioner volume.ProvisionableVolumePlugin - pluginMgr volume.VolumePluginMgr - stopChannels map[string]chan struct{} - mutex sync.RWMutex - clusterName string -} - -// constant name values for the controllers stopChannels map. -// the controller uses these for graceful shutdown -const volumesStopChannel = "volumes" -const claimsStopChannel = "claims" - -// NewPersistentVolumeProvisionerController creates a new PersistentVolumeProvisionerController -func NewPersistentVolumeProvisionerController(client controllerClient, syncPeriod time.Duration, clusterName string, plugins []volume.VolumePlugin, provisioner volume.ProvisionableVolumePlugin, cloud cloudprovider.Interface) (*PersistentVolumeProvisionerController, error) { - controller := &PersistentVolumeProvisionerController{ - client: client, - cloud: cloud, - provisioner: provisioner, - clusterName: clusterName, - } - - if err := controller.pluginMgr.InitPlugins(plugins, controller); err != nil { - return nil, fmt.Errorf("Could not initialize volume plugins for PersistentVolumeProvisionerController: %+v", err) - } - - glog.V(5).Infof("Initializing provisioner: %s", controller.provisioner.Name()) - controller.provisioner.Init(controller) - - controller.volumeStore, controller.volumeController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return client.ListPersistentVolumes(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return client.WatchPersistentVolumes(options) - }, - }, - &api.PersistentVolume{}, - syncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: controller.handleAddVolume, - UpdateFunc: controller.handleUpdateVolume, - // delete handler not needed in this controller. - // volume deletion is handled by the recycler controller - }, - ) - controller.claimStore, controller.claimController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return client.ListPersistentVolumeClaims(api.NamespaceAll, options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return client.WatchPersistentVolumeClaims(api.NamespaceAll, options) - }, - }, - &api.PersistentVolumeClaim{}, - syncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: controller.handleAddClaim, - UpdateFunc: controller.handleUpdateClaim, - // delete handler not needed. - // normal recycling applies when a claim is deleted. - // recycling is handled by the binding controller. - }, - ) - - return controller, nil -} - -func (controller *PersistentVolumeProvisionerController) handleAddVolume(obj interface{}) { - controller.mutex.Lock() - defer controller.mutex.Unlock() - cachedPv, _, _ := controller.volumeStore.Get(obj) - if pv, ok := cachedPv.(*api.PersistentVolume); ok { - err := controller.reconcileVolume(pv) - if err != nil { - glog.Errorf("Error reconciling volume %s: %+v", pv.Name, err) - } - } -} - -func (controller *PersistentVolumeProvisionerController) handleUpdateVolume(oldObj, newObj interface{}) { - // The flow for Update is the same as Add. - // A volume is only provisioned if not done so already. - controller.handleAddVolume(newObj) -} - -func (controller *PersistentVolumeProvisionerController) handleAddClaim(obj interface{}) { - controller.mutex.Lock() - defer controller.mutex.Unlock() - cachedPvc, exists, _ := controller.claimStore.Get(obj) - if !exists { - glog.Errorf("PersistentVolumeClaim does not exist in the local cache: %+v", obj) - return - } - if pvc, ok := cachedPvc.(*api.PersistentVolumeClaim); ok { - err := controller.reconcileClaim(pvc) - if err != nil { - glog.Errorf("Error encoutered reconciling claim %s: %+v", pvc.Name, err) - } - } -} - -func (controller *PersistentVolumeProvisionerController) handleUpdateClaim(oldObj, newObj interface{}) { - // The flow for Update is the same as Add. - // A volume is only provisioned for a claim if not done so already. - controller.handleAddClaim(newObj) -} - -func (controller *PersistentVolumeProvisionerController) reconcileClaim(claim *api.PersistentVolumeClaim) error { - glog.V(5).Infof("Synchronizing PersistentVolumeClaim[%s] for dynamic provisioning", claim.Name) - - // The claim may have been modified by parallel call to reconcileClaim, load - // the current version. - newClaim, err := controller.client.GetPersistentVolumeClaim(claim.Namespace, claim.Name) - if err != nil { - return fmt.Errorf("Cannot reload claim %s/%s: %v", claim.Namespace, claim.Name, err) - } - claim = newClaim - err = controller.claimStore.Update(claim) - if err != nil { - return fmt.Errorf("Cannot update claim %s/%s: %v", claim.Namespace, claim.Name, err) - } - - if controller.provisioner == nil { - return fmt.Errorf("No provisioner configured for controller") - } - - // no provisioning requested, return Pending. Claim may be pending indefinitely without a match. - if !keyExists(qosProvisioningKey, claim.Annotations) { - glog.V(5).Infof("PersistentVolumeClaim[%s] no provisioning required", claim.Name) - return nil - } - if len(claim.Spec.VolumeName) != 0 { - glog.V(5).Infof("PersistentVolumeClaim[%s] already bound. No provisioning required", claim.Name) - return nil - } - if isAnnotationMatch(pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue, claim.Annotations) { - glog.V(5).Infof("PersistentVolumeClaim[%s] is already provisioned.", claim.Name) - return nil - } - - glog.V(5).Infof("PersistentVolumeClaim[%s] provisioning", claim.Name) - provisioner, err := controller.newProvisioner(controller.provisioner, claim, nil) - if err != nil { - return fmt.Errorf("Unexpected error getting new provisioner for claim %s: %v\n", claim.Name, err) - } - newVolume, err := provisioner.NewPersistentVolumeTemplate() - if err != nil { - return fmt.Errorf("Unexpected error getting new volume template for claim %s: %v\n", claim.Name, err) - } - - claimRef, err := api.GetReference(claim) - if err != nil { - return fmt.Errorf("Unexpected error getting claim reference for %s: %v\n", claim.Name, err) - } - - storageClass, _ := claim.Annotations[qosProvisioningKey] - - // the creation of this volume is the bind to the claim. - // The claim will match the volume during the next sync period when the volume is in the local cache - newVolume.Spec.ClaimRef = claimRef - newVolume.Annotations[pvProvisioningRequiredAnnotationKey] = "true" - newVolume.Annotations[qosProvisioningKey] = storageClass - newVolume, err = controller.client.CreatePersistentVolume(newVolume) - glog.V(5).Infof("Unprovisioned PersistentVolume[%s] created for PVC[%s], which will be fulfilled in the storage provider", newVolume.Name, claim.Name) - if err != nil { - return fmt.Errorf("PersistentVolumeClaim[%s] failed provisioning: %+v", claim.Name, err) - } - - claim.Annotations[pvProvisioningRequiredAnnotationKey] = pvProvisioningCompletedAnnotationValue - _, err = controller.client.UpdatePersistentVolumeClaim(claim) - if err != nil { - glog.Errorf("error updating persistent volume claim: %v", err) - } - - return nil -} - -func (controller *PersistentVolumeProvisionerController) reconcileVolume(pv *api.PersistentVolume) error { - glog.V(5).Infof("PersistentVolume[%s] reconciling", pv.Name) - - // The PV may have been modified by parallel call to reconcileVolume, load - // the current version. - newPv, err := controller.client.GetPersistentVolume(pv.Name) - if err != nil { - return fmt.Errorf("Cannot reload volume %s: %v", pv.Name, err) - } - pv = newPv - - if pv.Spec.ClaimRef == nil { - glog.V(5).Infof("PersistentVolume[%s] is not bound to a claim. No provisioning required", pv.Name) - return nil - } - - // TODO: fix this leaky abstraction. Had to make our own store key because ClaimRef fails the default keyfunc (no Meta on object). - obj, exists, _ := controller.claimStore.GetByKey(fmt.Sprintf("%s/%s", pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name)) - if !exists { - return fmt.Errorf("PersistentVolumeClaim[%s/%s] not found in local cache", pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name) - } - - claim, ok := obj.(*api.PersistentVolumeClaim) - if !ok { - return fmt.Errorf("PersistentVolumeClaim expected, but got %v", obj) - } - - // no provisioning required, volume is ready and Bound - if !keyExists(pvProvisioningRequiredAnnotationKey, pv.Annotations) { - glog.V(5).Infof("PersistentVolume[%s] does not require provisioning", pv.Name) - return nil - } - - // provisioning is completed, volume is ready. - if isProvisioningComplete(pv) { - glog.V(5).Infof("PersistentVolume[%s] is bound and provisioning is complete", pv.Name) - if pv.Spec.ClaimRef.Namespace != claim.Namespace || pv.Spec.ClaimRef.Name != claim.Name { - return fmt.Errorf("pre-bind mismatch - expected %s but found %s/%s", claimToClaimKey(claim), pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name) - } - return nil - } - - // provisioning is incomplete. Attempt to provision the volume. - glog.V(5).Infof("PersistentVolume[%s] provisioning in progress", pv.Name) - err = provisionVolume(pv, controller) - if err != nil { - return fmt.Errorf("Error provisioning PersistentVolume[%s]: %v", pv.Name, err) - } - - return nil -} - -// provisionVolume provisions a volume that has been created in the cluster but not yet fulfilled by -// the storage provider. -func provisionVolume(pv *api.PersistentVolume, controller *PersistentVolumeProvisionerController) error { - if isProvisioningComplete(pv) { - return fmt.Errorf("PersistentVolume[%s] is already provisioned", pv.Name) - } - - if _, exists := pv.Annotations[qosProvisioningKey]; !exists { - return fmt.Errorf("PersistentVolume[%s] does not contain a provisioning request. Provisioning not required.", pv.Name) - } - - if controller.provisioner == nil { - return fmt.Errorf("No provisioner found for volume: %s", pv.Name) - } - - // Find the claim in local cache - obj, exists, _ := controller.claimStore.GetByKey(fmt.Sprintf("%s/%s", pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name)) - if !exists { - return fmt.Errorf("Could not find PersistentVolumeClaim[%s/%s] in local cache", pv.Spec.ClaimRef.Name, pv.Name) - } - claim := obj.(*api.PersistentVolumeClaim) - - provisioner, _ := controller.newProvisioner(controller.provisioner, claim, pv) - err := provisioner.Provision(pv) - if err != nil { - glog.Errorf("Could not provision %s", pv.Name) - pv.Status.Phase = api.VolumeFailed - pv.Status.Message = err.Error() - if pv, apiErr := controller.client.UpdatePersistentVolumeStatus(pv); apiErr != nil { - return fmt.Errorf("PersistentVolume[%s] failed provisioning and also failed status update: %v - %v", pv.Name, err, apiErr) - } - return fmt.Errorf("PersistentVolume[%s] failed provisioning: %v", pv.Name, err) - } - - clone, err := conversion.NewCloner().DeepCopy(pv) - volumeClone, ok := clone.(*api.PersistentVolume) - if !ok { - return fmt.Errorf("Unexpected pv cast error : %v\n", volumeClone) - } - volumeClone.Annotations[pvProvisioningRequiredAnnotationKey] = pvProvisioningCompletedAnnotationValue - - pv, err = controller.client.UpdatePersistentVolume(volumeClone) - if err != nil { - // TODO: https://github.com/kubernetes/kubernetes/issues/14443 - // the volume was created in the infrastructure and likely has a PV name on it, - // but we failed to save the annotation that marks the volume as provisioned. - return fmt.Errorf("Error updating PersistentVolume[%s] with provisioning completed annotation. There is a potential for dupes and orphans.", volumeClone.Name) - } - return nil -} - -// Run starts all of this controller's control loops -func (controller *PersistentVolumeProvisionerController) Run() { - glog.V(5).Infof("Starting PersistentVolumeProvisionerController\n") - if controller.stopChannels == nil { - controller.stopChannels = make(map[string]chan struct{}) - } - - if _, exists := controller.stopChannels[volumesStopChannel]; !exists { - controller.stopChannels[volumesStopChannel] = make(chan struct{}) - go controller.volumeController.Run(controller.stopChannels[volumesStopChannel]) - } - - if _, exists := controller.stopChannels[claimsStopChannel]; !exists { - controller.stopChannels[claimsStopChannel] = make(chan struct{}) - go controller.claimController.Run(controller.stopChannels[claimsStopChannel]) - } -} - -// Stop gracefully shuts down this controller -func (controller *PersistentVolumeProvisionerController) Stop() { - glog.V(5).Infof("Stopping PersistentVolumeProvisionerController\n") - for name, stopChan := range controller.stopChannels { - close(stopChan) - delete(controller.stopChannels, name) - } -} - -func (controller *PersistentVolumeProvisionerController) newProvisioner(plugin volume.ProvisionableVolumePlugin, claim *api.PersistentVolumeClaim, pv *api.PersistentVolume) (volume.Provisioner, error) { - tags := make(map[string]string) - tags[cloudVolumeCreatedForClaimNamespaceTag] = claim.Namespace - tags[cloudVolumeCreatedForClaimNameTag] = claim.Name - - // pv can be nil when the provisioner has not created the PV yet - if pv != nil { - tags[cloudVolumeCreatedForVolumeNameTag] = pv.Name - } - - volumeOptions := volume.VolumeOptions{ - Capacity: claim.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)], - AccessModes: claim.Spec.AccessModes, - PersistentVolumeReclaimPolicy: api.PersistentVolumeReclaimDelete, - CloudTags: &tags, - ClusterName: controller.clusterName, - } - - if pv != nil { - volumeOptions.PVName = pv.Name - } - - provisioner, err := plugin.NewProvisioner(volumeOptions) - return provisioner, err -} - -// controllerClient abstracts access to PVs and PVCs. Easy to mock for testing and wrap for real client. -type controllerClient interface { - CreatePersistentVolume(pv *api.PersistentVolume) (*api.PersistentVolume, error) - ListPersistentVolumes(options api.ListOptions) (*api.PersistentVolumeList, error) - WatchPersistentVolumes(options api.ListOptions) (watch.Interface, error) - GetPersistentVolume(name string) (*api.PersistentVolume, error) - UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) - DeletePersistentVolume(volume *api.PersistentVolume) error - UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) - - GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) - ListPersistentVolumeClaims(namespace string, options api.ListOptions) (*api.PersistentVolumeClaimList, error) - WatchPersistentVolumeClaims(namespace string, options api.ListOptions) (watch.Interface, error) - UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) - UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) - - // provided to give VolumeHost and plugins access to the kube client - GetKubeClient() clientset.Interface -} - -func NewControllerClient(c clientset.Interface) controllerClient { - return &realControllerClient{c} -} - -var _ controllerClient = &realControllerClient{} - -type realControllerClient struct { - client clientset.Interface -} - -func (c *realControllerClient) GetPersistentVolume(name string) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Get(name) -} - -func (c *realControllerClient) ListPersistentVolumes(options api.ListOptions) (*api.PersistentVolumeList, error) { - return c.client.Core().PersistentVolumes().List(options) -} - -func (c *realControllerClient) WatchPersistentVolumes(options api.ListOptions) (watch.Interface, error) { - return c.client.Core().PersistentVolumes().Watch(options) -} - -func (c *realControllerClient) CreatePersistentVolume(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Create(pv) -} - -func (c *realControllerClient) UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Update(volume) -} - -func (c *realControllerClient) DeletePersistentVolume(volume *api.PersistentVolume) error { - return c.client.Core().PersistentVolumes().Delete(volume.Name, nil) -} - -func (c *realControllerClient) UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().UpdateStatus(volume) -} - -func (c *realControllerClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(namespace).Get(name) -} - -func (c *realControllerClient) ListPersistentVolumeClaims(namespace string, options api.ListOptions) (*api.PersistentVolumeClaimList, error) { - return c.client.Core().PersistentVolumeClaims(namespace).List(options) -} - -func (c *realControllerClient) WatchPersistentVolumeClaims(namespace string, options api.ListOptions) (watch.Interface, error) { - return c.client.Core().PersistentVolumeClaims(namespace).Watch(options) -} - -func (c *realControllerClient) UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(claim.Namespace).Update(claim) -} - -func (c *realControllerClient) UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - return c.client.Core().PersistentVolumeClaims(claim.Namespace).UpdateStatus(claim) -} - -func (c *realControllerClient) GetKubeClient() clientset.Interface { - return c.client -} - -func keyExists(key string, haystack map[string]string) bool { - _, exists := haystack[key] - return exists -} - -func isProvisioningComplete(pv *api.PersistentVolume) bool { - return isAnnotationMatch(pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue, pv.Annotations) -} - -func isAnnotationMatch(key, needle string, haystack map[string]string) bool { - value, exists := haystack[key] - if !exists { - return false - } - return value == needle -} - -func isRecyclable(policy api.PersistentVolumeReclaimPolicy) bool { - return policy == api.PersistentVolumeReclaimDelete || policy == api.PersistentVolumeReclaimRecycle -} - -// VolumeHost implementation -// PersistentVolumeRecycler is host to the volume plugins, but does not actually mount any volumes. -// Because no mounting is performed, most of the VolumeHost methods are not implemented. -func (c *PersistentVolumeProvisionerController) GetPluginDir(podUID string) string { - return "" -} - -func (c *PersistentVolumeProvisionerController) GetPodVolumeDir(podUID types.UID, pluginName, volumeName string) string { - return "" -} - -func (c *PersistentVolumeProvisionerController) GetPodPluginDir(podUID types.UID, pluginName string) string { - return "" -} - -func (c *PersistentVolumeProvisionerController) GetKubeClient() clientset.Interface { - return c.client.GetKubeClient() -} - -func (c *PersistentVolumeProvisionerController) NewWrapperMounter(volName string, spec volume.Spec, pod *api.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { - return nil, fmt.Errorf("NewWrapperMounter not supported by PVClaimBinder's VolumeHost implementation") -} - -func (c *PersistentVolumeProvisionerController) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { - return nil, fmt.Errorf("NewWrapperUnmounter not supported by PVClaimBinder's VolumeHost implementation") -} - -func (c *PersistentVolumeProvisionerController) GetCloudProvider() cloudprovider.Interface { - return c.cloud -} - -func (c *PersistentVolumeProvisionerController) GetMounter() mount.Interface { - return nil -} - -func (c *PersistentVolumeProvisionerController) GetWriter() io.Writer { - return nil -} - -func (c *PersistentVolumeProvisionerController) GetHostName() string { - return "" -} - -const ( - // these pair of constants are used by the provisioner. - // The key is a kube namespaced key that denotes a volume requires provisioning. - // The value is set only when provisioning is completed. Any other value will tell the provisioner - // that provisioning has not yet occurred. - pvProvisioningRequiredAnnotationKey = "volume.experimental.kubernetes.io/provisioning-required" - pvProvisioningCompletedAnnotationValue = "volume.experimental.kubernetes.io/provisioning-completed" -) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller_test.go deleted file mode 100644 index c72e8e447..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_provisioner_controller_test.go +++ /dev/null @@ -1,295 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - fake_cloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" - "k8s.io/kubernetes/pkg/util" - volumetest "k8s.io/kubernetes/pkg/volume/testing" - "k8s.io/kubernetes/pkg/watch" -) - -func TestProvisionerRunStop(t *testing.T) { - controller, _, _ := makeTestController() - - if len(controller.stopChannels) != 0 { - t.Errorf("Non-running provisioner should not have any stopChannels. Got %v", len(controller.stopChannels)) - } - - controller.Run() - - if len(controller.stopChannels) != 2 { - t.Errorf("Running provisioner should have exactly 2 stopChannels. Got %v", len(controller.stopChannels)) - } - - controller.Stop() - - if len(controller.stopChannels) != 0 { - t.Errorf("Non-running provisioner should not have any stopChannels. Got %v", len(controller.stopChannels)) - } -} - -func makeTestVolume() *api.PersistentVolume { - return &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{}, - Name: "pv01", - }, - Spec: api.PersistentVolumeSpec{ - PersistentVolumeReclaimPolicy: api.PersistentVolumeReclaimDelete, - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("10Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: "/somepath/data01", - }, - }, - }, - } -} - -func makeTestClaim() *api.PersistentVolumeClaim { - return &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{}, - Name: "claim01", - Namespace: "ns", - SelfLink: testapi.Default.SelfLink("pvc", ""), - }, - Spec: api.PersistentVolumeClaimSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("8G"), - }, - }, - }, - } -} - -func makeTestController() (*PersistentVolumeProvisionerController, *mockControllerClient, *volumetest.FakeVolumePlugin) { - mockClient := &mockControllerClient{} - mockVolumePlugin := &volumetest.FakeVolumePlugin{} - controller, _ := NewPersistentVolumeProvisionerController(mockClient, 1*time.Second, "fake-kubernetes", nil, mockVolumePlugin, &fake_cloud.FakeCloud{}) - return controller, mockClient, mockVolumePlugin -} - -func TestReconcileClaim(t *testing.T) { - controller, mockClient, _ := makeTestController() - pvc := makeTestClaim() - - // watch would have added the claim to the store - controller.claimStore.Add(pvc) - // store it in fake API server - mockClient.UpdatePersistentVolumeClaim(pvc) - - err := controller.reconcileClaim(pvc) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // non-provisionable PVC should not have created a volume on reconciliation - if mockClient.volume != nil { - t.Error("Unexpected volume found in mock client. Expected nil") - } - - pvc.Annotations[qosProvisioningKey] = "foo" - // store it in fake API server - mockClient.UpdatePersistentVolumeClaim(pvc) - - err = controller.reconcileClaim(pvc) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // PVC requesting provisioning should have a PV created for it - if mockClient.volume == nil { - t.Error("Expected to find bound volume but got nil") - } - - if mockClient.volume.Spec.ClaimRef.Name != pvc.Name { - t.Errorf("Expected PV to be bound to %s but got %s", mockClient.volume.Spec.ClaimRef.Name, pvc.Name) - } - - // the PVC should have correct annotation - if mockClient.claim.Annotations[pvProvisioningRequiredAnnotationKey] != pvProvisioningCompletedAnnotationValue { - t.Errorf("Annotation %q not set", pvProvisioningRequiredAnnotationKey) - } - - // Run the syncClaim 2nd time to simulate periodic sweep running in parallel - // to the previous syncClaim. There is a lock in handleUpdateVolume(), so - // they will be called sequentially, but the second call will have old - // version of the claim. - oldPVName := mockClient.volume.Name - - // Make the "old" claim - pvc2 := makeTestClaim() - pvc2.Annotations[qosProvisioningKey] = "foo" - // Add a dummy annotation so we recognize the claim was updated (i.e. - // stored in mockClient) - pvc2.Annotations["test"] = "test" - - err = controller.reconcileClaim(pvc2) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // The 2nd PVC should be ignored, no new PV was created - if val, found := pvc2.Annotations[pvProvisioningRequiredAnnotationKey]; found { - t.Errorf("2nd PVC got unexpected annotation %q: %q", pvProvisioningRequiredAnnotationKey, val) - } - if mockClient.volume.Name != oldPVName { - t.Errorf("2nd PVC unexpectedly provisioned a new volume") - } - if _, found := mockClient.claim.Annotations["test"]; found { - t.Errorf("2nd PVC was unexpectedly updated") - } -} - -func checkTagValue(t *testing.T, tags map[string]string, tag string, expectedValue string) { - value, found := tags[tag] - if !found || value != expectedValue { - t.Errorf("Expected tag value %s = %s but value %s found", tag, expectedValue, value) - } -} - -func TestReconcileVolume(t *testing.T) { - - controller, mockClient, mockVolumePlugin := makeTestController() - pv := makeTestVolume() - pvc := makeTestClaim() - mockClient.volume = pv - - err := controller.reconcileVolume(pv) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - - // watch adds claim to the store. - // we need to add it to our mock client to mimic normal Get call - controller.claimStore.Add(pvc) - mockClient.claim = pvc - - // pretend the claim and volume are bound, no provisioning required - claimRef, _ := api.GetReference(pvc) - pv.Spec.ClaimRef = claimRef - mockClient.volume = pv - err = controller.reconcileVolume(pv) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - - pv.Annotations[pvProvisioningRequiredAnnotationKey] = "!pvProvisioningCompleted" - pv.Annotations[qosProvisioningKey] = "foo" - mockClient.volume = pv - err = controller.reconcileVolume(pv) - - if !isAnnotationMatch(pvProvisioningRequiredAnnotationKey, pvProvisioningCompletedAnnotationValue, mockClient.volume.Annotations) { - t.Errorf("Expected %s but got %s", pvProvisioningRequiredAnnotationKey, mockClient.volume.Annotations[pvProvisioningRequiredAnnotationKey]) - } - - // Check that the volume plugin was called with correct tags - tags := *mockVolumePlugin.LastProvisionerOptions.CloudTags - checkTagValue(t, tags, cloudVolumeCreatedForClaimNamespaceTag, pvc.Namespace) - checkTagValue(t, tags, cloudVolumeCreatedForClaimNameTag, pvc.Name) - checkTagValue(t, tags, cloudVolumeCreatedForVolumeNameTag, pv.Name) - -} - -var _ controllerClient = &mockControllerClient{} - -type mockControllerClient struct { - volume *api.PersistentVolume - claim *api.PersistentVolumeClaim -} - -func (c *mockControllerClient) GetPersistentVolume(name string) (*api.PersistentVolume, error) { - return c.volume, nil -} - -func (c *mockControllerClient) CreatePersistentVolume(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - if pv.GenerateName != "" && pv.Name == "" { - pv.Name = fmt.Sprintf(pv.GenerateName, util.NewUUID()) - } - c.volume = pv - return c.volume, nil -} - -func (c *mockControllerClient) ListPersistentVolumes(options api.ListOptions) (*api.PersistentVolumeList, error) { - return &api.PersistentVolumeList{ - Items: []api.PersistentVolume{*c.volume}, - }, nil -} - -func (c *mockControllerClient) WatchPersistentVolumes(options api.ListOptions) (watch.Interface, error) { - return watch.NewFake(), nil -} - -func (c *mockControllerClient) UpdatePersistentVolume(pv *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.CreatePersistentVolume(pv) -} - -func (c *mockControllerClient) DeletePersistentVolume(volume *api.PersistentVolume) error { - c.volume = nil - return nil -} - -func (c *mockControllerClient) UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return volume, nil -} - -func (c *mockControllerClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { - if c.claim != nil { - return c.claim, nil - } else { - return nil, errors.NewNotFound(api.Resource("persistentvolumes"), name) - } -} - -func (c *mockControllerClient) ListPersistentVolumeClaims(namespace string, options api.ListOptions) (*api.PersistentVolumeClaimList, error) { - return &api.PersistentVolumeClaimList{ - Items: []api.PersistentVolumeClaim{*c.claim}, - }, nil -} - -func (c *mockControllerClient) WatchPersistentVolumeClaims(namespace string, options api.ListOptions) (watch.Interface, error) { - return watch.NewFake(), nil -} - -func (c *mockControllerClient) UpdatePersistentVolumeClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - c.claim = claim - return c.claim, nil -} - -func (c *mockControllerClient) UpdatePersistentVolumeClaimStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error) { - return claim, nil -} - -func (c *mockControllerClient) GetKubeClient() clientset.Interface { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller.go deleted file mode 100644 index e73a5b9eb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller.go +++ /dev/null @@ -1,415 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" - ioutil "k8s.io/kubernetes/pkg/util/io" - "k8s.io/kubernetes/pkg/util/metrics" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/watch" -) - -var _ volume.VolumeHost = &PersistentVolumeRecycler{} - -// PersistentVolumeRecycler is a controller that watches for PersistentVolumes that are released from their claims. -// This controller will Recycle those volumes whose reclaim policy is set to PersistentVolumeReclaimRecycle and make them -// available again for a new claim. -type PersistentVolumeRecycler struct { - volumeController *framework.Controller - stopChannel chan struct{} - client recyclerClient - kubeClient clientset.Interface - pluginMgr volume.VolumePluginMgr - cloud cloudprovider.Interface - maximumRetry int - syncPeriod time.Duration - // Local cache of failed recycle / delete operations. Map volume.Name -> status of the volume. - // Only PVs in Released state have an entry here. - releasedVolumes map[string]releasedVolumeStatus -} - -// releasedVolumeStatus holds state of failed delete/recycle operation on a -// volume. The controller re-tries the operation several times and it stores -// retry count + timestamp of the last attempt here. -type releasedVolumeStatus struct { - // How many recycle/delete operations failed. - retryCount int - // Timestamp of the last attempt. - lastAttempt time.Time -} - -// NewPersistentVolumeRecycler creates a new PersistentVolumeRecycler -func NewPersistentVolumeRecycler(kubeClient clientset.Interface, syncPeriod time.Duration, maximumRetry int, plugins []volume.VolumePlugin, cloud cloudprovider.Interface) (*PersistentVolumeRecycler, error) { - recyclerClient := NewRecyclerClient(kubeClient) - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("pv_recycler_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - recycler := &PersistentVolumeRecycler{ - client: recyclerClient, - kubeClient: kubeClient, - cloud: cloud, - maximumRetry: maximumRetry, - syncPeriod: syncPeriod, - releasedVolumes: make(map[string]releasedVolumeStatus), - } - - if err := recycler.pluginMgr.InitPlugins(plugins, recycler); err != nil { - return nil, fmt.Errorf("Could not initialize volume plugins for PVClaimBinder: %+v", err) - } - - _, volumeController := framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return kubeClient.Core().PersistentVolumes().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return kubeClient.Core().PersistentVolumes().Watch(options) - }, - }, - &api.PersistentVolume{}, - syncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - pv, ok := obj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Error casting object to PersistentVolume: %v", obj) - return - } - recycler.reclaimVolume(pv) - }, - UpdateFunc: func(oldObj, newObj interface{}) { - pv, ok := newObj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Error casting object to PersistentVolume: %v", newObj) - return - } - recycler.reclaimVolume(pv) - }, - DeleteFunc: func(obj interface{}) { - pv, ok := obj.(*api.PersistentVolume) - if !ok { - glog.Errorf("Error casting object to PersistentVolume: %v", obj) - return - } - recycler.reclaimVolume(pv) - recycler.removeReleasedVolume(pv) - }, - }, - ) - - recycler.volumeController = volumeController - return recycler, nil -} - -// shouldRecycle checks a volume and returns nil, if the volume should be -// recycled right now. Otherwise it returns an error with reason why it should -// not be recycled. -func (recycler *PersistentVolumeRecycler) shouldRecycle(pv *api.PersistentVolume) error { - if pv.Spec.ClaimRef == nil { - return fmt.Errorf("Volume does not have a reference to claim") - } - if pv.Status.Phase != api.VolumeReleased { - return fmt.Errorf("The volume is not in 'Released' phase") - } - - // The volume is Released, should we retry recycling? - status, found := recycler.releasedVolumes[pv.Name] - if !found { - // We don't know anything about this volume. The controller has been - // restarted or the volume has been marked as Released by another - // controller. Recycle/delete this volume as if it was just Released. - glog.V(5).Infof("PersistentVolume[%s] not found in local cache, recycling", pv.Name) - return nil - } - - // Check the timestamp - expectedRetry := status.lastAttempt.Add(recycler.syncPeriod) - if time.Now().After(expectedRetry) { - glog.V(5).Infof("PersistentVolume[%s] retrying recycle after timeout", pv.Name) - return nil - } - // It's too early - glog.V(5).Infof("PersistentVolume[%s] skipping recycle, it's too early: now: %v, next retry: %v", pv.Name, time.Now(), expectedRetry) - return fmt.Errorf("Too early after previous failure") -} - -func (recycler *PersistentVolumeRecycler) reclaimVolume(pv *api.PersistentVolume) error { - glog.V(5).Infof("Recycler: checking PersistentVolume[%s]\n", pv.Name) - // Always load the latest version of the volume - newPV, err := recycler.client.GetPersistentVolume(pv.Name) - if err != nil { - return fmt.Errorf("Could not find PersistentVolume %s", pv.Name) - } - pv = newPV - - err = recycler.shouldRecycle(pv) - if err == nil { - glog.V(5).Infof("Reclaiming PersistentVolume[%s]\n", pv.Name) - - // both handleRecycle and handleDelete block until completion - // TODO: allow parallel recycling operations to increase throughput - switch pv.Spec.PersistentVolumeReclaimPolicy { - case api.PersistentVolumeReclaimRecycle: - err = recycler.handleRecycle(pv) - case api.PersistentVolumeReclaimDelete: - err = recycler.handleDelete(pv) - case api.PersistentVolumeReclaimRetain: - glog.V(5).Infof("Volume %s is set to retain after release. Skipping.\n", pv.Name) - default: - err = fmt.Errorf("No PersistentVolumeReclaimPolicy defined for spec: %+v", pv) - } - if err != nil { - errMsg := fmt.Sprintf("Could not recycle volume spec: %+v", err) - glog.Errorf(errMsg) - return fmt.Errorf(errMsg) - } - return nil - } - glog.V(3).Infof("PersistentVolume[%s] phase %s - skipping: %v", pv.Name, pv.Status.Phase, err) - return nil -} - -// handleReleaseFailure evaluates a failed Recycle/Delete operation, updates -// internal controller state with new nr. of attempts and timestamp of the last -// attempt. Based on the number of failures it returns the next state of the -// volume (Released / Failed). -func (recycler *PersistentVolumeRecycler) handleReleaseFailure(pv *api.PersistentVolume) api.PersistentVolumePhase { - status, found := recycler.releasedVolumes[pv.Name] - if !found { - // First failure, set retryCount to 0 (will be inceremented few lines below) - status = releasedVolumeStatus{} - } - status.retryCount += 1 - - if status.retryCount > recycler.maximumRetry { - // This was the last attempt. Remove any internal state and mark the - // volume as Failed. - glog.V(3).Infof("PersistentVolume[%s] failed %d times - marking Failed", pv.Name, status.retryCount) - recycler.removeReleasedVolume(pv) - return api.VolumeFailed - } - - status.lastAttempt = time.Now() - recycler.releasedVolumes[pv.Name] = status - return api.VolumeReleased -} - -func (recycler *PersistentVolumeRecycler) removeReleasedVolume(pv *api.PersistentVolume) { - delete(recycler.releasedVolumes, pv.Name) -} - -func (recycler *PersistentVolumeRecycler) handleRecycle(pv *api.PersistentVolume) error { - glog.V(5).Infof("Recycling PersistentVolume[%s]\n", pv.Name) - - currentPhase := pv.Status.Phase - nextPhase := currentPhase - - spec := volume.NewSpecFromPersistentVolume(pv, false) - plugin, err := recycler.pluginMgr.FindRecyclablePluginBySpec(spec) - if err != nil { - nextPhase = api.VolumeFailed - pv.Status.Message = fmt.Sprintf("%v", err) - } - - // an error above means a suitable plugin for this volume was not found. - // we don't need to attempt recycling when plugin is nil, but we do need to persist the next/failed phase - // of the volume so that subsequent syncs won't attempt recycling through this handler func. - if plugin != nil { - volRecycler, err := plugin.NewRecycler(spec) - if err != nil { - return fmt.Errorf("Could not obtain Recycler for spec: %#v error: %v", spec, err) - } - // blocks until completion - if err := volRecycler.Recycle(); err != nil { - glog.Errorf("PersistentVolume[%s] failed recycling: %+v", pv.Name, err) - pv.Status.Message = fmt.Sprintf("Recycling error: %s", err) - nextPhase = recycler.handleReleaseFailure(pv) - } else { - glog.V(5).Infof("PersistentVolume[%s] successfully recycled\n", pv.Name) - // The volume has been recycled. Remove any internal state to make - // any subsequent bind+recycle cycle working. - recycler.removeReleasedVolume(pv) - nextPhase = api.VolumePending - } - } - - if currentPhase != nextPhase { - glog.V(5).Infof("PersistentVolume[%s] changing phase from %s to %s\n", pv.Name, currentPhase, nextPhase) - pv.Status.Phase = nextPhase - _, err := recycler.client.UpdatePersistentVolumeStatus(pv) - if err != nil { - // Rollback to previous phase - pv.Status.Phase = currentPhase - } - } - - return nil -} - -func (recycler *PersistentVolumeRecycler) handleDelete(pv *api.PersistentVolume) error { - glog.V(5).Infof("Deleting PersistentVolume[%s]\n", pv.Name) - - currentPhase := pv.Status.Phase - nextPhase := currentPhase - - spec := volume.NewSpecFromPersistentVolume(pv, false) - plugin, err := recycler.pluginMgr.FindDeletablePluginBySpec(spec) - if err != nil { - nextPhase = api.VolumeFailed - pv.Status.Message = fmt.Sprintf("%v", err) - } - - // an error above means a suitable plugin for this volume was not found. - // we don't need to attempt deleting when plugin is nil, but we do need to persist the next/failed phase - // of the volume so that subsequent syncs won't attempt deletion through this handler func. - if plugin != nil { - deleter, err := plugin.NewDeleter(spec) - if err != nil { - return fmt.Errorf("Could not obtain Deleter for spec: %#v error: %v", spec, err) - } - // blocks until completion - err = deleter.Delete() - if err != nil { - glog.Errorf("PersistentVolume[%s] failed deletion: %+v", pv.Name, err) - pv.Status.Message = fmt.Sprintf("Deletion error: %s", err) - nextPhase = recycler.handleReleaseFailure(pv) - } else { - glog.V(5).Infof("PersistentVolume[%s] successfully deleted through plugin\n", pv.Name) - recycler.removeReleasedVolume(pv) - // after successful deletion through the plugin, we can also remove the PV from the cluster - if err := recycler.client.DeletePersistentVolume(pv); err != nil { - return fmt.Errorf("error deleting persistent volume: %+v", err) - } - } - } - - if currentPhase != nextPhase { - glog.V(5).Infof("PersistentVolume[%s] changing phase from %s to %s\n", pv.Name, currentPhase, nextPhase) - pv.Status.Phase = nextPhase - _, err := recycler.client.UpdatePersistentVolumeStatus(pv) - if err != nil { - // Rollback to previous phase - pv.Status.Phase = currentPhase - } - } - - return nil -} - -// Run starts this recycler's control loops -func (recycler *PersistentVolumeRecycler) Run() { - glog.V(5).Infof("Starting PersistentVolumeRecycler\n") - if recycler.stopChannel == nil { - recycler.stopChannel = make(chan struct{}) - go recycler.volumeController.Run(recycler.stopChannel) - } -} - -// Stop gracefully shuts down this binder -func (recycler *PersistentVolumeRecycler) Stop() { - glog.V(5).Infof("Stopping PersistentVolumeRecycler\n") - if recycler.stopChannel != nil { - close(recycler.stopChannel) - recycler.stopChannel = nil - } -} - -// recyclerClient abstracts access to PVs -type recyclerClient interface { - GetPersistentVolume(name string) (*api.PersistentVolume, error) - UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) - DeletePersistentVolume(volume *api.PersistentVolume) error - UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) -} - -func NewRecyclerClient(c clientset.Interface) recyclerClient { - return &realRecyclerClient{c} -} - -type realRecyclerClient struct { - client clientset.Interface -} - -func (c *realRecyclerClient) GetPersistentVolume(name string) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Get(name) -} - -func (c *realRecyclerClient) UpdatePersistentVolume(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().Update(volume) -} - -func (c *realRecyclerClient) DeletePersistentVolume(volume *api.PersistentVolume) error { - return c.client.Core().PersistentVolumes().Delete(volume.Name, nil) -} - -func (c *realRecyclerClient) UpdatePersistentVolumeStatus(volume *api.PersistentVolume) (*api.PersistentVolume, error) { - return c.client.Core().PersistentVolumes().UpdateStatus(volume) -} - -// PersistentVolumeRecycler is host to the volume plugins, but does not actually mount any volumes. -// Because no mounting is performed, most of the VolumeHost methods are not implemented. -func (f *PersistentVolumeRecycler) GetPluginDir(podUID string) string { - return "" -} - -func (f *PersistentVolumeRecycler) GetPodVolumeDir(podUID types.UID, pluginName, volumeName string) string { - return "" -} - -func (f *PersistentVolumeRecycler) GetPodPluginDir(podUID types.UID, pluginName string) string { - return "" -} - -func (f *PersistentVolumeRecycler) GetKubeClient() clientset.Interface { - return f.kubeClient -} - -func (f *PersistentVolumeRecycler) NewWrapperMounter(volName string, spec volume.Spec, pod *api.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { - return nil, fmt.Errorf("NewWrapperMounter not supported by PVClaimBinder's VolumeHost implementation") -} - -func (f *PersistentVolumeRecycler) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { - return nil, fmt.Errorf("NewWrapperUnmounter not supported by PVClaimBinder's VolumeHost implementation") -} - -func (f *PersistentVolumeRecycler) GetCloudProvider() cloudprovider.Interface { - return f.cloud -} - -func (f *PersistentVolumeRecycler) GetMounter() mount.Interface { - return nil -} - -func (f *PersistentVolumeRecycler) GetWriter() ioutil.Writer { - return nil -} - -func (f *PersistentVolumeRecycler) GetHostName() string { - return "" -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller_test.go deleted file mode 100644 index 8312fd322..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/persistentvolume_recycler_controller_test.go +++ /dev/null @@ -1,265 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/host_path" - volumetest "k8s.io/kubernetes/pkg/volume/testing" -) - -const ( - mySyncPeriod = 2 * time.Second - myMaximumRetry = 3 -) - -func TestFailedRecycling(t *testing.T) { - pv := preparePV() - - mockClient := &mockBinderClient{ - volume: pv, - } - - // no Init called for pluginMgr and no plugins are available. Volume should fail recycling. - plugMgr := volume.VolumePluginMgr{} - - recycler := &PersistentVolumeRecycler{ - kubeClient: fake.NewSimpleClientset(), - client: mockClient, - pluginMgr: plugMgr, - releasedVolumes: make(map[string]releasedVolumeStatus), - } - - err := recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("Unexpected non-nil error: %v", err) - } - - if mockClient.volume.Status.Phase != api.VolumeFailed { - t.Errorf("Expected %s but got %s", api.VolumeFailed, mockClient.volume.Status.Phase) - } - - // Use a new volume for the next test - pv = preparePV() - mockClient.volume = pv - - pv.Spec.PersistentVolumeReclaimPolicy = api.PersistentVolumeReclaimDelete - err = recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("Unexpected non-nil error: %v", err) - } - - if mockClient.volume.Status.Phase != api.VolumeFailed { - t.Errorf("Expected %s but got %s", api.VolumeFailed, mockClient.volume.Status.Phase) - } -} - -func TestRecyclingRetry(t *testing.T) { - // Test that recycler controller retries to recycle a volume several times, which succeeds eventually - pv := preparePV() - - mockClient := &mockBinderClient{ - volume: pv, - } - - plugMgr := volume.VolumePluginMgr{} - // Use a fake NewRecycler function - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newFailingMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) - // Reset a global call counter - failedCallCount = 0 - - recycler := &PersistentVolumeRecycler{ - kubeClient: fake.NewSimpleClientset(), - client: mockClient, - pluginMgr: plugMgr, - syncPeriod: mySyncPeriod, - maximumRetry: myMaximumRetry, - releasedVolumes: make(map[string]releasedVolumeStatus), - } - - // All but the last attempt will fail - testRecycleFailures(t, recycler, mockClient, pv, myMaximumRetry-1) - - // The last attempt should succeed - err := recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("Last step: Recycler failed: %v", err) - } - - if mockClient.volume.Status.Phase != api.VolumePending { - t.Errorf("Last step: The volume should be Pending, but is %s instead", mockClient.volume.Status.Phase) - } - // Check the cache, it should not have any entry - status, found := recycler.releasedVolumes[pv.Name] - if found { - t.Errorf("Last step: Expected PV to be removed from cache, got %v", status) - } -} - -func TestRecyclingRetryAlwaysFail(t *testing.T) { - // Test that recycler controller retries to recycle a volume several times, which always fails. - pv := preparePV() - - mockClient := &mockBinderClient{ - volume: pv, - } - - plugMgr := volume.VolumePluginMgr{} - // Use a fake NewRecycler function - plugMgr.InitPlugins(host_path.ProbeRecyclableVolumePlugins(newAlwaysFailingMockRecycler, volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) - // Reset a global call counter - failedCallCount = 0 - - recycler := &PersistentVolumeRecycler{ - kubeClient: fake.NewSimpleClientset(), - client: mockClient, - pluginMgr: plugMgr, - syncPeriod: mySyncPeriod, - maximumRetry: myMaximumRetry, - releasedVolumes: make(map[string]releasedVolumeStatus), - } - - // myMaximumRetry recycle attempts will fail - testRecycleFailures(t, recycler, mockClient, pv, myMaximumRetry) - - // The volume should be failed after myMaximumRetry attempts - err := recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("Last step: Recycler failed: %v", err) - } - - if mockClient.volume.Status.Phase != api.VolumeFailed { - t.Errorf("Last step: The volume should be Failed, but is %s instead", mockClient.volume.Status.Phase) - } - // Check the cache, it should not have any entry - status, found := recycler.releasedVolumes[pv.Name] - if found { - t.Errorf("Last step: Expected PV to be removed from cache, got %v", status) - } -} - -func preparePV() *api.PersistentVolume { - return &api.PersistentVolume{ - Spec: api.PersistentVolumeSpec{ - AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce}, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): resource.MustParse("8Gi"), - }, - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: "/tmp/data02", - }, - }, - PersistentVolumeReclaimPolicy: api.PersistentVolumeReclaimRecycle, - ClaimRef: &api.ObjectReference{ - Name: "foo", - Namespace: "bar", - }, - }, - Status: api.PersistentVolumeStatus{ - Phase: api.VolumeReleased, - }, - } -} - -// Test that `count` attempts to recycle a PV fails. -func testRecycleFailures(t *testing.T, recycler *PersistentVolumeRecycler, mockClient *mockBinderClient, pv *api.PersistentVolume, count int) { - for i := 1; i <= count; i++ { - err := recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("STEP %d: Recycler faled: %v", i, err) - } - - // Check the status, it should be failed - if mockClient.volume.Status.Phase != api.VolumeReleased { - t.Errorf("STEP %d: The volume should be Released, but is %s instead", i, mockClient.volume.Status.Phase) - } - - // Check the failed volume cache - status, found := recycler.releasedVolumes[pv.Name] - if !found { - t.Errorf("STEP %d: cannot find released volume status", i) - } - if status.retryCount != i { - t.Errorf("STEP %d: Expected nr. of attempts to be %d, got %d", i, i, status.retryCount) - } - - // call reclaimVolume too early, it should not increment the retryCount - time.Sleep(mySyncPeriod / 2) - err = recycler.reclaimVolume(pv) - if err != nil { - t.Errorf("STEP %d: Recycler failed: %v", i, err) - } - - status, found = recycler.releasedVolumes[pv.Name] - if !found { - t.Errorf("STEP %d: cannot find released volume status", i) - } - if status.retryCount != i { - t.Errorf("STEP %d: Expected nr. of attempts to be %d, got %d", i, i, status.retryCount) - } - - // Call the next reclaimVolume() after full pvRecycleRetryPeriod - time.Sleep(mySyncPeriod / 2) - } -} - -func newFailingMockRecycler(spec *volume.Spec, host volume.VolumeHost, config volume.VolumeConfig) (volume.Recycler, error) { - return &failingMockRecycler{ - path: spec.PersistentVolume.Spec.HostPath.Path, - errorCount: myMaximumRetry - 1, // fail two times and then successfully recycle the volume - }, nil -} - -func newAlwaysFailingMockRecycler(spec *volume.Spec, host volume.VolumeHost, config volume.VolumeConfig) (volume.Recycler, error) { - return &failingMockRecycler{ - path: spec.PersistentVolume.Spec.HostPath.Path, - errorCount: 1000, // always fail - }, nil -} - -type failingMockRecycler struct { - path string - // How many times should the recycler fail before returning success. - errorCount int - volume.MetricsNil -} - -// Counter of failingMockRecycler.Recycle() calls. Global variable just for -// testing. It's too much code to create a custom volume plugin, which would -// hold this variable. -var failedCallCount = 0 - -func (r *failingMockRecycler) GetPath() string { - return r.path -} - -func (r *failingMockRecycler) Recycle() error { - failedCallCount += 1 - if failedCallCount <= r.errorCount { - return fmt.Errorf("Failing for %d. time", failedCallCount) - } - // return nil means recycle passed - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/types.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/types.go deleted file mode 100644 index 42ca36801..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/persistentvolume/types.go +++ /dev/null @@ -1,267 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 persistentvolume - -import ( - "fmt" - "sort" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" -) - -const ( - // A PVClaim can request a quality of service tier by adding this annotation. The value of the annotation - // is arbitrary. The values are pre-defined by a cluster admin and known to users when requesting a QoS. - // For example tiers might be gold, silver, and tin and the admin configures what that means for each volume plugin that can provision a volume. - // Values in the alpha version of this feature are not meaningful, but will be in the full version of this feature. - qosProvisioningKey = "volume.alpha.kubernetes.io/storage-class" - // Name of a tag attached to a real volume in cloud (e.g. AWS EBS or GCE PD) - // with namespace of a persistent volume claim used to create this volume. - cloudVolumeCreatedForClaimNamespaceTag = "kubernetes.io/created-for/pvc/namespace" - // Name of a tag attached to a real volume in cloud (e.g. AWS EBS or GCE PD) - // with name of a persistent volume claim used to create this volume. - cloudVolumeCreatedForClaimNameTag = "kubernetes.io/created-for/pvc/name" - // Name of a tag attached to a real volume in cloud (e.g. AWS EBS or GCE PD) - // with name of appropriate Kubernetes persistent volume . - cloudVolumeCreatedForVolumeNameTag = "kubernetes.io/created-for/pv/name" -) - -// persistentVolumeOrderedIndex is a cache.Store that keeps persistent volumes indexed by AccessModes and ordered by storage capacity. -type persistentVolumeOrderedIndex struct { - cache.Indexer -} - -var _ cache.Store = &persistentVolumeOrderedIndex{} // persistentVolumeOrderedIndex is a Store - -func NewPersistentVolumeOrderedIndex() *persistentVolumeOrderedIndex { - return &persistentVolumeOrderedIndex{ - cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"accessmodes": accessModesIndexFunc}), - } -} - -// accessModesIndexFunc is an indexing function that returns a persistent volume's AccessModes as a string -func accessModesIndexFunc(obj interface{}) ([]string, error) { - if pv, ok := obj.(*api.PersistentVolume); ok { - modes := api.GetAccessModesAsString(pv.Spec.AccessModes) - return []string{modes}, nil - } - return []string{""}, fmt.Errorf("object is not a persistent volume: %v", obj) -} - -// ListByAccessModes returns all volumes with the given set of AccessModeTypes *in order* of their storage capacity (low to high) -func (pvIndex *persistentVolumeOrderedIndex) ListByAccessModes(modes []api.PersistentVolumeAccessMode) ([]*api.PersistentVolume, error) { - pv := &api.PersistentVolume{ - Spec: api.PersistentVolumeSpec{ - AccessModes: modes, - }, - } - - objs, err := pvIndex.Index("accessmodes", pv) - if err != nil { - return nil, err - } - - volumes := make([]*api.PersistentVolume, len(objs)) - for i, obj := range objs { - volumes[i] = obj.(*api.PersistentVolume) - } - - sort.Sort(byCapacity{volumes}) - return volumes, nil -} - -// matchPredicate is a function that indicates that a persistent volume matches another -type matchPredicate func(compareThis, toThis *api.PersistentVolume) bool - -// find returns the nearest PV from the ordered list or nil if a match is not found -func (pvIndex *persistentVolumeOrderedIndex) findByClaim(claim *api.PersistentVolumeClaim, matchPredicate matchPredicate) (*api.PersistentVolume, error) { - // PVs are indexed by their access modes to allow easier searching. Each index is the string representation of a set of access modes. - // There is a finite number of possible sets and PVs will only be indexed in one of them (whichever index matches the PV's modes). - // - // A request for resources will always specify its desired access modes. Any matching PV must have at least that number - // of access modes, but it can have more. For example, a user asks for ReadWriteOnce but a GCEPD is available, which is ReadWriteOnce+ReadOnlyMany. - // - // Searches are performed against a set of access modes, so we can attempt not only the exact matching modes but also - // potential matches (the GCEPD example above). - allPossibleModes := pvIndex.allPossibleMatchingAccessModes(claim.Spec.AccessModes) - - for _, modes := range allPossibleModes { - volumes, err := pvIndex.ListByAccessModes(modes) - if err != nil { - return nil, err - } - - // volumes are sorted by size but some may be bound or earmarked for a specific claim. - // filter those volumes for easy binary search by size - // return the exact pre-binding match, if found - unboundVolumes := []*api.PersistentVolume{} - for _, volume := range volumes { - // volume isn't currently bound or pre-bound. - if volume.Spec.ClaimRef == nil { - unboundVolumes = append(unboundVolumes, volume) - continue - } - - if claim.Name == volume.Spec.ClaimRef.Name && claim.Namespace == volume.Spec.ClaimRef.Namespace && claim.UID == volume.Spec.ClaimRef.UID { - // exact match! No search required. - return volume, nil - } - } - - // a claim requesting provisioning will have an exact match pre-bound to the claim. - // no need to search through unbound volumes. The matching volume will be created by the provisioner - // and will match above when the claim is re-processed by the binder. - if keyExists(qosProvisioningKey, claim.Annotations) { - return nil, nil - } - - searchPV := &api.PersistentVolume{ - Spec: api.PersistentVolumeSpec{ - AccessModes: claim.Spec.AccessModes, - Capacity: api.ResourceList{ - api.ResourceName(api.ResourceStorage): claim.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)], - }, - }, - } - - i := sort.Search(len(unboundVolumes), func(i int) bool { return matchPredicate(searchPV, unboundVolumes[i]) }) - if i < len(unboundVolumes) { - return unboundVolumes[i], nil - } - } - return nil, nil -} - -// findBestMatchForClaim is a convenience method that finds a volume by the claim's AccessModes and requests for Storage -func (pvIndex *persistentVolumeOrderedIndex) findBestMatchForClaim(claim *api.PersistentVolumeClaim) (*api.PersistentVolume, error) { - return pvIndex.findByClaim(claim, matchStorageCapacity) -} - -// byCapacity is used to order volumes by ascending storage size -type byCapacity struct { - volumes []*api.PersistentVolume -} - -func (c byCapacity) Less(i, j int) bool { - return matchStorageCapacity(c.volumes[i], c.volumes[j]) -} - -func (c byCapacity) Swap(i, j int) { - c.volumes[i], c.volumes[j] = c.volumes[j], c.volumes[i] -} - -func (c byCapacity) Len() int { - return len(c.volumes) -} - -// matchStorageCapacity is a matchPredicate used to sort and find volumes -func matchStorageCapacity(pvA, pvB *api.PersistentVolume) bool { - aQty := pvA.Spec.Capacity[api.ResourceStorage] - bQty := pvB.Spec.Capacity[api.ResourceStorage] - aSize := aQty.Value() - bSize := bQty.Value() - return aSize <= bSize -} - -// allPossibleMatchingAccessModes returns an array of AccessMode arrays that can satisfy a user's requested modes. -// -// see comments in the Find func above regarding indexing. -// -// allPossibleMatchingAccessModes gets all stringified accessmodes from the index and returns all those that -// contain at least all of the requested mode. -// -// For example, assume the index contains 2 types of PVs where the stringified accessmodes are: -// -// "RWO,ROX" -- some number of GCEPDs -// "RWO,ROX,RWX" -- some number of NFS volumes -// -// A request for RWO could be satisfied by both sets of indexed volumes, so allPossibleMatchingAccessModes returns: -// -// [][]api.PersistentVolumeAccessMode { -// []api.PersistentVolumeAccessMode { -// api.ReadWriteOnce, api.ReadOnlyMany, -// }, -// []api.PersistentVolumeAccessMode { -// api.ReadWriteOnce, api.ReadOnlyMany, api.ReadWriteMany, -// }, -// } -// -// A request for RWX can be satisfied by only one set of indexed volumes, so the return is: -// -// [][]api.PersistentVolumeAccessMode { -// []api.PersistentVolumeAccessMode { -// api.ReadWriteOnce, api.ReadOnlyMany, api.ReadWriteMany, -// }, -// } -// -// This func returns modes with ascending levels of modes to give the user what is closest to what they actually asked for. -// -func (pvIndex *persistentVolumeOrderedIndex) allPossibleMatchingAccessModes(requestedModes []api.PersistentVolumeAccessMode) [][]api.PersistentVolumeAccessMode { - matchedModes := [][]api.PersistentVolumeAccessMode{} - keys := pvIndex.Indexer.ListIndexFuncValues("accessmodes") - for _, key := range keys { - indexedModes := api.GetAccessModesFromString(key) - if containedInAll(indexedModes, requestedModes) { - matchedModes = append(matchedModes, indexedModes) - } - } - - // sort by the number of modes in each array with the fewest number of modes coming first. - // this allows searching for volumes by the minimum number of modes required of the possible matches. - sort.Sort(byAccessModes{matchedModes}) - return matchedModes -} - -func contains(modes []api.PersistentVolumeAccessMode, mode api.PersistentVolumeAccessMode) bool { - for _, m := range modes { - if m == mode { - return true - } - } - return false -} - -func containedInAll(indexedModes []api.PersistentVolumeAccessMode, requestedModes []api.PersistentVolumeAccessMode) bool { - for _, mode := range requestedModes { - if !contains(indexedModes, mode) { - return false - } - } - return true -} - -// byAccessModes is used to order access modes by size, with the fewest modes first -type byAccessModes struct { - modes [][]api.PersistentVolumeAccessMode -} - -func (c byAccessModes) Less(i, j int) bool { - return len(c.modes[i]) < len(c.modes[j]) -} - -func (c byAccessModes) Swap(i, j int) { - c.modes[i], c.modes[j] = c.modes[j], c.modes[i] -} - -func (c byAccessModes) Len() int { - return len(c.modes) -} - -func claimToClaimKey(claim *api.PersistentVolumeClaim) string { - return fmt.Sprintf("%s/%s", claim.Namespace, claim.Name) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/fakes.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/fakes.go deleted file mode 100644 index ddbaff1b0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/fakes.go +++ /dev/null @@ -1,324 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "time" - - "k8s.io/kubernetes/pkg/api" - api_pod "k8s.io/kubernetes/pkg/api/pod" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/sets" - "speter.net/go/exp/math/dec/inf" -) - -func dec(i int64, exponent int) *inf.Dec { - return inf.NewDec(i, inf.Scale(-exponent)) -} - -func newPVC(name string) api.PersistentVolumeClaim { - return api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - Spec: api.PersistentVolumeClaimSpec{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceStorage: resource.Quantity{ - Amount: dec(1, 0), - Format: resource.BinarySI, - }, - }, - }, - }, - } -} - -func newPetSetWithVolumes(replicas int, name string, petMounts []api.VolumeMount, podMounts []api.VolumeMount) *apps.PetSet { - mounts := append(petMounts, podMounts...) - claims := []api.PersistentVolumeClaim{} - for _, m := range petMounts { - claims = append(claims, newPVC(m.Name)) - } - - vols := []api.Volume{} - for _, m := range podMounts { - vols = append(vols, api.Volume{ - Name: m.Name, - VolumeSource: api.VolumeSource{ - HostPath: &api.HostPathVolumeSource{ - Path: fmt.Sprintf("/tmp/%v", m.Name), - }, - }, - }) - } - - return &apps.PetSet{ - TypeMeta: unversioned.TypeMeta{ - Kind: "PetSet", - APIVersion: "apps/v1beta1", - }, - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: api.NamespaceDefault, - UID: types.UID("test"), - }, - Spec: apps.PetSetSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar"}, - }, - Replicas: replicas, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "nginx", - Image: "nginx", - VolumeMounts: mounts, - }, - }, - Volumes: vols, - }, - }, - VolumeClaimTemplates: claims, - ServiceName: "governingsvc", - }, - } -} - -func runningPod(ns, name string) *api.Pod { - p := &api.Pod{Status: api.PodStatus{Phase: api.PodRunning}} - p.Namespace = ns - p.Name = name - return p -} - -func newPodList(ps *apps.PetSet, num int) []*api.Pod { - // knownPods are pods in the system - knownPods := []*api.Pod{} - for i := 0; i < num; i++ { - k, _ := newPCB(fmt.Sprintf("%v", i), ps) - knownPods = append(knownPods, k.pod) - } - return knownPods -} - -func newPetSet(replicas int) *apps.PetSet { - petMounts := []api.VolumeMount{ - {Name: "datadir", MountPath: "/tmp/zookeeper"}, - } - podMounts := []api.VolumeMount{ - {Name: "home", MountPath: "/home"}, - } - return newPetSetWithVolumes(replicas, "foo", petMounts, podMounts) -} - -func checkPodForMount(pod *api.Pod, mountName string) error { - for _, c := range pod.Spec.Containers { - for _, v := range c.VolumeMounts { - if v.Name == mountName { - return nil - } - } - } - return fmt.Errorf("Found volume but no associated mount %v in pod %v", mountName, pod.Name) -} - -func newFakePetClient() *fakePetClient { - return &fakePetClient{ - pets: []*pcb{}, - claims: []api.PersistentVolumeClaim{}, - recorder: &record.FakeRecorder{}, - petHealthChecker: &defaultPetHealthChecker{}, - } -} - -type fakePetClient struct { - pets []*pcb - claims []api.PersistentVolumeClaim - petsCreated, petsDeleted int - claimsCreated, claimsDeleted int - recorder record.EventRecorder - petHealthChecker -} - -// Delete fakes pet client deletion. -func (f *fakePetClient) Delete(p *pcb) error { - pets := []*pcb{} - found := false - for i, pet := range f.pets { - if p.pod.Name == pet.pod.Name { - found = true - f.recorder.Eventf(pet.parent, api.EventTypeNormal, "SuccessfulDelete", "pet: %v", pet.pod.Name) - continue - } - pets = append(pets, f.pets[i]) - } - if !found { - // TODO: Return proper not found error - return fmt.Errorf("Delete failed: pet %v doesn't exist", p.pod.Name) - } - f.pets = pets - f.petsDeleted++ - return nil -} - -// Get fakes getting pets. -func (f *fakePetClient) Get(p *pcb) (*pcb, bool, error) { - for i, pet := range f.pets { - if p.pod.Name == pet.pod.Name { - return f.pets[i], true, nil - } - } - return nil, false, nil -} - -// Create fakes pet creation. -func (f *fakePetClient) Create(p *pcb) error { - for _, pet := range f.pets { - if p.pod.Name == pet.pod.Name { - return fmt.Errorf("Create failed: pet %v already exists", p.pod.Name) - } - } - f.recorder.Eventf(p.parent, api.EventTypeNormal, "SuccessfulCreate", "pet: %v", p.pod.Name) - f.pets = append(f.pets, p) - f.petsCreated++ - return nil -} - -// Update fakes pet updates. -func (f *fakePetClient) Update(expected, wanted *pcb) error { - found := false - pets := []*pcb{} - for i, pet := range f.pets { - if wanted.pod.Name == pet.pod.Name { - f.pets[i].pod.Annotations[api_pod.PodHostnameAnnotation] = wanted.pod.Annotations[api_pod.PodHostnameAnnotation] - f.pets[i].pod.Annotations[api_pod.PodSubdomainAnnotation] = wanted.pod.Annotations[api_pod.PodSubdomainAnnotation] - f.pets[i].pod.Spec = wanted.pod.Spec - found = true - } - pets = append(pets, f.pets[i]) - } - f.pets = pets - if !found { - return fmt.Errorf("Cannot update pet %v not found", wanted.pod.Name) - } - // TODO: Delete pvcs/volumes that are in wanted but not in expected. - return nil -} - -func (f *fakePetClient) getPodList() []*api.Pod { - p := []*api.Pod{} - for i, pet := range f.pets { - if pet.pod == nil { - continue - } - p = append(p, f.pets[i].pod) - } - return p -} - -func (f *fakePetClient) deletePetAtIndex(index int) { - p := []*pcb{} - for i := range f.pets { - if i != index { - p = append(p, f.pets[i]) - } - } - f.pets = p -} - -func (f *fakePetClient) setHealthy(index int) error { - if len(f.pets) < index { - return fmt.Errorf("Index out of range, len %v index %v", len(f.pets), index) - } - f.pets[index].pod.Status.Phase = api.PodRunning - f.pets[index].pod.Annotations[PetSetInitAnnotation] = "true" - return nil -} - -// isHealthy is a convenience wrapper around the default health checker. -// The first invocation returns not-healthy, but marks the pet healthy so -// subsequent invocations see it as healthy. -func (f *fakePetClient) isHealthy(pod *api.Pod) bool { - if f.petHealthChecker.isHealthy(pod) { - return true - } - return false -} - -func (f *fakePetClient) setDeletionTimestamp(index int) error { - if len(f.pets) < index { - return fmt.Errorf("Index out of range, len %v index %v", len(f.pets), index) - } - f.pets[index].pod.DeletionTimestamp = &unversioned.Time{Time: time.Now()} - return nil -} - -// SyncPVCs fakes pvc syncing. -func (f *fakePetClient) SyncPVCs(pet *pcb) error { - v := pet.pvcs - updateClaims := map[string]api.PersistentVolumeClaim{} - for i, update := range v { - updateClaims[update.Name] = v[i] - } - claimList := []api.PersistentVolumeClaim{} - for i, existing := range f.claims { - if update, ok := updateClaims[existing.Name]; ok { - claimList = append(claimList, update) - delete(updateClaims, existing.Name) - } else { - claimList = append(claimList, f.claims[i]) - } - } - for _, remaining := range updateClaims { - claimList = append(claimList, remaining) - f.claimsCreated++ - f.recorder.Eventf(pet.parent, api.EventTypeNormal, "SuccessfulCreate", "pvc: %v", remaining.Name) - } - f.claims = claimList - return nil -} - -// DeletePVCs fakes pvc deletion. -func (f *fakePetClient) DeletePVCs(pet *pcb) error { - claimsToDelete := pet.pvcs - deleteClaimNames := sets.NewString() - for _, c := range claimsToDelete { - deleteClaimNames.Insert(c.Name) - } - pvcs := []api.PersistentVolumeClaim{} - for i, existing := range f.claims { - if deleteClaimNames.Has(existing.Name) { - deleteClaimNames.Delete(existing.Name) - f.claimsDeleted++ - f.recorder.Eventf(pet.parent, api.EventTypeNormal, "SuccessfulDelete", "pvc: %v", existing.Name) - continue - } - pvcs = append(pvcs, f.claims[i]) - } - f.claims = pvcs - if deleteClaimNames.Len() != 0 { - return fmt.Errorf("Claims %+v don't exist. Failed deletion.", deleteClaimNames) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers.go deleted file mode 100644 index ae72ef2a8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers.go +++ /dev/null @@ -1,247 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "crypto/md5" - "fmt" - "sort" - "strings" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - podapi "k8s.io/kubernetes/pkg/api/pod" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/util/sets" -) - -// identityMapper is an interface for assigning identities to a pet. -// All existing identity mappers just append "-(index)" to the petset name to -// generate a unique identity. This is used in claims/DNS/hostname/petname -// etc. There's a more elegant way to achieve this mapping, but we're -// taking the simplest route till we have data on whether users will need -// more customization. -// Note that running a single identity mapper is not guaranteed to give -// your pet a unique identity. You must run them all. Order doesn't matter. -type identityMapper interface { - // SetIdentity takes an id and assigns the given pet an identity based - // on the pet set spec. The is must be unique amongst members of the - // pet set. - SetIdentity(id string, pet *api.Pod) - - // Identity returns the identity of the pet. - Identity(pod *api.Pod) string -} - -func newIdentityMappers(ps *apps.PetSet) []identityMapper { - return []identityMapper{ - &NameIdentityMapper{ps}, - &NetworkIdentityMapper{ps}, - &VolumeIdentityMapper{ps}, - } -} - -// NetworkIdentityMapper assigns network identity to pets. -type NetworkIdentityMapper struct { - ps *apps.PetSet -} - -// SetIdentity sets network identity on the pet. -func (n *NetworkIdentityMapper) SetIdentity(id string, pet *api.Pod) { - pet.Annotations[podapi.PodHostnameAnnotation] = fmt.Sprintf("%v-%v", n.ps.Name, id) - pet.Annotations[podapi.PodSubdomainAnnotation] = n.ps.Spec.ServiceName - return -} - -// Identity returns the network identity of the pet. -func (n *NetworkIdentityMapper) Identity(pet *api.Pod) string { - return n.String(pet) -} - -// String is a string function for the network identity of the pet. -func (n *NetworkIdentityMapper) String(pet *api.Pod) string { - hostname := pet.Annotations[podapi.PodHostnameAnnotation] - subdomain := pet.Annotations[podapi.PodSubdomainAnnotation] - return strings.Join([]string{hostname, subdomain, n.ps.Namespace}, ".") -} - -// VolumeIdentityMapper assigns storage identity to pets. -type VolumeIdentityMapper struct { - ps *apps.PetSet -} - -// SetIdentity sets storge identity on the pet. -func (v *VolumeIdentityMapper) SetIdentity(id string, pet *api.Pod) { - petVolumes := []api.Volume{} - petClaims := v.GetClaims(id) - - // These volumes will all go down with the pod. If a name matches one of - // the claims in the pet set, it gets clobbered. - podVolumes := map[string]api.Volume{} - for _, podVol := range pet.Spec.Volumes { - podVolumes[podVol.Name] = podVol - } - - // Insert claims for the idempotent petSet volumes - for name, claim := range petClaims { - // Volumes on a pet for which there are no associated claims on the - // petset are pod local, and die with the pod. - podVol, ok := podVolumes[name] - if ok { - // TODO: Validate and reject this. - glog.V(4).Infof("Overwriting existing volume source %v", podVol.Name) - } - newVol := api.Volume{ - Name: name, - VolumeSource: api.VolumeSource{ - PersistentVolumeClaim: &api.PersistentVolumeClaimVolumeSource{ - ClaimName: claim.Name, - // TODO: Use source definition to set this value when we have one. - ReadOnly: false, - }, - }, - } - petVolumes = append(petVolumes, newVol) - } - - // Transfer any ephemeral pod volumes - for name, vol := range podVolumes { - if _, ok := petClaims[name]; !ok { - petVolumes = append(petVolumes, vol) - } - } - pet.Spec.Volumes = petVolumes - return -} - -// Identity returns the storage identity of the pet. -func (v *VolumeIdentityMapper) Identity(pet *api.Pod) string { - // TODO: Make this a hash? - return v.String(pet) -} - -// String is a string function for the network identity of the pet. -func (v *VolumeIdentityMapper) String(pet *api.Pod) string { - ids := []string{} - petVols := sets.NewString() - for _, petVol := range v.ps.Spec.VolumeClaimTemplates { - petVols.Insert(petVol.Name) - } - for _, podVol := range pet.Spec.Volumes { - // Volumes on a pet for which there are no associated claims on the - // petset are pod local, and die with the pod. - if !petVols.Has(podVol.Name) { - continue - } - if podVol.VolumeSource.PersistentVolumeClaim == nil { - // TODO: Is this a part of the identity? - ids = append(ids, fmt.Sprintf("%v:None", podVol.Name)) - continue - } - ids = append(ids, fmt.Sprintf("%v:%v", podVol.Name, podVol.VolumeSource.PersistentVolumeClaim.ClaimName)) - } - sort.Strings(ids) - return strings.Join(ids, "") -} - -// GetClaims returns the volume claims associated with the given id. -// The claims belong to the petset. The id should be unique within a petset. -func (v *VolumeIdentityMapper) GetClaims(id string) map[string]api.PersistentVolumeClaim { - petClaims := map[string]api.PersistentVolumeClaim{} - for _, pvc := range v.ps.Spec.VolumeClaimTemplates { - claim := pvc - // TODO: Name length checking in validation. - claim.Name = fmt.Sprintf("%v-%v-%v", claim.Name, v.ps.Name, id) - claim.Namespace = v.ps.Namespace - claim.Labels = v.ps.Spec.Selector.MatchLabels - - // TODO: We're assuming that the claim template has a volume QoS key, eg: - // volume.alpha.kubernetes.io/storage-class: anything - petClaims[pvc.Name] = claim - } - return petClaims -} - -// GetClaimsForPet returns the pvcs for the given pet. -func (v *VolumeIdentityMapper) GetClaimsForPet(pet *api.Pod) []api.PersistentVolumeClaim { - // Strip out the "-(index)" from the pet name and use it to generate - // claim names. - id := strings.Split(pet.Name, "-") - petID := id[len(id)-1] - pvcs := []api.PersistentVolumeClaim{} - for _, pvc := range v.GetClaims(petID) { - pvcs = append(pvcs, pvc) - } - return pvcs -} - -// NameIdentityMapper assigns names to pets. -// It also puts the pet in the same namespace as the parent. -type NameIdentityMapper struct { - ps *apps.PetSet -} - -// SetIdentity sets the pet namespace and name. -func (n *NameIdentityMapper) SetIdentity(id string, pet *api.Pod) { - pet.Name = fmt.Sprintf("%v-%v", n.ps.Name, id) - pet.Namespace = n.ps.Namespace - return -} - -// Identity returns the name identity of the pet. -func (n *NameIdentityMapper) Identity(pet *api.Pod) string { - return n.String(pet) -} - -// String is a string function for the name identity of the pet. -func (n *NameIdentityMapper) String(pet *api.Pod) string { - return fmt.Sprintf("%v/%v", pet.Namespace, pet.Name) -} - -// identityHash computes a hash of the pet by running all the above identity -// mappers. -func identityHash(ps *apps.PetSet, pet *api.Pod) string { - id := "" - for _, idMapper := range newIdentityMappers(ps) { - id += idMapper.Identity(pet) - } - return fmt.Sprintf("%x", md5.Sum([]byte(id))) -} - -// copyPetID gives the realPet the same identity as the expectedPet. -// Note that this is *not* a literal copy, but a copy of the fields that -// contribute to the pet's identity. The returned boolean 'needsUpdate' will -// be false if the realPet already has the same identity as the expectedPet. -func copyPetID(realPet, expectedPet *pcb) (pod api.Pod, needsUpdate bool, err error) { - if realPet.pod == nil || expectedPet.pod == nil { - return pod, false, fmt.Errorf("Need a valid to and from pet for copy") - } - if realPet.parent.UID != expectedPet.parent.UID { - return pod, false, fmt.Errorf("Cannot copy pets with different parents") - } - ps := realPet.parent - if identityHash(ps, realPet.pod) == identityHash(ps, expectedPet.pod) { - return *realPet.pod, false, nil - } - copyPod := *realPet.pod - // This is the easiest way to give an identity to a pod. It won't work - // when we stop using names for id. - for _, idMapper := range newIdentityMappers(ps) { - idMapper.SetIdentity(expectedPet.id, ©Pod) - } - return copyPod, true, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers_test.go deleted file mode 100644 index f9a736fc3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/identity_mappers_test.go +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "reflect" - "strings" - - "k8s.io/kubernetes/pkg/api" - api_pod "k8s.io/kubernetes/pkg/api/pod" - "testing" -) - -func TestPetIDName(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - for i := 0; i < replicas; i++ { - petName := fmt.Sprintf("%v-%d", ps.Name, i) - pcb, err := newPCB(fmt.Sprintf("%d", i), ps) - if err != nil { - t.Fatalf("Failed to generate pet %v", err) - } - pod := pcb.pod - if pod.Name != petName || pod.Namespace != ps.Namespace { - t.Errorf("Wrong name identity, expected %v", pcb.pod.Name) - } - } -} - -func TestPetIDDNS(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - for i := 0; i < replicas; i++ { - petName := fmt.Sprintf("%v-%d", ps.Name, i) - petSubdomain := ps.Spec.ServiceName - pcb, err := newPCB(fmt.Sprintf("%d", i), ps) - pod := pcb.pod - if err != nil { - t.Fatalf("Failed to generate pet %v", err) - } - if hostname, ok := pod.Annotations[api_pod.PodHostnameAnnotation]; !ok || hostname != petName { - t.Errorf("Wrong hostname: %v", petName) - } - // TODO: Check this against the governing service. - if subdomain, ok := pod.Annotations[api_pod.PodSubdomainAnnotation]; !ok || subdomain != petSubdomain { - t.Errorf("Wrong subdomain: %v", petName) - } - } -} -func TestPetIDVolume(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - for i := 0; i < replicas; i++ { - pcb, err := newPCB(fmt.Sprintf("%d", i), ps) - if err != nil { - t.Fatalf("Failed to generate pet %v", err) - } - pod := pcb.pod - petName := fmt.Sprintf("%v-%d", ps.Name, i) - claimName := fmt.Sprintf("datadir-%v", petName) - for _, v := range pod.Spec.Volumes { - switch v.Name { - case "datadir": - c := v.VolumeSource.PersistentVolumeClaim - if c == nil || c.ClaimName != claimName { - t.Fatalf("Unexpected claim %v", c) - } - if err := checkPodForMount(pod, "datadir"); err != nil { - t.Errorf("Expected pod mount: %v", err) - } - case "home": - h := v.VolumeSource.HostPath - if h == nil || h.Path != "/tmp/home" { - t.Errorf("Unexpected modification to hostpath, expected /tmp/home got %+v", h) - } - default: - t.Errorf("Unexpected volume %v", v.Name) - } - } - } - // TODO: Check volume mounts. -} - -func TestPetIDVolumeClaims(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - for i := 0; i < replicas; i++ { - pcb, err := newPCB(fmt.Sprintf("%v", i), ps) - if err != nil { - t.Fatalf("Failed to generate pet %v", err) - } - pvcs := pcb.pvcs - petName := fmt.Sprintf("%v-%d", ps.Name, i) - claimName := fmt.Sprintf("datadir-%v", petName) - if len(pvcs) != 1 || pvcs[0].Name != claimName { - t.Errorf("Wrong pvc expected %v got %v", claimName, pvcs[0].Name) - } - } -} - -func TestPetIDCrossAssignment(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - - nameMapper := &NameIdentityMapper{ps} - volumeMapper := &VolumeIdentityMapper{ps} - networkMapper := &NetworkIdentityMapper{ps} - - // Check that the name is consistent across identity. - for i := 0; i < replicas; i++ { - pet, _ := newPCB(fmt.Sprintf("%v", i), ps) - p := pet.pod - name := strings.Split(nameMapper.Identity(p), "/")[1] - network := networkMapper.Identity(p) - volume := volumeMapper.Identity(p) - - petVolume := strings.Split(volume, ":")[1] - - if petVolume != fmt.Sprintf("datadir-%v", name) { - t.Errorf("Unexpected pet volume name %v, expected %v", petVolume, name) - } - if network != fmt.Sprintf("%v.%v.%v", name, ps.Spec.ServiceName, ps.Namespace) { - t.Errorf("Unexpected pet network ID %v, expected %v", network, name) - } - t.Logf("[%v] volume: %+v, network: %+v, name: %+v", i, volume, network, name) - } -} - -func TestPetIDReset(t *testing.T) { - replicas := 2 - ps := newPetSet(replicas) - firstPCB, err := newPCB("1", ps) - secondPCB, err := newPCB("2", ps) - if identityHash(ps, firstPCB.pod) == identityHash(ps, secondPCB.pod) { - t.Fatalf("Failed to generate uniquey identities:\n%+v\n%+v", firstPCB.pod.Spec, secondPCB.pod.Spec) - } - userAdded := api.Volume{ - Name: "test", - VolumeSource: api.VolumeSource{ - EmptyDir: &api.EmptyDirVolumeSource{Medium: api.StorageMediumMemory}, - }, - } - firstPCB.pod.Spec.Volumes = append(firstPCB.pod.Spec.Volumes, userAdded) - pod, needsUpdate, err := copyPetID(firstPCB, secondPCB) - if err != nil { - t.Errorf("%v", err) - } - if !needsUpdate { - t.Errorf("expected update since identity of %v was reset", secondPCB.pod.Name) - } - if identityHash(ps, &pod) != identityHash(ps, secondPCB.pod) { - t.Errorf("Failed to copy identity for pod %v -> %v", firstPCB.pod.Name, secondPCB.pod.Name) - } - foundVol := false - for _, v := range pod.Spec.Volumes { - if reflect.DeepEqual(v, userAdded) { - foundVol = true - break - } - } - if !foundVol { - t.Errorf("User added volume was corrupted by reset action.") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator.go deleted file mode 100644 index 81df6814c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "sort" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/controller" -) - -// newPCB generates a new PCB using the id string as a unique qualifier -func newPCB(id string, ps *apps.PetSet) (*pcb, error) { - petPod, err := controller.GetPodFromTemplate(&ps.Spec.Template, ps) - if err != nil { - return nil, err - } - for _, im := range newIdentityMappers(ps) { - im.SetIdentity(id, petPod) - } - petPVCs := []api.PersistentVolumeClaim{} - vMapper := &VolumeIdentityMapper{ps} - for _, c := range vMapper.GetClaims(id) { - petPVCs = append(petPVCs, c) - } - // TODO: Replace id field with IdentityHash, since id is more than just an index. - return &pcb{pod: petPod, pvcs: petPVCs, id: id, parent: ps}, nil -} - -// petQueue is a custom datastructure that's resembles a queue of pets. -type petQueue struct { - pets []*pcb - idMapper identityMapper -} - -// enqueue enqueues the given pet, evicting any pets with the same id -func (pt *petQueue) enqueue(p *pcb) { - if p == nil { - pt.pets = append(pt.pets, nil) - return - } - // Pop an existing pet from the know list, append the new pet to the end. - petList := []*pcb{} - petID := pt.idMapper.Identity(p.pod) - for i := range pt.pets { - if petID != pt.idMapper.Identity(pt.pets[i].pod) { - petList = append(petList, pt.pets[i]) - } - } - pt.pets = petList - p.event = syncPet - pt.pets = append(pt.pets, p) -} - -// dequeue returns the last element of the queue -func (pt *petQueue) dequeue() *pcb { - if pt.empty() { - glog.Warningf("Dequeue invoked on an empty queue") - return nil - } - l := len(pt.pets) - 1 - pet := pt.pets[l] - pt.pets = pt.pets[:l] - return pet -} - -// empty returns true if the pet queue is empty. -func (pt *petQueue) empty() bool { - return len(pt.pets) == 0 -} - -// NewPetQueue returns a queue for tracking pets -func NewPetQueue(ps *apps.PetSet, podList []*api.Pod) *petQueue { - pt := petQueue{pets: []*pcb{}, idMapper: &NameIdentityMapper{ps}} - // Seed the queue with existing pets. Assume all pets are scheduled for - // deletion, enqueuing a pet will "undelete" it. We always want to delete - // from the higher ids, so sort by creation timestamp. - - sort.Sort(PodsByCreationTimestamp(podList)) - vMapper := VolumeIdentityMapper{ps} - for i := range podList { - pod := podList[i] - pt.pets = append(pt.pets, &pcb{pod: pod, pvcs: vMapper.GetClaimsForPet(pod), parent: ps, event: deletePet, id: fmt.Sprintf("%v", i)}) - } - return &pt -} - -// petsetIterator implements a simple iterator over pets in the given petset. -type petSetIterator struct { - // ps is the petset for this iterator. - ps *apps.PetSet - // queue contains the elements to iterate over. - queue *petQueue - // errs is a list because we always want the iterator to drain. - errs []error - // petCount is the number of pets iterated over. - petCount int -} - -// Next returns true for as long as there are elements in the underlying queue. -func (pi *petSetIterator) Next() bool { - var pet *pcb - var err error - if pi.petCount < pi.ps.Spec.Replicas { - pet, err = newPCB(fmt.Sprintf("%d", pi.petCount), pi.ps) - if err != nil { - pi.errs = append(pi.errs, err) - // Don't stop iterating over the set on errors. Caller handles nil. - pet = nil - } - pi.queue.enqueue(pet) - pi.petCount++ - } - // Keep the iterator running till we've deleted pets in the queue. - return !pi.queue.empty() -} - -// Value dequeues an element from the queue. -func (pi *petSetIterator) Value() *pcb { - return pi.queue.dequeue() -} - -// NewPetSetIterator returns a new iterator. All pods in the given podList -// are used to seed the queue of the iterator. -func NewPetSetIterator(ps *apps.PetSet, podList []*api.Pod) *petSetIterator { - pi := &petSetIterator{ - ps: ps, - queue: NewPetQueue(ps, podList), - errs: []error{}, - petCount: 0, - } - return pi -} - -// PodsByCreationTimestamp sorts a list of Pods by creation timestamp, using their names as a tie breaker. -type PodsByCreationTimestamp []*api.Pod - -func (o PodsByCreationTimestamp) Len() int { return len(o) } -func (o PodsByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o PodsByCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator_test.go deleted file mode 100644 index ab07c4223..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/iterator_test.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/util/sets" - "testing" -) - -func TestPetQueueCreates(t *testing.T) { - replicas := 3 - ps := newPetSet(replicas) - q := NewPetQueue(ps, []*api.Pod{}) - for i := 0; i < replicas; i++ { - pet, _ := newPCB(fmt.Sprintf("%v", i), ps) - q.enqueue(pet) - p := q.dequeue() - if p.event != syncPet { - t.Errorf("Failed to retrieve sync event from queue") - } - } - if q.dequeue() != nil { - t.Errorf("Expected no pets") - } -} - -func TestPetQueueScaleDown(t *testing.T) { - replicas := 1 - ps := newPetSet(replicas) - - // knownPods are the pods in the system - knownPods := newPodList(ps, 3) - - q := NewPetQueue(ps, knownPods) - - // The iterator will insert a single replica, the enqueue - // mimics that behavior. - pet, _ := newPCB(fmt.Sprintf("%v", 0), ps) - q.enqueue(pet) - - deletes := sets.NewString(fmt.Sprintf("%v-1", ps.Name), fmt.Sprintf("%v-2", ps.Name)) - syncs := sets.NewString(fmt.Sprintf("%v-0", ps.Name)) - - // Confirm that 2 known pods are deleted - for i := 0; i < 3; i++ { - p := q.dequeue() - switch p.event { - case syncPet: - if !syncs.Has(p.pod.Name) { - t.Errorf("Unexpected sync %v expecting %+v", p.pod.Name, syncs) - } - case deletePet: - if !deletes.Has(p.pod.Name) { - t.Errorf("Unexpected deletes %v expecting %+v", p.pod.Name, deletes) - } - } - } - if q.dequeue() != nil { - t.Errorf("Expected no pets") - } -} - -func TestPetQueueScaleUp(t *testing.T) { - replicas := 5 - ps := newPetSet(replicas) - - // knownPods are pods in the system - knownPods := newPodList(ps, 2) - - q := NewPetQueue(ps, knownPods) - for i := 0; i < 5; i++ { - pet, _ := newPCB(fmt.Sprintf("%v", i), ps) - q.enqueue(pet) - } - for i := 4; i >= 0; i-- { - pet := q.dequeue() - expectedName := fmt.Sprintf("%v-%d", ps.Name, i) - if pet.event != syncPet || pet.pod.Name != expectedName { - t.Errorf("Unexpected pet %+v, expected %v", pet.pod.Name, expectedName) - } - } -} - -func TestPetSetIteratorRelist(t *testing.T) { - replicas := 5 - ps := newPetSet(replicas) - - // knownPods are pods in the system - knownPods := newPodList(ps, 5) - for i := range knownPods { - knownPods[i].Spec.NodeName = fmt.Sprintf("foo-node-%v", i) - knownPods[i].Status.Phase = api.PodRunning - } - pi := NewPetSetIterator(ps, knownPods) - - // A simple resync should not change identity of pods in the system - i := 0 - for pi.Next() { - p := pi.Value() - if identityHash(ps, p.pod) != identityHash(ps, knownPods[i]) { - t.Errorf("Got unexpected identity hash from iterator.") - } - if p.event != syncPet { - t.Errorf("Got unexpected sync event for %v: %v", p.pod.Name, p.event) - } - i++ - } - if i != 5 { - t.Errorf("Unexpected iterations %v, this probably means too many/few pets", i) - } - - // Scale to 0 should delete all pods in system - ps.Spec.Replicas = 0 - pi = NewPetSetIterator(ps, knownPods) - i = 0 - for pi.Next() { - p := pi.Value() - if p.event != deletePet { - t.Errorf("Got unexpected sync event for %v: %v", p.pod.Name, p.event) - } - i++ - } - if i != 5 { - t.Errorf("Unexpected iterations %v, this probably means too many/few pets", i) - } - - // Relist with 0 replicas should no-op - pi = NewPetSetIterator(ps, []*api.Pod{}) - if pi.Next() != false { - t.Errorf("Unexpected iteration without any replicas or pods in system") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet.go deleted file mode 100644 index 685e3d6e0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet.go +++ /dev/null @@ -1,310 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "strconv" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/record" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/runtime" - - "github.com/golang/glog" -) - -// petLifeCycleEvent is used to communicate high level actions the controller -// needs to take on a given pet. It's recorded in the pcb. The recognized values -// are listed below. -type petLifeCycleEvent string - -const ( - syncPet petLifeCycleEvent = "sync" - deletePet petLifeCycleEvent = "delete" - // updateRetries is the number of Get/Update cycles we perform when an - // update fails. - updateRetries = 3 - // PetSetInitAnnotation is an annotation which when set, indicates that the - // pet has finished initializing itself. - // TODO: Replace this with init container status. - PetSetInitAnnotation = "pod.alpha.kubernetes.io/initialized" -) - -// pcb is the control block used to transmit all updates about a single pet. -// It serves as the manifest for a single pet. Users must populate the pod -// and parent fields to pass it around safely. -type pcb struct { - // pod is the desired pet pod. - pod *api.Pod - // pvcs is a list of desired persistent volume claims for the pet pod. - pvcs []api.PersistentVolumeClaim - // event is the lifecycle event associated with this update. - event petLifeCycleEvent - // id is the identity index of this pet. - id string - // parent is a pointer to the parent petset. - parent *apps.PetSet -} - -// pvcClient is a client for managing persistent volume claims. -type pvcClient interface { - // DeletePVCs deletes the pvcs in the given pcb. - DeletePVCs(*pcb) error - // SyncPVCs creates/updates pvcs in the given pcb. - SyncPVCs(*pcb) error -} - -// petSyncer syncs a single pet. -type petSyncer struct { - petClient - - // blockingPet is an unhealthy pet either from this iteration or a previous - // iteration, either because it is not yet Running, or being Deleted, that - // prevents other creates/deletions. - blockingPet *pcb -} - -// Sync syncs the given pet. -func (p *petSyncer) Sync(pet *pcb) error { - if pet == nil { - return nil - } - realPet, exists, err := p.Get(pet) - if err != nil { - return err - } - // There is not constraint except quota on the number of pvcs created. - // This is done per pet so we get a working cluster ASAP, even if user - // runs out of quota. - if err := p.SyncPVCs(pet); err != nil { - return err - } - if exists { - if !p.isHealthy(realPet.pod) { - glog.Infof("PetSet %v waiting on unhealthy pet %v", pet.parent.Name, realPet.pod.Name) - } - return p.Update(realPet, pet) - } - if p.blockingPet != nil { - glog.Infof("Create of %v in PetSet %v blocked by unhealthy pet %v", pet.pod.Name, pet.parent.Name, p.blockingPet.pod.Name) - return nil - } - // This is counted as a create, even if it fails. We can't skip indices - // because some pets might allocate a special role to earlier indices. - // The returned error will force a requeue. - // TODO: What's the desired behavior if pet-0 is deleted while pet-1 is - // not yet healthy? currently pet-0 will wait till pet-1 is healthy, - // this feels safer, but might lead to deadlock. - p.blockingPet = pet - if err := p.Create(pet); err != nil { - return err - } - return nil -} - -// Delete deletes the given pet, if no other pet in the petset is blocking a -// scale event. -func (p *petSyncer) Delete(pet *pcb) error { - if pet == nil { - return nil - } - realPet, exists, err := p.Get(pet) - if err != nil { - return err - } - if !exists { - return nil - } - if p.blockingPet != nil { - glog.Infof("Delete of %v in PetSet %v blocked by unhealthy pet %v", realPet.pod.Name, pet.parent.Name, p.blockingPet.pod.Name) - return nil - } - // This is counted as a delete, even if it fails. - // The returned error will force a requeue. - p.blockingPet = realPet - if !p.isDying(realPet.pod) { - glog.Infof("PetSet %v deleting pet %v", pet.parent.Name, pet.pod.Name) - return p.petClient.Delete(pet) - } - glog.Infof("PetSet %v waiting on pet %v to die in %v", pet.parent.Name, realPet.pod.Name, realPet.pod.DeletionTimestamp) - return nil -} - -// petClient is a client for managing pets. -type petClient interface { - pvcClient - petHealthChecker - Delete(*pcb) error - Get(*pcb) (*pcb, bool, error) - Create(*pcb) error - Update(*pcb, *pcb) error -} - -// apiServerPetClient is a petset aware Kubernetes client. -type apiServerPetClient struct { - c *client.Client - recorder record.EventRecorder - petHealthChecker -} - -// Get gets the pet in the pcb from the apiserver. -func (p *apiServerPetClient) Get(pet *pcb) (*pcb, bool, error) { - found := true - ns := pet.parent.Namespace - pod, err := podClient(p.c, ns).Get(pet.pod.Name) - if errors.IsNotFound(err) { - found = false - err = nil - } - if err != nil || !found { - return nil, found, err - } - realPet := *pet - realPet.pod = pod - return &realPet, true, nil -} - -// Delete deletes the pet in the pcb from the apiserver. -func (p *apiServerPetClient) Delete(pet *pcb) error { - err := podClient(p.c, pet.parent.Namespace).Delete(pet.pod.Name, nil) - if errors.IsNotFound(err) { - err = nil - } - p.event(pet.parent, "Delete", fmt.Sprintf("pet: %v", pet.pod.Name), err) - return err -} - -// Create creates the pet in the pcb. -func (p *apiServerPetClient) Create(pet *pcb) error { - _, err := podClient(p.c, pet.parent.Namespace).Create(pet.pod) - p.event(pet.parent, "Create", fmt.Sprintf("pet: %v", pet.pod.Name), err) - return err -} - -// Update updates the pet in the 'pet' pcb to match the pet in the 'expectedPet' pcb. -func (p *apiServerPetClient) Update(pet *pcb, expectedPet *pcb) (updateErr error) { - var getErr error - pc := podClient(p.c, pet.parent.Namespace) - - pod, needsUpdate, err := copyPetID(pet, expectedPet) - if err != nil || !needsUpdate { - return err - } - glog.Infof("Resetting pet %v to match PetSet %v spec", pod.Name, pet.parent.Name) - for i, p := 0, &pod; ; i++ { - _, updateErr = pc.Update(p) - if updateErr == nil || i >= updateRetries { - return updateErr - } - if p, getErr = pc.Get(pod.Name); getErr != nil { - return getErr - } - } -} - -// DeletePVCs should delete PVCs, when implemented. -func (p *apiServerPetClient) DeletePVCs(pet *pcb) error { - // TODO: Implement this when we delete pvcs. - return nil -} - -func (p *apiServerPetClient) getPVC(pvcName, pvcNamespace string) (*api.PersistentVolumeClaim, bool, error) { - found := true - pvc, err := claimClient(p.c, pvcNamespace).Get(pvcName) - if errors.IsNotFound(err) { - found = false - } - if err != nil || !found { - return nil, found, err - } - return pvc, true, nil -} - -func (p *apiServerPetClient) createPVC(pvc *api.PersistentVolumeClaim) error { - _, err := claimClient(p.c, pvc.Namespace).Create(pvc) - return err -} - -// SyncPVCs syncs pvcs in the given pcb. -func (p *apiServerPetClient) SyncPVCs(pet *pcb) error { - errMsg := "" - // Create new claims. - for i, pvc := range pet.pvcs { - _, exists, err := p.getPVC(pvc.Name, pet.parent.Namespace) - if !exists { - if err := p.createPVC(&pet.pvcs[i]); err != nil { - errMsg += fmt.Sprintf("Failed to create %v: %v", pvc.Name, err) - } - p.event(pet.parent, "Create", fmt.Sprintf("pvc: %v", pvc.Name), err) - } else if err != nil { - errMsg += fmt.Sprintf("Error trying to get pvc %v, %v.", pvc.Name, err) - } - // TODO: Check resource requirements and accessmodes, update if necessary - } - if len(errMsg) != 0 { - return fmt.Errorf("%v", errMsg) - } - return nil -} - -// event formats an event for the given runtime object. -func (p *apiServerPetClient) event(obj runtime.Object, reason, msg string, err error) { - if err != nil { - p.recorder.Eventf(obj, api.EventTypeWarning, fmt.Sprintf("Failed%v", reason), fmt.Sprintf("%v, error: %v", msg, err)) - } else { - p.recorder.Eventf(obj, api.EventTypeNormal, fmt.Sprintf("Successful%v", reason), msg) - } -} - -// petHealthChecker is an interface to check pet health. It makes a boolean -// decision based on the given pod. -type petHealthChecker interface { - isHealthy(*api.Pod) bool - isDying(*api.Pod) bool -} - -// defaultPetHealthChecks does basic health checking. -// It doesn't update, probe or get the pod. -type defaultPetHealthChecker struct{} - -// isHealthy returns true if the pod is running and has the -// "pod.alpha.kubernetes.io/initialized" set to "true". -func (d *defaultPetHealthChecker) isHealthy(pod *api.Pod) bool { - if pod == nil || pod.Status.Phase != api.PodRunning { - return false - } - initialized, ok := pod.Annotations[PetSetInitAnnotation] - if !ok { - glog.Infof("PetSet pod %v in %v, waiting on annotation %v", api.PodRunning, pod.Name, PetSetInitAnnotation) - return false - } - b, err := strconv.ParseBool(initialized) - if err != nil { - return false - } - return b -} - -// isDying returns true if the pod has a non-nil deletion timestamp. Since the -// timestamp can only decrease, once this method returns true for a given pet, it -// will never return false. -func (d *defaultPetHealthChecker) isDying(pod *api.Pod) bool { - return pod != nil && pod.DeletionTimestamp != nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set.go deleted file mode 100644 index a34eb6d5c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set.go +++ /dev/null @@ -1,356 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "reflect" - "sort" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/client/record" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/runtime" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -const ( - // Time to sleep before polling to see if the pod cache has synced. - PodStoreSyncedPollPeriod = 100 * time.Millisecond - // number of retries for a status update. - statusUpdateRetries = 2 - // period to relist petsets and verify pets - petSetResyncPeriod = 30 * time.Second -) - -// PetSetController controls petsets. -type PetSetController struct { - kubeClient *client.Client - - // newSyncer returns an interface capable of syncing a single pet. - // Abstracted out for testing. - newSyncer func(*pcb) *petSyncer - - // podStore is a cache of watched pods. - podStore cache.StoreToPodLister - - // podStoreSynced returns true if the pod store has synced at least once. - podStoreSynced func() bool - // Watches changes to all pods. - podController framework.ControllerInterface - - // A store of PetSets, populated by the psController. - psStore cache.StoreToPetSetLister - // Watches changes to all PetSets. - psController *framework.Controller - - // A store of the 1 unhealthy pet blocking progress for a given ps - blockingPetStore *unhealthyPetTracker - - // Controllers that need to be synced. - queue *workqueue.Type - - // syncHandler handles sync events for petsets. - // Abstracted as a func to allow injection for testing. - syncHandler func(psKey string) []error -} - -// NewPetSetController creates a new petset controller. -func NewPetSetController(podInformer framework.SharedIndexInformer, kubeClient *client.Client, resyncPeriod time.Duration) *PetSetController { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - eventBroadcaster.StartRecordingToSink(kubeClient.Events("")) - recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "petset"}) - pc := &apiServerPetClient{kubeClient, recorder, &defaultPetHealthChecker{}} - - psc := &PetSetController{ - kubeClient: kubeClient, - blockingPetStore: newUnHealthyPetTracker(pc), - newSyncer: func(blockingPet *pcb) *petSyncer { - return &petSyncer{pc, blockingPet} - }, - queue: workqueue.New(), - } - - podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - // lookup the petset and enqueue - AddFunc: psc.addPod, - // lookup current and old petset if labels changed - UpdateFunc: psc.updatePod, - // lookup petset accounting for deletion tombstones - DeleteFunc: psc.deletePod, - }) - psc.podStore.Indexer = podInformer.GetIndexer() - psc.podController = podInformer.GetController() - - psc.psStore.Store, psc.psController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return psc.kubeClient.Apps().PetSets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return psc.kubeClient.Apps().PetSets(api.NamespaceAll).Watch(options) - }, - }, - &apps.PetSet{}, - petSetResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: psc.enqueuePetSet, - UpdateFunc: func(old, cur interface{}) { - oldPS := old.(*apps.PetSet) - curPS := cur.(*apps.PetSet) - if oldPS.Status.Replicas != curPS.Status.Replicas { - glog.V(4).Infof("Observed updated replica count for PetSet: %v, %d->%d", curPS.Name, oldPS.Status.Replicas, curPS.Status.Replicas) - } - psc.enqueuePetSet(cur) - }, - DeleteFunc: psc.enqueuePetSet, - }, - ) - // TODO: Watch volumes - psc.podStoreSynced = psc.podController.HasSynced - psc.syncHandler = psc.Sync - return psc -} - -// Run runs the petset controller. -func (psc *PetSetController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - glog.Infof("Starting petset controller") - go psc.podController.Run(stopCh) - go psc.psController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(psc.worker, time.Second, stopCh) - } - <-stopCh - glog.Infof("Shutting down petset controller") - psc.queue.ShutDown() -} - -// addPod adds the petset for the pod to the sync queue -func (psc *PetSetController) addPod(obj interface{}) { - pod := obj.(*api.Pod) - glog.V(4).Infof("Pod %s created, labels: %+v", pod.Name, pod.Labels) - ps := psc.getPetSetForPod(pod) - if ps == nil { - return - } - psc.enqueuePetSet(ps) -} - -// updatePod adds the petset for the current and old pods to the sync queue. -// If the labels of the pod didn't change, this method enqueues a single petset. -func (psc *PetSetController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - return - } - curPod := cur.(*api.Pod) - oldPod := old.(*api.Pod) - ps := psc.getPetSetForPod(curPod) - if ps == nil { - return - } - psc.enqueuePetSet(ps) - if !reflect.DeepEqual(curPod.Labels, oldPod.Labels) { - if oldPS := psc.getPetSetForPod(oldPod); oldPS != nil { - psc.enqueuePetSet(oldPS) - } - } -} - -// deletePod enqueues the petset for the pod accounting for deletion tombstones. -func (psc *PetSetController) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new PetSet will not be woken up till the periodic resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("tombstone contained object that is not a pod %+v", obj) - return - } - } - glog.V(4).Infof("Pod %s/%s deleted through %v.", pod.Namespace, pod.Name, utilruntime.GetCaller()) - if ps := psc.getPetSetForPod(pod); ps != nil { - psc.enqueuePetSet(ps) - } -} - -// getPodsForPetSets returns the pods that match the selectors of the given petset. -func (psc *PetSetController) getPodsForPetSet(ps *apps.PetSet) ([]*api.Pod, error) { - // TODO: Do we want the petset to fight with RCs? check parent petset annoation, or name prefix? - sel, err := unversioned.LabelSelectorAsSelector(ps.Spec.Selector) - if err != nil { - return []*api.Pod{}, err - } - petList, err := psc.podStore.Pods(ps.Namespace).List(sel) - if err != nil { - return []*api.Pod{}, err - } - pods := []*api.Pod{} - for _, p := range petList.Items { - pods = append(pods, &p) - } - return pods, nil -} - -// getPetSetForPod returns the pet set managing the given pod. -func (psc *PetSetController) getPetSetForPod(pod *api.Pod) *apps.PetSet { - ps, err := psc.psStore.GetPodPetSets(pod) - if err != nil { - glog.V(4).Infof("No PetSets found for pod %v, PetSet controller will avoid syncing", pod.Name) - return nil - } - // Resolve a overlapping petset tie by creation timestamp. - // Let's hope users don't create overlapping petsets. - if len(ps) > 1 { - glog.Errorf("user error! more than one PetSet is selecting pods with labels: %+v", pod.Labels) - sort.Sort(overlappingPetSets(ps)) - } - return &ps[0] -} - -// enqueuePetSet enqueues the given petset in the work queue. -func (psc *PetSetController) enqueuePetSet(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Cound't get key for object %+v: %v", obj, err) - return - } - psc.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (psc *PetSetController) worker() { - for { - func() { - key, quit := psc.queue.Get() - if quit { - return - } - defer psc.queue.Done(key) - if errs := psc.syncHandler(key.(string)); len(errs) != 0 { - glog.Errorf("Error syncing PetSet %v, requeuing: %v", key.(string), errs) - psc.queue.Add(key) - } - }() - } -} - -// Sync syncs the given petset. -func (psc *PetSetController) Sync(key string) []error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing pet set %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !psc.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(PodStoreSyncedPollPeriod) - return []error{fmt.Errorf("waiting for pods controller to sync")} - } - - obj, exists, err := psc.psStore.Store.GetByKey(key) - if !exists { - if err = psc.blockingPetStore.store.Delete(key); err != nil { - return []error{err} - } - glog.Infof("PetSet has been deleted %v", key) - return []error{} - } - if err != nil { - glog.Errorf("Unable to retrieve PetSet %v from store: %v", key, err) - return []error{err} - } - - ps := *obj.(*apps.PetSet) - petList, err := psc.getPodsForPetSet(&ps) - if err != nil { - return []error{err} - } - - numPets, errs := psc.syncPetSet(&ps, petList) - if err := updatePetCount(psc.kubeClient, ps, numPets); err != nil { - glog.Infof("Failed to update replica count for petset %v/%v; requeuing; error: %v", ps.Namespace, ps.Name, err) - errs = append(errs, err) - } - - return errs -} - -// syncPetSet syncs a tuple of (petset, pets). -func (psc *PetSetController) syncPetSet(ps *apps.PetSet, pets []*api.Pod) (int, []error) { - glog.Infof("Syncing PetSet %v/%v with %d pets", ps.Namespace, ps.Name, len(pets)) - - it := NewPetSetIterator(ps, pets) - blockingPet, err := psc.blockingPetStore.Get(ps, pets) - if err != nil { - return 0, []error{err} - } - if blockingPet != nil { - glog.Infof("PetSet %v blocked from scaling on pet %v", ps.Name, blockingPet.pod.Name) - } - petManager := psc.newSyncer(blockingPet) - numPets := 0 - - for it.Next() { - pet := it.Value() - if pet == nil { - continue - } - switch pet.event { - case syncPet: - err = petManager.Sync(pet) - if err == nil { - numPets++ - } - case deletePet: - err = petManager.Delete(pet) - } - if err != nil { - it.errs = append(it.errs, err) - } - } - - if err := psc.blockingPetStore.Add(petManager.blockingPet); err != nil { - it.errs = append(it.errs, err) - } - // TODO: GC pvcs. We can't delete them per pet because of grace period, and - // in fact we *don't want to* till petset is stable to guarantee that bugs - // in the controller don't corrupt user data. - return numPets, it.errs -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_test.go deleted file mode 100644 index 8498fce87..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_test.go +++ /dev/null @@ -1,264 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "math/rand" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/controller" -) - -func newFakePetSetController() (*PetSetController, *fakePetClient) { - fpc := newFakePetClient() - return &PetSetController{ - kubeClient: nil, - blockingPetStore: newUnHealthyPetTracker(fpc), - podStoreSynced: func() bool { return true }, - psStore: cache.StoreToPetSetLister{Store: cache.NewStore(controller.KeyFunc)}, - podStore: cache.StoreToPodLister{Indexer: cache.NewIndexer(controller.KeyFunc, cache.Indexers{})}, - newSyncer: func(blockingPet *pcb) *petSyncer { - return &petSyncer{fpc, blockingPet} - }, - }, fpc -} - -func checkPets(ps *apps.PetSet, creates, deletes int, fc *fakePetClient, t *testing.T) { - if fc.petsCreated != creates || fc.petsDeleted != deletes { - t.Errorf("Found (creates: %d, deletes: %d), expected (creates: %d, deletes: %d)", fc.petsCreated, fc.petsDeleted, creates, deletes) - } - gotClaims := map[string]api.PersistentVolumeClaim{} - for _, pvc := range fc.claims { - gotClaims[pvc.Name] = pvc - } - for i := range fc.pets { - expectedPet, _ := newPCB(fmt.Sprintf("%v", i), ps) - if identityHash(ps, fc.pets[i].pod) != identityHash(ps, expectedPet.pod) { - t.Errorf("Unexpected pet at index %d", i) - } - for _, pvc := range expectedPet.pvcs { - gotPVC, ok := gotClaims[pvc.Name] - if !ok { - t.Errorf("PVC %v not created for pet %v", pvc.Name, expectedPet.pod.Name) - } - if !reflect.DeepEqual(gotPVC.Spec, pvc.Spec) { - t.Errorf("got PVC %v differs from created pvc", pvc.Name) - } - } - } -} - -func scalePetSet(t *testing.T, ps *apps.PetSet, psc *PetSetController, fc *fakePetClient, scale int) []error { - errs := []error{} - for i := 0; i < scale; i++ { - pl := fc.getPodList() - if len(pl) != i { - t.Errorf("Unexpected number of pets, expected %d found %d", i, len(fc.pets)) - } - _, syncErrs := psc.syncPetSet(ps, pl) - errs = append(errs, syncErrs...) - fc.setHealthy(i) - checkPets(ps, i+1, 0, fc, t) - } - return errs -} - -func saturatePetSet(t *testing.T, ps *apps.PetSet, psc *PetSetController, fc *fakePetClient) { - errs := scalePetSet(t, ps, psc, fc, ps.Spec.Replicas) - if len(errs) != 0 { - t.Errorf("%v", errs) - } -} - -func TestPetSetControllerCreates(t *testing.T) { - psc, fc := newFakePetSetController() - replicas := 3 - ps := newPetSet(replicas) - - saturatePetSet(t, ps, psc, fc) - - podList := fc.getPodList() - // Deleted pet gets recreated - fc.pets = fc.pets[:replicas-1] - if _, errs := psc.syncPetSet(ps, podList); len(errs) != 0 { - t.Errorf("%v", errs) - } - checkPets(ps, replicas+1, 0, fc, t) -} - -func TestPetSetControllerDeletes(t *testing.T) { - psc, fc := newFakePetSetController() - replicas := 4 - ps := newPetSet(replicas) - - saturatePetSet(t, ps, psc, fc) - - // Drain - errs := []error{} - ps.Spec.Replicas = 0 - knownPods := fc.getPodList() - for i := replicas - 1; i >= 0; i-- { - if len(fc.pets) != i+1 { - t.Errorf("Unexpected number of pets, expected %d found %d", i, len(fc.pets)) - } - _, syncErrs := psc.syncPetSet(ps, knownPods) - errs = append(errs, syncErrs...) - } - if len(errs) != 0 { - t.Errorf("%v", errs) - } - checkPets(ps, replicas, replicas, fc, t) -} - -func TestPetSetControllerRespectsTermination(t *testing.T) { - psc, fc := newFakePetSetController() - replicas := 4 - ps := newPetSet(replicas) - - saturatePetSet(t, ps, psc, fc) - - fc.setDeletionTimestamp(replicas - 1) - ps.Spec.Replicas = 2 - _, errs := psc.syncPetSet(ps, fc.getPodList()) - if len(errs) != 0 { - t.Errorf("%v", errs) - } - // Finding a pod with the deletion timestamp will pause all deletions. - knownPods := fc.getPodList() - if len(knownPods) != 4 { - t.Errorf("Pods deleted prematurely before deletion timestamp expired, len %d", len(knownPods)) - } - fc.pets = fc.pets[:replicas-1] - _, errs = psc.syncPetSet(ps, fc.getPodList()) - if len(errs) != 0 { - t.Errorf("%v", errs) - } - checkPets(ps, replicas, 1, fc, t) -} - -func TestPetSetControllerRespectsOrder(t *testing.T) { - psc, fc := newFakePetSetController() - replicas := 4 - ps := newPetSet(replicas) - - saturatePetSet(t, ps, psc, fc) - - errs := []error{} - ps.Spec.Replicas = 0 - // Shuffle known list and check that pets are deleted in reverse - knownPods := fc.getPodList() - for i := range knownPods { - j := rand.Intn(i + 1) - knownPods[i], knownPods[j] = knownPods[j], knownPods[i] - } - - for i := 0; i < replicas; i++ { - if len(fc.pets) != replicas-i { - t.Errorf("Unexpected number of pets, expected %d found %d", i, len(fc.pets)) - } - _, syncErrs := psc.syncPetSet(ps, knownPods) - errs = append(errs, syncErrs...) - checkPets(ps, replicas, i+1, fc, t) - } - if len(errs) != 0 { - t.Errorf("%v", errs) - } -} - -func TestPetSetControllerBlocksScaling(t *testing.T) { - psc, fc := newFakePetSetController() - replicas := 5 - ps := newPetSet(replicas) - scalePetSet(t, ps, psc, fc, 3) - - // Create 4th pet, then before flipping it to healthy, kill the first pet. - // There should only be 1 not-healty pet at a time. - pl := fc.getPodList() - if _, errs := psc.syncPetSet(ps, pl); len(errs) != 0 { - t.Errorf("%v", errs) - } - - deletedPod := pl[0] - fc.deletePetAtIndex(0) - pl = fc.getPodList() - if _, errs := psc.syncPetSet(ps, pl); len(errs) != 0 { - t.Errorf("%v", errs) - } - newPodList := fc.getPodList() - for _, p := range newPodList { - if p.Name == deletedPod.Name { - t.Errorf("Deleted pod was created while existing pod was unhealthy") - } - } - - fc.setHealthy(len(newPodList) - 1) - if _, errs := psc.syncPetSet(ps, pl); len(errs) != 0 { - t.Errorf("%v", errs) - } - - found := false - for _, p := range fc.getPodList() { - if p.Name == deletedPod.Name { - found = true - } - } - if !found { - t.Errorf("Deleted pod was not created after existing pods became healthy") - } -} - -func TestPetSetBlockingPetIsCleared(t *testing.T) { - psc, fc := newFakePetSetController() - ps := newPetSet(3) - scalePetSet(t, ps, psc, fc, 1) - - if blocking, err := psc.blockingPetStore.Get(ps, fc.getPodList()); err != nil || blocking != nil { - t.Errorf("Unexpected blocking pet %v, err %v", blocking, err) - } - - // 1 not yet healthy pet - psc.syncPetSet(ps, fc.getPodList()) - - if blocking, err := psc.blockingPetStore.Get(ps, fc.getPodList()); err != nil || blocking == nil { - t.Errorf("Expected blocking pet %v, err %v", blocking, err) - } - - // Deleting the petset should clear the blocking pet - if err := psc.psStore.Store.Delete(ps); err != nil { - t.Fatalf("Unable to delete pet %v from petset controller store.", ps.Name) - } - if errs := psc.Sync(fmt.Sprintf("%v/%v", ps.Namespace, ps.Name)); len(errs) != 0 { - t.Errorf("Error during sync of deleted petset %v", errs) - } - fc.pets = []*pcb{} - fc.petsCreated = 0 - if blocking, err := psc.blockingPetStore.Get(ps, fc.getPodList()); err != nil || blocking != nil { - t.Errorf("Unexpected blocking pet %v, err %v", blocking, err) - } - saturatePetSet(t, ps, psc, fc) - - // Make sure we don't leak the final blockin pet in the store - psc.syncPetSet(ps, fc.getPodList()) - if p, exists, err := psc.blockingPetStore.store.GetByKey(fmt.Sprintf("%v/%v", ps.Namespace, ps.Name)); err != nil || exists { - t.Errorf("Unexpected blocking pet, err %v: %+v", err, p) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_utils.go deleted file mode 100644 index d6d373050..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/petset/pet_set_utils.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 petset - -import ( - "fmt" - "sync" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/apps" - "k8s.io/kubernetes/pkg/client/cache" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/controller" - - "github.com/golang/glog" -) - -// overlappingPetSets sorts a list of PetSets by creation timestamp, using their names as a tie breaker. -// Generally used to tie break between PetSets that have overlapping selectors. -type overlappingPetSets []apps.PetSet - -func (o overlappingPetSets) Len() int { return len(o) } -func (o overlappingPetSets) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o overlappingPetSets) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} - -// updatePetCount attempts to update the Status.Replicas of the given PetSet, with a single GET/PUT retry. -func updatePetCount(kubeClient *client.Client, ps apps.PetSet, numPets int) (updateErr error) { - if ps.Status.Replicas == numPets || kubeClient == nil { - return nil - } - psClient := kubeClient.Apps().PetSets(ps.Namespace) - var getErr error - for i, ps := 0, &ps; ; i++ { - glog.V(4).Infof(fmt.Sprintf("Updating replica count for PetSet: %s/%s, ", ps.Namespace, ps.Name) + - fmt.Sprintf("replicas %d->%d (need %d), ", ps.Status.Replicas, numPets, ps.Spec.Replicas)) - - ps.Status = apps.PetSetStatus{Replicas: numPets} - _, updateErr = psClient.UpdateStatus(ps) - if updateErr == nil || i >= statusUpdateRetries { - return updateErr - } - if ps, getErr = psClient.Get(ps.Name); getErr != nil { - return getErr - } - } -} - -// claimClient returns the pvcClient for the given kubeClient/ns. -func claimClient(kubeClient *client.Client, ns string) client.PersistentVolumeClaimInterface { - return kubeClient.PersistentVolumeClaims(ns) -} - -// podClient returns the given podClient for the given kubeClient/ns. -func podClient(kubeClient *client.Client, ns string) client.PodInterface { - return kubeClient.Pods(ns) -} - -// unhealthyPetTracker tracks unhealthy pets for petsets. -type unhealthyPetTracker struct { - pc petClient - store cache.Store - storeLock sync.Mutex -} - -// Get returns a previously recorded blocking pet for the given petset. -func (u *unhealthyPetTracker) Get(ps *apps.PetSet, knownPets []*api.Pod) (*pcb, error) { - u.storeLock.Lock() - defer u.storeLock.Unlock() - - // We "Get" by key but "Add" by object because the store interface doesn't - // allow us to Get/Add a related obj (eg petset: blocking pet). - key, err := controller.KeyFunc(ps) - if err != nil { - return nil, err - } - obj, exists, err := u.store.GetByKey(key) - if err != nil { - return nil, err - } - - hc := defaultPetHealthChecker{} - // There's no unhealthy pet blocking a scale event, but this might be - // a controller manager restart. If it is, knownPets can be trusted. - if !exists { - for _, p := range knownPets { - if hc.isHealthy(p) && !hc.isDying(p) { - glog.V(4).Infof("Ignoring healthy pet %v for PetSet %v", p.Name, ps.Name) - continue - } - glog.Infof("No recorded blocking pet, but found unhealty pet %v for PetSet %v", p.Name, ps.Name) - return &pcb{pod: p, parent: ps}, nil - } - return nil, nil - } - - // This is a pet that's blocking further creates/deletes of a petset. If it - // disappears, it's no longer blocking. If it exists, it continues to block - // till it turns healthy or disappears. - bp := obj.(*pcb) - blockingPet, exists, err := u.pc.Get(bp) - if err != nil { - return nil, err - } - if !exists { - glog.V(4).Infof("Clearing blocking pet %v for PetSet %v because it's been deleted", bp.pod.Name, ps.Name) - return nil, nil - } - blockingPetPod := blockingPet.pod - if hc.isHealthy(blockingPetPod) && !hc.isDying(blockingPetPod) { - glog.V(4).Infof("Clearing blocking pet %v for PetSet %v because it's healthy", bp.pod.Name, ps.Name) - u.store.Delete(blockingPet) - blockingPet = nil - } - return blockingPet, nil -} - -// Add records the given pet as a blocking pet. -func (u *unhealthyPetTracker) Add(blockingPet *pcb) error { - u.storeLock.Lock() - defer u.storeLock.Unlock() - - if blockingPet == nil { - return nil - } - glog.V(4).Infof("Adding blocking pet %v for PetSet %v", blockingPet.pod.Name, blockingPet.parent.Name) - return u.store.Add(blockingPet) -} - -// newUnHealthyPetTracker tracks unhealthy pets that block progress of petsets. -func newUnHealthyPetTracker(pc petClient) *unhealthyPetTracker { - return &unhealthyPetTracker{pc: pc, store: cache.NewStore(pcbKeyFunc)} -} - -// pcbKeyFunc computes the key for a given pcb. -// If it's given a key, it simply returns it. -func pcbKeyFunc(obj interface{}) (string, error) { - if key, ok := obj.(string); ok { - return key, nil - } - p, ok := obj.(*pcb) - if !ok { - return "", fmt.Errorf("not a valid pet control block %+v", p) - } - if p.parent == nil { - return "", fmt.Errorf("cannot compute pet control block key without parent pointer %+v", p) - } - return controller.KeyFunc(p.parent) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal_test.go deleted file mode 100644 index 97b61abf1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal_test.go +++ /dev/null @@ -1,749 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 podautoscaler - -import ( - "encoding/json" - "fmt" - "io" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - _ "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/watch" - - heapster "k8s.io/heapster/metrics/api/v1/types" - - "github.com/stretchr/testify/assert" -) - -func (w fakeResponseWrapper) DoRaw() ([]byte, error) { - return w.raw, nil -} - -func (w fakeResponseWrapper) Stream() (io.ReadCloser, error) { - return nil, nil -} - -func newFakeResponseWrapper(raw []byte) fakeResponseWrapper { - return fakeResponseWrapper{raw: raw} -} - -type fakeResponseWrapper struct { - raw []byte -} - -type fakeResource struct { - name string - apiVersion string - kind string -} - -type testCase struct { - sync.Mutex - minReplicas int32 - maxReplicas int32 - initialReplicas int32 - desiredReplicas int32 - - // CPU target utilization as a percentage of the requested resources. - CPUTarget int32 - CPUCurrent int32 - verifyCPUCurrent bool - reportedLevels []uint64 - reportedCPURequests []resource.Quantity - cmTarget *extensions.CustomMetricTargetList - scaleUpdated bool - statusUpdated bool - eventCreated bool - verifyEvents bool - // Channel with names of HPA objects which we have reconciled. - processed chan string - - // Target resource information. - resource *fakeResource -} - -// Needs to be called under a lock. -func (tc *testCase) computeCPUCurrent() { - if len(tc.reportedLevels) != len(tc.reportedCPURequests) || len(tc.reportedLevels) == 0 { - return - } - reported := 0 - for _, r := range tc.reportedLevels { - reported += int(r) - } - requested := 0 - for _, req := range tc.reportedCPURequests { - requested += int(req.MilliValue()) - } - tc.CPUCurrent = int32(100 * reported / requested) -} - -func (tc *testCase) prepareTestClient(t *testing.T) *fake.Clientset { - namespace := "test-namespace" - hpaName := "test-hpa" - podNamePrefix := "test-pod" - selector := &unversioned.LabelSelector{ - MatchLabels: map[string]string{"name": podNamePrefix}, - } - - tc.Lock() - - tc.scaleUpdated = false - tc.statusUpdated = false - tc.eventCreated = false - tc.processed = make(chan string, 100) - tc.computeCPUCurrent() - - // TODO(madhusudancs): HPA only supports resources in extensions/v1beta1 right now. Add - // tests for "v1" replicationcontrollers when HPA adds support for cross-group scale. - if tc.resource == nil { - tc.resource = &fakeResource{ - name: "test-rc", - apiVersion: "extensions/v1beta1", - kind: "replicationcontrollers", - } - } - tc.Unlock() - - fakeClient := &fake.Clientset{} - fakeClient.AddReactor("list", "horizontalpodautoscalers", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := &extensions.HorizontalPodAutoscalerList{ - Items: []extensions.HorizontalPodAutoscaler{ - { - ObjectMeta: api.ObjectMeta{ - Name: hpaName, - Namespace: namespace, - SelfLink: "experimental/v1/namespaces/" + namespace + "/horizontalpodautoscalers/" + hpaName, - }, - Spec: extensions.HorizontalPodAutoscalerSpec{ - ScaleRef: extensions.SubresourceReference{ - Kind: tc.resource.kind, - Name: tc.resource.name, - APIVersion: tc.resource.apiVersion, - Subresource: "scale", - }, - MinReplicas: &tc.minReplicas, - MaxReplicas: tc.maxReplicas, - }, - Status: extensions.HorizontalPodAutoscalerStatus{ - CurrentReplicas: tc.initialReplicas, - DesiredReplicas: tc.initialReplicas, - }, - }, - }, - } - - if tc.CPUTarget > 0.0 { - obj.Items[0].Spec.CPUUtilization = &extensions.CPUTargetUtilization{TargetPercentage: tc.CPUTarget} - } - if tc.cmTarget != nil { - b, err := json.Marshal(tc.cmTarget) - if err != nil { - t.Fatalf("Failed to marshal cm: %v", err) - } - obj.Items[0].Annotations = make(map[string]string) - obj.Items[0].Annotations[HpaCustomMetricsTargetAnnotationName] = string(b) - } - return true, obj, nil - }) - - fakeClient.AddReactor("get", "replicationcontrollers", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := &extensions.Scale{ - ObjectMeta: api.ObjectMeta{ - Name: tc.resource.name, - Namespace: namespace, - }, - Spec: extensions.ScaleSpec{ - Replicas: tc.initialReplicas, - }, - Status: extensions.ScaleStatus{ - Replicas: tc.initialReplicas, - Selector: selector, - }, - } - return true, obj, nil - }) - - fakeClient.AddReactor("get", "deployments", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := &extensions.Scale{ - ObjectMeta: api.ObjectMeta{ - Name: tc.resource.name, - Namespace: namespace, - }, - Spec: extensions.ScaleSpec{ - Replicas: tc.initialReplicas, - }, - Status: extensions.ScaleStatus{ - Replicas: tc.initialReplicas, - Selector: selector, - }, - } - return true, obj, nil - }) - - fakeClient.AddReactor("get", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := &extensions.Scale{ - ObjectMeta: api.ObjectMeta{ - Name: tc.resource.name, - Namespace: namespace, - }, - Spec: extensions.ScaleSpec{ - Replicas: tc.initialReplicas, - }, - Status: extensions.ScaleStatus{ - Replicas: tc.initialReplicas, - Selector: selector, - }, - } - return true, obj, nil - }) - - fakeClient.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := &api.PodList{} - for i := 0; i < len(tc.reportedCPURequests); i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := api.Pod{ - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - ObjectMeta: api.ObjectMeta{ - Name: podName, - Namespace: namespace, - Labels: map[string]string{ - "name": podNamePrefix, - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: tc.reportedCPURequests[i], - }, - }, - }, - }, - }, - } - obj.Items = append(obj.Items, pod) - } - return true, obj, nil - }) - - fakeClient.AddProxyReactor("services", func(action core.Action) (handled bool, ret restclient.ResponseWrapper, err error) { - tc.Lock() - defer tc.Unlock() - - timestamp := time.Now() - metrics := heapster.MetricResultList{} - for _, level := range tc.reportedLevels { - metric := heapster.MetricResult{ - Metrics: []heapster.MetricPoint{{timestamp, level, nil}}, - LatestTimestamp: timestamp, - } - metrics.Items = append(metrics.Items, metric) - } - heapsterRawMemResponse, _ := json.Marshal(&metrics) - return true, newFakeResponseWrapper(heapsterRawMemResponse), nil - }) - - fakeClient.AddReactor("update", "replicationcontrollers", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := action.(core.UpdateAction).GetObject().(*extensions.Scale) - replicas := action.(core.UpdateAction).GetObject().(*extensions.Scale).Spec.Replicas - assert.Equal(t, tc.desiredReplicas, replicas) - tc.scaleUpdated = true - return true, obj, nil - }) - - fakeClient.AddReactor("update", "deployments", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := action.(core.UpdateAction).GetObject().(*extensions.Scale) - replicas := action.(core.UpdateAction).GetObject().(*extensions.Scale).Spec.Replicas - assert.Equal(t, tc.desiredReplicas, replicas) - tc.scaleUpdated = true - return true, obj, nil - }) - - fakeClient.AddReactor("update", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := action.(core.UpdateAction).GetObject().(*extensions.Scale) - replicas := action.(core.UpdateAction).GetObject().(*extensions.Scale).Spec.Replicas - assert.Equal(t, tc.desiredReplicas, replicas) - tc.scaleUpdated = true - return true, obj, nil - }) - - fakeClient.AddReactor("update", "horizontalpodautoscalers", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := action.(core.UpdateAction).GetObject().(*extensions.HorizontalPodAutoscaler) - assert.Equal(t, namespace, obj.Namespace) - assert.Equal(t, hpaName, obj.Name) - assert.Equal(t, tc.desiredReplicas, obj.Status.DesiredReplicas) - if tc.verifyCPUCurrent { - assert.NotNil(t, obj.Status.CurrentCPUUtilizationPercentage) - assert.Equal(t, tc.CPUCurrent, *obj.Status.CurrentCPUUtilizationPercentage) - } - tc.statusUpdated = true - // Every time we reconcile HPA object we are updating status. - tc.processed <- obj.Name - return true, obj, nil - }) - - fakeClient.AddReactor("*", "events", func(action core.Action) (handled bool, ret runtime.Object, err error) { - tc.Lock() - defer tc.Unlock() - - obj := action.(core.CreateAction).GetObject().(*api.Event) - if tc.verifyEvents { - assert.Equal(t, "SuccessfulRescale", obj.Reason) - assert.Equal(t, fmt.Sprintf("New size: %d; reason: CPU utilization above target", tc.desiredReplicas), obj.Message) - } - tc.eventCreated = true - return true, obj, nil - }) - - fakeWatch := watch.NewFake() - fakeClient.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil)) - - return fakeClient -} - -func (tc *testCase) verifyResults(t *testing.T) { - tc.Lock() - defer tc.Unlock() - - assert.Equal(t, tc.initialReplicas != tc.desiredReplicas, tc.scaleUpdated) - assert.True(t, tc.statusUpdated) - if tc.verifyEvents { - assert.Equal(t, tc.initialReplicas != tc.desiredReplicas, tc.eventCreated) - } -} - -func (tc *testCase) runTest(t *testing.T) { - testClient := tc.prepareTestClient(t) - metricsClient := metrics.NewHeapsterMetricsClient(testClient, metrics.DefaultHeapsterNamespace, metrics.DefaultHeapsterScheme, metrics.DefaultHeapsterService, metrics.DefaultHeapsterPort) - - broadcaster := record.NewBroadcasterForTests(0) - broadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: testClient.Core().Events("")}) - recorder := broadcaster.NewRecorder(api.EventSource{Component: "horizontal-pod-autoscaler"}) - - hpaController := &HorizontalController{ - metricsClient: metricsClient, - eventRecorder: recorder, - scaleNamespacer: testClient.Extensions(), - hpaNamespacer: testClient.Extensions(), - } - - store, frameworkController := newInformer(hpaController, time.Minute) - hpaController.store = store - hpaController.controller = frameworkController - - stop := make(chan struct{}) - defer close(stop) - go hpaController.Run(stop) - - tc.Lock() - if tc.verifyEvents { - tc.Unlock() - // We need to wait for events to be broadcasted (sleep for longer than record.sleepDuration). - time.Sleep(2 * time.Second) - } else { - tc.Unlock() - } - // Wait for HPA to be processed. - <-tc.processed - tc.verifyResults(t) -} - -func TestDefaultScaleUpRC(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 5, - verifyCPUCurrent: true, - reportedLevels: []uint64{900, 950, 950, 1000}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestDefaultScaleUpDeployment(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 5, - verifyCPUCurrent: true, - reportedLevels: []uint64{900, 950, 950, 1000}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - resource: &fakeResource{ - name: "test-dep", - apiVersion: "extensions/v1beta1", - kind: "deployments", - }, - } - tc.runTest(t) -} - -func TestDefaultScaleUpReplicaSet(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 5, - verifyCPUCurrent: true, - reportedLevels: []uint64{900, 950, 950, 1000}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - resource: &fakeResource{ - name: "test-replicaset", - apiVersion: "extensions/v1beta1", - kind: "replicasets", - }, - } - tc.runTest(t) -} - -func TestScaleUp(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 3, - desiredReplicas: 5, - CPUTarget: 30, - verifyCPUCurrent: true, - reportedLevels: []uint64{300, 500, 700}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestScaleUpDeployment(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 3, - desiredReplicas: 5, - CPUTarget: 30, - verifyCPUCurrent: true, - reportedLevels: []uint64{300, 500, 700}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - resource: &fakeResource{ - name: "test-dep", - apiVersion: "extensions/v1beta1", - kind: "deployments", - }, - } - tc.runTest(t) -} - -func TestScaleUpReplicaSet(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 3, - desiredReplicas: 5, - CPUTarget: 30, - verifyCPUCurrent: true, - reportedLevels: []uint64{300, 500, 700}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - resource: &fakeResource{ - name: "test-replicaset", - apiVersion: "extensions/v1beta1", - kind: "replicasets", - }, - } - tc.runTest(t) -} - -func TestScaleUpCM(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 3, - desiredReplicas: 4, - CPUTarget: 0, - cmTarget: &extensions.CustomMetricTargetList{ - Items: []extensions.CustomMetricTarget{{ - Name: "qps", - TargetValue: resource.MustParse("15.0"), - }}, - }, - reportedLevels: []uint64{20, 10, 30}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestDefaultScaleDown(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 5, - desiredReplicas: 4, - verifyCPUCurrent: true, - reportedLevels: []uint64{400, 500, 600, 700, 800}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestScaleDown(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 5, - desiredReplicas: 3, - CPUTarget: 50, - verifyCPUCurrent: true, - reportedLevels: []uint64{100, 300, 500, 250, 250}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestScaleDownCM(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 5, - desiredReplicas: 3, - CPUTarget: 0, - cmTarget: &extensions.CustomMetricTargetList{ - Items: []extensions.CustomMetricTarget{{ - Name: "qps", - TargetValue: resource.MustParse("20"), - }}}, - reportedLevels: []uint64{12, 12, 12, 12, 12}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestTolerance(t *testing.T) { - tc := testCase{ - minReplicas: 1, - maxReplicas: 5, - initialReplicas: 3, - desiredReplicas: 3, - CPUTarget: 100, - reportedLevels: []uint64{1010, 1030, 1020}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.9"), resource.MustParse("1.0"), resource.MustParse("1.1")}, - } - tc.runTest(t) -} - -func TestToleranceCM(t *testing.T) { - tc := testCase{ - minReplicas: 1, - maxReplicas: 5, - initialReplicas: 3, - desiredReplicas: 3, - cmTarget: &extensions.CustomMetricTargetList{ - Items: []extensions.CustomMetricTarget{{ - Name: "qps", - TargetValue: resource.MustParse("20"), - }}}, - reportedLevels: []uint64{20, 21, 21}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.9"), resource.MustParse("1.0"), resource.MustParse("1.1")}, - } - tc.runTest(t) -} - -func TestMinReplicas(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 5, - initialReplicas: 3, - desiredReplicas: 2, - CPUTarget: 90, - reportedLevels: []uint64{10, 95, 10}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.9"), resource.MustParse("1.0"), resource.MustParse("1.1")}, - } - tc.runTest(t) -} - -func TestZeroReplicas(t *testing.T) { - tc := testCase{ - minReplicas: 3, - maxReplicas: 5, - initialReplicas: 0, - desiredReplicas: 3, - CPUTarget: 90, - reportedLevels: []uint64{}, - reportedCPURequests: []resource.Quantity{}, - } - tc.runTest(t) -} - -func TestTooFewReplicas(t *testing.T) { - tc := testCase{ - minReplicas: 3, - maxReplicas: 5, - initialReplicas: 2, - desiredReplicas: 3, - CPUTarget: 90, - reportedLevels: []uint64{}, - reportedCPURequests: []resource.Quantity{}, - } - tc.runTest(t) -} - -func TestTooManyReplicas(t *testing.T) { - tc := testCase{ - minReplicas: 3, - maxReplicas: 5, - initialReplicas: 10, - desiredReplicas: 5, - CPUTarget: 90, - reportedLevels: []uint64{}, - reportedCPURequests: []resource.Quantity{}, - } - tc.runTest(t) -} - -func TestMaxReplicas(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 5, - initialReplicas: 3, - desiredReplicas: 5, - CPUTarget: 90, - reportedLevels: []uint64{8000, 9500, 1000}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.9"), resource.MustParse("1.0"), resource.MustParse("1.1")}, - } - tc.runTest(t) -} - -func TestSuperfluousMetrics(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 4, - CPUTarget: 100, - reportedLevels: []uint64{4000, 9500, 3000, 7000, 3200, 2000}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestMissingMetrics(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 4, - CPUTarget: 100, - reportedLevels: []uint64{400, 95}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestEmptyMetrics(t *testing.T) { - tc := testCase{ - minReplicas: 2, - maxReplicas: 6, - initialReplicas: 4, - desiredReplicas: 4, - CPUTarget: 100, - reportedLevels: []uint64{}, - reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, - } - tc.runTest(t) -} - -func TestEmptyCPURequest(t *testing.T) { - tc := testCase{ - minReplicas: 1, - maxReplicas: 5, - initialReplicas: 1, - desiredReplicas: 1, - CPUTarget: 100, - reportedLevels: []uint64{200}, - } - tc.runTest(t) -} - -func TestEventCreated(t *testing.T) { - tc := testCase{ - minReplicas: 1, - maxReplicas: 5, - initialReplicas: 1, - desiredReplicas: 2, - CPUTarget: 50, - reportedLevels: []uint64{200}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.2")}, - verifyEvents: true, - } - tc.runTest(t) -} - -func TestEventNotCreated(t *testing.T) { - tc := testCase{ - minReplicas: 1, - maxReplicas: 5, - initialReplicas: 2, - desiredReplicas: 2, - CPUTarget: 50, - reportedLevels: []uint64{200, 200}, - reportedCPURequests: []resource.Quantity{resource.MustParse("0.4"), resource.MustParse("0.4")}, - verifyEvents: true, - } - tc.runTest(t) -} - -// TODO: add more tests diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client_test.go deleted file mode 100644 index a67a35aba..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client_test.go +++ /dev/null @@ -1,455 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 metrics - -import ( - "encoding/json" - "fmt" - "io" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - _ "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - - heapster "k8s.io/heapster/metrics/api/v1/types" - - "github.com/stretchr/testify/assert" -) - -var fixedTimestamp = time.Date(2015, time.November, 10, 12, 30, 0, 0, time.UTC) - -func (w fakeResponseWrapper) DoRaw() ([]byte, error) { - return w.raw, nil -} - -func (w fakeResponseWrapper) Stream() (io.ReadCloser, error) { - return nil, nil -} - -func newFakeResponseWrapper(raw []byte) fakeResponseWrapper { - return fakeResponseWrapper{raw: raw} -} - -type fakeResponseWrapper struct { - raw []byte -} - -// timestamp is used for establishing order on metricPoints -type metricPoint struct { - level uint64 - timestamp int -} - -type testCase struct { - replicas int - desiredValue float64 - desiredError error - targetResource string - targetTimestamp int - reportedMetricsPoints [][]metricPoint - namespace string - podListOverride *api.PodList - selector labels.Selector -} - -func (tc *testCase) prepareTestClient(t *testing.T) *fake.Clientset { - namespace := "test-namespace" - tc.namespace = namespace - podNamePrefix := "test-pod" - podLabels := map[string]string{"name": podNamePrefix} - tc.selector = labels.SelectorFromSet(podLabels) - - fakeClient := &fake.Clientset{} - - fakeClient.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - if tc.podListOverride != nil { - return true, tc.podListOverride, nil - } - obj := &api.PodList{} - for i := 0; i < tc.replicas; i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := buildPod(namespace, podName, podLabels, api.PodRunning) - obj.Items = append(obj.Items, pod) - } - return true, obj, nil - }) - - fakeClient.AddProxyReactor("services", func(action core.Action) (handled bool, ret restclient.ResponseWrapper, err error) { - metrics := heapster.MetricResultList{} - var latestTimestamp time.Time - for _, reportedMetricPoints := range tc.reportedMetricsPoints { - var heapsterMetricPoints []heapster.MetricPoint - for _, reportedMetricPoint := range reportedMetricPoints { - timestamp := fixedTimestamp.Add(time.Duration(reportedMetricPoint.timestamp) * time.Minute) - if latestTimestamp.Before(timestamp) { - latestTimestamp = timestamp - } - heapsterMetricPoint := heapster.MetricPoint{Timestamp: timestamp, Value: reportedMetricPoint.level, FloatValue: nil} - heapsterMetricPoints = append(heapsterMetricPoints, heapsterMetricPoint) - } - metric := heapster.MetricResult{ - Metrics: heapsterMetricPoints, - LatestTimestamp: latestTimestamp, - } - metrics.Items = append(metrics.Items, metric) - } - heapsterRawMemResponse, _ := json.Marshal(&metrics) - return true, newFakeResponseWrapper(heapsterRawMemResponse), nil - }) - - return fakeClient -} - -func buildPod(namespace, podName string, podLabels map[string]string, phase api.PodPhase) api.Pod { - return api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: podName, - Namespace: namespace, - Labels: podLabels, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("10"), - }, - }, - }, - }, - }, - Status: api.PodStatus{ - Phase: phase, - }, - } -} - -func (tc *testCase) verifyResults(t *testing.T, val *float64, timestamp time.Time, err error) { - assert.Equal(t, tc.desiredError, err) - if tc.desiredError != nil { - return - } - assert.NotNil(t, val) - assert.True(t, tc.desiredValue-0.001 < *val) - assert.True(t, tc.desiredValue+0.001 > *val) - - targetTimestamp := fixedTimestamp.Add(time.Duration(tc.targetTimestamp) * time.Minute) - assert.Equal(t, targetTimestamp, timestamp) -} - -func (tc *testCase) runTest(t *testing.T) { - testClient := tc.prepareTestClient(t) - metricsClient := NewHeapsterMetricsClient(testClient, DefaultHeapsterNamespace, DefaultHeapsterScheme, DefaultHeapsterService, DefaultHeapsterPort) - if tc.targetResource == "cpu-usage" { - val, _, timestamp, err := metricsClient.GetCpuConsumptionAndRequestInMillis(tc.namespace, tc.selector) - fval := float64(val) - tc.verifyResults(t, &fval, timestamp, err) - } else { - val, timestamp, err := metricsClient.GetCustomMetric(tc.targetResource, tc.namespace, tc.selector) - tc.verifyResults(t, val, timestamp, err) - } -} - -func TestCPU(t *testing.T) { - tc := testCase{ - replicas: 3, - desiredValue: 5000, - targetResource: "cpu-usage", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{{{5000, 1}}, {{5000, 1}}, {{5000, 1}}}, - } - tc.runTest(t) -} - -func TestCPUPending(t *testing.T) { - tc := testCase{ - replicas: 4, - desiredValue: 5000, - targetResource: "cpu-usage", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{{{5000, 1}}, {{5000, 1}}, {{5000, 1}}}, - podListOverride: &api.PodList{}, - } - - namespace := "test-namespace" - podNamePrefix := "test-pod" - podLabels := map[string]string{"name": podNamePrefix} - for i := 0; i < tc.replicas; i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := buildPod(namespace, podName, podLabels, api.PodRunning) - tc.podListOverride.Items = append(tc.podListOverride.Items, pod) - } - tc.podListOverride.Items[0].Status.Phase = api.PodPending - - tc.runTest(t) -} - -func TestCPUAllPending(t *testing.T) { - tc := testCase{ - replicas: 4, - targetResource: "cpu-usage", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{}, - podListOverride: &api.PodList{}, - desiredError: fmt.Errorf("no running pods"), - } - - namespace := "test-namespace" - podNamePrefix := "test-pod" - podLabels := map[string]string{"name": podNamePrefix} - for i := 0; i < tc.replicas; i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := buildPod(namespace, podName, podLabels, api.PodPending) - tc.podListOverride.Items = append(tc.podListOverride.Items, pod) - } - tc.runTest(t) -} - -func TestQPS(t *testing.T) { - tc := testCase{ - replicas: 3, - desiredValue: 13.33333, - targetResource: "qps", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{{{10, 1}}, {{20, 1}}, {{10, 1}}}, - } - tc.runTest(t) -} - -func TestQPSPending(t *testing.T) { - tc := testCase{ - replicas: 4, - desiredValue: 13.33333, - targetResource: "qps", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{{{10, 1}}, {{20, 1}}, {{10, 1}}}, - podListOverride: &api.PodList{}, - } - - namespace := "test-namespace" - podNamePrefix := "test-pod" - podLabels := map[string]string{"name": podNamePrefix} - for i := 0; i < tc.replicas; i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := buildPod(namespace, podName, podLabels, api.PodRunning) - tc.podListOverride.Items = append(tc.podListOverride.Items, pod) - } - tc.podListOverride.Items[0].Status.Phase = api.PodPending - tc.runTest(t) -} - -func TestQPSAllPending(t *testing.T) { - tc := testCase{ - replicas: 4, - desiredError: fmt.Errorf("no running pods"), - targetResource: "qps", - targetTimestamp: 1, - reportedMetricsPoints: [][]metricPoint{}, - podListOverride: &api.PodList{}, - } - - namespace := "test-namespace" - podNamePrefix := "test-pod" - podLabels := map[string]string{"name": podNamePrefix} - for i := 0; i < tc.replicas; i++ { - podName := fmt.Sprintf("%s-%d", podNamePrefix, i) - pod := buildPod(namespace, podName, podLabels, api.PodPending) - tc.podListOverride.Items = append(tc.podListOverride.Items, pod) - } - tc.podListOverride.Items[0].Status.Phase = api.PodPending - tc.runTest(t) -} - -func TestCPUSumEqualZero(t *testing.T) { - tc := testCase{ - replicas: 3, - desiredValue: 0, - targetResource: "cpu-usage", - targetTimestamp: 0, - reportedMetricsPoints: [][]metricPoint{{{0, 0}}, {{0, 0}}, {{0, 0}}}, - } - tc.runTest(t) -} - -func TestQpsSumEqualZero(t *testing.T) { - tc := testCase{ - replicas: 3, - desiredValue: 0, - targetResource: "qps", - targetTimestamp: 0, - reportedMetricsPoints: [][]metricPoint{{{0, 0}}, {{0, 0}}, {{0, 0}}}, - } - tc.runTest(t) -} - -func TestCPUMoreMetrics(t *testing.T) { - tc := testCase{ - replicas: 5, - desiredValue: 5000, - targetResource: "cpu-usage", - targetTimestamp: 10, - reportedMetricsPoints: [][]metricPoint{ - {{0, 3}, {0, 6}, {5, 4}, {9000, 10}}, - {{5000, 2}, {10, 5}, {66, 1}, {0, 10}}, - {{5000, 3}, {80, 5}, {6000, 10}}, - {{5000, 3}, {40, 3}, {0, 9}, {200, 2}, {8000, 10}}, - {{5000, 2}, {20, 2}, {2000, 10}}}, - } - tc.runTest(t) -} - -func TestCPUResultIsFloat(t *testing.T) { - tc := testCase{ - replicas: 6, - desiredValue: 4783, - targetResource: "cpu-usage", - targetTimestamp: 4, - reportedMetricsPoints: [][]metricPoint{{{4000, 4}}, {{9500, 4}}, {{3000, 4}}, {{7000, 4}}, {{3200, 4}}, {{2000, 4}}}, - } - tc.runTest(t) -} - -func TestCPUSamplesWithRandomTimestamps(t *testing.T) { - tc := testCase{ - replicas: 3, - desiredValue: 3000, - targetResource: "cpu-usage", - targetTimestamp: 3, - reportedMetricsPoints: [][]metricPoint{ - {{1, 1}, {3000, 5}, {2, 2}}, - {{2, 2}, {1, 1}, {3000, 3}}, - {{3000, 4}, {1, 1}, {2, 2}}}, - } - tc.runTest(t) -} - -func TestCPUMissingMetrics(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "cpu-usage", - desiredError: fmt.Errorf("metrics obtained for 1/3 of pods"), - reportedMetricsPoints: [][]metricPoint{{{4000, 4}}}, - } - tc.runTest(t) -} - -func TestQpsMissingMetrics(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "qps", - desiredError: fmt.Errorf("metrics obtained for 1/3 of pods"), - reportedMetricsPoints: [][]metricPoint{{{4000, 4}}}, - } - tc.runTest(t) -} - -func TestCPUSuperfluousMetrics(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "cpu-usage", - desiredError: fmt.Errorf("metrics obtained for 6/3 of pods"), - reportedMetricsPoints: [][]metricPoint{{{1000, 1}}, {{2000, 4}}, {{2000, 1}}, {{4000, 5}}, {{2000, 1}}, {{4000, 4}}}, - } - tc.runTest(t) -} - -func TestQpsSuperfluousMetrics(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "qps", - desiredError: fmt.Errorf("metrics obtained for 6/3 of pods"), - reportedMetricsPoints: [][]metricPoint{{{1000, 1}}, {{2000, 4}}, {{2000, 1}}, {{4000, 5}}, {{2000, 1}}, {{4000, 4}}}, - } - tc.runTest(t) -} - -func TestCPUEmptyMetrics(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "cpu-usage", - desiredError: fmt.Errorf("metrics obtained for 0/3 of pods"), - reportedMetricsPoints: [][]metricPoint{}, - } - tc.runTest(t) -} - -func TestCPUZeroReplicas(t *testing.T) { - tc := testCase{ - replicas: 0, - targetResource: "cpu-usage", - desiredError: fmt.Errorf("some pods do not have request for cpu"), - reportedMetricsPoints: [][]metricPoint{}, - } - tc.runTest(t) -} - -func TestCPUEmptyMetricsForOnePod(t *testing.T) { - tc := testCase{ - replicas: 3, - targetResource: "cpu-usage", - desiredError: fmt.Errorf("metrics obtained for 2/3 of pods"), - reportedMetricsPoints: [][]metricPoint{{}, {{100, 1}}, {{400, 2}, {300, 3}}}, - } - tc.runTest(t) -} - -func TestAggregateSum(t *testing.T) { - //calculateSumFromTimeSample(metrics heapster.MetricResultList, duration time.Duration) (sum intAndFloat, count int, timestamp time.Time) { - now := time.Now() - result := heapster.MetricResultList{ - Items: []heapster.MetricResult{ - { - Metrics: []heapster.MetricPoint{ - {now, 50, nil}, - {now.Add(-15 * time.Second), 100, nil}, - {now.Add(-60 * time.Second), 100000, nil}}, - LatestTimestamp: now, - }, - }, - } - sum, cnt, _ := calculateSumFromTimeSample(result, time.Minute) - assert.Equal(t, int64(75), sum.intValue) - assert.InEpsilon(t, 75.0, sum.floatValue, 0.1) - assert.Equal(t, 1, cnt) -} - -func TestAggregateSumSingle(t *testing.T) { - now := time.Now() - result := heapster.MetricResultList{ - Items: []heapster.MetricResult{ - { - Metrics: []heapster.MetricPoint{ - {now, 50, nil}, - {now.Add(-65 * time.Second), 100000, nil}}, - LatestTimestamp: now, - }, - }, - } - sum, cnt, _ := calculateSumFromTimeSample(result, time.Minute) - assert.Equal(t, int64(50), sum.intValue) - assert.InEpsilon(t, 50.0, sum.floatValue, 0.1) - assert.Equal(t, 1, cnt) -} - -// TODO: add proper tests for request diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/doc.go deleted file mode 100644 index 9d42796d9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 replicaset contains logic for watching and synchronizing -// ReplicaSets. -package replicaset diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/options/options.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/options/options.go deleted file mode 100644 index 91951a549..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/options/options.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 options - -import ( - "github.com/spf13/pflag" -) - -type ReplicasetControllerOptions struct { - ConcurrentRSSyncs int -} - -func NewReplicasetControllerOptions() ReplicasetControllerOptions { - return ReplicasetControllerOptions{ - ConcurrentRSSyncs: 5, - } -} - -func (o *ReplicasetControllerOptions) AddFlags(fs *pflag.FlagSet) { - fs.IntVar(&o.ConcurrentRSSyncs, "concurrent-replicaset-syncs", o.ConcurrentRSSyncs, "The number of replicasets that are allowed to sync concurrently. Larger number = more reponsive replica management, but more CPU (and network) load") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go deleted file mode 100644 index e26ce810c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set.go +++ /dev/null @@ -1,577 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicationController. - -package replicaset - -import ( - "fmt" - "reflect" - "sort" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - // We'll attempt to recompute the required replicas of all ReplicaSets - // that have fulfilled their expectations at least this often. This recomputation - // happens based on contents in local pod storage. - FullControllerResyncPeriod = 30 * time.Second - - // Realistic value of the burstReplica field for the replica set manager based off - // performance requirements for kubernetes 1.0. - BurstReplicas = 500 - - // We must avoid counting pods until the pod store has synced. If it hasn't synced, to - // avoid a hot loop, we'll wait this long between checks. - PodStoreSyncedPollPeriod = 100 * time.Millisecond - - // The number of times we retry updating a ReplicaSet's status. - statusUpdateRetries = 1 -) - -// ReplicaSetController is responsible for synchronizing ReplicaSet objects stored -// in the system with actual running pods. -type ReplicaSetController struct { - kubeClient clientset.Interface - podControl controller.PodControlInterface - - // A ReplicaSet is temporarily suspended after creating/deleting these many replicas. - // It resumes normal action after observing the watch events for them. - burstReplicas int - // To allow injection of syncReplicaSet for testing. - syncHandler func(rsKey string) error - - // A TTLCache of pod creates/deletes each rc expects to see. - expectations *controller.UIDTrackingControllerExpectations - - // A store of ReplicaSets, populated by the rsController - rsStore cache.StoreToReplicaSetLister - // Watches changes to all ReplicaSets - rsController *framework.Controller - // A store of pods, populated by the podController - podStore cache.StoreToPodLister - // Watches changes to all pods - podController *framework.Controller - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool - - lookupCache *controller.MatchingCache - - // Controllers that need to be synced - queue *workqueue.Type -} - -// NewReplicaSetController creates a new ReplicaSetController. -func NewReplicaSetController(kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, burstReplicas int, lookupCacheSize int) *ReplicaSetController { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("replicaset_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - rsc := &ReplicaSetController{ - kubeClient: kubeClient, - podControl: controller.RealPodControl{ - KubeClient: kubeClient, - Recorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "replicaset-controller"}), - }, - burstReplicas: burstReplicas, - expectations: controller.NewUIDTrackingControllerExpectations(controller.NewControllerExpectations()), - queue: workqueue.New(), - } - - rsc.rsStore.Store, rsc.rsController = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return rsc.kubeClient.Extensions().ReplicaSets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return rsc.kubeClient.Extensions().ReplicaSets(api.NamespaceAll).Watch(options) - }, - }, - &extensions.ReplicaSet{}, - // TODO: Can we have much longer period here? - FullControllerResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: rsc.enqueueReplicaSet, - UpdateFunc: func(old, cur interface{}) { - oldRS := old.(*extensions.ReplicaSet) - curRS := cur.(*extensions.ReplicaSet) - - // We should invalidate the whole lookup cache if a RS's selector has been updated. - // - // Imagine that you have two RSs: - // * old RS1 - // * new RS2 - // You also have a pod that is attached to RS2 (because it doesn't match RS1 selector). - // Now imagine that you are changing RS1 selector so that it is now matching that pod, - // in such case we must invalidate the whole cache so that pod could be adopted by RS1 - // - // This makes the lookup cache less helpful, but selector update does not happen often, - // so it's not a big problem - if !reflect.DeepEqual(oldRS.Spec.Selector, curRS.Spec.Selector) { - rsc.lookupCache.InvalidateAll() - } - - // You might imagine that we only really need to enqueue the - // replica set when Spec changes, but it is safer to sync any - // time this function is triggered. That way a full informer - // resync can requeue any replica set that don't yet have pods - // but whose last attempts at creating a pod have failed (since - // we don't block on creation of pods) instead of those - // replica sets stalling indefinitely. Enqueueing every time - // does result in some spurious syncs (like when Status.Replica - // is updated and the watch notification from it retriggers - // this function), but in general extra resyncs shouldn't be - // that bad as ReplicaSets that haven't met expectations yet won't - // sync, and all the listing is done using local stores. - if oldRS.Status.Replicas != curRS.Status.Replicas { - glog.V(4).Infof("Observed updated replica count for ReplicaSet: %v, %d->%d", curRS.Name, oldRS.Status.Replicas, curRS.Status.Replicas) - } - rsc.enqueueReplicaSet(cur) - }, - // This will enter the sync loop and no-op, because the replica set has been deleted from the store. - // Note that deleting a replica set immediately after scaling it to 0 will not work. The recommended - // way of achieving this is by performing a `stop` operation on the replica set. - DeleteFunc: rsc.enqueueReplicaSet, - }, - ) - - rsc.podStore.Indexer, rsc.podController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return rsc.kubeClient.Core().Pods(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return rsc.kubeClient.Core().Pods(api.NamespaceAll).Watch(options) - }, - }, - &api.Pod{}, - resyncPeriod(), - framework.ResourceEventHandlerFuncs{ - AddFunc: rsc.addPod, - // This invokes the ReplicaSet for every pod change, eg: host assignment. Though this might seem like - // overkill the most frequent pod update is status, and the associated ReplicaSet will only list from - // local storage, so it should be ok. - UpdateFunc: rsc.updatePod, - DeleteFunc: rsc.deletePod, - }, - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - - rsc.syncHandler = rsc.syncReplicaSet - rsc.podStoreSynced = rsc.podController.HasSynced - rsc.lookupCache = controller.NewMatchingCache(lookupCacheSize) - return rsc -} - -// SetEventRecorder replaces the event recorder used by the ReplicaSetController -// with the given recorder. Only used for testing. -func (rsc *ReplicaSetController) SetEventRecorder(recorder record.EventRecorder) { - // TODO: Hack. We can't cleanly shutdown the event recorder, so benchmarks - // need to pass in a fake. - rsc.podControl = controller.RealPodControl{KubeClient: rsc.kubeClient, Recorder: recorder} -} - -// Run begins watching and syncing. -func (rsc *ReplicaSetController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go rsc.rsController.Run(stopCh) - go rsc.podController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(rsc.worker, time.Second, stopCh) - } - <-stopCh - glog.Infof("Shutting down ReplicaSet Controller") - rsc.queue.ShutDown() -} - -// getPodReplicaSet returns the replica set managing the given pod. -// TODO: Surface that we are ignoring multiple replica sets for a single pod. -func (rsc *ReplicaSetController) getPodReplicaSet(pod *api.Pod) *extensions.ReplicaSet { - // look up in the cache, if cached and the cache is valid, just return cached value - if obj, cached := rsc.lookupCache.GetMatchingObject(pod); cached { - rs, ok := obj.(*extensions.ReplicaSet) - if !ok { - // This should not happen - glog.Errorf("lookup cache does not retuen a ReplicaSet object") - return nil - } - if cached && rsc.isCacheValid(pod, rs) { - return rs - } - } - - // if not cached or cached value is invalid, search all the rs to find the matching one, and update cache - rss, err := rsc.rsStore.GetPodReplicaSets(pod) - if err != nil { - glog.V(4).Infof("No ReplicaSets found for pod %v, ReplicaSet controller will avoid syncing", pod.Name) - return nil - } - // In theory, overlapping ReplicaSets is user error. This sorting will not prevent - // oscillation of replicas in all cases, eg: - // rs1 (older rs): [(k1=v1)], replicas=1 rs2: [(k2=v2)], replicas=2 - // pod: [(k1:v1), (k2:v2)] will wake both rs1 and rs2, and we will sync rs1. - // pod: [(k2:v2)] will wake rs2 which creates a new replica. - if len(rss) > 1 { - // More than two items in this list indicates user error. If two replicasets - // overlap, sort by creation timestamp, subsort by name, then pick - // the first. - glog.Errorf("user error! more than one ReplicaSet is selecting pods with labels: %+v", pod.Labels) - sort.Sort(overlappingReplicaSets(rss)) - } - - // update lookup cache - rsc.lookupCache.Update(pod, &rss[0]) - - return &rss[0] -} - -// isCacheValid check if the cache is valid -func (rsc *ReplicaSetController) isCacheValid(pod *api.Pod, cachedRS *extensions.ReplicaSet) bool { - _, exists, err := rsc.rsStore.Get(cachedRS) - // rs has been deleted or updated, cache is invalid - if err != nil || !exists || !isReplicaSetMatch(pod, cachedRS) { - return false - } - return true -} - -// isReplicaSetMatch take a Pod and ReplicaSet, return whether the Pod and ReplicaSet are matching -// TODO(mqliang): This logic is a copy from GetPodReplicaSets(), remove the duplication -func isReplicaSetMatch(pod *api.Pod, rs *extensions.ReplicaSet) bool { - if rs.Namespace != pod.Namespace { - return false - } - selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector) - if err != nil { - err = fmt.Errorf("invalid selector: %v", err) - return false - } - - // If a ReplicaSet with a nil or empty selector creeps in, it should match nothing, not everything. - if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { - return false - } - return true -} - -// When a pod is created, enqueue the replica set that manages it and update it's expectations. -func (rsc *ReplicaSetController) addPod(obj interface{}) { - pod := obj.(*api.Pod) - glog.V(4).Infof("Pod %s created: %+v.", pod.Name, pod) - - rs := rsc.getPodReplicaSet(pod) - if rs == nil { - return - } - rsKey, err := controller.KeyFunc(rs) - if err != nil { - glog.Errorf("Couldn't get key for replica set %#v: %v", rs, err) - return - } - if pod.DeletionTimestamp != nil { - // on a restart of the controller manager, it's possible a new pod shows up in a state that - // is already pending deletion. Prevent the pod from being a creation observation. - rsc.deletePod(pod) - return - } - rsc.expectations.CreationObserved(rsKey) - rsc.enqueueReplicaSet(rs) -} - -// When a pod is updated, figure out what replica set/s manage it and wake them -// up. If the labels of the pod have changed we need to awaken both the old -// and new replica set. old and cur must be *api.Pod types. -func (rsc *ReplicaSetController) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - // A periodic relist will send update events for all known pods. - return - } - curPod := cur.(*api.Pod) - oldPod := old.(*api.Pod) - glog.V(4).Infof("Pod %s updated %+v -> %+v.", curPod.Name, oldPod, curPod) - rs := rsc.getPodReplicaSet(curPod) - if rs == nil { - return - } - - if curPod.DeletionTimestamp != nil { - // when a pod is deleted gracefully it's deletion timestamp is first modified to reflect a grace period, - // and after such time has passed, the kubelet actually deletes it from the store. We receive an update - // for modification of the deletion timestamp and expect an rs to create more replicas asap, not wait - // until the kubelet actually deletes the pod. This is different from the Phase of a pod changing, because - // an rs never initiates a phase change, and so is never asleep waiting for the same. - rsc.deletePod(curPod) - return - } - - rsc.enqueueReplicaSet(rs) - if !reflect.DeepEqual(curPod.Labels, oldPod.Labels) { - // If the old and new ReplicaSet are the same, the first one that syncs - // will set expectations preventing any damage from the second. - if oldRS := rsc.getPodReplicaSet(oldPod); oldRS != nil { - rsc.enqueueReplicaSet(oldRS) - } - } -} - -// When a pod is deleted, enqueue the replica set that manages the pod and update its expectations. -// obj could be an *api.Pod, or a DeletionFinalStateUnknown marker item. -func (rsc *ReplicaSetController) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new ReplicaSet will not be woken up till the periodic resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a pod %+v", obj) - return - } - } - glog.V(4).Infof("Pod %s/%s deleted through %v, timestamp %+v: %+v.", pod.Namespace, pod.Name, utilruntime.GetCaller(), pod.DeletionTimestamp, pod) - if rs := rsc.getPodReplicaSet(pod); rs != nil { - rsKey, err := controller.KeyFunc(rs) - if err != nil { - glog.Errorf("Couldn't get key for ReplicaSet %#v: %v", rs, err) - return - } - rsc.expectations.DeletionObserved(rsKey, controller.PodKey(pod)) - rsc.enqueueReplicaSet(rs) - } -} - -// obj could be an *extensions.ReplicaSet, or a DeletionFinalStateUnknown marker item. -func (rsc *ReplicaSetController) enqueueReplicaSet(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - return - } - - // TODO: Handle overlapping replica sets better. Either disallow them at admission time or - // deterministically avoid syncing replica sets that fight over pods. Currently, we only - // ensure that the same replica set is synced for a given pod. When we periodically relist - // all replica sets there will still be some replica instability. One way to handle this is - // by querying the store for all replica sets that this replica set overlaps, as well as all - // replica sets that overlap this ReplicaSet, and sorting them. - rsc.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (rsc *ReplicaSetController) worker() { - for { - func() { - key, quit := rsc.queue.Get() - if quit { - return - } - defer rsc.queue.Done(key) - err := rsc.syncHandler(key.(string)) - if err != nil { - glog.Errorf("Error syncing ReplicaSet: %v", err) - } - }() - } -} - -// manageReplicas checks and updates replicas for the given ReplicaSet. -func (rsc *ReplicaSetController) manageReplicas(filteredPods []*api.Pod, rs *extensions.ReplicaSet) { - diff := len(filteredPods) - int(rs.Spec.Replicas) - rsKey, err := controller.KeyFunc(rs) - if err != nil { - glog.Errorf("Couldn't get key for ReplicaSet %#v: %v", rs, err) - return - } - if diff < 0 { - diff *= -1 - if diff > rsc.burstReplicas { - diff = rsc.burstReplicas - } - // TODO: Track UIDs of creates just like deletes. The problem currently - // is we'd need to wait on the result of a create to record the pod's - // UID, which would require locking *across* the create, which will turn - // into a performance bottleneck. We should generate a UID for the pod - // beforehand and store it via ExpectCreations. - rsc.expectations.ExpectCreations(rsKey, diff) - wait := sync.WaitGroup{} - wait.Add(diff) - glog.V(2).Infof("Too few %q/%q replicas, need %d, creating %d", rs.Namespace, rs.Name, rs.Spec.Replicas, diff) - for i := 0; i < diff; i++ { - go func() { - defer wait.Done() - if err := rsc.podControl.CreatePods(rs.Namespace, &rs.Spec.Template, rs); err != nil { - // Decrement the expected number of creates because the informer won't observe this pod - glog.V(2).Infof("Failed creation, decrementing expectations for replica set %q/%q", rs.Namespace, rs.Name) - rsc.expectations.CreationObserved(rsKey) - utilruntime.HandleError(err) - } - }() - } - wait.Wait() - } else if diff > 0 { - if diff > rsc.burstReplicas { - diff = rsc.burstReplicas - } - glog.V(2).Infof("Too many %q/%q replicas, need %d, deleting %d", rs.Namespace, rs.Name, rs.Spec.Replicas, diff) - // No need to sort pods if we are about to delete all of them - if rs.Spec.Replicas != 0 { - // Sort the pods in the order such that not-ready < ready, unscheduled - // < scheduled, and pending < running. This ensures that we delete pods - // in the earlier stages whenever possible. - sort.Sort(controller.ActivePods(filteredPods)) - } - // Snapshot the UIDs (ns/name) of the pods we're expecting to see - // deleted, so we know to record their expectations exactly once either - // when we see it as an update of the deletion timestamp, or as a delete. - // Note that if the labels on a pod/rs change in a way that the pod gets - // orphaned, the rs will only wake up after the expectations have - // expired even if other pods are deleted. - deletedPodKeys := []string{} - for i := 0; i < diff; i++ { - deletedPodKeys = append(deletedPodKeys, controller.PodKey(filteredPods[i])) - } - rsc.expectations.ExpectDeletions(rsKey, deletedPodKeys) - wait := sync.WaitGroup{} - wait.Add(diff) - for i := 0; i < diff; i++ { - go func(ix int) { - defer wait.Done() - if err := rsc.podControl.DeletePod(rs.Namespace, filteredPods[ix].Name, rs); err != nil { - // Decrement the expected number of deletes because the informer won't observe this deletion - podKey := controller.PodKey(filteredPods[ix]) - glog.V(2).Infof("Failed to delete %v, decrementing expectations for controller %q/%q", podKey, rs.Namespace, rs.Name) - rsc.expectations.DeletionObserved(rsKey, podKey) - utilruntime.HandleError(err) - } - }(i) - } - wait.Wait() - } -} - -// syncReplicaSet will sync the ReplicaSet with the given key if it has had its expectations fulfilled, -// meaning it did not expect to see any more of its pods created or deleted. This function is not meant to be -// invoked concurrently with the same key. -func (rsc *ReplicaSetController) syncReplicaSet(key string) error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing replica set %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !rsc.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(PodStoreSyncedPollPeriod) - glog.Infof("Waiting for pods controller to sync, requeuing ReplicaSet %v", key) - rsc.queue.Add(key) - return nil - } - - obj, exists, err := rsc.rsStore.Store.GetByKey(key) - if !exists { - glog.Infof("ReplicaSet has been deleted %v", key) - rsc.expectations.DeleteExpectations(key) - return nil - } - if err != nil { - glog.Infof("Unable to retrieve ReplicaSet %v from store: %v", key, err) - rsc.queue.Add(key) - return err - } - rs := *obj.(*extensions.ReplicaSet) - - // Check the expectations of the ReplicaSet before counting active pods, otherwise a new pod can sneak - // in and update the expectations after we've retrieved active pods from the store. If a new pod enters - // the store after we've checked the expectation, the ReplicaSet sync is just deferred till the next - // relist. - rsKey, err := controller.KeyFunc(&rs) - if err != nil { - glog.Errorf("Couldn't get key for ReplicaSet %#v: %v", rs, err) - return err - } - rsNeedsSync := rsc.expectations.SatisfiedExpectations(rsKey) - selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector) - if err != nil { - glog.Errorf("Error converting pod selector to selector: %v", err) - return err - } - podList, err := rsc.podStore.Pods(rs.Namespace).List(selector) - if err != nil { - glog.Errorf("Error getting pods for ReplicaSet %q: %v", key, err) - rsc.queue.Add(key) - return err - } - - // TODO: Do this in a single pass, or use an index. - filteredPods := controller.FilterActivePods(podList.Items) - if rsNeedsSync { - rsc.manageReplicas(filteredPods, &rs) - } - - // Count the number of pods that have labels matching the labels of the pod - // template of the replicaSet, the matching pods may have more labels than - // are in the template. Because the label of podTemplateSpec is a superset - // of the selector of the replicaset, so the possible matching pods must be - // part of the filteredPods. - fullyLabeledReplicasCount := 0 - templateLabel := labels.Set(rs.Spec.Template.Labels).AsSelector() - for _, pod := range filteredPods { - if templateLabel.Matches(labels.Set(pod.Labels)) { - fullyLabeledReplicasCount++ - } - } - - // Always updates status as pods come up or die. - if err := updateReplicaCount(rsc.kubeClient.Extensions().ReplicaSets(rs.Namespace), rs, len(filteredPods), fullyLabeledReplicasCount); err != nil { - // Multiple things could lead to this update failing. Requeuing the replica set ensures - // we retry with some fairness. - glog.V(2).Infof("Failed to update replica count for controller %v/%v; requeuing; error: %v", rs.Namespace, rs.Name, err) - rsc.enqueueReplicaSet(&rs) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_test.go deleted file mode 100644 index d8324ebb0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_test.go +++ /dev/null @@ -1,1036 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicationController. - -package replicaset - -import ( - "fmt" - "math/rand" - "net/http/httptest" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/securitycontext" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/sets" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -var alwaysReady = func() bool { return true } - -func getKey(rs *extensions.ReplicaSet, t *testing.T) string { - if key, err := controller.KeyFunc(rs); err != nil { - t.Errorf("Unexpected error getting key for ReplicaSet %v: %v", rs.Name, err) - return "" - } else { - return key - } -} - -func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.ReplicaSet { - rs := &extensions.ReplicaSet{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - UID: util.NewUUID(), - Name: "foobar", - Namespace: api.NamespaceDefault, - ResourceVersion: "18", - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: int32(replicas), - Selector: &unversioned.LabelSelector{MatchLabels: selectorMap}, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "name": "foo", - "type": "production", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), - }, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSDefault, - NodeSelector: map[string]string{ - "baz": "blah", - }, - }, - }, - }, - } - return rs -} - -// create count pods with the given phase for the given ReplicaSet (same selectors and namespace), and add them to the store. -func newPodList(store cache.Store, count int, status api.PodPhase, labelMap map[string]string, rs *extensions.ReplicaSet, name string) *api.PodList { - pods := []api.Pod{} - for i := 0; i < count; i++ { - newPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s%d", name, i), - Labels: labelMap, - Namespace: rs.Namespace, - }, - Status: api.PodStatus{Phase: status}, - } - if store != nil { - store.Add(&newPod) - } - pods = append(pods, newPod) - } - return &api.PodList{ - Items: pods, - } -} - -func validateSyncReplicaSet(t *testing.T, fakePodControl *controller.FakePodControl, expectedCreates, expectedDeletes int) { - if len(fakePodControl.Templates) != expectedCreates { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", expectedCreates, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != expectedDeletes { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", expectedDeletes, len(fakePodControl.DeletePodName)) - } -} - -func replicaSetResourceName() string { - return "replicasets" -} - -type serverResponse struct { - statusCode int - obj interface{} -} - -func TestSyncReplicaSetDoesNothing(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // 2 running pods, a controller with 2 replicas, sync is a no-op - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(2, labelMap) - manager.rsStore.Store.Add(rsSpec) - newPodList(manager.podStore.Indexer, 2, api.PodRunning, labelMap, rsSpec, "pod") - - manager.podControl = &fakePodControl - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) -} - -func TestSyncReplicaSetDeletes(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - // 2 running pods and a controller with 1 replica, one pod delete expected - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(1, labelMap) - manager.rsStore.Store.Add(rsSpec) - newPodList(manager.podStore.Indexer, 2, api.PodRunning, labelMap, rsSpec, "pod") - - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 1) -} - -func TestDeleteFinalStateUnknown(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - received := make(chan string) - manager.syncHandler = func(key string) error { - received <- key - return nil - } - - // The DeletedFinalStateUnknown object should cause the ReplicaSet manager to insert - // the controller matching the selectors of the deleted pod into the work queue. - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(1, labelMap) - manager.rsStore.Store.Add(rsSpec) - pods := newPodList(nil, 1, api.PodRunning, labelMap, rsSpec, "pod") - manager.deletePod(cache.DeletedFinalStateUnknown{Key: "foo", Obj: &pods.Items[0]}) - - go manager.worker() - - expected := getKey(rsSpec, t) - select { - case key := <-received: - if key != expected { - t.Errorf("Unexpected sync all for ReplicaSet %v, expected %v", key, expected) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Processing DeleteFinalStateUnknown took longer than expected") - } -} - -func TestSyncReplicaSetCreates(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // A controller with 2 replicas and no pods in the store, 2 creates expected - labelMap := map[string]string{"foo": "bar"} - rs := newReplicaSet(2, labelMap) - manager.rsStore.Store.Add(rs) - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.syncReplicaSet(getKey(rs, t)) - validateSyncReplicaSet(t, &fakePodControl, 2, 0) -} - -func TestStatusUpdatesWithoutReplicasChange(t *testing.T) { - // Setup a fake server to listen for requests, and run the ReplicaSet controller in steady state - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "{}", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Steady state for the ReplicaSet, no Status.Replicas updates expected - activePods := 5 - labelMap := map[string]string{"foo": "bar"} - rs := newReplicaSet(activePods, labelMap) - manager.rsStore.Store.Add(rs) - rs.Status = extensions.ReplicaSetStatus{Replicas: int32(activePods)} - newPodList(manager.podStore.Indexer, activePods, api.PodRunning, labelMap, rs, "pod") - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.syncReplicaSet(getKey(rs, t)) - - validateSyncReplicaSet(t, &fakePodControl, 0, 0) - if fakeHandler.RequestReceived != nil { - t.Errorf("Unexpected update when pods and ReplicaSets are in a steady state") - } - - // This response body is just so we don't err out decoding the http response, all - // we care about is the request body sent below. - response := runtime.EncodeOrDie(testapi.Extensions.Codec(), &extensions.ReplicaSet{}) - fakeHandler.ResponseBody = response - - rs.Generation = rs.Generation + 1 - manager.syncReplicaSet(getKey(rs, t)) - - rs.Status.ObservedGeneration = rs.Generation - updatedRc := runtime.EncodeOrDie(testapi.Extensions.Codec(), rs) - fakeHandler.ValidateRequest(t, testapi.Extensions.ResourcePath(replicaSetResourceName(), rs.Namespace, rs.Name)+"/status", "PUT", &updatedRc) -} - -func TestControllerUpdateReplicas(t *testing.T) { - // This is a happy server just to record the PUT request we expect for status.Replicas - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "{}", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Insufficient number of pods in the system, and Status.Replicas is wrong; - // Status.Replica should update to match number of pods in system, 1 new pod should be created. - labelMap := map[string]string{"foo": "bar"} - extraLabelMap := map[string]string{"foo": "bar", "extraKey": "extraValue"} - rs := newReplicaSet(5, labelMap) - rs.Spec.Template.Labels = extraLabelMap - manager.rsStore.Store.Add(rs) - rs.Status = extensions.ReplicaSetStatus{Replicas: 2, FullyLabeledReplicas: 6, ObservedGeneration: 0} - rs.Generation = 1 - newPodList(manager.podStore.Indexer, 2, api.PodRunning, labelMap, rs, "pod") - newPodList(manager.podStore.Indexer, 2, api.PodRunning, extraLabelMap, rs, "podWithExtraLabel") - - // This response body is just so we don't err out decoding the http response - response := runtime.EncodeOrDie(testapi.Extensions.Codec(), &extensions.ReplicaSet{}) - fakeHandler.ResponseBody = response - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - manager.syncReplicaSet(getKey(rs, t)) - - // 1. Status.Replicas should go up from 2->4 even though we created 5-4=1 pod. - // 2. Status.FullyLabeledReplicas should equal to the number of pods that - // has the extra labels, i.e., 2. - // 3. Every update to the status should include the Generation of the spec. - rs.Status = extensions.ReplicaSetStatus{Replicas: 4, FullyLabeledReplicas: 2, ObservedGeneration: 1} - - decRc := runtime.EncodeOrDie(testapi.Extensions.Codec(), rs) - fakeHandler.ValidateRequest(t, testapi.Extensions.ResourcePath(replicaSetResourceName(), rs.Namespace, rs.Name)+"/status", "PUT", &decRc) - validateSyncReplicaSet(t, &fakePodControl, 1, 0) -} - -func TestSyncReplicaSetDormancy(t *testing.T) { - // Setup a test server so we can lie about the current state of pods - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "{}", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(2, labelMap) - manager.rsStore.Store.Add(rsSpec) - newPodList(manager.podStore.Indexer, 1, api.PodRunning, labelMap, rsSpec, "pod") - - // Creates a replica and sets expectations - rsSpec.Status.Replicas = 1 - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 1, 0) - - // Expectations prevents replicas but not an update on status - rsSpec.Status.Replicas = 0 - fakePodControl.Clear() - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) - - // Get the key for the controller - rsKey, err := controller.KeyFunc(rsSpec) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rsSpec, err) - } - - // Lowering expectations should lead to a sync that creates a replica, however the - // fakePodControl error will prevent this, leaving expectations at 0, 0 - manager.expectations.CreationObserved(rsKey) - rsSpec.Status.Replicas = 1 - fakePodControl.Clear() - fakePodControl.Err = fmt.Errorf("Fake Error") - - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) - - // This replica should not need a Lowering of expectations, since the previous create failed - fakePodControl.Err = nil - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 1, 0) - - // 1 PUT for the ReplicaSet status during dormancy window. - // Note that the pod creates go through pod control so they're not recorded. - fakeHandler.ValidateRequestCount(t, 1) -} - -func TestPodControllerLookup(t *testing.T) { - manager := NewReplicaSetController(clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}), controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - testCases := []struct { - inRSs []*extensions.ReplicaSet - pod *api.Pod - outRSName string - }{ - // pods without labels don't match any ReplicaSets - { - inRSs: []*extensions.ReplicaSet{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}}, - pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo1", Namespace: api.NamespaceAll}}, - outRSName: "", - }, - // Matching labels, not namespace - { - inRSs: []*extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo2", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}}, - outRSName: "", - }, - // Matching ns and labels returns the key to the ReplicaSet, not the ReplicaSet name - { - inRSs: []*extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo3", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}}, - outRSName: "bar", - }, - } - for _, c := range testCases { - for _, r := range c.inRSs { - manager.rsStore.Add(r) - } - if rs := manager.getPodReplicaSet(c.pod); rs != nil { - if c.outRSName != rs.Name { - t.Errorf("Got replica set %+v expected %+v", rs.Name, c.outRSName) - } - } else if c.outRSName != "" { - t.Errorf("Expected a replica set %v pod %v, found none", c.outRSName, c.pod.Name) - } - } -} - -type FakeWatcher struct { - w *watch.FakeWatcher - *fake.Clientset -} - -func TestWatchControllers(t *testing.T) { - fakeWatch := watch.NewFake() - client := &fake.Clientset{} - client.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - var testRSSpec extensions.ReplicaSet - received := make(chan string) - - // The update sent through the fakeWatcher should make its way into the workqueue, - // and eventually into the syncHandler. The handler validates the received controller - // and closes the received channel to indicate that the test can finish. - manager.syncHandler = func(key string) error { - - obj, exists, err := manager.rsStore.Store.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find replica set under key %v", key) - } - rsSpec := *obj.(*extensions.ReplicaSet) - if !api.Semantic.DeepDerivative(rsSpec, testRSSpec) { - t.Errorf("Expected %#v, but got %#v", testRSSpec, rsSpec) - } - close(received) - return nil - } - // Start only the ReplicaSet watcher and the workqueue, send a watch event, - // and make sure it hits the sync method. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.rsController.Run(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - testRSSpec.Name = "foo" - fakeWatch.Add(&testRSSpec) - - select { - case <-received: - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected 1 call but got 0") - } -} - -func TestWatchPods(t *testing.T) { - fakeWatch := watch.NewFake() - client := &fake.Clientset{} - client.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Put one ReplicaSet and one pod into the controller's stores - labelMap := map[string]string{"foo": "bar"} - testRSSpec := newReplicaSet(1, labelMap) - manager.rsStore.Store.Add(testRSSpec) - received := make(chan string) - // The pod update sent through the fakeWatcher should figure out the managing ReplicaSet and - // send it into the syncHandler. - manager.syncHandler = func(key string) error { - - obj, exists, err := manager.rsStore.Store.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find replica set under key %v", key) - } - rsSpec := obj.(*extensions.ReplicaSet) - if !api.Semantic.DeepDerivative(rsSpec, testRSSpec) { - t.Errorf("\nExpected %#v,\nbut got %#v", testRSSpec, rsSpec) - } - close(received) - return nil - } - // Start only the pod watcher and the workqueue, send a watch event, - // and make sure it hits the sync method for the right ReplicaSet. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.podController.Run(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - pods := newPodList(nil, 1, api.PodRunning, labelMap, testRSSpec, "pod") - testPod := pods.Items[0] - testPod.Status.Phase = api.PodFailed - fakeWatch.Add(&testPod) - - select { - case <-received: - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected 1 call but got 0") - } -} - -func TestUpdatePods(t *testing.T) { - manager := NewReplicaSetController(fake.NewSimpleClientset(), controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - received := make(chan string) - - manager.syncHandler = func(key string) error { - obj, exists, err := manager.rsStore.Store.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find replica set under key %v", key) - } - received <- obj.(*extensions.ReplicaSet).Name - return nil - } - - stopCh := make(chan struct{}) - defer close(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - // Put 2 ReplicaSets and one pod into the controller's stores - labelMap1 := map[string]string{"foo": "bar"} - testRSSpec1 := newReplicaSet(1, labelMap1) - manager.rsStore.Store.Add(testRSSpec1) - testRSSpec2 := *testRSSpec1 - labelMap2 := map[string]string{"bar": "foo"} - testRSSpec2.Spec.Selector = &unversioned.LabelSelector{MatchLabels: labelMap2} - testRSSpec2.Name = "barfoo" - manager.rsStore.Store.Add(&testRSSpec2) - - // Put one pod in the podStore - pod1 := newPodList(manager.podStore.Indexer, 1, api.PodRunning, labelMap1, testRSSpec1, "pod").Items[0] - pod2 := pod1 - pod2.Labels = labelMap2 - - // Send an update of the same pod with modified labels, and confirm we get a sync request for - // both controllers - manager.updatePod(&pod1, &pod2) - - expected := sets.NewString(testRSSpec1.Name, testRSSpec2.Name) - for _, name := range expected.List() { - t.Logf("Expecting update for %+v", name) - select { - case got := <-received: - if !expected.Has(got) { - t.Errorf("Expected keys %#v got %v", expected, got) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected update notifications for replica sets within 100ms each") - } - } -} - -func TestControllerUpdateRequeue(t *testing.T) { - // This server should force a requeue of the controller because it fails to update status.Replicas. - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 500, - ResponseBody: "{}", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - - client := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - labelMap := map[string]string{"foo": "bar"} - rs := newReplicaSet(1, labelMap) - manager.rsStore.Store.Add(rs) - rs.Status = extensions.ReplicaSetStatus{Replicas: 2} - newPodList(manager.podStore.Indexer, 1, api.PodRunning, labelMap, rs, "pod") - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - manager.syncReplicaSet(getKey(rs, t)) - - ch := make(chan interface{}) - go func() { - item, _ := manager.queue.Get() - ch <- item - }() - select { - case key := <-ch: - expectedKey := getKey(rs, t) - if key != expectedKey { - t.Errorf("Expected requeue of replica set with key %s got %s", expectedKey, key) - } - case <-time.After(wait.ForeverTestTimeout): - manager.queue.ShutDown() - t.Errorf("Expected to find a ReplicaSet in the queue, found none.") - } - // 1 Update and 1 GET, both of which fail - fakeHandler.ValidateRequestCount(t, 2) -} - -func TestControllerUpdateStatusWithFailure(t *testing.T) { - rs := newReplicaSet(1, map[string]string{"foo": "bar"}) - fakeClient := &fake.Clientset{} - fakeClient.AddReactor("get", "replicasets", func(action core.Action) (bool, runtime.Object, error) { return true, rs, nil }) - fakeClient.AddReactor("*", "*", func(action core.Action) (bool, runtime.Object, error) { - return true, &extensions.ReplicaSet{}, fmt.Errorf("Fake error") - }) - fakeRSClient := fakeClient.Extensions().ReplicaSets("default") - numReplicas := 10 - updateReplicaCount(fakeRSClient, *rs, numReplicas, 0) - updates, gets := 0, 0 - for _, a := range fakeClient.Actions() { - if a.GetResource().Resource != "replicasets" { - t.Errorf("Unexpected action %+v", a) - continue - } - - switch action := a.(type) { - case core.GetAction: - gets++ - // Make sure the get is for the right ReplicaSet even though the update failed. - if action.GetName() != rs.Name { - t.Errorf("Expected get for ReplicaSet %v, got %+v instead", rs.Name, action.GetName()) - } - case core.UpdateAction: - updates++ - // Confirm that the update has the right status.Replicas even though the Get - // returned a ReplicaSet with replicas=1. - if c, ok := action.GetObject().(*extensions.ReplicaSet); !ok { - t.Errorf("Expected a ReplicaSet as the argument to update, got %T", c) - } else if int(c.Status.Replicas) != numReplicas { - t.Errorf("Expected update for ReplicaSet to contain replicas %v, got %v instead", - numReplicas, c.Status.Replicas) - } - default: - t.Errorf("Unexpected action %+v", a) - break - } - } - if gets != 1 || updates != 2 { - t.Errorf("Expected 1 get and 2 updates, got %d gets %d updates", gets, updates) - } -} - -// TODO: This test is too hairy for a unittest. It should be moved to an E2E suite. -func doTestControllerBurstReplicas(t *testing.T, burstReplicas, numReplicas int) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, burstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(numReplicas, labelMap) - manager.rsStore.Store.Add(rsSpec) - - expectedPods := int32(0) - pods := newPodList(nil, numReplicas, api.PodPending, labelMap, rsSpec, "pod") - - rsKey, err := controller.KeyFunc(rsSpec) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rsSpec, err) - } - - // Size up the controller, then size it down, and confirm the expected create/delete pattern - for _, replicas := range []int32{int32(numReplicas), 0} { - - rsSpec.Spec.Replicas = replicas - manager.rsStore.Store.Add(rsSpec) - - for i := 0; i < numReplicas; i += burstReplicas { - manager.syncReplicaSet(getKey(rsSpec, t)) - - // The store accrues active pods. It's also used by the ReplicaSet to determine how many - // replicas to create. - activePods := int32(len(manager.podStore.Indexer.List())) - if replicas != 0 { - // This is the number of pods currently "in flight". They were created by the - // ReplicaSet controller above, which then puts the ReplicaSet to sleep till - // all of them have been observed. - expectedPods = replicas - activePods - if expectedPods > int32(burstReplicas) { - expectedPods = int32(burstReplicas) - } - // This validates the ReplicaSet manager sync actually created pods - validateSyncReplicaSet(t, &fakePodControl, int(expectedPods), 0) - - // This simulates the watch events for all but 1 of the expected pods. - // None of these should wake the controller because it has expectations==BurstReplicas. - for i := int32(0); i < expectedPods-1; i++ { - manager.podStore.Indexer.Add(&pods.Items[i]) - manager.addPod(&pods.Items[i]) - } - - podExp, exists, err := manager.expectations.GetExpectations(rsKey) - if !exists || err != nil { - t.Fatalf("Did not find expectations for rc.") - } - if add, _ := podExp.GetExpectations(); add != 1 { - t.Fatalf("Expectations are wrong %v", podExp) - } - } else { - expectedPods = (replicas - activePods) * -1 - if expectedPods > int32(burstReplicas) { - expectedPods = int32(burstReplicas) - } - validateSyncReplicaSet(t, &fakePodControl, 0, int(expectedPods)) - - // To accurately simulate a watch we must delete the exact pods - // the rs is waiting for. - expectedDels := manager.expectations.GetUIDs(getKey(rsSpec, t)) - podsToDelete := []*api.Pod{} - for _, key := range expectedDels.List() { - nsName := strings.Split(key, "/") - podsToDelete = append(podsToDelete, &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: nsName[1], - Namespace: nsName[0], - Labels: rsSpec.Spec.Selector.MatchLabels, - }, - }) - } - // Don't delete all pods because we confirm that the last pod - // has exactly one expectation at the end, to verify that we - // don't double delete. - for i := range podsToDelete[1:] { - manager.podStore.Delete(podsToDelete[i]) - manager.deletePod(podsToDelete[i]) - } - podExp, exists, err := manager.expectations.GetExpectations(rsKey) - if !exists || err != nil { - t.Fatalf("Did not find expectations for ReplicaSet.") - } - if _, del := podExp.GetExpectations(); del != 1 { - t.Fatalf("Expectations are wrong %v", podExp) - } - } - - // Check that the ReplicaSet didn't take any action for all the above pods - fakePodControl.Clear() - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) - - // Create/Delete the last pod - // The last add pod will decrease the expectation of the ReplicaSet to 0, - // which will cause it to create/delete the remaining replicas up to burstReplicas. - if replicas != 0 { - manager.podStore.Indexer.Add(&pods.Items[expectedPods-1]) - manager.addPod(&pods.Items[expectedPods-1]) - } else { - expectedDel := manager.expectations.GetUIDs(getKey(rsSpec, t)) - if expectedDel.Len() != 1 { - t.Fatalf("Waiting on unexpected number of deletes.") - } - nsName := strings.Split(expectedDel.List()[0], "/") - lastPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: nsName[1], - Namespace: nsName[0], - Labels: rsSpec.Spec.Selector.MatchLabels, - }, - } - manager.podStore.Indexer.Delete(lastPod) - manager.deletePod(lastPod) - } - pods.Items = pods.Items[expectedPods:] - } - - // Confirm that we've created the right number of replicas - activePods := int32(len(manager.podStore.Indexer.List())) - if activePods != rsSpec.Spec.Replicas { - t.Fatalf("Unexpected number of active pods, expected %d, got %d", rsSpec.Spec.Replicas, activePods) - } - // Replenish the pod list, since we cut it down sizing up - pods = newPodList(nil, int(replicas), api.PodRunning, labelMap, rsSpec, "pod") - } -} - -func TestControllerBurstReplicas(t *testing.T) { - doTestControllerBurstReplicas(t, 5, 30) - doTestControllerBurstReplicas(t, 5, 12) - doTestControllerBurstReplicas(t, 3, 2) -} - -type FakeRSExpectations struct { - *controller.ControllerExpectations - satisfied bool - expSatisfied func() -} - -func (fe FakeRSExpectations) SatisfiedExpectations(controllerKey string) bool { - fe.expSatisfied() - return fe.satisfied -} - -// TestRSSyncExpectations tests that a pod cannot sneak in between counting active pods -// and checking expectations. -func TestRSSyncExpectations(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, 2, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - labelMap := map[string]string{"foo": "bar"} - rsSpec := newReplicaSet(2, labelMap) - manager.rsStore.Store.Add(rsSpec) - pods := newPodList(nil, 2, api.PodPending, labelMap, rsSpec, "pod") - manager.podStore.Indexer.Add(&pods.Items[0]) - postExpectationsPod := pods.Items[1] - - manager.expectations = controller.NewUIDTrackingControllerExpectations(FakeRSExpectations{ - controller.NewControllerExpectations(), true, func() { - // If we check active pods before checking expectataions, the - // ReplicaSet will create a new replica because it doesn't see - // this pod, but has fulfilled its expectations. - manager.podStore.Indexer.Add(&postExpectationsPod) - }, - }) - manager.syncReplicaSet(getKey(rsSpec, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) -} - -func TestDeleteControllerAndExpectations(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - rs := newReplicaSet(1, map[string]string{"foo": "bar"}) - manager.rsStore.Store.Add(rs) - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - // This should set expectations for the ReplicaSet - manager.syncReplicaSet(getKey(rs, t)) - validateSyncReplicaSet(t, &fakePodControl, 1, 0) - fakePodControl.Clear() - - // Get the ReplicaSet key - rsKey, err := controller.KeyFunc(rs) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rs, err) - } - - // This is to simulate a concurrent addPod, that has a handle on the expectations - // as the controller deletes it. - podExp, exists, err := manager.expectations.GetExpectations(rsKey) - if !exists || err != nil { - t.Errorf("No expectations found for ReplicaSet") - } - manager.rsStore.Delete(rs) - manager.syncReplicaSet(getKey(rs, t)) - - if _, exists, err = manager.expectations.GetExpectations(rsKey); exists { - t.Errorf("Found expectaions, expected none since the ReplicaSet has been deleted.") - } - - // This should have no effect, since we've deleted the ReplicaSet. - podExp.Add(-1, 0) - manager.podStore.Indexer.Replace(make([]interface{}, 0), "0") - manager.syncReplicaSet(getKey(rs, t)) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) -} - -func TestRSManagerNotReady(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, 2, 0) - manager.podControl = &fakePodControl - manager.podStoreSynced = func() bool { return false } - - // Simulates the ReplicaSet reflector running before the pod reflector. We don't - // want to end up creating replicas in this case until the pod reflector - // has synced, so the ReplicaSet controller should just requeue the ReplicaSet. - rsSpec := newReplicaSet(1, map[string]string{"foo": "bar"}) - manager.rsStore.Store.Add(rsSpec) - - rsKey := getKey(rsSpec, t) - manager.syncReplicaSet(rsKey) - validateSyncReplicaSet(t, &fakePodControl, 0, 0) - queueRS, _ := manager.queue.Get() - if queueRS != rsKey { - t.Fatalf("Expected to find key %v in queue, found %v", rsKey, queueRS) - } - - manager.podStoreSynced = alwaysReady - manager.syncReplicaSet(rsKey) - validateSyncReplicaSet(t, &fakePodControl, 1, 0) -} - -// shuffle returns a new shuffled list of container controllers. -func shuffle(controllers []*extensions.ReplicaSet) []*extensions.ReplicaSet { - numControllers := len(controllers) - randIndexes := rand.Perm(numControllers) - shuffled := make([]*extensions.ReplicaSet, numControllers) - for i := 0; i < numControllers; i++ { - shuffled[i] = controllers[randIndexes[i]] - } - return shuffled -} - -func TestOverlappingRSs(t *testing.T) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - labelMap := map[string]string{"foo": "bar"} - - for i := 0; i < 5; i++ { - manager := NewReplicaSetController(client, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - // Create 10 ReplicaSets, shuffled them randomly and insert them into the ReplicaSet controller's store - var controllers []*extensions.ReplicaSet - for j := 1; j < 10; j++ { - rsSpec := newReplicaSet(1, labelMap) - rsSpec.CreationTimestamp = unversioned.Date(2014, time.December, j, 0, 0, 0, 0, time.Local) - rsSpec.Name = string(util.NewUUID()) - controllers = append(controllers, rsSpec) - } - shuffledControllers := shuffle(controllers) - for j := range shuffledControllers { - manager.rsStore.Store.Add(shuffledControllers[j]) - } - // Add a pod and make sure only the oldest ReplicaSet is synced - pods := newPodList(nil, 1, api.PodPending, labelMap, controllers[0], "pod") - rsKey := getKey(controllers[0], t) - - manager.addPod(&pods.Items[0]) - queueRS, _ := manager.queue.Get() - if queueRS != rsKey { - t.Fatalf("Expected to find key %v in queue, found %v", rsKey, queueRS) - } - } -} - -func TestDeletionTimestamp(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - labelMap := map[string]string{"foo": "bar"} - manager := NewReplicaSetController(c, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - rs := newReplicaSet(1, labelMap) - manager.rsStore.Store.Add(rs) - rsKey, err := controller.KeyFunc(rs) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rs, err) - } - pod := newPodList(nil, 1, api.PodPending, labelMap, rs, "pod").Items[0] - pod.DeletionTimestamp = &unversioned.Time{Time: time.Now()} - manager.expectations.ExpectDeletions(rsKey, []string{controller.PodKey(&pod)}) - - // A pod added with a deletion timestamp should decrement deletions, not creations. - manager.addPod(&pod) - - queueRC, _ := manager.queue.Get() - if queueRC != rsKey { - t.Fatalf("Expected to find key %v in queue, found %v", rsKey, queueRC) - } - manager.queue.Done(rsKey) - - podExp, exists, err := manager.expectations.GetExpectations(rsKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // An update from no deletion timestamp to having one should be treated - // as a deletion. - oldPod := newPodList(nil, 1, api.PodPending, labelMap, rs, "pod").Items[0] - manager.expectations.ExpectDeletions(rsKey, []string{controller.PodKey(&pod)}) - manager.updatePod(&oldPod, &pod) - - queueRC, _ = manager.queue.Get() - if queueRC != rsKey { - t.Fatalf("Expected to find key %v in queue, found %v", rsKey, queueRC) - } - manager.queue.Done(rsKey) - - podExp, exists, err = manager.expectations.GetExpectations(rsKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // An update to the pod (including an update to the deletion timestamp) - // should not be counted as a second delete. - secondPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: pod.Namespace, - Name: "secondPod", - Labels: pod.Labels, - }, - } - manager.expectations.ExpectDeletions(rsKey, []string{controller.PodKey(secondPod)}) - oldPod.DeletionTimestamp = &unversioned.Time{Time: time.Now()} - manager.updatePod(&oldPod, &pod) - - podExp, exists, err = manager.expectations.GetExpectations(rsKey) - if !exists || err != nil || podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // A pod with a non-nil deletion timestamp should also be ignored by the - // delete handler, because it's already been counted in the update. - manager.deletePod(&pod) - podExp, exists, err = manager.expectations.GetExpectations(rsKey) - if !exists || err != nil || podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // Deleting the second pod should clear expectations. - manager.deletePod(secondPod) - - queueRC, _ = manager.queue.Get() - if queueRC != rsKey { - t.Fatalf("Expected to find key %v in queue, found %v", rsKey, queueRC) - } - manager.queue.Done(rsKey) - - podExp, exists, err = manager.expectations.GetExpectations(rsKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_utils.go deleted file mode 100644 index fd8bd7062..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replicaset/replica_set_utils.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicationController. - -package replicaset - -import ( - "fmt" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/apis/extensions" - client "k8s.io/kubernetes/pkg/client/unversioned" -) - -// updateReplicaCount attempts to update the Status.Replicas of the given ReplicaSet, with a single GET/PUT retry. -func updateReplicaCount(rsClient client.ReplicaSetInterface, rs extensions.ReplicaSet, numReplicas, numFullyLabeledReplicas int) (updateErr error) { - // This is the steady state. It happens when the ReplicaSet doesn't have any expectations, since - // we do a periodic relist every 30s. If the generations differ but the replicas are - // the same, a caller might've resized to the same replica count. - if int(rs.Status.Replicas) == numReplicas && - int(rs.Status.FullyLabeledReplicas) == numFullyLabeledReplicas && - rs.Generation == rs.Status.ObservedGeneration { - return nil - } - // Save the generation number we acted on, otherwise we might wrongfully indicate - // that we've seen a spec update when we retry. - // TODO: This can clobber an update if we allow multiple agents to write to the - // same status. - generation := rs.Generation - - var getErr error - for i, rs := 0, &rs; ; i++ { - glog.V(4).Infof(fmt.Sprintf("Updating replica count for ReplicaSet: %s/%s, ", rs.Namespace, rs.Name) + - fmt.Sprintf("replicas %d->%d (need %d), ", rs.Status.Replicas, numReplicas, rs.Spec.Replicas) + - fmt.Sprintf("fullyLabeledReplicas %d->%d, ", rs.Status.FullyLabeledReplicas, numFullyLabeledReplicas) + - fmt.Sprintf("sequence No: %v->%v", rs.Status.ObservedGeneration, generation)) - - rs.Status = extensions.ReplicaSetStatus{Replicas: int32(numReplicas), FullyLabeledReplicas: int32(numFullyLabeledReplicas), ObservedGeneration: generation} - _, updateErr = rsClient.UpdateStatus(rs) - if updateErr == nil || i >= statusUpdateRetries { - return updateErr - } - // Update the ReplicaSet with the latest resource version for the next poll - if rs, getErr = rsClient.Get(rs.Name); getErr != nil { - // If the GET fails we can't trust status.Replicas anymore. This error - // is bound to be more interesting than the update failure. - return getErr - } - } -} - -// overlappingReplicaSets sorts a list of ReplicaSets by creation timestamp, using their names as a tie breaker. -type overlappingReplicaSets []extensions.ReplicaSet - -func (o overlappingReplicaSets) Len() int { return len(o) } -func (o overlappingReplicaSets) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o overlappingReplicaSets) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/doc.go deleted file mode 100644 index b60e1d99c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 replication contains logic for watching and synchronizing -// replication controllers. -package replication diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller.go deleted file mode 100644 index 8fc0f16fd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller.go +++ /dev/null @@ -1,582 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicaSet. - -package replication - -import ( - "reflect" - "sort" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/controller/framework/informers" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -const ( - // We'll attempt to recompute the required replicas of all replication controllers - // that have fulfilled their expectations at least this often. This recomputation - // happens based on contents in local pod storage. - FullControllerResyncPeriod = 30 * time.Second - - // Realistic value of the burstReplica field for the replication manager based off - // performance requirements for kubernetes 1.0. - BurstReplicas = 500 - - // We must avoid counting pods until the pod store has synced. If it hasn't synced, to - // avoid a hot loop, we'll wait this long between checks. - PodStoreSyncedPollPeriod = 100 * time.Millisecond - - // The number of times we retry updating a replication controller's status. - statusUpdateRetries = 1 -) - -// ReplicationManager is responsible for synchronizing ReplicationController objects stored -// in the system with actual running pods. -// TODO: this really should be called ReplicationController. The only reason why it's a Manager -// is to distinguish this type from API object "ReplicationController". We should fix this. -type ReplicationManager struct { - kubeClient clientset.Interface - podControl controller.PodControlInterface - - // internalPodInformer is used to hold a personal informer. If we're using - // a normal shared informer, then the informer will be started for us. If - // we have a personal informer, we must start it ourselves. If you start - // the controller using NewReplicationManager(passing SharedInformer), this - // will be null - internalPodInformer framework.SharedIndexInformer - - // An rc is temporarily suspended after creating/deleting these many replicas. - // It resumes normal action after observing the watch events for them. - burstReplicas int - // To allow injection of syncReplicationController for testing. - syncHandler func(rcKey string) error - - // A TTLCache of pod creates/deletes each rc expects to see. - expectations *controller.UIDTrackingControllerExpectations - - // A store of replication controllers, populated by the rcController - rcStore cache.StoreToReplicationControllerLister - // Watches changes to all replication controllers - rcController *framework.Controller - // A store of pods, populated by the podController - podStore cache.StoreToPodLister - // Watches changes to all pods - podController framework.ControllerInterface - // podStoreSynced returns true if the pod store has been synced at least once. - // Added as a member to the struct to allow injection for testing. - podStoreSynced func() bool - - lookupCache *controller.MatchingCache - - // Controllers that need to be synced - queue *workqueue.Type -} - -func NewReplicationManager(podInformer framework.SharedIndexInformer, kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, burstReplicas int, lookupCacheSize int) *ReplicationManager { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(glog.Infof) - eventBroadcaster.StartRecordingToSink(&unversionedcore.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("replication_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - rm := &ReplicationManager{ - kubeClient: kubeClient, - podControl: controller.RealPodControl{ - KubeClient: kubeClient, - Recorder: eventBroadcaster.NewRecorder(api.EventSource{Component: "replication-controller"}), - }, - burstReplicas: burstReplicas, - expectations: controller.NewUIDTrackingControllerExpectations(controller.NewControllerExpectations()), - queue: workqueue.New(), - } - - rm.rcStore.Indexer, rm.rcController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return rm.kubeClient.Core().ReplicationControllers(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return rm.kubeClient.Core().ReplicationControllers(api.NamespaceAll).Watch(options) - }, - }, - &api.ReplicationController{}, - // TODO: Can we have much longer period here? - FullControllerResyncPeriod, - framework.ResourceEventHandlerFuncs{ - AddFunc: rm.enqueueController, - UpdateFunc: func(old, cur interface{}) { - oldRC := old.(*api.ReplicationController) - curRC := cur.(*api.ReplicationController) - - // We should invalidate the whole lookup cache if a RC's selector has been updated. - // - // Imagine that you have two RCs: - // * old RC1 - // * new RC2 - // You also have a pod that is attached to RC2 (because it doesn't match RC1 selector). - // Now imagine that you are changing RC1 selector so that it is now matching that pod, - // in such case, we must invalidate the whole cache so that pod could be adopted by RC1 - // - // This makes the lookup cache less helpful, but selector update does not happen often, - // so it's not a big problem - if !reflect.DeepEqual(oldRC.Spec.Selector, curRC.Spec.Selector) { - rm.lookupCache.InvalidateAll() - } - - // You might imagine that we only really need to enqueue the - // controller when Spec changes, but it is safer to sync any - // time this function is triggered. That way a full informer - // resync can requeue any controllers that don't yet have pods - // but whose last attempts at creating a pod have failed (since - // we don't block on creation of pods) instead of those - // controllers stalling indefinitely. Enqueueing every time - // does result in some spurious syncs (like when Status.Replica - // is updated and the watch notification from it retriggers - // this function), but in general extra resyncs shouldn't be - // that bad as rcs that haven't met expectations yet won't - // sync, and all the listing is done using local stores. - if oldRC.Status.Replicas != curRC.Status.Replicas { - glog.V(4).Infof("Observed updated replica count for rc: %v, %d->%d", curRC.Name, oldRC.Status.Replicas, curRC.Status.Replicas) - } - rm.enqueueController(cur) - }, - // This will enter the sync loop and no-op, because the controller has been deleted from the store. - // Note that deleting a controller immediately after scaling it to 0 will not work. The recommended - // way of achieving this is by performing a `stop` operation on the controller. - DeleteFunc: rm.enqueueController, - }, - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - - podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - AddFunc: rm.addPod, - // This invokes the rc for every pod change, eg: host assignment. Though this might seem like overkill - // the most frequent pod update is status, and the associated rc will only list from local storage, so - // it should be ok. - UpdateFunc: rm.updatePod, - DeleteFunc: rm.deletePod, - }) - rm.podStore.Indexer = podInformer.GetIndexer() - rm.podController = podInformer.GetController() - - rm.syncHandler = rm.syncReplicationController - rm.podStoreSynced = rm.podController.HasSynced - rm.lookupCache = controller.NewMatchingCache(lookupCacheSize) - return rm - -} - -// NewReplicationManagerFromClient creates a new ReplicationManager that runs its own informer. -func NewReplicationManagerFromClient(kubeClient clientset.Interface, resyncPeriod controller.ResyncPeriodFunc, burstReplicas int, lookupCacheSize int) *ReplicationManager { - podInformer := informers.CreateSharedPodIndexInformer(kubeClient, resyncPeriod()) - rm := NewReplicationManager(podInformer, kubeClient, resyncPeriod, burstReplicas, lookupCacheSize) - rm.internalPodInformer = podInformer - - return rm -} - -// SetEventRecorder replaces the event recorder used by the replication manager -// with the given recorder. Only used for testing. -func (rm *ReplicationManager) SetEventRecorder(recorder record.EventRecorder) { - // TODO: Hack. We can't cleanly shutdown the event recorder, so benchmarks - // need to pass in a fake. - rm.podControl = controller.RealPodControl{KubeClient: rm.kubeClient, Recorder: recorder} -} - -// Run begins watching and syncing. -func (rm *ReplicationManager) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - glog.Infof("Starting RC Manager") - go rm.rcController.Run(stopCh) - go rm.podController.Run(stopCh) - for i := 0; i < workers; i++ { - go wait.Until(rm.worker, time.Second, stopCh) - } - - if rm.internalPodInformer != nil { - go rm.internalPodInformer.Run(stopCh) - } - - <-stopCh - glog.Infof("Shutting down RC Manager") - rm.queue.ShutDown() -} - -// getPodController returns the controller managing the given pod. -// TODO: Surface that we are ignoring multiple controllers for a single pod. -func (rm *ReplicationManager) getPodController(pod *api.Pod) *api.ReplicationController { - // look up in the cache, if cached and the cache is valid, just return cached value - if obj, cached := rm.lookupCache.GetMatchingObject(pod); cached { - controller, ok := obj.(*api.ReplicationController) - if !ok { - // This should not happen - glog.Errorf("lookup cache does not retuen a ReplicationController object") - return nil - } - if cached && rm.isCacheValid(pod, controller) { - return controller - } - } - - // if not cached or cached value is invalid, search all the rc to find the matching one, and update cache - controllers, err := rm.rcStore.GetPodControllers(pod) - if err != nil { - glog.V(4).Infof("No controllers found for pod %v, replication manager will avoid syncing", pod.Name) - return nil - } - // In theory, overlapping controllers is user error. This sorting will not prevent - // oscillation of replicas in all cases, eg: - // rc1 (older rc): [(k1=v1)], replicas=1 rc2: [(k2=v2)], replicas=2 - // pod: [(k1:v1), (k2:v2)] will wake both rc1 and rc2, and we will sync rc1. - // pod: [(k2:v2)] will wake rc2 which creates a new replica. - if len(controllers) > 1 { - // More than two items in this list indicates user error. If two replication-controller - // overlap, sort by creation timestamp, subsort by name, then pick - // the first. - glog.Errorf("user error! more than one replication controller is selecting pods with labels: %+v", pod.Labels) - sort.Sort(OverlappingControllers(controllers)) - } - - // update lookup cache - rm.lookupCache.Update(pod, &controllers[0]) - - return &controllers[0] -} - -// isCacheValid check if the cache is valid -func (rm *ReplicationManager) isCacheValid(pod *api.Pod, cachedRC *api.ReplicationController) bool { - exists, err := rm.rcStore.Exists(cachedRC) - // rc has been deleted or updated, cache is invalid - if err != nil || !exists || !isControllerMatch(pod, cachedRC) { - return false - } - return true -} - -// isControllerMatch take a Pod and ReplicationController, return whether the Pod and ReplicationController are matching -// TODO(mqliang): This logic is a copy from GetPodControllers(), remove the duplication -func isControllerMatch(pod *api.Pod, rc *api.ReplicationController) bool { - if rc.Namespace != pod.Namespace { - return false - } - labelSet := labels.Set(rc.Spec.Selector) - selector := labels.Set(rc.Spec.Selector).AsSelector() - - // If an rc with a nil or empty selector creeps in, it should match nothing, not everything. - if labelSet.AsSelector().Empty() || !selector.Matches(labels.Set(pod.Labels)) { - return false - } - return true -} - -// When a pod is created, enqueue the controller that manages it and update it's expectations. -func (rm *ReplicationManager) addPod(obj interface{}) { - pod := obj.(*api.Pod) - - rc := rm.getPodController(pod) - if rc == nil { - return - } - rcKey, err := controller.KeyFunc(rc) - if err != nil { - glog.Errorf("Couldn't get key for replication controller %#v: %v", rc, err) - return - } - - if pod.DeletionTimestamp != nil { - // on a restart of the controller manager, it's possible a new pod shows up in a state that - // is already pending deletion. Prevent the pod from being a creation observation. - rm.deletePod(pod) - return - } - rm.expectations.CreationObserved(rcKey) - rm.enqueueController(rc) -} - -// When a pod is updated, figure out what controller/s manage it and wake them -// up. If the labels of the pod have changed we need to awaken both the old -// and new controller. old and cur must be *api.Pod types. -func (rm *ReplicationManager) updatePod(old, cur interface{}) { - if api.Semantic.DeepEqual(old, cur) { - // A periodic relist will send update events for all known pods. - return - } - curPod := cur.(*api.Pod) - rc := rm.getPodController(curPod) - if rc == nil { - return - } - oldPod := old.(*api.Pod) - - if curPod.DeletionTimestamp != nil { - // when a pod is deleted gracefully it's deletion timestamp is first modified to reflect a grace period, - // and after such time has passed, the kubelet actually deletes it from the store. We receive an update - // for modification of the deletion timestamp and expect an rc to create more replicas asap, not wait - // until the kubelet actually deletes the pod. This is different from the Phase of a pod changing, because - // an rc never initiates a phase change, and so is never asleep waiting for the same. - rm.deletePod(curPod) - return - } - rm.enqueueController(rc) - // Only need to get the old controller if the labels changed. - if !reflect.DeepEqual(curPod.Labels, oldPod.Labels) { - // If the old and new rc are the same, the first one that syncs - // will set expectations preventing any damage from the second. - if oldRC := rm.getPodController(oldPod); oldRC != nil { - rm.enqueueController(oldRC) - } - } -} - -// When a pod is deleted, enqueue the controller that manages the pod and update its expectations. -// obj could be an *api.Pod, or a DeletionFinalStateUnknown marker item. -func (rm *ReplicationManager) deletePod(obj interface{}) { - pod, ok := obj.(*api.Pod) - - // When a delete is dropped, the relist will notice a pod in the store not - // in the list, leading to the insertion of a tombstone object which contains - // the deleted key/value. Note that this value might be stale. If the pod - // changed labels the new rc will not be woken up till the periodic resync. - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("Couldn't get object from tombstone %+v", obj) - return - } - pod, ok = tombstone.Obj.(*api.Pod) - if !ok { - glog.Errorf("Tombstone contained object that is not a pod %+v", obj) - return - } - } - glog.V(4).Infof("Pod %s/%s deleted through %v, timestamp %+v, labels %+v.", pod.Namespace, pod.Name, utilruntime.GetCaller(), pod.DeletionTimestamp, pod.Labels) - if rc := rm.getPodController(pod); rc != nil { - rcKey, err := controller.KeyFunc(rc) - if err != nil { - glog.Errorf("Couldn't get key for replication controller %#v: %v", rc, err) - return - } - rm.expectations.DeletionObserved(rcKey, controller.PodKey(pod)) - rm.enqueueController(rc) - } -} - -// obj could be an *api.ReplicationController, or a DeletionFinalStateUnknown marker item. -func (rm *ReplicationManager) enqueueController(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - return - } - - // TODO: Handle overlapping controllers better. Either disallow them at admission time or - // deterministically avoid syncing controllers that fight over pods. Currently, we only - // ensure that the same controller is synced for a given pod. When we periodically relist - // all controllers there will still be some replica instability. One way to handle this is - // by querying the store for all controllers that this rc overlaps, as well as all - // controllers that overlap this rc, and sorting them. - rm.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (rm *ReplicationManager) worker() { - for { - func() { - key, quit := rm.queue.Get() - if quit { - return - } - defer rm.queue.Done(key) - err := rm.syncHandler(key.(string)) - if err != nil { - glog.Errorf("Error syncing replication controller: %v", err) - } - }() - } -} - -// manageReplicas checks and updates replicas for the given replication controller. -func (rm *ReplicationManager) manageReplicas(filteredPods []*api.Pod, rc *api.ReplicationController) { - diff := len(filteredPods) - int(rc.Spec.Replicas) - rcKey, err := controller.KeyFunc(rc) - if err != nil { - glog.Errorf("Couldn't get key for replication controller %#v: %v", rc, err) - return - } - if diff < 0 { - diff *= -1 - if diff > rm.burstReplicas { - diff = rm.burstReplicas - } - // TODO: Track UIDs of creates just like deletes. The problem currently - // is we'd need to wait on the result of a create to record the pod's - // UID, which would require locking *across* the create, which will turn - // into a performance bottleneck. We should generate a UID for the pod - // beforehand and store it via ExpectCreations. - rm.expectations.ExpectCreations(rcKey, diff) - wait := sync.WaitGroup{} - wait.Add(diff) - glog.V(2).Infof("Too few %q/%q replicas, need %d, creating %d", rc.Namespace, rc.Name, rc.Spec.Replicas, diff) - for i := 0; i < diff; i++ { - go func() { - defer wait.Done() - if err := rm.podControl.CreatePods(rc.Namespace, rc.Spec.Template, rc); err != nil { - // Decrement the expected number of creates because the informer won't observe this pod - glog.V(2).Infof("Failed creation, decrementing expectations for controller %q/%q", rc.Namespace, rc.Name) - rm.expectations.CreationObserved(rcKey) - utilruntime.HandleError(err) - } - }() - } - wait.Wait() - } else if diff > 0 { - if diff > rm.burstReplicas { - diff = rm.burstReplicas - } - glog.V(2).Infof("Too many %q/%q replicas, need %d, deleting %d", rc.Namespace, rc.Name, rc.Spec.Replicas, diff) - // No need to sort pods if we are about to delete all of them - if rc.Spec.Replicas != 0 { - // Sort the pods in the order such that not-ready < ready, unscheduled - // < scheduled, and pending < running. This ensures that we delete pods - // in the earlier stages whenever possible. - sort.Sort(controller.ActivePods(filteredPods)) - } - // Snapshot the UIDs (ns/name) of the pods we're expecting to see - // deleted, so we know to record their expectations exactly once either - // when we see it as an update of the deletion timestamp, or as a delete. - // Note that if the labels on a pod/rc change in a way that the pod gets - // orphaned, the rs will only wake up after the expectations have - // expired even if other pods are deleted. - deletedPodKeys := []string{} - for i := 0; i < diff; i++ { - deletedPodKeys = append(deletedPodKeys, controller.PodKey(filteredPods[i])) - } - // We use pod namespace/name as a UID to wait for deletions, so if the - // labels on a pod/rc change in a way that the pod gets orphaned, the - // rc will only wake up after the expectation has expired. - rm.expectations.ExpectDeletions(rcKey, deletedPodKeys) - wait := sync.WaitGroup{} - wait.Add(diff) - for i := 0; i < diff; i++ { - go func(ix int) { - defer wait.Done() - if err := rm.podControl.DeletePod(rc.Namespace, filteredPods[ix].Name, rc); err != nil { - // Decrement the expected number of deletes because the informer won't observe this deletion - podKey := controller.PodKey(filteredPods[ix]) - glog.V(2).Infof("Failed to delete %v due to %v, decrementing expectations for controller %q/%q", podKey, err, rc.Namespace, rc.Name) - rm.expectations.DeletionObserved(rcKey, podKey) - utilruntime.HandleError(err) - } - }(i) - } - wait.Wait() - } -} - -// syncReplicationController will sync the rc with the given key if it has had its expectations fulfilled, meaning -// it did not expect to see any more of its pods created or deleted. This function is not meant to be invoked -// concurrently with the same key. -func (rm *ReplicationManager) syncReplicationController(key string) error { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing controller %q (%v)", key, time.Now().Sub(startTime)) - }() - - if !rm.podStoreSynced() { - // Sleep so we give the pod reflector goroutine a chance to run. - time.Sleep(PodStoreSyncedPollPeriod) - glog.Infof("Waiting for pods controller to sync, requeuing rc %v", key) - rm.queue.Add(key) - return nil - } - - obj, exists, err := rm.rcStore.Indexer.GetByKey(key) - if !exists { - glog.Infof("Replication Controller has been deleted %v", key) - rm.expectations.DeleteExpectations(key) - return nil - } - if err != nil { - glog.Infof("Unable to retrieve rc %v from store: %v", key, err) - rm.queue.Add(key) - return err - } - rc := *obj.(*api.ReplicationController) - - // Check the expectations of the rc before counting active pods, otherwise a new pod can sneak in - // and update the expectations after we've retrieved active pods from the store. If a new pod enters - // the store after we've checked the expectation, the rc sync is just deferred till the next relist. - rcKey, err := controller.KeyFunc(&rc) - if err != nil { - glog.Errorf("Couldn't get key for replication controller %#v: %v", rc, err) - return err - } - rcNeedsSync := rm.expectations.SatisfiedExpectations(rcKey) - podList, err := rm.podStore.Pods(rc.Namespace).List(labels.Set(rc.Spec.Selector).AsSelector()) - if err != nil { - glog.Errorf("Error getting pods for rc %q: %v", key, err) - rm.queue.Add(key) - return err - } - - // TODO: Do this in a single pass, or use an index. - filteredPods := controller.FilterActivePods(podList.Items) - if rcNeedsSync { - rm.manageReplicas(filteredPods, &rc) - } - - // Count the number of pods that have labels matching the labels of the pod - // template of the replication controller, the matching pods may have more - // labels than are in the template. Because the label of podTemplateSpec is - // a superset of the selector of the replication controller, so the possible - // matching pods must be part of the filteredPods. - fullyLabeledReplicasCount := 0 - templateLabel := labels.Set(rc.Spec.Template.Labels).AsSelector() - for _, pod := range filteredPods { - if templateLabel.Matches(labels.Set(pod.Labels)) { - fullyLabeledReplicasCount++ - } - } - - // Always updates status as pods come up or die. - if err := updateReplicaCount(rm.kubeClient.Core().ReplicationControllers(rc.Namespace), rc, len(filteredPods), fullyLabeledReplicasCount); err != nil { - // Multiple things could lead to this update failing. Requeuing the controller ensures - // we retry with some fairness. - glog.V(2).Infof("Failed to update replica count for controller %v/%v; requeuing; error: %v", rc.Namespace, rc.Name, err) - rm.enqueueController(&rc) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_test.go deleted file mode 100644 index 376e5a4b9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_test.go +++ /dev/null @@ -1,1102 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicaSet. - -package replication - -import ( - "fmt" - "math/rand" - "net/http/httptest" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/securitycontext" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/sets" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -var alwaysReady = func() bool { return true } - -func getKey(rc *api.ReplicationController, t *testing.T) string { - if key, err := controller.KeyFunc(rc); err != nil { - t.Errorf("Unexpected error getting key for rc %v: %v", rc.Name, err) - return "" - } else { - return key - } -} - -func newReplicationController(replicas int) *api.ReplicationController { - rc := &api.ReplicationController{ - TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()}, - ObjectMeta: api.ObjectMeta{ - UID: util.NewUUID(), - Name: "foobar", - Namespace: api.NamespaceDefault, - ResourceVersion: "18", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: int32(replicas), - Selector: map[string]string{"foo": "bar"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "name": "foo", - "type": "production", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), - }, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSDefault, - NodeSelector: map[string]string{ - "baz": "blah", - }, - }, - }, - }, - } - return rc -} - -// create count pods with the given phase for the given rc (same selectors and namespace), and add them to the store. -func newPodList(store cache.Store, count int, status api.PodPhase, rc *api.ReplicationController, name string) *api.PodList { - pods := []api.Pod{} - for i := 0; i < count; i++ { - newPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("%s%d", name, i), - Labels: rc.Spec.Selector, - Namespace: rc.Namespace, - }, - Status: api.PodStatus{Phase: status}, - } - if store != nil { - store.Add(&newPod) - } - pods = append(pods, newPod) - } - return &api.PodList{ - Items: pods, - } -} - -func validateSyncReplication(t *testing.T, fakePodControl *controller.FakePodControl, expectedCreates, expectedDeletes int) { - if len(fakePodControl.Templates) != expectedCreates { - t.Errorf("Unexpected number of creates. Expected %d, saw %d\n", expectedCreates, len(fakePodControl.Templates)) - } - if len(fakePodControl.DeletePodName) != expectedDeletes { - t.Errorf("Unexpected number of deletes. Expected %d, saw %d\n", expectedDeletes, len(fakePodControl.DeletePodName)) - } -} - -func replicationControllerResourceName() string { - return "replicationcontrollers" -} - -type serverResponse struct { - statusCode int - obj interface{} -} - -func TestSyncReplicationControllerDoesNothing(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // 2 running pods, a controller with 2 replicas, sync is a no-op - controllerSpec := newReplicationController(2) - manager.rcStore.Indexer.Add(controllerSpec) - newPodList(manager.podStore.Indexer, 2, api.PodRunning, controllerSpec, "pod") - - manager.podControl = &fakePodControl - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) -} - -func TestSyncReplicationControllerDeletes(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - // 2 running pods and a controller with 1 replica, one pod delete expected - controllerSpec := newReplicationController(1) - manager.rcStore.Indexer.Add(controllerSpec) - newPodList(manager.podStore.Indexer, 2, api.PodRunning, controllerSpec, "pod") - - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 1) -} - -func TestDeleteFinalStateUnknown(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - received := make(chan string) - manager.syncHandler = func(key string) error { - received <- key - return nil - } - - // The DeletedFinalStateUnknown object should cause the rc manager to insert - // the controller matching the selectors of the deleted pod into the work queue. - controllerSpec := newReplicationController(1) - manager.rcStore.Indexer.Add(controllerSpec) - pods := newPodList(nil, 1, api.PodRunning, controllerSpec, "pod") - manager.deletePod(cache.DeletedFinalStateUnknown{Key: "foo", Obj: &pods.Items[0]}) - - go manager.worker() - - expected := getKey(controllerSpec, t) - select { - case key := <-received: - if key != expected { - t.Errorf("Unexpected sync all for rc %v, expected %v", key, expected) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Processing DeleteFinalStateUnknown took longer than expected") - } -} - -func TestSyncReplicationControllerCreates(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // A controller with 2 replicas and no pods in the store, 2 creates expected - rc := newReplicationController(2) - manager.rcStore.Indexer.Add(rc) - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.syncReplicationController(getKey(rc, t)) - validateSyncReplication(t, &fakePodControl, 2, 0) -} - -func TestStatusUpdatesWithoutReplicasChange(t *testing.T) { - // Setup a fake server to listen for requests, and run the rc manager in steady state - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Steady state for the replication controller, no Status.Replicas updates expected - activePods := 5 - rc := newReplicationController(activePods) - manager.rcStore.Indexer.Add(rc) - rc.Status = api.ReplicationControllerStatus{Replicas: int32(activePods)} - newPodList(manager.podStore.Indexer, activePods, api.PodRunning, rc, "pod") - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - manager.syncReplicationController(getKey(rc, t)) - - validateSyncReplication(t, &fakePodControl, 0, 0) - if fakeHandler.RequestReceived != nil { - t.Errorf("Unexpected update when pods and rcs are in a steady state") - } - - // This response body is just so we don't err out decoding the http response, all - // we care about is the request body sent below. - response := runtime.EncodeOrDie(testapi.Default.Codec(), &api.ReplicationController{}) - fakeHandler.ResponseBody = response - - rc.Generation = rc.Generation + 1 - manager.syncReplicationController(getKey(rc, t)) - - rc.Status.ObservedGeneration = rc.Generation - updatedRc := runtime.EncodeOrDie(testapi.Default.Codec(), rc) - fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath(replicationControllerResourceName(), rc.Namespace, rc.Name)+"/status", "PUT", &updatedRc) -} - -func TestControllerUpdateReplicas(t *testing.T) { - // This is a happy server just to record the PUT request we expect for status.Replicas - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Insufficient number of pods in the system, and Status.Replicas is wrong; - // Status.Replica should update to match number of pods in system, 1 new pod should be created. - rc := newReplicationController(5) - manager.rcStore.Indexer.Add(rc) - rc.Status = api.ReplicationControllerStatus{Replicas: 2, FullyLabeledReplicas: 6, ObservedGeneration: 0} - rc.Generation = 1 - newPodList(manager.podStore.Indexer, 2, api.PodRunning, rc, "pod") - rcCopy := *rc - extraLabelMap := map[string]string{"foo": "bar", "extraKey": "extraValue"} - rcCopy.Spec.Selector = extraLabelMap - newPodList(manager.podStore.Indexer, 2, api.PodRunning, &rcCopy, "podWithExtraLabel") - - // This response body is just so we don't err out decoding the http response - response := runtime.EncodeOrDie(testapi.Default.Codec(), &api.ReplicationController{}) - fakeHandler.ResponseBody = response - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - manager.syncReplicationController(getKey(rc, t)) - - // 1. Status.Replicas should go up from 2->4 even though we created 5-4=1 pod. - // 2. Status.FullyLabeledReplicas should equal to the number of pods that - // has the extra labels, i.e., 2. - // 3. Every update to the status should include the Generation of the spec. - rc.Status = api.ReplicationControllerStatus{Replicas: 4, ObservedGeneration: 1} - - decRc := runtime.EncodeOrDie(testapi.Default.Codec(), rc) - fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath(replicationControllerResourceName(), rc.Namespace, rc.Name)+"/status", "PUT", &decRc) - validateSyncReplication(t, &fakePodControl, 1, 0) -} - -func TestSyncReplicationControllerDormancy(t *testing.T) { - // Setup a test server so we can lie about the current state of pods - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 200, - ResponseBody: "{}", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - c := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - controllerSpec := newReplicationController(2) - manager.rcStore.Indexer.Add(controllerSpec) - newPodList(manager.podStore.Indexer, 1, api.PodRunning, controllerSpec, "pod") - - // Creates a replica and sets expectations - controllerSpec.Status.Replicas = 1 - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 1, 0) - - // Expectations prevents replicas but not an update on status - controllerSpec.Status.Replicas = 0 - fakePodControl.Clear() - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) - - // Get the key for the controller - rcKey, err := controller.KeyFunc(controllerSpec) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", controllerSpec, err) - } - - // Lowering expectations should lead to a sync that creates a replica, however the - // fakePodControl error will prevent this, leaving expectations at 0, 0 - manager.expectations.CreationObserved(rcKey) - controllerSpec.Status.Replicas = 1 - fakePodControl.Clear() - fakePodControl.Err = fmt.Errorf("Fake Error") - - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) - - // This replica should not need a Lowering of expectations, since the previous create failed - fakePodControl.Err = nil - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 1, 0) - - // 1 PUT for the rc status during dormancy window. - // Note that the pod creates go through pod control so they're not recorded. - fakeHandler.ValidateRequestCount(t, 1) -} - -func TestPodControllerLookup(t *testing.T) { - manager := NewReplicationManagerFromClient(clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}), controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - testCases := []struct { - inRCs []*api.ReplicationController - pod *api.Pod - outRCName string - }{ - // pods without labels don't match any rcs - { - inRCs: []*api.ReplicationController{ - {ObjectMeta: api.ObjectMeta{Name: "basic"}}}, - pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo1", Namespace: api.NamespaceAll}}, - outRCName: "", - }, - // Matching labels, not namespace - { - inRCs: []*api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "bar"}, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo2", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}}, - outRCName: "", - }, - // Matching ns and labels returns the key to the rc, not the rc name - { - inRCs: []*api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"foo": "bar"}, - }, - }, - }, - pod: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo3", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}}, - outRCName: "bar", - }, - } - for _, c := range testCases { - for _, r := range c.inRCs { - manager.rcStore.Indexer.Add(r) - } - if rc := manager.getPodController(c.pod); rc != nil { - if c.outRCName != rc.Name { - t.Errorf("Got controller %+v expected %+v", rc.Name, c.outRCName) - } - } else if c.outRCName != "" { - t.Errorf("Expected a controller %v pod %v, found none", c.outRCName, c.pod.Name) - } - } -} - -func TestWatchControllers(t *testing.T) { - fakeWatch := watch.NewFake() - c := &fake.Clientset{} - c.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - var testControllerSpec api.ReplicationController - received := make(chan string) - - // The update sent through the fakeWatcher should make its way into the workqueue, - // and eventually into the syncHandler. The handler validates the received controller - // and closes the received channel to indicate that the test can finish. - manager.syncHandler = func(key string) error { - - obj, exists, err := manager.rcStore.Indexer.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find controller under key %v", key) - } - controllerSpec := *obj.(*api.ReplicationController) - if !api.Semantic.DeepDerivative(controllerSpec, testControllerSpec) { - t.Errorf("Expected %#v, but got %#v", testControllerSpec, controllerSpec) - } - close(received) - return nil - } - // Start only the rc watcher and the workqueue, send a watch event, - // and make sure it hits the sync method. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.rcController.Run(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - testControllerSpec.Name = "foo" - fakeWatch.Add(&testControllerSpec) - - select { - case <-received: - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected 1 call but got 0") - } -} - -func TestWatchPods(t *testing.T) { - fakeWatch := watch.NewFake() - c := &fake.Clientset{} - c.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil)) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - // Put one rc and one pod into the controller's stores - testControllerSpec := newReplicationController(1) - manager.rcStore.Indexer.Add(testControllerSpec) - received := make(chan string) - // The pod update sent through the fakeWatcher should figure out the managing rc and - // send it into the syncHandler. - manager.syncHandler = func(key string) error { - - obj, exists, err := manager.rcStore.Indexer.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find controller under key %v", key) - } - controllerSpec := obj.(*api.ReplicationController) - if !api.Semantic.DeepDerivative(controllerSpec, testControllerSpec) { - t.Errorf("\nExpected %#v,\nbut got %#v", testControllerSpec, controllerSpec) - } - close(received) - return nil - } - // Start only the pod watcher and the workqueue, send a watch event, - // and make sure it hits the sync method for the right rc. - stopCh := make(chan struct{}) - defer close(stopCh) - go manager.podController.Run(stopCh) - go manager.internalPodInformer.Run(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - pods := newPodList(nil, 1, api.PodRunning, testControllerSpec, "pod") - testPod := pods.Items[0] - testPod.Status.Phase = api.PodFailed - fakeWatch.Add(&testPod) - - select { - case <-received: - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected 1 call but got 0") - } -} - -func TestUpdatePods(t *testing.T) { - manager := NewReplicationManagerFromClient(fake.NewSimpleClientset(), controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - received := make(chan string) - - manager.syncHandler = func(key string) error { - obj, exists, err := manager.rcStore.Indexer.GetByKey(key) - if !exists || err != nil { - t.Errorf("Expected to find controller under key %v", key) - } - received <- obj.(*api.ReplicationController).Name - return nil - } - - stopCh := make(chan struct{}) - defer close(stopCh) - go wait.Until(manager.worker, 10*time.Millisecond, stopCh) - - // Put 2 rcs and one pod into the controller's stores - testControllerSpec1 := newReplicationController(1) - manager.rcStore.Indexer.Add(testControllerSpec1) - testControllerSpec2 := *testControllerSpec1 - testControllerSpec2.Spec.Selector = map[string]string{"bar": "foo"} - testControllerSpec2.Name = "barfoo" - manager.rcStore.Indexer.Add(&testControllerSpec2) - - // Put one pod in the podStore - pod1 := newPodList(manager.podStore.Indexer, 1, api.PodRunning, testControllerSpec1, "pod").Items[0] - pod2 := pod1 - pod2.Labels = testControllerSpec2.Spec.Selector - - // Send an update of the same pod with modified labels, and confirm we get a sync request for - // both controllers - manager.updatePod(&pod1, &pod2) - - expected := sets.NewString(testControllerSpec1.Name, testControllerSpec2.Name) - for _, name := range expected.List() { - t.Logf("Expecting update for %+v", name) - select { - case got := <-received: - if !expected.Has(got) { - t.Errorf("Expected keys %#v got %v", expected, got) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("Expected update notifications for controllers within 100ms each") - } - } -} - -func TestControllerUpdateRequeue(t *testing.T) { - // This server should force a requeue of the controller because it fails to update status.Replicas. - fakeHandler := utiltesting.FakeHandler{ - StatusCode: 500, - ResponseBody: "", - } - testServer := httptest.NewServer(&fakeHandler) - defer testServer.Close() - - c := clientset.NewForConfigOrDie(&restclient.Config{Host: testServer.URL, ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, BurstReplicas, 0) - manager.podStoreSynced = alwaysReady - - rc := newReplicationController(1) - manager.rcStore.Indexer.Add(rc) - rc.Status = api.ReplicationControllerStatus{Replicas: 2} - newPodList(manager.podStore.Indexer, 1, api.PodRunning, rc, "pod") - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - manager.syncReplicationController(getKey(rc, t)) - - ch := make(chan interface{}) - go func() { - item, _ := manager.queue.Get() - ch <- item - }() - select { - case key := <-ch: - expectedKey := getKey(rc, t) - if key != expectedKey { - t.Errorf("Expected requeue of controller with key %s got %s", expectedKey, key) - } - case <-time.After(wait.ForeverTestTimeout): - manager.queue.ShutDown() - t.Errorf("Expected to find an rc in the queue, found none.") - } - // 1 Update and 1 GET, both of which fail - fakeHandler.ValidateRequestCount(t, 2) -} - -func TestControllerUpdateStatusWithFailure(t *testing.T) { - rc := newReplicationController(1) - c := &fake.Clientset{} - c.AddReactor("get", "replicationcontrollers", func(action core.Action) (bool, runtime.Object, error) { - return true, rc, nil - }) - c.AddReactor("*", "*", func(action core.Action) (bool, runtime.Object, error) { - return true, &api.ReplicationController{}, fmt.Errorf("Fake error") - }) - fakeRCClient := c.Core().ReplicationControllers("default") - numReplicas := 10 - updateReplicaCount(fakeRCClient, *rc, numReplicas, 0) - updates, gets := 0, 0 - for _, a := range c.Actions() { - if a.GetResource().Resource != "replicationcontrollers" { - t.Errorf("Unexpected action %+v", a) - continue - } - - switch action := a.(type) { - case core.GetAction: - gets++ - // Make sure the get is for the right rc even though the update failed. - if action.GetName() != rc.Name { - t.Errorf("Expected get for rc %v, got %+v instead", rc.Name, action.GetName()) - } - case core.UpdateAction: - updates++ - // Confirm that the update has the right status.Replicas even though the Get - // returned an rc with replicas=1. - if c, ok := action.GetObject().(*api.ReplicationController); !ok { - t.Errorf("Expected an rc as the argument to update, got %T", c) - } else if c.Status.Replicas != int32(numReplicas) { - t.Errorf("Expected update for rc to contain replicas %v, got %v instead", - numReplicas, c.Status.Replicas) - } - default: - t.Errorf("Unexpected action %+v", a) - break - } - } - if gets != 1 || updates != 2 { - t.Errorf("Expected 1 get and 2 updates, got %d gets %d updates", gets, updates) - } -} - -// TODO: This test is too hairy for a unittest. It should be moved to an E2E suite. -func doTestControllerBurstReplicas(t *testing.T, burstReplicas, numReplicas int) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, burstReplicas, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - controllerSpec := newReplicationController(numReplicas) - manager.rcStore.Indexer.Add(controllerSpec) - - expectedPods := 0 - pods := newPodList(nil, numReplicas, api.PodPending, controllerSpec, "pod") - - rcKey, err := controller.KeyFunc(controllerSpec) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", controllerSpec, err) - } - - // Size up the controller, then size it down, and confirm the expected create/delete pattern - for _, replicas := range []int{numReplicas, 0} { - - controllerSpec.Spec.Replicas = int32(replicas) - manager.rcStore.Indexer.Add(controllerSpec) - - for i := 0; i < numReplicas; i += burstReplicas { - manager.syncReplicationController(getKey(controllerSpec, t)) - - // The store accrues active pods. It's also used by the rc to determine how many - // replicas to create. - activePods := len(manager.podStore.Indexer.List()) - if replicas != 0 { - // This is the number of pods currently "in flight". They were created by the rc manager above, - // which then puts the rc to sleep till all of them have been observed. - expectedPods = replicas - activePods - if expectedPods > burstReplicas { - expectedPods = burstReplicas - } - // This validates the rc manager sync actually created pods - validateSyncReplication(t, &fakePodControl, expectedPods, 0) - - // This simulates the watch events for all but 1 of the expected pods. - // None of these should wake the controller because it has expectations==BurstReplicas. - for i := 0; i < expectedPods-1; i++ { - manager.podStore.Indexer.Add(&pods.Items[i]) - manager.addPod(&pods.Items[i]) - } - - podExp, exists, err := manager.expectations.GetExpectations(rcKey) - if !exists || err != nil { - t.Fatalf("Did not find expectations for rc.") - } - if add, _ := podExp.GetExpectations(); add != 1 { - t.Fatalf("Expectations are wrong %v", podExp) - } - } else { - expectedPods = (replicas - activePods) * -1 - if expectedPods > burstReplicas { - expectedPods = burstReplicas - } - validateSyncReplication(t, &fakePodControl, 0, expectedPods) - - // To accurately simulate a watch we must delete the exact pods - // the rc is waiting for. - expectedDels := manager.expectations.GetUIDs(getKey(controllerSpec, t)) - podsToDelete := []*api.Pod{} - for _, key := range expectedDels.List() { - nsName := strings.Split(key, "/") - podsToDelete = append(podsToDelete, &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: nsName[1], - Namespace: nsName[0], - Labels: controllerSpec.Spec.Selector, - }, - }) - } - // Don't delete all pods because we confirm that the last pod - // has exactly one expectation at the end, to verify that we - // don't double delete. - for i := range podsToDelete[1:] { - manager.podStore.Indexer.Delete(podsToDelete[i]) - manager.deletePod(podsToDelete[i]) - } - podExp, exists, err := manager.expectations.GetExpectations(rcKey) - if !exists || err != nil { - t.Fatalf("Did not find expectations for rc.") - } - if _, del := podExp.GetExpectations(); del != 1 { - t.Fatalf("Expectations are wrong %v", podExp) - } - } - - // Check that the rc didn't take any action for all the above pods - fakePodControl.Clear() - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) - - // Create/Delete the last pod - // The last add pod will decrease the expectation of the rc to 0, - // which will cause it to create/delete the remaining replicas up to burstReplicas. - if replicas != 0 { - manager.podStore.Indexer.Add(&pods.Items[expectedPods-1]) - manager.addPod(&pods.Items[expectedPods-1]) - } else { - expectedDel := manager.expectations.GetUIDs(getKey(controllerSpec, t)) - if expectedDel.Len() != 1 { - t.Fatalf("Waiting on unexpected number of deletes.") - } - nsName := strings.Split(expectedDel.List()[0], "/") - lastPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: nsName[1], - Namespace: nsName[0], - Labels: controllerSpec.Spec.Selector, - }, - } - manager.podStore.Indexer.Delete(lastPod) - manager.deletePod(lastPod) - } - pods.Items = pods.Items[expectedPods:] - } - - // Confirm that we've created the right number of replicas - activePods := int32(len(manager.podStore.Indexer.List())) - if activePods != controllerSpec.Spec.Replicas { - t.Fatalf("Unexpected number of active pods, expected %d, got %d", controllerSpec.Spec.Replicas, activePods) - } - // Replenish the pod list, since we cut it down sizing up - pods = newPodList(nil, replicas, api.PodRunning, controllerSpec, "pod") - } -} - -func TestControllerBurstReplicas(t *testing.T) { - doTestControllerBurstReplicas(t, 5, 30) - doTestControllerBurstReplicas(t, 5, 12) - doTestControllerBurstReplicas(t, 3, 2) -} - -type FakeRCExpectations struct { - *controller.ControllerExpectations - satisfied bool - expSatisfied func() -} - -func (fe FakeRCExpectations) SatisfiedExpectations(controllerKey string) bool { - fe.expSatisfied() - return fe.satisfied -} - -// TestRCSyncExpectations tests that a pod cannot sneak in between counting active pods -// and checking expectations. -func TestRCSyncExpectations(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, 2, 0) - manager.podStoreSynced = alwaysReady - manager.podControl = &fakePodControl - - controllerSpec := newReplicationController(2) - manager.rcStore.Indexer.Add(controllerSpec) - pods := newPodList(nil, 2, api.PodPending, controllerSpec, "pod") - manager.podStore.Indexer.Add(&pods.Items[0]) - postExpectationsPod := pods.Items[1] - - manager.expectations = controller.NewUIDTrackingControllerExpectations(FakeRCExpectations{ - controller.NewControllerExpectations(), true, func() { - // If we check active pods before checking expectataions, the rc - // will create a new replica because it doesn't see this pod, but - // has fulfilled its expectations. - manager.podStore.Indexer.Add(&postExpectationsPod) - }, - }) - manager.syncReplicationController(getKey(controllerSpec, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) -} - -func TestDeleteControllerAndExpectations(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - rc := newReplicationController(1) - manager.rcStore.Indexer.Add(rc) - - fakePodControl := controller.FakePodControl{} - manager.podControl = &fakePodControl - - // This should set expectations for the rc - manager.syncReplicationController(getKey(rc, t)) - validateSyncReplication(t, &fakePodControl, 1, 0) - fakePodControl.Clear() - - // Get the RC key - rcKey, err := controller.KeyFunc(rc) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", rc, err) - } - - // This is to simulate a concurrent addPod, that has a handle on the expectations - // as the controller deletes it. - podExp, exists, err := manager.expectations.GetExpectations(rcKey) - if !exists || err != nil { - t.Errorf("No expectations found for rc") - } - manager.rcStore.Indexer.Delete(rc) - manager.syncReplicationController(getKey(rc, t)) - - if _, exists, err = manager.expectations.GetExpectations(rcKey); exists { - t.Errorf("Found expectaions, expected none since the rc has been deleted.") - } - - // This should have no effect, since we've deleted the rc. - podExp.Add(-1, 0) - manager.podStore.Indexer.Replace(make([]interface{}, 0), "0") - manager.syncReplicationController(getKey(rc, t)) - validateSyncReplication(t, &fakePodControl, 0, 0) -} - -func TestRCManagerNotReady(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - fakePodControl := controller.FakePodControl{} - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, 2, 0) - manager.podControl = &fakePodControl - manager.podStoreSynced = func() bool { return false } - - // Simulates the rc reflector running before the pod reflector. We don't - // want to end up creating replicas in this case until the pod reflector - // has synced, so the rc manager should just requeue the rc. - controllerSpec := newReplicationController(1) - manager.rcStore.Indexer.Add(controllerSpec) - - rcKey := getKey(controllerSpec, t) - manager.syncReplicationController(rcKey) - validateSyncReplication(t, &fakePodControl, 0, 0) - queueRC, _ := manager.queue.Get() - if queueRC != rcKey { - t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC) - } - - manager.podStoreSynced = alwaysReady - manager.syncReplicationController(rcKey) - validateSyncReplication(t, &fakePodControl, 1, 0) -} - -// shuffle returns a new shuffled list of container controllers. -func shuffle(controllers []*api.ReplicationController) []*api.ReplicationController { - numControllers := len(controllers) - randIndexes := rand.Perm(numControllers) - shuffled := make([]*api.ReplicationController, numControllers) - for i := 0; i < numControllers; i++ { - shuffled[i] = controllers[randIndexes[i]] - } - return shuffled -} - -func TestOverlappingRCs(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - - for i := 0; i < 5; i++ { - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - // Create 10 rcs, shuffled them randomly and insert them into the rc manager's store - var controllers []*api.ReplicationController - for j := 1; j < 10; j++ { - controllerSpec := newReplicationController(1) - controllerSpec.CreationTimestamp = unversioned.Date(2014, time.December, j, 0, 0, 0, 0, time.Local) - controllerSpec.Name = string(util.NewUUID()) - controllers = append(controllers, controllerSpec) - } - shuffledControllers := shuffle(controllers) - for j := range shuffledControllers { - manager.rcStore.Indexer.Add(shuffledControllers[j]) - } - // Add a pod and make sure only the oldest rc is synced - pods := newPodList(nil, 1, api.PodPending, controllers[0], "pod") - rcKey := getKey(controllers[0], t) - - manager.addPod(&pods.Items[0]) - queueRC, _ := manager.queue.Get() - if queueRC != rcKey { - t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC) - } - } -} - -func TestDeletionTimestamp(t *testing.T) { - c := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(c, controller.NoResyncPeriodFunc, 10, 0) - manager.podStoreSynced = alwaysReady - - controllerSpec := newReplicationController(1) - manager.rcStore.Indexer.Add(controllerSpec) - rcKey, err := controller.KeyFunc(controllerSpec) - if err != nil { - t.Errorf("Couldn't get key for object %+v: %v", controllerSpec, err) - } - pod := newPodList(nil, 1, api.PodPending, controllerSpec, "pod").Items[0] - pod.DeletionTimestamp = &unversioned.Time{Time: time.Now()} - manager.expectations.ExpectDeletions(rcKey, []string{controller.PodKey(&pod)}) - - // A pod added with a deletion timestamp should decrement deletions, not creations. - manager.addPod(&pod) - - queueRC, _ := manager.queue.Get() - if queueRC != rcKey { - t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC) - } - manager.queue.Done(rcKey) - - podExp, exists, err := manager.expectations.GetExpectations(rcKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // An update from no deletion timestamp to having one should be treated - // as a deletion. - oldPod := newPodList(nil, 1, api.PodPending, controllerSpec, "pod").Items[0] - manager.expectations.ExpectDeletions(rcKey, []string{controller.PodKey(&pod)}) - manager.updatePod(&oldPod, &pod) - - queueRC, _ = manager.queue.Get() - if queueRC != rcKey { - t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC) - } - manager.queue.Done(rcKey) - - podExp, exists, err = manager.expectations.GetExpectations(rcKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // An update to the pod (including an update to the deletion timestamp) - // should not be counted as a second delete. - secondPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: pod.Namespace, - Name: "secondPod", - Labels: pod.Labels, - }, - } - manager.expectations.ExpectDeletions(rcKey, []string{controller.PodKey(secondPod)}) - oldPod.DeletionTimestamp = &unversioned.Time{Time: time.Now()} - manager.updatePod(&oldPod, &pod) - - podExp, exists, err = manager.expectations.GetExpectations(rcKey) - if !exists || err != nil || podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // A pod with a non-nil deletion timestamp should also be ignored by the - // delete handler, because it's already been counted in the update. - manager.deletePod(&pod) - podExp, exists, err = manager.expectations.GetExpectations(rcKey) - if !exists || err != nil || podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } - - // Deleting the second pod should clear expectations. - manager.deletePod(secondPod) - - queueRC, _ = manager.queue.Get() - if queueRC != rcKey { - t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC) - } - manager.queue.Done(rcKey) - - podExp, exists, err = manager.expectations.GetExpectations(rcKey) - if !exists || err != nil || !podExp.Fulfilled() { - t.Fatalf("Wrong expectations %+v", podExp) - } -} - -func BenchmarkGetPodControllerMultiNS(b *testing.B) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - - const nsNum = 1000 - - pods := []api.Pod{} - for i := 0; i < nsNum; i++ { - ns := fmt.Sprintf("ns-%d", i) - for j := 0; j < 10; j++ { - rcName := fmt.Sprintf("rc-%d", j) - for k := 0; k < 10; k++ { - podName := fmt.Sprintf("pod-%d-%d", j, k) - pods = append(pods, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: podName, - Namespace: ns, - Labels: map[string]string{"rcName": rcName}, - }, - }) - } - } - } - - for i := 0; i < nsNum; i++ { - ns := fmt.Sprintf("ns-%d", i) - for j := 0; j < 10; j++ { - rcName := fmt.Sprintf("rc-%d", j) - manager.rcStore.Indexer.Add(&api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: rcName, Namespace: ns}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"rcName": rcName}, - }, - }) - } - } - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - for _, pod := range pods { - manager.getPodController(&pod) - } - } -} - -func BenchmarkGetPodControllerSingleNS(b *testing.B) { - client := clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}) - manager := NewReplicationManagerFromClient(client, controller.NoResyncPeriodFunc, BurstReplicas, 0) - - const rcNum = 1000 - const replicaNum = 3 - - pods := []api.Pod{} - for i := 0; i < rcNum; i++ { - rcName := fmt.Sprintf("rc-%d", i) - for j := 0; j < replicaNum; j++ { - podName := fmt.Sprintf("pod-%d-%d", i, j) - pods = append(pods, api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: podName, - Namespace: "foo", - Labels: map[string]string{"rcName": rcName}, - }, - }) - } - } - - for i := 0; i < rcNum; i++ { - rcName := fmt.Sprintf("rc-%d", i) - manager.rcStore.Indexer.Add(&api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: rcName, Namespace: "foo"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{"rcName": rcName}, - }, - }) - } - b.ResetTimer() - - for i := 0; i < b.N; i++ { - for _, pod := range pods { - manager.getPodController(&pod) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_utils.go deleted file mode 100644 index 0383fa946..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/replication/replication_controller_utils.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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. -*/ - -// If you make changes to this file, you should also make the corresponding change in ReplicaSet. - -package replication - -import ( - "fmt" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" -) - -// updateReplicaCount attempts to update the Status.Replicas of the given controller, with a single GET/PUT retry. -func updateReplicaCount(rcClient unversionedcore.ReplicationControllerInterface, controller api.ReplicationController, numReplicas, numFullyLabeledReplicas int) (updateErr error) { - // This is the steady state. It happens when the rc doesn't have any expectations, since - // we do a periodic relist every 30s. If the generations differ but the replicas are - // the same, a caller might've resized to the same replica count. - if int(controller.Status.Replicas) == numReplicas && - int(controller.Status.FullyLabeledReplicas) == numFullyLabeledReplicas && - controller.Generation == controller.Status.ObservedGeneration { - return nil - } - // Save the generation number we acted on, otherwise we might wrongfully indicate - // that we've seen a spec update when we retry. - // TODO: This can clobber an update if we allow multiple agents to write to the - // same status. - generation := controller.Generation - - var getErr error - for i, rc := 0, &controller; ; i++ { - glog.V(4).Infof(fmt.Sprintf("Updating replica count for rc: %s/%s, ", controller.Namespace, controller.Name) + - fmt.Sprintf("replicas %d->%d (need %d), ", controller.Status.Replicas, numReplicas, controller.Spec.Replicas) + - fmt.Sprintf("fullyLabeledReplicas %d->%d, ", controller.Status.FullyLabeledReplicas, numFullyLabeledReplicas) + - fmt.Sprintf("sequence No: %v->%v", controller.Status.ObservedGeneration, generation)) - - rc.Status = api.ReplicationControllerStatus{Replicas: int32(numReplicas), FullyLabeledReplicas: int32(numFullyLabeledReplicas), ObservedGeneration: generation} - _, updateErr = rcClient.UpdateStatus(rc) - if updateErr == nil || i >= statusUpdateRetries { - return updateErr - } - // Update the controller with the latest resource version for the next poll - if rc, getErr = rcClient.Get(controller.Name); getErr != nil { - // If the GET fails we can't trust status.Replicas anymore. This error - // is bound to be more interesting than the update failure. - return getErr - } - } -} - -// OverlappingControllers sorts a list of controllers by creation timestamp, using their names as a tie breaker. -type OverlappingControllers []api.ReplicationController - -func (o OverlappingControllers) Len() int { return len(o) } -func (o OverlappingControllers) Swap(i, j int) { o[i], o[j] = o[j], o[i] } - -func (o OverlappingControllers) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { - return o[i].Name < o[j].Name - } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/doc.go deleted file mode 100644 index a83ad10dd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// resourcequota contains a controller that makes resource quota usage observations -package resourcequota diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller.go deleted file mode 100644 index a344bec87..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller.go +++ /dev/null @@ -1,231 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 resourcequota - -import ( - "fmt" - - "github.com/golang/glog" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/controller/framework/informers" - "k8s.io/kubernetes/pkg/quota/evaluator/core" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/watch" -) - -// ReplenishmentFunc is a function that is invoked when controller sees a change -// that may require a quota to be replenished (i.e. object deletion, or object moved to terminal state) -type ReplenishmentFunc func(groupKind unversioned.GroupKind, namespace string, object runtime.Object) - -// ReplenishmentControllerOptions is an options struct that tells a factory -// how to configure a controller that can inform the quota system it should -// replenish quota -type ReplenishmentControllerOptions struct { - // The kind monitored for replenishment - GroupKind unversioned.GroupKind - // The period that should be used to re-sync the monitored resource - ResyncPeriod controller.ResyncPeriodFunc - // The function to invoke when a change is observed that should trigger - // replenishment - ReplenishmentFunc ReplenishmentFunc -} - -// PodReplenishmentUpdateFunc will replenish if the old pod was quota tracked but the new is not -func PodReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) func(oldObj, newObj interface{}) { - return func(oldObj, newObj interface{}) { - oldPod := oldObj.(*api.Pod) - newPod := newObj.(*api.Pod) - if core.QuotaPod(oldPod) && !core.QuotaPod(newPod) { - options.ReplenishmentFunc(options.GroupKind, newPod.Namespace, newPod) - } - } -} - -// ObjectReplenenishmentDeleteFunc will replenish on every delete -func ObjectReplenishmentDeleteFunc(options *ReplenishmentControllerOptions) func(obj interface{}) { - return func(obj interface{}) { - metaObject, err := meta.Accessor(obj) - if err != nil { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - glog.Errorf("replenishment controller could not get object from tombstone %+v, could take up to %v before quota is replenished", obj, options.ResyncPeriod()) - utilruntime.HandleError(err) - return - } - metaObject, err = meta.Accessor(tombstone.Obj) - if err != nil { - glog.Errorf("replenishment controller tombstone contained object that is not a meta %+v, could take up to %v before quota is replenished", tombstone.Obj, options.ResyncPeriod()) - utilruntime.HandleError(err) - return - } - } - options.ReplenishmentFunc(options.GroupKind, metaObject.GetNamespace(), nil) - } -} - -// ReplenishmentControllerFactory knows how to build replenishment controllers -type ReplenishmentControllerFactory interface { - // NewController returns a controller configured with the specified options. - // This method is NOT thread-safe. - NewController(options *ReplenishmentControllerOptions) (framework.ControllerInterface, error) -} - -// replenishmentControllerFactory implements ReplenishmentControllerFactory -type replenishmentControllerFactory struct { - kubeClient clientset.Interface - podInformer framework.SharedInformer -} - -// NewReplenishmentControllerFactory returns a factory that knows how to build controllers -// to replenish resources when updated or deleted -func NewReplenishmentControllerFactory(podInformer framework.SharedInformer, kubeClient clientset.Interface) ReplenishmentControllerFactory { - return &replenishmentControllerFactory{ - kubeClient: kubeClient, - podInformer: podInformer, - } -} - -func NewReplenishmentControllerFactoryFromClient(kubeClient clientset.Interface) ReplenishmentControllerFactory { - return NewReplenishmentControllerFactory(nil, kubeClient) -} - -func (r *replenishmentControllerFactory) NewController(options *ReplenishmentControllerOptions) (framework.ControllerInterface, error) { - var result framework.ControllerInterface - if r.kubeClient != nil && r.kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("replenishment_controller", r.kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - switch options.GroupKind { - case api.Kind("Pod"): - if r.podInformer != nil { - r.podInformer.AddEventHandler(framework.ResourceEventHandlerFuncs{ - UpdateFunc: PodReplenishmentUpdateFunc(options), - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }) - result = r.podInformer.GetController() - break - } - - r.podInformer = informers.CreateSharedPodInformer(r.kubeClient, options.ResyncPeriod()) - result = r.podInformer - - case api.Kind("Service"): - _, result = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return r.kubeClient.Core().Services(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return r.kubeClient.Core().Services(api.NamespaceAll).Watch(options) - }, - }, - &api.Service{}, - options.ResyncPeriod(), - framework.ResourceEventHandlerFuncs{ - UpdateFunc: ServiceReplenishmentUpdateFunc(options), - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }, - ) - case api.Kind("ReplicationController"): - _, result = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return r.kubeClient.Core().ReplicationControllers(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return r.kubeClient.Core().ReplicationControllers(api.NamespaceAll).Watch(options) - }, - }, - &api.ReplicationController{}, - options.ResyncPeriod(), - framework.ResourceEventHandlerFuncs{ - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }, - ) - case api.Kind("PersistentVolumeClaim"): - _, result = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return r.kubeClient.Core().PersistentVolumeClaims(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return r.kubeClient.Core().PersistentVolumeClaims(api.NamespaceAll).Watch(options) - }, - }, - &api.PersistentVolumeClaim{}, - options.ResyncPeriod(), - framework.ResourceEventHandlerFuncs{ - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }, - ) - case api.Kind("Secret"): - _, result = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return r.kubeClient.Core().Secrets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return r.kubeClient.Core().Secrets(api.NamespaceAll).Watch(options) - }, - }, - &api.Secret{}, - options.ResyncPeriod(), - framework.ResourceEventHandlerFuncs{ - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }, - ) - case api.Kind("ConfigMap"): - _, result = framework.NewInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return r.kubeClient.Core().ConfigMaps(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return r.kubeClient.Core().ConfigMaps(api.NamespaceAll).Watch(options) - }, - }, - &api.ConfigMap{}, - options.ResyncPeriod(), - framework.ResourceEventHandlerFuncs{ - DeleteFunc: ObjectReplenishmentDeleteFunc(options), - }, - ) - default: - return nil, fmt.Errorf("no replenishment controller available for %s", options.GroupKind) - } - return result, nil -} - -// ServiceReplenishmentUpdateFunc will replenish if the old service was quota tracked but the new is not -func ServiceReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) func(oldObj, newObj interface{}) { - return func(oldObj, newObj interface{}) { - oldService := oldObj.(*api.Service) - newService := newObj.(*api.Service) - if core.QuotaServiceType(oldService) || core.QuotaServiceType(newService) { - options.ReplenishmentFunc(options.GroupKind, newService.Namespace, newService) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller_test.go deleted file mode 100644 index b7bb66502..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/replenishment_controller_test.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 resourcequota - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" -) - -// testReplenishment lets us test replenishment functions are invoked -type testReplenishment struct { - groupKind unversioned.GroupKind - namespace string -} - -// mock function that holds onto the last kind that was replenished -func (t *testReplenishment) Replenish(groupKind unversioned.GroupKind, namespace string, object runtime.Object) { - t.groupKind = groupKind - t.namespace = namespace -} - -func TestPodReplenishmentUpdateFunc(t *testing.T) { - mockReplenish := &testReplenishment{} - options := ReplenishmentControllerOptions{ - GroupKind: api.Kind("Pod"), - ReplenishmentFunc: mockReplenish.Replenish, - ResyncPeriod: controller.NoResyncPeriodFunc, - } - oldPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "pod"}, - Status: api.PodStatus{Phase: api.PodRunning}, - } - newPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "pod"}, - Status: api.PodStatus{Phase: api.PodFailed}, - } - updateFunc := PodReplenishmentUpdateFunc(&options) - updateFunc(oldPod, newPod) - if mockReplenish.groupKind != api.Kind("Pod") { - t.Errorf("Unexpected group kind %v", mockReplenish.groupKind) - } - if mockReplenish.namespace != oldPod.Namespace { - t.Errorf("Unexpected namespace %v", mockReplenish.namespace) - } -} - -func TestObjectReplenishmentDeleteFunc(t *testing.T) { - mockReplenish := &testReplenishment{} - options := ReplenishmentControllerOptions{ - GroupKind: api.Kind("Pod"), - ReplenishmentFunc: mockReplenish.Replenish, - ResyncPeriod: controller.NoResyncPeriodFunc, - } - oldPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "pod"}, - Status: api.PodStatus{Phase: api.PodRunning}, - } - deleteFunc := ObjectReplenishmentDeleteFunc(&options) - deleteFunc(oldPod) - if mockReplenish.groupKind != api.Kind("Pod") { - t.Errorf("Unexpected group kind %v", mockReplenish.groupKind) - } - if mockReplenish.namespace != oldPod.Namespace { - t.Errorf("Unexpected namespace %v", mockReplenish.namespace) - } -} - -func TestServiceReplenishmentUpdateFunc(t *testing.T) { - mockReplenish := &testReplenishment{} - options := ReplenishmentControllerOptions{ - GroupKind: api.Kind("Service"), - ReplenishmentFunc: mockReplenish.Replenish, - ResyncPeriod: controller.NoResyncPeriodFunc, - } - oldService := &api.Service{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "mysvc"}, - Spec: api.ServiceSpec{ - Type: api.ServiceTypeNodePort, - Ports: []api.ServicePort{{ - Port: 80, - TargetPort: intstr.FromInt(80), - }}, - }, - } - newService := &api.Service{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "mysvc"}, - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - Ports: []api.ServicePort{{ - Port: 80, - TargetPort: intstr.FromInt(80), - }}}, - } - updateFunc := ServiceReplenishmentUpdateFunc(&options) - updateFunc(oldService, newService) - if mockReplenish.groupKind != api.Kind("Service") { - t.Errorf("Unexpected group kind %v", mockReplenish.groupKind) - } - if mockReplenish.namespace != oldService.Namespace { - t.Errorf("Unexpected namespace %v", mockReplenish.namespace) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller.go deleted file mode 100644 index cb965ef7e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller.go +++ /dev/null @@ -1,321 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 resourcequota - -import ( - "time" - - "github.com/golang/glog" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/quota" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/util/workqueue" - "k8s.io/kubernetes/pkg/watch" -) - -// ResourceQuotaControllerOptions holds options for creating a quota controller -type ResourceQuotaControllerOptions struct { - // Must have authority to list all quotas, and update quota status - KubeClient clientset.Interface - // Controls full recalculation of quota usage - ResyncPeriod controller.ResyncPeriodFunc - // Knows how to calculate usage - Registry quota.Registry - // Knows how to build controllers that notify replenishment events - ControllerFactory ReplenishmentControllerFactory - // Controls full resync of objects monitored for replenihsment. - ReplenishmentResyncPeriod controller.ResyncPeriodFunc - // List of GroupKind objects that should be monitored for replenishment at - // a faster frequency than the quota controller recalculation interval - GroupKindsToReplenish []unversioned.GroupKind -} - -// ResourceQuotaController is responsible for tracking quota usage status in the system -type ResourceQuotaController struct { - // Must have authority to list all resources in the system, and update quota status - kubeClient clientset.Interface - // An index of resource quota objects by namespace - rqIndexer cache.Indexer - // Watches changes to all resource quota - rqController *framework.Controller - // ResourceQuota objects that need to be synchronized - queue *workqueue.Type - // To allow injection of syncUsage for testing. - syncHandler func(key string) error - // function that controls full recalculation of quota usage - resyncPeriod controller.ResyncPeriodFunc - // knows how to calculate usage - registry quota.Registry - // controllers monitoring to notify for replenishment - replenishmentControllers []framework.ControllerInterface -} - -func NewResourceQuotaController(options *ResourceQuotaControllerOptions) *ResourceQuotaController { - // build the resource quota controller - rq := &ResourceQuotaController{ - kubeClient: options.KubeClient, - queue: workqueue.New(), - resyncPeriod: options.ResyncPeriod, - registry: options.Registry, - replenishmentControllers: []framework.ControllerInterface{}, - } - if options.KubeClient != nil && options.KubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("resource_quota_controller", options.KubeClient.Core().GetRESTClient().GetRateLimiter()) - } - // set the synchronization handler - rq.syncHandler = rq.syncResourceQuotaFromKey - - // build the controller that observes quota - rq.rqIndexer, rq.rqController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return rq.kubeClient.Core().ResourceQuotas(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return rq.kubeClient.Core().ResourceQuotas(api.NamespaceAll).Watch(options) - }, - }, - &api.ResourceQuota{}, - rq.resyncPeriod(), - framework.ResourceEventHandlerFuncs{ - AddFunc: rq.enqueueResourceQuota, - UpdateFunc: func(old, cur interface{}) { - // We are only interested in observing updates to quota.spec to drive updates to quota.status. - // We ignore all updates to quota.Status because they are all driven by this controller. - // IMPORTANT: - // We do not use this function to queue up a full quota recalculation. To do so, would require - // us to enqueue all quota.Status updates, and since quota.Status updates involve additional queries - // that cannot be backed by a cache and result in a full query of a namespace's content, we do not - // want to pay the price on spurious status updates. As a result, we have a separate routine that is - // responsible for enqueue of all resource quotas when doing a full resync (enqueueAll) - oldResourceQuota := old.(*api.ResourceQuota) - curResourceQuota := cur.(*api.ResourceQuota) - if quota.Equals(curResourceQuota.Spec.Hard, oldResourceQuota.Spec.Hard) { - return - } - rq.enqueueResourceQuota(curResourceQuota) - }, - // This will enter the sync loop and no-op, because the controller has been deleted from the store. - // Note that deleting a controller immediately after scaling it to 0 will not work. The recommended - // way of achieving this is by performing a `stop` operation on the controller. - DeleteFunc: rq.enqueueResourceQuota, - }, - cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}, - ) - - for _, groupKindToReplenish := range options.GroupKindsToReplenish { - controllerOptions := &ReplenishmentControllerOptions{ - GroupKind: groupKindToReplenish, - ResyncPeriod: options.ReplenishmentResyncPeriod, - ReplenishmentFunc: rq.replenishQuota, - } - replenishmentController, err := options.ControllerFactory.NewController(controllerOptions) - if err != nil { - glog.Warningf("quota controller unable to replenish %s due to %v, changes only accounted during full resync", groupKindToReplenish, err) - } else { - rq.replenishmentControllers = append(rq.replenishmentControllers, replenishmentController) - } - } - return rq -} - -// enqueueAll is called at the fullResyncPeriod interval to force a full recalculation of quota usage statistics -func (rq *ResourceQuotaController) enqueueAll() { - defer glog.V(4).Infof("Resource quota controller queued all resource quota for full calculation of usage") - for _, k := range rq.rqIndexer.ListKeys() { - rq.queue.Add(k) - } -} - -// obj could be an *api.ResourceQuota, or a DeletionFinalStateUnknown marker item. -func (rq *ResourceQuotaController) enqueueResourceQuota(obj interface{}) { - key, err := controller.KeyFunc(obj) - if err != nil { - glog.Errorf("Couldn't get key for object %+v: %v", obj, err) - return - } - rq.queue.Add(key) -} - -// worker runs a worker thread that just dequeues items, processes them, and marks them done. -// It enforces that the syncHandler is never invoked concurrently with the same key. -func (rq *ResourceQuotaController) worker() { - for { - func() { - key, quit := rq.queue.Get() - if quit { - return - } - defer rq.queue.Done(key) - err := rq.syncHandler(key.(string)) - if err != nil { - utilruntime.HandleError(err) - rq.queue.Add(key) - } - }() - } -} - -// Run begins quota controller using the specified number of workers -func (rq *ResourceQuotaController) Run(workers int, stopCh <-chan struct{}) { - defer utilruntime.HandleCrash() - go rq.rqController.Run(stopCh) - // the controllers that replenish other resources to respond rapidly to state changes - for _, replenishmentController := range rq.replenishmentControllers { - go replenishmentController.Run(stopCh) - } - // the workers that chug through the quota calculation backlog - for i := 0; i < workers; i++ { - go wait.Until(rq.worker, time.Second, stopCh) - } - // the timer for how often we do a full recalculation across all quotas - go wait.Until(func() { rq.enqueueAll() }, rq.resyncPeriod(), stopCh) - <-stopCh - glog.Infof("Shutting down ResourceQuotaController") - rq.queue.ShutDown() -} - -// syncResourceQuotaFromKey syncs a quota key -func (rq *ResourceQuotaController) syncResourceQuotaFromKey(key string) (err error) { - startTime := time.Now() - defer func() { - glog.V(4).Infof("Finished syncing resource quota %q (%v)", key, time.Now().Sub(startTime)) - }() - - obj, exists, err := rq.rqIndexer.GetByKey(key) - if !exists { - glog.Infof("Resource quota has been deleted %v", key) - return nil - } - if err != nil { - glog.Infof("Unable to retrieve resource quota %v from store: %v", key, err) - rq.queue.Add(key) - return err - } - quota := *obj.(*api.ResourceQuota) - return rq.syncResourceQuota(quota) -} - -// syncResourceQuota runs a complete sync of resource quota status across all known kinds -func (rq *ResourceQuotaController) syncResourceQuota(resourceQuota api.ResourceQuota) (err error) { - // quota is dirty if any part of spec hard limits differs from the status hard limits - dirty := !api.Semantic.DeepEqual(resourceQuota.Spec.Hard, resourceQuota.Status.Hard) - - // dirty tracks if the usage status differs from the previous sync, - // if so, we send a new usage with latest status - // if this is our first sync, it will be dirty by default, since we need track usage - dirty = dirty || (resourceQuota.Status.Hard == nil || resourceQuota.Status.Used == nil) - - // Create a usage object that is based on the quota resource version that will handle updates - // by default, we preserve the past usage observation, and set hard to the current spec - previousUsed := api.ResourceList{} - if resourceQuota.Status.Used != nil { - previousUsed = quota.Add(api.ResourceList{}, resourceQuota.Status.Used) - } - usage := api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{ - Name: resourceQuota.Name, - Namespace: resourceQuota.Namespace, - ResourceVersion: resourceQuota.ResourceVersion, - Labels: resourceQuota.Labels, - Annotations: resourceQuota.Annotations}, - Status: api.ResourceQuotaStatus{ - Hard: quota.Add(api.ResourceList{}, resourceQuota.Spec.Hard), - Used: previousUsed, - }, - } - - // find the intersection between the hard resources on the quota - // and the resources this controller can track to know what we can - // look to measure updated usage stats for - hardResources := quota.ResourceNames(usage.Status.Hard) - potentialResources := []api.ResourceName{} - evaluators := rq.registry.Evaluators() - for _, evaluator := range evaluators { - potentialResources = append(potentialResources, evaluator.MatchesResources()...) - } - matchedResources := quota.Intersection(hardResources, potentialResources) - - // sum the observed usage from each evaluator - newUsage := api.ResourceList{} - usageStatsOptions := quota.UsageStatsOptions{Namespace: resourceQuota.Namespace, Scopes: resourceQuota.Spec.Scopes} - for _, evaluator := range evaluators { - stats, err := evaluator.UsageStats(usageStatsOptions) - if err != nil { - return err - } - newUsage = quota.Add(newUsage, stats.Used) - } - - // mask the observed usage to only the set of resources tracked by this quota - // merge our observed usage with the quota usage status - // if the new usage is different than the last usage, we will need to do an update - newUsage = quota.Mask(newUsage, matchedResources) - for key, value := range newUsage { - usage.Status.Used[key] = value - } - - dirty = dirty || !quota.Equals(usage.Status.Used, resourceQuota.Status.Used) - - // there was a change observed by this controller that requires we update quota - if dirty { - _, err = rq.kubeClient.Core().ResourceQuotas(usage.Namespace).UpdateStatus(&usage) - return err - } - return nil -} - -// replenishQuota is a replenishment function invoked by a controller to notify that a quota should be recalculated -func (rq *ResourceQuotaController) replenishQuota(groupKind unversioned.GroupKind, namespace string, object runtime.Object) { - // check if the quota controller can evaluate this kind, if not, ignore it altogether... - evaluators := rq.registry.Evaluators() - evaluator, found := evaluators[groupKind] - if !found { - return - } - - // check if this namespace even has a quota... - indexKey := &api.ResourceQuota{} - indexKey.Namespace = namespace - resourceQuotas, err := rq.rqIndexer.Index("namespace", indexKey) - if err != nil { - glog.Errorf("quota controller could not find ResourceQuota associated with namespace: %s, could take up to %v before a quota replenishes", namespace, rq.resyncPeriod()) - } - if len(resourceQuotas) == 0 { - return - } - - // only queue those quotas that are tracking a resource associated with this kind. - matchedResources := evaluator.MatchesResources() - for i := range resourceQuotas { - resourceQuota := resourceQuotas[i].(*api.ResourceQuota) - resourceQuotaResources := quota.ResourceNames(resourceQuota.Status.Hard) - if len(quota.Intersection(matchedResources, resourceQuotaResources)) > 0 { - // TODO: make this support targeted replenishment to a specific kind, right now it does a full recalc on that quota. - rq.enqueueResourceQuota(resourceQuota) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller_test.go deleted file mode 100644 index 71ef5df79..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/resourcequota/resource_quota_controller_test.go +++ /dev/null @@ -1,302 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 resourcequota - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/quota/install" - "k8s.io/kubernetes/pkg/util/sets" -) - -func getResourceList(cpu, memory string) api.ResourceList { - res := api.ResourceList{} - if cpu != "" { - res[api.ResourceCPU] = resource.MustParse(cpu) - } - if memory != "" { - res[api.ResourceMemory] = resource.MustParse(memory) - } - return res -} - -func getResourceRequirements(requests, limits api.ResourceList) api.ResourceRequirements { - res := api.ResourceRequirements{} - res.Requests = requests - res.Limits = limits - return res -} - -func TestSyncResourceQuota(t *testing.T) { - podList := api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "pod-running", Namespace: "testing"}, - Status: api.PodStatus{Phase: api.PodRunning}, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "vol"}}, - Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", ""))}}, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "pod-running-2", Namespace: "testing"}, - Status: api.PodStatus{Phase: api.PodRunning}, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "vol"}}, - Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", ""))}}, - }, - }, - { - ObjectMeta: api.ObjectMeta{Name: "pod-failed", Namespace: "testing"}, - Status: api.PodStatus{Phase: api.PodFailed}, - Spec: api.PodSpec{ - Volumes: []api.Volume{{Name: "vol"}}, - Containers: []api.Container{{Name: "ctr", Image: "image", Resources: getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", ""))}}, - }, - }, - }, - } - resourceQuota := api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{Name: "quota", Namespace: "testing"}, - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("3"), - api.ResourceMemory: resource.MustParse("100Gi"), - api.ResourcePods: resource.MustParse("5"), - }, - }, - } - expectedUsage := api.ResourceQuota{ - Status: api.ResourceQuotaStatus{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("3"), - api.ResourceMemory: resource.MustParse("100Gi"), - api.ResourcePods: resource.MustParse("5"), - }, - Used: api.ResourceList{ - api.ResourceCPU: resource.MustParse("200m"), - api.ResourceMemory: resource.MustParse("2Gi"), - api.ResourcePods: resource.MustParse("2"), - }, - }, - } - - kubeClient := fake.NewSimpleClientset(&podList, &resourceQuota) - resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, - ResyncPeriod: controller.NoResyncPeriodFunc, - Registry: install.NewRegistry(kubeClient), - GroupKindsToReplenish: []unversioned.GroupKind{ - api.Kind("Pod"), - api.Kind("Service"), - api.Kind("ReplicationController"), - api.Kind("PersistentVolumeClaim"), - }, - ControllerFactory: NewReplenishmentControllerFactoryFromClient(kubeClient), - ReplenishmentResyncPeriod: controller.NoResyncPeriodFunc, - } - quotaController := NewResourceQuotaController(resourceQuotaControllerOptions) - err := quotaController.syncResourceQuota(resourceQuota) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - expectedActionSet := sets.NewString( - strings.Join([]string{"list", "replicationcontrollers", ""}, "-"), - strings.Join([]string{"list", "services", ""}, "-"), - strings.Join([]string{"list", "pods", ""}, "-"), - strings.Join([]string{"list", "resourcequotas", ""}, "-"), - strings.Join([]string{"list", "secrets", ""}, "-"), - strings.Join([]string{"list", "persistentvolumeclaims", ""}, "-"), - strings.Join([]string{"update", "resourcequotas", "status"}, "-"), - ) - actionSet := sets.NewString() - for _, action := range kubeClient.Actions() { - actionSet.Insert(strings.Join([]string{action.GetVerb(), action.GetResource().Resource, action.GetSubresource()}, "-")) - } - if !actionSet.HasAll(expectedActionSet.List()...) { - t.Errorf("Expected actions:\n%v\n but got:\n%v\nDifference:\n%v", expectedActionSet, actionSet, expectedActionSet.Difference(actionSet)) - } - - lastActionIndex := len(kubeClient.Actions()) - 1 - usage := kubeClient.Actions()[lastActionIndex].(core.UpdateAction).GetObject().(*api.ResourceQuota) - - // ensure hard and used limits are what we expected - for k, v := range expectedUsage.Status.Hard { - actual := usage.Status.Hard[k] - actualValue := actual.String() - expectedValue := v.String() - if expectedValue != actualValue { - t.Errorf("Usage Hard: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) - } - } - for k, v := range expectedUsage.Status.Used { - actual := usage.Status.Used[k] - actualValue := actual.String() - expectedValue := v.String() - if expectedValue != actualValue { - t.Errorf("Usage Used: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) - } - } -} - -func TestSyncResourceQuotaSpecChange(t *testing.T) { - resourceQuota := api.ResourceQuota{ - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("4"), - }, - }, - Status: api.ResourceQuotaStatus{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("3"), - }, - Used: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - }, - }, - } - - expectedUsage := api.ResourceQuota{ - Status: api.ResourceQuotaStatus{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("4"), - }, - Used: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - }, - }, - } - - kubeClient := fake.NewSimpleClientset(&resourceQuota) - resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, - ResyncPeriod: controller.NoResyncPeriodFunc, - Registry: install.NewRegistry(kubeClient), - GroupKindsToReplenish: []unversioned.GroupKind{ - api.Kind("Pod"), - api.Kind("Service"), - api.Kind("ReplicationController"), - api.Kind("PersistentVolumeClaim"), - }, - ControllerFactory: NewReplenishmentControllerFactoryFromClient(kubeClient), - ReplenishmentResyncPeriod: controller.NoResyncPeriodFunc, - } - quotaController := NewResourceQuotaController(resourceQuotaControllerOptions) - err := quotaController.syncResourceQuota(resourceQuota) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - - expectedActionSet := sets.NewString( - strings.Join([]string{"list", "replicationcontrollers", ""}, "-"), - strings.Join([]string{"list", "services", ""}, "-"), - strings.Join([]string{"list", "pods", ""}, "-"), - strings.Join([]string{"list", "resourcequotas", ""}, "-"), - strings.Join([]string{"list", "secrets", ""}, "-"), - strings.Join([]string{"list", "persistentvolumeclaims", ""}, "-"), - strings.Join([]string{"update", "resourcequotas", "status"}, "-"), - ) - actionSet := sets.NewString() - for _, action := range kubeClient.Actions() { - actionSet.Insert(strings.Join([]string{action.GetVerb(), action.GetResource().Resource, action.GetSubresource()}, "-")) - } - if !actionSet.HasAll(expectedActionSet.List()...) { - t.Errorf("Expected actions:\n%v\n but got:\n%v\nDifference:\n%v", expectedActionSet, actionSet, expectedActionSet.Difference(actionSet)) - } - - lastActionIndex := len(kubeClient.Actions()) - 1 - usage := kubeClient.Actions()[lastActionIndex].(core.UpdateAction).GetObject().(*api.ResourceQuota) - - // ensure hard and used limits are what we expected - for k, v := range expectedUsage.Status.Hard { - actual := usage.Status.Hard[k] - actualValue := actual.String() - expectedValue := v.String() - if expectedValue != actualValue { - t.Errorf("Usage Hard: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) - } - } - for k, v := range expectedUsage.Status.Used { - actual := usage.Status.Used[k] - actualValue := actual.String() - expectedValue := v.String() - if expectedValue != actualValue { - t.Errorf("Usage Used: Key: %v, Expected: %v, Actual: %v", k, expectedValue, actualValue) - } - } - -} - -func TestSyncResourceQuotaNoChange(t *testing.T) { - resourceQuota := api.ResourceQuota{ - Spec: api.ResourceQuotaSpec{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("4"), - }, - }, - Status: api.ResourceQuotaStatus{ - Hard: api.ResourceList{ - api.ResourceCPU: resource.MustParse("4"), - }, - Used: api.ResourceList{ - api.ResourceCPU: resource.MustParse("0"), - }, - }, - } - - kubeClient := fake.NewSimpleClientset(&api.PodList{}, &resourceQuota) - resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, - ResyncPeriod: controller.NoResyncPeriodFunc, - Registry: install.NewRegistry(kubeClient), - GroupKindsToReplenish: []unversioned.GroupKind{ - api.Kind("Pod"), - api.Kind("Service"), - api.Kind("ReplicationController"), - api.Kind("PersistentVolumeClaim"), - }, - ControllerFactory: NewReplenishmentControllerFactoryFromClient(kubeClient), - ReplenishmentResyncPeriod: controller.NoResyncPeriodFunc, - } - quotaController := NewResourceQuotaController(resourceQuotaControllerOptions) - err := quotaController.syncResourceQuota(resourceQuota) - if err != nil { - t.Fatalf("Unexpected error %v", err) - } - expectedActionSet := sets.NewString( - strings.Join([]string{"list", "replicationcontrollers", ""}, "-"), - strings.Join([]string{"list", "services", ""}, "-"), - strings.Join([]string{"list", "pods", ""}, "-"), - strings.Join([]string{"list", "resourcequotas", ""}, "-"), - strings.Join([]string{"list", "secrets", ""}, "-"), - strings.Join([]string{"list", "persistentvolumeclaims", ""}, "-"), - ) - actionSet := sets.NewString() - for _, action := range kubeClient.Actions() { - actionSet.Insert(strings.Join([]string{action.GetVerb(), action.GetResource().Resource, action.GetSubresource()}, "-")) - } - if !actionSet.HasAll(expectedActionSet.List()...) { - t.Errorf("Expected actions:\n%v\n but got:\n%v\nDifference:\n%v", expectedActionSet, actionSet, expectedActionSet.Difference(actionSet)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/doc.go deleted file mode 100644 index bc4ae60a2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 route contains code for syncing cloud routing rules with -// the list of registered nodes. -package route diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller.go deleted file mode 100644 index 206a5c79f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller.go +++ /dev/null @@ -1,148 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 route - -import ( - "fmt" - "net" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/util/metrics" - "k8s.io/kubernetes/pkg/util/wait" -) - -type RouteController struct { - routes cloudprovider.Routes - kubeClient clientset.Interface - clusterName string - clusterCIDR *net.IPNet -} - -func New(routes cloudprovider.Routes, kubeClient clientset.Interface, clusterName string, clusterCIDR *net.IPNet) *RouteController { - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("route_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - return &RouteController{ - routes: routes, - kubeClient: kubeClient, - clusterName: clusterName, - clusterCIDR: clusterCIDR, - } -} - -func (rc *RouteController) Run(syncPeriod time.Duration) { - go wait.Until(func() { - if err := rc.reconcileNodeRoutes(); err != nil { - glog.Errorf("Couldn't reconcile node routes: %v", err) - } - }, syncPeriod, wait.NeverStop) -} - -func (rc *RouteController) reconcileNodeRoutes() error { - routeList, err := rc.routes.ListRoutes(rc.clusterName) - if err != nil { - return fmt.Errorf("error listing routes: %v", err) - } - // TODO (cjcullen): use pkg/controller/framework.NewInformer to watch this - // and reduce the number of lists needed. - nodeList, err := rc.kubeClient.Core().Nodes().List(api.ListOptions{}) - if err != nil { - return fmt.Errorf("error listing nodes: %v", err) - } - return rc.reconcile(nodeList.Items, routeList) -} - -func (rc *RouteController) reconcile(nodes []api.Node, routes []*cloudprovider.Route) error { - // nodeCIDRs maps nodeName->nodeCIDR - nodeCIDRs := make(map[string]string) - // routeMap maps routeTargetInstance->route - routeMap := make(map[string]*cloudprovider.Route) - for _, route := range routes { - routeMap[route.TargetInstance] = route - } - wg := sync.WaitGroup{} - for _, node := range nodes { - // Skip if the node hasn't been assigned a CIDR yet. - if node.Spec.PodCIDR == "" { - continue - } - // Check if we have a route for this node w/ the correct CIDR. - r := routeMap[node.Name] - if r == nil || r.DestinationCIDR != node.Spec.PodCIDR { - // If not, create the route. - route := &cloudprovider.Route{ - TargetInstance: node.Name, - DestinationCIDR: node.Spec.PodCIDR, - } - nameHint := string(node.UID) - wg.Add(1) - glog.Infof("Creating route for node %s %s with hint %s", node.Name, route.DestinationCIDR, nameHint) - go func(nodeName string, nameHint string, route *cloudprovider.Route, startTime time.Time) { - if err := rc.routes.CreateRoute(rc.clusterName, nameHint, route); err != nil { - glog.Errorf("Could not create route %s %s for node %s after %v: %v", nameHint, route.DestinationCIDR, nodeName, time.Now().Sub(startTime), err) - } else { - glog.Infof("Created route for node %s %s with hint %s after %v", nodeName, route.DestinationCIDR, nameHint, time.Now().Sub(startTime)) - } - wg.Done() - }(node.Name, nameHint, route, time.Now()) - } - nodeCIDRs[node.Name] = node.Spec.PodCIDR - } - for _, route := range routes { - if rc.isResponsibleForRoute(route) { - // Check if this route applies to a node we know about & has correct CIDR. - if nodeCIDRs[route.TargetInstance] != route.DestinationCIDR { - wg.Add(1) - // Delete the route. - glog.Infof("Deleting route %s %s", route.Name, route.DestinationCIDR) - go func(route *cloudprovider.Route, startTime time.Time) { - if err := rc.routes.DeleteRoute(rc.clusterName, route); err != nil { - glog.Errorf("Could not delete route %s %s after %v: %v", route.Name, route.DestinationCIDR, time.Now().Sub(startTime), err) - } else { - glog.Infof("Deleted route %s %s after %v", route.Name, route.DestinationCIDR, time.Now().Sub(startTime)) - } - wg.Done() - - }(route, time.Now()) - } - } - } - wg.Wait() - return nil -} - -func (rc *RouteController) isResponsibleForRoute(route *cloudprovider.Route) bool { - _, cidr, err := net.ParseCIDR(route.DestinationCIDR) - if err != nil { - glog.Errorf("Ignoring route %s, unparsable CIDR: %v", route.Name, err) - return false - } - // Not responsible if this route's CIDR is not within our clusterCIDR - lastIP := make([]byte, len(cidr.IP)) - for i := range lastIP { - lastIP[i] = cidr.IP[i] | ^cidr.Mask[i] - } - if !rc.clusterCIDR.Contains(cidr.IP) || !rc.clusterCIDR.Contains(lastIP) { - return false - } - return true -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller_test.go deleted file mode 100644 index 3db2079f5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/route/routecontroller_test.go +++ /dev/null @@ -1,219 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 route - -import ( - "net" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" - fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" -) - -func TestIsResponsibleForRoute(t *testing.T) { - myClusterName := "my-awesome-cluster" - myClusterRoute := "my-awesome-cluster-12345678-90ab-cdef-1234-567890abcdef" - testCases := []struct { - clusterCIDR string - routeName string - routeCIDR string - expectedResponsible bool - }{ - // Routes that belong to this cluster - {"10.244.0.0/16", myClusterRoute, "10.244.0.0/24", true}, - {"10.244.0.0/16", myClusterRoute, "10.244.10.0/24", true}, - {"10.244.0.0/16", myClusterRoute, "10.244.255.0/24", true}, - {"10.244.0.0/14", myClusterRoute, "10.244.0.0/24", true}, - {"10.244.0.0/14", myClusterRoute, "10.247.255.0/24", true}, - // Routes that match our naming/tagging scheme, but are outside our cidr - {"10.244.0.0/16", myClusterRoute, "10.224.0.0/24", false}, - {"10.244.0.0/16", myClusterRoute, "10.0.10.0/24", false}, - {"10.244.0.0/16", myClusterRoute, "10.255.255.0/24", false}, - {"10.244.0.0/14", myClusterRoute, "10.248.0.0/24", false}, - {"10.244.0.0/14", myClusterRoute, "10.243.255.0/24", false}, - } - for i, testCase := range testCases { - _, cidr, err := net.ParseCIDR(testCase.clusterCIDR) - if err != nil { - t.Errorf("%d. Error in test case: unparsable cidr %q", i, testCase.clusterCIDR) - } - rc := New(nil, nil, myClusterName, cidr) - route := &cloudprovider.Route{ - Name: testCase.routeName, - TargetInstance: "doesnt-matter-for-this-test", - DestinationCIDR: testCase.routeCIDR, - } - if resp := rc.isResponsibleForRoute(route); resp != testCase.expectedResponsible { - t.Errorf("%d. isResponsibleForRoute() = %t; want %t", i, resp, testCase.expectedResponsible) - } - } -} - -func TestReconcile(t *testing.T) { - cluster := "my-k8s" - testCases := []struct { - nodes []api.Node - initialRoutes []*cloudprovider.Route - expectedRoutes []*cloudprovider.Route - }{ - // 2 nodes, routes already there - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: "10.120.1.0/24"}}, - }, - initialRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - }, - // 2 nodes, one route already there - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: "10.120.1.0/24"}}, - }, - initialRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - }, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - }, - // 2 nodes, no routes yet - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: "10.120.1.0/24"}}, - }, - initialRoutes: []*cloudprovider.Route{}, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - }, - // 2 nodes, a few too many routes - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: "10.120.1.0/24"}}, - }, - initialRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - {cluster + "-03", "node-3", "10.120.2.0/24"}, - {cluster + "-04", "node-4", "10.120.3.0/24"}, - }, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - }, - // 2 nodes, 2 routes, but only 1 is right - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: "10.120.1.0/24"}}, - }, - initialRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-03", "node-3", "10.120.2.0/24"}, - }, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - {cluster + "-02", "node-2", "10.120.1.0/24"}, - }, - }, - // 2 nodes, one node without CIDR assigned. - { - nodes: []api.Node{ - {ObjectMeta: api.ObjectMeta{Name: "node-1", UID: "01"}, Spec: api.NodeSpec{PodCIDR: "10.120.0.0/24"}}, - {ObjectMeta: api.ObjectMeta{Name: "node-2", UID: "02"}, Spec: api.NodeSpec{PodCIDR: ""}}, - }, - initialRoutes: []*cloudprovider.Route{}, - expectedRoutes: []*cloudprovider.Route{ - {cluster + "-01", "node-1", "10.120.0.0/24"}, - }, - }, - } - for i, testCase := range testCases { - cloud := &fakecloud.FakeCloud{RouteMap: make(map[string]*fakecloud.FakeRoute)} - for _, route := range testCase.initialRoutes { - fakeRoute := &fakecloud.FakeRoute{} - fakeRoute.ClusterName = cluster - fakeRoute.Route = *route - cloud.RouteMap[route.Name] = fakeRoute - } - routes, ok := cloud.Routes() - if !ok { - t.Error("Error in test: fakecloud doesn't support Routes()") - } - _, cidr, _ := net.ParseCIDR("10.120.0.0/16") - rc := New(routes, nil, cluster, cidr) - if err := rc.reconcile(testCase.nodes, testCase.initialRoutes); err != nil { - t.Errorf("%d. Error from rc.reconcile(): %v", i, err) - } - var finalRoutes []*cloudprovider.Route - var err error - timeoutChan := time.After(200 * time.Millisecond) - tick := time.NewTicker(10 * time.Millisecond) - defer tick.Stop() - poll: - for { - select { - case <-tick.C: - if finalRoutes, err = routes.ListRoutes(cluster); err == nil && routeListEqual(finalRoutes, testCase.expectedRoutes) { - break poll - } - case <-timeoutChan: - t.Errorf("%d. rc.reconcile() = %v, routes:\n%v\nexpected: nil, routes:\n%v\n", i, err, flatten(finalRoutes), flatten(testCase.expectedRoutes)) - break poll - } - } - } -} - -func routeListEqual(list1, list2 []*cloudprovider.Route) bool { - if len(list1) != len(list2) { - return false - } - routeMap1 := make(map[string]*cloudprovider.Route) - for _, route1 := range list1 { - routeMap1[route1.Name] = route1 - } - for _, route2 := range list2 { - if route1, exists := routeMap1[route2.Name]; !exists || *route1 != *route2 { - return false - } - } - return true -} - -func flatten(list []*cloudprovider.Route) []cloudprovider.Route { - var structList []cloudprovider.Route - for _, route := range list { - structList = append(structList, *route) - } - return structList -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/controller-test/ct b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/controller-test/ct deleted file mode 100644 index 9072db6ec9084b064ff3c1d6caa9ee66ee9af88a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13780296 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 z%0Df*glm>y{#%12s^wN;{S7s*0ERd+tfv#{snvNfCk&wP61q^QZ@68-D}cG>294IB z@~(h3Q4GHs7+yE{!}xXRudwx7;v7pFye+H8^gA$R9UESndN| z)BCXQ2Q4PgGnf^LkHvq;xZ;B;C@DS}eF5c@gGhJhG4O$1g8wU02B~2<0N^n_o_q;w zwlM&P^V61b0dh*Ld6QHMqZE%}a)Q*tFWr8f;b{96WUo^;yX>^m&pTT zm*_bBjR+_yBZ8o=PL)>pqcgw(Jp_m*At${m1^~+>II$bA4A_m&Ye^I_{6LE#&g6lm zgx$j@N}8R1Z}6nrDx9qGk`t}SkwZYG6EuF$3l_@iLr7~YGi5qLiri=82cLL6}?m-5pi5YhnA zkJsLB=mx6H43c0Jz@Ut27s@-kaa^T{xoRjsLlDMEMae@(un}Scje01X$4sFns2cbI zS@s*?V2m&YOpplq8oUv1$e1ith>hj+9L8das@*sfb+)M*xx@rD;(*~9V1mn)X^K5t z6N9qAfaY9bpp_`t65j_!aZkmHd31Ap@eOzyyg7a+FWcfrQHg{s(Q#>Q7vbzcK9`Q_ zNIuKG@_G6HSUw^6T0SpJmrq$Y2Q!(F&otqj0pW~0(W|s%LW{H%rwOO;b-Qtp63ZBb zM~Ni`^nWOp#a^*Ir9-hC*_l{AEL))uB$k+%f`j{iDVt!-|AuU`A?%<+KzCC>8y?gG z+N1<@p%Ty|I~33)6*BGTuHnh}kJBPBqUBieC7B)vm4J; zQi*=Qmda{^)U(^LqqLTve^YCzBvD&Se8T16))K=;e)oh=X&|Jz9wgxQ&p%9<#mSoptfwV_t;3dFHQEOp}fRyoFO(cVIF5B%wvje zzAkAQA-A%qlHv5ln#O_TQ z&%PTuoaj$w{92^2_8PCl>(y90sFb6_zjCh6#~}gVO#+$;?}pF@RFO4v?q}Dt znKJle#*R_1S_1e=SG<$ZkIvAo!pIqC=vIO}Y zsIB5%DRpXKr{7To%|{JiChVemqE_M;L_US^pK)2^{f5*0QBiOSc2frH+Pl;ohKZmq z^2mlMx%TpXA~5DB-z4Bzk9!q|yvy#Ri9=qJ2OWn5i?Et|K09gV^%Qx~ui>j}Z>BX> z`#o!CCbFGtvN05?cA}5vuRwKnKFkQ4pSCfyCJGiQ%!+092kgyMElBic?66BCm7tE@&_IeC?njjbx+jchq7Jgq29LBe(4&Mn{4d~! zJ~E+>#L(jDW1C z;}icL#LX;M+6yy_f%kdh;@P$F+e>Be%V0)siWkc1O?oPu5pPA`N%aJImJAH^-R$K> zn&XquiF1ekj^@xkS1zQ+eA7@*2yZOH!J>FWE@f(9^F+`xtSOw;s{A@q3f~owFhQ%0 z)b0uFYrDq7>}i6+0H$R1zzn$ptDh*}o>s6^fXyPh4bAUC%U6q*tAl2xbC7)R+i1i| zIwp}W;tmeX);F$4rJ8Z>u6s#P^c-?PcTl^+v*7F$+$a5?8lSH!*6~+4{WZ@Rz>-^i z_?qs&hQxM=WEyWJ(*h(&B2`2zrT+@K1Erg@mD>yCynz_@ zhOnPHg$5v_pE}UfA>i^QQ9zpD-|VEcV8yJ89qvcKjM*O`4wXfwq)2;%E%dsPhtn>C zdL*N3TJ2EwlrX2#8}yaY(L~rKHKj^0KN8K_VO%uBl;^1ezVFDn;er{&6qzu+f^ITb z{izNsP@XlzBdBd&AT!h$)Gq}HS1>C8=+d6yz*OT2^R@f^HOGR2xz@T-GJw4oUM$H=h0#pQrS536;Y#7++r80B>5wi z41+LECI9m+cVX=lCxyL;9G7Vm>kbW5MtLJ25%_?piE-@NbBMH=NLKll>wFNk#Msy+ zl25+BCv!#=q*=&^!O}o*$&B-z2;@W+zf2bg{+wSS8~iBk?kK0};KyDdK!wpR`3TK% z$bR2>CzJI#ZcF-m@;(QS?nLfek!@AC%yZI7tgE^SOZwiF6+MY-rleHET?hT0T zXVDLJi(ickp3YKFeR%0|3M#bXf24EDiZA6wCzX5d^Knm{wUh{gESJ_F*r(_3zc)np z2bLfQ9nvzn-U@y#V1Q>5Y9K4-{%Rb``|fb$bo6kc{;X9n1@ zs6!1DQp9S5C?Rkds?rHqZMdZtTOU;d+(R+Rbg}`+W`*8&2C)8ko+B5xspgriBD4O zM!cKNjwtrteI?c}ycV-!Fm_m!*5df&`*lHh1nA2%(qkwXX*aGe5f|}0BwS`(1UO^Y zpG7<%?(>~k0Z?H~g!i^ID?5}uf$OS^s{`!2`_m~;;bXnrPEM`!Bs=p<<5 zhEMMtG)Jp*4#eCptWk**EEqigel$9CA@=AB8*eX$t~v~Sq<#1g`>S`*hl%Qmib=!K zO91QRt&GrwHTN-2iFsJF6bT;IWZCsck=))aH>76Cw(Iv$%2;)R@}v2+Hl<%eBxT2O zcBL@M@0Q3U4AyhdBBPjRSU0^`Xrb6b;h%eil+%DwvakR=W1UC|7}SGO?)$e_l>s>}4+jY%3LnBqCN zqfC+N&&U?PJLw3L=XN}q2^wYC%ezHD9~wL5EOm)W{qAtqb%v*|9ft0IaIeLN1$1++ zlnb_jT%)=||Ay?Qs0xfP8C?i_2v>|x4Q*+oY=_P&jai`DhLZ5-{+bi6jCJwDRwKH4 z-xstSK`zWLKMPp#z4*_KV{;3_Dywb7;B9Sxb>EancZ*JqU!*z)%h4GymK-1T-I}0B zbey*6G9yW&6d#Se@Vn>nvMs)cvoYES9IWI~C<1Xv{?g;QUHHb1#B-2viQ~;N+?-jy z_?F2~SBzXG*Zu$F4`jULRN<2j!}JIPhp4bDUi?Wi{8@?m8U9GL^~L202zt&mFY5Rg zzYEf}tJIC_Dxp7GeGy*1Ynmpo}O zY&x7MaBtHyFlvYn4R?nV2T&4(H#G073PxB;`p%UFq*=f{M&X;&GWf&fr*;L!B!01x z`RmR4MM2J#B#MEL4*#$g&K~ePOL{(1|%8Hv%`Pz z1Bzm25s-IG4D~Rf!(x!#iEyL_nbmC3bQV(|q_4yBk%qyr{T^g6Y-x}|peOd&_eyEx zdCpJSPgGVVUdyCv4JHR(77amV01GI3jVvVRs5XRwqn;a6H=fNpcD_Y#)h*R17jXwiy zIbY5h^pjxq9;nV(itqt^Do4~*!<<)!bzjS{|2ho&6Jx~Y2p)-8!w~9n zia;OF6g3P1fyQ8En5X|adMF}`mJaJTxsppYYC2R7W3~%M5s(-^3Aj`nh3?Wuv-uhX z3b?Oq<&b*{@l5o_!Y~SjAP(TklPqJ>gFP5}onFcG>eSI{Nt>@!@^Y>J-P~j0=9ZEL()9VaepUsKC488OpGcAI>Q|4VmQzlB&?I7N`Bl~Qi?Vq zA$_D9#2eH=m;z%ajbLX9jZtdO@oSY(8UGZ~hH-LoptGvZ)T87^9kqz%F=a-6+%9tN zy{F=~1{1yJi;WP{DekNw#tKqW0^QXm*;f2;+ z14Lt9X@N&(Wbn;Ch|B=g0c2*5OxJWEGYFMCmziQI>pL96H* z=;xHol*OA6V5Z27s_vjNv++`nD0wQ*lo{1tKw6RDj>l@bKLi9NGxz<#D>FYgPa-q$ z>*2laPCqngYkV98Jbn}Yb8j-49@~dF`T6)=pGnkw6)vbu|JYJkL=5_16{xr?`D%AS zzCIpE|N6Lhd`j>C!YWdUmrZO5K0s#Zym0>AtMq$1ss;bC>Ny#osqza<`2uDvbRtwC zvrLY6L26RKeGD#FTmdaKH}uqIVJ=nNLKtzYX^v+;UBT~b;O7xofq{>Tq}{qEv|iVg z3Yv6;)!U#aW8+~46#_n#`B6y2=4IlwK!4)T!EXXeH z0%9)QV{Q;qa(B$nRVQltARF8bp}2Pat#lpw)Z6;mctEfqUudwsIqY$Cl?yWrP$YYm=A}JD{CSZJdSDIWZ)-+VNq4@N_QonU~A1 z1ZFhU2N5qs>1 zV%b_c|2}`^VEn^^Er$Y_2MfoKvKc1+=^#vGIj#~zx&McpeD_;&@&V1sdk@ITByGsf z41V_Q+Yvt(dHH#hm!Hd1`H7&G`Y4mcN*^7LK5}r-tCHwDGtf_{&Fw@6!J~R)6#i#*P_&6t8 zK&{8Xet-5&`KUVe`mkQtK2x0$0)NR#H3R@b)1k)N6&|`EsA#W?gOXa7P+TK#D$LEO z5Hz8@rKEK=MF8ibaE!UHutg!y9CVO{K1#MvRAZ}v zied4@=95c#nhwSLU9MwLlEyxZyI~!9CG8EVl|8#_CFbo|#W{Ca=0slMWKxl{>0eIs zzu?VV{R}{T`^1n$XNZdbkP$l0qE#vm-KM&nu2md|N2B(Ddj^Km8Qzv@6adtt;*Lml zrYK7bQ*{R&(#>E#=5HoZ1|l2cXJEzy!;gQ!Fvu{>N&O60ETK4=mu_)e21h!xV-O7e zo8qLN58wBwj_mDqUVA&bb9B+MyjzA^1V<@tG<180!-VwXA4j)bIriq5oC8d}U{L`K;zcwaaOed8qdJ zjzh7}OHVnFeGVRyeNGW=*lC6fu+!hAOu$ZeQFi(+ZKoTQojyw0>2|z4xH=kZof#ij z_0slweku07)FER@bVeCZthF0n@260AkX$yl7M-#}P2 z7D9o~AT49vIF7lsUS^8;gjjAqzS`F`5%;Csbt)snm8j~^J1{R5!I0U%2OyhF!$=q; z%cNojPU|R^$8_r`#;VB5EkO}IFK^dxVVYXP`K-q2W(=D#fcpzy$zfhRAn1O;A=OY= zk7L{QVO=rAe?4N+tdEO6Xx#=0Bv@KZC(aT7!bewZHKB=zIH73V_yVOV>~`8g6kI@&+; z`6GPIe{C4`a&~0>XYWVfjLMFg=C;El+oo^(7)~|vQvbKmcgR;`xEQ+Jmu1IFIK{^0 zC5ZiUFPN*&#&9poA*FI#vL3V$m*qQ)zajuT+{E0mzL@9%e}48S9?GH)Bu)wf#-a59 zQh?01uIkJ9(@*`((n);z_xN6&L?s0O-N8!l^bcX8*r|sl0)DO(#jzMN0>X$&jH>47zg_%v146>H7D2 zJ=?*eN#XxBNg=`?%kAb%VP4H5VVs^6cJCgJoUz<@t<+3c8SauofXv``7KXEs^@M6I z978D_tXQ$HBfZ9KmrMy$$=wMzQOMnEUF!wCLcn2hr?3MNcOh|_kk7XvXZ4FjXU z5`UN!P$px-7_Z4V@m6gzUilU#qcxZVV&YhP9ofSOV4c&^;BIiXCTRuM`Dn57Fwuzy zxuTv+llzOe;p!`FNP`wDL$Z{IHWHF{uRsaik zNU^F4O6?Wn(3r#&w8-CwGBIP8r*du^UlN6oL$AHNE!QEN*9?`%{|1x{kzO`8zjI%j zO$x>x%rF8A{L=d`h3P#~N#<>Wk^^l(qhbEs3y)(w zpqDZ_@N}NJvX1K8)m7IAGsg}isOB&qZ_3O~S_+4Qxb`1oRt^_Yfl`=O9gA-l@8C?G z-LMk{2RGpmk?WjDAGIU^y=<67zq|Y*CC2D(YD0ykLa3)=$jqSMiuFg_Gv zDEO+m`3py&-7E4H7a_Ys0eE5*22Es=D*@&_g24+8Ph#4e|hEXkFeje0UB-VauR?R2?0QYKxilu{f}kq0YJkO?&Xntm706#(jT0A zTnPR4g^GJhE=3)Z+?$vnJ7ke#2TkbefqTKuxVP*i5BIk`ArdXF zkk^^fVhqbUJBT1bEwo&S33J?q6Rr!$EFJwh$zX2I1+0f>@ZtQa&;Tbk9qaZH;ITdv zl4AYV6<(V?vsP@j4@*3|wLNCk=Ptx?W9jJ;gusqqv*JsAJ-Ei_i7M2$%7`TU^3lrTy`Ch7HjpJbF_*cJT99)`|07m06^I zLi?QX0xXVzn+xLsdd$yRtYn{!mf3LQy<{2r9-BC0=3IoFZLjJ@qirjMdYrFcke>&| zFXGo_ia>I)Y=|Da^A@7|w&O!YcZ5i5=vKwv{k3z~b;F=Qg)!4Wcry;uQ3xyDqJ>UJ znClKc%NK-mQV~{V1+diHDK>B$+p`h!h^>h1cT8>XUfubnf;Gp&jsrSF2pRb(9 zdJZOnhh6R!!536$+NpkuQO^_NS`gTA~#~ZQ8Ng$*ckdE|m zD3?Pe^^x);`gXigvXCg5tp3X5>aX;8^u_&IW%_Ra=sN z4SfEl)UzZ4<tQ%| zpor<_QC^EwT-C8f(h(C{SI$FbARtNzwonMbFp1zaKOP^-i8izw-&A%AjKkz0E-0*AM8i5bHUZs`VW1 zRkfGV{q4y4r>L6fnV4i9M1r)ih>vi^Em@eRXIcZ#7IY4-fjyY7V+|yW()si3rwM%k zH&R`RlAMfWx(y)Jfj@zP(1ADD!&dp+f8f*P9>JvdOgNsD#%Pf&9e8LWnU8#jB9iIt zeQ|F>9)T^I0UqE+>^mZLaftBS?hqN(lYO)Z*ZBfQ5_!ca;y87j@G9dKRBxDX_7&be zBaQNJfZik);OgMvFc1@-Le3H>_rrB^+^K~L=GR$%7*5HX-kvW%(d`Mke|ZX_Srm>0 z*ucB3d>AkjhkGyN$aniI88c7+m_>R^fjTL$as`UDuZ_r6kw)efe!yTI6hI67xV7A? zFw#c-VCewH2_&e%*vQCyIbI+Sd8}xzRq`Ot7Wb(SmgQl}Lr+d1aHs-Zi`|7c>TfaE zo=f{g@KSPoeqV@KPj^4oFi16ArXeRnn;I4 zH4A>BCPm;l_xTo%KX9FQ9;{Ax?FkwyR)+mMQklSBaG$tlj1;QIVEWl|PsOMiL?{4C zYBHgnefcUu;Sl(ys4K~MA3*1z-R*G-xe7AJThK?x;VxUzxA-mAnasgsratf5qvZiD z=P;}Aj^mdGI&LlZ=V&0=MrM(9CqOt(y8Q-7>lr{J@lmknW`c#1C95{i1Mepucp?j@ z0!er96I%YFOGJ_$Sb=QqFGb`^W&lJ7Lixv+GKBI{)Jwu<6sSEGUvy-L55uyd9ysIS zZSK0p2{jN2^nzQ~}BREeaNAP+x@=p>8t|Qp7x@&>fJDZl3-GVJ5n&SSRTIq@P096i-1{ zN+!{TBa)9I7sxt&d1=?HkHkO_e(|FO0Ym(%xX$X{E92Olq+rw3=49>s)khOM!Pu_% z%BK(s?g);T=Ry1owTN8G5SA&*U9i{PO-SpF1Txi}AO3I=a5P@!?*B^{qtZ3+FE)FD1n zdt+wpKbZ!*dPTLOK5AAdAT%Hf=Xy{$(Jh#ph4rrE^G^gqkYuQI5}_nMG0*oOiB#hI zkJvd%`^stATAT%z+y5%g2I{@`i`T5gJB0dh=~1<5Qk}qnFWut#NxYOnMQO&FdopIi zU!00&{Od1lhOQ=xZW}(Cynww6P6WFk92_ZD{+LtBvU3j z5#80d>o4vKcrrnPrj^U8bPfuYoWyoKrkKoie5IOkrFba9MyeTSpefTLxS%NrOW7W2 zlyYqKVel(aTWJqEO_7tz&-V?7_>v9Z4t+v}yYkH!4R-UJ{@PVM>~ zxR2)U9ml}Y3K@R!lZ~bMexBnLa6c#{UK&WW>pO)Hh&n7fyR>-yyc>wz3IG`yd0|+z zptx;enQ83EC^j7{ghobQ8rI((89_qs&GVr_(Sa^6#cgwYBBVrd%Wa38D{7{Ri+c?| zz%I7Rtj-`;g$EQx)*27oSLswo_Yh}X!@?k-A7FP74XaSG2sU3iW-5qRb#@>IUUZ3+o ziJIO#aEC!VF{k);%wS3 ztHXC>nG2D_hUD=6pnb;%w4{UwkO<44B_U7!lOY$6@q*#9>+eCj6ILa9nt?tXZu&r<^2N=l(#f>c28I5KVr z15hDB13q$UxhJD8BQZKx^6`^y1$kHau*y zQqSm@_?jRg0hoR+k_mwM2-sfo1(ytpFXfuZZf(0tq65fxEo++L*bcDiqruOY7H_H< zRSFv}dvqvb*q~GV1vWBc{|-Jw*2M|0_t8M(G&n3&nT}-S8tOw62AiWaJI;)zEzqQ2Wm9`=1($bOB2_ZHYa3V+5O&2is)z(^5SYTAFRLaB(7_*ibia4jfLysMjqbe&e{O;YyBN+=aCK^{k z2U8~gBB37k6SI}q!Ub-SV%!91>L?kz;d#)Sqm?va0sD@pNqVse(Q$qellng}3079T zfLn{szNsyxqWEpdr@eWcXSKSgUnXO6+3FmEzUnDUJ^|wPmM6EnT*%+WZ5G4^Y`zU_ z#`N>RRW}HmKL@TgN62X>n#J)P$fx^K34yzptki5tvqJC=%TN-jY^=u~1vRI7ZD&E1 z3vsTphX0qfH-V3`y8izYAQBOs)S^aZbhJ@p1r4oe;!=a4PHe2SY8$soMKKC0g#>5| z3QiEF!?;x|DpsvlQE{nSm%1fJSzW*t#jPs#8RLpoQL6dBKj+?OW-=3O`}=?A1$nl+ zoO`x=?z!jQtJOP8X6jx)H9FYJD!_c`(P(CuD~J)>+)RMRRJ=CqSTi>hQ)Rhx_N3cS z;7Ka%(s}7IITfmhwcC{cthZ;9T7&Aol3~9-PW>&kst8W|%#j0|&Y93Ti?y))31Rv8 z*QeuOqmtTTpBGi~G~(A?GCk`3FjL0pCRMiQ?l=2`sp{5GZbXWX7&i|5ATx3n`KhLA z-XF8Y!5{{+C2dYb+1Tq|21p(WzU|?}*zYKjNabs%O69S3vGypq(2jS|kd$`CvBYbN z_8(ZlIbtEcY(zo+&_^X7jffN+mS2vB7#qh=qbm;qDfiZN;x>wKdS>d8J$1~5CuMca zWW_W_rBP5Y>7m0<;R~u_a)j4cm&C{NR>nqWu>WDkk$c;vSC)R+m1->Av(z`F(|Rp+ z?V(oc>vpkHJ4<4KUDr8z6UlQ0HaXJcUUD|gk|#>E4aH7f4k}vce}(*V!0S2uw$NoG z^z@*&t|z&OUI|l_?uK<&_wkfQt0=A^=0VP%D96G^NKINPOeOTn%ZmkuH9E-ddy(sjbwjS#NbTapg^!=V$>(PvE{&XA*{Ltnbabolfd?RF6kc8u{17JqZKzdm2gagzp9$?!L#q^f zTGusMaj5U?>@ozG1A%dOFtopLsy6c@7(WrnkhG%v#U0wI>~Y zY(L+E>p1g14;Dm_Az`-C>8T~Nga!R*_rje#?vB64p8vJKFXebE#jAo~#-AzErZilg z%H8$*Og|XYuy|tlT_5x-U(a-{?#g(<^(-3k2d&x*?Z7#wk)elveB~JBaS2&xrQyJiGdFDAat6tt zKEE(|JT(!cQ7b@(^;g}}x2!Z}EeFZFM@TtIRp)%jSKaH95rEjE+Oc`nirh_fX7QYB zV$gj>o3;(J9AV=Wc7Q?tka-(?bTyp~(75f~R8$6;GK>&}l^$9;!bGE0`#B47I>B`4 zj*wZC(sf-^(I1ws?1EcNg!0psUA{1z4qmo&|JZ@N3>RhXSsq_b_vyIL zPyO1n+XC5TJ=tyIzjUx+Pj(w}k4sj_ZvXlj@8J(jV*h8FfU_}Xq^;H&eWRVJ`8_?! z=vZW1U$U4RUc1x{Fa7r7_X}s>dm6Zo3(2#O#}Z&Udns#LbcYZwR2mui=hxaB6UUjB z(QihsB><-71&Kyc>J)5EO`@~eJ>iI@u)d9{AD3hQRA>~oYzB@W_KG`e^9IIXoXF6< zyrFw(L*nD^#+?Y$+EcF*?F`{NNIU)c2EXZ9^0`JlXN>E^v~<}_cLrC|+Fd>e9fE$ zYI0Z@glAWsU#b~l;;^=|%#P~MuqZ^6Q8%M$ZJy0<9&fZb*=ud>+Q1XEzVHf=(@*iREDKZFiR{yX|}OAZ~TLE_EG|^Gp}jt%@YDW}v`R@s1A|HEM&0&Evbj zhWU7cQicbWps6s_#G4GX%@(2C$JBb4JcNqI>pqz@(kNV)nat4#O*N3Lbyz$#4VT+= zt(|GwlQ#%ka%p_`k5O!2e8J$0Eo#|=*R)Q|6)JNuY*@^0WcTEZA6}gj@3|ksz-K*v zDpS$6YBQW$;oRsn?$yyyWVuS>I#32+@E}ezoBa_)TgTIzzc=jclAoSY61+90Psy>z zQdwnZm&QWwS6JVIRaW1u_h<55lxR{q-PGDmI=Wx2t2y}9>*C_Fw| zZ$`bt?>S2L(R3t9%V>W-4wz7dtQBTbRjD&4OA6D`1(pS+_MFKWvk8KQBZ&^?`>nft9hLF1FVjs9iH~2yO3u}S4lNpo+ib$B12wI6XnFJOtn)Cr{y!&qru*h8(bw2hh|Io(uPr0pmr zRXZU{lQVwZF{i4>FEZ>W?*jv!N{MBxu(EHUi10g6f5>A8&LO_RZ5}cJz~0F3&s0QB zat+GT(C%&r1%sav2Z>Tb5NHg~V9{-JjLL^}cQ~qE_cVLiIeU^(g~vQS19j`p7Qzy8Y;5KOrd?HUeT5~Hg-Zip-2=>HEdFm z9dQ9wxO@ke#B|m@$(F|pyRG0fOQtd8tPL8cPGbKgKcdtPT2z=_mDG|s8(^t-PT-xO zxU1$n5;%WXs_YMX#+af%?}&f#vdyBhT74-=C;Ft0oTg$vu%STomp&8H&CXIof1yV@ z^z&~5EpeOu>Ie3sdz~mI0hahI^wYI`3=S}$aQN`KqPYCDEB~9zZ}HR2EZvU=JjIjf zpd-a==<0<MK{$mumy4Y zsGt+iv`DGX!9IHPiQc56fB(1$`!5~BmsyXiBIk7gUjNI%>-@*_mWTZ>MI|a+jm{%= zU5ZMET8qVb z+;x-X!JZmO;b++0m+|ycS4Pj81bRHxTR3Anx-#OClt^1qgF|oCCjheKR%WL8xki!R}x=I z;&JU+oBt~;Z*aCe+I`J=PLQ%ZRvsvbFu$0>{IAk1;7LWtlGl3OmVp?C$EYORM?M|R z+;&UJA;Xq6Ea|lKIc+faHZV0LS07RL@{9ouDO;}oUMrH7I=otiWLoUVveQ}rIRb7K zx@S!U5`7D_>TRO3C@wGgvAt`3U(YvN8ftnB0WM)GkU&f(=oljtyp=u!ZTn@}dXD zFe2HfYk5!^-V$q;*}5k|3-PyLNyzWPPcLxv#JP<@fLUgSRS7&VGl%t$bzct^6L}RX)_sFTeNiN=Q%FoQ>gf>(}x+Prh1< zEmF`Xjw*uw#7~(77mp_%V(QoA6<`%ar*lLS9Td_i#pEo2(pHXUT#8*hM%@SvqGv#@ zORGy8ZTfSOO`3yVvf?6M1~;-txpHF-M&H|m&xSwk#~xkdAJq!fmW3&Zvk9#OL?Q^; zN~U#FS6@Zf1(e@#V3ES!wcb%OmN}z<f=uSWp*xUhw%Y*mF?7gFfIOBHPywY z?ijCIIfUR zzgGB5MIW6Wnm4DYi(S8dEAc_;(T)$CwPbv-#Z2i2^@Qo@@5!X@*_k4z;7FjP)@(^K z6;HaRh|&kp0Bz9IW}$m=d_L_4gY%`ZyD0k`*L^u-R~-&p%08&;*zI^gymXy5MeX=- zllZU~y)Ted(_e`*6Md)hv&9dm#=z7a{~&dT-36pxYUhKz+gH&VjMh6o+$=uq^@jT! z((`tIJu>`6)Oo`fZ^jAV=;*4TPuuZP1dIK8Y~P;USJR*yen%^<3mMf{^~kt7P{}v| zM=#QYp}SiR5oud(O@U(oYoYG7*!genB@;oPMrPYv&Qr<)t`si(d=x`8BrzBu{}Lmj zatW~KLcFzet(k*B_dMq&gRjfu*>EkhPIAFE2&xN6kRVfA&Q(<%B-O<-^s5&oajr8i zlP>`wX>-2wS&v^!WwgunSdrP)2qk;&tmJJ;>mY5_rIzZ4m31u_(zay@X>H6hhR#25 zECcRFTMMg=SD2=B?`bCDbB}MKj~&P!STnC`CKbqQb-!KbW$Rh0XPVb6s!WrdkHI%I z17{CZZ_(J4t_8tw@`F^oLqyX^u?36Qs_PRxD6D$v-z-5GbP7m620wrv3oiK6Z$d7p zvKP{Fv%Yq0u$kUy-zzt*UmhH*$c|L>jBK8_4DkFs%k;+Yl_lc`yvQiu(Q+DCp}T!U zX)CMmJUlIjxS>xfdZG%qJYCvtCLL|G7f55Sv{kkbjTP=EMLe;>K`g89!h+oytU$eJ zT3GNUuHdWeMUR4~@ull8VJS}p^LH~-q;F;$_$2s!`1C?<2%EW|`(R@D+m7|^d! zAO8Chr{4)@P#jFG5$@n1rKfEjbgdXoY)>O~LP7Ei;&G)bzC)bkO=?g2JNJp{t8BYZE0uFwQH#Qd#!)EtKUvtDEnfn(~E5Xe;ujCXGjS$y4Vv6NcacG zls;wVL0nG^*?3|!ZyqMx<@Sgq$KkT(TKA~idQ!!>BKKsHhdC+ddNT}5vL*HPf{<(6 zUq}0ElU>09WsWR23o`-W~ymVVtOm*%*qJq)gD3$vbUCI~}2SR0rwR8RvVn&C;Fco&!5K=5FTcaYz ztKjUlycaF?UW3+6!n)Tk6D-OBy=yf9PJ9`Q%#j9Cfz(091yvJOnU!gN4S6Wz$>oeH zV|LfZG6cObvRzs=+8)djm{-+g4_HO;MRjTLya|i!BeY<>eS^-gd%H(ut#|R(K-5eu zSew<|sDNMShWvfcqjLWhKn`flR)*wefiF)I9u-`(9v6~2nSVJ_0&{a!9!KWz>&B<= zKj`UI8C-Xslok?e?eU8Wn3HHZC4XEAI%7^VtnyJja7lI?+VaCNZGxcKq!a6Em;O4X zPeI7%p;A*>jj$?Af0_6|;Ztxt&v zU{)@{IFU9+JSFif;$N^C^>ewjUFT@7T{WX`W{PT;R!vjN6i!z>A8};k?icj_X0u*W zCr*?UGXu4+rOLj=B^@5RHx{U;b@#-4 z>;9l^sx1c+g=sEvdQ2EVoch=`908cMbFE(GiP8cuJ*o|B#7U1AB@=nNUoT2Yi>~vc zg(SkN{*P&a)Fmmc;p>pRvU{om-iGeX{rx)^v!s63C-}hWwd*&1gLo@2~a$V zaTKB?Pst4UheL@enfi!M+uTGBJ1HBy1deh(&zV*2qMK)lIY{+=`TS4l?2Pq@g+dYYPA3o zgOO+P+$t$zDx_!MUuo}!DZs0YW7gLY46^roq8HgGC_9}GH^?tAQ&@Itq!=@tjb;sldeC3Zxgmz&uO zB{%8lp6?Y!*>vGUQRXr6BuKqYPxvk77A<1z^y!){-SAPC?&(BPx~nXmM(wHF3WWDI z+9%zR|H(Z|w9NsS*9xX+pcElL+rCXUq!3mnbQ{8kHx)uye#2cB=ozeCei8n+_vsv+ z(gzzJ4lPdi=}6&WI?@ns)HWoZKA_5+OE2kLI{NXfqS7DcOD2kLU_yMQ&|k=}C$MzW z_%%)eQ@8gR-G{xVgVNvS_%$Z<@#k)_$l~)Izov&j{m)#xHP87I1JX=%h*06c`pxVj zuy*z7n&L^)%^zXl4=V=$8==E$R=V~#l`bs(Wb;pZqM{AL_h;C9PgH28IfwMn$Nx!Q zM^tGKBdWBA5mnT6M2+4>o72%lV?}&8ISWd@&?@nW?L5{h9y30ScM8$|SBUTTslf0J z#L@m?&c%;{?~8vUd}r;UJA0x!@orC4zb&MJ8X5s=jxm0ZzCI+Eh+Wx4k_R1fTXrmJ z(RJAp3R`scw!TF_(w^fonZo82@z3C}JzzAtqs!NER8hWPT0TKT=6F0gzQSPBEIzA_49wK{n7gsVaQ*#~k=4SO`>83lu2Gp)43Y1|uK8mir`oF;1u&1VF~f4l>s%2{LxHh)MAY1TnVyRi=K*?@)Z z0++<-;>gRc>2R~pCtyCey=C&bzGXnr@vsSBMRu>I4?-73dw7%GJ$*8LtTjN6FhIqe zPJXIQqgF=lJcO~uO&R6xc9tYk^JA5)qnDYXap5YE+ZmI zKt|ebB5OXN17s93?}Q4Oh%6sMq!4O%pp*sDEnK(+A~9pM1}Zxm1T#%KghCC&-RrD zmHF-K!$eh{MlLLGURYkO@KqmAX8ED*1+ux0hY>_CXXNgM~lk@&IFQ;xzZ=sr5*2 zq-_f;PmbN@F?j%W8EXPiFy(eY11&M$*p11xG^Nu*d@9$cUr1go+-Y`qhjo+mYvN@(^bL?7_gL-|tTYltN?5+D97skxt*TR$4{|V8UlMsc*F6w+UYkOCd{14na{KL~W@U7aUa~YZH}BQYxDTZ@a={&>%ER2E zd`gIvYs*7Y9{*MkQo567i%4nygOC?Q%IE*F5mLJHvZSo+os<@-tnz|e7YQTA_!g{T zGI7C)TM-89LYXBrwp!km^ZLM_;GV=cJCO7txt zSXqi8xp1Ks)kBR;3qHIRVoc79GYeQ-klmjCB1ohu@sMi!<=tz;V~DD=O~cO%bYGe| zC+}69dvBWA9weFlZ7RlWwdUr`K%O%1GGP-IaY5ew=)C)Pi1Gn`euet8xMB`dII>Lt(VqhI6pe=Irm9P%QOl>PsST>+0-|;&VfqDx5vM zp8!7?8MA*1={eyqAw3~Pz1x?;FmD=?KHd2zXMO2Ztv`MxZjp{7Ee9e9Kt#8n$JY(^&-V5#Yx#%H6 z%agbs%c(+d(C2)_z3p+-b!UjI-{c`q%lDO=?#abyhpbZ?9EYtZgEFS?#$=V5Z%pp; zl82o|X|M;$g<54HHTg0+hb$yWAw6DY#iH3iR=jJB_*(|1Dx@o<*5EVt%94p!S-2%n zVR`ey@@k#G6Dmkk5qoJp=S=8HsaO^r)z|^8{q0M~M0K-BIA?8qUE0dwO(e74Z#3(m z>2nnFW+4pGGm4~oza0drvL{ibp~UK@LX8Oavu(ckZt$CxEA7s-L1RfPd;oZ$ig{~q z0^h*Ld=t2-N4deRR-DZM(ZAEGK2xM_Mx9;+*mX?KsCXqRwVka-OO|T2P1I<%i6Yk) zeOxzJBhvs>{V<+lp5Oq?I?YO^hyUqrxo)OINVyWm?BiQ%QFe*1dbNLLi6y=&7#GO? z)d_f+OJN1n`fsuvQAochuk-w1gyW!yma0*Tp)l&Hn}d4woZcQ%k1vl+jHd=L0Z`g% zr^&}jq;}RoHFmuiR6p~ZlEN>;+V!@je~4$;6!Ia;v>TOVkqDqTI0qk}0|63c3D^Q` zl3wRH@V9+hBJM5x3VW$~SRf`~y57wkCs`}W9K=O$a=)VXUmNNtmFDEZ>6bFep()b& zw@Fw{nJe-_6Y-p>nWvMz5kK>e0v!-!L4y10OIoJn3?d7+4|{}2TZ=lkCH2j~n{Q|Q zRIk-L=uc&q*@Jz+Qx;x{K&TH&g6&OJ7_iwsiWH`9fno&a?A4$nZxngXR{0}_)?E!& zTZ_&x0hwa+2w?IKh<@Il-$Ag>nC0`k5ZPzit8|vfhg(>2HM-;iCUfR|-GSe*i z@kZ`P09s_P%==STpQfWnz9b`*?g6Mwk(T>5OQr67joJ`)HQb>4={Zmi6{Y<7PH8Yk zm`L<=kreXl;QadDc=226yX#NiUSCP@v5dF>P~W1f^V)azx7By>#_Q9#hW5?;FX}rW ztS>HHjgBY5rjy6BkcD9LThyqd6?k);MJ_N*d{aEPq^r%>F79_Zq6hZgX+0uQ-P85O!K1LYtzza5vgf+HQ_<6a3y8?pPX>;-rPevp zdMEsOdCZ=ufV` zbX(PEhG{-N=Y}i5i{f)?HlZO)+N$cg>X&~{{3i7$Hgwyb0!rB_l)*|0|EpDw)^feE zjMzCfh}V*ib{<*6k&5o?pm)ZRlp|>?X7UyMRPj70c#7jT@VHiL$Az?HDDlm|TNbB= z-uBTgC3PRRJVe}Hb#nMMJVE?1twlCkRJ?KjHh?`gy6p9ZrWAteU3q!EUJ{41P0@@_ zW;Z^!@fj$pb8NN_*GF(0uWc``Vb7}Sx^*+`e4rW(oFVbC?-ArD@FR)q`5Pbq!9cBc zNWPrf9)W1xtNSsRXZn*NcC?IZfuYv=v`Cwx4G32-R1RxTZ9D7jZDZOzMH>^fPfBf@ zczdvan2PFaxy`m4BW#&?yv}|a5T#vl*>l&WD$rpS!BOkrP(VhR4soX;m9i9Ib3to? z&D`jh;|Dk2zTom~e~^mqbwcRoj}Eb0jfAee3Xl;H<_Lx$B-zcA9~+>e3(ITFFK@?O zd4sd%9lnwBCiPn0zyFvA-;u{>;cK*8!S~gby~DS2ujMVuFYlyWc_(DcyJaKgJu5GA zQF~9wFYnRgvhY1*w}S7ujg)s@ujLKQFYk_Ad5f~;4cJI|Kj^i*hc5H@gM88MlZ)-Y z3K&^R*|7)r@5h|HCKM1Rh1PI_Y&|Tvu@htkx!u^{IsANi+hv%st@fT_ov!*@I@*eO z^45=Kc*8*CMVoisqSCM!r9Cn47=R&nFC6ddAP*Ut{9=vT!IIy;Me@6;Ku$-``1C9% z?l=EId95(YUqMO1=R}dvs#s^&i@sgqrI242TRri2s);ull-Rc42>%FF*4^k zWery>^s5T)_D-;vLyoKCOX_fkybVs7l9|CCC008NiH1{iD)|I+nT(z*-LcmtQ+{tM zql@NuMilv+2)J#J#5;n1nKJ=0_zJ%r(NSSBk;G%PP(=|bD@~Gog2B)t5d7DrC-c6C z%-_B8yL2OND4Ih5rB4^LbQ4{=O-qW>?W1(*=#J-( zDTL_XXt>M`D>0SU=1A`d-K%(=W;DA9Y?< z1UEMPa`ctE`^NiZxSNiQ{`tpV34q}Wg&(KJ$DKttTA`r-!9E`t)>kjvw$|!n@|hB_ zPMFP^BM*#ctl*9&alW~h6cwAoAO?tP7LS!pwrSMrcq%cIGTiXr4qHzX+r{@tVt3=+ z2`^B>5$2A|wCoknewBg4964W;;s7iDbR<}o>0F|N#dEdl)H1DyYIYn$N6>YsvOKPS z?XOBIl*0&wlg~a}$l*CeX3+H)S6C&I&uK174AcsRQk`-MX}HjGvW#o1ALqfD9*}ND zgp#4gO1E^wTsmI5;aIT7ry&chc-t?WuCR~Hb>&UwFAlA=%bX=xli5$=vVuThc0hdG zF1R4%jEg6{eB}$*>3k5T-v@k)`8v@%YRdu_#pz!9(QR39vM_AGvuCExPoMJ<$aAEv zaOy>~EWz@hJ0jC=bTASc(}ozrbMhrE6O6RoY59V`+)Bb^)}MNTl7vV@>EMC;O+2l= zSHzcz4PueBZHCEGJCP)~bE!ioi7`k%`z%s4f2aDhBi}x` zP#?TcF9-}-nJ&z~=s)CNRFEHf)(86@BN905L*05?BkHyesb@4};z_Ik@`^(UR+l!pC@Oxdf zu*6>w62FMR$q#ehS4G{z*@GcYIvPK@NWmYYFSf@a+h*$ciL-H^9sou@G|%ac!_^*4 z1L9|5xPWb+ql>RDDrO5;!ICeFs{YsZo-dO9yRK8i{I8Hd=FRi%8xxE;N{B)M<)X4h zS_bed%$NP0dw*5PeP{JoGnB^VNnL#d^+=iyVg<3}Gg#mH}SR)-1@Y{Ji4IFEnRjapnK~p;cZ}T=|Kv@^>c|S$W?ps{Go#%FBu?-*O|B zpW!OM`-`HMzbUsM>syOkeq&kKat5``gakjn(FqM`m4_(AYdoGBf$q}^Een3tBLA?< zinOikLn&xrOHm&Dlptp1ggHif4YL1Y)~*EQ`_s={k7L4r9Zv@2XqMb-_*dvBN`f2s zJZw#9o+ch2)5(NKKZ(K_$e{0O@Sx++4kt&)?_|0{-@L}4T$sZ8NxB^CPvw}>atc!$ zcPIc82zf+N3}aDK#t!oAXHfxNPiBj5?kBBR>qem}B6RRZ+CEXY<{B-&J3&R7D~U#Y zJ0=gsnVPNzw}YJ1FR$D=LrwqOQ+sUV&6eh4PeAC~fofihWPe*V6ryn~#JR6Lrqwgk)Gt%MN;z(TG~%bgs)hB zPp%|Zp5-tDTqbf%Z-dK@P-)V5BTW{97N)+M)K#?ZrOj$VMFo>Q>=7DD2SFE}o+7MK zSk#wvfatKuE()t$k zbU41_re2NFn|OFr8{X81H|~?^T_RJB5fYLUS({;})3U#Ci^TcRiPs(y(UbyCg86VI zGCL?ecDnSeuDr!j!Zry1^itgQkZSZl@k@^CJ4_X#ZKbxN6M%tv!}fC0+N24N+;EXK zG}e+d0Tax(evoki=?d{NI1$=gs%4_Igl)+;rZebh(CH72Rn6LzaiZ8170#BTZC|Lq z#QjSJVx%pjr_|h)cDZP^UGB6?-HVa)9@jIcFP!(FZs@6L%}nLg=xO(7w4uQ6%Wbz6 z0_fb?JFB%v0MIuHqG^pRdZQKf+WBuZ8?-c1Mr{MjjQchw+f`spi_7C-yO9oSH`op) z68og#IaMlI>h}gCyAh<$bMP&lv{O8Fi-X2rT$-dypl&|6@;w`X{=qKdHn3UJfEt;y zwVf3(D%ojRUMI(z<*2lzq~ceI??tmbz8TtS1mA8vaUy%Qmz2~`J_$b%XIyVDy;<+x zO&zA~6qj`9yXywAO?m1>#jyEul$eQvCKB9i!2gM##64#I&@yF}Wqr6}=gt&XUH7i!}Lg-yR( z9U#SKW;E;MCDknuYvmxUdvVh7NXVq0YcuAV`Xb3#Vv<302zwVH861kT!VXcM=k{q% zGAv3yRCTQ-pDs4I)a`Hq_g4hl2nDkq7xp@XSBTAr8C<(oob%fP0E~SEMdZ9eYL{en zGaL2%UqO?!fwt=TRveXOUJ?UCkQ(3yKN~~;IE_pU{d?5U{CaF;&e4n(xH~E`=e2%z zHBJT@~lABFfUk&uYjCgu3R}2bPqOj&6q}7`0o_G<&Xh&);Yql#af%N6|R* z2675T);`pm+uc zN6ckw1SMBdXJ%)TQtetw92=QED6hoGy?fNpr2%b_#Qe@AIXyDxMn{lSBXgc|1UV%S zPMwKEmWy#MWtPHYWH~i5`w?+l9w3pnlu?kwt+Zx0#hP)toN4j2ZC#?BIn%>$KTPyH z!1)GtVqQ-yO+V!-c#~E_tz}2#i0l`!eXcJqsrCT{n0s8>tK&s!mkU?YArLnK0Pv9(KH)v&X}+{&1w$1RJ*^Xhre-XUUPotVH_Pc=Q|F> zuNsR$+%1>XH)pNfcI@YG_;KX)P2V7_{|w-A&6#YRG%=4t9)Z^=?XIp#lOwYSTa$V+ z+aheaOkbCzrS-@VEnXH{Sfa<@RK*q_Pg9&>g_@WdA~yY=}9bf8(-AK)3OAxr(1?I zdnu%1#n}ZD0XrSLh0Z$W?bWOmcl^IVQUWUu@BNZu`*A{8K0QPQUCX%0p3g>RAA>H4 z{QgM(j*C=3wl32281GlM4*Knuq}u$Vd(Yzio~t5rw%ACDvs{Yhs82u0-L7Y(&f<{+ zOBRpZT!ClX?J;bbO5HEaGy8s875Tlk-r#*%pZm_@`b(gw*nDf3W@%)Oj`xSQu#{rA zdWK@xMUGvCA_N6y=dSNReWBbzg9)(S9w-Oz$)E3?%AYD+ZC{qmD5vk&(@?mh;r`8D zx_;t;175lw1FYeTK-IA+P{-Gs#5*<|qz%h8Ez(&-Su74B`Dx?aFHF8N-m$)qOS>A6 zhWZ>DQ~&wexo@%YNIQoWE_nhS$#F_|P}XNXO5C;A5?`QpU!v7Meho_ppHfD{!-T5c zv|<)Cq2$C*TR48Q3;k8KIu)@}IR23ZV55S~h)aQ=>TTDU#liH~#L*yPyP+AaHV~C2 z-edd$_5VhxdUMv_9LG$GVn*o2iM)WQV7y}UpZbrJ-`3N2-P7_ZJH@-j7iB-Nq{qU6 z)hm@?oiBar8$3n(@zwLeR{E-E3T9tnV~*)vFz<7YuKK*zWnL9I?@@II4w#j^bij!G znZNLbv}L7v6}tuwLy*z<)AFn?-z%MpAQ)EoeC#1b9o(ULpZB|_=<{yj=Y08O{1W)_ z%aX}{{4!ru!p68(S6tbHab-`ska1%2uz#ZsPSNXbi&i*il*C{#ta?f$vC5JU-mKw) zr=D~_+ZgX3;?s@~`V#mwpn;w8boA^KUQUpo0h3!@8MZsqDO1Oo^7%R2d|ExbKMmWs zyW#}plm9E!pYtYV$B$UGcr7_lO9u|3hso!vu*H3?%iwT#t@Su%>R2Cg(DHvs!EZh& zpy0zVTL(AJT~4w~yd%>uJmm;5Ghc(zV3d8z=Xd8%dv&6xSGnxl3UzD2Tt@=)$>#9y z(k}|r*K2r=tvU3T2M8Oi%S^!_jXpAB42bPvKkolNAQukj<#@*@HA%u{ZV-G z`fR5*O5q8hxa((05v=R_9}8NgnpM!Z@$0K+`}S9h&H!WcOX~Tpm&aFEFKfF3Yx}1! z=B{c}ztQd;AugQzraP zLEmZ!u06Y9e|kHK!$SG8v7djWL}n36f+KcdhYgn}_|=X$>f5my`E`AMQPA=Ff5E?l z!439mdh<_LoMp$B?D6kXjxEXZd?7vFpWx}i{&znVM(HuwC$QGXTru%zvREFxt+=9e z^!L9k?Tb_r=y(SC1QJ?HF5hKc=^s)x2Yg5gk5jivypR`v-O zFcy&K!q5t3-2Btp<>CC(>C~Ob%|8|5>!II za)L2ib~>;R-Y7%FUV9fY<-B)6M5r|UMCA>@rbU)-%68|Q=^o~HZYWI3Vb>&E?UR|Z zDi8Ma$$*3*iA_$AQZnoJDXrezswx*{s_BGn^UDp^3^U|E9wMZx*$`5lT^Dh8IIWQg zXDLVL&{^akpLd4GR}2C@^KPl}h$^qnf?;su-3^s&*x$s&w1xOTAS|ykC>5mQS9KHW z(_0RV_nZd=1)3PEzTTLvG;GpRHHqq+0)DT?8pt+`c+kWTHNiGka#l0tZB;+nRhFG> zmatqA8&}A7_r4=inTu4g$-C>L1Rw-GCe^zs(()knXC)<-&8L%A9iNRC`|Tng?Rt{^ z=LN6Em(u9z=+Zy`!q6BTIoELnVxew_CedO3-3DN4CCFQuB{Rd7dfnSaVl=>zvv`%A?sTk=v`T%=R$LyK!a zoRq=ZJw1w2$4|^b(7jdBs+hq_z3*O14d;XybJQ7aYRFS~p^*uRE)Rlh9h!|_T++dk zC`U-&%a#WnN~WGK6p%IH%}pYt`>B&rysY^(bU*^0K)j6;s{Ec-h5X)lnwKB-;%9$Y zg!@L^S5&&u_`HGtA^*VtkpIbXzWy5O|LD8m(}5c!fC9Et|C^3}ap?#r*P+Q#9$Y#G zxOfEY9t!zYZ+C|HC~WTuVSQ@v8#^EC7=7GqM*+|1-_qW}`T2Le|2UU_*Z(^ItEcAS zyL+9l|J}C#w*CcSemu_FhEn3V6o(2A<@AS<*@x2&(X<;bJh@QdX5o(F%PT8=AX zD&6XjE40 zlm4-3RGHi89y*w(FZYuBz;4<#g%n505lm)(oea~ zz_nSp{1qy$*#HPuDRVk{Wz@Bg=;a-iF>#>mpPh z$i`Bz`^3&5@uWsNnH89(Aus7#$WH@LF?tdT$$&=i;5#~ZOH7T*uN6(hjUmO>W=GB^ znwj<0d*OwgIeE+a$i1(bUd>Nb+H2NldETK5QM!|%&}FgOG>71dtmn)y(h?W zXkQP1-`-OK1hHIcIBKD@xAYB8%F7 z0mwck*gH2{V)z0_&x!>0&$?)Nn?cu@X6N$A4&3bC4ec8iGG2RFc zci@clh0(?-W%o-M4it?h4Kx}}^{<4AspGA#U#hNwvz~ghXI=GH7f|%5&H(8%1^-uP zpI#s_DhKUEyMv|&+~qF2sH({M3F=UFTh4mw>Z=>rTXiE`b-e=9*MRBU3ou64 z;D-*1A?~t^yX;^WAjtj->9^>lZ2xGA6l&Egu@D{)Z${e<{pZ2;rpBZX%k`%sIN*n* zMWbSrHDbL{Mzz#vy_9EMNia(C%(o)_HYBWnG+CL_jQ+UZ)sb3l`qW)2g6Dsrda@=V zcQJiOk$Y1-PTr4RY%=(Q&u2)_n;+&GQKaQq9G!E1i`4{JHSuI<&(_Ieq6;xAb2=@b zVx@Ba-{mS`R8`2tIkEJtW$@PRBLqraFZB2yy+Xt8Qug!(+#lla z86HGO`1`!wKh>t_m({uSpZR;G|HR)Hq&L*t*?i;I)W9%c`HAo(Q|?x+Weuu71G%>Y zkh7MS1GtbM7M$q$fip3~*uJ@pk3c4PvZY1VG8sT(No>$AKl-CjzUj#l1SG;aRvr96}j8z^htyQEQZt0MmDx$!pK}6+<%#C2kd-kg+qf*22t|8eeywK920@^ zAgSc}c5`;+{jFVXikHJ*6PME_ZXE1K1C7pIqXq`QmN_rF!iaFEGg&ZdglS2c-q-8V zoMLeL1d{FEr8lv_=5-P-ny%P>c#`FhHvdOsB%6`@n)}3)8LpM%uzt55$3gJBfWtxi zB;L_c*ZCpcG6d9Z`hd8Z!%N!oH>p@ zm5`=d^r<$g#^OnMq6I&0mM83$B&}RnXGAEkfg^iGC|?^H-%eo3rO6je4eM-FzWz15 z2;VYP~t;353fPQx&0{BJ(%J>Qn>!MFZX3=jNPs6no*JBz^`Q9X` z%h}>>#!*TRO-p4an71Wh&%?Tp*+H7bdFo>?5x*(eFjiPnBr&}YnoybT)E`*1>*2@3J?5Ni?*A8{2mniif;TLa<6Ik>s04Dk{RZ>sGkb*v!>7{wp_ zfm6h4M<0j1fi#UBBKMg;bG0xEZeQlbYWWF><|*x5+_%)fcZ2lu;0fHQ#`!sT z(rr~AYo5oQH}pKK8f`z5i)5gr7F5mGbxB)QZf>T{Q9vN@zCzT{eew-Q(4TA3L823C zFR)BNbP}wxz;b0Dlr5h2DU1=eQ9e1D7FD^;Nabf*WW#jHi|#cZ%1L4>ddJ_f0LeV% zxL}|fmU_s6n^JR;NCFhB^19A*Al(8hR}sJ(`oj{9b?uSF6Svaez-LO9>Xw@7kdV_j$Dg1;D1>y z>>&eY=it3oVGNyA^p@@~f@< zA%`|b?mMJp+$exkt()a)rOI*1JsPnjb5KVvJYMJqlVb$C0Or0q?|x!AZ&Ud&=eOIv$)AZ6~c&6PuhMLQL4#SZPqWXr~7`-uW8KN>Bw=}9e zv`gdy?KG~?ZjSvLltL~G(zH)ByX&HX7U+fp4VNT*W;_c zF|0jc88~w-DL$5Jt9v?ZQ?(RrC317Tu6NlEvF`SbbBhEtTy0fzDC;K)B6N%37&XEHL+O2^R!J! zv2^KSrSPjiR05sDo%U*ARWO2`65^>ve&W*(ZeX=m@ZMN8i$ZDfMV5ACweDR$Oxq+= zM9SB$kM6*Sl5;o&G4BoPvf2z>*jSbb%uo`nG6OtBty3)58oW8;ZZ{4H7wRR)r*knw zBe z7Sw-Nn3pbd*bZe4%^McrYN6Mv2BmuIHN#+k3Ci@6=g?V_wy>zF}$q)SsjY3*lcivw31sFsO_xJ>VqkqI_MjNygg z0h=rWBRx~yvA znV{Et078!TU~a2SOj}w)U~urMjr}ddrH&6IWd>c2YrRT(4Y#eifV4@~Q$5GENHWR=%Fu3%I-gV^DJ z+gFPU(1PL8nSZ_J0JhpCgwK7V7neFtNu4oKs^=mP1W(v6?L6tnLPdx2^K_BO1TEVL z)@ErjJEFASoLWI^MlWu0so@9L()vDOS2fR(IwuuldPv3XN}nFQ5vfS(YbX`4@v+8U z=WJ=6VB0DBnmQc~%H{=NSxu4EGW$v0fW&rdiO!2yR5g=(L8>Pd?ZP*N3d{vwtAiO6 z!kboPNXYJFki+wOI@$1*%^{~wv_5W%0s(%qYtblwe5cZTO%}QDM0k-id%u@`l?t~7 zD%5}Uhk06QZ^)I|mBj(^)M$;Cnp94oRvHj`Fp*|hL_9KA?JzdIov9YJOmA$H@o>cV zTtPm{$Ki^_>Up5~*9$h9~_&9qZGxzbZT|&)Y3NwfI&nPYsyqkpB%3^f2d372D zD2$mErua;UQcDVNx@6}3pQhKOVm?F&hkiS-82-P!Ut(sW4UqoA2MrTk&pye=G`BhcVCfr|IC*V^NZVzm>=6kkgv|iOr&jd z375Dl`1(cJF_?>4!wN47{f0YpTq2T*v~`=|lE=JLKNLFsx#U=6?J7PSg9MG6y#eTy zF#C?l6jI-Qdd#{6iGsnDv+llU1LbVJI`4t)=98iQ6f&Fn^*yrRoFOornhOmh45}-R z`ws?H?JHpa7L1k<`?rP|{wJc~nC@XTzc+Tq^$^_ODf~Ab-TO8|=bTsIV{5(h3ar)dCm@*)*!o2~aSPHph`^Sv3sEu3BM z4|Fduen;69P!X*@z}@<-#_v1=T{GWk&5|_xH$+ZmKISPT*x86mFAV-^7S6#2r!hFT zPzaqE8*6=$Hx09$=$|NGl3=|}mZA3*Lx;9$yP;;I7(RjcrmzI*C~ZRm1~#CJ@YUR!J3;*H$3kyPuax= z{GIW-4Kwz_Q5i|xs5auPY?QMS{{f$#izJfvcF61U7c|s;Iaz)ljq{i4J^sy8l?9n- zKxZUA{Fp}7t(x4xOE((E7Bx3$jZfw{c<^u4_+EzCa_81&E~A*B+QGV$yKLt!-*uOP z?o#G1-z>Doec>)2yGzDh-g1{U?()1{aEVSrmj#R6%SYYie!Fla!)?fVaEp6+yd`G9{Z!=BDBjM;o?nvkgJKn>6t4BB2eJ7xv9#cT<_m`7JV-CryR zQv%{qhKBibFwcc*@d|$|NXr&@=qprbWoE4Urjo7?IcTVf+amw*kb`{t0MGl6aUGYJ z1|!v~L@qE;jpkQ~pZ9;1?|-IJOxyYB;?VV6nEs(KeNFJ|vQS{`tfO$3S=n)iMvLsY z>mLx#!YRe!1YKx(U%A4fw67n#T+Di2DfXt{`Ep_V`70tnW(?tvLoa@c1=sIM0$hjnK2i#;T9SmmF$()*Uqg>7vta z@NVPngBOlcTQF4MBsv25&_gFM4=5CG!$jJCOlJ|?c(`j!{)fYSCtoRt0QV(9Y_tju zn|!cFKs3#c?NGZTZ6@L9S!b}dO4D0z2;CjLb)?IktE1)c;J`*ztm%``F@Yry+}-?ktXJiRY2Q7xFa?GnxlCQi${uWF<}{EN+L~AY(u0^?5OBR!SV({&ekicCes3* z-N>D)2on#w&LAw9pL7z6HM}YmL6OM&dQUW-79GGz+eS?T}cz^uueOas9Mu* zm7QI87~2){+e3Asz72j|A}nI7fxtYrZi_%~(WN}NW0D%%^Xpnq4M^=JtUQ=w>F7_? zJE)V%8i3j})L2BRX`;M}GDMHD9O}YoDDRtWCb$cG&^oEmdM6;x4;4B8!UF@Xdkn~| z;{bj!z&C74N9%J(yk>`p98&6mYWa=|h4UK8@Dv%kZVq+GyCFegnJjT5dG~9J2wI5W z6KX^Js%0R_w=B}8U9@_%&QGOF3VBbngqQ==0-w{5h7NOIL!8*WcwT2dAk1ONk2w<9 zU)=3^s95SqkVPJAw}pnRQSjJAUvpO&OVRaOh>u?w*Zcn2sZgf1MVc(&i7ls}T;|fOO<*Cza zx}Qp(PKnJvQR{)a&yoBLPjc&N&h$LEiot+TovW*L6NkNA#_Ax&^okKg&;%`8`V?+} z8bqJuYkq(9Ovp>=;Me+=a(!}j(D!QsUwVd;eJQlI?dF<_zm3n8`a{Q^z^+ip*Xil!eOC?G)`%BYA(6{ap&l5^7&aZHho* zcDbc%5&6O%^=Nw3m4_AdsCO)PxPuW{-L!*xdIX-CjNO?x05MYNP`xDhxmopI(FBzs z&K)`0Zx_+H>-vxnrG3MDI0azOfS93VSWq6%YRbRPqzqv&q(>M%meIZ)VHxvqSgD5G zuaIBo?d|y$z!ecAu$|X@i1_uy5f*1?B&$KA)Y_z=X}uf+TYr}2%}9D4)%D=dNZWJb z0;iT_1f@bA9ZECA4)C^hQ(h>tjGF7qo?~}Bp9n=qUnb6xW83v;Ez5jClvCTiEChAV zF`&p`-UkSRM=X_N*;p|8s~pSb8w5g`!}0|aRH}uBB9D-_HrZ@L1Ui9`Wr>=R=x~se zEjLekb1~93Q^mM8i(&^`S@}3_Y0_t7JgOJt?O1eaMGTJ*0r~_E{>ptbd|E zU8+{)n;uVwOmR)f2rb4;psQDAx@kPjr0CW#UzV9ZgPC&LqQCJ&*B`=UABV-;_DPPJ zGfR8$Tp_;=W>IFB_Jg!$Yr?cL(v}dWSRZ=-sa)Xp+#=GUw)v}9%)vpA0uB3Vk1E4Q5 z3)_J(@pb>m?5!kLsrhg63?}gnf26zA{6H5LbyQ&EC)V%~v|VW}-@K}5;I~}ZGG0pE zYWZN1VE7}J{H&{sP{~0icR`dV(4VXG^aHE5GMNm`-^VY%dwrA8Z?f z^7RK-NOZIKPZ2&u6vrT6Bo)E#0;bqcSaZF+8f}?K=wsxq|Ksa zvoHEMG0(x!dM0hSY3Cv=pCW`7V)>be)Uaszf+8$?{BN)#UjBzuP4bT zWikkKcjh@Hv5+4Zun^PuH^y+LI=L$Gj~(Ml86CWEuCi3jB8q$MrO>LiCZF$V*uaV79r1YweFL&(7Y+uTi z+M@j}XU66HN=+cAm`7bC+l01M4c_!qSZH7{8#fH&&%tVRIGTvGJ!V;=_umQtVmY+& zkl^pn9gk%ufp~zsd>Z-^u1@ zGr;H`K6$Y7fl&7Lu6wmc{U$zaxp@&&eRLB^F3a4Ck`BI0ls*$y1MR|~szwSa)){QL zRPTpsU)T`H=@BOu4ZX0^*Kl!+_z7@3hWMx?724I4h2YMd3sfp3;~)G~R%vnksvuWnl?1xnF!1uUj&Or3cZf z-{Xk7WgCZK zL=J`ygJI0F-eIUNhM{aDFdShpSgX}@J8h|f-O=XZ%0>*MP*IjgyG5PNqT599&sHjh z_+RjSkN+llpnRbYE7USsWWqQK3y9kk2xY$?}@z{ zmi5G5Y>2+^k6A?bfaTE^mEQa@%4kKi|1`D1YRjOm0vW zw%3_;k}DJ@Sf71IS9?qY1t3=S>T1j5DO^<@LfNNc4a|*SMp%tGlO|ZV*`~Ho1OmaN z(lT>}+4^JaxiyR}WkMYV33^zV!@cCD!$xJ{AeT?zNg24S)?Gz#lKHW0+@`5#KtYLw zsB}}Cnt{qgC04I=chHJIQUzfpP(j!H_^j>{T+%Z*vdged0Cn9bk@O|#H2-P(T7A-X zavfbi5(W6DXZyWnv>&rr{>4<0VL#B9QNd-H!NnTXw^jjMk=(NT* z20syPYF;O)N?Q*R#A<;8RICNb&xnkiyeknX6$-I-Q@O%}6YfPW*xQ#8{N(~Cx)`xn zvVp8f1@sG?lsLNi7!@AqLKgTq2^+Hb@GZW;CvGlo7}TEUQR)FIL@6sS!cZXv{xT(R zC?)RHA>h48+Tszx7?>q+v~2*;H>S!PQ}w`R`EJxU zuuxYfGIrmfNO^6SUc4zZ6L^=p@L*`A9n(dwnU?V(AL7cs=`H{xw{`kGRqd8UJbtNT zdY}R{dd*<(!(|%_o=`29E|I{Dkpg0z*bb>}MF^yRFEVdyvr|33!J#8m7%;h@C$Zvb z5sS!{k0dTkU{Wn{^oX%dL3YmgA=>HF@*?x%qH7emZ0s&>1rU_8b=t~Ty0W3W!%G8- zCUYj%X0m@~7#Eru{;)Udd+E`!9pX~3Ee&jvCqs(e`RszY!xX3*gVEu~j}t0_gZ?e8 zV2%P)CG3^2Hn^^i9rEy`h4oDn01}0ny5XlD-c{L1m3{SQNrzp&waO<6O6ghUH1Xj~ znVX9O=K?c}hYpP*Ok&&pv z3ZbXctw%7U7xWm8u=r%lfH!if&tO>?XkeXlCX0r6h=y1m8s;C8MT3IXsMc^W)5AdF zUJ)fYzd?}Y{R-PRIBef&!3s#CL$Splwq5J&H0=hw)dIH05sr@Toa5t3XAzeNH$5m0 zmGx`NL0jq%vYt!p8hSbIf*>D#Nv=|+m=vq4M6giwxqpc#2UP_-fmNx$YL!~kNVDlm z%;E;Wjj&Q}BiRhKHhPJv*~)*;WU0mK#^gY=*bV0LpbtQ*5Y9GGE_8iN)z`q$kW5OA zLkXB4k|kdRa|4@HCRa7qy)?O|AwBrPCh z^&cEO$1eNZB}<_keXxhxy}VA{!OLsAS_I3z>C@{z2=C$Yz1{KR3J_o9IzA+Br7|IL zt91?gcj!3JM{TP^NfKpmpEF{ExcW5bHkMqym&&-bqe%RKX!s;5*>$3`Y5W_QwE2)X4> zk8oF^J3}}E=Vb$CT~IYsjUxd}>ty5q0!1@eqb~H+IrM-y0*Hd?__-v~bsg*;%w4lE z{if=tpAxY!{Mxy62KBR@(I$Ps0-m}0hNhgUYu#g$T9tcRLvm%q?(G{fd_tRjU{xc9 zOSQ^C1s|7s{fc;CR8qr42q!-*7 zz^=GpPisK%5-}*g9fj~u*v{iWgx_?RM7VC%^sTe-(~hRRcC4B_gLZ5Ywgcf<;kDK1 zdbev6B4;gL&d~V3ZAtszY%&T`se{XJ4Wx7h1}9ikg0iqhh3#3et#6M-AJrPn0AC;8 z#KRj$mTbGY`Ib)wd@xkRkg`Xw(TkGC&9?oSui{9kC-=@) zKO>zbLCPr${|Zm=tk2LgLG33o+9(Kq>I%huZfRKW=x;z(+24P)5b^Gq!iLJx+jXxp zoYbNmgB3W0jJf57ti&DAI*?4WU8bq*VwM-uk_zX0fX*BFh4?+7GRrSCx}H{{vwOqc z#y-(3!%J{Ut>ashQCbR97oqb{LzG6rV@SFQ7rp2@yon$Y_QzG={1)00{sk9+u-X2u zz16}|eGZ}6X+r#h(GKwlsnn}SygdPfMF!@Avsimk)P8i4`8O?;abu1A7Sve#Q$zoC z5|rxrfW?emw({cA4Mlsvd~&fGFLZUh&BAT$z?1g<&nO$eM;2wuYP`rIM-@@`Y0D3^ zeyHP3iVG2l<`%y^=PGeq>rVhtodnt_cOf44a(F!Y$Zx@;+Es|lrDBz0e7?Vx$ER6| z6O}}4FwJgge6uxtpG^gfdLjn?t=lL?K~kBf;(BBWpT)a2r1CvENbns7WX=vQc?Sn+ zj}lOU*}fjZL0M1PC!QQwr5x0(0=T103J88psFNPy8gCT9Ud{>|(-};jVLG;uUj}B| z*O)p*N57GwG3=D(lx@J@!|{aqcE8$!VT{)z9S9%XBsRr3!ZIAhj%&&hIsX&Bus!-7 z^|j1Q>zo1CCDgqXIgber`t3L4$#3GjzsN@RcH$MGo9d(+IhbnR^_Cnl($jfY*b~Bh zL>)(8%<)g7g-F?(P5M(V^Rq^OD)eZUabi?Py6_sD;x3!J%O-ZAkRth9z#2!BPptY- zONTTwVj9iRo2E(8h{54xPM_N&LrCtA0ExBJIeTRhgF<%nBFnub1 zh#`nmc9-NKIMOIBJMXNT%8j2otY@Ye?h-(pXQn2{y-k-I`YV^}WJ}c< zNz7KN@oR9uz6NlVGxQ{vVoaFg1S@Akl&Uk}y5dG=hn<6Abm(9}U74O^t%_DD%!o=| z1%Jdy6`3ehrY;%{@zoI6u{m8wi>2_qH%5Ib$y!iy>EXvdaT?G&uGKDQS6qYDzW0S9 zeDvxy-~nP(gTyPix8~k1RD}qk(F6jlWvVAAu{@aB@g!XeRXY_L#8u$i5`=X0)lb+G zwx@{fuFsF_vntXOom6xe)s-sSHLQ{-rot*GsmiovvpuI=mEea)1~2@Hk9YD><1&@X z@|O!g7AK~n%U&_s3PCaIc#KEefn=G+pJB6%&X4L-s;u2oK<8_f!srY}ceV`zdd283 zrst;hh0()+hKfh4VxUp2jbWLGf%*JsQQLB3$cY5e%Ib>Y@ju|zP%SH zPy&?yW)8DwJyHJ0q{^|uliU$xLayd5{I{h){bk|jWdOd0J7B%mUcAs)_gExxp>XJt zq`fEF%N0qOFVHQlAB)abmi>pG&t>wFp=c2QWYazp@Fn#YqtDgmVi1OPtI3i$P?wS^ zgHmS#Lr(Hhq3k&unPPoGxn05_rHh00t@ip8cX`iU-gcK)-Q@*$dD>l;xJ$dcJm4;O zxy!9~2@T;>P_yCv+wzm9qwoEpNXefD!Gb>Xgi~o}N5yBatj~pCbs@IUmw9FB7368W?#xo z9<&xH!?W30T;G$MW&879jp}-Vk!KmLyxT40RhKa~gR- zl#bz3gLb=mRepB!A~(koj0L?hzJt?f~?RN9pl3Pj?|h1u^O;$DdrNhql0D zB|eH#B}f$(ohL!#I?gjQufp!DGkyO*;;shHsxkl1)ZARmxPw}Q8C|<$%}`8MYi6r; zi#WryW{FM0kj)@#)SU{&)V-6rovxQ%Y*q-n6d~3>S=pUw)TFEpix9%%T$6XJBIf`7 z{+{Q&+;i`(7W>)Tr#Uar+wb|kKfmYYpayGCsomO5HIi1!`ZpGl!%O^7F09P{x%5Q* z)1I%Gis6LJ2h$J5eB3--I8k~Xt{h zJZXW!eZ=)z&=l1vyh$0F(1pU?XtHX!R(<$=jI1g@1TBN3EAp(HgD&)BQV0O+mT;6* zF8-UYoKXNn9K?2*RI{w~Z25jisP#5Hwk%gOH=+1-c&g(_YN&KDtCc(OT2~R$%ANCj zU<-2BU<+WQvc=YC z6cE6z(gMJ(Xc!%{#Y3@mwSuTA>Y8bNX6UU_eAtW638lMu8Ly|UNbX4@kVW_KeNJ-A z{EHA($6if)s$8_3%L2gF_Q1@>0-k-d;5$yRaEHOO;2OmXNoY6H06f6TaVJ`E8t)>8 z4qV$j&^!=iIpeAf^D%8E&SAItl8opbSLBnI14^Svt z|DVeD;iQcE_D8-HKjp*@<);pzJl&D9`__T>Lk2F!W%6#e{wv1# zA1mFV`yk)Ntk^aw{`$8SXnU5`enJy+t+^Gg)2$w>TOF)g{V7|mRIRR;NXNJ>T!EXz z(ps-iBv2SfKd*Y5XSyuE9q0Sz-OvVYe9Fl=6kCK(y4w3+$(or0L zMt@9w3n^hT+J%&WgjRg0@X-JfqZm%4wB5~Tt;9uQYi7v>^ll<X7AT-kxR9Vx4-xcyMFn0#DtntL1L3H|p~KC} zV*%pOWAj%IPhbjsI{m&!%3D~4j)`i3xEemv`K*bW1*FffHM56RFxBtaN;VC;ssZxIEgzNOaZV>%E9P zCH{`#>g%z$ufq0$FT<0Me*SI5qmJFRb2!=UGk0NWb3b+hECfr<6%kd(;;ygqQw%{FM-JD zZL6k;y)*8Bh0IUCQ3M{F_l8?G1%hu>rWPI==sw65CJTr}6nf8Lx}UgIPI1q^k4hpKs?cc6ul0NzhCO zVWz_<=mev)lpkl82O`RDKSY1o2#5j-#E;g#WwG_?Hgy({>ij>cu47pHggU)HKYZK1 za{7b%pVEkYF{lu!`d5Mq(E3a}bv4nPqrZ#o`kKi8(+m?Q0E35S>|s0sbn@N^;osh;tlec-8a9eX3t$SP}5 z17e)F_mwAzQqcPPCoJmB!GpEy0l?JN3QvkbIVU4i|71!4%+Vqk6;LC&3d3_+4Z|b6}~erA#hm2S_cjyTG&*KS~ux*n(!N--oN% zX5b^alzq$#_z7*&MA?Kw!yTd67sBND!WaDts0gdq5$qd@396SE=HNS|mVS52W#C=B z5aOk(pg@e{oy~!lseG5qrR)k`a2yM#IpQkoTK(;L)On`V^2{W}Xa^3LoCrr7iGhRV zzK&8}G)V5@7#WGd1110JD88ahpc04(%;6jnXrtu5klcmu7p`Qh&`qVg$jHs039Ih3 z?#HfE#AQxXmy^`RP?zCyLE(9J;Wt2DjMNNjHxv#_2K2%6^YhDMxb~tSo2+y2(NDuH z;3pxE(=}3Hf&@Ki-BktjCd&peCENE?_qKsJp#ZZ6;B~&R?mv*02DAkk!{GdW%mo<= zwTcq%YNv)_1Mq~l|rOcwy%!l}+T*^+9QljZ(WsRErZV1iB;t6Ei)i8%cWs)^2Es?HkWr7wQ46(#l z1c-ra)PWF}1`T{J+{D&nIh|bgimTJfWoZ)=xRE9QGb3?2c90d6v+vdma4pH~sO|zV z(nLx+TwC$A%nQJUT)&EQ5qLuj-rT7XwH(wT_ZdVRZ|Vg@yhA-0Ice>=U(fR>_H(;f zb1$G`D27u6Hqn_nN3aq&j_Gz>Rp!CXeuwa#S#+pe$_DU)5khG8z7+KY7MGd*c2QY^ zD$B0Cpy@`6`4}<-;HPG0Sa$<@3;lwn{aVcTKa3q<9@YK9e_6ry`aLd}fy;T334Yma zj!>#vf(d!OUS<5PT*`jO3*~&>WNb+-g}dIHn1zgA#*~^>lTJdJGbI<}M2UgFl>1|8 zG6JLIp7Vc+!L_^x_u?p0n>;^7T?)Rgd|;|4bt+J2Z5$`UoKTlp>T-p;MAhYDxeyTj z^ULeD&$PUv|7G`#RidIo>GlwUyA;df9qb+?;fVssO)3*7xm;OMf4PNtCGUh>RaRGxo%?n_R)Fs{;Rr7WzhV^y)ngei% zFVkWc8mw0=2?+G*1R)7VT!>M;iL;4iX+^A~S6$7<=^Q%Y>nX%>heJYCbOkD+KCY{I zd&V%VmcYzUEi>IHl@0(BG{tZxB9;{3D=jPWm6lLU=CJgaT388AKuny6)$uiN&NyEv zb)0Gil-j?}#HVAx8%`^nUy@e%k+l<&ZYymCFZIU2dNTg#G$IhfE*>B^pvPp zC2CcPFDtV{^;=JgAE**Xs}ieolxXmj*mMd_W7^cTklj!3#hWy}ry0rV{L+p!0Y?%U zm=|e5etg@4=jib4SFv{@A!bCKSQl!Y#VodM86@-JvTV8m?EDy3&0@75xyEWf1jnE( zLA@}zO-4!Dp%TZxyZcY9>=AWVGibI&%FmTL(Z3*iJizE$2@2s*+Yhlz z-oAgo8C%{?Z&04sAlVswX`^BOvVm+=jaty`a+yyDCvM;YrHF8T%-6UskgIMD5zl3K z1`-eApC1FB`LeB*@4cRy!KbCnnk) zL=r&32q%ie$Vpr#aV`&ftM^X#k0 zCLZihXxNo0yh+7UrP&Lkk2ih+#>Q;sFLD2szQ@jV=Y0+CU)Api;{GFje;^#A81Kcw ze{5GmKX8&t47D!ev%Q`;6hA-6N6$V};9-oyg9Z)+UCkb&3v!Kh3z6-24*77r9HJSR zJUAHR`*sPNsgDrh)sOR{m}0>$ZHJ6%$0(8x%8Qnh{5U!Oaw&vyE|%W3UaTHqWAx@y z7+vAmR1_Pzbf&{4Q!UulPHcXgZODdicK@1}gn0T5zxbqY&HaFsm7|DZECIL&xkQ%m z6(YR9(SF}5rTOX*`_&|sl@f>96fIj=5hDoVX$bPF8KWByYd7!4+||^Dk+g(R{4ugw z2G8B4D*{&Lxwn5L9T1=S9HGc`HTC~YZhfdGQ`Oz-aQ~$gau8=d+xm%c|)GO3hEgu@6umpK>arRqp*<%a_cB6@nqTL z7c*?3!WG7*(+-xSUcY#O;jq<_{<;OhWX_iahJLf zt0<}C^HYhhe_}r>vEM^NM2rm0{5mhM7zdsGn^B2mDGsk#tRP8X z%HPAI(Nm11hFOj+QqD;gI|jBD=Y+Bj2|;kk(Qb~L(oZolfcD}-)IoG88>(huOcILf z#Ka(DL7GiizqL;6p{+HYdiPTGs@=Si)G^!GalN@7tW~9wDeKq%OG}|{3G=*+a6H4e zXw7<1TOo9XDj7?<+JIgofvGGQ0U7Y1!l3oir9$%h2QoP738nz(by5y7E3S{$TY2qk zM|W@NuPK-n+p=3|7RD2l*nj;wqpnL;D{~&qNck00poXWR72%f_-r&csHW&%zMO7)P zBso_B{1sd4UY8l@5(x+-2k&{3%j67a<_qkSTT!-!H45h6ZITY({?`mpo@NS`5kQI| zmak*&5Bs|SCFRf|wfY~Mey~36j~RupWnq7I?s`B~pGj2`ro5lxVctq%5siI6Za8YK zH%v(q&kQ^pBr56K%w>jT*}6Yvv{yoTCV;UwExnjra)Y*_jycmGv1*dnU;0sGQ8%rs0;%R@hy!N4tmZwQ|jOCzU zBY8A>2=bpdxeU??KOf_5sI}*?AW8*ldfHRJM=Mr67DeEklHT3V*+}J=2Z4~;2OwE2 zX{dE?+)AthmJWl0RBx92fi9Wqh9(i)X*;CA=HIsAQ z!tqJ19ui<6xG9h$kNRld7domq&$@tQa@0d=^JY<5#rg2yk)5;_1+b4(JN*gncd^gC z(N{EL-TyqH@M0dW2bC)@XPe&9Xdn%cP+UHpM~Q#pWu{Sip>`2=EYX1EKcb{PIe5eQ zzjo{*g=B+Z-99)*$;ows0&1wgGBsItzRXLfje`ED%SrbL`QBJMhOBibW^mJGs*)dG zoZ;sljcAzL+td|baQ{W>SGdq^&r2QqInysi(EpcJsWqQ*%;X=>Zg@?PXCXWcRTEE2 z3$7+v#y1ukiHjoOl}0GW33z3WDa1jTaN9zyzhaIArl_u7&vp>v(0Y>lm*8JP;gD%# zTl$7tYlO%$$%V-iyoYPU0cUdXoWst^tHa<88{N9N>dkuUa}Jh}gBqRN*+OwPs6aC> z3LB;heN^BhY#yZ&iqFxx8Vn-z)0YU8kWvP_dIt_h(}VXp)-+=sYFRsgJ2rTAU= zo+Fl=fhNmpGidUTO1Y-otw_uMeFzy5dO&9c&3zNEb$r#o5*v_!*Jr=(c&E299_Q>{ z6pYKY;a346uD+d$zy&6`vR3~Qp&(6@G=4}EhG@pmxS%8zk% zKZGxc3{pep4En#S=`SMEV3_x95$@%l7HXAo>r{927%YCD(41Bjgl8v!Y;yXsn5DEW zFuvm>)SgIwy0wM%VQN1VzeL_@G+QUX$eJ~M40aB37KIWAeMY$MD(N%zLX{N=QuL`; zjh@Z-$+8k7gFYjrgit|N1MCY6%MZ$|cE`=m@J-CQ@S=9Oi>;;L9RNhj$eF&)$GZ&> zp7$3r~by?dpW->oE?Ltq>@J*NVExNH)c*Cf-!OQ^iv3)xz30Fa2Tda1E< zP+*PC+I$u?tjbc`QS|i> zY>e#(^m^;ebU&a2p>{$u#Q^v(EO`X6Vyy*PUwQ@`$v94k(@xKd=vbFIW z8S@MGd?daG&qKGX55;dlL3$MRoWYI|%rVffl^dv}hj8sB6gEFz9i=X$3sbXd`sJMZ zzl;UYPj<1Uy?H_%xKH&9g^GDsVttCBwA~aw9%%>E`0+wv1Ep(#4qB2^0f}u+o9%8> z+ctIDIOzTa`waeOJw8;Xz0Q*hyuYasO*@O^M@^oepWin;ulXHLqO1ymg2H-;VCb55 zl#;tyf8m|pZ64ba47L7=FQ79kXolFkD%IKKz^`BN5K--7u(rNWI@*;xC>ZaeU=$Zt zpwTI4x-*C)7h1j=KB?MG?{BB$BO*F|>{K~9KrMTMw_Bgr{ke7a5aI%8S!<29Zx>iM z%Pm0WFQflBpIg>5x%STr{#davH%SDcnnSbx4JMCm*)2nd8UOGIC#Ya zzU>{lYS9VQf|^JU$F>yUG=5|lRshWrice!+=m1e82Z=#qj^2396Tai>%eOeit?wAK;bj)$|xLkGNG`w zpK2ubw(A3Fm^L;LCh<&e<)~Q1FUm=kr5|L3)BnuOSPwQlqnewULO;SVZ>Dss;RnBz zVBLn*rc@^AH5g4NO@sdhZ$;Ja^7~8?i9P8KR>Tcu-D6-lXH* zhg~QC%zl8?`s(9**n?dsA7F0-rH`kK1(v?xCY*YQW9)~k*#J=T^24BjpL0?j$OGv7 z{5oKr=GP`?a;esIw0F7n^i9N=(msY^&RfDBn#bswn+D3MNII+l=LwQ!uMW*1NRSkV zQmQ8NSZf$R+paA{KG;I*j(;O#vTV1XB1F!Dmu}#K<)TCW0Bd0e4wXyU0A7$C?iSPr zfWwnkozNzFoqs)B2hEjZ97@iXPRMeO-h3;-AICd%(GB_3bVdiUwul&_5%>-nstLxv z>I0rc-biTatqV~TMwHm^1z#K?m>I{gDL7!9Pmu=Lu!_|H0524CF{8=;9Wq$=?+$oD zqG9p!#vvJ4TydttBA@{>;`E(RpL)9cKn0u4PrYPoVBTF5pj^_z1T)eqIr>vXUQQ$! z+ocEEAU*cP=s#74+{Ci|^Yc^P-!(sl@ok)-VV+Qo&#XZlF3vL&6gljhm($y zR$F2{f@lIdzr*$Co1S*~)f_802Fb?4BoY{FNId|E`*egzN91jZbsGr8eDz|(^6=>}A-S%RpPc3k zp!&Xb0+z@ag6e!n6@$U%eFAXTNFkWf#e-YXfv%BILhLRa00i{b+j|)H19`1wM^ck8 zJyTyyT>I_l`_E4R>rT+O@LSd&-O2hFuW{j5`~&8+nH0=P9tF#QB-ZdM4BDaXiOv!% zP!s6={65aE57|(kEcyZ)U^IOvildBovqlztma6h7t4SQN66fYS+fP0E8lxC{|NDFJ ziJkrL(k@tg8g4`mns6g>Fa|dw2MxFpIcUTUU)l@1X#<_K=T%yvn|7d+_NYqRa+}kK*ABM(aEnU& zmz$Py(ymfz>)f>aowV^PZMmEFkdt=2N?Yir&2Z8VRcSZ4X_q-^A(htRrVVt`KFgE7 zZ*bFUoc_I}(pI}^{hTze7Y2y8GyXgRYixy1Lo6d;?t5<@ zX67*=lFc4>YI{?~aiW3gb-1cH6CJ)1T>dadIWx{BurQ}9xVX8ay|?lB-^O42_(dO` zoQIt<>$&$3K+8_pDA%(8PQ(kf1hF7OI%=?jV(XJK;2e#>u(CdN@)ui}ej5>hK?HZ1 z_U?Wh#hjnsB#g-of~G#rP_u5vp*-^e$22BOul_7l3||F@M*av-v+=Zh=&;qz#h35F z7HZZ_e*w{ra6V5*4Ci$w`gFgX*rmJ6so!sZ3s-#K_&_)uW|{b)D@s&oeBALp;$wi| z1Iq$RyFRt?0bihW6`ppVkdBal`Vg`n2w7z##E*|{?Jhn}4;!to;y_F++(qbaNONx^ z@gt$V1TLDXUO%|kKaRu8ilGe0=%}HJec!*kAJAoKe6G1f8~L1i~}DK-@wk10*!Km+SOFHKs+QH#8ZZ3gSh^04E3Z#y!avo zF+-hX!ZQtX55qi8Mto{`j&@ZLJ2|*#l^d7BJQ%qiwnmSmgeyv{Gj5?w*Kv>|QYS+# z3H@?LvrqT!?1TIB)2r@pnqDZ+@fLYc4d`w~A(ssW#WZ-<*nKIM+TV2xM9){75y`k5 zJCSjrs3^#d2V^e+CM^p^Odge729X;~wnCcZgQa1eXZz1F_D&K{Ft0@xjL z`};Q$nrvC2@>Sd*k%0Jnt#2Q8CIKY!}@0JEo z^7G@j@QEGrPXGmp3Sf-?MSMiiLl|Y{TWarBdSi;GY4@ z-Tu`v9sxUS?rTKPk}fXo59qfYN@4;6IPlSaQ(x8flI>`M8_|gU^TRjsFWKP>#UDZuKmJ1T zYxx#%6ccjm=lf?MzR_PMI?Bzz2l8jbHhm-T&YAdj3izkiY=k{bvv*GHGGKvg zuI;d^ctY{AtmS0I7-=Wv`bar@J8L#7BG6Wir67JeFt8}l>wiEs!n|U%lcpL4XT`*s zHD9br8dr&GjQG2TPXo}#dWxQdqS-*pWUw8pMq5U=Vk*nNf5~&d$a8-+?g6^``Q>Z* z|K*~W4|}@d5x0N2?dkVmIN1a1 zO0hSY+_8PbDMgP#(eH~pY+~c;r}xu;cJYx0r_$HUVGha3TKBwOlv6L{(AN`l)W2PQ z%~q`u+VZ-xAI+t&CI4Q?zjFw4RM@xB*Yh9FjxVe!Mi4@DsT?5V;_TkStnv|x<77yg zvEo#^6tv?H+U>kFS3wM!q+q*U5DTZg(o&tP;N`j?X(cTJ&)$MPyXOFPur9dXE?Amg za8<5?A2T0j<+j)beJv()6}(Ru%wx;6g0k$w)d-`r7mQxa*4Epk@U_-IN1?-6Xro=o zNblSGyXEBh)waE#W9!^nkB@|tR2*H5pqq1lx#xbc=l)}?0I=)%GwuOKro5Ie$;E$v z;qILbdpeJAX&1?r)`!KaFRo05;umHuXQY)|D&=f_nN7;fo5{xJLjFy6EwK)x9WSvU zO)lw)=FO{-W-jF4^b`~mHZ>Q@#h2)gV1B2iNLbSy#DwC%kpys#q!0yUTB}=|5-$pl z^45`o!lLXI-6<7q-^cjF7Bq>qCUWt2!SOT}Xz3DOcb$z;{0d1x7i=jgrW9BeS-Nnn zw~mZ1@PG(oW=2JC>_K+eK^H`r%tdm^*#+5>V+)bD3vEOITeiiknBryqT3SvsIAa_k z^ns7CX=VlGs3033W;#zRY$3hf7A~y*cLeQt&;2VNVO-+5zsz$#+H?P&M_`}u+|Tyh zpX0e-jP(FE40Am9<2?62!#xn>{QUO1ba5{Ecl@*cP}pO$59yOtsjGNdX*R>NC6K*@ z_-A1$5n&syHeMwqz7PLw=zY2RcOiM$#~Puy!M7A{_S)J*ET5OHLUG~!jB+B8PPrGw zFlA`}h=#eP8bNs&ZgN1D# zUiR|-V$b_IxCiLY&(Du@7v-Xt!;helmmmMoJ3Dvfj=weLDB&3|9G*AG%a1>m65j_u zE?(&NFUlASVz8m52ZWX$;*Yf@KEYQ|gZ%y*KH4IOS2-cxh>FsARx8>3g18&E$z{gf z*dgoaU5Tnpe%b!;L5dcj==a4h4)Jl5LH~PP{CEKk#or*=Az>;Sk6!38#0kB!(mxcx zlLa6{DxzAvgtnEaFYpPtx+%}d-iJjychNo?1jtyM4kofU4 z@otSDgM`GKA-A_}6IF)&*e8NfoDFzy$lJYT$vM`$wXWndLi@lQR=L5bMwD^^$G~|R ztzx!_zH&8NE5hI;x7t2uN=;64&GL8(xaJtlWjgK2c0LmyNi|O_k=cf!(xB81-vsqa zXkBP%BBOcO(JAp(O!? zrX*Z}fV;ydU^Q~Fnz|Q=xZj%unMUG{;VkfhR|{IJO82lm=}K=g5% zUb)K8L(%hu7bO3cl79!h5CL@~KI(!O47@gcuQQ0={X3iD-lY@VGGf24OsBYCpFMp` zE_^uj_RaUa^6%}?JL`PU!W<<$<2N6NOpy}bhTasqAk|Z`UM0~7IKx6Z?~IQ73cfEs ztP8=?ub4N#6O?v-etgaUgT_~ye>M#Hzpec*k@McPe^$bZpft6A_6s1zGqDgmtK;~CiDx~3M#Y{NGe?+T6L4BxG?3J;DG9WJ~|nfsZQHQmk7H{2_M?|t9_ zr`uxR0?!%8gIc8c@$@AMQwq0OkGFhyBES2O0N#(Ui8p8GujsEu&R0S4Q-HKCx$?8@ zyd?qp)y&HQ1xZ<%#R<^U50#%EzNhD9hc6W8hpGLt9g084w~QMRa_cs2 zr@Z!oSja3lE3MoFl*?`z7-J`$aHJnS*O?vCYaSLf#0bcJ0*iORAtGtTM1>Uu0e!w_UUvrwbf2vhCV3P@z32Xio_nmHhbQdE*Zkk-!WWLbRODfp-9yuRKgmkdP`r@^ zBxXjU`ZPc^S1Ih(l~NVL3V86c!q0P+`WN$|Ej8}|Qv%KfjR@Sy?;N5AsGNiamsUh9gex7tHnCpM?7i`YyjQ7kyU|@frRS zhO0^*NOkL)FNhPbeGJ8?WGy#3t=wr+ZhP}fvRc+`^gBmb_*Q|1Zx#MvoOwF*Gfss_ z_nFMotFiPc{T(WfAZvyJrkHsaqJnosC#T2i#92{mY}fGPOviRTMaQ7% z4&+ynuY2cXy9+#ozS47F@3}t=_kQ_aj_sG(#!sH{fKR^He6Srk2#b{Zuu_y2Gdh|oLDpMh{f*1ugmqsr^gRIwu0pScE6um8-S@$+Y?1Fzotkp}8S zwgtp-c{Hu49IK=K8^D#40Mjp(zoX!!G3D@&CY``qYXM@KFk;tG3>!VD>eDuX+yL`h z&nS{?0=W<7l}?5q-ig@5nO&aVAZlp&#ICqL(Bd>R7_rm+eUj76g z_M2syGry#x{d>l9BP3+F6SFiW@|B=8M@ndat)KR~i0epY(0A@NF8pbFLB*SVy7D$l z*~gO1)x_(-4*2=`XF!hnw;OK~-P7wMzb(!gZ<74aeYmq$$ZYLXwMgQIO&EmNlUOT>RgZjUUpWcFiJM|N1dU!HBM+x6!e0w?Ojxy~5 z76biP==1Y;zbkzTZFp_^*r5Ke=<^iwFT+>r_VQUeOLNCeYKB1HmLtA`aF(+{eO`@8)obNLUpFu zYqej<=Zk%~k@(G=>kuC)s~@&pN^IXp^6nR+b%OJ>b7Jp$Ij$+N`Z|eO} zVNv8xyzQ{f^v84bPmSHAgd6qP@CGrm^ZoPtGvgfi7^#G-J{|j!`29b1nlE=r{> z-wtQEv9VTMyGw$6I0FxG=q`~!`5pb2O)(o@ zJznyH8cMe7_9{q?YDI__`3`i6sBu!HmgA-#P)HWGORN|$f21=1fte*WfjgISQ7`4r z_fl@GOSzMFNV#D!KsM!+x8ogyh2};;BG68c!+57gYoKD2rs7$+;*mSnNK}S60jd4- z(|7r-9P*?5`9Ua0_Sf<1XEx-Nh8+IBv;e=p>>QP=Dl z|B%(wcV2!Me}3*vo4=^Z?DH68sQE492ix;U_7Hr3m-Q+eS~R@2zi5N{zp{605m5gx z+Ph6xZI_?>rt|YRFaM|fJU2)E+vR7rYMrYsHv?^(G@$&t8dt0`Ms6}d_+WKU3P znj435+xqmSto>3uY+6_{%e2iCISR=HUYlLWw_mAE3T5>vR_lq2ZfA#09o4y>&DhOz zzuFVnp6$7>#XZ`!e|~-c^z>Zxz62wEe{44tAH}x}7Lp6B+g|hQv_vG)2MEit~-VI-`O)6*8A_(}2> zTrB)mERwZeTQOG>L-GBc(y(^vOJqJr&y84m6*o#1JJq2Fqz zJQu&_TCZ`)KeNkm?)COtp3h!FMm?U;yf1eQyW2C_+zHTE*dgB$)8adUj!a~_XF!R#3 z4E-OFfS(`Uarh{h@I$@Ur(RG)$y3<4fD5FLp*V%&7?BGPH?Rvfe4<)I@iQd9`x;=c zCm4n*D(6;UeMdy?JnAnsIgIu(;By)6Ej+O(NUa!+5}l3F_I=dLXmU^m7!Aen<&ZeL zou&>#@mu&RJEJ|b)U68ZhR|mL9IG}^V;ZCV(g5sfg4QzVITyz` z2|dG95#Tbtx5cwwYygTev6}j$*!n})cI-`+c$h(!02iPHt$1UO5@K(vvz7R%l*p>G z{zH4Scw(;p?O?qadu?6$ccnUAyyRRjCi#CM`FF5htO^Um{3{!=UJM%`Gmf(YwSBSP z@48=L{zbX)QPdkmqxlf(x%9qwWmbBJ;_DbFLG($@qvai$M)N2Coz+soPi83$5`xUn z=4e|z%yP@aISSV5f=zZoUyCQ_YSBKYrwJ`(Yq2s{i+`iK0jTTkf~Tj0dL5kjEY=vG zIoAcNFVHPEoS4?f&GM;=EFnkHcW80mBf4NDy~Uqz%YhuKLIE{L!9cEpqW;ig2^60o z$JgT1UuA7kMG?p3DD?Xrg=BO%&n{F&g1TB_1U~0SHB+)3H^qq}eqZPG+y`rD50EB! z?#n&*?*Vr}ulo7zVI5Y%+xj!zpFJ2e@yeh50q?T;v&wf3+Gh@=IU(e3>o9z^CCv$m zQ1{b!b;g|!W6GOM$Z@C0l$fy_`8FWWX|+<=tdb?UYSkWbDE(d?9`aV?*KxeI#DXH}tzC^8jkyfj~I`P3=wWeFE=~9c9Rd7)ixhSX( zW(dVkmQ*MkTa=3_%GT}L%(&_ufz$0)^ob~;jEYV}MLVF=5|-3-61^aFlGBd@@|;E| zDh#Uy9|qn*t#zJSMQKQ_hx2Vfp3`cLu+y*L!_V1kb*OKNpCxo!PlY0MdRmlPhrCFm zlhhi|S*ydTn0a?FAnHb7J)ds_@|+3lVL5AcU={aP@sy||fwe%vDlal&U5`~0*)fpL zQx5}ORI2l+u`+n7O;W)MlFU&e6`FOTm`iU(Q8^hYTP6Brr1T1QLj~EO%k%}de=^bt zdV~3?f7AcVOG%(RFZEmH4K}OGK$V8WLYZX^bzXkzeqQoYq7Cy?wH`&-+jIXil%lOT z@ATYH<9&YWP+sy9q2(ku1$m$>vvJ%rI@i^&UZi^b z)6pb^>#uydJgZe!E2(AH#J~1>b&e9^pEih9EN2_8t-47{WVKcQp?_MKvwu4{UzNSK zUSFYXrdNTLiJ18{pmV;el)GEX?Z8hR1BY~se@Z6veANaOCh;DDBRDH2&a9ys5UOo8 z4Ss>r+iE;T^HFr?1Yzg5)odlJ>)FR|b-wDjh8^*&fUvsDL^yCcoX5ph*jY00s(yz?Z3(dwt1mK+KVl2@2KKC^n`?}B2 zS-vH2e*dZPY>iKhiZFWCK?T@gi1fExkF~vc^3U(4H=8Z^v9sr;j62JQHyfzmLp=Ek zfSAVh|5-elE=JJI#y{7<_EzxB8_OgLtVbdiV`M{EuzyF*-IL&Pm^0JE%0m zBn4swh2_?%Xn`6*SP`whY#`WbxB9G+zp8EyY-BXkPR|iNbX! z*>U~z_ir&K(8XVmutq}~Uk|0gCxEy$uelI}1^Re)PNb7Z^q`rFbR;N4P*83?ASKcL zL9f!)kM5P;(dUg_#Z{MP*aGx4n~^xm4_&}R@k^xtI%1-lRvo~X*)VB35u>7H;JRb@ zIiN1wP1uC*3YnvVM!tcFi~iG5#4NS?~`du!I@MzsRruCJUc8 z%)~rh1Q`sf`u)3Kc=?Gt`}dTkq}>D4soi$Na@dTP+CgPwy{IUI-~R{F_CA`bEFvy zR^uZxGrt5(k@l8hNfSXU9LKLra12wzewu<}k_F zBBc)!7%@hP;v;Q=FE{Is-1nU5xdP^d^0OX44_?mfUD*4Aa+iC}#1axFF>?zq{0t~m zDL4+}gz&C>wV9tk)eN*!cq-B1uvelpB{S?j9jQOU=|+D0=e9899O~;0CusSo=R9!( zRRuVvReES9rT>+yYirs=vwx2&>cGxI{$c~<2eAz^sgO~yJIQXgvg_pA7GW7M0-VID zXWQ8lj9%+VurTXUido<7r{<~A{&e!G06}KekkqUSwN9ljP&!cBB<7E5OA6+*0em&p zI2x8dKqL$Ut@HEHa7tQPstq;{lo|UTbYZL=b_7Pin)?G58m+{p!N{MZiuWzI&TU`{ zKi@;LeGanm$uQFC{L?QqojWmUqcWi0Mo_RGs@%q_Fi7QUg{Yd2soG|!Y;}qDH2t9E zT$DSkWwL1DyM(v{5W^T)f7y$WOegJllAgjH0_~jgu#J(^zBF9Z8JhJtk%M(qkWw@0 z11B_F=8BUA2N;P}Q~;aT>t5z}LJ9Y`ky^8Q%F!ez1r48USD1DvHsy39@qfY`34Cp} z{A@4wmX7BWODeVI#UjOi?7uY@XZ(X$bTg`sbT3Ap&p%gr6a)YRHeT3|goMpYXGJ0I z+0QyO0U|*?Avzc_aOyiQ6BJv&2TGL{*N96NU^RuH=`V`6pT*IFQ}H>sLNKtB0Ib*B z{IW6gO_BPB zEx%)sQg9IB9l%$M=nivPu(uTOylJvGbl`9fM7xU}M}M+ckiIdUsv0+k)_)^4{)#go zHruk|&+Q`>igiVc)Ng-A*kAv2yZ(~Q`ddV|Lz`qtBG`#`aBa|f3K&2SN~8z=`b+Kl zjm%2gvQxC>W4ms!-)ikf)U2j9sh&*fEBI7PU(Z^~i#X0}jE?tlF^gzMZmG?#I^4Ocb7*%Vf1+f$QStBN(TM%t{BwwKd1RR>DqVXF) z(T&fN#up`SCv!L8;hr@urhK+oD4V?oA zI1RzXI;`+A5*EEOOmRP1p(TR|%+mi6wtTQ-0=^|)x%0HMk ziFms1tob^KH0 zeQ+QKK&DYaS_0d{!?Fa05_{7!Ei|LB44xz>^W9Mf=Beq37OWb6xKqysPf5T#*)KMj zyt|?r7Rt!S2pQ~)PfLK3GVP%xvLw`c2Vg*5C)o{b>S6Evfl@d`aqJ$Ij*J)hPu8>r8){#U~heFb75>>RE zwF)X3NDyIlDoYj}&Wapyy-{FOU^##N@Qt(KlgLFeNtZB!YUK%7XjGIWp+CcQOJu4c zd=q;zsHN6lU!h$e)TZ_rt@UF_vx)F_l7YEDxi`<8_c2FG=BY5FmNbRV&oD<+Bwn7` zfrvy8j!mv(n1#+e98EA>VY!_~J(75tn3_rD(}U+iYr>gI>r@L;h!I-k;-OIb$3i9O zs+pZ%wft203`0x1@#YwSLHGDPjg+|Ty8!d@xSYUz13IJu(;PBP4G0@z#ht4cTHBcsGO%t3louO zj&vmDOr&`vr6cs{$N`ldj42%t%6+<0%lHLYnL~22tP;T=Bl&eZ`2;(8)yTv1wVqdi zc7M?Qw2{D2W}itmESYeA<)pDk_Y3PtCko1Ks~WT>9Ks4bAVdSHBS2l%c@{kHG|hA5 zh}3oTdxe|W{JcwZH$OeC`NK5lR&*~Az|Y!F$q{KKKi8xH_Pv1LU#S64aUW3@eev`V ztuLV9#4AT%=3y)?y#+?|NEGlva}+qg>`6_M7gx9>@sU#--S&h_&MOZRF1x--p#e1H zIx{sQ(cJQalSX77%+AE%0e0W+m-kW|-Y~Tqj+-5EIHXQ(5=sU(b!q?y3xNE7tT{q> zCe(Tbq|l~le|FX|%oD;oR2nf7CxoGlswY&QFrZ~R7AQtfFid=v8$GANx!ZdF`^UMn&h;GVTTN=@1GYvgfHQhp}W&AQHX)= zaS?+giqUeN2G6D4Zfx0MX^mB)G1|bY(4)giswfux+3mdsQhEWQeD5k%BLAx4gYu28 z;bE|a2)qLEUZFlcMsv99a+<@1&I+h~PC|iXpbBuX1G*;w*Y-!P7vSvL$W}NQ)Slud zq0~kA!v^)wPv4<6njag;fsN+KpfSE3u4nlgn3`n4Oze9a|Elx$u(kRva>3PBNrcn>`Qfdz;RU;pQ>KHwdeR6iR%(16-?tFbV(0-;4BU@WFc%g7G7 z$(k@|Gq(~uQ}#9zY~2nnTP;%icA<(rRg7vf0SoA&;qDvlo~tY7Colt1P|hcU1QQ5G zcntnk9&U;s!#ILBePt2}Hzg1$9#@rTJuD<(Hx;-SkZ+}(Z;&_NBgm&hLWaVTLW>f108QOgbtsLbHUiCCg1^GB|Iaf$?&!PAhbH)|w2M~$C0I76zRUrN*J6aA^`L(EQqx&uz$w-0BHf0dVc=;mmjI&g}0&gGjCLnZS}V72-JXD`!1u4hZ~nlg{m26 zkm;{~oLxWoo$IuPd1d+p<_TW;`blRC^FkXq+H^ZiaVwVVlAJbEO!myiDNoH5{+AD^pP=E#?3zzW2Z~P0BX-(Ro>n&sTAe=z7%s?qi;cu?yq3W8krxn{ z6N-(l5tv5<{<=nldF>ie!3!R%X3yg(YyLWSay~Bz4X~>@^GrU2>SG(d*ujUKFmw34@zoV}5DWhX6a`gM9> z3a_)n;P*RN!FlD=b|E>UT`?U0;NpGoK_wb;^q+X&ge%h;7Sj4%&Hko=?D^1-o-~K?5M1vb){gf~gTBrZ{Pf z(WCf`(37?5umooZ9l_oa=+Wm?a zg&3jOE_{l;vjrmq=B;8M;edC1jiMhJ&welpA1tVRzqV(M5qmG+=y_4>)z!fKM23pkvWPZ#15_ut=zPEqA)fxInR5sP%oZfu$0sh7$&K% zyZBWo2`w!s$HJnJD~oYh#Gcr&u4_Q0(6zDvC>i+T?u7ubKuu5AL2W`s#sw$rNr`p$ zBT838o8kzN)*Hy;$w04rR4MCfBySfCr}^kWlj7ft10+QaU}P*F>~Sbw9!5nRf0<}9uc+occcq0`^yba{=0)g1 zXiYsvU1`+(8%(V5Y5hszll&+FU>Wu~6HNj?8W)Q61+eJu7rKb`&m}tm-Y|8g5C|Nl z1`m=#5$mQaIrD2Z8dYKtip|5z*suZ9VFyETlR02TssUtPDgiX7?!l`R*JsCuT{Rbc zbmf6&U@C4DRTjObsA8CrEyPqDN2EeVDI41PsAiS&;wR9>dxly^k;#*ROZreL)eC?B zObYcaPi&R3((@Y;y$M<$Kz*ihnqGMT>GQL`VLqZc7@ryG=mndlBvlD1Z9pjgAmk@h z(nl1#Vb0&4Voy{lrLJZR=L>;w#u8oCnaWyx4TvZGI#chx3>AgSr9>_{WuN{7eQ0ZC zBLQ_07X=+OdX$HddW9>}ZLEy`Qld^+e=Gw{?LMXj37$((`s;#DEp zdRkqqwTb_N?A+672JUe3OY#il0R z3EJ5n2==%q1GTz!>pko#twT8K+g3Ys*vbUh7NgzitoQ3XwH~|nJJxFkE=9dPfs620 z$-=F#C|RI}+DfjsI}~bNCm5KoeV6@1OJ7wE512KW-GAxkx>DC!>D4^OwtOch3t+bB zG>LC>pkd}4W<3@fjR?gyhUtbJ%=?2{&?cYur4_By=F&EmsdZSrfi?5N?l;rx#kwju z<2cU#snF8lc7=QJ-mb9uK?4UHbT2{=JmB}nyl>*Ey2L9+Yz4aXesBEmMMf9deWxn~ich5F!5Vs!u#-2<401Qz{%QC?`4C~?dc-l2KqqWiw-VO1uu-S4pX z@itii1Vz?UFGJNAlv~wt@;0Ji@Na^#Ed|kNY)kLxB}M{s4+DOvhLOmL(C;4UIr}sZ zUp0#hA`u}#-i8FxggT)54yC`Ts(*QREN`1$erR5F5BKFGbI>N2nWzf#x}Px2S#79_ z4AC5igS}TiSkbH2o|{ zHL6%qYcsaWbzhIySAKA}_zk!n-;9wY)-UpnTW&^Lxxb-Y>NGZK7Ij;wQ3x=SFW?i& zK!yW7L`E3u9={r>ZR2WH>M#XI@SFin!JOSoV_SPi_l|8X2(|tUs>@on zKRWmUl~^*c-#(t`d<4FHGO$Y?>`Y4wuz;m#v6aXNm*-d$i_3~O^{}J0)3}huY2|zhYtx!R@7i=ZK02;6hv1UiftjH${Ww04~UZbl$$bLvRL>?zI7(nFy067(; z1cum_d#16koYNe}7BisM+yUtOm>MQk&}1OuI|X zh-h7}9uQsyW-kAl-M}Zig^dsmvMT<8zQojmD}Q^7`|I{3MpP{L-9vQAxfG)qCg!_2 zcDH~2@)Pay71l$iQ5BJQ8J$fABJ(wgl7V-(Eu1kO8DOlE*^}(q88Py@$P?|a#AhJx~83$x3(~dIMqrU=@pUaZE znl+xMYkUZYonR%a;&uf~ru`gRrs-AT1gdtW9|N6GMI8h-99fK*5LVW7Qe#&_6XC+p zCAQu`jZxW@2yatK>0K1^3P?(r7~4SP z0>}khmzIO?spo+lhD&K%tS5g=#EdR)B64C|$n*n3t-nS=WF8=y&9R^`;;NNv5j#Xx z5u;{pX!bDH4Ny>VVY#fPq++!S4p!0$(9~kUF*vanWHIw0FQID|;1*0fATKm`fV{0? zd&w{fhk5{ntlP3Krp?9^IOSN{NKLtVG>8~pZ_IPR_ldpS^Q^>OkPM7Os>I>IdP5W$ zCK=ZEJiEo^D)6XGRnW2xeP8z*p@0ZwdCEz+GeoLSLwC_8oG)n`h8H*WNQNQZx!PY( z_4H(+ipG{r2J5ARGLiK#0N2REuv;N(`cY;+5j6vQYCK3X80sMHvSCUVmN*2mwuKc! zr7vNyVax9o8v-SIsT@{C$cDQ@Ru^WUi+Lv!RASwS56Pq0?{qQiB7E76)sIOvLJ_$Q z{Z1MZ76rGl7Pj{4O|D2v)u6?2@k`Lg@CdV&ScYoi1)bLlI!$~b?4Z$SRr&kUPnX!) zzPxdV^yLt{q1$h_`!ZEfYB$u?U-c|PJUD&%&5fCT@iL%rE&K>;nrdc(&Tmya&2R{q zn#B;xZM-`Je?V*RFGK$KNtb`{fwg`rSOtK^Hp*abG>On;Fy*gEktZetx1&LVf7@V- z17yx@L32W6 zZRr&qZ6q*q`Dqq7?%yFC5e3J?HXM0`L-ZQ!d}~T(-)`PvotudJWZ*Wt&c(N~Z|IF{ zO|T`j^-UrLI~46~t#&pzqYNpFeh8_J4OD2Ya%gZeFbc62A`|=a+aV6PhxxH@$vcpF z?Nn0Z<0*{VFaZF=pl(>~DppZtBv}vcs+k2amD5@`qr$DjyF$(pYfb=(Q{bi@+smAa4`mNd1YZ<&v8&J zFcyZIO|2JC1TTPCPFaeCbFNU9w44xJ6_`JD5r*5zKySP4pH-pl7+26RQrdbukdii< z09A=7ICKjh@(m@9K1IN80vz-lO1eh&{WY_iMPI*6ij2blfuG_wv^3DUfXK{i9x>?E znP0Ua*Np1K`kO)c(f}Sd!@)Dgb9=+{6EG;tUmaSCh|*fjf|)3X1=DT$J)NrD^wn^| zprisRX#?{?i4Rk+*(CMTbK>3_-(gn(6kD4u3(zn@>Ytg!h(GyWook4p;x3*+bt%ya zKSwRpwQ5#i@Ho1>6x5{Bia(Os*Iu9DK&h z=c6_qbqKY7h3GK?3z#?KYlSN=Vt$)ZWsHANuujc0qsU>H342mtYOY44k+)#sHe}Tk zyd0eXok#PTAz1#XO&Y0p8vI>APh|9pv}q{ybM*DpFn!PHFeCANT_yGwe}%Z?dYKdM zGAg@_o`3K$hKa9^jlB}>ZJnW|YdMU`dwyeZ7cO?icc*k2sM*fOAOqz9ki8j}v%~6=^1!zsRl^wM`a8cKJ8eS1v zx~A=h@~hEwXenZlbIaRsi@Cde2|BiQgqC(-K7u^mdL|@JhB25D3O#xvA;72tp_Eq) zbAL|r8FYW4O8V2dsX#*F5t(Y_PGPQHEWvuPI!dD$+E=tF4 zWy~GT74S5AIB!4@gP5KMPFgoXf(>&9;yUkPb=(#svAp~`By$$oo`vr;K!KjM59ie) z?ydo<#cuDq{LWg+aR4FwhYP?5?I;K*oZrd;(U?{TMp?j@t!ESvLo4tuiVan3ar+qF z?#7@Gyn%`Lf;D)>>}ni151eKy z#%9b=SO-(~MkQSNWZ;wgpg98znH$ocp3f{=dnxpB$9b#>5j9NKK^0e>$IRF`QpGK( zV6~w2^uT;C7|wQn{G!2xk`wa;af73%%@IOuJa~NSz^Y-vGF6o=n|M-bw~; zNh-z1`j|<@FAISgU98x;AFC6P^KPBfy7&fKIHmBqZ-@=ski_0)kKW(QPAZ}0%A4qnCH zvb>h%f+=W?v+)Gj9-ph#_p`qvY<5!$MgdH3aZm*8K9B&#g*2-oSa6*MS?3QRvK0BK z_vjydhWSl1QUEy##a93tL<{Q)73-p465+gGBKKsKK`&8)WtB*aoIN4;s8+J%x3z&= zQSsPCX>1u7aS0f)9gIi@R`uoN#-AU`>CpcO%hdk)sY@8cNd~^@LE8kJme`J!6Ttb^ryOiNcK_?@pOH8Tqd1rgBT+4jATaSr8BFcRN@L#yr@U!&9UsJ- zyzZA$k8*}I@dh+$Dg(n`K8j` zv_DnlG@`O*W#Ik{pQA_ZO>+kz40%;`njL6$FH|Kn8#1j?%w-Q$`oYB5 z3fX(A_a%YgvPo(*uG`;(OL&J zz*u2uUURR^xd7c0Hx!Sx%>4QBKOc*eB>o<>&Jl~5^$-h-q87to1b=ZJO)~I*(mO~g zou42@z}gF5h@XZar4*G;#JB+zWuMwcdXfZOlAyp6*s{U5Z5It+*kAXmmS+J~FYCg+ zMGZ`ThvbRK_|BS*?GJXmm4--!i8sY;!S8e+-xC-Tf zZoOd+@#nrM+*`7@H%i~9lz-!jh~{4fAJG=}^wE$1Qm22Y^YE@=r6C_7@wI%yRfwHaV0rg{iMardg+?GLcq2ft}PN653iN;>gIG3-W+Z07v@@NWue z_~9YS3UJJi?MGk`HK;%-Wu$)mQyL(qn**O)OS)ne+XXV&a~hrJnOzKs8;NJQsWdR7 zpKL0{2}T$p<`+D}-P(caSS?_2CNKh@M>0!f!fj&(CcbqW%w*obkMB`up?V=U zQ(l~|UbHzm40(Y$SV{hwdTLZp1JqNsdOCnl3CtCD1wy#x4*&%Dwkx89CK=dzhdhRL z>ig=Eh{zlCTT}W_a?;l8w4N0xJ{=;b=PO)d zrx};l3xR*@2!#EtCzRcty@hZ?={!+}{a~Duj^YiJO(UnICs%V5aI&a@xy;0Ryi{}1 zw$cv8?|}Blno*4ZJmn?%X;jGZSNa>A<5wZe zN1G*!9D^lRg5~}q0f*rg2C^t5EtEH_<=Cu#k4u>qs*GBdn`k3~-2BtL`OVDy`E5it z^JD!$CI~#8tL&dQuoHzQm{57>Mt+x^z@@&yiEi$ty16?qW;f0T$ap$8>6n~)#)H6Bw#lpB6J?n95BFhC7E4GacG9ELHK zM)nXEMEu9eAjk?mI)eGzF=L@t0OSYuVwD!-*vY_g;&egn)4UZ6r^O2M^HS51Oul!2 zF3T!^rY_&ruSGA-q<)2>JZ=ehDN(C)@IN}Vlmln1$$~P6g~ymUS+qp*aw@2@moho* z`X0-mBssYRm8?TID1aLKKCNQdPLi6Iv@<#Y`r%s)zentS_^~iDv8q}uVpUo^Sv2r< zLOi_5Do3+sL3twZ*?8a&dohfQkpLBlEgL5zqLwULvBq7gV*MZ1Cga^R&!RZZrIEk_ zDw%u|4!G$!r*!wZtgq;g9moli1OA{jRh4eZT6+8Ta|7rh{mJkjanb^u0S*(n_COsZc;O=$y<3r}J}q=vqU&nr%d z-?J-%AQ+xzDY*qDF*qZ=z+z#6paG4G z1J=dZ!0m@#J6;BcA|=QyhfBs~4J9DkBq8UyI)!Qyq5XKdc-v?mIo`kW|2aD!I6H^y z|L;mJ7rX8vYE^Kt*i^9bH>rf1KlFysAl1;QDAgcHlii3)*v;LLo0}yqRmxY>QlizC zsz_98H<4@-w241$5QG-b+US>35~2Hhf6mPF+Hj(y4yI@`8k>w}CVJpD>a-Zt0#jd6{Z8 zr)Jnv!vSQtApFo)eYWy?O(5sr$he_$qCU4(4=zZ}&fRG0B6grkw^jEqOiSZ3iS6VP z`jC*zO5sFG{k``+M#t@C7;VIl-I^U3R>8tk16Hl1dbecP30g<-ma3!E+38E>pE zb=ZyY6+pp{&0KD++brbxQDW4rf?n$6(3*7$y`((BN6zcoBaeA#bMK}@)Zt0ca+|x) z)1U|^yk|979UEsB)Nx@!9m)d^3jy!8Gf$Vr{e9IIHsX025hRFe9Q@)#B-K7+&R18) zPP?5yIfgUCvP1&gTw%A@)hE;H^KkvG79s%`Ll)tU| z{o4e4bc5G)ZPgp~A&cAwi+hgDlPJ)K<-1W>eN06Q1&9-@${%}BFYv9#k0sD=@n97D z6y(TZI>z5S>jZ-$vnY~lZm+4RI7o_zeU)w1mk5l^3$}X>=)$IKcX`j~CGW5(?``dI zgLtUExRRA~m$;I9@~y{ep~{_jNi1$&L7kj@knSCG4TKlQI&O_kEPS8m@H@%WS@I0IgxFnSUc%fQL)lH=3v1F8gZ+_VI(60r z6J4EMK2wlvF&xfunUav^bbEBh1l6x~%^Uw$&!#X_y3+eM+hW7>pU3NSyUYEh{O5`K zyo%4kn|ILwx<_(M-J?;UcD%=5I+?oeaizzHEoh5%+#2?sC`N16BFfy5#&r>Br?>U? z?HU%hsg^zf{rGWv7M0PWM(}NBK((=BXnlH{8Ioc$VBrOJdwBG z+gm^0&@&;YXhDUS2Pq_onibs)7?U-*R7&3@im%ImON-r9iOMapa;EAU*O-> zrOIza-^p>&QQ*Py;6VO#j?kttPW)xl7=W?86gyXnW-Nj7dEe31npZTNpEuONsQTS* z(Zx+Uq-bsvzpy`8pWCYcT#yCe(TRUW{(Dk=1Tx*O<29VzX^;#8c`Ju#TPsYKr%N@3~SvkDTL-VT0u67u#p z{L{NNAWYwX4oo{!OU>weB0TyX~8KNk{D-^hX$=t zqtg7f9w5({kEPkL%7Qn3pw2a0DRwpWRAZLv#9^Ud49>o<5^$y_#_ zi;Yz&QR0v@Fm|3G@dTlq!)D+suSf9eSe4CB$XeJ;<9728XhCcti0MmBFql0DT?f0# z$EVL0L3o$fULY(kf$-52K)8mc71(2L{!sNVZ_oB-G%6mNP$-W@SP;}OJP*6W+uzF9K$QnQ6j=ux6kIVkb0s49Vs|g=^eB-5z5pDLE zdDga)lCuU!Nj#L8&^n%Kd!PT(ltv$7KnP8Zm+hPwh3!SH|vD zzLl|s`U7JN{~r+YY=i- zdWad+UMI)^MzcH0-(}xOgmQzO) z@^)RI^GIp8ip|mF{9fo7Alr-o#DOwaN^Ma)11t_-t*|quS2Kon zzO$0z?K=QsGe(HVNd&(y`sMZve}E;rPq&IKgWKv~TzQQMPSl z*{=KgJlO>?OE<3<<)s?v>?te|Ln0PdGM~h!?L(LxGGKPCODrC}18Zz)1;tsW#HoKv zXO_naQ2wlD_1v4mY3a#z6Q^A~M)P~$2U-V5qF7BVQ)t;zBxTtWU;cb+9M5|Ni}5q~ zPP9GA+RRs6S?PvJFc}WcqGIIn~tkIrki)TaQ5E^}eZ?yOm z7&d65T)fr<`&s}e$#92&8XEmd>D~W-J-ug;(ziJNuLa{3oU#~->D=7jg8)a% zEd~4Y!f?XQTLHL9WmV*o?*mq(d!FfK zgN&dfOHQ(4lZ4QeX~cl$vc%0xt99jN;=UW%^~p zyT1R%mQgMj^H* zjtNEMC5+FzS1?tpztA9Az}oj;>7~M((>&ix+h`bR%aL3%N2>_+r;~c18amVsOFyLC zu*~=4&c2!yXB@*4*;ScUmEwTlJiMl~aJpvafC~1BQ*VY?>a@jvP{yl$Z~tua^sE;l zQrh-I>z-j^u5s8#n0nTKH;PZP76k+&`vyD*s^q)&*@X;Ih;&XO=<~S+pV^UAxB&`S zLoM}o<2l<6o`)Hp7F1e!$O|#ss;9fEYb7}ZX_ZA*LGYwIx`Ak9Zipc2Jl&)a;>%OiazR|z zEe5X9gu18QF+QCWytEfAEF+jw6=A8LTd9x$cKWt=dJXN$^RuCyF}BU+9IiGiM=sWg zC~R7-ExtLRM~?A>xRZl95Ef3RMhzUYcB=M-(t){*gR<7J^~o;oE5}Zt1Nt^UE5p6l)l3Sh5R>`qCatu%gHMXN_Ktc0G=Q?Hu{c zFL}yF!>HAM?Cxd8r`-z46a7m2XZ~Bhe~lxsVhAwrE|R3po$XX>C<)2^H3JrUZoJ~( z%7C>+q=iVqw|?hXYj8n`@XmbTbg49Pz3H}EduWT@Cri5*Gy=Fw%)TrTq<}I3g!-DoIjn+|Tif^J0^33jcC)IQeyAQyip7{jLHu-< zGdSOb?esn6$TLcVQ)bf1d%5q7H~N3`zr&c8h%zQX@rvLPj%QnyTG*}>V4%3%kA3=? zdK$F!8QV9Vn7uvNxc8`jQHEbB{qB4tq951KK&iY z3Y|vKDFH!bG-lTIZ2K6pb=r<0v=el}NbrZxKI;i?)Ap_${Kpz%)9!gnE!YZO4GAa+ zzw009m72Dpn>!nhE^lXB)fb8zxy2S-n41QT%%BTV^rnFIOKrN62v+(s^k ztY>jpUn8mF!MDZguf4wjkFb*LX4r%Et++0gi;&5$bz5>Lo>XNcVk8TM<(P&*lKu+1 zZNo_#97EDiVB*1vecdp?s&$dtYZI;asye^N*t#s*3K|b&q%s)c5H2)WIkEv=GSc8) z+&OX}HqTjyv)v*w=MI7JHyUvF$Y88weBWbf#J)6wT_rYSZ(stiKzcjrTjg-%&&b;J zux83m8)0#by*!74lDPR>uqAHi?BOtX{c)Ta&A1lYr(ii9x)HazYp>}tv-^XuQmUJM zKsu*%6#M6a%wAq*pIu)QujrR2v6~-ldNmxc<)mHkAMeZPSAIhoYX@4llc|`mE8+>e zYGyTwHN7O-9){I8toj89*>J$eQ-)R6uu}5}(~WQ={Q7aAJ~fS$2kYm5QTzPZXRbx> zrss{T8xz6K7YY%zP=;67AZFmjk=!`f));E@yzdAp#9qPO>HO2!wM)>DL5S~Ni5X7g zSE>D8PAhbZ#Wqtf$$Tmb75;R!OglcCtGC!;lYOw)4#@U?GZU-L*}0-`)GR;NKwO^1 z>|D_oCfy?1!bnM3+-MXC_|e$Ee^~(5mhumu$4_Z0Ap)w5GesSk;hHXUfw(4uIwy`+TjUKgp z!^Z_f3yvyUoakk|JpQt84?@CE+tXfUBr>0fz{Sc9OuN}9w>zFrlp4FEx-n9tq7Bl) zESx3g{KkrQc)dthx}XKQG^OAU*o)oaIP7P;K3wp;C)DI`iBKV1nYPZH4i=8&p0vOfScMXnz#5tM^6rZ> zpz#2eO*(hI8Jrf^k&~mG;JThk6lJbAyRxk>fM#qi zdIi>LwTR4})43acCZ@cTHYXN;beoU@mEP2?Z>v8Xex-wIa9`E#~Q< zA(cBd#YUwR8e}`DkaAR*22y4_I@g6^wi4Up_{nwYY5P;};c7vONnO73T6tcSVd`rt z9Fq9a>Bh!TEdT9peH*|Le%Gt)w)Q=$VD2WY zh$y*or`GEFf*2<@yPvai?n@KrDisa$RN{=Tn)-V8qhgyfeLeKAdHFLAhR7_#)%V6` zIW^!8&SdJ|*_w)J+y%Bw4|yue?V)V(AU4bP1Ryg(W}eUF1&C@#$jysJyIZGC8oxvUC{HOlX<#}U z&|+e3$cm|xc~07#dBwDeQWqA?7KU;;OuXRYYw_UMrhUx79Z`pH*zzzEegpLp_bP|L z9cN3#wEK!=AI+e?4fkL-TA!d&%EW9&r)bz+5F?uKY2;?^KUqPkJLvg zANLPG|A2jT4zwIXI4}4wCl}X$E|C9na)EQNp`vkL8?w%{KSDP408IO~Se+hw*qjQZ zSR-txgyb6V4mSDI7!NJ*rdK2yar2hqKmXah{51x~X{{+%R6)K#A$Op@ zvS<^uRveL46Z}xxL&jNDE}Tea7xiu=-`4Ab=7k)hwreoyvhS-E$P{$G{t@H-L)Pk# z!oJYoJbJD_9>?2h{;mItzwdd<^Y;q7xC%jLM_fZ52~O`08D09rG1W^~7*kFBkDRnW z=tY@=-QO+YB-e^k{6Agm@gFP&mNGTqj~*skr^B1<4N0_~EGFf)?GXL#4Sh5QvmLH} za_Y{Zd#FQKDQDo+-oe;AYD~3KD~G36j=&URavnSoV_#w?ht#~YgQ*zoNKcPUxEUW)}{`ZJ=ak&3(HH5wHp>_DSb%GA|!$7B?39wyiIr zId95KT9h*9s;D`dk{@XKG$n8A%c7g}zPefUIiL*hVUg%+`_QZE(uR@N&2|wNlJYn1 zp|bH_(=?UToI5R@t~@oJSbW-`_^E?>Lnb>O?LArga$sH1W*!SBI4GUI>fBU;yWHkH zPu(R2X}&CI*EIx-%~zjj{Q!>kC?s0nvO%gCZ&(zvY(sRi1?ZfFNsZm%2#e26&WQIE z#W=!fYaemh=V3G?kC6btR_U%wsJu&JLI-0st!Q1Q5!@DgXq6uk58E|buvFI~Qhc_i zU2%Wra?-)9*|eIK*%rIcmobrQMv_>Mkz1o;8o_d!5^p4z@!C5Xw0<3h!rkv-b)%x{ zhESaw8~V3&d~A5ej}IDR^Gs$agCT*Rs5N>M6~hZ*hxJYuHF$S$gYGOF!I09*GOJ}= zhLW0&h93c+5$gtTE;hM&a~qoeBAWvmJ2>310jID>ZopIc#&H_OUbs}_W<1-AUr{!t z(kI$Qhlyyd*O)Q0!jCoD9}n*Ok(k5slh(bUynUatifZyp?y8$QsD*-q(-M9iZy`Z& zdZ$E}L91J~H1l_wE|waTTSsJ{N$OhG2lA6yH5JRMx=r1fY;OE zU`_pOke+9!VFQqYtG0E@LPwtc7LFG`IUNlYTR zUC1@Tm0|({YppEF(-!--c7Enkn9x2i+0Jm^QsFnmNNkw<#!9%$hYuw-zJl}I5<|0IGq2FQ2xRCim>g=b4t(rb+ho!5##;)MEzYkVo-&Q4y%s>tZH-b<(Y*? zWtGk2lN%A2JD>^U(Vgl&2u7sSchXuQpK@H0lf_jLBJA*AP6a}lER|ya=n9vb{1q;x z<8Q(m&!0(Q#?Z3*nvk3x1>34uZ--y)ex7>hVK`*R@`p^>8Z#8=gme5Am|kw6fDjoj z53Ctnpy*Is_3m>8`=7zPD(zOd4gV{}@A1{W;&)_(AE;@b>B3#{g8zG)2zLAXBDaBH z`{d3NOibtSk#U&uIAprT9AY}sgj;pQPJ=rdFD>{ub&rCVCN!&ZOiN|E zF3z3~t-p}Y9wkMc@wIOK+h=8a%v~^p&^R9tzoby^&vnf}nHH9PVw+{7J0nZBO{Qi)=;OMoYdwQocWs z7i%M8yt+{$v{B;OB&J^<3!}re#ikY4c+ab%W$Zlr+6$gX zJ3NOKm%3K`rfFM9cNT&jmIwPE6j;aQ?+f9R$TPv2B$?9;RESC)$5)`(G{GkEw?Szx2Ge{SiiXl530 z6WbLlvYUHWWw#KA?&$sPHtyX>BwJ$s2+X$OOEo1Om0i`dYE*XhC>l4^a#>HEbAj*o zN797lqCBr>yvnCW>n7>0sg#V?J?Ic3n2^KJ7+p)9eDINOth> zo_1^RsLHUVH+}(S2>g+ahtty!PIQPXQ+&xt5kWU9>?`)=sIgBCUj2%~XZ(R`D>9#r zob}z7tvX^pYwz@hE5LA}kZ?8TbkoC)Ir6zIGl}`3EVGKUTvwl6AFDu~-ky2my2`a3 zn|GjTWIOhBAXTnP&8=@)-VBiLj-C}%IP<1p!eB6Xm*;5%b1QtvhPmfi?%Xq+$Lnu| zsG67CF*|n^D`8e{>hlbi)NAu z8DwwkcXRGcdcclt#LjXw|Tk$|DyghkQWnu?j)9+WC~7Xk@-%=4mlgK@ICiqyZA}x}a&7rGuG%?t1T2J$O)^_$iXnVRv|2z7*Rx`CeSyuT*H82mu z`4cCz9pB`8FFI};{#`qh!FebVoj_u-)#KdQbh8NSnCnkAwZg93e0?CZ$_Hoon60N4 zFLenR(aH6~EPvL%qgk&decea&#lIuNQGs}GTtKElFK2^@Nrx<-b)5x18uc{%u}nLu zmwwIv()+K{PI;{;1>2>U9_4@f4A~#czppbd9$s2amiu~_-qM8sDgV++|I^`mG7ZkQ zSFYp?(o}}0f)ekVeUGEK?P@~HlWO2{6X)HM+~xG&^m|YLv_{QXh>@yDurF_(nrHlQ zO4$7ITol;~gEHtA^>aCh%?57ejG9 zCxgd1@5rdB2f(O&Jsx&GoOHgDt^Y)}&a4|%F>7SdGm*k<(j0~QAj-7jsAO5g;+0Qv z{*L;1Jx^7^^id|KV`sS>!LcKZKhlxeK@;3B&o7QYpMK2KCmuY6uu*NXG5aF3GA^tZ z;}!d2kHd&sU=xThN(M00(eF}h)eYpuM<8z*?Y`Aetcor`fZSE8H#q4%BZCfc*JVZN z>YIm2Fd}c3Cdt4L|Fa7o zq&zJz*u7p3Z*mAPNlir)?z9f3YfX?aELIi3gK8{{Je$PMK1@VXtx&Q?_~seqSy8LV z_Evgndp0pbO#UF5`_?H3kW5nqifL7fep&ek!t!a2h|#w;5J|k zRIyMnk;Ad+7CMq_rV&z%T^SOu3TN8GWI6V&n|L15(ezE8&$jR8U#JJzSR0rOFjNs$ zN-2fyCp5UQw}BS){I9V>lG%+N{H+@s^8bku|9Ag_?D=0QeV%^Q(`Os)tD=2{7=_e} zP@{bX7+qd~Q4I~d@2ei8drq(ss&p;C*Ej7->iIW1a>zrGW{uVetSAV2bvT#e+dssY zQE4+*1`g$jVAd|eCc&>(CFL+}it7!I!fKIaVtp6({>_ekP$5OX()u3YoV4*zvVbk0 z_|mr7^7wzK@@Ps3ZgJt(v9T|M_?!QN9F?nJeZ~ zuB^YD5KZTPypddKPJHN(IK+hjXYlcLJ2nbT#p#PjZpiv+*MjZ6UWI7+i`rSARW9{a z-mw~YynI`zZB`LjO=}0Rq@0Fq-_LZsN3%e|O_#Y~A@WX-m8>pkX7I%)c+Y5xj4Pu| z{tOJ;BS+2?i{QK1dOk^TLg2)lMG|7f+z4@*JghwAL}&9YKvun_o$Mn22vF;fNoKay z$kkTcHSV?~#w(o=JTTQf9JOVZW~T)W>O(fFf5ofj;9dII1=XVL6v}o#Qd*}g=tgC1 zL0Is26bvIVtRDgpK^6js3droougTa&|$alKBuYi{|^EJ`~FH^4fZx6?~pMDIbmY z^TbM-D;4W%-}81 zwJs+*B>4H?6!&7r?l@4I_E;Iak_QXemlCrC$8q%|)vP_x^T>CMN2+W3>78kww7;}? z@amsUVT(^1la$!rasc6=HO5sR0oNez!8?Y;5sE1{1T7gVpP>JhHXhTvn77i`hgf;Kf#!-jZ|8mM^s9MA&z1&`#2ex>8(>0kTtg8y+`-9$W9 zW0(b|)#Q|IYTS`IS7J_@YM|!6DQC`@V$cyDoMc3RLgfV?9A`Wb<_I1>M)WQNnccl} zWL(%}r&V>1>}OBcm_{7SMh4EFGo_k)YJIe=Hr!;~IdZJ>@_oGjJ5hfJy~};xnV<8N z>%{+K;n;G2GV4&zwOZTI)R61UcJ*{{#IE=BfvmtEZQi6QY~UbX+bT_O8JS6r0K1dc z3W_)WL~qNjKbi~WAe5Sy6t$Q$a}FMg(KiE$14M*J8D~_uBR1_$Ju5(R_BX_k8GN?v zw&s@Z8-9f>)08UFdN)s9@SOOqw0{Qv%JT(>sd>UmV;ifyk>E zUHk)|c~=ltv^ZHk7Z3jWlp6GaHAqCR$*$E69zD22%)^k(wu8#9>FhwE0vZg7p0(Y- zW#8r@n%_(S5|_ACaVH9LaKiMR5haH}=u1$l+}-2e=8WUb!XH$w%AHmvw_RUQutZHd z0}Qdagi&4>?pKJHWia`t`e~Z8Y2(3OmaElapJ`7EMwq2Wt&RsDu?n8fMOk3|e3n|5 z<+jpiWJGCkbKi{8$)jzwA1Co;yvvGZHOwc&5Q zM%Q}D5bd*|GqWApwFr?(J?%qQ(V-V5W*PO<~ zgY0U@Ng}V&nZFnL0l3BnpV+C^h@d{|NyTBfiwM$bFv^ zx}J1jJnu|P3bsntMpuL0hPN+lQ8zcZoK(-rph2Fi{!Z~;ndgmF`BGhfbd}`rY~TcI zx9ax}Yf1(e|E(aeE^7&s>K!wpF)w_rAj?RyIPx4?ShtNC@!Q4Jt%gfT4Q4=1vXPQq zHDK+!AiJ)z1ENo)4<)x8+16-a!raWkZ4N*$)C3DV^Hpkvsg{E+t-B+)fH<*>-4;Dv zAJDErtGj-IOJ7w~7Gk6EZQQ@U08ZCrvUc4{{A6)oFY<4Zmwz%B&c9xP>gs9^!J~B6 zN&?L7@-zOq(R`0R_qsK7;4s$ZT4RX4v^k0Ui`Z?L`avaF=WlKBPr^3kp$pDJ;1qy3*n`M-lei)O=HlQL1N|Sx zg35andTD=%zuJFdt0G0hDb>g5X>{F?Ro5QH_g9ZpH>j&){VhwKY7SBYPJm&b8dMx+ zmDLn_P4g{s{)s!WH5|Pn#PeCgWdn;uHxNIWagr*A44me)@SUo?NW&@d-1oEx|vLAr5Za9w+mWt7CgcB(rlDsNY{; zFuFu)5BBWVn*kq@lHJ&Ny16iOr=+yes->fXLBa+v?6B(RE*1QF8(nQH>`mRSgC)Ot z(ok5Bkt%Wq*R`85o?PC&lI-@&6T`26UGWU1K(U!QnAo0A?I^5Qy(y#fu>H0-U#LQ(jMa*2=lTqkk z=uFkT%7%jOAo%7!P*0PC=tuFQ`EJ$Sp1w5^;Hb6#X})W%vD09A2~i6FfuDu&q5f<5 zJghgSKTZsRJ?gf{2T;8e{|;Gq?RMF9nJvj{V@s3ZO5TUb%Y8JcbZM8WYc)Q95`JS0 z=xXzuLU_l*%g|dUX>F0XDzk_C7vl5Pu>4!U7e2SdgwOZ*w-n4)^_XLOl`; z9k1(Ws1w>Nq_-QmSFr}Na;gL^yOr}7<$o{qxnLk`t@{lUtfSOxwxN* z1UkH9h7E{!@EnL}@M5x<7gesbee-|f+n0pwI{9++Lu`5IQ=`2kKO%qQgqE$9yfuz% z*}9$nj%mg*e-f>HX`rK}M3J-B)t|`Oe!+d#jrN)5jpjBi^1tKr2j?8@bz=9H?0S=x zLzXpJ=*s%A5wh8UR2BSz<>wGF+n_YJqw5;T+_JT=ka?nI>kdM7&Ug5h`J``R&NtQ3 z(4!pG)LuX}kh_qY<@A|+SJ?lWC5uS)5NTj$Yh~kz%+~E1ugGle(>OS@wQr*o^_P7c zBmDp85L3}-gl#|XAb-42{*GF9bX0Q&lAGe2m{AaX)OBH0`iaNIEf^`@K~lTCWmnj(e%@mmRyED3!b*f(iU4^j^9az_;s19qb-&KbV)n* zDaxlMeflxE{P+oVM^18qpexi8H8b)hA@ zFOv({E#C5m-J|_U-^Lv?pHwn3`ZolVa-EZniu;BY zKXZUhK>K&&cD7$BzLO!pvwuo^9W|{;8q9usThEdMSrg;3Qk_;xb@h@Ixt-f$KN#R> zqgGji&g9N9P`}fE4|W4}8$=Fq|8FV&5B%8U|9`bF_MT&X94?ZV!XFdDPfBmq6MfDx zWRb5loy8S;rUd|X@*|%4Wc$QT?3AczJd6%)Jc`f^jZ-q8^l2P`6vHE@0=sG}JO@nc zJ(KKD0I~wFsPY(b*0rqGC^jMuVTm6dc0YPX;PX=YNk!vJC0Go` zmJrc!2(}&!jHqQzLsw=r{wh}zG>kvEG|k*oB})tl%E$S;<)F)L(HZ#2!`r<+^GQ6> z`aGkg^1iMMPK z^y|LTcxYzJ_Ko|uY_UrBO=ns4{LTAD;TsR}6n|WKqSC6|=sMS9)ODc1?aI3vja%YjY#< z$8OhjxLaklD=kI2r2=Ez_Y@nO(X<0Y=9|MswCsY+#lB@=XWk!NeU50w97wa9WFCb| zheB{pL3-0ha0?n`%1`&Bd!$F6-upEDgedGR21 zb}YP}1EFGw;8Q|Xhp4r-xVF!=%y@^@cc(sV^lgmlwBA1KU|-DyyTC0MyJZVRT0UzS zx*j5F@6iEsLn47JMCxO%!d=3G2U0L+0q%0KuUp}nL~UT%IavKwRu%Q|KVPFk&&bTkwqTSz(t$ zv2g)m4(o@LvtR?xxY9oTzs}(Y7imvR@E$YW`AyztODes|8;;HAinZS-g;B zVOv>ChTqb8FARmeYe9$F2CS1`s4tjid(BedHp(MV2m-{@wSl((G0Z~sFIpG*FUI`9 zkB?p}$!c)PMMVfyIS`r;@J#SEu5&7Aqzyvb6XN#H1amMGdrR+34c1rmhurB(NI+j%h!GI4r zTEjLYTUp;$l~VmpI|XZKq?Ihq_kS6-95Y{Q1I#SpJj8JLZghJWXv)I_N)YanPo#{W zXR@)%%};{wYH8I*Go~c)nVqPAH`Ql`og|7h9*G-R=A%iZw%DWliMgT15@;iPs3tgJ zh1a$k^!uOwS&ylU@e~pTAlq63%mfA&Z7}EiJej*`?%cJ?gXBm?TfcztgcVeuxqYX> z3G_+6(MW`bXwVl325mdBgl0+4UI%KSGzd0hQwASAPv(pc(XZ~hT$FM@YAfQuF>LN| z_E;z*gLCBSbzFhsT57gA9dKlQ*lPAy|B+{1C2`7NcQ%=2<;S53Wf8X=OqPf!|8Fi(>FN(Hz7Yz;Q_uvYb30buW*r4GH%Nz{MkV3 zVrPjLDfQ{`B8@O)p4CJ&{n(n7*gI>xS>l&kLAMUBXdF$EXU}v++;D=}ta3za`ZdAB z%z0$^v1n*uG7ikmq7o$6lCj!swxzf|vkVm{2Z5-N|4HA0#J8<7=f|g088pFeOdJ6b zX&P6il;1YwB7Q@`rmT&DP1uC6`!sJZWnDA)U`*6JtoBt6*@-OgRcz#`X&hKI^jDKX zcI9pw>f)Vnv!w0gObat@Ts)iUjGh^Iv1PAm*$>p+o?M~+Hng$UbIDW|^9&%-Zh}Mq zOwo`V%K4!xY)_f|j^;C_Ie)UZM|E#dE#sQJP`Aw2hnfGeYk6kYE!co5_tDX%a8_E1 zthGlbQC+5;1ruDjbfT`LjR&tW;U)1lC5miE+*5wO*b+V(Z5gi&Gk)RTUNYuA)*s*Z zxyhS*DVWNs|nR4O*RtYSSw1-oZG? zfq~G72NUtmIjC>pi1bYL9gz6KULNEX2{*17H?wU}(uBs5rGy*()r4xTJ*;JC60eX`dXY!zCT#8hFtZBT~xgqD;lP%zE7oF zI-FRANIyD;5&%J|fES^eJiOpq@m5>xs<5_w3o!at_;JT_6y9>21PURj&_@vu)InCvF~BkI4{Z z9h0D@%fb0?VI2#1k~GuYDAy86Gg&hm!W`FLP}{8PFn*g!kP)Re(6$S$yQc`_e{ z3 zX@6~MDef;Ya2$^G$vfE(h8vyg>NGtgP%CF+t%&$LMH^&J$$L7YO%~0~WMX$;4yGBr@bf$z5_B56W z-HFWES7~&)ifu-GEc*^MvQQ}a8%HS>Q@mxNp$)}W(k!9PM1%gvspXa%kdAt&3J!il z{cq`EgG&1)8V`gOY^#3ZJTbo4`AZIWvMg8q?>81z*!~jf{)b#1r~7a5c`Dn9BHS;L z`GBgoUBxym>q?074TI{3oNoa43EX8{7yARXA{V;~G;C98|3uq7zEG@=VvZFObHoY3 zayI_ww6*u+W71^L=}v*yrqC)|XV?~_rwKbT=gWNni82j-GE!s>$zI$q>?`S?i@p1L zgvtErOas8=#}hnX47$yR^*r7^lPYw|HDU4ruua!-j%hEpJf^bF$a8!ddq%9Z{fVx> zBUU;ng!=UDPWsrC({WHRW1w<-9k^9Rv46hdvAlx<+w7>%n*#k-5XxlZ1{{xrUe3jy z-)QR>gWTH1#kyzD5nje~<1Tr-b2fe4vpg5O+X~G5Gu<>^kn`qL-kJSpfQyasHpyrh zM$uB#kz38;2x))mfSY&m?d-#iAElWip0})X!mR826!}W?GA(=a6H_#eqn5qH+XB zmtgl~n0ncd3b0GGo`y+b7(Q2zKVuT0Aabcy)NB~baf%ZnSUp^5V;LbC`hT09n`p(RDPxpqE??a>o`z@K=11oa)k5Cx zEZhr81TNCH|18ZeZm9AkT3l(TNcwB}Mf)f3bs$h*=#cCHCoXBvRf^(~TpmpSkhS3t z$vCT^u3(}vQkOgF>Ka+vzN)Bwj+x97H`DG&ffA)w-)x)lOg6eqji-vfc@1GKBD)Oq zdeIK?4e9~$v%tMGgaN5d(Z;+@kI?SUuluU5fHnBszoIe0=Lh+mOL4D*+u{jU-ZAH9 zA%kG99!S^y%;)r<_N$vduP^PtV*k$JJ9`w4uP7hK42p0n(RfgBHA{=7z``7A;8Iyu z+{1o$B$xXIKmV6~do}vjv}w?@y#Q&ZDY@~rx#j6g+D}|@&`8dA)N$}<7<-=vbl7U# z?tuQ0fiZ@@2@f>fg)8yYeAku<_TU)S7i0&?4N0$J5H;>yT74v~nnoMI;lXQai3xTl zn1OB+aJE#=ZKjqC+{F~x7vR6Hxb&0M+7dN3BX7qGAiHTtPubW1t&vUD-3$5r+}Hf) zOTYiQ=1n-6j|bl!?8K2NB}udeA&BGPP=^_<=&<9&WMxat zco8}HV~b;Av9hwAsVVxty!$i#v0uIuocwrTy63;RMgXo>7-a4b@^Qcr!fs(>8|5d5 z<&!G!B(ePI(gER6s|xOAB`(+>`j?@YYhF)wC;PBiOfUkas<(@YHYz8=D8E7hb2s5NP{ANnT%a-w$!&wXP)73=uaa6%Igr#Mx?7;p+YofVZd zr#>C{D1n!wLcv~4^Z~hDn0o&L^jo7gLTOGJBJTfs|NB9_O5w-l#YXi5^at1RDf6HF z?-Lq*du`#*_$iO|_CN(_Rd6fHP4r+XqeUI4ACK~L=+{dpNxtc~vgH^06CG#k9G-OV zEvxjGA8^*XCq1suKQ72W-WEL$pQ6WL4*ghKYpz*~Lu^Q8>nxJw%h2$>nCq6_vx;89 zQ|d5wQu~}ij=R`Ovv(R~Ra}|^LpSqT1Xl<8rH|uw2gPM<6zi4#p+8x6dNy4sBuwQM zUf$N38ed#%XKHNehjh^g5cK@ag*Y$^{82U)E?r6Xi>p!FRyMO_=FXEFldENnaZzhn zu}qNC&ZZ|uCHVdqBYvwyM4mO1q&>-09`@%YQAXxipmRxOrFUPZGX76||MSA3sDeXL8y<2=Yi2?NM zg-J0L4g`AF9}88PS|NTx62Y-}Vz9sU+i;prE zb=wv&6@nij+Qln*wrY?G5&Wd^d#`Nu2RC7JBD8=cqXAGLhYC{$lky+s(Ic$t<`E{E zLjeRQkC+~RzC4;b3*!9`xx}4}AunKp$7YB{Yz2%a-YJIZrRnz+e($yE(kBHdns|yv zxuU(r7RtCOu6!7kcU^?g4*M_PE;k+~Ob+#bP{}^Wbk0ri&AOy}VCGBZi;e7vZR-=Y zF=^eno;@Vi#(ZTt6WP->=$8N69~R#qCtNABj>r73gSYa;~5HSM9v_+0)*3%D;zHv&}_Jl_t9FH?ju*jm1Jmhs) zbcnO2dv%nfSU3~EgTd;AS)`p_#sJOd-v-Lw>?ou_Ax3JY|2cUcdn6r7lEPL+3*gN@ zw{26eH@Th1A+p((OO}7*f!j#5eZE|psDoBzSvt*9QbjPqLEyt|h^hcLkq`a6{wp|R z(^5o<2n)OJRK?2n?=iJfqJH6upKD8Tv%)^|n;EmsePso+>0~kDR@4Lc^S?<2`r@^dy+ofrn<>JeLurS`FT^pX zvZJ!USDsL(-L+?=)0!@T>UV_zPC{SHc*9eP!+wAb1#?GY5vQ2&`H=tRY2@4gov8gtQRGeGxVJvjeC4gx%(5=f zF0!`RV<&kcozVi3s%)QQ0g;-nlc+L4!A}k`#O8)2j>r^Jg)6cU;CJ*RPgG)`Hwy(! z#G{dSXZPTa*TEvn|1QEbSoJdh+)eZYBOyw7PgNN9(IPUM@X?ZgK5}dn^i^y0?zsVPS`ju&MdN2&ym+XaM{n;owYV;|hfP_8GLPuEODa=01 zF+Q;I&+qwN$5f3Lni&>#XemA$z8&Hd3}=$b2D}EhvWj1aGqp1>&RArl&NtsGcdd$8-&oNW>Eb98}O zRCkzS6v*0{ZhGMsENKn80{OM8+Al=PisnNZmN9(3Wsct;zsS=kT?QpOuePE*={B7_ zEC0N$2*)nCzf?a|=A26n1}=OK{%rrR4Gv*ol>y5)qL-v7?0+VToatD==_4)biCCp2 zODsuGYA8*Z>3pc@a27IF13;Y&m|_W>ZRx%J@?f|wE3H`!jSV^1DA5*c^4(c5ZTu&e zdTFW1{)!w*c~o5gefllmfAANVh*dOwsT4+M^KFpEIFVya3dosdkoA41&^U5}#ZiX_ zk7dWwxJ>&FnT?x=t>^Fpr0hRaw$(4f;w!q!i$l$3>(Wr%*=YjNPkmvkxaq{D6>;Dp z=gu;Jr}-#6y~9b*lI?*)iK^hbCt-R3pyxpOj2*R|LT}nEi4w9+4POsYIuevbWikW4 z-?C83ZEuTNr-j*ewrmE43yv~fNg(#u;e7nn_!8+Ow`VOaq~jzKoVH!hHNk^7JAR-k zP6V-^yTP|O9z3ggw?ogsq#KaDztTr-Tu#G~#QzNok}qWy1bd&aVz!mkqD#+{LQf-T zLNXLM_pV$nde~8zk>d$nCO1XXiBxm!i6-D7G{|>$)EEe88_a4JbSq&(iej0|#wRGt zLkB_?7!GGX^pKjJO9|>H;)z3-y-0S#Ld=8T^~Ge>0m?iTQq||I5SF zEA3-dPw>nP4FbT2`I0kF>&dBLI%iNgKj2`x8rrJ24yAZ*G(GPU+G1V$k{vsqw!X?^ zPikTWY}UhkT&?u5!pYyGLd{aTw{)EZox46PcKOixMf4uS1{b%!B{b2+4l6APX*a;- zhD{3QWI=n54F!@K8;jBQEz+`(2rN->X2fOr8jE!I2}?}!K%=hVqQ-xrz&}@U`?&y= zjcN`xcXV*x)}!e50;N4+lCQk1R9@e8H9|;;G4c2ULVqyb^=w1FGZa#KsPg0-!J78v z!=Z(R{^Z%Aq3dS4#c>dMcCbR$!=HXxS9v3Np>1L5aA;#?ej*<-N~bN;7K81y z-JSYoRb$VT?agru5gZGi_C;v$WwM%V$uG^^cX2r)nMHQACHRJTD{{98-=h9};9TFI ztn|dr`iB>Ff6*0M87=(DKf|Ghcb}nS+N%FJm}x(*7mTL?s}#O~LgwEi;-4FsjeF#p zC4RITybKH3jn?kWmdaT%w^X_ct(!CvqDBMY5&=ymB`(Y3g;yDV0n;LP0JjwXO&n(K zCf@(H(x2XDdRuElWJITk00^ z_aULZ=4qkbSHdXHO%*D)yvIVprXH<~?u)m`v8@@ze(F&! z%QRtDq0{`j+f)IxK}qYR64p`D5y)Rcf%53Uc(*(pr^V#8WFAuPp+mYw5YoZD-}`q@ zYM!e`kqliU9P-keW7T)UCDHl-g|x?Ge%(wENZcsDB(2-@RM@&i>kam)`b9p;;0W!u zaOJxyIPR**rO~uQkkye-_A$j4MKE+YS8?xAS-DoL$duzvAAc&j*KB|byx_;p00#n; ziq<{zZ1<2SaQAxzDxJMbIOD|T0?83mOdVWZ(1bZ!RO)oq7)jb<$3AjAM?P0fA4_eI zsndJf)7cfenRR?VIPZSB*$+Cvww0c^+%6wBNEeZmg((|T^WXl$x9;B?3OLnGgS9qk zvo0sJgU31P{%Sy}XUi?s{1* z$n{ARns)Yg)r{Oog2KO-n0=96xG(Mkuow~~Zuq);zfkX)_7r4G%ueyG>jeHOlOK~g zOm6z1!QF&4?B%5#UGJ$NaB%(1DlXPS<|b~uS-jmAJMtYbU#4@hm&;GKK`)OYx^f#E z%PR7x{g0MI52<3C=CIp!{4oub;2PFfQRV{`B`bSYymO?BuyCRFH}-r*QmQZJx2B#% zThc%AU_FjMSDS(f(nSj!E^x@QO<2F^`8;vq=1{t>1Lp4_#^V@Mgxo|9Q; z!*h6j&vKzW|1|nGwYVbHtPsjKfq!aoB@v51oAs`X>u{y;2^&FZhe^3pIf_rHuNB=d zQLg9I$$V&eT^=gp1GV*iDxDiUg?4=XD9YtVGld9kw3GCOut3?dgQ24ZYt;23!h9D# zxX_DAPVrVt=AKl#`!>7CYgD$qV`H5CH5JX7^*!r06M8~>bUrvz1KhawrmxURqp}@C zwh)wJjN&aI*Q<9^#p+}28H-t${lGQYe^sKfW<2J;&PI)_(LA2bBjdYTKWgL{ZkR&i}Z zzR6FhfNOGL{#7_G)ile0-CBtE(PDLnUDY$#B-xy4YK+?_eY;{9=Ekd|ZnVeTLaUi6 zVOwmbeMvEUr|Yzd>@t1mOr^*|-LVP0_M{1`s^}oM5C3>`+Bo~52s5kK@pZ))LcS)i z=$=_o*~Q5U97n65jMwv_RqP_oWz+RGkh?x(K0X{I5;tC`rmG9TYoR?ksVh32xPS+XV&3TLrNXw)V<6J^kizs=^J~W$hT+z7= z$9Hx?a}koEEq6+?b3_&0tWL3mOK-pFM2}UcE<@r{FV1Nqdyh!wnir6n?=>!PcE6y{ z%a}lH1M}sAH#VzmytfMpuO8kxtn>B1;OSn(@bU2NPo7?$|G(<{PxkU}4s&84IQbG& zN}3bh!MDn>{h7sH8w>VTtfLfu{}4W>5Mp1YoQrpRlAcEQ$Jx+U zJ;a`C2XI3rv?}@hi~Zb}44!(ycGuPmVZLwb@J&8z5_faH%+%mneHpTR8drSBuCNnF zGGE*Ju21J`IQ9urtbHb0Yhc)P4+r>SKXnDB%0&F15L~}YZD(!0bMnm%Yd?+JgWzHr zHh8*Z1+?BKM3C7j$?|ZEVS&@^%MVIDnZFHX)qfY1`FF6f(mC`u^b+q4Hc#TYVI{%y zRPu1O@+f3^j)Pe8PwW|P=XKKd2OYo_sR__4^?69+ z)C?9GzV<624dFmM4u*Bnxw-zjuVzn$JK8O?nE;MUU{JOv*LVF!f}Zmt?Y={vr9*h% z`HfJ}nR_g9(Z+#XXFWUsJ}2WYK4Z}J9Pg^TYeEV0)5=o*oH@q$pLvo916b;(69p5$Mp?RI%aY{oTj71!=2TQ}8w>uqQ|&0P)~R2f{CaWqfKoPhB35EwR) z-UtwYu20{t+_h%Le>@YuBE3F6zaD_yN`gi~t8na>wyQWIHX-`cM%yfeV%y20(7#bn;-D}h@ z)>StW)j%A+z^*)(8k-hcxT%O z4Hp}YQ>xZAI-3{j6FXEYxQ^7HmfjX?-8|F-{}%32a}1`F9IPtk($sJQ!*qC@9$E-+h`0jA8y7jeAn6^ zTXL}4?^ch)oyhTE_9Sb<9ZD4XBZO{SET{Kav)ad3L9Z8Dte-e}by=8yyKhMp$4#qbk{3++f_wN<=5k13GFXR9IYIKKFY-o{w1fiR!%!0 zx03E%Is}Yu7EmiUPSajJD|4~FmSgIx;IGR$$0EPEaJaEE`Q5-n%Fh9-FGrM6h9{23~@N{&OAs| z_LAk8kDO!ysE!^U>(bof%U((oCQ!?V9=K{^)ThTYFVi?o0?W3f@H|)?Li^1)3al3#*O8|d2CmJ^jP$kh?1VKzXcKc*ktcUqZSLLN zcCN*{(PI2Hc&BJ^-0Un&!FWOO#7%Nqr?V{3-zuu9susSelcHZ~e{MqEnExTkp_|?9 z=-oN@+tIs|AZI^!{O;}J!X9Nm3d;-oIvcR*3#NNHTBfkN{j@139tVn!p- zyAz}jFM;jymw(o`eJmseSYa?WXQB>S#%6IjbTqv!r|2@MR8-J*%9iZc`>JQMV}@skzt=iwH}H#$TdWMK3k8>+3zed@)Q$lQ*|60C_$R{)P zbbAZU)RetVB2AbaX>T)l>ld62M4h_)=6%-nhiC7sn=eXO;K;6Hih4gW=X7+L`nbVz z&wMt-rAdu=ITW|E&xcYiPm07?t<`tz2oy6wKM>^H?alV*3>SiE7 z*D?Vhu8Rn$eg~pEmc{c#OhDv+qFF~YlQq6ml^bqOiyLgA-qm>ufo-X zi3i=Q^Mw^>MH*6b$m3n!?q{=`dsYou-n52q1O2x@(klPU%QH8h9+)!ut#+c zXY@8!Lg3o?kTr>$9t8WAPn!An+Sp_IL!SG|GhnRb_)lC})g{;F0$vMTn=N|H;rbL4 zlKfqJw|#%vg#yKw2(G(Uj6!9M{3o%?nF zK?%uxOS5abMl-TW=2yyp58xO#`vDQ6Edp)TFYPTfwbz!|tb`ZWYj$iskL`N&J9_eV z?>iGfJrka!D}_HMgs&D~XP|*4E>+{MFyIzTP=R36s^#3mTEN?dR%=x)U>NdmXpfZE zw_#}5{}MF~ksSK4Tho+A&9W!kJr?oYd6Tp22do_?oQ|qnu zed)H})ur_3fx1!r8St-l@3wr_3@}t+|Hi$cN$Yb?>IK7=BYk{s5(m9Jq{&L{HRaX>j>qa!hEY!^dzKIBp88iUvs$8;&RTk11DY_r?SxSTXmsYP2Yi))ogX#ICUaoqQTvfZt3F z-z^b~o&k!C+_+Whnb+yb;|zJS!@x-z5g+icY_KjEumVlrv~yN#B~GY0wz=wl>zad# z_@b@vpAkOd2SyPxsP7uE#Qje@tIx_x$^4=+7`^M50!YIY zocM8jVttybCwx5fH)0^I;_9o{E9Wvy*9Df4M@Q|c!3_>2>ZhHiYHK-Zv~z0i3Oy(F zJhvm2SiEBJs%g8pIk}WphAE%>I^A7K1z7i0E^+~z`tTr$1oyF^zS8l&=~zGBYZ%yG zhvll@ntyLacAvT*OZe<@wf?9ni7dN3r7L^5Uj_`iw-oZP8=rTE@EUTlzu!(l^#$_l zcYl*DTs=%NVl+rgx9OvohGXZ%`YQv7*XyQ(y8*y*^H;@nS`p9f@vcC&^~LNa7hs>E zItCZ1FQhx(=qqap9av@V!lF8K!@)QMH}fHocfoU^ODR1z9OLQHK(Ac5JXgJ+HG)g_ zR#E*GQT1?{`oC|_^6vGBwWOwsLg;CNC(+KP>i^KramwJ@dHm$M zq^!cv^kVI$Lcte)|7C*(cjltP#?oGJd$CHm*`d`q`xk(#v66%QJd_^jH~UyZX3*-y z;_Wh<8>YtX?~v&`!`IqyqCtl17mVBb&aI@k*D)Ddon&W zxBo+q`g%^oaIdR2`)p3sf~?=3Ev`!%>lMWeKH{vr!5~}fCz~0%qLS`c)Bg6P3u1Ij z`27TZ?_8!@{uAuySg7{Kh^_XV7sB|24L}C_ONlw()x@28>hV~8ThAfF!SioOf{M{~ zr;?C6HUzL#0BB*oP)(a5Xbu3V9}ni!q&$=xBPh06%Cg}L61abT?Av;&feQ(h&u1#) zSF}QC)THe|ZUtgX&Lja?9s(Fp2q4%yUnQ9>xOG_KCt-99nrN@(16Z{hPRANj^#&gZV{3!HqV!*HsXW_~1*cEGje7s1ccA$IMjuKSF7+Va1VM7||`#C$(BvyDP4|-m2TcHLV zT1PKi2O$Xy?${2GJ68pljdgs(H{0HCFSBsx+J<``gtfHmmCq4Q`6;)zE?5Uk=f z82F!tX?H6PEOgOI&p#72Jn=6sjEfV8uS&FD0NqQ!HtqI3VR&T-VxkA3yD$ntq#TGo z#USjf2QexHu@4|XVw{lpKuC<^UoJ2=9PWcYB_DnHy~FaaEVlAvg+W2qv6OH8ddUZ0 z_TvvdfqzQbU;_urqcbmwgN-5Cd_^bOc=$`0xsl9_hZ&5A@7)IxejX-#gM{uMCgz<5 z27I3$ejmyAt`qo}nD;T*ku)+)s#g-jo}}Ad(yn1rwUS!h$2A{#L^nUe$M>*Rp-1U> zyYp~A-tZk%|IonT#k!SM70n)yhMzI~m_{U8AEz`rHnTOJXfuCR_C>iX>(d>t_f5C$ zar5t~t#X|%_kdA@dw?tMLt~8*pTWC4gqbfc$n1GB>3H!@3-N^6?@R-5XwVRsi=i6p z>hR3wVTsmGP?6yzT;|(m`s_dq?dn&o#Q+Sxc7&>zN0kO7=44f%t@;T|2fM`^)IK?B zWQ$LRxDQ$qdJvt7H={F_Yra>~7j?mL6sa;A!A60$>Kmd;nrS1*)u=>OXY3qGNDg#A z9kn^Qd^09LRH$sv#)gsJ{b2W<=^opO+R*iD^;5PR`{yV-Lj+>O$nOZ{Th2Ir%2RmI zW1hmJ; zd`X76Q5CaYhLOb?*l27BT;x&*m84E_sVBSC{Yp}2xYT-=T3wvlyfCVI2bW><^~;lU`w3ogS6g&7i$+R=`5 z;?Z_j&4Vt}K_!_aNb{L;E>l%WCfh0*LAqF(GECvhEDQl$f(UhLQW4XnhuoOevL?@}z&0giW+Q#G4E3g#G`8wB1tXtQpMf<ei?Pt{Q8CsKH826zWC6 zo@h|4sHh-uLlhK*1W-W|ZUS6yE>LT$R;pC1Qj2vhMnz4C640tFE?BLiRz25Lb29CH6)+VU}M6zX82oMd>TT9cs{I6t*O z#eSeid3=$|Fi&To3)uPWVHl7-@F9LBtjGu!Y~0^TF_b5;96)4q;pf40ic)4HcQ=4F zqQl_d!`}P(8}VXChvgvXNbnYL4A^getGp>CMF}_#Q|F5r7jA09)j&blP5nJB?!=fJ2{J2V5$jrCk|AXb(|Fk)(M6fXmZ z>(04Dz;q)P{;DqQ$zcSu8IS%5dVCWViRswk`#7yXb_C3 zMyWl`=hw_<4D_nE2dX$zC^FmlVNbXVyCV$hqZ1q&jE2#pMllMw8Al`86_0 z5m7`iasKsrgq&OGArs)Bi%{`)G!S0cN-kPoG(m$uTxzFtR#HbH^JfIdwx5bUTzb!l zI^8!{3S>Gg7)CL+aBs_N@uQ$d<2(wZg)3;}mrUQKeKfxWf#_2X(1->Z0Ugo&9j1<1 zJ=7E?U#(@Q;<)Dwt7Z`j1E~8LQ18bTR7?hm)}R%VzC|8=kH~O2MI52d3OFfr77-+D zM*${P&1~iw{j8@>CDkf{J1h}DUeZ%(G!G84EvSF~{sfqaC9FBvkA|iPxi_DqU?xg# z?{bU8cXl#r4uIFc#(kqdz)s5{?IN0o2{b67uq_r{LQ^{`4FVT6R zG8b=*4pwpnPajiR2$k`BP$fJk2UBLqJ^~}WW=`8+)jTqd1X5rGeSrF_AhuQ9pgON2 z{}fcdm43*n`-iGlW=Pc9xQd##$wdr?9x|$p-q8kpQZc6<#2&4p`eSEd1H2pOYbF|e z0@~xR(&a1> z>E+b_NwPlDh5?F1D~11hUmcPE}>vo|iocM5If@BJU z|3TqTxFIymHGfpZTi}ePYKH)*)9j0&!?8q;!$vCCX}sA@#7c-aB;Upw>0|>G* z?{`qy!q3C)C`WTg%ScleQ?mELFuZ*gU4(!mWFLk@7{IYSHNv@4*S(#WEun7oRHKk2 zmURv0L=E45LxTeyeF%(uGn#d5Pu(E`&TOakRQ6bqYirqHc7wbLKI;KpFl&VMk6FmZ zjbKXJng9?GLESmaa9bGCRvRFu3J}bIa};{``>?Xpr4Ji!tOqO1E%lm*&$i)X)?9p` z;o`IHwQ(Iet;LSKO@ZJx#{@@!9bKaM8B0S`E*9|kc_83<2tEO!()Im`DROTl6FP24 z{@KD|&u~F~EGul1UG#GdhPc2ixlWIV|KjI1SzZNYs(PA16w=9kX&D9WNI#E}j}QUE z)Fe6iY}#lrgFvygMXCO*YnpG7dVWjuA>$6}*f>ba)?9hJVFFy&7vW8080R6r=ab}X zn7Ts7vpLZhei6hmNt{K9@(;K$-wZC`3L8KivZJE|vi^O;w0&f?e@WA1I&g5GRFtdh z(A!6b23j_e)71}1OgNvU$3dFk%gK4uWu2_ zzX>zxBW4bZICq9W>YTBrv8@vgQ~){2j{Z8^&cL++fk-@Kb@;=s>z(k%&Q#$w?*TjH z@qMxX&Z>C;g26p_J+bHoh0S;ZjVN!5IPDEPEfZ87j&d72c}1hJ=K&r&+8WWcv8**5 zc!I~AF&J!13xPWvL-wj2`Nod+dQG%2%&*g|@Wvq3?!F8kStZ2;u&-C8#QGc?M?Vn< zA-kk)S`QnCFxd9VxWRXF*Y=mo=U&S3{$Oh7ps-dhpUiv-7GG$jXXCJ zGZH6bbz*kQ(=DIK>AwaxBq2O-^Nhr@0vEmm{qR+=?w8<{=m5+QJus)d>4z`Fz-R9^ ze7|e?geYfC(E|Y6@_Zr*3-YOmr^&_^pk|FVcL3oz8Ek5W`!WdS3w}UDVdf}oMlxTE z(pto-ZYz8jN(&FVZ0rLtTx#ayC0XdTBhrr6k&Z;B7#?nm}M!$<>#%67kt)DA%bZXJAFG&gcw)m8oR`aFJy3J|u7b z)#|sEt*jX%QRDPaqRJ2@XLg~qNx!AgbJM+5lTSBKy_?j-L3eyWL(DH(J}2xa@>%^w z6;iO(^W<5RzmQMB4v~eS0`ylNpd2JM`FHSB^@~+_Ko1;Dn#X$H2g9Am+jWo%2bZj{ zY96LXwjJ0R1=)@Ca*v`B>hMpFb8;S$eVf1m{9&e$3uv#fY9}BshCElGRsebtv=l~M zg|GC7FNz&u$t%{JAuJxGK-s>v0nT(OQrola=f+tzk3c=ZH3Zbn|1&kk3>0kD6-g{S zZC6;ae1usJfVct>WIG??s5FukHZ$Fx1dgGRq4~RtWn4DSuwHCqBC5E-M5F2<1O-(yPKss_O*4;AK+*G?J>sQ9Rh;b0 z@`Xaq#GfjRieS-}Xt+cPmccp87#HQPhaLWv%7lu# zNJWOZwIs8`T%FS`9kdw?j0$N6hZJS%?~q#dGqp^2Yr*~xUvm~8l+>KjqxY;iXRC@P z>uiqYRy2j;?c(i3sfZRLkm4e5*(gsd38v7NBqkK*#qiwuFQukPQ4m7xs5=Ku=J(i((D+0H|>x5D(LrOW>XT!Y%55z89G z<{3b}t zcJ@v84UM3Cw?llq*F)n&aDck!Wz(i- zBhO$X3+xE6q8bUc+@K2`s)1FXk&fSVBMbF6K!hV~P*UYG)USQ89{kWw*xfCMsa-%I zxIeKTO(hdG$TL(fnh17Z*5r#7uQ?NbOU9|wDWIKd)E-7rP&N5tA)y;zLY&EZta6j{ zc**IO4Pw@*6etU~3RHlzKC@U96bs8k2*ZCu zgHVWGI-3cd)&0o6y5VS;n|=bLIrqWC7)9O~VpJ_o+W)6-!tw@nisIUgtiZ=3f0GIh1>$o}8&i zeK#GU7*cY@4qSdS;_2nXspNo?hmzyIbBQ!11O-na^uwLOWc}N}kDIXA-a*m};nX+*ysks^)0+AYzU3mCV z;8dzh_)a(y(gt=~ru4!}pnFDs`O{E0f$uioPvM5xkkWLGAfwlV;YBnm3Y%I9=}6fXgg1jYAJq@{B?SQ&}xeTfvbn(C@aD42U^$D!Cw@ z3R!s{CazWc7oaSK6kyJh6|y({HzxlwU;fneRaHbMjPA-l$sgTIJ*}D`>caU*e??lb z*Oh{S*S=D!T{Rb1QDovPn{8;>!@2k>rSDYxaPnwl00m)mp0iT!nF*|{Vv(p{)9eox zUUXYK1ScJ&oHOG9r{*|X5Q%pkPz|TT_5uj#Qp?nTh_8N8->LcL`ty;`md$5DhK1NW zbVIKbX~43{M$=zk-e8}c^~r?~1gtrAY;P>9@I1xV*oN{d;za>CCzBg-aftrrY`+EW zXWg-w8qgX}=@QY-(PGjWj!R2|4Hz7xH1p>$WYM2cBR91?oQi1eGPi0Uhs~e-8Q#Du zWR$@;wjwM*lK2{q4PsgSM`&3+6@VL@#IX%hE%}WPVheLEO7v8T2_Z0&F*X7=1H+x?aov~OvukX}zeBea z{}_MJVjN6!Bp>SVV?0q`qW=%fE%trTj&dFfj)V#X;Xie4SvFLL{;gCbVa$I5AAe>) zf!!-_OX=R9h@y(uR?Sz+9X-pd^0!Z(9J(NA%LDsUNXwAOGt15nqV)%wFHlM3A z33Ta@g2*>|&3$4a#4?c%Jn8*u#j7goTh=Rj$r%g#`Kdk(gitpF*lnm5?_Cw}f!c`%kD=?t%z z#xjB8PJv%cp4E1u0I+$u$LG--hC^k3txLrpS z0l7Hp9p$uOu0(+s19-rOtdatgU}aSNTIq{?pE*f`g^wAp$A6vt$)7Vf{&RjFgpumR zilgm87{O1pYWwUgi!IBYI)o(@$8;SvT|v{}$8i)@DiHy4^9oJcw@YI^puce(3wxlU zIq^QoOzil6$?`J_cC_f%0!~jrh$di;MQH`4M?wnk(M!O5r*%?m!7GPH&+H*5U}HWI zi{G%63#XG~r6}eD1^`u}9HZTkB6@z1n~Eqc&QIv=b1UIQRS=4iYc(tKqo>K5O?S(+ zsx^9Mj;W=or3&?D9@#!i3~cos?MiM>9j0MTdmvEMS|0cGZx6S3o_P&-%8ZA*5ceZY zhd5`f0{#21i;gZvLk`$dk$*rG`<;hD(Pvgii+J!;e=M;NMpsIv=&)Q_KnN9r#UmRn z9`~7tZ_#0J1L+KvueUd&rWwB%++lJpv(dpqlZ=WUZn#tBD`*e3Z^a5s`@x=l-5$Rh zFdf)eU@{xAh}_(0ccSt<50xv?O5m>;lYsd~nRA~Nk!aPzg9Ahl1&&a977zS6#%uB` z)I#7IdK}2q(3dmvT+)h(^5 z`0s%MKk#qnmy}%&`+Xj0#c7gQCKWNHvylb|OY14Zsa`5KD@lD-HiL^Y;b|5FGoUy= zkP_5B1{HajRU4B?wZqCx)I%guE>3N4YI%m{2D)CHhk~OI?91JRGJP*=q>vg)I@_7T z>6n;w<+4KL<8!F#$+xQ^$HXm?VZD(q4-p4QzMI73hS`45qgPARzT6Mt!B*{562q(5 ztuyPI=N=3+XU({1NgxM}h@ZuDdXf$A=7-fxb_7`Y;wU@(?^c4EBP?OZ23^Y2nqrIc z$6>{!9T|i8F|Z-}*paKU`!`tk3UUubS3o=0x;N7EUl-z3xC7tCUktdGpMmDpHdGu# zbr~D*CRBR+8c0MB77AiysZr`+lsY&!Jm^K_3RDaZ4|)QDjEds$pub7rIKWYYrQc3w z5qY6mdA8(Y?r2sJAM8PVspuNXqzMRkdp`8mgGd?CqXyjX@E(miP(cns`_6d?hp-8{ zmE|c0X14R>^SCqd^^@@D8m^j*9n*B_gur>%1f0MAroDaSNT=p9+#!*9 z4X}3nXp6y=q+>GzzVC&ed}KBZ{F^O^akfbaJr!t2WSV^ z5xAZqh-fVK?5s*UO_z9@>MWxdXScHh%%T~m=2$HcIL z&J-wFli}5w_Gg|-J31b_NSq3S*0c$rfrE~@g^U~-S8PYhb#q)SVG=jo0_-37Ryot` zZ%5uUm8HUU+9b5oz>1=pLtrsFf4Rs3?Nu#HgRCp;5`~`1POo;hqf>y;gb11qGbFiK!mh}Ndp?xE!WP$lcQo@@?wH2=G<;>nvjb5(2J>3F%vO_)U^jP zr1l-Ym`)NCg|peD$&{FbF=c0BvL)t0UyP#E0CVy59 zR9{eWcKZ6bt4Qh#CDdp8>l=>xM%t!6Th%9#sBctCeW9Jz$MwoS`$9Dlvb42f@u^GzOMkHmn2F+e)Ws2Aw51~HThK>94L@#U|h@jY|?KhfCNq9QRB({ z9J~`GMk|`!mY8^!D;Vc zCSjbyR(nv@VNmy7o#P4N8d5Nr3?U=@5aOK>GTMa@FB(GcD1zHcxwq2Q}ZhK~_``0!5n z812G`7Y(2HmGDWTWcU!d2k>Q}^X}^W+Jz4~CXoXf;fD|JgpbiKe0b6Dd0z>iBua)4 zk$VCkOo^_}<5!3?CvA;Hy&bA=-nl%7xGUD)2E;3Vc<21Rn+q(0?9$a0(|_ zOg#2K0lq+n=s!ez@C7oA{&T+yd`y%AUm#;o^k1M8;CuXQ7k>dPz4BSQurDyLXzY1d zba+?rVd_GxdRTObbKx^z6?{mP3SXx^f-e*B?dO9pGa0_jB=|BFe3^duGF|x0R|Ovu zrNWoFNAP6>zR57Qw0;S|W0QzKT&0C{qO}{_{>)Y9}=a)7u+NKg#h2JUwZfpCBqj=f-j`t3;E#-x$v2<3O*!Cg)gMx z6aOFGlNi$;&}u!_y`rn!1(Mrjj+5{mb^wmh{zAH%kR!L%MwZHMCT&n(B%%vP`uHn; z?-Aa&V{wUME%}?SJPkt71;HTG)K7RLjjdK==ZsbGAp0Tom4_5IlF00ao5*eNT+V6Y zYDVS%WP9eqf8nMxAjaQKgdbIBZ(bO7GAg%9BNOr?##ep^-%-FVm@jV47O?3dfi!ah zId*xQ9qyN(Wk(MY*Q$VUMVa<*mPLEy55o!dWij~h5hyBc4h?4#JZ(M|&Xqry! z_GUy}2XE-aHam7zYZ($bS6}d5JFuLOVoj~4byWyipr1GAaU}OdAGq+ zfjAt7$-m9k&5)t7wsq3sjTvLDi3g4!vm}6L-V{9HDbAUUneMGQQ+sW;CT5Sdir-to zKiDT6&%rzz{=v2UZ+t7uZsmt2`Rb;VSLApL4AW%SuCDlGVC%GlSd^Wy8ov7Xqt~Lc zcgtQ4v^1(hRQ$?1#uo?pVMzkW(mo9|U=DO*U0KU6AB+o{iVPq`3ypu>y)8%Z1Z(B9^sQu=%F@LLK1ayI9$K4=;mP48j}|^;jo&5 z4Ed`Sfriq?`W7Bbsg~7-w}&QQ48(N7KMViP&%vKD{4+L)KNI<9Y7zd-DjI85G~(ZS z{QCs|wg9a_{JWpx--~0dx53&gA@tBa;g(P}oGzFYTP!DFPQ{!9mLU8T2{3WljDMIS zDOp?bF?3N`?=~pBK5clnZfjujK*bSQ(C{xpYj1f6H(9q$3)<0N;BNS~X+1G7Vi#_) z*MBC7qcf0k{Z}nt00}5({g=3Y1pFunq5cFCQ8muHaNxubkbkk+1!%Hr;J`p&y&ZYe zw#r(tvI_X%x_E?gruId11s`bTDzvQ89>CUAUV#RHADi)S6aMYUnf4ZQPQ?KsUF@jE zy@D2~b1Yg^b{tx?sv^&}R@v5SyMLo?J-6Ck@7P#gfEnVU5NWIk0VVpc1{l^o4c2YA z;d;nmL|V%?;KMCFdY{yzk9B*4mpayC6Cfl~Dqa$_oD8(s>pvCD97)Wq|ID^tv#rUMUAfmC3g5z*2q2UC_Fj?fB|D~084-q7<=Bs*Dc^O=NML@FvZ&N;^GtEa~(`1 z$ajw)BU?bV9IH-nx@9F*K*fG`57- z0qZSaN1n*ohKqDCclHi4zhW{A{K5*HfB?QrULlRN$ON6Q;LnA$6dUEp^nd;T_kTWA z02`z~RyRR#BbLbS|GoVmCeS_oA5Z+BJp3OQ{GV2YHTVBVe-+VQH-aN}*ACV|7ok!;W4T&Wr=f^t5NnD?6QZ014UF=(4gZ>xmsbsuP`=$0> zb@U5Nu1?mR-({eG4sXx2=FC>1Y-^6XK?DZboJ$Zl*7~XeDT3CVp(;hlnsX#W)!VB8 zwl(JqcJbKdfjDcsK)UXZ;H1|Eyny_-8o(l=IId{F%!V_*|%; zi}jN}1I9P#=NkRosGqHP+SM(r)2?n-4+X*OLt*m8Z@?eq-%T)v^r=GPA$=Cg-^KFx zQTf{-f7i(0jqtYyc@X3pV)RN1vN^#ECR9q(+1KkmBOz8_Ur*5Vi|LA)O0oRx#X`9b`-qzHe; zhVbXQ;rKJP9Di<}w0Vd%aZVNKhQNFwGy=b0tYhvLQX}Sp1|9P^AvR)`ZPYQ(liV8Z zXQR4V7ofUXV^H0!t5DsniKuSYG*mZh7OT^2g}?$`-K^UetD^C zsWB@|;KC2=!uLf4moXDXaPG+n-O}Zjvfk~Wc^PO9v~lpbJBS_9yNYNn>%EYV5xp1l zF{<~Yd|c7HfsYBj*YHu%dm|q+dba{iR(n|fR{47&`!3)r6SXP}_ z#nlbGZb^G3xsM8nHx-?cwxTpSSe?*M$R*7kLU&O;Rzjl9_Mi;Ruubirxav9yKV_1E zUJ;=rH}HHBf{*?Hah8{2cW5P?A;Nu!?1&xQ{>BRv@v(lOWN7&Y5A{oEZy0eM5#FQ^e*wmZ6EO0<-Q3&>Dg|x6yQ6&I zOuuj=S$(dgO~jAKfc4yt=T{2ENBx^7GN(!2x#d6-sdu2a2QZr>=&k40K(7QBpG3W| zL%riqAm5u;!k9oqR#4XJIeVnFALi%A!$*b)^NU}c^xm?5N5c2*ZzR4S`ex$$cr4*J zh2a_Rjw4HXQH_m<@McN5Ed_shihqrXaezdI5BmaK&N;rO#hC8mEiKk@xy zEbH{+r)5%NdEKv1d>>z(kRRhSr8n%8FXbwR9Spt=RS0ioihl_Ja|K_3CCVI~r37Cs+&mVKF~KMb?5@nB+w07_0VP zrp5`n;ij&*|H@jh9fjGE*P(=H3&F2l(q_$`Dn-6-&AwJrzhxI90k)Fjva?t0jLmlB zeReD5oP`~S4_&R=C#9GZ(B05r!G5EAM+V9;@tRW>!QstcV!Uv_v)~ihxi}_a9@9b< z7np`y%dokz3X?V0+t_7WvTE{WaPPz(AXQwa9Rd2 zV@ICMU(6>kwFFO^88*I2kBBp4h)J_s%qhSL%~p5kFnK6c;B@Q+RGWfF?+GdZ&R(P9ke#7oKOXPh-RUk5g^DgosOaLMBE;b`QE?&z zyF^8oR8*|EClwXfeY7X2062S%3Qp{HC?H*bE~p5|L!koalO_mAXAc#}qL&v`h$m>5 zsOX%EiVN;eMaAVG?g=UY&R(N}7G{U2_zs6;gDd_k58he`JzKW`^U*wsN@<>&1kHoO zL<>>#@Ry*+t6!`_RFm_7D)k=qxI;aDqaL@&1G@THtM);n78)1xmL*Lye_=;n;O#(1BuU?%ga1UnTuKkSxbg$K#^eur4gMh8lHspV^S`%3JX zoSBC|R`{nX`|&7wNbxI`+3Mqrk2!=GPUC*0UD9eTcpeSuzbRD3>n8tA|3!0iA4K`! z_#IzeI4Zj$MNm?(J*APaOAFsAZTv8&bf2xIkyTXm3pDJ89w&nkmaePB-r~C{6qNPWp9YvG(!`~7dE8R?2S|A<-+WK#bAB=}{zvOW4 zR*&1&W1)IPR^n$G>+a`YSaYA^JC3QF z{h*|K4Kt@$j0#3?wPwc)y;;YY-pH zd$aI?08XyJ3W6P7rr@ybUM<+KS*BT<*jy|%E=|H}U1CSN;8?-xJoQ+s9xuxyz6N%^ zbDfI1N*<`|cxwTVAVa9XRl7eKO$-r*t2(LD#nmRh8ul4b>9-6N686qA=qCEQ1Iu7v z1#edcFN`8^<)w00DFnn<-#0t6M3yV$X-lNDw6cTx?mk8kc)NOpj zu-3c~lhSZQrfA->k_Kz``6#=T{4q=_d8@P#3E)Ig_7SZ#yk=UplvUbmlkCU|`DGB{ z>HI@0?T=|XAudVWrIjYAp_K-3_8K=o*%@wT_Y>UQBo7*>Kb#g_cUIqis=n^(k*TT; z@A!EouqHOCVuZc!X1ec;@qTx-GR?X3R0aNiO-*xTfRTF!6dyWoARrjr!oji0`Sa4G1z3SjRVp6fbo4%F>jSd8cGY>j1t=J4Hdyk zI4;N4J;h8?Inx*r_rb~G8~ObZYp&DIz&}=jf0R53!qmg9Wyhl1zf?N^8@hZZe;;q;&=DaUqaP2Uw_5(yHjjgzLKE_BXTsxVO0!ho5VCj}-=Q9dd1mjkC!pR_%>QtN4|+h%0K~)x8$A zE;|EyHcnTDV!TNnexN_6sB!4|p^~{>_-3H_hG6R(>1BK~bKg(pq0N}J+G($E)$G6y zupdcE4;0Wlu!`p4vJSMoT0L%*$4-UyDvUp1spHb$c4s^Mm&iOsWges+zmP|KAR7?g zagnuPAG)=|JBC}eYS=)*NNa`8CZNU&9rmMHq5F%Jb<}>QCjYZ@y4fZ8{%n!}9ON}Ut1D_2b#2i`}$FHG@Ty#{CZPMIV@o_~k~j}wv|j^?g{ z4;wTtmxn^dP8@g^RW0SEi_*Efke4(LyrW)9b>KCv*%MU!5CpW zu@eX04k{d?;yIu6+gs*chJsIaSmoaz!hi6L!mmV%0pq|9BRB8>y@!$VV1@$hSVf{Gu~;pOfO6{q(RRGcD@_|Q$zAU{`8{nX<~ z_2?}RsFg8$rU;Ku=mIeu-|H?=4uI*%Q9lcFTcGH4dBku20?p_pVL&{|s=XEwiq5-M z-PitT5FfBJ)%|LoK)g~O@qe@c;%ijYz}Sxk&p=N99jP`_NlqTp(u%avq5%y5e{=E4G7aF^?4DoRd{^ zB9v8Gw5uIG8|xUby+T$P*d?!7buTa>0<(KE2}&A?X?mDBWt^JAK1MO$_$P<2!}%xI zxdCQ^*D}^(nujFYQLJT)1Zqs~SvB-omPI}-i~O@JvZgGuzO3+FEPKnCc@{j9AKyC& zZQ}8M6<`JY0j+t1A^w1P`j!|h2*KJD6dQ2%pNm6*4M*INTBiOPMtMisp^V|5aH;H#_oC8Bi-NkGw;dC>x&$@7aL& z=Ptar;hvQHDy7qp9b8J3qqJC{TEXerEot-zJj{y?=@y+ zM^KJ`7spz^Y8U>ChsC=fD-Bc@!KHZWnk2fk0h_R7q?Lz#7H$_VB31sl*feDisq$jY zk4+Wq?ZpynXYfN|mPjollYzPXLU203fBzl>{s;-&PAN0S|t=+u31OPsE>8JO}@l#e~kxf+Bm&BXoa5#BO&|GOP@|)rVqKh zv2jypd;F$ubZZnkWs#Tc@JmJD(A1=Baq~0yZfmzG_u3#5?(9_+w4nletx*96&bSsp z>l9UvN`#|s!$>#xD5k?~1vYV7H8NSC(OCEzmKF&@(VwXoW|Kuwh|!GXcCb9I zc(+X*c!4x8QoS9xl!cuU>(?6#^01n56k!`hH8BJG=lidtt*9rip#A||+>S2QJ*DAa zL%=#sz@-VYAL$(bl%wAB4wQcV`vc^$MINX+wSTW$D(g?UqaNzVrurF9-BixR42)v{ zHp3}kS4<`J<6mnI-7D6zgR8b5W7WuHl*BqnDzQgfHNRngs6E@39+<@fYuV2DYY~sC za@c&BH^8LUeu6i-&l{^6k7GTRg;g_9aRpAve#PE`^U--XYYK2!1Q)`(*q(p79=%{R z>s~&PXe0qA1m&z4t5TQ>g-*rIvIM;1IMpf~z>TA&Cm+H~;&9a_mQ+@BmSu~L(7y2! zI{dl{{+K+Y<#p#T`wLR&#bDlCVtlq#DCDlXv@ zU1q&1N5T!h@G29Aak3a;%EqtsX}K#;!=X~mja+?6opLiI7`xN?J-l@vD||^OChyhV zFP5#PTM{L>wL=M3N#C*?zoY~QX5nPy_I+-)Fnuc(YBgN7TvTwN;u0EZH}|z8JM8vX zH55Al#aboiN2?iX99qyWONeH@Q=B@QU24f50+ug#=%s*?7?6MrxwE7Q_i zRgNSBh^iDW@O8T%-%RP%cu(wpsm{1=^(C(35XE_{Zb$n*)?9HYiw@#J$p-CUO)$7H zn_ACQ=Jxh#MN(O$frjTK%KAvC9o`o)-7dt8D|8OKs&DQz4KN0eHdH4Vg;NBO%goX+ zD4vmig+miYX&czmV%9*J%eJP94V9I>lSx;C0dL5T^vcIm!3PBjNNHfi27I*YQgE#_ z{wrB6b{L@nlu)s9Sce>n%8Sp!zDq&8`eSGzRG~I$|NJ1};CYd)WJAbV5JJHp!v!V` zxoqQi!n8ZY-E*pF57|1Y#HE7wLpW zd@1G&I`ENvLUmg;Cm>YHL*HB3gpG{PSVN|E7%W^R@^&%gZT9b#yirg$;2WhaTQMKx z7}RAS|J;q#61sdeg(%_5aj%<~8UR}{!C@VyywX@dfJpJv?GaW&Q*xYN!3NwZf;j$1 ziw$;`s`dd((gW-* z5f=~vz3Ch)CXVKHN(`wGWJ@VBuo_!Y0{UJ}6~qfi;JsLiRyuy#&>r0#{tIU zy zrCZ`MklNnOZrp(bLt08B|3ZcwZ0jg3e6K9>N$Jy(dFodd*{D*NWqfQmZqITvY_P|_ zI}lx&UHH#ok$71|S$Sj~3O=pXNf-^-M{=lc56T46tOdo`iUICD)LJkeCwU|EQ)@w? z3LR+GzC~v?P&!T{*s3{LNZ^S9OiB5ubiBi_S{%-WI86Di>3$4L%}5o8zfGe!7`BuF zo>p=xVn7T_b%sS_{Z2IEP%e;3hXhxQQ`}5lWlGgh?hUi=9;e5PxRwS&Jl!J{I(rbR zG_tldBVO9LRR~pD2*SXCRh;yiz>Kl@DjK7OxKaX+iV;BENw<24Q!*!rgViEA#9dL7 zuS6|j;D6~zSf(t3|^;V*D7#4F2q6-*0!YzL=fB#!onUa`o;&+f(f@Bgj+|s2nYC{P9;`Z0CjzkRWlmXmI&oqHRr0(Ppz6#6*}0e zIR&A#d@kjrFgw-yVrU<-!f?g(r^yocG)zBqL0U}Rrdy?%J`JWOOi`E`o`&h+P{3+d zc3EEmU+`Ce_2JqQbT3W97ksJ`|0YqlN`i0$DXfw2p$XX*88zzQo`}M5k2~St-GwOB z^Ck=ElX2P}7g4}HP!vf8y`lC})q&GJ-v*-nQu?H}JXkF%1fum-q2B7kR2HG+m$UT= z^1D>a?*tB|F}(I5wj)g)$rEICxCm8(EN_Xs4cJYw0!wIp4WRsH1iK}i+lOwd0*6?& z^{$}hiEDh8b2SX!-3!dnRJBFKNGuHxQ>J)(wM|Gvgq;b=xqEF~sz^`WkX=X|b z6^RTOM%WD~+U7zt>%nF5|KL>P#6Eyyw_ntG;^6B8jI!2>BTXMLdJ;QS4R)`QSLd6w-MV8zqDLbbiWcNH;$HXs*X)szo9qA{y@aG;adML6zf~(4tQ|G|UZ#dn|*$O$Dq(-aGi-36T88GU-}s^r>Js%xZ1tyJ&9QOVA)zyFTYp9<-}AmHxlO{E;{W+9}vU%sXqpQv~1+h006qh+iPf;FJ@? zKj6G98?n4DYj4c&ztMzO!`j+=8BSkWku&;7sBExQ#(f^vg3a6jJ1841v=)q|aXW}> zF0BPM96b+`S&iC|$a z_lS>b>9tQlaIq8~Ea2paYoE`ncY};aj{RR~pGW?lNXB`>B>y`yJ_v){d8kda&$;rj z2XRkMs`i;-v`^W;2;vXZK1Cb{C?!yv&v26V(Uk?A58nIXl{Mjb5PJ}JHdzZU=?V@R zw9n33Sma#uBUE~pS84632oK}5_o)2x((3KG*oS8=IGmJ?B-ys~W=)utmiu-+u>bAl z0k=lz>4a5;BHVxlj(XJVbD$o7vxm6`fi{i3cI{;x0T|25Z!JjC@bAbxg0hY@ zPFy=J?}PG@O6zh~h@SR<^W9@)QB$CX3MQIBAlpNeF>A)_#!fbrP+~451kU4gF}g(i zzfEZWM%8{S)zC`8-~O3i`#ZE(uf4RR_Dj*G{f^*IL+G`?eT={TH13@59!+e&7SXF{xiJxcTE5Cj@rLF^zW0e>W?(+2jA6(*Gu}{TJDw2yP$r1qf}uYe ze?>y$g+d(&|9~64#&<~kNtblg_}wA?y_fkLFT&scaGJ&^aR7AHo^e1thSLntQSkgU zD^?{(8>HzdPP@Ttv5(xl?kKJqz3YymC{=8C*-^ybq(frReo!4&EoKsNQr9~a;F+Ce z9wc!z^Ga!b_qXqxG^pF#_a*svySP&woPEGCUup`_o%eX<4GLUJ-=a`p`YEGRz45NF zq;VoXvXPL=h@|#DhLa2s4DZz>%O&Y6Qyk`1ChX%nPmO}tgX>eJvVCRv6T)A6P!9>8 zMIAecyO6EgyMQiC0+rVP^&$E7b&+DP-I0Kh9%{4$S4p4}Cpa`&|I!n+>^=6mlGOzy0%ygCUV@Oi08UHG&VUgrJ? z6^@q*g{-w>7)~TYa;3O$`$wqsTUy_PXn9x*Hj?s#xR<+fY;xtYp4x5h9cz&*Rb=*v z4Q6;X*G^(Msk#0di=3bR2sL(-8o4pgsyzsQF(cN)s#9AuWk|lW{@}<8Pdj$lAC!;$ zA^pLvPo?w+Uty8c4>JZmow89(unrX1mo%__D{OSHC`!&}684$mVZql&B)Tv!x}YO0 z2nf3{3CqT&U?KiMA{GQH&m@!%Q9)zWv^Hklj?%-zPBp9ZPgFFB`+uz3_YmGA4(UAE z!%c@A^2_r(!i@lCaMQtX;n9mOOdc-0dVeBr_S{(TaI;em`NuoE#UVQ;d06O>LyFJq z2n)NzArJjGg+rSEoQQ@08HcRIDGgXKc^40Bh~?#&#$xoA4ebfyaQVwSzh?8`bl@yT zP_1xuM=iUF?$M}$CHmH1#%l80ForYhA8*#{ALmi7F=MchPcA^jlRt(Rn{ad_7XM@H zQ+pTvqS4`)fDOrVhjNt^bKMe%<@Ngv*o|><$yYoC5U2XlfytGAT*Q>a=_oF7RC9{4 zyd9r1`2?;ZGwGeui`ah8UjP$QXD?@VM`y?EIxeLr)Zy>3&TkvU&W_@SxYKc$&yf5O zQpsXTTLQ5Gzm=L4U>d4NnZ!WFHO2<2tI|OA#DyI}74k!c+%Ckk5wwId=EE)yLw@HCHz|Aie_jWLpjc;PkslMauXJr zgdiQJTA0vQ37<<$2pp;s5zq-os)V;CCY)pvBA^paR|&`a6G~~A2^IJy9aa@fBM9ZB zbID>blh`K8Azy-gp&(*)C1te<`eOs+IMOA4l6oxKA#d#%pxaSfi)KxJ6)NG6f;>+J zf!w_4#~#BO0jZWf!L?fx7%E zNhHhf&9X+;fu2}NF^&(#Nn;a3b_~ll&5@u3r7k^pX>cMwu>_oSZFvc$8&Pba`YtIP;f9?k+n=Vwg3aGWaZy# zZnDr@P`J<-P!_S4Vu2Zf5Ccul;U9|Me7rntDZ10-DN^)U>~Jwf>s@r%;xg67@+xcD zwGf?6MIme1CeBu)$)@ITypvR&sXUxJtNVeCQujUT;mE@-Ss};g{Uqi1ycNJ)K=z&X zUl)HCOze!^tsKLU6gf_3juRwDD!uL;dcd*jvTXIW4{171Zy-oxvE)>AFz=`w(pnBZ)K`}p4zR}An1*pAwnZ`vzeO& zOzH~|Q!bylP;YY%alGa0-@9_@F`SMoR0vW&#f9+V_c5X-7>&n#>kGtXibnf2X`08!B$8 zyoOr>!&@^ZV`U5$MIpRHBm=8lKrk*Z61rm5I_T07 zmvC=?fyL>oK=LDU+Q}Xwr|7Ukq_b4zyN|Yl#U>0Alp7L^6B3Xr($@g-vcZSlMl|o?j zB&w`4mR)#iLq=q&_DUFQtxg+iYNZ|6W@HnJ@!A)|$}{vl+MXOyq3y{>Y4M;<4xaoW z*s6n!Zu5l$Fedq9e6|Urm*%w>?DaGw8B2EVV-@3Nu@WwDzy<+5wx z4~~{G{4-iaZycjo?W1@y1;ZPC;SC7$$M^;bsc@Aq?57kh5dJ9F<=`&a*OTpoBgYqZ zeBo9TcH2!sGi`>6;QaGGl!nDN!~#9rAh?VTL{aNqUSRD-YB`Z;8T8>nlxt&CbRkZp zeHpin9*bApKQsGQ24Lk9WCJiRNMMJo zccm>?MhbSbG~U*bFw`L9K}i^xC|sbFdu2(W>z3jm`B-S*p?+6LL2M7 zhm<9#a-m5o*YBjlOd{7TR5Rw8oApoWvx?s|oJo<>R-36+EEK%tIAhaimGdT%wTM|2 zl69>H%Q?=`l2td8`o4y@SlF>~A-j1fLI^hx&6X!nD$N4V-T|ojLvXPUl9iX3a5U?P zHy*@sWjIcw;w%ANnh7%C31FCsbYLuAnU8d7)9(sJ{|Z62Dwg-?dZk8loMl%l0_L`aBZ2sFke5j2k%TwC2@2VSAMl08_`-PzQ}tW5 zqp;&tbsmEVSuAh#VVXt$J-=fX$!O!HFe|u6>*%%xgF&*ZIvE7*52fCNRLx_6FD_XcGI2#Said&hiKS zjn@gmIlE@4b!-233^n#nm!VER&SR)CsFKW;<6L=_A~zXIb5cJaSN)OP6NpdoF;RbC z_$%~du-`{RxW1ILO}F*1V*i%ViXKE4)jNfy1=ryrNIivaSSdtyA-YRmBz=fLr0hpz zZP1@ZJyhwJ0v39Qei7+s4a`{VJcLBjNBg?y+e9v*KSdxZ=VW1!C2bdK1QAfeO4;6S z)r=92|B->t3-!HU!~E^6bTC(;R=_-ul>_F50>q+xMvKO0lLbcXM05DU)%i=+ci?BE zq*F+iJkJI8xo#d7;^G1|8K`7CXUX2%8nv<(Mdh&Edg%dZ580VagrT${gL~RCk`^rzMp_8oAdL&>jmp0Sn&T2^4jI0fazH=fXwp;jk&nZrDi^Rt zE}#<6tN;a{*$y9LNON|VF~ZwATk|IhJrJ6GjnMx|#VpN@pbjvESGE}#%i%M;6-R*% zWI{bKM4x?3uj^Bf0(E97^NuJnoQ`vk-OA(~1W1Cy^;$bDN4*3p=t#f<9N3pqEjmC{ zT_j-+K(Cio<{qX+m=*Rk7S*O&O0tRem|q6``h#={kJq3jAXr-dH>~mFVchxVb&ewA zW1*j%PbK`L3&5iM4T3Fp6X6@#ykrR==K!g#l5F?739#=NuThz1WY|>Dc}oa2EE53HRclmdMtfbQ6;E#XM>ih%o@x4Ae7>3Mh)|Hb`XYvz4Wr-YORTeK$@?6yVz7Vn7#o74Qivta)`-?dQDYECrN)Nj=TI}|;!wuQBcK(h{fr>ME}`T` z^Cs!nR=mc$Vre99%9%WQ7&T-wed~A|&1GR&Po8oB8@)!^P;BxPMX+3-8iS|2*J%A- zqdg*8&tuw;z{PKeZ^@anN<6l+)ML6l&=X)={B*jW!aJ}R{vGiR?7-f}*BL_ZRE+XX zPZjcoH~7LEec@HU@ETv(_JxO=aF{i{#0CA~9oP-|tP1tAY9FE+M>jT;m^|jl1Wf)+ zzX~RwlODJ&!0R2E5&<$8lrUA`^fS926LTt0E5Qb{qicoe&4m#U5RvdM0#+A$l;JJkD1 zyr?aB$SyTJsm=(3r6~*s8V03UMN878UMPZmaGXvT;=p_%K~#4RudIa0tLMnlc0I^j zLnIjMPVuF-&527_3sw$gpGHF35j6lsrSUYqE$!{Nmg1O7 z7|G@+yz=->hy|0aIy`~N8ucp?6Ca5r&XyNNd_phDqeMN9mj@UNdw{bzd<*ZuUf%7b zS9k}u4PPaA-GPn3oRI=kW(h}MoLJcie`PJawgWS5*6bsgrFkX(f)F_8jaFSY$vdpa^2~3Yc#EQ;1!BufR(mWw$YOc@Xw2llka7!;{edJV7>Kk&q;`%4GzIoE+ z`doZ3i>#(#kUiyOHlSXDhIy7MYZEdc3>3>dVt^|Z!VX$0$PPR~Qb`)NfJ@zQrR(P! zJma0wQ9CP|1pCjb$CK*uusqQCu7cd}g9((}qF;rQ^VJCoKrZVnRWsA2;08hNfR2#6 zhK@i%ZuitA8o6)cR3pM*&E6=;O(8%QPot43W~7n*-Nrob>Jp$U_C|`@@lZ(u5IHp5 z5u$yp*&nB;A?UNd6yr1@Ba$VMaUYkA`^Xsz=si4wC^C8kp>iVaC`bDAU8Uw* z6Ucy66fu&4Pm+;`IvP2n6#1EhT+Kd5NiWzyN{4$uKiA+He;R$JGrd8`c)faDqaK&5 z$0&I~DL#>xK)|K?RS0+*4mEH-dO=EgS02Q!(0xW?wn~4t9>^x=%Y#^Rc$hUvtLa|B z&OVfwx5S@!4g8p>M61SR>D`rT1m)F*N~x3=?%)xoNRyx%ySOCn!t?lP5TGX$Vt@!5 z`NQQM5-RU%sI66_650k5nv%umDorAil%yg_VK8JDb*LKYbW&`R-Xw@S?4KTdUP!T6 zJ?>PGTh-%ac?jz2j#B+gVCt{s2-l0O+5;IQ9Gx*4*I`Ppkg&qTSe59433N2?rv1GU zfBd9Y)Ly76TK61*fK`dU?;+8(JXdKkLh=2P3?B~R(HGm$T}IVsoR(3|&;Q}TE4&Ro zt)jHx@Md~Hn4BSrD0fHg1F zFGb#1V3cpZ7G{lt>E+4CaqJ}mn=$~fA^Jv?MTA%K$br8v*T}{qm%k$d^zCHT-Np)K zjmsYq5*p*u)0-J9{al7MXC`0To75q)*6hpt-!AffE3xLD&R3Y6tI$CH#4_YFynUaU z*Sl}(F4aqkVx}|~s>-!zv0jC$rpbeozyFhI&G(XNhxy9`?xZN1qPoHv3leCeY65*> zK04X^6SyCdEUI*_1lS|W^us|3&Y{nWEWY@RJf4$Bd_R79OhrAU9{0%u?mqf~tp&0# zqIw&#RyiGF_T+ICGn(Lek4aG6O?eONFw9u@43o$oL4U(@j}l*a5uOvi!Amh2P|2^H z7;8qRqqz17&O1~ZpUAUdG&HrB$-yvr6Fnd%_<$If28hfb1&Ggi2toBWo}gjX-p;1D zf>^zSe$k4Xu_h%a;0%46ZRWZwG%v_Tn6`@KnYMNyc@QbV6GY`^p0Cxznm>s(V?O*q zxYX3xO^GrONWtNf#LzG#VeJ_$RmMwOGYa18_z4PXbwb8Kx>l>Vu}88N97eTOy^X}R z7JR|>RBz)U8I|Kn*JE4~|4o95#1HAPpTrN`#pdn>Rqy1{Y8rsrIyq-8?*^~lslIwA zr>XbYy{-2!RWDsnRxLN|+toV+CAF<0&{&r-|5Fp1^C3c_t)R_hq^Ei$YxZ&`L9di@ zuDH84M)*T7jgbkx>K&}k@JZgAKafv0Y9MEjPx@H%ZJu|4`+nbXyX+J`ITA@UpEy0A zq8f+~<0Qvp%S2~u-l+K;Udi}Y9yCzBO&xD=q2Os7;kRmD!DsWOb{&)P>e)Jh2gdqH zB*NNUaB?|wagDA6P-Ts-Rr8F3I@6l{7lxW&;$CN2^hZkv(U=Do#ER%YuzLt%*?j(S7_|92DSu z@^?{}@5=+SF<}3M4*FRADw^sgWZ2bW*>8b8%*lL(hf|^ot=^`#wkmgMTPHCDUfnOD zo|XDl>KV;?*ssohRUr|0Ktr)|l1N1KBYq?%to_9xOCxc(MxH_{I#YSC)5zTw66fDT zBtqwOj6Z-fbjATVve2$>nm{KS(H;NOr^qOAYuvaP;+z>+UXQbiD&+zGQk!TeOLEQ! z!EvNC?8j?W)qAaBHxN6}up&9RR^7g=BbIklTgQ^q@(GeuZ&Q11Zy;M$Z&RCXm$9(w zZECk|a>u|VM&SGXs9>XGxPUOl@?PB1G1w;{iPtd*z^Y?7RJDh@T2s3-w$ea7b}DkKpcb4fsIO$+>TNlMdcgzuix;jav})(_#n&TClA5a! zt9a&-*VzmjCYWdqawC(lI~cgY?Y$h571}^-63Q7>d6j^VWzcn77!%$)(28x6Z(6mB zc}t^~9A(XU86jE14fA%cq`OTYmfVOv)rgQ%C-F;3qqX2_1o}4&gjN+37iML>w1nmr zR;Y;{{}_!7w*{@5febY>JF01&S-{czbb$s-gr)A4 z)&g>F|J7Acu-Wq&5ho6#N%G z5)}L=`c)MC4CWF|ejKytnF61JXSeK5WG5;3EOUJ++Wdws#9QXE{hJ33Vk zS8`ONdsC=gOvAs>H+35RucHAZcv3nPj1t+Qm}&TmZa~PGjQA6B27)dN4XT82X=RR5 z|8iq$spp~8gi=Ol#II#3(Y$B6Ct&Oe{VEtc14*2czeyKzygYz)wSo6I<~CTLnpnm} ze;HkLLTmQ_OR&EBnN<7?fMLHYtPlDCX&}L*2wR?r^(kqtd;Q?zRIG1#U$8!;TLRVx z=~uz}8%W|bEfuUUSC7BT15$W}opk@&YGr|}HN&fQ zc8iFdSJ$cO>*_ZywXQoZN>^9qZEPn@TUD?uet}!K@{05YPdPKS;8W5TTyeO<0G7%) z!&tbnYKMDm!sUzffa2ENHCCOtHoy?GiV+#8Opp1tjEc|5H5DJGB}`l9th4aBv(C-d zc(vg}X5}hg)rJ;N?c=&pM^ru`g(c$KDaMj`dgj`)Du1prWllW;nKH#UGXhs}LxoF5 zj9q=zIPHJY8N1-pNTi9M!-OSkrW^s!4V?1S?}M$`IfzB*B5Q6Jes6D3c6X!XcDhOJ zPG|M_P9jl_{w4G8z`>e-htrTKhbaJ(9w=A`10^qwgKrn7s-&tY7N_9qtjf+dPGtjcfVIMH-^}QRzddGQFSaZ|Zt83oV!Do_ zrZC%*&@$&)tZat?e}#HHEDwWBJd^SH#VMXX7(sn71kj_zNzB8*bQ35yfpI1u(wvx>>dAI5?4%Vki0RnKz=PGOV>;Q2x1mPBU4bb}QC(XDGX~hzTLUlu;pCb9xN8RYuC2gz9#|Ir zIq!O1GxH~y9qy(IYiGm^Oyn_ZEbsL3qantaqUV}snTebr*e-5zF2;g>;5SnqsrX#< zOTj0$6k+w(2<(sjmg*%}RXCI4AC`%sSg)>-4{Wjn%N0$&0)I=UU1C4?in>m+hh6gJ zj1zF@+UQImGMaS>A0S4qU>t#<2^2^G2odcI;KzU4%~}@c-8JDa5yzEas&QdiO0r_| z@iuPnN#jOFp=4~?zg}dDFJ_?08T)`V+L8yO+@Hr!G3@Mu&8GLS-8Kk#;C)au>SURq zJk>N6y~Y#{{urjsFJTzS3z-hR<{fx`W91xp-;D8i{sb4cK)+o8j)7D_Inl}=zb~1t z5V!GCdaasVyjN|*Y`%p6l4QVB8ljz|Yt`M;g$Jc-_A5uUx1%;*fJ*zGFu;~tgQwe7 zVJot_$VedVs0Gz8vcYgX>pBT&?MW;T`*mKp1do0I$ehi<;e~229U*vOt0_3S&JnrX zyv}W2V04IrIe#Ah6-i^R7pYNq7ZD!8A@UQWCLGJVv8D_~_R4n-yVzZ?2C)|5QtKWU zATcXf1&fyv`@J+IInLG!=F^)Zr-K`-ZZnIv3JKx#1jL}>qW1u>4CM?$VtLm$oFRY! z6Dz+vU787_Ht%?p#wO=DttXiESWCUB%KGh%+@|<-cO6q?&Hl5x(Fg4FhKa>o#(c(tKcLpNVeA|(`~RtKU?}C%PFHLp za-yjV3HL^>gaREd%DGMU?pZaO?)A^@0o{*2s3W=;2}L}*7xNvhZxB4F@G29={adp& z-3u?=1>IG_n(k7nkRxMC65Z$B>Z3cav_s_^4C-CFV{Z)s^XPuV^DfE@?afW}&I{Gw`(ug4xyljH}+D!^=g7?~DQ5?i^DLiUGEwF3jAaESCYEdUg*O zpf4`NOfUF30-whKxqJr=78{~d6ihglS6!tUpx}aCFn}spGk}yT3=p_Ji2>#=+$#o{ zzT9PiSKB-WC_!n80k#ySX8@@GnrRSs+(3+dw=kG)KA0+CG2*_lE?hCzDlkUFtk3WP z77=;oWyFJTE?M!7HL^+bPf4>?I|r-Y;c1zXe?C<5X}}$vF0O7q;F&!j(cJwyB2jq~ ziNf zDH4r1E-i^5g(ZzM`_hXR?!%ca+z6uV{$s_OhQi&9(FV;MYp(1Gpyh2k#19VV6_mT# zA@28+j*uQoLb|PyzQ!P$ddh@jc~{TWNY5Fu3#6-pHPWS2LArBo64EEe_6q6cPrFF} z`+q&8ABNHt(myyREz-q&{v8H0r92|;bY8pN##i8M+GSgaFX7JDG2nskgP$j)79`_fO8Dv$H1-H{!`3!;T4i9lqTMVy!00tC&MC<(#K;x2nvN zyUm1SdFyV_6u4pdE+`;{0_hlG`F6iJ=UkISfen$pqQL6EyATyYQ7(Q>W=rH(6mkz&g_2|$Er71cz6r`uaxZ8yem#W7_@~GN&OvQ<61gV#^!E2Yg zaKI?aHSy(GQ0QDId6_MvrP;}mH;pO%@W#LDe5^&sYJUotlQhECwORW+bHrT?^$G;# z!pV@` z`@Qe`yS0h`@BhDFwd?zIUDxO7`g}gu=Xzp?M1Aen8Czc;Qy&!LU<{g76@+AAeMue! zsCmOE)eyM`OouTt@ci_VTH8ltatt_Ve{(o!iCdfu?X|~tpTCO0(nDrvu^8}l#OE7y zq&fu)c5{GG=3?DrYy856l~=LwmK~+(lMgr^?>!K#1X&Q#NP$!)*b5)uDt%4Z8%~k~ zZO|h_-}Qb*7I2rMD2OX`i8)A!{_Xm+r4V~io=090`p_T;D&IrN%q&?_?ES7%-+^M- zb=nFSp)%*&hxsj0YFy=f3i@(`r%3WU8N^9~fk2AU zC5wMj?ah*XunN?KoGObk=aCexkl3>3M?~rtzq3u1UTa0g=RceRe8bIq`EWNv8 z+lEFQhxlC%v9+wKOFZ)N_}7knfEb+0#QlsS!NV_dEd*Df z(otU?#?tzv6L|0wlUnGs0FALIZSZT@CjxMD%~vrb3V;ikvG9#OLc^EJvLTHS_7x5d zRR}VK?5Qey9DaRFez4Z?pok_1cPWHaVx(w9ggz2H^K;!;dgM}=(btvbBk;*(8yp;L z{_GHDmWDxguzzcK5~z%89VJz!bu7MIwGMo4*d5b4P=E57S5dO4sPG4M>)p~)?GGfo zM7kuvV)Tt}9amnUPy(GL2EN2{FxX>W=0MF9aV#nh!?iTz*#FkZMidu?|+gcrPmg51S!~-kYp}8G9xq z+|=2g!kSkjB04)2FP0;2gOopBukc*2_FUI{uGgDucs+A*EriCktojzg`J8j4`g}E7bV~;md7MKC%sfswnV^KE;oq56U}LIgQ+L>5&L(PC7P_5NBgl- zPCjOZjP!(fI6UTR)Cg%#C|`4D+`CSv|D>Se2c!$<)heK{ z8wGQQe_^zVP~?T*l@(D41jvg83edzRA~1`OaGV(enYUdG2_3kv)>sHXPM6OyEky4S zCT$dr#V*~tO%5qknCS9=iKt%zUTOj+Xm*&dF6F55&WQBE>ILdB1E;8sGRS|2VVvw@ zr~pj8#41M_xrsLE#^N|BhTw6Ai%Jc4`aPZ(%6m<3pepnRL5sWKgk^AaFPM1duhrkJ zKuVIVmV0b|#(RKSAkVQ24ASZLoCjPH#7?eLQHVV+LYovGlF;xeCVxz~r+L0{+pF@| zzDw8oAd5~&fs#ZF_{jw*mZMsk$R0@(*TkOP!Y0P)OjXogP^p>Z9vmfnnlHsb)j z;3&gO7-YdvR9t0z7jM7v418v+3-%%7;Es^AC23SevH0{<-%tLo952~LXF!ncY%Ws% zcy0Q+mroGemQ-(N2&92IWer137?4z> zaD_l0;?6o5IA?v(6Xi(M(Cb|?RSV2?tJCF+8HE(gU>3lD#;a=t+0yK5_aQ7&r&y*u z4%moRV?3JS|GR%IBJqD*+auErhJw|tZejY^K zFBVE{m9a(>sSffTO98IZQq;@9inK2NsY<@=R@33ZU?|-}hZZ<9gmoHPM1muqaXLBw z`r7T}1W|%2eC+`Wl(fc|jQ4jFJU$6^uqcoxsz_}AJB!cJa)pN3i*Cd|OlX$!@kdr~ zELHl=>WwL?zaPEGWAriduk;@HF3Jp(++!o`sj!1C+HJT@v=XiLMV}%`;{TV@5 z@6(h*4izcVRTyX#3cX z(Oxy;_(p;cKjm=nhc8_YUW~dF82jySIC!VwAm@8SG9T}$wL9?D{hxb1{U5lSW>+(` z`g_qKB{pc4>?Pm|s-1c%5`6GI?bV%piibuJJBLQ!5Id74#op&a^&Ny&d{=aV(7;7r z!bNGGe6yIZ0{s*IVRxuzvT^v{D_|KS^)$-t9FBE91$=n~EqTEKL=ofij>A_f&D#E2 zvTIKe+QT$4%vM2lb}>lA((wisi%?8nLTPf`zIx;SR~e#W2-oQpamoq4j@OUd4%GS{ z7;Ar9!5&ccc4fVEw@vZ36yyAf)wgpz+|_5@(5;7dk!<87S~d&o*$%)beZO)Sy-eOc`H6MeoHua;cSZuAyi689+q_OxeZ zA6Ev2UH}QxQ{O?ar|OiafY#Qo6HqbTcPr!2xpt|1FH(g=`DydWYWp;1WDh~JrCEWft( z)cm(d^g`LOGf;UyK8J8W-}rO_M;R-p@*b4V_ikX;fG<{M1M2L>#YZC0k}rW4?6F=| zkYi=PGpR2wEL_~y%c?5M2Q@$)QLXb6-uh&J=+sGaujcJoaF`+T&@<3N5CQxBlN53x z)|;bpHZBp_Dazt2sECFlBi07JIDYkX@qxEyyoK`8u!*Wh6yAgZ zRAoN(jcjXu3HHI!^{KLB;qThk@)GSevP@D#U8rG=EpNeoZKlU$U7q0HQh8%dc_ES$ z1QYsZ8v14leeL5#d!qMdO|FYRFd9MJ++WsHn(7+OfzkA3dVlUcFxt-jr6D)$JusSm zs2t$fa(`ayzch_+0pTmu@D&;O#(DXVem*}6@mVRag#Q+=ga#0N?IemYwNRM-2~jnO=Rd*Sw!$CA9wOJ7tB`uH%L7${E32Q1{8wNP)nM-e%9UYoys z&E87^Lf0Uykr)V#nwPMJGSB}XavkJc8iSQfhzJk_vsxnOv}!9 z`fH?yo-iyi}qDqS^-LoEk_7R4ilBaLMzNcwunmK@s%(DH?akA_F0* ztix^#iZHnvnMg3}Ak3es+RLgM1{4jxo5|6fl}_ zduNb}+-P2*>DUC_AS>S@J(HFtUF$x*gX_~(OH1U{av%Drvu|{)#Y3O=K>ijBXM2o? zTzqIdIky6V*4xjdQyvZZ_$wd*fV#+m`leyhP6zqYISN`&%$Ke}nmx$C(eO0}G|}+p z+v`e1r0$Re!pH*{?YGp!8_mPR`0yoj_cBHCY4yq3l0Z?QXv6!O_VphIC;na40vtrQcga`n`8%_O}zqM^&p z@{6^n+jdv@v8gN6$Y_jCA@W<& z6V+JRJH~fIHODMVLJbJ)_5l1tt8OERu(1oa*%ZGB2S~-? zs6Jg|)ioqF{==S+S>~Qoz^HVggy0l#bc2G35D_P6Mr{FVJ3iQo9uC@OBfKb@WGnm=?m1uhEtxNjiw|+}HtO2@ zYSe`}bhs{16VT1*y9b`#4Lret+lzJ_+bhuvPfssA?guVB_`rc@VM4*_P4Hb3tibaC zuw}4nbK}8s=yNMx3VqJoShDf3=F4Wf@FX^XM7_Nrx!)L&5`V&beB*&?*1XK2uu(gM zYJVT7gmv zkFa8{x$Y>%X1FX+Cz%v1n09o)7sJF%{4WerGCyc!z{~x`wwIMD+W*brI8z}IDH62^ zvCOx6uePqKWg)#+S)*{=AB3$(I-_~4Y@A3jRdJSBC;La~*Ta-5!wN4_JPZ_@!6GyB zvKN=!kiEI&THU`xcQe2*ke$6iIQE!z!$N>0fBXyUPMt{&EWjZnEK z>wFk){xGe~6xXk|aW($a#WKG*{NdZke2IK}jd*}P(uJ7-1Uwo+-~{CyK^w?gL>3y8 zJ^?C9!$l!d$bcS~$*^aD5WIzcA(<*L)yY&Jr;qbY{qXeM)eX3$hsK|GJd=f%T48h% zRQDXkgB8Zng;d!=*|F_PdP(KTbFJWT~&H7XYG z5~5OQPFUfGr~;$n1YI4wB6Lin`v*nLG2~G?xBze!NX>n1=TO`ILSZKHY*G9S{)X z)tH~Juo8D5(;OZ|BAJR#z30J-YhP5El#A1a@rk;xJ6MTZaO^T~u37ss`zg$D!s9pW zQ@CZnt4%Gdt;7}98U(HE6pp7#UG+5giHNE&=d}bAo)Y3@3kTiv{bn{rD-m0Tl8PW! zCVD=p2_>8aS|>Zft~LQMVjB|x!y`8UhMuRkaee_XWlU56Ooqj29(Vuv$#Da_eEcMq z3Ye_a{qX@XPwq-?v?T$sZg3P%3fv`22GMs3ugZOGw}UHFPfaZlBk zO%foI6*=mhqNnJ-b{l_|6&d?zf;Ea`1D{&ipCIPdT&q8W_=UI`Vej{KFFu3oarcp| zP2Hr2QDKe3AknvttL#abbB}&lsU!l})X^j@`vGvjMY=MAxNt&dC*n25&H2U3=Vu*s z`$%OeY5b0*G35ghTKiQ@slxs?BUAt)a?s%sF9Fxw7H zQeLtFVkyv_u&W2mj?*L@@0}JC4l~R-S#Z>dDz-37I$C=yly)?LFxhG5`2*1 zJm{z%gq#Q1DVtxUIS()-!Uw6&gU;$fit`|4+U~0K-NGMwb9Ujan{RjCy1BYe+e_u@ zmKR=nmG@2e!P5YzwzHsot&keag9Tlz3`WWyx#)0c@)GiXF%Hf98s1O1vz*gxg$Jag ziv>l1iB9&9dXNjM0E0YkqyhaUo4pv(@Q9x~F1i~(mno46!j|CZl}__6G|gM4*5oLl z;G)SzBv?39Pp#=3Y+>5SU-2ayRH3K?UKQ~w)!u*+Io?Y1&qBi=S#nW$SDrRgdkfKN@ z-G;;!o}q`_$xR96&CO-|BaG2p+yl4GlM)gp?S9o@D5m2Z5C&w6IPH07hSE4gMvPuT z#|rguQ6LwQ;C@3i8Ef@aE$~yE{*G!|j2SW4T>^Nd;-!*|j~y37#$M-n$Vl(HU1ZcJ z#JXhMQSOj&_(GSAZ;mizocNP38Ht(tx%wIUY@XII1a*_n#p@<> z4Miv1g?5_D@1XG3OR7&P4C5R?-kT=H;L=o^Pa?sE-7iB1XoorJ<$NN;_;Zw&^W#P2 zG|h|tdeW8f!m`2+FDj%M*TV)oTn{_d?%H2*1X*Zfs*>*;Za5-y`S4t!Nuec*5L!}! zUdr@I4z)MTcd302N>D-@_@AM+GnelM3ay0GEV!4ld_6Hxsj+XKqh(MBBsKOkSS_$G zL@F0WauEsMeX7R(`29Q$+7J8b%qfk^^irf*cRw};`}@!JV9%|h9PDdivA_2=2mAlN z?qWY2B`ECo*wPaA0SDt%2Rlm#XAwk=@oZiL<8eskqEs#-!AA#aj0dOf1mjuEX)u=Z z1mm8v_kiyBkl#<9(`JlkO>{8+=`|PQzn}z#@j;vYF@~EcTh*VHM3^>lv>t)Cs1w%F z55RK_t@5OU&Vk!|@>7iDV@oF5H*QCNyBrExu@oCEU7KLlZAh_pYgF%&1Gle(|BKjL zvVNE9yz3aaeZG2!?VTiFn)43Z?$1!~uE z4x?6w0w_!Y)dHHmilqV-h+t>{m>%I91ykLIR09#WI|oE{8`5@b3}1vw2n;qilff|n zQ?U_F2WG-HbYx6a&OX5d%u5#mg4?nkMIR|eV}UK%p&dBDO+7Ua-vw^xs2JX67`_DF zT&o5_ITN*F>ynZq;XzH3z4Aw+tI>k$G`giK*z+Yi&UAhEkMmYj><9J+rZBrXG>IWj zBE;rF*wR}-MkaUZ9=h(q)i1Iv`uE+js=slvnd+pg9_TX`^hb0ggY1w#8C;~|^g<2_6|q-1j?P{wg{GW^#`Z^I;mtGfW>WtZ zAdBd~Lb(7WD4jwKfMgelVDed-ouy|(05FD^P=5jWRT$M#V}ba^*1vL#rq?(M zDa{6dyrvc6kJq#0N?lX8^2g_M)uqr5IJXj*`(HgNNC~6bsOCH%Yhdc(XiAaCc@1ph z3ozXs4$(x8ThoiXNnq@a`z!Id!+fk@AsfI827rM#*w8hdxPuiG*mY}^y@UMfqfSu| z@|(z=1S9nPW1!=U8Y68m{=@4Ww>#hXiv{Fa4r#y(OD-b8h7+~Tn!bm}W@TAn$47aL zISl_&cvYYb%5{2;B0eVTtCD{@!&s}6iK+ODJ7p4NkC;%YkwFjx!C=h<$DAGZqHE6X zMHQ;{{6=HW?lV63`8$iJR3qvw?X8gVFpVU@kJk>EKo5;VNpUG_0>-X?mTK?zZ;&ZM zzJR&l6sD=IBY#2k1NVb_80iC+nuqo~x030Y1L`s!6@Xyc%fk(tipyQ8L@sowPePWySu*~tEPx1T-s zh-p8m*3R0`WAFZ9?PvTOZEZh)KS8&j{O;{-KYeA#08h8|<a)Nj?#tXLU0pdn0aUJ6EGBDWt6V@>C z8BBMT`{s8WAEDYULt~Eu0^1wGEyPqVOwp*o>fUp#hpb-^X^^lsqWlEg!cp+aKyN8Wdu|F9*loo&e$ z>CPOZevK0AU0Ci!F)U-1@}W3~?C-{Uq3GxfezgJ82{juV>pkK!`fN0zMWg`qXQ8M} z8c-_CRBX4GU@y^QdQg;lI4z_D_(jy_RQyWEYt1Wap1DbT`*z7K{-rj#v<|KrfQE+A zQiYgm2e8^R<1)%e0J2m8sog9GSjn|-T&{Ad&KM$mjqIkPG*0jQ`<`(O%P1KGbZ1T>wX6H%< zn|8yb>ZCGED94(`CQf%5M+r>agi&`+PsaTAJhcB(j;9I(^(5pm8*%<;BcF;e;1ZZF zOgQ1N4Jf!=V)pfvEqbsFduK0< zjgOe=;5-q=9*fPBJkx37^vSmWYJCFlk%P8C&NG;d23ZIwIC@mXlUz4lngXQ*y@n4Z!@oRJOY1Tuzzx+z3cwjd#5795*H=e<$ z??p!_L>i7k7YC4jrH%AL9)erf5VEd$O9%y9&%3(yA(>!f9qbf?v29eC_&)dNgObgD ze>^lpk}+oBI7cq~BVuoykC4=cXJz!E6C%~kj>JZdGDm%b8zVI|g78jQs zjO(X|(dUKLjs!0r!cjsx82!>ZLOf~Yp(|9j`1U-~tq-~xI8<@DhKrroIndlF@AyuZnsrOM+F zx5Om>2Y2j%r^j#(^qlk(1C=}qhm{uzTD%&^t5kb6$A2Qh@ZNeXb#9_5RfbLf4Q?Um z*X4RMY-%5l$uJV{sGP%hYF?_I!pU0momh=!g%KU_tMp<$=me!SmR<{&a*IIdUM+S` zX4w@Tsg&r_;4RA45uyTKrP;?T$d5LV|C|s7`BqRLkQZKKAeZhpJDQcB@Rd}kW}X@( z!cO%P%0cxYp+sQ_15{*|)|0S5L^aKRK}Ku{`a&`rzj7-)CdXO`Uh_8zcOZiaD?a0f8ZqI(GnyqjK5fWRkmKsUj}V!4nN_A zB^RJ$CNZ=pU<{IuCX6(Nvg&$-#h~zVAzde(SMSCog;Lq%(10;o`Qz;_RGgRe@t;=?N8qVPk3axKkSDJqBJW z!uY#*57+1LNg*HvYsR8Uu<&p~<03rCB+P-ziz$9pXJ??w%)F|zv+}?Uut0ivibH9E z+dD{`+7HzS?mhw;@~SRCh6^%LOjZp1{c54(=^OWk0^6E+Tb{lSV+EiZ8eg;BN?gjt zkKu;A>{Wq^_ekV18)dde)v>wRTLO_+`3N1cB019Blr`xk$+a{O+o@J?3boD^c!heU zftsPX1Z0A=T>xpj9^0KZSlJ(rzX;!jXfvpda0^6IH#KNJsiM9g%t_` z?Wc!|OeQtHXg{JZJ2&28PnS!Wt%mIoI(xFdEu+v3NVnGzVB@i-$m)X1C*|3t0C*?> zz7BN%5J%$$Dk>Fn4$$M<0CcQaRb3|>zU?rp>MSs8D7ZUR9OVh!tg7CwIN0?=qz4%- zhK*lCKZorF@-Ez|fhyg8PVNAk^NVdi13q`{k+B9vB4G&9$$oO!a7`We5n>@?39PDX zlrY{U<2F_20NgX+IO%n%*S2auldZAlZ{rJq*%0X>SWlN|jLa0#@ z#vV9W1TC@gU-mKjvH@GIHQVWO2L>G=7j_Rxh_SJ{c~H4nBQY!!S}3dETY1@UO*~pO z$I*FJAOV%ew@7xw|1NL_Wt)an&Sk7cT(J(Hm#u-eO68oG##NAoxrEB2FEQVsUe7l; zeJz;I`BUs7EvrnY(P3K8lyQ;Oyugp0C6*&fw4W@hB)HJ`@>IX=2U|ZTO;j0;CXOTd zArRqWI(9J&oHAr3(wCx`uwOydFf<_A7d>~E>ZL|cv)ay3x^(Wc{~f4!hFP>ifOSQa zrnuZG1?>)^rLbpOODH)HtEbdkonFodVUA9C10DEsp1fe>+hl{HO|xG_V4c>XfI=S< ziBt-}r2vsDlzk|Wa|MfGuwX1q;Z?uVe-dO70(l0j3aZsq0 zc6O{o} z_9kLp1-XqN8@kY%N!1ra?-~BEK}2)W4n$-Q6rhRWBF(W?H6A1!9>Ya=zGj8oQfCPr zPia}oEG`#e*~mqLWR}($c4Rk{+{&!wd`CCYgS+s$1rGj*(?>~lhl2<(fGS0>HULum zOB*PHme>RhWlvKAA5S0&>v>s#zbfZ%|@OC3^#8a&|vJSmkYRRt;Ne@q-|Md08J;Uj!C zBt@sGDqRXeO30aporYQ|se)%4RpqDV!Cp;KBVw>~h@EnESO#S_)2b>3OY>3Vq8m%a zLzZzI-~dK^lqXwV<(aLnIEkAPuX-xiEdGIFK!=`xqzOPA>4zSXO5azvgCbs`GWz(q z0sxFG5;Ws5-e>1x(v|IS_C&SuPJ>!(y)^PZn&_RT5OmK9UfESp4RE=#L*cY(Ed7vVfJrkB%Pzop?|z zeyBf-$Ypzw+fyISMc}eEaCZ$PaD>DBV&Um&;K|YYt=NQXK*K`ja%2t)BzpxSd35&f z;0rmk>;U=?r(4;}Z#;>T0p9mVi*|c1Wt5#V^!9FiLCFco??k+DMHe_{vE5%Fm7|wd zlwmCv3t?nNvYyat*1r$%AnD>4sZ7tLyqq*B6}yS{{{VF7`ATxSAWUE>>+%)VlLDzYFw6Ca>=yIeHT%=7}>QWx_v)oY=?&(ilr`aTC~zn^oay`+yX z))W7z^C;6&edHxoOoSFI{DXZOj#{?Q??zgACZsq`pn9t#BCr%}2O;WGOROTwg)YsP zYaw2xK9&f6gS~k!%XBhv4$sshdGHgm(2y8ox?Zl?+9O9@nh}5W)97z^I7eLuDjT{X zCrFq{0cK8IXL+u3%yld_RBiSfSW-%ujKH%&0~=<7;HQ=hC2%a7&6k#*MF(!b7M040 zMG5GR;Z5N75$4G;#nK%M+k4uMX`0-t12V|75VNg?Q0u>2P zs?@}|>IV-oYGa9j8fNp^n6(%)A|+0cTH+|N38jJ(YZ{{|!N*=oG|9b7i3CH56io>M zAeItRilM|=n?Z@c>=sXnxr9?-yidGyu?a79S)0{%S`Po-b73xBy3yL;3P6|=}n(iq|b1kWn zhBJXln;K3qX(23q7~TTF5bly{-kVfA;RzC0r|Mto`ayHez~cuAa(gqH^iR!%<_pn^8T-DggTLG60`*_)GzS6Thb}!fn5eIn(HK zd*J9HLW7O2!O&QE5Ys}Yz$=XD2O?*)JnXt^%a?feX<$l!c?LTq;(<+9vGfp|u6`<; zu6EK>1;7}kjM(YZr^~_PfRA9>9$JTefB@n&krwItI=134bfws!bY%s#;ao55rQz(I zOtB&Bp@6}kLiR(ef1s}x34ZswD|WLaixxX`lWK<__Z7S8f@@8BnxyCtOA4K>(+s3a z97FOXN*tHSBQ1^v=9);Vt$@8(9lv7nz zx3|Bl&$-H41uOH|4_$`)+(;i3el5C8W6;;BpLhyGo*J~rJ>R39m6AHy^?{0VJU=ti zF=0sHm4rd%TvBm4o`|I56ym0+G6qGLQAo;WHw7vVi7TU{DWglg1P!2f%23zTU%@+c zQzs)~I)!O;^sp3<%jGdxP03)t4C8_b=uSKvVtC~|Erw_dO0Y(-VHl~RhXrjrOEPjq z2{xI0Pq4>6ri3$tZdfLPguDK4*^&+SjzTIprwAa{%bL zsB&hCKWVR)u+2+y!~LYaEiA99M>^tYFe*hPW)Wg&6R%?L1_q@GQRZCyWiafYs1H%e zR76g>87Sv#V6@@=Nk?%Y7|VjQ-zh#DkCM(#PeG z*X8Eg_`2Lzr}8iq!?oO4L%>o~rPQ}l&%{zN4s2W(HL!G@MSnuT2}IVTTx82_u4De} zw*nQ*@#M@gp3L|hj-aBogeJhVd{3ifOjnDV8auEVjxQdAWs+dvSui!%h3In4161sI z%|;q{#kR7s3AZ}JY2+fCVni zb`y@NLjdGQNz9uXzFDWLDyChJcgR4YW4`Bix6I=dB9^d|r zhNnL~U%N<^^%s>~q>|w($y3P?Nl?#ccS=2KJ(&d>( zc%gtwS?~9BcmM?KqE#8H6ejf9yBY7$?sC^J0Fhs#G!!zk;Lb8Zwo_@Y+xk2oCpqh zpnA|o8B>r25aJgxq=`~f?V9gZsc4#BUz+R@vm>boJ9{{$;z#d)Uzsik_o(A9_7X@M#u7g*2)Zmc^S8Z&-;{ z0Us49bYm^W3T4S-U6%U(;!yMZ>{6tt!Xm+y_hCFa(g#E{GwhjB0U_21j;laXjA|pt z4SYwcS5n_gG!P5k)EifR~jk3U`~ z;F(-Uf)DMc=Y!|0r?nNnn%Q)YWvydAK(5Nx#!w2TQMLE}jaf}kOQ%)c9@tM!4{s3B0?Mg9ju@7_LB9#~RoA4Oml$gL-5}(6?Pxv0a^F@c`pRt7ZBC;#qUjo21a1^b~;` z0xEDrsYi}LK`b1zzirrdfU z(i}?AX&Id<(%JSz@TVqyn$Q@=Tv7~-G8O5Xu!m`Ui5&u!e`Vzh80 z6r^5ejRzQq&??cAbU}KKsK#cf#vEi;5+lA)#g4SVlwPVpZoF4v!`oni7*W&(;z4D4 zkuH$VI@S6(q`CBQBgGh_VSyM!26#OKQ%1_5&1%_%@(0Y-V`)8|((nLN;&o}YlHw$4 zrWFK_<29TS26uDEfq^OS;})nY$gmKHWgY00g$I@C`MRt^q+)Q80y30UsLO)?y(1Ku za)v5P!4*6&*;>s>!J_8&lfk7pHTQ6LqvoP~UjjnT6NvU%utcu=bJg1A zCpv2F)d{XzI~3I_-}lSsj9QEHec@x46RC>Y1EK5Fo;JP?JY3bC+b~Vpk(lnBYGdde zh@3#Li0pZNptgCu=vS30AE<1)@_`5rU0-Pkkme9I0kl6G1pCUa>pP2t)2{CfTnDC3 zO~w;6p7s2e7DO5kx`{|tOE1HC0$Ms;-z4<(&%^h4jtw*};W$Hh6LzRV;|A($;7F!8 zjwBwS=WnygD8v!Klq%-Lxs$W?^I1&AC0>c~1XPJeCGCMz)fk#az555I%;sPN>s=1r zf-OB*@BU7`c;KqDaYE_^y2b_RrE>2&vgN!-kE8$u6e*PtDz-u&Zy{aWS0mF4^0MCv zOg$f9@y;r3chLHJ=UbkEL7a3Dn^Mx=d0%x=c_^N(#i= z)uJGwfQP12c8p>g!S1y7Fu}(VaZ4bT5LKM|j+Dlb0wvF@far&(+1=k}yam&YT`e<% zSscO8eX5FIVFz!LH*ipe7s?6>Wnm2UMkHbk6$+K`hh~CqBF&IWT*oq#_t3KQ zP#1r^u9YjP^~hhf#(nSKEo)rkSgNwM#+8Ca<37{CtZ^DQV>hF5qZ~^DLJ=eoluNmX z1j&879Lq@ug9xq$Ufc-;D;2b1VV9l2e2Ua4l*NxSg-VsJX)Of{t7oU?{WR<(Za*%5L79JfR4Q)c|j43|!uNpZfB)py5MI0}#f5;(3}puW#tfp^Ak)L<(O~$@40iEeZF@n?de0*ES5pmecl^ z>g}hJ7>Hn;mij})$9@p;xj#fNY(XtYs#?-j5>&}PD!EJ&^eu#vtQyz8luTk#>-Q4m zK2gabl3Cye8yvWO*l^2cWPVcRnyHcvlC-7fA8|~oeU-{}nM!6$A~j>itW$Fw58F?% z<5}6SdkUJHRnn-EZ&Y$ro8f+#EPhVqdPXIiBw??MGkxJzeTZux+2dnBPV>1xr~6~H z!ycq+IZ-9Ys-#a;or=YNb%OK0b@I7iou4#Z-iSI^Vap>76)scBn<|;7l0;oKn%b3^ zJ4K()2U++0W({bwZmQ6<;^Fghu zvbE`ug2i;~`z5o+nT{C=#&ksW00{_9$9ksiG8N6-q|x<13i~*w;^iXOR2+ov+Co_R}TZ<1kFk^O%mMKX!dY#&8_N=n3?1n((XBG&i z6p)C4%H2BdD=i=s zbI@z&@;?Xb>Mn|bJ^IJ)MCF-!ua!Jj8c6#^@9os@Y2Y84v%S9wu z+^E&$0gI?pbf75T3L|=`=JDLk98iMgOd(~`m6@h*Qtd5knNRnW^TFj?wmz*k)#qZi zJhV8fLVV62$w?U@h?EZ~Js}7rb3#c%0x+#{wi)le5;Ve! z^Y77biPblKp3wRRtH^>Ao1RYK{EakR-yqi=N|GV;1z3;Lm1=ES@`ZSuXrEud4gO?f zQi8pp4*Dn(Jg-+Q`Rzq{)Km~CQj15w|MhBu2*pIT!at%yKtjq!50WPmJac-i4YY5G zE$8Oe%2~YEt(;0#&L!gqDwrV(Dddd3b-3aqlqh)|3I5|Eg_fO& zEQoj^ur~28cz%epT`EF2(GuG#$CXhFQVm^i$9x)AI_0BA^}4(<@Xw z&E%9@R8aOf^895E)p?Y4xD7i3N74M+t6Z8xp=z4vD4G|3BD8wwl)~6@It_~{=cg;( za^iSbfO70(&nAdy_Nr~j1`W6aLQ)$kHSUdzQBk!0DZ3R-GeX6T7Z3^u zy!x%p%aXtN>FI4zL?Kf%6 zVjDak_feB5nSfd_ z6=>EVE*mwRg$rp7Qn9yNaThF#D@p+P*5be`7oxpmM~1AZ$NYe+=B&l;r&#i~ z;VdMAWh{Q5J=y~O4;T7lM9543?|*5LnlwE4#g<>zLivHpFuo>DGgZTcW0I0kd>v~| zWv%wPJ5*gBHp}AVsPFr@-yeeSNj$FBFCo2hNUspdkwe1xFn+F)fUwcLBp1 znb`upl)Pft&r7d2e%`6PQcHQ{wOVqtU0x|Tuv{RTRka_t@PM#%0?MI;#Z?!kz?X3E zz4D|#;fINf9b|D4i|>L*G`^Y0900jKbT#PBPYhv;F4yU!s{7p757oQw2J_QD!LW56^i_fz&eDK-F7oX6q zczgy7HTXao0iRQ%@L_wf*d9c|h-WAdZlJna#+Fj1}0A4LB|&l;#(U@3x0_ z!oO&4t$NT0yR0AmxYeON9=l72DD0@Pp%aU-sm$(G;~}41^#ehH_pkM6cHJZ_OQjSu`OzVPq48$TUOEoGc0yRU}dXgBPo=GAUT-|P&hDCb3V+FC_< z^*0v&t_J>A^qW%C(AW7agF45f-`V{U zejCBQsmw_ftu~g5&$|U$+w@z{``g8@jraQSt3cbGRF^ZbMqgFO%iC=^20LYqj*I5k z^MV~mkbxMm<1_%^1e26U>_Bj1ms)H;c{T0AC+LUIG#)7*XI)?TB_5yWPKm}RM*hxj zzx-9-*Dm-kxyOeeE57xE|K9oW@PB`DtMGqO+V1wV^4@mA|LAld_)~o0f8ow}`1`gF z|Ml&Mzia#8|NL$r_^k#%`ro)E9{%eFwo3ozo7zqPynEV3|DYfI(`-NZH$NE<|8oPP z;g9hyzYzFa@h;=-NA>h}!GFnJKJ;JlUqAS7oDvWJ_a{ZeAES@{z3cjD0rsqEhkp`@ z_~6s@A3uC9e>@(a17q-s(MMmjUmtC|t6lJ~s`i0D%NPD9UXF+V(i5Zk5d**Cho^J5 zb9+9ZeeielgTHixAN>#cI3E7Tvj1rK%OdTf|Cv=j^q=>QAN=o~sYXY<{?s~bWx@#s zrvI@owmCHZ;HY|br<4bX&cz0Q|7m4)yWoBFP9JzveBnJ;_d2}r_SNvV;Q##&`_ZzlW8O140?P)xPfuK z+&BIC)w4?Tt0jD+z1xk`e6T9`$`7l{Ka0oew&UA|6)NSCQE&kn9mG|JeV^c|!(EPV z`(~{Fo_D9l2mP=M-S`CdEOg^7<46kduaqf=AjodP(p@cFdQ4$ewq7 zJhJy3XOM;43Riwa918_CIJ+F8Gw2p6bknCOwq}B@U=8~I^n}NOt)&(QOUel?gO!M1 z%*M6zi>1eau%<^&6g@159;n=Mqch#^@ZoRidOwuE+KZn?_s1UVZ%{@A2`Gb#p8go4 zi#!-T&3-_zV_ryZ2EBcB-zDZOyAj78jGjX@UlJT+@f$gYF!?RrneGn2x;-tA^?RfAZWR9Kb|>C8oQQ)W~sA^^1jn<{j;V|JtcO@Yk>Nga43c z;ze@DF|EOG4{ksFpW!Hyoy7y&q%ZHQ^ucV$=YE)FJRFZ%y2i}(n_JYEjW}s$7xd+K zQ`^O_g%v(nW%y!s$Vu_`_^f`>{K7_uM{>{hs?$>0X6=&B7+B3djclWakf3c+#ixGo zcc_e)ukZUt!{5&n|HIbKQSh5%+-*IK>mc(E#l`$$`LSS%#-}Cw0`!8yrC*aFbWe%V8VT^ z)r*=SvGkZT`Ol+A{v;oI%&+&O$IFMr)8orNtt|_a7fmkGdmTrN=RM{TcKqyG_#r zPVj}UKOZ&T*e3tt*fJmFAN$Y``O>m@a}biWV8|AM|KV0nPnQ^md5X(`*VyD@Eae$_!b{LkKavkFuIXXUlot% zcZVxH>Cy94oIdIHZr6~5&a?nH^EvLAc&tAE?AD#YkN%ZsH2pT0wdE%0Isy=X-m#QqjD~iY3 zO7HPg4RYG#M^@bqecB{XZ}%Q+h2tn~PU5fIjt|sPB{<7Z`yrTf-uv^-R^W(tuL@+; z@!~^Vyp6i{u77QG!sft*xGt#M9N5En#zLf6`t-b|4g4bl!%(Q}dThAKhmWCDPr&(^ zIKH4|GW``*wnQdJpknFuU1=NXbpT3t>GkpiA9_ts_M_K7rp421XnHKY7QCwIb>7C3 zjfXW~hAqPly%N8NNcHxT%>BlYEO8ay;~NjvX3fhSiW%fPquRx&xD~3!(rdv@ZJ?J+ zr$~tpo$7U@KU$kDS`kmD0}u7mNu6ccAKj z$As^|?y>N1o6s)!R~7rfU+U|EcJP7!(nF%)j|4Z?2=JYE2K-a&n9)!F8TjGBd*??6 zDi4-*BJp!1e_QQ4=PXe94ck;jN6Zw1O;R%}(d*8lZAi73w3O=!oh#&*>n{IX#aFYQ zOurl>TgV|ZICK1R93eS8gC;%``KFusd*^bxW5-@>{tc;~Yi@YRhjI4hvtlhDh_^cP zJEzK2{Mh-OMe@|l?+i>mi}!7u7wSKWT>^mI9;1TusD$Z&RLZIU(r%~5yHAM?Yxv=#N-h!-4D^YsQ{AriKF z!5nO=2q^`5Eu|vxVH1C#S~zBD7 z92xR(n&3cmaG|SYzIsWfXO?=&q5M#mLV!AgS9Jzkhg!bFMpd*}-@rg|?O9U8D7K=+ zhM}r49j5L&Apy|dUu=8mdi@{Ge{nes|5H)7hyTy5ZZH42<0;w$R^j2O-sQ`L+u55Z z7UqTD!pXG>u$<^Hh@XR92Aianfb9B_?ac8m!S)9iVhih{6f6TM$-oWIUE7T}2jHd) z4`JgC+R!2#9$Pjmstt8+oHHn#*jNK(V(GW?T0i=!Y3&RnLZ7s={j^5EvsSdEQrg;n zdK!2Obo()&s`hiQ<`>$JtRrMI5xJKYJ<6MO?0k_JiwUX;sdrB6IG?QpO+mE|utc{G zxKFxu|118y zgMj*<$e-_uG`?t>-u_gv?|QT67L&eQ4jKKiXT6zml5{_+dI@v1-dkyHy;+`tPuy4d zRMc3a#i|@VrJUL_IhPQpOTwqcPW)~2(yv8$-l482#e8^Nr@?N+DaX~YRB^t#-s0=; zLR&e0ZeuyL)zxtZIo6((UG3K%qWsf#+7q=5Q@f~XTE9axvlrVPzO=uK+E#nA@+u9l z@y86Psy(cB?TO=$HHz|e{4v0%{V@(KdY6tm{@AmUBi0{_SwD!=?%U>%J%o_E!_!m9 z$sC8LSuRg|-QweiWzrh8=7-7p!9-a<2!8j)=kUt9yKIl;clDJ{`$88Y1BfQDFOex1 zkzjBRmz1hGH8_HvOSq00lnmSDtUKn4jqcc}e^jrh@i_SkCNQ=cWN;=dWhiR7TAcsV zRqDrj=!560wb4Cry|-L!5`%8$v zaY>iz@-Lb{68kF@H35B5Bo~k| z$cvsw37?y@CuyiuCl>py9B~$u19n3_zFe)hPodO7RY2<0CJ%oTMzaKDPO-Z`%=%uOM$P{V6r{hK|CjCpy)HXM)2q|Ow$W?d0}ch+K(AW&Yt>#(S+FyD9rd--UZ%`; z+e;^8RP0=?S8H3_4q40qt~MsIr{5`;jVqW z3KKFi-VdUd@((<`5D(KzEDl^Xv@d`EOM^pcevUcrQqgrkY?RW}tES@L}(*v)9P z4@%lb!8v!gLcttXB)%qmDSDW9xnC;^Ui-3#g1Xl`j$Niwco_NgFb{Aw+NP&niR+Jy zs?3MaZVv@x`|m5y+XZ=R4jKJl+%{_6c2_IZiu1<{-LDn3PI$>fEj|KKqy4cnzjWH? z6Q1_D<3&TQv1hf1TJiqt%n_PiGTR}?$XmQW{^SttkKZ}omo`!U_*D^yE(+6b06122 zLxw#5_@S>lEh}xd+p<1*!C*S&%venQ{PC5;+lbHbp&FmpZ`?UP4^+qCa~{BI9iRI~ zIQUp+x%l*S@OdGxE%I&s8~iw!xp7?tZQ1`Csu=iI(R_ z&vB@-d6-L;9diwrXAX;{N<+K)mn+X{Bmeh0)$o6uFKwda`GGqfx+qM80JwGjkDquZ z6dI@)3EBtqQuU<2dEQ|9!WprcM$2;q`)@KFtj=frUq0~qid%egW(w9!a(0bst=PKJ zTw^=P)qJmK(l(Dv#5SOuViVD4hNy5nVlvn?HE|)Q@Hv~NsuM{u$AN{ZQ)*_aQ&R-= z@EkdnOirueZn`1XgU}fEfBTI!N?#nIj3b97qHsZWjy}PK+r`)~VxkAZn8tjOIq8<< zmsd0R3TKcM@=?_s=Y(v2!d*;d&v+cqr*;E=DZLy3T7YMoq-tl=o=`<`dLaf)L2PdH&!3!nLMTx?iOzj8kF)TnLu1eh~$-N3O++&eRpdkXn)Cios{#Bba>tNmC{hb~9v;{%2=U z#ocHI!6mbwY+<1CAwtonI_w+za92_p+R=vwDW>UNRU-@JXbBwlT!=A1vMPgRi^TNd z)$%%twJu*IiP=&WJBHeVlRh~N=UbNPJuFegbc3#atfj;qLp2ir)jP6=(LxN?DGt`D zcJUpm#T6>TX(uPeHvVW#F%^qbpwyt{JNPUY4pJXr~B)JC$DQ!A57z`|G(>l_ovgjg+jb&^zYIK_Z8D< z_~?U+{{9E)gTG|7Q6J=EOwmGP{+;?DT%_xg~vYMTNgU*rvV0m||Mf z2m7%o#JBC=s}HRD|BvW{B1GG@fAE2&^+B3eHJM2HquR+b*HCL>x3z!pMUh7zh&2^$ zzeM{7FGuSGaSUJuSeWq-*0ToXAK*M>xsmBadK+mNur&L%D1GqAVCVyA2Pk`OcyI&d ztsNBH!1(E{{UIJ9W%^JM<`OhXi?EbUrZnsEd7U1AGg+L`u9HGnU_ZH^2AuBDtvfum$RVV{4V}LcI&^5yF#?!Qgbl##)W>Jyg3E%iNZ3P5{4dhc;Xj5M+D1kiowI9SbZCA{2Krjgdar259 z%=T)U`baQw@Y#3^X)C&d_?J;$ew7)Jqe15F82BQ-Sys5K9=bV$Lw7lxTnv#E@lwal zK4qUT<3Tczr`0Z6v2Tmk!mh{P8vlv8#rKAXBs83$W?vr{>ruGz5}Y5fLMx942Sa)A z`~aZ}s@epC@JHoAG2ssw9(0<<@b*zod%`)MoZ@paNCPbQ6)d$U1v1w%V-*g%QcL@; zyMm2hPHMwM#K>`Xox$zbUDWMs*YkVP0ZO!0+tbZwHA_PaPPJc7R9Xb>MtxVWUm-f> zaq8@&FyGcG&%XO)#}|HTAh7EV%6b2rr3ZBzP?N6*yDrUM64j);xU;9q9zGEjJ#AOVnjle zMraAvuY7#)>hfqTQG&eP7YQRNGjQ5S6ArMQit~r`spn%?$C`9X5e2f*=vm%Od zL?-p7;3+_fN;s7ORV+z!!1%nodr6H@fO_5Sz(-?lOkBu=+IZSih4zYi^mv0#}mY{FTpl( z6jV?Rs+y!z+3D(3rHARJjkkxJOy1CFk#y^s#vb#e9}7hfCr4Ee zK?f3%y`1{T0|4!WRe=ExGWBU+@lyfn|Ku4y| zk{js&m~(uql6YY@?V_*AB|+4Cj5Zo_;@Gc z?%!~yo(@-z(MpkioW3k}5#n8d+z{_)&R62iTh*?mr?7kxSVEpi;xHplyuT@OnXz8r zfiUtkn3NQ|wEyp5$%`B&iUg}Y)5Xc|-o8B_*nIOvZ;u~Q>b!Nd8h2VuE53?3&vy7$0QB(PgN zEh&*nQp4T9Niqfr7#HVHe3#|;6KI{5po9x(Kk^G#1qSc zWN+&kTq#t&poy`n=P@^oyDle3mGhm997P$%LunYH@I+IPo2BkI)X-j6-~(eCpCB^$ zx%M9RaT*(dvX4E87wuycNd=pjMuEkT*CBIF{fcYB1rG~S0+&T7)w&ku_2QnjqunURUn1CCcRvP4x~U}xuMNT=O|Ysxc!P&>ga3gNVBK< z*WonK7VBAXz0}idho2@^aOy^++J?45(m)`3A^U)rJAiFboU|TCci!dXCQ=iaHZhF^ z-=5qyPENtz2D0&>=Hzc+;Bf)X$%9BJgq(%$*k346xffn(J8G}OqzwBIEpKRGi0a7q z+8>$C8}NND(|GeJkHtLB>&_1(faWoeiYi7~IO1^bC|4s(b!?gTcYTS4*WqxP57&SY zDF5Hf{KGjUh4X2){a&Wr{$dM7n z+Gp9>;yFKbfPsyH2k?!rm9~3h8|S~PCmh~|zg)_fcr=%(aPb=~(Twqzr386dD=*a1y`!Ksxv}Xul*-AA zikRB_5S4VQR12l74qqI{GSpX^+Q2~Iab(v7JbM4Q26>z9l*uti{Ii z8^>!R!Qq4Ac2WTi6;iEhunQq7JPdob@L!f$IcG=;|Ekf)6+@u}4>tMfIJuij+h}*k zf+ee}M>-ljj63u=`I-Q6fNzl^Qc;A*4X> zWE`)tt6TH?w4*2+uBgB)!Gf83++A${Of~q?V%a>J{0>zelD-bcB;?L0K?auO7crwBRVB5XfHH6Gq7 zZBmZ~#jpwJiXvGm3HYGo%-DoErtzG7iEcdTS-?9l!;y1=$~#$tat+?au5s;dM!OY> zz<)Ke71v;YQ%4&3>s!ap8`fX1mU?b!t)8blXknHzKhJyrXfnM`A4{vBNR2NF&Kx?bJ%xBz7`Lw8T1IO!Y-R68khupu}d_ zJrDEcN9!EE;7Z}e+@t(B{5JM>^JxP+m(N61>g&S`eY|I$4-(GqAY%}pinPm1dg%1WPwwN~qyvV;wwnmSj|(@db`$3&jkv&- z?OB3146XgW^kLfR{rA3HT1y8{iLRS8)4#->x0d%ggoJaTvwp9ebj&j?yGg>ocsFTM zoZN|YF!o}r(bCZ>8OkKF;W371 z)R0C4W?3^hlguQs;UA3Am^Z(=*Pk}I*Q0rz)NnA9#D-o&{7K|dnt)bO88NIEnuVWNq!><9Py zd|rc8OcEMC_&$0{nFWt@7{Rni^1Ou{IMlwMiZ9h@0j2Aj z{VlVJj}6y24|mOr+ftZ`Z1{jnI9uX@wNJIdG!7D&&MHzK}5 znZ3XCd}r@_pu=N#eESI+2qUG)R0tkFaGT+A+`NPF@_9?++e40yVlbTJ^#WMj`1WV> z9iIN{7MG_%RIGS~ z+*0SI+G%`_5DQwMOiwd2+7+(w7D$H0P;Vzi&t1S%PkT`FJ@O6$={Vn`fVyl3Kf#aJ zv*b!$&-Pr;HP@n*U1FYkiZeNr!?0rIq!$-C>ZYol&CKMK4ADv$NC%qIqmVIjhB#Kd zs;C;W!qkdoKwNml_8rHgDv^9wC2pM&!=u+GD;#^fuI zg^w<%YVrW%R@lX^bHi^+-{D-|IDI!ww~woXx_vY;A9$OVhzorkGS`vd z4ttH7XVbg2RQ_s%X9tjwt+=It+giV~F5rES1Dm)Tx*?3)nuiBHGr+guBgS zkqcNQz~P;s%U+biu3FFB^tgthzAC3Ym`yklD_CueC zgr6mVfjhiWb!g5C8HKaGo{bs`1&LA(SwMD@i?x$fbjDF2o$(XVyjW%eAG;0Vnv-I* zio6$zE#;T7TICZ^!z+-v55!1p$~=DH2-O0`7Aa65`hR%)_5iEK_5Z0U4a$uBaO`Z( zU{I865r(3j27@r=(zrI&P?!{wNi#HdtL8W%M>H-`oWAC-rey`8{dEV!Jmop+BG6ZLd6jD1+!imPtTmDEI5QBE!iOqp- z+^x3@2qg>v01%;cD>WVlQ$h68&b$6Ht24yTlcF9D+$t%a&CWY~4}!`|KQzrw52vz3 z;0`qB$vnVcPVBZzd>zsT12J6KVH>MM)Xsa4JklYBcj@q_7yKnmNIn7kpth)-2-WRlFPtN zShbM*5=60mww}gkJP7(LHbE=itc{5{1U}u)-TkA-ko?V3*uPY%S$d5ynrMko?|4^Ap}SlbUM~O#CZrY z7L4?XvG!6+j8|+KBt`H+UP<+SF^9Q5R4I9X_@V> zAFUx6OM_rgFX%2g@(f|dC6F0+PnKZ?Lo=pX%mkA)SSgKSWpbIw*&%_Rgq(ss$>GN) zy#HMRr=HeFFjynFOzUTN)6dnLo(BSt%5y8VMV=eUr1HE;TBD{uWoA^K6OH_2L!}K3 z97!)i!vrrGG+kkS_G4~(Kwk7Ivih~dc0v6LX37)1)n?YS$)O>Q`3g}k(%>)EnCCu7 zV$7;B7b8Lh>OFIICI~kQoLbhHKin0Ca6tgVg##oNq_ta!V%V^F+7yHeL0DL0vX(;?LrKjb|5g!rdPmF?24lz*B~ zhKhBKDJ<8-K0lz=6LwJh^s(;jRCSX`%6}WW>AO#WZkDl@Pd9h$M*tvMN*+_@B#(mn z?Fdab43RW#&195I;?xvuj!?Q81yIvQvvf0Rc7$%u`!@@CbmPZX(2Gs_rGqf%wMe;U zjz;7s${E$haz(EM%DLBe3=l|-)G+#wiXFXHSYvG43qu4VMSTKUNd=Q#|HU#A$ZF{> zk~KYkaT6X>|2=g-slw>Lp+133s)U&0r;qVaWxtO;V7)4Robnja<oKFs3%n!I$pzh&^AG2Uw85ev2es{fLB#KZff$0IHU!f=wr&sY4ZctnqTiA%o5 z6WS-9NFEC*LVG!b6hRiol>Y%@M*HlGcTxwbWZ#()Dbo2qQvljWLilHG+3MKD)+#WH zg&83eDwVpt*hF`nj~ozDnPU@kARWCzZs%3Jqk8-Uu?fTK9cWMGrmj_15AZj#XMBHa zaYx{t{#KkQ%IasS`$BmG9x@&U1h@O+=UZT)Q)L4OPY@|6#fm~gT@NJ1(CV8=g4Vp9 z8eCV)Q5n8nSgR)fBx~YxD2o!wLF(J}lgzbJGyn?f|^h_GY;S>r=M%3xcheMOuGEm}Uev zgpH-0WOiKjk>(k!GbY8ryzWiXcrM@a0^HC)5>gc3PE&u*;6vkuNQ@7U3$UC;kCKlI zVA5+O5HJOAxm}rgfgXy9%5HRrNAiy`oK%HO3Kx}f;lv6$=_cu$@$yZ!B-1tTX)*hw zt%kKrNM2IzDW~voAJJl8uizm>tn9>SZ}A%W*|sWFygM4}svK3EqbeqCH4wf)^)&v5 zW-k$Q8XFjPCBI~jn1%Q(%7k(EbII0aYv8nQY`h2CBXyFj67n0SOmLOFr$wEWrzl(X zdK#}gq>vcFpHC3)pqrV4Mqpca-woOT^Wm+DQ(VleG&j>|D7$G~S7@Bru!9XrlEXar z^6%0X9u&C0v^BuNJjL<1st&*fpc(~G0uO&TN`ZUeQK;m^w$QeH5DF4Occ7AhV|i2N zJ_3$qmVRF0LXH!=VDS0iuBc;aRWe5In`{ySZkAEgvHbO>sM|vn@sq)^jN>o6y)PAX zEMF&La#IuWb0ij>=U|!MG!nLd?E1#N9n}62i2~v1YUz;ugF(v-e2aI3gx8S8%i)2f z@-}Mm62?YXO?ZHHe2Zqn?Gasd$z3cEuz0NzgI;X%E-l#|X9dc+3%C*55$>`9T(M;P z>}iN{B8M7S>*&Jg7Y7@05ATkWWp}Z)VxxB!K zqpgu&Z2SJ3VTeO1eI*fyFJ>2B6t}9XsDv8|M}mZMpHPVb0hEX8Ic}RLm}R719sq-y zpctlQe_cJCkiziKpukj(T!vPz`U;zOH1!qz6tgo(_bSS|Doomm-8x_ULA5v=5LX3d zq=Nx)R3StQ!5&wF*xcXbbr>d|APM2sr=X3SuO5tEWK(3h-4w~Tk7%iFfTe+8K}TL6 zo3oEwv=7QUzmH45@N`AsmQ%|em=%7{6YB)A_L8$hPTi%#&YqhC04`^48)02WM>t0aQE9h7_c%ge!2}5E z3-?lN;mqG$p^DAqY5n88iUy5ueAPzf_iB`4s{I=NLLN~C^TTTfkK{U8j^V7!8MSS~ z!OPv8*wFW}4JNRnHA`yCn%jL?U~p&e%tjH$Fu2x}Q7};faenRPT!k3lP8?;Qwp9gF z3W`T_ep*zSKw|M>_}|tg(7Yf=mg!OOd?T_=|BLM@hi{W1G+@;CtA=>>u>E9DvDGLc+9K4lu&BdgpIOi}BWIlD#>eG}CInK;3R(QBMK+wfkrU z-|^*Qo;!Q3dC3L1PYo(l9diJz#_%hTvZ_WJ1(&*CaUsZwH3jmGC(56gt2-!jbDr&# zxyh-f$qSdB1JDE+f$GzYhdhFtChbWKr)7E*cNaM!!wE80>`#naqNd{)lQ+1k`YO3| z!kBJ3qk4LBBEPnQ4S}S($>9p)63(7vO3d4?O}XF8Ms!0YKjatGFa(X?PX9V=SPoxs zxz!Z~xNZMW-2RZirTm>pPNRt?+_rgQX$^0%7bQDu+EKO%9rAe|RY6Yb5T;?O7Fdt9 zg4E7|2UqgJOs*h=KT&zL;J4ox{}}(D8jb@?34%C?hiO`mqN34WCx;4~jyez6-mm%G zC~8D(MOGD-_AX#;cmGKte4tf=m>!HTYSSm~c6e!mgGsNuz?6x>}a} z-CcqI-HUf11awglLR$40!VzH1Drg8jWJ=GxOdtN7@bK%mfkfnf*p3u8PGvkoL3q@S zkI=d$DxZ$qZW_*Ytf%&>_qSuA)TW1GeBh!@wE%D@4HfpkXc4EgY z*24gglWZ&zFs~8b`L*O|NIDlwUcRU{=epd1zt|I`wg^>kbN6YoeO`nzzmn~5Kf{JA zkJO<-n2A9EdTvKZixLpSga(Y2a|LckG?nV=+g__)13lh6#F!bloOGNYi|m13#7J^~ zl0WX$LIjNYH-_dd*S%S93um? z4-e+-(dT=6gZ-S?oqC^eIvqS{Sk8&V^4x_u7Hi5_z+0k0m%w+Y=LZ>lr>YO-oJBbkZfv8G zzgb|{;C2}nn$#=j=q3**cGRgprY}JI2GbqCH{&Q=byEoNZy`I4p_M$&53G_dL|Osq zIST2UxtY&G8u;oaPTr_KfYsP12`kUq7^Sx|*{qZ78*I-q&`3h6oU_7lUa|cL-W~b7IQ|drWZH$vzXDjrL_8ZinwYCa?y{n*kT~ZeDjt z;Z2dAy|N)-s=UPO4yoDrX>jLo8=-a$V20(Rm;dmi%EvW?H&nKmb|81pr@^(C9)N4w zX8e%vsZ!-SIZMPO9h)g%i|;vW1x_&1$ELaXi<{8uwqSKQmL+%~7YTb&W-rR+Lfgx)9V!A+TIY#5 zC5hx*FVHoRhtK|ghjFbQa(gO1z0Q@BY%tkSqiV4R4@eT3;M(4!# zD)U)l3rxna#Q#>2B>?`^Uex%xsry0wKtLW5Fyx{j0-h&u9QA4h0SJW>0S!I^Zrp|l z&|T2aVfN@|V+c^k3JCDEXxx2iegpx7%B*d)8DZEXH4Y=iyteYE*!Ki~ihHBDnc|jq ziU^M6rb;nQ%&!CIcin}V<~Na}4$g0GjYnXwQ<>-?OiE{eaDJ;EkIe6i6C(4w9fAh) z+wXM`g+q?_=hq*_&HTE5ttbr6kIKZow~AZyNS6SZETS1!>LV>PR3_7$!3jHEH$Br% zGrA<& zI=uwN&BV%6!HEq5;%MKy7h|KFCrpjT7rDbAg^@ZiybQyEugk5?Se9Q~h4loA*33*d zNtteHnCWod%5E0`K3xC+hU5h}(2ZFSF8S|OQMaz;{*0)HGNG1Or02?{j{SvWl~nLl z4A=NC`0@Q?r?zM$L1XfBr+y2S!}Ve#VW*lo!C$62A=HZb3mA06FF(BIda=DO30x=a zb#hQbNTse9^+R$HfJ$wFm(xPHm(*a7;}v)c^Bl(QNTBxcX=&+mEkSJI*eJv@jt&Bv zqoe=LkpW_yBv+!P=lt5YY1So&RZvha=iHLRDtRsH(wfw$J&XTA%T<_3+kmeV`*QAa zXdb@7g_^wuO#y{OveTg91=59GyQ3 zXkod>Nj-}#sn4%u`|AFl+L_5YlaUF4)to~85-Kf{4HuWeikNwdBd$y&?~}(g0VZ>g z9Uhn}bBxB){{b8lCz}xh!S7sYP6-7)&F6i3(AkOgd{Ti`vN=s}(R{RjePDgTs+e?+ zbfLg9{c+NTyRlx_zP*Q4CbXj~VvnlUdNK|HR@|@0%E|Vx9cv{F+$f2xKFefkOonts zaFN1E=^3fp(h>Z7UnH$d__B5c+BYI;$>&xi-DEAuG20ZZw@h!a|0_einOZN-{u+Yyrg`aCQ3GP))# zW$Z=Y7UQw30}7d=tivD@n5R5Z@1_R#wUc2`&#@h_>_cTdj$Sg&9DeN zAwUqD2d-Zx`ixdh;bqfdi5`&WeTr&q{wMacOMFEb2*R84j$};n#}BW|>@{pki9$Zx zQuMqCF|>`|H?J8egCi2;d`!knYHDOs1M`el6Vuy?ZFVCT_PGSzJFjMe zQIXYKfVIz=f^A6VxwOwlsZ@-DXm{>^O#;n zyq!?(;iq1`ND@d6l&(e%B@x8=ghbF8a5)66$U^rVwK;g8+#FRa920vq8nIgHwc|La ztI?%GURo3pvaT~l2b<3lp;&KujJQgHA@J zK@tgUBwYI$i#ivhb@q(FHV*>0PWsgHcHsv@6lrIroKY#%U**B#6m%$RwUp@hCK(Tl ze$;(i07vZ7K6C_wO0W7vibWq^#>@_G`Z4?SrOtF?0%el{%AqQXR^5Y0?sgPGxv6&o z>ZL{$i4dxaR70y8kOhPrIr7K~iG3`9|3nIecPdU-4Wo%QpuZI?h5Yob{PjCeg1ae+ z1^J9?s~bFxRCj|(ZD6bdcP}1N;Kc5_ByEiaVE0rAaj=}dlJR&WL%>bk9eBy_6*~Z1 zA)trm0`VP_Khxzih-T*FR?za1RrxV2M^RJ53w*FHGL1hp!s@Vu+m1}O!%aH^<`+O~^F#ul&VKUOE@n;qzNl*Nl8VW4{cOsb_ zA6_@uYlw)|cm@$sLAize(9!T^9h}`rsEga?evAwg1fsXTYbKsRh6p}l9re~Vx9#%_Lsczn)my#HfZT z36_DAhE=^f3D99b-e**25_Cm7l+Cnw0Jsv&4S?I@R{>m+07LzXEYuW==OmzX7gQ3K$vF{ty>;!NaH7o^B{y905<`cojMyZn{XI^ zQ0jG}K5PM;(v^Bacu&<1ZVE}C^NC8_VBB`qN@U4@n>^DGTJRLJ&e{Eb5W+b=OP_1cc9uRXKNyBc zGAP?-J_aOQ{^ESt#S`^e#&^4EZ*-u&8n3-Av$Y2%&eGoTroBD9 z_B65%W}MM1Agsy;eFH@7zUAy4pe%6T20MD?+;`u`9n>nMkHk(T z!}lDqv@Ji;C`-1#>>%s5rkx+OzZ&Kh

2SP=ciYm*Rk^_Fu6-<{?68fwi-qA2j_k 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

!BTBin9{!0SsLqC(Bzxk(ETIzJ9sV3}f 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�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
pM6yuTy+YeXwhpDL%cbvqR^2TsPv6^B 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 z zd4&%-(}5i0Lw?=74rDNQlH^K?&Cu)TkdeEm5_5^5NdxAXxZ)#8mi^~DK|Rm*%N*lEb`tW_e@K}-2NtZyfgI&S?&LyFBjgN){6io^7dVhl z9qCcKqR**k7a*DK`0 z0CL&k0f&b8kO#Yv^9cDJg*-gyk*;?jgL;;`kUfNa|2d)d=%D``<3M)$^?c%WheJyU zIYS}88}y$$Igm&BkXN{nO9^?DLOyqm&)XH*pq?L(@LJ{jF61&o{^##P?a5dBkaHc# z-}{hNE@UquZw4eB>6-FBj|OIK6DCmsgibmf3naTQ3LbWw2hJ_^V{O zN-rnrWqZB6`4@RNS1;%2_r$X0RpgpT*RbL%bI`SeIrj4CJV5B=rt`(pu2JV|C{+94zU!E!r2enF_20&;|5u9YzwvFM`d^p0 z{(t?f_20I?`g?R9Aas7N`WM{#Z|&8;yr}-qE)3OwdgA*3<+Ij*oBrzW(RqN-`MK(! zxBAyo9_uM0ylIe|9G9+zH{RU@@tb+~VL=p6H{|7SyqMb`gPo5fxLH-hpXH`<-R#SAcqT2XURWaEAHQbxs|Mk#wzBpeybjxU zA}z&4;6OyO#@pS=3jWp0_rhT2vrU}{B#x(E|2fFov6(C#obXMOfso>QL-N0r|-jD`b?*l)1(?26bnAt>v zvn0652ri~~>MQ?4dN28S4d~4U=e_;)Um)5)?+tobBcg$uTDi%kzx|q?$CQ6;pl2Cn zzwtzP`Fc8##%sCdxszhW!y9c~cE#ydPNj6=okmr2WV?cmofjUCJ_3 z8n+2-HEqG^%Ru&uk*09Z0k(D)Qk{6Nm0MUq4mUd0x* z4=(%&?Plbb)^Ef=jo)irzn5l_@n2f~w%zOtso(fss~;>j*iDW#kQuybl$%MlW#}m) zp2LyIc9iR>S>vhoG~MC{93MUk2F(RE^2AasgIE$Ymz>H#^RUsTTAkv;QHa-8;!+pu z!>kwoZ_q!g^0U#u{DuDY8Qj8D@b-B+F`S16FC7)%pY5V59;Mv}8c{`NqFB4{W;@$2 z;4k{4d3HF$VI-3M(GuiJ%}pP@`_*zh)#kWAMDEv`P!99R*9-H9V|PMo-G|n$#+w28 zk9K%>RsPTcgUa$J|NWCy`KcRzuqwa9jQ3aNkKMeoEWiGV>y+h}jQ>Vie#4XTXM>sV zt;+9sJnpX8cg3pwfxlV1EI)SRm8vUXeFAqAU*h3# zI8F@bBV2J6Is%9pq^dlB=O$>7j0TLE*pW5jtKdi$RGkG^ zy9WNL$X~iKIc_J7`P*GaLHBcOU-^waqk%?;fvThdQ4;E~cGp*8fOZH2iH?vwRCetn z2E+ipy^%v6#RR0zlUAeefJBcaD)Jv}x(OtO$JXT1+g^4RC|9XMK@_ceV#=it%A4bo z{SVnXk!)QBwmyQsKAZdIOE0mNR$_3He-VD5viuglTl~ORh2;z6!UIpFWJ==|L%QT% zq{>dVf=#W+H~(~PpQNr!1Cnq)%!WeEhU-})-~C~Tnq8EdXAbqKk@H%l{nry>7T_;w zl1qpfJ1P+6Lmq<@gDdi{of#0bZitxum6*XB9t{?-Kk&pj|4!RGU=sa#W9((uc(oAM zP6|=SLG|chMfK5zBa2bZEJpRc)u8&|>&sW=pLz}E=fpE{P|TEB`18)6aO~>ZZM$Aw zww7nPaCF=oTspE&;Za`73dd?{S4};MW9887W9J;I0)hC{?it*w>-kZw>2&^gPpOtw z7B2qC@hre)`~v%G=l?D<`(H)VUM-R)-rEnwv{wLxFJSXwp7OJIGt@HAcQTE^DJa1LB*&{B#d^wNjMn{E=1+ag87ckBFRJ;BY{y7QjGoXd`v5bE0Nnxn^ z^eNv(EauP9zecxTs%>l0F0@FM@WpS#|KM~Y)qzlhr`rC-d@_EDXvaCbN49*bZH7VB zM791o(NN7lVmTRsP__5vWqM6yIn5$r*{Cu$8%Bu!C9Km#t#B;)spF?Yg>%m{jZqO- zKj44l&Hq^Ztoa{eC~@v*7jo)3bFzRECv(n}C+yW0b7>zMz9!o-Ob?W1*UjTyGkT2l z6v^NnUP{r#(NhFhLno&iigX6ns4~B3c_5&vwr>*!>Wo1ZCI3iC27+3xk9U>FzObey zZy+W6$0i2&A+sJmBDMiRmHF?4N`915h0aRr%fj!FCr7}3oP}!Q6kXv2-&`th4#As| zi2N)`P3C+#^`t&)u1^Ei2ZfKIH$>YE)oJ3N%KV-C^!c%tRNJ0{$}Ki6PmTbW&%)5b zE%sv)&~XUfjI5PnpA+Vah^fbw@r%v+#nx%D`=MB#>?*aecJTYHnjD zQ`^^EfrGQzhx4E~$_54`XTne&UYG5t!!?8RoEJ;qtD@lsa!7B2$|o8rQHmh>O9o{FO)Y z)%uWMd>Cne)FxC3gt~&hO_(yYADbX?;^JOs@Hf}MCVbB~t`YTn>`AL1;x#;KT@C^~ zNEC}My!bIYi(2)g@o$UVH**w939w_xA@^RifJyTqDg zdpT6ROkS~*VZ&9h;qpKKmNMT(@fc+w8pTcWDvV-Jpdb?}aR{+QhFbu=sNNzkuzBp5 zX>O?hq=}EvF~iPK@u766a58?6!-RmxZ;9!)Fs572n64G-b%Ejp;b?)R?YLY3M{Z+asNKz&nADUDB@DXddTN0E(T|8rwXUi{OVK+ zPPLpMza+b$XJGc8`%k&#o^fv-Tb51TzD#28R6eq3IF6RD$PVa}#&vu7EOAuiPuhh| zXLBjlcFa5rnRu;=?IeWf!4I){LUA#@)1UD4MM3e~Z1>$jv@v?oB@>P#!LTT+HRydNO8f>xa}^z*8mpI3H1!O$AX_S; z)h~bZ-@ED0e_qd{58ct1=s$0V83SL7 zz6}3)(aTN&U!ecI{L$$4OSSp^SJ4>g_uEIeq4>0sZP*e6AwI44cwZ46@O!+gwo?;Y zNn@LVJ&G7L`95vG{nvV4{oMB7U5tG3_~{$+G#Ed9A~Yo%KW&FFyx0DzHqI56CDR^1%CB0(#A*AD>;Ek|XePYRNU)Tu?Bdiz4)ZZTx zDNm_3u1jT~87Wgk;-KVHHqz7jWvQj4eSdS?n6kXFU*srmUL4d6upt=96^;DQkA_k| zuP)$3KwVu7gy=~_6vUPS(Z6-{^(1cW_XJzk`t7OC{n2dd;`W`t*xI*|0^Xzptvd%& z-hF*)(Wh6*(?Fko&NRG|dd~}lgCtR>QFIJt#K&a|;74WtSwy@&!A`XuD46`>c9dkG zPgdT#^4Qm>)Z{m8xCiX&1q$+VqrtpDA)+!rCRE^^;^6uPUMI=3pj<~(v)WeRx$<}< z9v_0f6dy=BSqe;6!*~AS)^LY#fnU=C;Uydat@aCiM=aDxJU#>?I~4dVAAqG$rQOA` z&iE{?_E}n^EImI|;I)Fvui<3HoB?JrlvcwZ$>X!|_=v0wB@dSZrNLIq(yxUI#B5`k zBQhUSbvn+12|EHK3%`akRP7jv$A{EQ4ew>XghJExyvx!_Qi9d6xfzaA1F(wNO6{6Y zMEQ7hL?ivFL&&Zqg0inuhC9u~G#`^w4c;#ZeZ z`34r6aVdT^SYPGgFc-i21%2s(h0zhO-bBO{ua@Fc40VdWIusX@?Ei}O{jr5{_WVV_ z1U3mxX!iV~En{r#3xwb z_}DEEfJvO6WAif@BjGGK@2R%EMU%}m;_Nix0bgt?F9PfMp=ee!r`oB?Hr?(S$VOkA zn^c?U{LPj1`J!BIxxbYsW(+}5P_TTF(2MGd)v}V4*ya60#mc}qRNW1<*ea+METvoQ z8^RjLSjvz%q3wDIQShKUkU^AFY%?5gGm1`;&8I-W)q+C54 z&dU4=PEitjVx*6;C$=qBoN30pBn=I}1{yX|wYlh3VLjFLK2_-Aw?9*zJ}&xguc~zq zE-cXd1@fo!7ejlZ^)q_>_2y=gx~b9SNIz@7K=kin^f&&RdcV;p-O86Xe{s`a0s)~o z*ii3_o4*+D7Vrg*zsBDe-F~UIIQzQOrjczJ%tS=CQ*Z3nHxA~h_ij^t$H(TUsU{Oz41G{$WGdiSd;*hE(Ff}?R^jB&69lrMQ z7;sf$z=iKr_LaOj6E^U0*uXkmGwL3CzDyEt?U|iN6> zEB5L=gw;JM`%>)H6>b4vpuL*^r|9;Jj~D%7qv$q_j~8WQAf(kbUQ`azvIr>0^`~vf zGWu_I-}3YuFM57nMElFftb*}vy^e2n2ou;FG1v(mn)eXa_S!$yCQ|@jpOtFUz)� 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°?KeqqkTozT!@B1hEym0#V#i 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

t9&so3tHN3rLLx3nbZkGae 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 z zQ34LqBj9ZFedb%W4`@K;k<@H$hiSXE!w>-NaEHk#5hjIV{yktc zFw_+KcA)x^!wjhT1{91aL4`w2tMf874zam34kknz_bmBW5yS2_7Fq*ej;(^%a0txY zuA$j0nKg-R4uxjlK*oq|9u{i)Nj6GO_>3Qz_{yCwlc`i!m-8lUt{lN1Ir1>}Mqu@h ziAK!CZcxnJ96F?Uo7!*a+ElIV5~y}eH_G2p`_*1UUMgh6EXG)90h41>>T6~2Mui!U zgP5{dN0BUs@P)p0u*9)eOCi%mw*ht{qra~1gf*L2iP;2&n-&VG!oO=gLgdsvK&NPl zS5qiAF{&1zqegX@BR}-M$sCO6(||nl(jJ&V97$vl=FmUtD7`l=&i#*)H(TnU)qp|gaq9Z=Vzz!&d9e&nDTb^ehNF|WWDBy9CWjT-F z&LXLNiMq(@9T&eiwI=Ee|1p;BWB*|AL(bI6FGI;BLQ7vq1(3IOWRlwbxR)^Cx4aZx zvkHv^>wHx*byRfidORE5aaC!{YwS?AR=+)Hda|tL=Ea~$;wubGjefo7Mf`7bJATjk zUD(U_p3u_y`O|=xWEWrMFqShpzs}Rypslch6Mo%*;&(qnjuyPWXu5d0`{p z!__?Z^23eW6JggFXH-4mBnK_FdFN2ma0)V%X(o+L_W@d;Ayy*;K%y8)+b+EJR4CA4i0 zeZ2dWCM$H_l+dJ#xc5zyhM#PcCg(qAXd+OIqSfUbc@$TrNiNEL*{r$Au~>XcgdB10 z6#;cqJ0oHsT+M|wjjJvbQX*Wk6d&8f`n%96zB07kX`P;+$?4{ z$f|64g8k1c^n{yc;@RyY$6;L_IdZ=6$+2QyIyrg|-7a#(xW~~GiQQ?m13VdOj1jx| z&D}zSxGRU)208fqoE5U!wkc4TMM4Iv4_ot%Dn#ta_maK$sy+Q|w$XX&^_Ix9sy?G~ zlH|RIcFf?tn{2k7&W8R_M4QGLO>u7pFFnEq_(t}pj^HK@XrVco#lR98BoGifK zAn+#}XRDVd*jJSovuejAr4qmv@+{ec?jz3SahxaFeq1*=OQK1rrxObd(-|qXoX2aJ zUIriw*tK}s(Ay3cwwvqRKWtadEr$=bjt@#6=QXk?WU+!lK+8w&4yQ6~Re^`B%5~hI zGf?hx2Zi;g;1MT$)Nj;>J-<9a>!{FTiO%F-Vn*9Q>jiv2H8zOwVQ1)u@@>-kb zBrd8n9;0q$*jz3$u}ytY5!kuhi0F3egRKKH=mXu$7a}DZ06Ty&epmTLj~jhpW<>E=5)5jR`_;3Us&lF=!Puc$9^cvXEZ z6HzegtAk|(&_tI%F`6P2I&}m z5Y#B2kI1`NfR6PQP)EFrr=}%86_nn)rOt)YdiX>gd@{Z;PsA5^F@gdGw)1OkN#cmS4h|4`E=p+~svmpTOTu*}@jOir_~6==gFxIT}^zAU4; zIrP|Lw#oJ5SN`|7UQ{WGCbPf}q2drNg_OHsoHnqz0~VSket?a+ts;01L^uH7LE9ki z!SR2M7}0;QG$8sFN(4EA2)WxLg1I?#`hMFa!jC)tdqgnki70g%@qtr=iA$y|{`xv8 zW9kZy#uG4t0%qbJaE%N|Kyc(bJ%JrRpx^{%yEL9pR>nsj`F%%;1I)xwvc()SERL0O zgd?xVDmmI@Dw3-_2T=1I`VD3Cj0W%W0JVl&{g@G4>EgKB(+2RWED^*OA9dIzvks~C zx7ZsZ*)K>xJ?LtsInw9{H|S}uIqlWcJUN}8FHeC0@)*#O$8avs;ar}>d6qtJj`&(C z;f&~kAIY?7%`n`A0fMJR7m5&D_+shi1ac7RedJq8=i)fiMXS7YkO z^g(F{cIm`-Jup2+u)`Ps23BHWWmg-R4T8!GzgVgBiwCR)UqjGGL|egwi@h6cuMXzh=7E z;DX6`Y+C$5Q!n;6G^eKKb`LFi3f*V4Gdy1*2>4zeSJQ_3U3zYgs=l>*FGBZ@TJCqR zz(OZVx=8?$V@XGOJGp!3ZZeug45`6FyVane-D>JJCV`1eb}M#g6s**?SQ`VE%v5Uc zYwKE`44M&OQz>m#Jgf9X@T}1j?6)XO_$>sr;ds~7p!D)u)`u%lTTD){JZ4C))f##$ zd0emBYf)|D<3LwGPEU*uS^va5HVA{krQ;FWtd|1Pm$5T9 zht_>>n|l6?$NqbI-k>LXex8WC@%GwGS@iq@mQ!3NxepE(mk2#6?@}VzI-DCz5OA3a zByFsFNQq)ST)Ln=ztF^Z?y`vt@Q?$Rm<^^zoE+Ib@3*`Ks2g|*;S#1-;7sa@t*WG@ zNvb#CveYo00-ypcy}yU|`2C%yW%l=OS}t&Rn&S8O73l9P(BC(+D*-es5M5d(a;M;f zuF*JI2xt|OH*pf-Ns*icoxSnG8#h-9vEx;8h}H1m1u5GM)gBo59aA@_eM$Xs8kZSx zJu||EB93F2shcH&fDO&QeX8bfXA$`J24*7VLIJPM+YZd;0es@?Bq{HoSW1Q7cR%lz z@cTJe%k1YNS}t(+yC}V%e}hW;?B^L;2{7p?3@zV8Eq~UKtG!{ zZ!@ppE(ZAjXYNhltE`Uq@gSg4z(jG0%GIk)ZBVdr0YgQNiuIyVW2H4JYFuigphXFa zEov}9i8mKxixoB2xMNEzDk@dfAP8wu3$D21Qav%E;0kW}KhMmZ_kHgY7TfRt^Sd9& zd*1DwIdf*7nKNg3JGMb|-+R@M1IF3T0QH4L^J}nY5_XK8s)xyP@WT`cK@;_Ne+!4a zj+ft*v++D^)=|!b4Q*_tmtJ`zy!4ky`n*WGlBE=g#Rqw?7yqD_PK{hDM;i3;7g-N7qIiW(7JWH}$)empwG~g$5VZ4A{FtVv#UH$x z%agi|v0EflxMb2?1vZ-lRL|rSjp~}umb6)Nam2;ZN%g*bA6h-zS^;WRffZ@^6L)80 zYeAx@cspuYx4HJ?b0MwdNv0xz$n20vVRFmecH?}7v%HatYeuTf(#37ayoV7hN|)D}Syrxm9QBJGKx zZYYhP|2x3u|0Za{P=n<-^2hXwNLscTvFq)T>q~t)6`MM6D9X2P7cR4M;>3=#lS236 z&JnDnj}z?3GG%9)z*Ow^SC2p&iW?#wev911c^4$*^YO*kLdiG;1xZNDb@kUu6m_P&wvM3tg1AE^vy!RR>bTz9N@{IZ z@GS>mR`Avj_LF%HE5I5WUnfUhO;CZ3U^8+Ufj->~<^*oE;#iUV@oO(n#WaXHvK(au z`U2ySFFztakw+@7yoUKH@*4V+@>;(;30%C5b9OICYMGRUaTT1CQpmHYelT&qeK3mQa zwUTqNg6DALrIM)Za-O5I?+=rKiVJqt6^V&dB!=mdTceFr?75_L#*+GtuKqiPI5^xk ziyvw)u0<<(h?BU`Bq!nWP;{k8jRkipc(OiCM9$s&`L=koFXACo4Af)>-}V|H`BDRT zXQtgjiI}!5C(s`>Xo(bf;s$KdsBb9@=v%qAXhd06!asemTGECW()kgJFhQ^g&IyQ} zZVP2O-JPH5MeM9--*UC_N^j=4RUrBr* zBaxI{?_njFD++6uBdmlRA+>UZ6!U0c1!v?2*a|d2Xg_p++o!jM-Qf3YN(&x}-90AB zDN42Y5@75mNpCWtH?}+~UEp58VuFG`i+b1Nau2uN&1<{dvb~D(+((~opXU~Tvu&Qc ze;1s__S`Pd&A9E0F1PRa_qyD(N4<^sa^>nScgIV3?%;!Q_mRr4yWHWYxh_}tR!5gR z;GuqbZo44`d2VlLjC=Zeoc`vO4}pJABA1nu`r~`ucl60~@4kjIo_z{`{#l1VpD*f1 zo=%Vry&-xSNBk8(lT4Nt9YdDJ8pC_L2lu|^U=8*K3GaRVOaI;qy?0-D@6F)eLcRA? zc<;&J-b}r>_XAidpAG`2KJfuyGO+Eb*famW8bpF#x&lod=~Y7<(y>RCenCl_TZP*{{5}}Cnl07#uHOss|AqFE3U%}iD3s!z;wJH z(L~d$@AQ*W%AEmlK~gSR?e$6=voZIVTUdS&(aA_F=I=fj%ga^#oE-?3YJ{qp?n z$0_Fc_=smN@Qv@YiMYSP*949etxceGpjHw~dsConkrU;i3n5F;lN93$o>5 z)}!h2uxCUbAQ9&wyhg^M!Dw)@Bw|@6zncnj%R@oK&0s+;nYi(s+%oZ-Ze^nAyxeby z6v+^Y%3UZ$L#2#$OHs3T$xnzXac2EyZ5hhbC?bZ)6XslI%Toe!G!F7~D2~5?Jhe|a zozeo~=>>UW|5m55R#3#KbPzU?xFUB~Em{R1rH|A4VyI;-OF9MLWohdHeZgx$tL2-)wms{*QEd+rtBRpHlR3{%!ySFcC&&0?>0= z{>p&$)ra5{qUXvTa!{XtNiOPl%R&8RbA@`WOf1W*jlqEZ?Niw1BO$>U50@H_ z>3r2|z8*8%V|3s3v`0GqgLBcJC^#&Kwx7`_oBNMHoI(H5TORe_(cjW%qv$`cChk}Pn%F8-yH-&!3xrp>c+`-lxP=33_ z8$A|8s+Xl7-)_Fn`W2)t*qvdSA_{azo-H#VkzwX7e_C*6xRUgG40~Fd_&CNUvu%i7c`E zPj6OSI8;3||JOGQ^>^d)fAV{}2J6dz(htu6jA;JV-O)e5=a2T10dj^NOkW{q^chio z$i-+*qXqLEKbpr=v=?1|az7#xnf#fzX($it$p6!V!V$%ZPYbr9H#lP*C1mD5+UJk< z6|$9np<3t{s)c^EFB>0^RWTKJ{5T{}OL%G=%FO@U-eLQa1spl$8}gd?6`bxSzL}U@ zTuNXgvdhk=Nau4RxrlZbqqSl146AC6qI4 zNkQrjxBV=?tddL&q*O$3Mv8%*M@ii}KAhO7pU1gOTUQf%h`|K);t9&LC zj7Gr@@X)V&#d!&Ns^=mNY0V%!jaI*;gP*PG;NUp97XC8%_j*s0k4o02h73s1OE2Lo zY?X0|fx@10o|H?gMgb6k$w?!43o@xC<$HwN~Tlrz;{$0W@{8QLB=X0<0%>s zo41Ma2dIvQ;v3);)s6K~c|lcCUkV#h-xUtZyBIj?Y zZGR)t*qK=Njg<%4d7gLczbPr0_6c9n^Tt=?>G_>ltGWcqo(Wt5~t>hybV=h!X*qa1x?Y zBWKJ0V;ACXt*p13ZaI-T-I0UqrdMEy<{o#C$m<~?;H|jp{4PDGr;XzANphfyjVdh* zBk<&B2~MYU$SAD}yI7;lbG?%=r7ATis1f^TiT0JedykjMFq$6PtQz=CY(jd-x zw;~WF<51>?w(a&cDV=qe=hTq_hm{*0MJ)YX{K@iPMt}Q`j<>*4jDl4WBSU!MHi(-Q zO#4tofa;8{?u5OWeIn7Q>QHI)h$cw@i8-KFMQ+7O0!ona7jhuixl0m#K5P}E4#E-W2TtNP$4D}e;|sJ zAlh_Gf|{0z2?VI!9OugSZtF98j`K%_7KoLUZF6K_Gh z^ewzjfq^^4s5T%(NTP;+LC9v;BeVR9^_OoB%VkiFZd~*wU?AhZ_8TY7vv` zN2Ue={?EfWQs*T0&r79eUfQE`jl1h~ndo(k9JFEVZ)SOetUSmPMG~zPlss(l_(M_X z+C;K{0%?5b6X{`##_xg<PP*VOKrum_|fq`LouT zd_Wo4eFSG98-@*KOhE&QtEt#=pA1ElLlUrlbSo|wr!1smzc@8AQ3#>})OQbk_LfW< zi2LZfO&T~=#Uv5-P+7vd+M}=1CylH8p+bO33_usuPoWs520V%WDtPhi_zQ6IDNg#F zU9eaC#Y6GT_!I1Ye_VQQLiz6w+PiIdUhS@YdXPP>x3>LVf8LrPZ7H#q(!9@4g@+YisXSR9E3JJOjsH0aSWR--j+C&~u=V421J{<} z>fw3lfTLPZj^7-&aAm7L3*1p!+z34!sE46iIGB;yzE6L-!R@=cGicu{3&Qq2cXW39 zzO*`b`(DNgTlE+y3S@qL?K{ZRC!B%k0d%QiFbdC5%c_qa(^go~{t>DWPzCfaA+Vh0uOs9I8y<`h zAG#Mt@N=2c2g>DPJN91#HshQhB4_oV@Pg-@eWQhVSjdbH+ zULtvTKCGu$_IxVf0DvnkyGHCUCHxnPDKDfcf9=F5JY?z1>#H<>d{&Bsq8vK2{Xw9$ zl0D4zfDYOx{NDmLX#V(&5-y3BkV*d}&A>4w36huxN#~O(g5>L%(;lK@wtX4v=>tsV9PbA( zMaC-+e3ye@gAmg9I0p}+?513!`&$po9xr?LCK)e-BcQWA(nt4Mk#coF?sO1TkBJG? zs1(y#I+tbBKkF0IpADn`(sy#uKk>#~^zYLzoBl10etO~@>f4qxh`qp|Ez6bCo}C|b zXOF)9c%$fj=ItExw%?G8-Y0X651)FY^4rt<%QOM!@V*#DI4}E&^8zJ;rQ4PMi}#GN zKiE_nYc_%Roj!I`u=Nsb?`3kpzC?F-SKq!HSKl{Qb%My(TNafwN*jfp7zFH6UdYB{!aKHvlGxfjk z%8hF8H{Qxs|Lb$r{}%`3sQ-*~{o3B^s_uvV#AgEkqD%kL7R#h}^hX;-@8DeYCZ^<~ zcatI6^ge!lI=zF_=mp?HrEC!Ev-ff#!oM@=Z|U49`pk<@Vrl=RewdWGMe3XiK{ zPYtu(w5O&ze>3)1g3kX*57+2nsvMy6*Jj(J0UaCFo-1F=RsSn;wdWc8=cxbmbp6TD z_j^~bSKr6FjiUF!T=bT`nTy`7_s*vG**~V!J7oRxck>+$`+6>V@9&jO z?=b;?JMzaKU@la9R**Wvs+}`f-|w<(@tc#7~2;xu=Nix z*7x)^rhs4^C*^^`k;i1pcx3Y_X238-;}@JPP|9#NMB&+PgA8xPG{^wy8H>O-!z#Ig z3>NtH{&k_dlkag5#XXAe$bs#1^zb)5+$9GzLSg2BX=Zy2dT*oj?Yoz9w8xrPa<#{W z`((Grv}@AwBLnX~`FI_8hn~|?Ta0+|yC9nDOJ#CBmJBR4IN|bv<&pG?NZR>yD)zwx z?0z#0WcvUBnjjA?wjz>IoKf$;g&_-Fj1X+x1ZTU5?F+Y?V-{#!X*WO{B1AN@rI@l} zpDo1~zzU|!LYZ9dz%j4A+uZd~qY4a#@sv9|$P$8Ntn79!+OS0g$=Kd@Dq*eeDwm4g zwv#TNMF;NT+r!m?dma&l6T$@xMedF_-trwXEN)`?5GD|gtu%Ntc_CRTLvmHDO${qo zEgNM{`>~8x>W~{EX-f*~`|`?|*W!sD7};|it|(|&jrS`!&pkN~6Ut%>XDf?Y-8SCR zv4uIt;##nH^?M)*^Uttx@>ud!)=iD-r8D2lIQi#iByt>yWCQbLB2U=DZ0Qv^^2c=0 zy1phs(`qxf^EqwiS-RvR`AaChO{@deY+7km=pgul-6Z6V=~^1rXRMHO+ko3j!AkLb zXqX#{eVVuvvut>U=fYp6zRg<^*b5Bf)bK%$=ZupCDu}2g2-bC|t+?nqf8?a$!W*@h zV=uz94mmdOxO4N}>)0mi#1j)!+9sSz2*XqRVSr%BkVW_mvkz#}IYicISevp^t*&7_ zABCghC9HU<8UaYRw0$`RU|h3ng0BRiNi1k~lYP=pY@dLt`}8OSn#}q>{nkd-_nX~v z*0;7?>-!Nnouj@#Hs>;*fsO9!D|=wCr@k%RBvR{ptxx(oZb*G!e{&=2+b4H@8xGd` zew)Zy-))y~K>L<+ugvw-cNRabtM$FrCpWCVsfOZGG`d0ZdvBoL?*Ni3i49Q5aX9kF z^hBRd#m4?UgkG+rHJxm+&)X4tUs*w@5~!VC+{!E<*m2_JOgWLcYuJ?+CjsV8`INU( zhIpB)@a?jAOi%Jb-H|!5_(>8*WzQE|{ge7E9C3XHT zVGtbn0f=V*5-BvsXqrBmUj!GD(197jYf&2foq~oIX^eTYE*NI76=QJZgEF#3mkZ;( zM#^rn4{$cwhgPTCj;68s+XM#grIygZ9a$bRaHWz3Xmbl*qSOd&Ew&A~88}K`vs(a{ z$a9axXvG7p?ZA8=clpk2k*s_3ITt9^Z}kDHlII+5Dp@e)2Hrsvf-Cd|uzury+jqt1 zk{km_mVu>Fv}7`yhBKGIs3LdyVwH56?ph+BF=#j#SpH)Kb0 zd=>fw)$nnFSp;}_a<;C(#A`_ErCyceYg$;}i9{7C)`p9a5F$=T4D9*OJL)>v6< zCxx!)a{`R`fb3nt0gLNwxNZUFPb>(2bvg0?z#NQ0!7%?81rn5}MYJfO08a^>6l>A_ zRIIu%0GJ6gLV)QwAObKffg~5XGoFh83~NidDWNE^x?nRo0T22^z`$L952ZpF5W;{* zc@auKD~_}LH+kIWFRJ`|LUm-DOVl=w0#MuIFvQ2&j$^SXo|kz((auZkyw1)`?c8&t zOs>z#uz9m=yA#K$su65>^e!{lzy{Gn^lJqhRC65-pYzL!FgjirEq|3FBLIEE z(Q1Yu9=-#OeFXWI=R9<7jh(kjZszZ$Vt@aOZ|ifdty9v0r6ZWKTm(#pAdtuW(&|vV zhgyL(o2V5a$ncj2sfIHK;hoQTEbjqq2JrWS8Nl?aHddpYz!j}fD%P)i0^O~!Or2NZ za|JihEcEQ)WTJHZXJ6O+{m+*f{tM~=^QT6L%}F?FtB4e|*lvJ0H>SV(Tp9Pi7EiR_ zgniWK`r?4V=X#EJppWuG@)QY#*7oH50R%Eru|5+_iUa%rEET$K?o=5qqV~qAnCUcpMKw>q}wgeRd+P;hdHDvq3Olw(j=FpbBt=`HG7^G!e$_pzo8?m6_CGiW* z(-k=1R;Whc(a%n>9OUL|J`SlBsRAJ6N#0?vq>e&>`zpvDFl?_(_&m!+NH}-E5>-A? zEeT{PVxNkwZ1rd^Q$5LEX&B80 zMIXW0k=~-(H_?KAlaI4m5D(YqG8+cwrm3xr#^fbcaUp8b7m&MlVOAhzaz2 zC^rxzs21fW9YvED#!(?f(L!lQL!lx$F%*i+Ng9fND(#RHMG;hQV4mG>u z4@S9@7n0En;A1`rTyh0N&Bx@FX&_9#0?m8yKbzfd(HDA&ciZtbAjkvUbK;jq{LvA` zvki=X^9;a<@n8`~fYAyxG=D@+N*{krQ#ko!#Z+JeFd70KbZ>5{V3cvMAN4cU&ka^E zs@XpPqyI?7O#`#R=%Cqg6^3*$x~erN7)7Pp6KG&m2ciK+M`E-OV06SC8DPZQsyR&< zQDyCTMTSud8hQ(jdPzr(1iN%p17fYC8Y0$}6l?em(sfzxode9Zh}GU}HBrzMnHJ;} zffhALljh=EwTdOov6PBZ=6!-%%8a}rgC&rr^$PJry)?HpwM&PAlvS`1vikvs$U~rzC+wS2hQRAWHhO}8irnjStR02d;HY2+ZD_;ek}sAJ9S5l#Sy(qu`BBiYrBFYo zxQ^V3biY(?vFD>)w-yI7R^l9N#Hh7TR7(Puy%h-v-q0D|Z4pTTiSDqQ2nmw{w}r7t ztOx>{j3vHEjLp6?j-DZviVlV32L@9Ssr+qn^iiV@IumnwY1oJKRxo#Lo_Q$4A%$~P zHnjtc1)APlDWZ!ADFiw($Op-U*veQ8!=kD{AvfBkNbG=V$E9)%xw4$+sn}uHTa{Dc zuw=fww2jTdCPFDiY%FN_bn^`)`qreD9fF!m_?q3LFkZm6H7I2PeEkCi+wO{9G(5XI zf^C-zw&9g%e_%xMa?_U&o-%zAwxVeAkU#26o1~Bi+eNpj(JI$tDA!wTu5z7m?=Y3? zNxQ3DfBsW8w|4Ag{HI__e?E~s7o(Kl>hmzdPOUNVNJ@A<30cvdHZ@dPH zR-J5i{fCI0QlcoQ`?7m$lGy;NUH?Hc?_u7aJor1CiZn0ZFY>Crb6-T7`RP(*E58W- zqi;iY9B@eC#hbZp7C@vqp2baLDaNfh^2ancdX+Rpnw!W*pn9vm5b6ClwLWe7y$-B$ zfg5?xk5r_09UMUQeBMEymOIcAs+;8qc1i{<#oXbRAG&PPZzMwq&=Tll$!%F2Tn@;> zS1v_J{m6a8nUXCKdL%?}6d`?%4YqvByvq4BcR-YE&>u?;xpZ5dw1MY!92Jr)N{!di zIAJU(?%uJ_`j!xdAwcuA>xT#w#od8F1r1xXgp`FjvPb1=cw2hF@8I#o;zc;e;VC&l z5*+V?=2ddU$8O{ZJqOU|yKBY82(S=sq0iG{m~QnHb73{5>bO~7L+nzqA8*Pnq8Q@~ z=D`Q=GgyNYEtE2e6D=8|OYXH}*|tG94JAz!s$g4$jfm~ZIm{c*o83_`$m|Edvdk^s&p7dU%0hapO+s(Z*rMEJE|A+hxDdh2j3wh)n?aW17jn>yW% ziD-65ay_5{0I^;92i;Q&e?Q&ZS=0K^-lq|&{+wFRw@Obn3$S3$#UnC>FDWvLb9D4J;neRaQiI9;;+2 zas#zenWrYPO39OCWXQZ0(o1zh0ZMSeLyR#)YD$S|Wt8bQK4ZAW0t=>mkH2h;FL?(+ z=OVxe@az1S6u-3e7P(CPQUWmKCun2C5Wuq%J13)vMx{JY#SU%^Jul|0p4TvT=~Apk z3R15Y@Vi9)qWnbtVr(wJ*$#Q1CGPw-!!@|=f%GXy?roXb9a=)0Az%)`a@Mb55kh+u z##Sla+r<6hv;`{BU0aJhA1xB);}I=7k{e+}CGUf8Wyl|V8~P&n2B_t!Iu;WATKpvI z1jj-S;7=a!gDkaj05LhIm;$z3nYgBe2ehY{e|?^q+hmSK1(Bpdts7*!&>jCNxf&bv zfvGd7NJwkY*{lrYRUDYPme@339?alMX54i*Q!t$!5*y--IbQI z54t*Tqx0Ld<8y;_FI7Tc7Be@%TYFr%sTRu5q4G@iF6wk8A{E>5{ahTGBORA4j;xy- zpR5vYxK%%t8^;UN`-!Homhqu8wDDTI{~pZ*yR?zg*Ge0n!t?9p*Q_ASAf+P7FG zjk9Zc=-IIr)1h$Sm%Q;_@2}+EpD=}?*_~Dr%C+y3^uZmUe)qGm;{g`(7xq6iUfA-G z#S2Sw1Vj)bso_hBqzvvsa*#-ryx)d$Kb$R)(UD#Bki(HK2nZh@Cs z{s1jsWEC2C8N`W36UmDRnI1Uhbt8wW7uH{z9u61A^_F&_E01u6vp28vI114L~g43I$J zBetxtV>^!YZ~QQn_|!HQ#f_ZI^-tX-Xdz2AITh~#K|a_H`qbjw$N~j(hf}dLN0}i6 zWT92f7ev#J1sHAjAn}HtG@Sias7eJKk2P|HaYFrd!+QaMl#hOW;`+S+HV~~rGQTr1 zQ;z?v0PV9S*;diG0K4;mMLK2R&C}wjD-q1cvqljYeK3pajdy3@U2$B(iDSJRp()^; zH;|Fx0epEzp11c>u~&v$)R~Jbd^yh~&RHoQj^ENSWs!WyXrcQR*Q>Li!<^WkmZPUc zSwb?&5>hBEL2Fi$Ci8_Oy|Q1MPm)uL@Zlun!rl7s!()JipYzbO<8g^H@XHsBv{%DA zO@EfMIlLIjMkbS!ps4U)YAX`_Lhx{~QD$74dJC|dev2B4e#hCa(%>bD)PCryjHNz* z;=0&&RO!aeI@wtEOVghOt+B>8_PgKorwp!>>Q5c2;ih3Ijrv2c&^>P_D>l%{qaKENV(%X8o|fB|zA%--WZTTOigcRBAPxTBYB>Ln>Vi+hu%0*qh< zpi!8k(KgQF98$j~&LrgUzXs zloCXWJ?G>Iqa;FR@&+pvZUOxz)ulPy7Nac3rBZXrI)%BErgg|0Yv0TB;<1s_%& zh!%1(3SoEhh^e3@6?^)WpF>mW+@!hcT4nRjwchZhSdUU+0s=?wkUim?UO?l~OJ_fv zP7k$b$D_QoX~%!i5@-S7O`iKxN$wUH+Md}012?7xe*0?oEzt9>AJ75^{YP5h`Uk>% z#VSaLS{eV>J9Fl{e#XCpMK@H= z8@)URaLF#>?RVtlgCI<|68`49!rzCNhy2adoTGB*yMF#&fxIL9ec;&MN zkHV$9s9l)}E&R6z#@b+508#fYMAJcu%O!%NqmVby=G6C6bySEYMnE?ejftv5-q8%p zdD*dKiP)YX=4xMwK&E;xP0)*A*9w17Gy+Zh17l`hdn5Z0652jh_V=_Q6If|QX$i-S zg#!vGj*D@ZKouu80{h^>*!Wzv29XeuEND1O@ME4i*|7H{4w&4ABPv|X3PaF%sx%Mc z3t6%%1{9b)o6iAK=kl0}o$^vBSu^AoW%a9D$qniJFt`hr=<7t|?CQI+xB2*JdTV$B ziE0f*E&XfGYy#2Dk=4o-cqJ8k|16?xW;{fR5VzS6H5=keZP#tS3s<1V9JF}`^2%A(yUOiMUR!i3JF-8O3==tdo2iV*zGqq%&pTeo z#q;{soXjFebMbuPTf(RVYpAt9gi)XE_X8MJ#7KB5w)k-GPKzPL5S?of^TFm|_>Fw* zPK`sh-$qC_TX-_lJvxTr0A7Z_uz#cRlhJodyrKRh_{FhX)(%E<4k&hKFC_C|^f_{f z(e1I6MeS>0eENCiw=0i6ga&$8xrZ&nxwyJm$r$^F*Bk8r@h0i~Qbf_#yW$MeI+e}~L?4gwMStiPSqTDAE zl1Pqa$mW-M7GDIgz*M0*1J4|NWk?hwkZNT|Fr0#Y^Z7P^ndQ&A)ykK6XC)tD`Bgqq z?GrVUP(cLCkw^%e89*xoNg$%z#r$I#8qE>>M3$NK4Dj?+<8!SA6Q)8RSz4^GB+;x$ z=Ucka?M%%?<)KL;Dl$W-uOKo2h9U$y0U~0PWLAtAB-^MR;)u=?h~NVyJb~KC2~52o z?4c&(MC1pLmAf7Jj8@+Uw7CxmF3K;nJ{7ITU*sZ&S9vEi<-0cz`dUy#Bo-8yd;|Mp z^-u3Fb$5F_K{1xTzxh(zLOtPHJn*RcQt?D1s;m(7F^FI`<<>UVN`>z8<$*GQ0)6;F zJ`A-K#|AAV+!Z&0F4rcnWWG`Rdp-@W87GCi0AD`+LRS8@BlxsH2*A|xhHUcbyX0v$ z+2Zo@yno$zKqBc~v>J$&t+1%aXD7UtKHxR*l89y=97%7=bdQerporQM`ZsKkR6}tM zo-vnp&Y#gPj9*J=VR3^DEAbWD#d0uM(il&gj8Qk8s$Ju!YGW#K8=pXIXp2knB`b+2 z_bPU?k5Z1IHBFSXLBly(Xe!8)IF%UvoUj{N2~lX#K`rHLiw1 zHPnNA>M)vH=Fs`(g3IjYmVPKb75TbhKdK^j^>6EV15Lq`YDzCdP=11gP}OuU8zZeK zA9=2Y-lm3ZeUXlLf}1iG%3ZtPhj;-K8OVA>R+{BVAwrC9(qQ>i4<-TPQ(R9LT=54m zkDm-0_%Hb)+2$Pf;MYc$BX%bfOD!M7x#lt-IG>Uqj%|{!S@0_Q@@sGf3Rg8(eR-a$ zU-@H}lI6>{^FElmRE`$XOU17JSLj!2nY2=S%3S#XzrhfF9lQrEGb9U9{)XaKIf2{n z&VCV+hVkVVpQC9l_9MBDGMJTJ;L~@TWq-|bz**!v>`GerL`f19wY^{<#{gZwii4j0 z83WTCR+t}1HUf|x+tVKQ?05m<;NIvd(*^T7es6{`)KB#v2iz3c!&GdSUS(h;{KwrN zVXe$1K)JMn@YB#g%G+C?=oLJX8r(ja{KpeuRie?m4+2L5Sw#XzZrSt9l$AmeOdw-y zf;*<10cS{Hzg1rxgFRjf-OPdSaLx8lL<=UpD5FM?uw_GH=j z;Wq^Bi}plWRq#&$g)!Lm8I@Oq8FYzLu~DBMBWVoKfbGDlM51v}u{&>!?$?{o=jb)Q zzP$-R&$*t(slg}I1p*LZPiep&v^d$bbeR_bt)SRJyg=2DHumD6Hc@{ig|2I8PtKZQ z_M}cAA+iP^_M{cp_@if4?GrVUAOP|WG>~KLi*hKHOE6VaVxLqy81? z*;dGvqd@wYGR8TUvlwuS;34>9)4?P-ZnK~T9&mpupG7M`?%B#PL!#$EQ`(d^+%0I3 zx!iz24)Op3k9$BNkf#cPoHL4<9SFn_3FUx{G+;j~J=C0vO?%1!%h!SJkih3x84VtX zoZNtG*(T9RrJ5Dt(3>`?OOu9y7~gRxEagk{l#?Q%sPO^ zZnIzWZ@y?T95fWu9uf21)!k(aj;@pHTbXSt_UbW*=0IGnwIObtwE?RHam5S3N!%?h z&YTLnimd=X&5##t@BuAN0c>{VT#7h(Ate-}lpU`_+`P_mN;fciUrJ!(HeeY{j+=c0 z2^2kx8U$B1mWG%%29J$X2?Ewm)UX+33Gm}(NoOOsfv$oE5p>8B{TIm6=J%;A@l<80 znkjEipMsl$%6M5aHwYpw3`oTeU9b*W+5$PbrPJ7M8!1bDp5;rvU!aXGib7F!H_ynK z<@#l4&NJj?Z1B)rfwK*1?003Ks$j$(jlAy0KE8LPu@#~_KGaseL0TDBBY9#K_g0{L z0T__xtftkh>7D^k*LH$EaGuyy!dp<1CnxNNLDur+WCQ`FK?8X(W&nB#b$GG(4lO&& zAm(Mh5JJqyf6s)Nd-;H2iy=+-VzK9Z6APJ=VbF3qa&YsTa<<*NmGs*s>k@});=E-^ z*!socPRo{xAuy2!Df@SqEqJ<4NI8btreas^`$MJd()h+f%1YR#08&iK{-{!Rq(~V@ zf(5SyF3i?c6U^XNSl_(F-L(a!$xD@l+GR$H%^0yMo6UkEgfEJVp~!++nJ7}F;v(=7 zPB~N^%R-TFAI~8!f*ya6MK)P&yY2>f=ASAqB-OX8`tU@L)28Q?!1asEMa&lKKmU*` zn!F+Cai{F8wc+ToZIA4BHT1aEw=0@Y8WP~)gDmdm7#q@j8gWo=V{0VMLCNt-H%^Ou zh!&koI-ZqkSR{g^P9r4*P&1QUHg}~}grk=8uW@G$?<5C5do(=CVXk1xC{h7DQp^PO z(ZJz>zwrU_ZIgrVv2>C9>hm`Nay}P*i=B3Ma0?m);8L+OS}n+q>auY0DOq=+3Ibl} z3d{f%g)d7eGyqo;o+4w(Z+y_j|$moRllynyAqExXG$u7;x9Y=4YwDU>#AV!OR)Fve1j zq7$4wvWVXqC$kl|TWsnGJU!QE3k=?`{1)!xW*riPGb`|Sm8w%HRiSa;>h8=od~{>l z@R)zBqYZz}HhjGyC!+vhGMjPHL+MFdG>u+uSffV@8$)I^-J2|`0=Sxw6m+z8h2>k41 z&a4B0@3zCdxQ#FRIRFY;b7@kf4|QU9*_yz2o9#Gen~DuA|DghZ@TS13?--8UtfK(d z%M0?uD#&N+;cwUl9qXUhpfHmKknVqBye~38<~LU&_!FHUL*V3(Hk7z2X+-eFEy4ch z1LNQY_=0#)zT9J|(yhXWu-KH)mI}JZG74>*Fu?$|;z=r|z(1s0d>Nl9xSfZB*k5kL zb2==bJeT1KKg(gMh88(2@EdtPnDEZc05TVmPL(2OS!i5F@E9DBDbG-HH?5Hk%?JTn z7X5#QC_q6SUjv0R^*>E!cceE zNy;qrEW`eS-}G*&*J~4rh9(N>q&r3b3w1Dl?8(!VIOK6 zdW54CnZyCCWh;pAwAefv>0`CnBwE_)w@zh7A-kF^PNzZ&X7_sj#%Z8Y7iCmxBmvKg*yhd}-+Z|jy0-;&FRx=7G%=!2a5r(m#^<)Fw|MFb ziY3&jh+ZCkqEeQ2-(Svf@StKS4Xl9(i^d!wO%f)8+DLc_VpA?}qi(wBKv9WnGc@+J zT_IAblS>$J-3-eYY?F)C1-P8+CHsExX!=YXeSweD4uyiBx;KUvd0K?Lak}PawE#Q~ zl%CQEnq(=An^+7{PR-I)hK$`}FqC(wXyMm}-Bv%r*a@sy5qcrD_?&XA^-vl=c&U6g z8N0zw<2c3sU!OsU(4r`HL1yM$N0E{FoZT}r-#0z;L1~$P`Du5V%gi2j{dTAf?py5e*W20H~~2}=nJ~bg}hn1UNIFr zC$f316QQAyStP3t&$_QJAwWb!6J?SGWE$BCUU@z!Xn_xIAB-PSd=8q5$5OE$4L%Yq z7f&tf@@qz575S!w8M6{n1esOz{rj}Trw@c3){&EOerSARjv)?wA7k-PQDKa5ocd=H zUO}DlQ#Eud!p&p}xD7~QWswqOE_B0XSjX1ZRVI@C7QB45Y^>H%dtf5T*Z@>K&ls35 zM_FJ8{4pV~VT3_-;$W^{40Iya+S7XQsn{0>?;#Qbxs9EU5=cg&+hwAXThuw-y9y^n z+=g297k-3;7mZ85j*14VQO=wagaZfS00#vaAf(LjRFUT&Ol3KQ+7Ma7Q86oY2(yIa zOyuNVz4!+R$F>jiB@jt@lM$3cQkCHl-jd~O3Y8Iuup8NX=pkgEid}Q55uYMY*wSuL zZfffn#3?ZA5a%+>;4H<^Ly>R_8&|L0n5|8g8? zo@>Z4=-&#F<)+{(0*>ePYkL<=naot94X<#%;U(Ft@o)NLxKO6{cuLAdX$hExpl|MW zZ~8t804P*dV7f_tlX(CLf3}z+CCFxGUcdyH5oT*T`zC zoE49CL*<>vaY%}$2Fl(n4M0~2j8PvHUSk5D+b|ki?$%l&{Uyc z%+Lt2-t%PH7PR-5e^Tw8$tMKbC9O$xggLmE^1rOZ`53ucGvri4T8_+6H!~P|^&xj?I@VnWaKxwyHhKlv2 zD%PD;EUHWLl#Fqzrs6swk zb2FM3xvh{~^?8DfdMh8vReaGw6ySRZ&hv8R{5YkqP12V^#NY`sotk5+JG?l7PvW@K zCj}aoWp?ES0v@=j8J#SfTcB4bW(;>|C~HUafjZ`{b`p_xJ1KNq$qGp?SejQikA5j( z7h0z-%!$IWqv(r({hc>qQ3xl%BDB6)!IZgDfVP>FG};XOyZ`)b{=GS^d;Zm4$PpgT zyV~kRas&A`@b??VH;f!~ET8~w+Sx)05t{4Qi!7(Z&|{chLMLJ-#2PU4?6v$MNSBIPvHEs zYWMX6T#c7@=NEDZ)9W^Up402{-IcFf0Ad3A`Fs?vMlGhu>Bo#qI~{L!W8Vd# z^$YW{Osey(W_L<(sxsVprwMcC6{ILSe@*G1b%D{3Oxe-%)D|=(@w8Ix<|xJC-P#&Y z@#yE2;uo;kLca@lXnIDq1NkU=ZsL7e=MK&QYUNJ*%Ug)F-ov$h^$UxFnS{?ayX!Kq zUE`JV92h34iT=rKkJraZeI|cYNAls-&$Ne`p6$~ZGOY%TUe!cZ<`{*za_`71wpWp@ zmgeGl^i{#`(d@FIEmLN5)BDcu`Fl_c+!KE@6?Kd$oC4gd;8alQ5lftw?%Y(# zDt5@M?9qN9f&u|{f-vc)+uYx{Tk##+De7;r^0a}hIK;UQ2fqm-lKh4ION}U=Yr(hc ze+woup52Zo$hZ}J6hEe&CMCTpl3wG}so34ugc!G!uYpi>>ciQ>g|7BOuuFOr=m0=E zDkytgPzi6VgaIyyh#v^BseULsXL*wsl1vF(YGG)kNLl%A>fw?3YUOlB(K8rAS z-bk51x5u3*RgZ$PJ`b|NfpLK}Oq33i``z6Xtk?t756OX*`lbkk?c%C3;U_E74Zr8x zG_mNeIf2%zgl-$AFt%b=;7;@f8)d$jM0rQSZ$yKEf2PiYPX*H!%jdq3hRb_F zLj#1u%Y3o{wm;A_`T#f)6@oCQ>%iPwgEn|(VAuwSJd@o9kDa;EZGfFk`)K&w>p+&| zbF+f=bN*q9e5SlV{TtyocfktAz>rArSzf7>1QZoZ9$lP}nRT}Drmy>`;6Jc4cnx2%76n^j&do@|oSU7l<0FL301I)Fjd$g=igZrkrU1@mS3&Na0p^3{ zezDvv6WZzOtiVPQ6a%NP9&1x!!q4?yb7p(Y`nA=+JjcilBY0UHFLXwCwvDKaGE!rbEsG6MzU-chWf2^c&FN}0?~y@#2= zQ{cyHetEf~re@4Oh&SiR8DhZZ#TDuWWugWi#P3=H^t`4xM9-e>5%d&M!uNPjC3*(J z(oMxS^rJP_sVZ~?I~%<~-qORMVnIYjU^nWcHJS1`_Kc|hOhicn7C>;3`-wcme)OWiSj4>A(UUEwQ1vjtTs{esKY?{X+WD-}B$wx%+ffg8jWU zc#3isXNShpB|eS)*~_e7hr;rC-<`LO+B-;&xbo9AtPgKgB1RAejTY&uQJt04&Ws^m zrR*ZL$;nd1IL=CHKyfB~+=lZxo`zf717Cb|dEgU7!5{(92dKixI-Fz~4)Y>j0mKB) zWNSbUnrn~KdVy6YaANPM80H?2D`>cqv?1`f97o9hiIeE1`Ei#y))(;W&}M1xDHXf= zhCtqL*)^2+{!az+9`=KaT+_)BhkW)mXSl*gq;Fs+M`9 z-%*8lZ@sYOiPh?<YWuD@Wu_q%y4*Bln>y_T;v_IGjpz2|bLf9< zlUd=f3z>n{CYnoyaI*JSkLk<_XVcEm^mv`F8~&hGCCWv2E*0Cf z)b?We8^^3rSU#UY#=U&4ZY9e=tw{q?3DRBYmRPZP*jP~eTUK9~U!!$9A$*3yp6q@8 zJR_}k8)k}kWdex02-TRs6no)HT}qAQKObN-iGat3;6*KW{I8VKqRz*B$aAWX86M97 z2HN-0Ade}vLxVilKI-%Msn4V1Eyjm6gxWDPlKxdBO$o+~0Dgmx0;IoCo`J7xES`46 zXv5d3c!-KcdmZoxJ|kMrU2zM;G+Fm#mS(Eo=kqkqI(AVoHSJ)wcjhe1RO~PNcp&hh zmocy!GU6C+-w=jPirnUhsi4Hwfqh$O?5|xC#tZOnB?+4$MAN9_q}5Kw@kAg9EdneJ zA*UJ~-?>{_QqswyLyS}vo3O~W?npu+9Pm;FNVjk&q$n&7j%8RJbSEScG8K|o>Q0Dp z62u`-Bm2n<*#>lpiy#!uZcy~1HFzr0$lQ7uF9g4w?faXPHlTfPyLnyhyUnB8zD-z) zU{epfY2Sa9Ze;roJmmkZeGlrEmQ;@RZ7cdeYTt`@V*8%{uN>`L5xuxk?W^{vsmkmT zq+WV+0j}>$rG4fmHfs8fEvc8Oeuw@;Tl5iZXJswg0WqQ@3h&z#5c_xS<(reaBqO>C ztq^ZT=CdIx=9Z2i|FAWoy0GG$Yj+dh_>e%~x%t%Aa>mck56P0?DXv3#Y+jvcP93R% z;>FzuJCiQEm!R(WdzDb)6LV9D76vvD@?DI>IPY-J$NGge3$Qed-OXmVG`M1ne?OvF z^Hs4zeKPxhg7LeYCb}9ViixgaVi6qz`ICK*>Px2)IWkf@%wRp^-IH>6|4;W^;J0X$21*A{+Ol%CuuaP z~v19=0D2p5PQUt|xZ8w){#C{)uo_F5mTS-@8Dv63}bO9;Y5N&~bm zG^mA)y-XEmvx@;vh&Sy1U`!}szNK`kAU}S=LY+MC-;?k1BInH23ZT$}Nv3(H+H%hj zP|)+zveVfc@N7V_8@Wp+%cgLHO=?gzJ027!p49M!(!`T-JfS!>yR}>`hp}2>5yZV#UIlYJ^q*u5UGMdN$=ALH2JOrv5@bt&lCCnsw6|cd0Vk{_)gkb@`8TczPHe57%lQGT}7RV zU9Ntc$#5kJsiM6}Q1yPGQdI3?LPobV2qcoEDpH%-$=iq%<%#ixVM4oa%jEV}o$i9i?LQZ3CJd z)Tr`L55AD8ma9p=l-cYqgQbG}a=IFUjGJAu&@wL%NS8}m+=LzQU1SX#1JZ5EHd+aa zgvX?PB-+%XQxicYNVP9~&Lkgf6?QAqwTEt41)7ZT=|=D~^Fo3tWGZY8UfAC3ktJ+^ zCJ{Ejs)zGr;85jDgTo}bllDQDDr~YX9mg16`jbU=yj^xLe8(l=Y#}s8HH$8j8aG(Y ztkdt->ruCCBvQ3d#M)@SnM65_lBmr+V`81#9e5YBY#{$!- zSXL7W+;Rm9E>5{2X(IGND@8=HC%%ZqX08qB%wDG*^a= zc6ghNVvQieRgqw}RJf@C=&l|Hgu7gC%Li8UOE?2XhbSYcN^RJcIqajHU73mjIb1!z zs}ST{>I(Vh5#&^}Gt-U}Sk-gsE2IGEmfsF`3?zJ(PG*C> zh|6uOD!Lm|)y4(UMctcq`VJCsKw#L9|?V;IR>>2hO$2M z^lnlZ5`^Z2li~{9-gT^|y#zoIVo(94qnkE_oNN2QrzqT-8AO|B3ikl#C1DD{Bti7W zd5KgM@@wbHB#1E2VG62o~ zg83#}t_gjU_rHqzCM+<`KdGi_==aF(INbabsR?}&)PO%ySQSZA@BDSPtxuDik`8JQ zP1g~S!?4=K^}I^`6Xi^BZzrxqN%iY@m-;8EdjtPOzJ81564rVAPR06s<3ZK99Q99T zg8~cB_%Hm?Kl#ZZHryP`YI?BSavXsR)w3zbg8Xn&g)JLHG;S zt|0LMOz}*_;}Xwg#&emT$$A?bhNn(4^Ezj{hXR1u@XhYMIUs8CLP`%k6YdoT8oytg z)mSBF-{;sQfm)hqKUJ1%0e`m#xgpNvo>bRzG8pZj;4u{&v&ORYK4~{?zHgY#PUHb5 zD5c^1neXSs_p#gM#P>F-e3NZafzR&o97I;qP`MA@qXnYd0@#9elBI{dzP@jBZXqg~c{=DzfJ)p1=>S6h-J!o@)qE%?T$Za8*m^x=*DmDw zZ9XJiB7VYrY*!xf6UH0Tx5?w?na~*6IWdyRubgR7uZQT4>--T%Jw`UW2k!%Mp}I^Z z#P{gf6^CYbL-d}3`YT_Dpnf0HnkW87@O(t^3FqS`n85c zqG|JR4bpVjm!ayel3UyZgfcGTNF)k6dvLcnL>Z{>9dy21 z=)T`NhqjHPv&^uNINQ*uayn5nKm(kpb_}(Fx?g|pQNWxi-c~1Si+qxzV}a&G5taNU zb)qEjs}Zw=7xYRhZVgo!vM*v3M9lcX!B2O!Dg;<)@;z0GHu-LrlQj9hp}$r#hkW}@ z=ye8HLO-xtCs}05cY?LcH_V}Y?{+ck>9=$?JVyH|1?fyo`JqvO)sdTL@@L8lk!_3k zQdU?D_}^l)c!U`(ieHl#QmB03H!6P(#T-&K5gc`(`4g0Xiq%9OA&N6`i1q}-$7Am@M|WG)uIh{Q66nu;~~nu3aP zd`PzL5w-Q}P)t%4xM&3Oe?%6T#f6GP5n$OwcP9J}d9GPy-1ExoF2Z(a)-5$bnJpDC zL7B@Fv|uIw&@_FyIs}t+s#2l5E>i)Z`rwbd?rRp{LD}Y9p-L+xXO&CswC4+}WiZ8e zaN21?%j7$*_uE}`3)$P1-OMvO?RAo+&1Qms=_^YfsLp}kZSs(C4*S~32|Ml2?iz4T zU@xIey98A}%uiSen0Cm@fN4IqZIwsG6hwS?g)_6jx@zR}`%gUU0(vreR;@fceJ%3G zy;hR9E|>Lfc_4k!lHX3+`y>{jYgBpmiYF@R6|d0UA}g6jlURL@(4ag+l~&n_sO}m& zDRSp7)9!i|;WpYImlkU}hFFAJsD=WsZtRt*pi@pmAE;X_F|B|TN;pD~sSk~7&yFMT zQkuQQH(x@$x}(hSDnW?>HciBlKc)#nl18m6dEY>Wl>*4@H%dU}f{!ym#@D&fUDQMC zATKD$EM`v-`Q=G|0y6TvfXs5aDIinr%~K7ZuHw_i>}pAiQHX+!*F*uCxu7tSG>~bN zlPJiD)EUUs;jV%Vt4@$%wE;5Zh=2@8QFZ=_uW87Sk|1o?%2L!l&T;4?no*x%9-D0Y^M#z9F7G#O>lwlaq?N(h(cDyQX(lJ_9ao2DZIL&``<~(da z#QfJ8!XA|mBt;q9n81(fFq6kdWsJx@eI&<^eOIt2#)-f16)%lZpqZ#eT(VYK0Wp!b1?Jb_ zBIxCm6(*1a4B>&_VWv`|@c?=#t-Rd$dqCKJSY~XZ@N+3 z69;uFV@=8_97?o)rvq9lM5p1~h+@yr#rytO{A5t;f5y-L$A}__g7N~gKC8Vg#^Prj|uqx-2udG3C!3+ zsyK~QxnFNyFy(9JD~g^8*i?Qo%Pc+{t($oj3P}y5FHbmF4>fn418VU7u5XS&k%Q3N ziEhEC?;BWa=Ik;6?z9A$8~5Vl4B^R$9T!rpgJtcYhCfm$^aG>FIzUD%4(!Mcq#M-8 zB^2mPyGQmVZ7e>GGI!{vev2((BVY)qN(%5+1W<=>7%@JCWJb=2p+LduCMjd#Rc7t` zB$EdEO79RR9bH7%!m5A_IGF*~1Kevjk_?L~c`{(q%h;52C3l(S?wu2hfq~=XCVy$d zXgTN|{0;4!&TkyP7exKTMEyqsCC4DzvWQICAG=xZ5l^p&$(b;yc8rYV;EvFL;ptR$?`P9Aw0}PrG=QQin}2YZ*qsU>lsaFQKgmxnN3wXWa z+>TS0_2vQg9~msmrSPP_=vm3L9{-@QFco5EvOz zwE=H=7m|!-SA*W{w)!&&uEz?+X1A$N`bi(fP#K@@f>VQ%^_SV+6@!eQRYd&ik;xOw zMkdcGO7!T&0UHE&PUwR~S)%Kyk&QUO^p~PX@zD{i{3Hg#aDi8GYb@*ZvAZ8LNk%3Q zDVJ>Ozw4@-MEv{SR zpoWwnk^7Tm0WCuxXn5b;m?=a~RPhE zkTvZaB_H44;A<}O@kwyH!SXR2A5N6|%X;2s;}Y?8hNXk$t++Nba(}i@LwP1flt=LQ z&U2JG(Hn-p_fJ*k?DL0UX!WniifwFe&2@5WN(48fj_2%2(dQuS3nr*ZHuWmU9xvRL z02l?&q}DGD~WN_&ubiTYevUmGb*Ze4E8g-T#K)vIO}5g5M>y%=HT+ z{N66Ova$Rg{bS=d{0EQrQM5~l-|+2)RnBb|9#SBK@xX%Pw(h3VDi> z=`TRIL6ih8*Wxia47G^-_(+rP(ckP|;#YXqvS8t`Y9}!*4E*!YHdV?i>SiY-a=OSZJOv& zp>A>34fc~BxXk>kC{E<6+t;u?RyQ%G=Od$2tJRCc$n>wO)y3+D+s*C~|322g_@sBG zzGi&LMD9g#t1{d3+uf`^Au!_0pwVP^y^Gx;XDeG#O@Hx3*vv=j4gauKLXAUN#;dz< zdNs(FFew=59zOXkfX-G*U16{<-STGl9V`qgA71;jk=sd*u_Ya;Y+CiI@3NgL=rI`dlh^rl7>*I9r3`dz_f?gt>jX|yDR@%&M5;*oSoBwZRw zm-#fLFCXckMG6|0VzADAc?PSVb#EpI@>2csuFw{%O9lv9$2%Czm&}q!mvg@>rbi}g z(3+OfK+K&u4AJ1Vd6!)jK2To9O|tm#(aA%KM%J(CDrne)+1)Vmt2OkReYV*C4Ig)t zf=+=l{IaAXd3Y&9dPEBL1{E3L3)@~R!t1t174 z9EZdZ`dfhv;pOKKXXwTTwIslBJm0l%7TR}EQEt1GKg+uB)>Tc#4*7+jOk^0E@7~;j zun~B>C|uu#KB%iJL)HSG=rX%qPQ>FF-#aeMs8XTty4)EByB3PyoSxZpRg&3J43Q zCNHD}(~r0dXhP|whru7yb2TaHHlId&@EJsVPtV7panD4`#I6zZVUU*gZ5&f5;Gbyh z3)T`d>bFG!FiwI?Wo+t1VxW9*J{7xorJowZ&N^-tx?Z1xJX99gO_K-52_h%alsUz9 zEFZ4XR5|LjVodD?K9wZ~KA#x2q+pukEpV?6M~b>W`b-5jS+C!pLNsP&T)K5=d6-|+ zgwK2ZIlL^EfAp{pYUPdr$iy5bRwV6N;b!X)T2t!w{dNni?x2$CliF;R^~ zoC)bBP+|C^&{ALcV|s<8H0^xaZki_doF- zSnX}9cw^Dq?>?MydtBPvFT51F?S^jmABiD~!f0E`Zu*a7R!9OGCYJ(`aChUfJ7age z13f4=wcx5u=o3&g1NorhE2L&NIyiYD*|-4z@eBEF@wOesU$FgPIW}mlhS^Y7mwHy0 zlcf}4{+Mo+l%{7!(gB9}nFO*1iI4}ENjECw$dkxA%n_G9l~8U|gHJ_YEF3^e4<%PL z_7W(m5j-JYkK-T6h2R>TPq)hh%4A4}wxC3Xf)-r$SfmZuz=#}08hF=-GH#cr-QM~| z-X<6|?uUV>A&15e0?Fa~q1qX8H&%#wTNwmNp78`R=4TKt}z-xC%t( z`-39yABp!51zr!-JU~5&b~~oMkLBk1Ubb@4^ZNEi5Ap#$tp5%l>K5|+JP;5S&Z5*r z|76nB;@_t{N+7qA4-&MiB!L>jF{vGcV0ePuE_UK&WzQts6 z4d=EYoclmldmBC2KeFJVSnHUp^SHMJK0p_nF6m7s^oGckE^yN?XFiL1Pr~IM?xmJB zU2fN*-*>qILq6zo7r)ZcT+8?`FWQcw#V8ox3HqK z%XO{%tjoQ6$$z@sgps&0dnitCI`YFVx9GxmyWF*Rzu)D?zJ#1VI2D=h_7=8)PsLu_ zFLQyOYkvYC^a0DDk{lCC#ZGvU-~izVlmdppObUC6dSW{s!zPVAUl`YCyu0L9U+L#- zrDESL@i_nw-1SGxD=W@F1PDpo_rrJY=**%&dcnV#qv%^SpBbAUn3+%S%zWmoE1wgP z&!XNv&b>Ns6KM@q-JJS6uYZW2L;`X}`p;*GpIC^O2oZ2#ISg>w`O1PKg^l20d{nv@ z*h^N)8{p>u$K1ETM^&8dCjt@?+^v_IDy#d|s6j#FJyFnAQBNdl6faRxW3?JIY6?k> zHeet@*)9v(Vx=~%(N@Kl)=LplqYVZD0Tu6fMYQUy@q%~(70v&7-kCY)?Ac8Sh~M|$ zA7p3GIWzO#-*?`*9MphFsW-;4hC~sv3K(|Sj*yqx0`rab6SOabEqqmM1^FF%&vkg( zNgRZz6I$V>EnkzXSUH8o@O-(@WBiQ-5+VjTFmSoju$sZ8_M~P>V!k>AX?jlm>KD5- zNlT_-9E)sUX=EX&JrA8gnnveCsp^h3!b5j0vqxqe1PV~*06|RhSgPo1@2y6)gOJx{ z*pmwmRdtvjIr0OO4Y%R{)WF5m?uba?47b7;D(X*=ULXC$@DuLf?5H#4_1Zytx~Sxc zx;{>P57MhxuS#?v} zqZ&|2qZ-gjgqUilT2D1X%|Dj@)p?!#So&AJ-A42eHZn$er?GUTkgk!Vrc*2f8hQO= zSQwR|k(GloCAjTjEy1$tNvl~xnZDRK7Ta-uoI>Yesup3{?(5!pUby3^g_Ju^AA{gVEhBb zveL?Dl`Yg*L5+E?KCU|c4a2tzk&q@MDmw<@&_we(mz3evV6eC@z(<_mkn`c+q!0pX7UiSmv7}1 za!PhwO?GN6L!n+63~pll4Y|Y7eeku&mEsC|H*!~H_*>0rmi|J-;B1+Nw<%G>ub1 zDhOF6Q4@p&$r@L5ftnUwNccukt9Rl$$qDQjS`$0L3fM7^C)k;;?N<=LIa_ZWKeo*e zbAleOTZn%$tN-KiZ+X9su&r5^@?fc!D8A%xfCFSdKj|> z-+B?0ud-gi7XS+oo7A7ToLZtctr<~hhQmxgV{0f>mMzC=}l=-GJ@!z5D^) z1>qgo3wSk{o*gZtYvfQLFjctrQ!FWnWegAC6bq?|niWo%C2p$Z5>OICK0)}Zw=(qX zA->uo@kK@g6qxlQzF3~Sari2U+2+O<8E}ElJ;WEoEj$oofBq@d{AUA%&M4s~gort) zZ_dv?#<;ZG9MqC?v)7QURg{PZvsQnQ8a-#NZnU#}XJyaFV1Cb@_kC6lh|cvB^cLWt^z=wpF#H0~UW^cM1H%Xy)fd9;s_UiZdHvPu<=)1gQtGXW_B zFq)IaUYE5O0ZCjvwh-Ob9nY@7YMru+5j7xbRw4mO31?y8)MQ^*wPEDSW}}x}OvjSQ zOsMfUw>8Lb7?wXGch&%2W!_2+)S0zTOfzM4NrGydBsejOB*EEO$?PNze~@%2GSl-P>`rKA>d*>n41}xh zb9400Rmm8tHa?1V7{rgUC2<2MNFJscSkrtwdg}Svq2Ga&+z$bPNVf-fvJF>PJ$vxs zSy{C^)Lg|1P2J?B=bqC|t-VaGtaf2yceVZtbl4ZR-eg)6r@LBrm|C%HwSIACRtRgw z&Xs4Y@pd;g#LiVpjePb99fE=}JOBL|?4y@NGgar6G6DREvvqljM^HEhfz-(TrB z$z>TmAEbMR;Exyk==IEZjle$Q&S=<3q*gzpkfLYD_FUe5YW486ZXaSzP<*~iae3KD zViY2t@rYUcyqF-*9*aApu@@iRjxpU9+HPSQx|{6ixPYQ%X7aJ%jvacQVS8!1A|~5O zN;<`UFToSE5)_IKCsBc*Z7kx@tT)TcokXm{N&E`mr5IcTxO-U}HizckiSG!8cx;CU z@m?GXf$&5nUmcDNyalZG3LY|{36Ck%bBTba)PhRRWYivq^8zcK_&~G{J*P^AsZwgn z*_yZcm=3L@GfG3o{HAjfnFpl#r>Ox;TWb5Iwki3*+Vjq}S?-q}=D$xBU|ZA$s)C3^pv8v{ z_toGt-X}}@W7FEtgs;>OUr=5@`ohSAc;aGqM95;g(6>O*ZQugeFy^TJzTvJ&Ns}_z zNJb*_4g-&|XlLOLn9|3f5tvB+77UST@yqylp%6^94&yVJH0IAJUR$(yblPi+#PgIrTG06c?9{eLZLCtw%T)rJz|AX0@q$^to*y5?)nz$|)HsI>vx|mUL){4dNPN zhngj<0);_D5(*_plc`QlaHOi@8uW#0IZ$5>;`LDw=$GveIZ z(XH#uU~c%^b6Q(<%A03-&7Z#k{PukgCwyk$Ux6n=^YnWg02new3Jj5;6cM-+_&4B4bqPz zfKh*ddu2UT;YxPYlNZm2;mt$M@AhLC1_p^mm-0&T@)~FHap)f9#m9m1zNakx-{wUM zrw6Glx+R1HoXlqtF1y91q7J8Yp<1*GK&@&4frD+2H#|>|F zp|LRTmQDJ)JvDJkNFQICjBNLuJqSVe2#OBb%s-{#1i2#_!@biqiJ zu@GeB3QQY1Nq=xCKGW<;SiArMDi95><1}MP5+K>{m^fjPXjwE}wl9Ma>YhTaa1~aW zDz!2l{kaxdODdZ&=m2-MzE_FTlPpj~P(Yo}rjn6|9zP!Z845bN>sP=4Iz_gO_UxWR zj(qS#)ChN?>boo7XC$>AkGf<>2t}Vc>Fdav-#itXBDs`gWc)onllF5Qi3YCtNc#!< z2Mwq4J9wsqxh&$vH6!V3fxX=(0TL%9qe%g?Q$uRN+N@;jj%54pEhOvvpUoxN(kon& z(FTa5f@DVs$qqXH!Pi1lwniCjsr=NMsqE6&4&UcVBG>#9t)N(Zi1WMnlvd7zVUrg3 zEr3GisPNeL@xEAhsl|0_^7PXECSq0j3~fhh6%0i%xHO>%?l7D<${fU~0~|c56zwHxzkz#+`A(M9}&D((RAA3qm%E}UW_woxu9$zh?Nxnu&CHUz)iC6ggX zKAS)%cm|zF#CD_`u^Cc+@jvF7(U;|@53XL#t)BuHL9XU3H0IY)fFtHR$W4&;uq{j@ z_WXG9n3j(QW$0N9E}IEWbJC(B{*qfEO->n!lCC+KhXjThK~^#_eu7^LA)N zGHY-hk<6bkLFXjRX_Vq_|IG##KY@*&_*x)e_NX63H0{#dG`(@MTRd+5kaTi263@+- zdcYU*UT=iHxu8+50w4A7-L*hgXrj38dsOz8+?|%$Tl*zjOGb{|(eB*z!ks*|a#dE~ znmVG=cQ*iTubb@L!D~_?7s`m5(p{5UM!RY9Kf4K(#WPE@glC#yCOm5wI+^fniTM## z=l>Eb`6n%;OmSP#@!vzAdIm}zh{W(HHlb@)Q;TqM2gdUvbeo~kV5RY>sP{CsAN(|%wuA|&HD%*3Y zXlCn|9F9$yn98Gxq4r_y1qxxqT$}9Sg;Wm03}G1(ma_p0zgGy#=7k#&=9ThWru5CR zmuR4ziA=>i$;iSt%$8EX1EB2tDIw^(DJpXgl9ZNusB-@V6Tv1Ui;iGXEC1m@LMwmK zn@0Il2STy&YU32>ZMFXql+kt29#+3=>|vGqECDZ&ga*K#0aP~>#|B_~2m%Vw4fYG& zZzLwdM0=DII4OG(^`7CWa$nFhQ;MirOpeSlcfbQLvUgM^wqL^1RdwLD{RH7{d&j^F z=Ow^s3)P6{4PbUHk&((XO5aQZm4-ETWG?Cs9O1I(Eht}0&u|%6OmPtFJbjF z?)6Vb#;uNOSxOoUm#1cAZ^-AHG8$W+FO5Aon+LcAN8}m|BbE0N8OWmV*jIkZ=b-NMl_&ek z2l~oiaE2^5^*p~!b4&EJ*md|i8j~ik2Db2f{sZ>Oo{w_%8^%6qlhh_$f%xse9^&V6 z4CBV{sg&MAJ;W(u6)PY*@6Og61J!SLhrnb1q4|yTPx3~X^H1cxg)@bV<`AG?kUNkU z5yKjmpn>#bFfQ#N9f0^dX7HTEBcv@4;Nn#$`FCL}9$Lbm@lRw=@SRTbvZ#}^30CHS z<$CfmXq!F1-MboDv5gH4jr!!ND_)`|LZ%2sB}@4%adP6FTMkA~G}rd%OsIz%&I(CZ zu&yNj)^|?RA}G#cOc+XH@pI?S4cOBC>fM?`Y_-xTfLXj3R&x*8*%CslpU@#sl@V>- zzFr$_238}n&V-OO3OVK&J))CPLvZUxwMQ9r!kq1JquR;$3pKn?nmpL^YcGAx$U`e0 zBr9m!z>3{5SxI@Y=2z+W54a0A{qpd_T}B>W+g0SD!~BLktT|lEL(NEgBG72k1Tv6@ z`l-^nAuR|d$d!q!ApzkTwaJz12jlvUYQIr}G{MFxmr>s@T#-*2zOMYg8j$~dP@VGs zrCHRY#Xx|rn0s({W`t3wy<(-Bkw;W1lGxT8ooVl_>ZbKdmDQmdd zNEy62aK^ZpqXC$C%+IRO8*JM$T|yU%vpNjxQP@faTiL^VVvaGGLZR*PkQE4@dX2(_ zBWtvSJfta6H?)46-p7cLrk+1uhW)VfA&0Fr^jpD37I$-y2L>ZC5Oon|{3y{e9Vtwv zJ6rt3Hd1qed;!-Ydc9&QNuibs9cwr;x{;UCCGT}aH5y1E(R1~7SUaCW$9i-Oio}IT zwE^rYd2dCq+C9E%(aheK%k%e&-vbJ6Z{vK`04_z>-`jLuP3)7u+7Z5LvCL}ax|%@k zuh!RB%_xe$H(8I8yjKYmeLy}P@<;-43Ih3}Jby2p6vv7#Zh!DqtI4eP2VJc&NXZM_ zYLhw|`Ane0+A*Miaj@19x0XC^0wlP26SsxcVgJ%tz!n?hj(cF0nbWdK`~ID+803j> z?Vs9H5BWZzx9p#~M}J+ezlQ0rPw6)Mr|#!hpVZa(N|SFaZ$uj=gkSg~M4b5`L0XQ+ zpszBAufQ5bjwvwFTSpR(=7PVYf9)o0rgOL?wYzuFI} z0d+32x>OgmW@fdtAv~6DF=;4(TiPazrWcCGG-jIN_>AA6eVmYRN={<~{@A4g|Ftv1JNBKv~oxr;O1s|6Q!Gjx?EDzKAyr8OcYLR6>G`8^0j#| zaAYYKY%u}d)sD3@14GjUMC9+JI;h;p<}>HKm;XI-z}@z9dw*U~TB^C-7tF zN-D4#i`-61#`1~C2s|biPv^x1^~l7XqkZM=ePvnO1<}h*HTt5|kSH5K_WZHVM~`_9 zddBs$)GgQ}I)G&4`XN!>?Z+}5MQsqO%iClZKY^%}RF^N*h>?&EJqUy*^5IS1n5L2q zx?`F%C|`C=qsA?x+IlHaJBC6tFz;rF375nn=DY#IqZwTqEKOE_(=u1erYT!$=PXTI z7nQB~vvl)C-8SDugxNfeshYnu6LMd2Gz0qeoXJT>e)aOv84@N)(=b6$KtYi$6P-tS ztxygW;0fkUI6T|({#U*s4ChMib-r)~mh~Kb0bu!f{6_p>_ZM9Htcf3{;u(+c#<&(C zWE`X5JFH2dU zUlZ<7FBbCdH!%#fd0lmDKgctF7V>!(Dz%YBsfwkr znrfav_@$qK&k`z`>~~n*#V4R=y#t?O;L<##2rLeL^mqP zsNeV1WPs^2kYE+l#8J|HzT16G1>DXAnf)S#CQ2p zgD=d74_~Zr_x3whkXTfVN+|$GxGl{&kl%355#Evj~*siU7S{J&G#40ftgDA0P2Kbd75$(jWHi49sH<$UAC4$kg(mYa0TXWC*^g z=UJ6m_$nAHK{&YnTraxg$VH|mbZVGkQ^L0FwmD|Cdb{bmR`%w9hs0WRYOB6edSPPe*HhXe5)(UF;%g8ob2 zGT&-C&sS^T@;a*Bm+6^GtQ(E;o)(*fRsvZLw#6B!>y}B;xYgnk>jCkiV zhCn%~uNnR1rrz~MKbm}nK^5;EC&GwR|m%yZBz*0+N_ z^PC;4g>`$zSHApqFMZ{mk8Rvnt}Y4qO2C<6U#BfJ^aQRxd*%0+*X(cT+4wH$8T6OX zOOoZH?=-QY)t2X3r?$hSklDY)fQfJC8BaIt17>?W)Z|7!VoT zcJD7+It;!rMm~Jg{AIoFPfu^!E-S1UR0_Thpr~RA_?p>*e09Nc4N%l|nUEPXOKQAk z(Ekjy@Bj%PJZb(C{tehZv7$Hrr|k)YUtwB%Y5o${6=v2yK2amygTE}I$8TELqrV(u z+uta>2SSxM?k@-0_CQA;{%QWQ*pl9e+AO}-vq_&j8>DC30)szzV0Bba0Io7ZlqVh# zH_N$>OG*n`rATJ)O*Hv)z%o>q3VMk%bpJ^0%X&e~6{ z_~xwpY~L2hBwpy&H@my`{kvIlRJ$GI1nJY#Zs_AMCNJlNLxq#r%}MNI{aF=#mxIOm zpUKWLoOH;|W#ZTOWP(Io`i?Bw4QZh%--0-av-1*Fc_p2pDSF5K+2AOaBk;l-Lc7nM z#IL~>Y?ha|dY~vf>bEw_8OOMc8NKCg`J_Y7C*OPw9CkM}8_i2|p=mt6NxB8Y?APJ{ly)Fl9HJ>S0y&e3+`5Pk%zy$XS0TYV?<h1WGdRQjMV5^vTg=k_7j9}sD%&y)@AUAc-lP_!j-3|<*Fx7o8lIaTj8UAI(q|hR7rkF*6qoW*@105X;Jl1DCK*{#m+jQzzi*v+CehXx zV(tisU~zph4kQXSH&VBe?kdy@{M5b%muoL11t#xeRNhLHIh98{FL#??byl#i#6n15?GiyN+<3nFrTayyH21IXqB@kxI*f376 z_$EAIAlC=2#7{BR$;hZn_4KUTo(re2K$-W56dWlQk@FAIype@}v$J-RD8w|ay6J{h zSVt|%&sxw13A;iX7P$4hnXeqd;tx*ACEse zK6>O#1}U1zp%1geojEbbG>YQl#^Fy%_9|nk2Z_9{8;czi(ipo8^$XG0}q@^C9cgxHS!= zjq*>WJ-oq^@V*@X@4B$F;K2`m+4Y#O+-LaJiYItJ%xw9tD3mPt^!w#k z4VYC9C>@*`^Kxji9PU)IG&H#pOLxi=c-;z;@3LROEK5lM`&XPH&pPq7&XA>YfWkI> zJ3uZ{0V|#OBC8B#&|)&G46k6pKBfAylEoA7CWiH8MnB4A^d`zwtCcpa&U}e9Hrs&` zF+f#SSUNw)Zu?u`wjbT?H+PVUoA9A7*I4=wgJ z+eZg8k5$aR05AsMs-F_|X$4_i^?9A0Pvin9xy(U1-rFw6S7^e`SWK(pHoA{)G!dz~ zg0ND&6OoHeIjrvZAhV07RU4Ma;{|jN$`{!ptH*g-$KFojM2y#uiDA_?HlH4co4CE$ zoJ0W{g1j*99r3L?Uy^(B$I}n3-);Xi`VC-^&Y|OwxIW6KX&<$)p-^P66x%{f3gm!n zevR7efhvi}EthJ90dC~?ri?5D<}$$p_`1}@jWqC6Ujy3*8h{EwJDee%(1ZzKTzzp) z-A<&s;=B4htU6yj;Q0gayT&~KiBs~-goBv2OOyk!deE^dla8Qt-F8l5rgi}})T!{Leg;qgc zxsND{%R$KD=(S2r8yH(5YZ1&|HwZJJWdMYFLMGZkov4;mAGCsdQ>QRK)R(Z@MP{_j z<|<2LYi2&an3BxMF7lxiX=Y~qE4!I#kBFI}l{i%RP*)mXQrfkIK|w1};d^Lj{xNqBE4!Oo;F^! z%6e6acd2Fd)~{9?Gfv)qFR_c=y+;M4=>Q3-08Z{ppgp9frqJnn#^HRsL${Bd{4?VZ z!cNu$L-X)%Z=6eLxznBI8Ld(GV$nH__j>t45BLP_@9^24{q4r|8d2~u=QOQ)knQf( z8rh+I5K=-%>VjBXa{jfi$a(hVwOIQv!CIpXnh45=X_T=P?L#3`7v6MSRT!H0;Z%5Q zEv2w%M9T9M>_yGTf^?WN`2_JTyIb%@|9R*i{`=dUh8+bGl*wlT&F-P>to2b5S3VaQrBzPwuB(Ai@I^AbQ?$2T}c3zt95UNbv6pvnLI8 z@MPT!77#7B7*|L^h9*$CDhOE&{DJt{d znu@zv?*~xl@qUIn9NNKglrtQNirh%x2SDqg?9V!hBA{%P{gv@}$MfJLt+E3#cm}6D z3#*B)T8j1NQ1TtH1|MH-`d2^sCD3b0FBeHaN`yC2RSwB$I1si4092Lh$iA=_LJCFL z_k2$&_BLhTdI8Epo@kL_JFu38QhwEy8-Ln?h0Fa?%!wB1=NQhT&xYN_5%1}gJU9MlrOBZK zGW|3qp&iT4#ofN5`fbaiXkw^Ydo_-q7<)RP)w*#ta4O?2hn|$i*OU%f;>5pCj~HLT zD(cd>9D)Zhab5(^9c46tSrr%-F?scHUp3idI$%}9I`ydoVD}IKJf+47bm$*2z+etZ z;ft|%!{N5YvP8HHh*wY*a4pQl4rmjZb*>h<8kA?6a(!y08QiG&8rl;GPpT8U64U_c zhl0XSP~OUJH}WQ;W+Y6zay|~PRU@+3t;kV{5rE;rya9?w+p=qbN-c%#!!bcj`GQo5 zwE=zu1Hsd2IcF9$q6;T6Z1FijsN~bol%G>hL92QvJ{*$B1?`Dp_wX)I2fv2hY0CNP z^R3@Pwv0v&E!LaG0H)JQo4gA(uV4@0Q)v2QEXAL6x}J7Qo(whJ$Dhf;Lts`Kza12s z@)rT+d^l$KJr3aSs5lO=$--~&)vm`+MlO3MigplkV#Hpo2k`xG%^q-`f@429uDudA z4Q`QNOG--?jN4C>M<_!(O)BU5G~A;{klpn&1;dp@i32hIKP(i&rFU9o++XE z%q$Tc-ih)K;h}Os5zJ;Bu_dA^p(#xq%TcHgc zYYLZa@x$+S^P9@T`+@}SQ(=%Jqh58WkNeP|s6XhhRr+hHe8Jl8e+KQc3QhSh>%{w_ zds(eG?5Dh8O!D@ooUbZ#X_Bq1i)n`Dc(zzhwogW$N@&64s4$Oz!s-uKQZTut0)l1* z(>pqBwxFV?EhwO2L1|+Ionr{9Jc6crL(sARAwe;wrIyq)<=H6xcQ`|q!8_zmI0f3( zcTcNbGtDfLFvLvv5Gexswp64SgoTa*>KwK2Rays)?n4IQM4oZFke^13VYY<2Rc+%> zTV;>K@qn4F(y*i~TXgoEaV77FU&D`lwcvSpC5YV$J`1+2ly3_Z@dKE!C>p=iPR!2X z2TdR;M)Q}d4IH zx0cN^@Ym33%p!#Nu-qyol+g~Tr0L$sn`je;$eUydtFOdlOV4Jy#fOC97MwQ8%Pwm9 zQuZ1i`1jZcLvfXDGl+pl$0{?nmAopSQ&YfB9|iE_ZRF+L0_h*=Ds4(++|PMFG3OwO zj5_7)g;6HU!mufhsNQTJ6cu9*0yQ9k23Q8+cACh}0N6=14d)^688{Kc0w}bq4iu2! zlVr|Prp(AhkQ_WBa|Mp`B}hIUxm+Mby2V!+oSgWM1*M4!nN>)4NiJAW2n*IUlQh(P z5%M95o}D?U4kgbP0Y+w}@jc2Fy{0#o4kf1x3t`L9jgT{wo%;1mR9is^hN)1-Cmz8t zr(_^QLYf$t*CNMlX=f~#@YqU^TKnHD&`cXAF2*TFj1M*rd+c;t+*IA!6!1#n92&2( zq3~aL+t}S(O*vnwZ{O5-T2osqulcTpoywL$$Djq^fI;2&nC7yb)Q6fhTy49kwMv7B#%jh7Ll zm{9Qq;H{#VIZsw+j%SwT0=J zP_MxaN}u@z>0kCcLw^Vka*Zx&4Fdg?xrSvq%a+6vW5giM@DP$P6ICRms(m@9cz+x*xCo z~fC)oeBOsG75Fxv4m(c6TQMtn{>qA3s ze>3ir!bVj3+1`YB$gcvXE^siH((TT{t{DQzZyuqepq2^)q63kysZzo>5YG}GF zT4WM($g==6Dp@S<4nSrHXq1B}lxZ$Vc#Bt=6yZI_TNsKAp8)w3*M_`SldL~6{9?Wh?X2oA?eh+E1`!HRlmACyF@Ej zjNYpiy%|+9A*7vL?7Js!<#aAk&#t4DnBK?Z35d$9oX)?n0zzn zp3+Q6eGJ;(?^*ejEc3@SZc9rSZ>X>xX&`tLc$7)k2V}miRJjD;L=h`^~smIoH74<#p~iI;jDNm8{Q2O2Sp=CgAY7;EP!Fm`E{QF{+{ z9iIH3qy8jTP?4{#0ypWDxJ(Bk__7khtcDSe?sUSeKvVC1uEP_b{^{}2(1h!s#6P;e z358;G4jT$G{#4urk4In*8ydhRdz>0{)r|Ud-H{G#lR8_5dvvziqcH%0A+FWVx0|Nm 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±qoD=vy#w$AxPU|Y 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�wYo0@MaPFNKa1e^k3SyObx%O&Pb3~SE~~)~;c}B_IjaE-57*QQ*9hZL zzg`sdY9s-Q9n=V{OFXLownF^ruRjrui=LW2c;&80A0pT^{1w*>1?8ls{f%cDybnM1p_Knanc)~GfXd`QSjl%PUZBz&?>vGpe#-wGlH z>rZ;@WC1RQXq8E^PCGw=%Pmgf9gG(1Lc4Ej!@F-P<%N=0qHJ<^z@!zOPuomZo!XQa zC2KZCctnPE_si{&Lv>F{LJU5D?kcIw zcQLP%Y=9ASF)x;B*8xzB?`v3u@-8 z*Krjt5l<`i>Hj#nmbN@%%B6xXJuF?qq5|V2FR9{dhhA z{#1JJ!!`4{EkWb=v7Xnys5go}m#ruI{PlfW$#tR6SO>48j|27piaw{8tylVNe`6GV zKC_`hP{AKf;w;kMc9)dh0JlGwUFFJ-=0=XW|FRT;HX?iu9Gk zYqJ_iTGb6WJHV@decj@1&&&6082&swJU_u79*}*thz<#&DoQ*{gK?z@|!hBCa~?@g9|D>ej6pmV=hIuU0=1;$?|vn>>~)38(iLFv3hkoD-c_ss*Z~9^KE3*AR7*?=LKfpz z`<1&$OVIJ+>)Jv2G4JKEs78l1^_W#8F84DYpnY&(=JxizkpN=SIGNrH_uojSo|P}J zpRx%*{%#B?c89yGZ0cc4-qoebVDF$jMG0nq?SG5IGYWw&XR&>#E=Kul)l2V*fy&oxk^m z9|6f6zYXFoHa%o-GtDVv{@BWDUWqNFJ-K&dA1-Si<(hnX*xhdr>^?S^T((#)sa`oQE}5EBHJ`UJ7+5G*vRfNC{8w|8!y!d73U}`VM34;> zll43nj*EGJeV7az|HAJNF3V zOevahs@)*6+(@`T=|bXm-?Rd^3S(&Wdd5)qb;H6?|3iYIe?M{P2r=~ZPQ%9#kyaQ( zqt-Kq&bfA27`pO7!O-Z(Mv9?7B!+__&O)dx2s6zxR8c1h%Y*f1<6bgF&D{J9bG+}S&>cZ{CeKnA5!gEq$)nrZ^tsU3LsZ8}xO zYTig?X-G%1$t))Zp978w_f>SAE0L~oP!j!G6RZas;KU>TpaGf?{HgRdd?)Z4D?0aM zxpchgo91rZeh2YQ8=l_mmx+A30V` z-&g2qLm4gES0Y51$WY#!V_h)2iFR5zj%)$+U-)kr`u~BQ0sYPmI|-(|%&!9IH~a0D zkQlU!gvE3q*3P< zcq$o~A*AQMQ~svf&Asc7(!|Gv$aqJ;4G2|5u}YM$i8hxDHt zV}fz3lifG6V`|XAol~g(Owbyb0;CiY$D45Omx<5;u2=l|L zPyz!&R)7@7OZ;L;AspH<(5Skv_NamK;q@nXS}0W{4uFAFK~H!W-H^?2JvJCsZNs)AF_ z|8QskKy6)jMo_8~rfRH8hkT{=}Mk z9Ck2(^7WYbBh>YfIze~=^ym?Lf}Xi}-Jz#X(u$sWNCQ2HUja4sl#F@`MLmd=hl2a1 z+{cB2{Pw)b9Ma?ppN%={NaW$*81Y)JIl<*A%qIf$;1|+oomEY=`-dJG`_9JRq{|^9 zFCYY#AhE&zO}O&MH1}+~bZaQh)41IIc9#Yx)gbLeq*l_#Z*`W5d1o!l6%nw44%k2s zn*7V3$=7Ef5;T{a5$`l^@2QfB>-2`d-kf7UiB#&?s7X8xZ|kR6l?_=*c4k0h3v(fp zU`C`6el}4JKYIy#k@r5eny#Fb|0gRh|tLeBBw&sWAYzT5aH36qJ$s-KMp7G zcX|D^#rQIRP%x4q zDmH|v*yyO}1M47BR1lp2%jv^vZ|k#_*fnNPWa!~+ms>Y7gbvwc{`X~{LwYY5EyUFS z%9wicr{3{%SPNHyxNre8v-0yscEMrQwSP4TNCqk{Jyf3y^LbeaC3y! z$yH=?!ax=$+efnZ%%urDUXoMu{aukY&lAc7El>l7TM~|QEvDlYbs7>NdnU!IGu6OU z%-e4k$zps<(3nAw;gvFDaCr~Dg!#`+5rI8XL_bU3`7sca_sN%tP2LAB6Z8IcEfLhOuYzv!8g#k5A@u7Q8dq_}$_-Id z$IxdguDFc~v14d#Mb}B}UW&}%q7dG-Qk&pH#>Tx8rBCL^7Rp#wWVf8Dyx2mG063?r zR<1o&b-bqI4?JI`9ZH)UU+(Sl9irb4JEGTG7QF`RD6iMksZsBOYAEKNc^3+$fypOaSMj&UsH;~LQq7C>I{jli4b73IBELsDT+6=_DGNG~wS z0B$or|0V~-M0D3^c_9nE%NCPZ!Pw1Na_VQZ=AxpXdqTM$Dk*q*PF0@}3_hG(;ll~) zp_YYr{5}-rm!%@?4C4uNV2x1PV>Km}rW&a9M)fFkP(~b3Is`5k#E@)rs^&>r*a{;@ z$(UQbP%?CjfAL>n%8A+vfk7sgfqKh8&GuFeN+xiZZKg&Bsp`hI!E17|QY!s0uOj5> z$)X?YQ6wu4711Vhf^E?lH8T|fIqFV3ji@U}%hqS%Ti0ih)5gG+-l8k>kqE@imU3Fh z+;AOzhBwrKz7i+SHVC%J)O;e?LZ;gLbc1MoRx@Is@`U~BZEjd6_Q!OL0NNhLZ%`uAN+=5#(okmG*0k2 zPxWst$C}3&m10w%^cI-x_g5{H_euerrK?4z2|LJKBN-Vj_M2CW(1CY~u)4$#{2|N; zxUXh4HE#bxk};bM!drudFLiXzPR~Jyl7$c2+g;3Y@MGA`}(c7cSNs!`5^JOnv%m zq@sE53#EB;Ck8Ad?!cYz}TAoK{dc02Dp}iV8bR^rrMi-3mb4F;();wo`As>q|z81oV|5L*V24bGdjh_ zJ|S~_(OqoJ#%_aTQpW+pvFLLN4EP&?ScbZApjb&t>7`sxdLdX4!vj2_=i0th2?jL# z)*A$C6omKKuveoyEZHC>OM_)sfyH8gm=1?~E_$q_((0an&3v~obSS>uNutkM#ohBw zU!gqBppj^!k)Vo&4y|RM>!@F65g#Tu?MQ!&a+B_@N)p_hai^_2OS;E0{*;~bIpfbc zX3%@8TBX;$X464dKkSoQROJc5W-wllRc4ZDqy6o#8j=hwq<6qP4caJil`op)smXD( zWyENy>tNE@ENz?7Qb6dKf9)RS9-z}V;)S>e+}vRPdqd_AFen&dRxr2-f+|FTG%Hkr zG%H{wOY=4rUH{6L<}H6mV8g!LAjzJ}H4A$$*G>To!OMsu333pLk}IN6yn+NtR03Ho zNj$H)npH2*x)9-zx)9-zx?~UwEG3f@mQe+ z<3tr1QQ!s-$`$O#>smYvnRnn?MaJQPb|2ac+O)?-6P6KsS}mEdURch4nqC+{`eW1!U>M~nl|$t!lS5$#v8Pv`A4ziUbn&6J zkHo!=ZNf+_k!^ab1Y6D~3$~C!O}$luEo7>_?PX?;?dkA5nRyKxjgre~!pkx*(sz^? ztIx=PY>n)dvd%DvTHnmNmrX*^QreLSo)MvDU zyYnhoX=mu>bv6S66IR$ZRXRj+%fo!Be1?U|sxJoNnm{-Bc(G|3v%+{gm zSoj1MhLxznPJwF&h!r|fVo|txV99vK>ZwrpHXqjU56+L<5uH#SB*(4dvuL(hebp^) z)p{dm=WGwarlGW)6Jqzz#cp^Z^l}FtY(StaEjYU&|(VQTQwnKAAv;4eSwifqhQ*SzI|&D)DTmR z{8Q=edb6@2HmYC-_LBS^1cZT)rpQ<8_#HdlTmU4Oypf;}%a{uGvO_l#^kFl>OozfR zfE0=Z|8Fk-w*Q9U4QoE(c|6RH>et^I?;S15DDt@qt@4$36u{`g5|5%y9 zT2h-#gLTs+&~wSu>o%Er);yZYzz4OJE-8(5%#+HlCm-ngT<`%GM5p6Z_Sr9Yl_17A zbNRj!ytArLGNgGr{;hraIzwo|?xgDvrvzIMLA4qgFL8l|z>Yq&vJa^@Wm*H39nIjQ zTY-SkTRl9C6>J29t-50-WWIMQS5Gt?)A1h6Y(1UxbiaC&sW<9VPk0w~KDmZVD`29{ z%fxd}pyZY*?_@kbrsLfWzPHCQ9rx89qcJa5JmYpo%SZtRKZ$+JV39yrMFRJQd5*2R zz9(;pkmx5dlrAXK$5znlkX-iy4csOzOehcjj5Od-3LQ!CHR{9M(VV+2qd56|Mb0SB z?T^s~DjaeyXEnf>kWt*DeqEQysc7%rv(&J_{EV= zPsb-7lt*~Kq=g~}q*)u)DGc!EymMZER#*)JZ*z#sE@%%m^jV>DwmaQtqIS7WRsG(f z|G?@S(6?TNTgDNXId>oNevM&C)ldbHzgDb%hV-*7PljCh?}`;$Mg~5R9;M^2q|G4# zVLTsr9?)6sU3%)UQ2QtDo=V5P14fG4PrtTKsJ;1+0;qjk_w;)}?UDG(M?bROTUe=H zv1y>c%>O;p?1y~mrxEx7CZUuh(LIGWn8P8YV1w!QrQ<)ZG6do#H1>8dt=0aLE2OB= ze^g0Cg8a7P3_BpVO?E>IH4C4>inmlX%@QNMv~~$jKzo4=;upXdT7UQQ832;|>*nJP zpW#KIDyc3yu-1jPZq1+FH)_S&>k2l05eC$6XVKKdR0P6L2sw2;M(;YXN=a5dAn$RN zdzxNJPH0B%NyAsOY@Q^mWMB$gYO!UA>G(xwIG(d(cCer1lw4Nxr3!*14i8Xe4o}RR z%uQD5_&xVUv6_}NDb}Vp-h0xp z(EiUkg7(iZ9x2-Q%H*QGE}1g4x9wIKp#cz z=u9*GcW)#2!t;=P;3D{C$(Lu&%N3`YddA=asp#M1I6 zBccJIsKk0|3$%2Xy_`#|TAx@IotK1VBq+1%JRnxs0d3sK&PN$Y~eHzOWN*o7>J7AaQCr zZGI&;-@oF0^Ij$Fs^8?|HF&@o4#LxHz)?> zP&@oF&9J_tA?z!8FNJ{UzafAe3&)K)o%QC@Cn9WQa^Z#Lv8-ZUkR5+`%*Xfi?EOfv9qoZ zuQ6t^Kp$fINgt>JTKDrX77`3_(|}yvSeqzo!`S+!JoixFSN4HvFp7hpN%4EH6!tl| zEsEk=(g>x^na8nQ+9ujxdoCC45|seji6)?(7%X@mhM+G8L+gGXMsW;XGC5bkiejiY zB^cUrPSj}+rC{j6XNQlWLEyJA53T!o7{xJk>WRa`(04i4l#cIz^++-F^M4KpLoik4 zKo4X9^T*vc%`#N^8WXHHTOMm9kTq6rUFbnV4KF>DOHB??{(J*5_PA7bo9 zrT5j}@UT9-Au%)Acxgv{96Z*J`uOM^hmG`RJD(SQ)W^A*?Cy(uLSbfXIB)%{i;sEJzlow%+k4Rxw9pwwCD{?jxx`21CYvZ$=g>cKgh4thj zUqC?cqWykyCSP|^7j@R=6BIa(<=)ij%0hl}p4T+XDip^qPc>~@sKNvlf(d-K8+I@& zOvhL65_JMbDU|u<6D3mSifr#UXM8o!`M+N<|92(P1fO>ZSN@o$M<;2Zlu{+VLVC5N ziPCvD>k=5JUoi7ZkCloinHmQaxTu(5LH9hWKl)|avgD5zA@bF308zs?%Dwuv9)v+y z*#zN)1IjKe36>LfyQLpUREG}2@VN;(uU%?Tl{4L`9NIZB3{((3Vx$mT2S7vyZvi}V zR-sB|1gSMPx*8dy7B0q+av`dLq+I(|ND3-xX2g*9m}zBZfEk3fp?=+tTZyvU);r)| z(Q5%bV|(Q1T3%Q`9lv#q4H@xhkdOTB_fDMH&$QKt{#JT@{Q5~DZZJ%rl?;ypFXl>x-fFWg!%mRfy5_#TL_Lr{9_2H#>y5wSY=4?_Wve7ef}$- z7(bo3K`uXO#0<-53NqAj{FKOA7z)@A{{sH9`M;yUTDJaeMpZRr=mg9NQf#2MMH(#* zTElygD^6e`1)<{XUpju{CC?_CE^{)K`mZAaC)Zb0i|LDAS3xUP%jYSzQgxE1ND7Lbc)!1L(EQAx;7H>LwAVgHX|Ottc}E z6~PB=VEl~t2o|vJ7Dx2jhH?wTAtKT$&@E7XleYB%>3$2_NfS?G5SYqLnGaGAbNq8&6uqA^+_vwb`nOqN(74BI_1#-$0W9o>YzTQssH zxyPd@q6>?5+Qiy|*V`oF6?PCTL^1&RU?I{1Rv-aL%Dm&Z2{Z%xs=+1;j{ZWfiyaEu$v~*m+?2yhlr2QHf8gj&zZdypA0o};LIOu_lGVJ zp)%Z0rc~KD=*m6sN0Ihcuwwq3I1w^z$el-U0DMg_rFTUg<;ZvO&~beq z9Y-IavZN#8qp=tBrs4H;e5bD*91(xfl9VM>vs{|BsOSpIB)ot8CD$F-$b}*wPATaU zL`4ze>HaZGbAXzQn^3fGz2Ii5oUv3gZhG1TH}}toiuMf{28!Y4kAEIMZUzhB2FvZ_ z)NjWix%15H$~VX1;H6>kP3wh%n>{WaDQ<3FJ{;Wmh9e~mMDEZC2hcB0g0pHAKwBeO zSO!Be(DlM+qdzw+TvlBmxV-6|!$v5BCoWs>xXeFxww9`7I!%2Y6=OR{5=0)HALN#N zxN(!d7mfH7{gLOs8erqvd9gUOvd|kyr{;;Q@61SRHjC ze}O(#d*swdBkZ!I?`*k-!qQ(NC3c zRJyry9VET;e&E&&u!8QXH9kiQdw?T_>&Ph6aWXQQFiE}v(^=rIl@uOiY23!5s(2#g zELpAKVDTcw(>3-JuCDZUX03&I$2vmDXv?AhVjRX#+cufPPJtIU0L3<#wh=z?QCYTx ze@Cqv;**`0U_WA8_I&^t`UU=#jyJbIz{Z=+goRk=k7**EKO&+rncn-T``J?*j4Is+ zfpw+gwS1*x41u&!Xu0=t3%NqF-u61b;qnu;U6v^6aM_q6{|I==Q7xb)PPzy4-uNSzB#l3rTHvmb`kOL~!P#0l;uBVMxP`V0+m^_f4^K#n!Yo zYWX7txc!pdCqSQQ>_b#P*ky>+g(=Wcpdb4<4s_l1Tf5;AxHh!!rJO7_C}ku9qGmiN z2vR?$;ON_(k80)8@%EW+kJW#Ib{==@?}!oh(m5kQnhuv5@h^6I%aU7^6Sj+iXObQs+ZEVE&@1{D8<8VMjGBEDWci{jHq*Cim z@7@nPJ+%Qb9xRNPEtwBX*eMU=pKf;;mpujAPTs~g?H#1d+ea{C0P(a!0v5t}LkQ#i z$`Cn3`zoU2I&8oP7~k!i#JC0e$Yw~-m+~Y!G9tm?05N+5_C(Cya?2$6+6v1+Z%$En z12%7tZr|?SHZ@d7aTfRFE~YogEaaAy4KnBRGGPw6p5gIRJpIfzhd;^Vge*M=X_g85$2bZ*uqR7DYxZP7IF7tWT6^EcRGb{s zB1{EJ$Q6DRuP`;-w$2~Z+_f%g*o8hM0yp$YUqyyZz`i(&OijRFq0^HbMndm^=|C@U ziR@z!LOC+78H+bMtJ>2-Y?KV$I+9&7<_8Hzz$(HJf)-?|y|16f1{UbyA<)9BSq8i@Bv;2eRu}42 zIB~V-gVISuG_>F>$vZ14;xm`G!U(-YYy@qpe4z!Ul#iX6mQupNIX3lwP}1Z7-2QIa zvGgw5rwbC_e(A~^Jh#ZgU@T!Caiq7&kAVR&Imu(fEwL3te@ zct?Cy)u>d!O)jaNN<4d2DiH~Al??fnyw{Xf3EZWeN~HfNCzVM5T_w_gWD?$;R*AZ5 z$}j5q8o$Jd30H}B*t*l~AfaR{N+`cCZbpuw`vym@mioPpxT=%4q04y{7a6`I(iPvo zj{K6Q4hx-`96wZR0phrC6U+%C{VpJ>uS!nat&jqp?cK?*raAe*{${M4NF1wJNFVWT?JSCG*0S%=asK@*JN>xJZC4voM%-Ix|ue$l5M9xd;uKZJuOg zM$dMxr{l-J8U#t^vi2Zs=R6(i%R`=JbOh$opHQyo{CzoJ--81>QLNqPfXhsYb?a&U z<)~5C)X8=;z$Hy|TvCT1co|zu$7_yP0KDstQr?s;FF2BwwdZV51Dgs0=GYmQ7zzo< z5_lob{ous0yR$O7a9}|2i7QEI2zK5BUKehrdH==~7Fu9HegqgF*qB}Xa$U0f^GVpX zNxO0tTF9>X^_p6!5%4Hdcp|WYAk}PTw%}fa+OwGMJ~csCuOwn`zY&Qo4By7OTTo}Z z*9;G=Ffla|_>yZ(uI{mD^db06`8(E{442Jv4Nb}W8Xc!c)ycydKqL%qQZn3o4>~tU z27BI$m>MK; z!NsO+k!fXSIx9m4)*H+&8OQXPM`1o4KW{LX#Sz~k5z|%~HN4mOG&vlB1gRvO(|=lvyj{M5yv6ALnhnspefMOl76Q z9Nt_t0uJwxt@eU0B~v@QKr(ri(e-t>FM$=5nti3tu++%O0D;te`mdZ0`B&zq7uqb3t1n+! zn5$(YzH;>-duCkiXgNt4BYsR=ea%iI;ObwUtPns64xgVGo;+b8IYz(K@$s7sKn_FNp zGYchyk{Ub4!E?Gklo9(;lU>Aqfz9$!GSDZDb&!r=Oo=oh#1x9ySFa-Li)UT%of>IMka|hlss^0l91y-KujWCvC}6 z{nl6UDqV*Sc&Fvr?#c9BV3pLQjS%^pz9VP9cj0BCr#p(DyUh6cWvvO(83n zj^F*wQYfTdBZZ!lU0b;nvg$w~jLaa#N}=nwK(~uf$jxa0c<=AB?+BbKYTvKoSXR+7 z2E9vfwyfpovg6M!_m+Ln4~WM37$nLm_1@-M3X@=)U2UbV4oW@D$0${Tv0n9A+F5)N zMeHoPEmtt6T#5CLccFXF$3c-uLHAxjX2=eNowDbfqS7nHf&M9#D;gL3Y$`p_c<)bT zd)blZk{~6X+l2vJ02IV{mSiMshz(1U!Tu3%lcUf;0S9KbH=_fbKU&(@_`8uob-A1 z%p=f1L0(KzcBa#dz1Qx`aVYET9l@I-B7YNXF7H$zaKj_wMJ|KuMzhX;FrxnFuVP zswTrXOI?@{k}FR9v}+TtJZrV5s!{I9T6KgAC6l3+YfMgfr6S!!T?z|^g^BONow-$1 z>x5+Y`QS@Nk7c%*{yK-z_zMD7%P$ekDk>5Gg%Y|a;v91zSVet`;L z9Gm$JpE(+0pOa2mWm>6(&qU{1G;rk4>w!T(qpsX4uMKqhd)84&|W;r7j|Tgf=S!liwrPn!D&!o zwN$E=3>n^~62&ex;Z0JB-xn0}9Sv3>+QY{8suoE`Ah=AbV>!^ETr#k5-bcSCeM%8E zzU8ew%(nPnxy-hZ z_%LRhUx3-RyCj?0O3-5fK}khovU3KHpu*8gAa#8ZNL?R*m7ouG-VJr+3o096tSQ;C z7+>kS&(}pgZL$I;I=(a8JL9_n^oS~*%$E_roey!u_~ANC8Ya_-HB&kzuzw;!UB_W{ zYAo6WtPmky21mk){1&Ea@AQz$d$BAwfDkrm3=^~k^(<3Ob?-cbmnIaop-#8&z_~E zO287#JioL9Xk;t51KB_++RE!1%U4a=3R0Z1?IU%Nf!V?=vSdm@uD8F`Sk#It@=g6pJ5>CHSlU4b z>epExv!d!Vm=&EZoFi*AoMNY+?LC*R*wz-3OkNalCRh^REBj9V81TgHOCJON?~L_K z*^LfB0|i-fI`l@m*o}Iu%z=`|nLLkFr2mL%26oDK z7IfVW74wa^>7%tHm7Q;3=PSK;#5*$g#fg_lloPL-;fYtM?ir2osdnQ}ZY+Z_Z5Pbzah$p$V&Sy{JNIz}Vkolt81bkxbY)tUv3M4`tBdTn$slI)*THtaB#nXt#r^_$W&Cnn&FzybYdMDahwr zDm5e`GA!?wabRf& z9aK`GgG#KDYf6B3O(ne4nbaR#$P*C1G=!AsfK={N3?Wx?kDiHBX4$`ms@OnykEXV+ z==`0gwyEg+IZ~O=P{;sZyC6>cTx?QIMntyo(TQKuBu+7+bvT3oZ+R1IR!5B#GZC(3 zhQ2p!Eqw1SwlUwErdNFLHGE;&{Rk$|1(ypXzgDb3zfJGV(J3vQKk-@Hvzj(g$r9e{ zasb3IUGF^(0z%XA4MH^v;8J66bd78GydOOfwH89V_l+_>%>%S!2^1XATX>u>!>Wy> zg!kz})xz8qt#((bHfx-)`G<8Q8YkTSGxA&MYVmGvMl^ngo_a5|u=MTcQ5B|#b=%~| z;|DS?@Q&?qctX;P!8K)>J(0#Wyx&3hPd@YBN}ks<^VN1dq?YN!l|QEEX%hM^d%|`$ zpF15h*D^70wgigo>}JeO$!q-LB;OFfNWQaPK|W4dIFMnonD-LnqOjD^Bn$__H%cZ` zx&pio=Txu)-8=$el066Ux9@IuAjDT&8j*@gh#6QxSp8GOS{Wbpa=oC9MaFfbkr~&G zCb0T&UEX+^o&Z^ene5Fp-%l(+*DWLmQ8T^SQ3#IE^ z8Vnrafl$b*(1vD>o~~`lL$1Sidcl#vt3f=F`CduI&`!B}w4|Z5crt@ImVN7O4tE zD6%jJ5P;mOY*--64@f&^Ze}he;pMwn3X39BVKMK7>P5M0qfN8rU-riE!}CBxQ!+JH zNC`&g9;f$kNEsM0HuL=jQ`QVtbaAH`i2ikKC0CN!5DVCn$y;*oLGN;{pt!5taUeW^ zsvGIDRg35Ifq4PaNl>Gv9{fkPsGo5Eg*##oWK2FaN2Ze46t&iheV$m8S%QMzOJ~S_ zf>D_hkwc;2$H7+(vrN=7p>o3%f5G}JmB;%3nmpn-!vZ=3_X#C`B+G1GA)}yPpv4-1 zk>hu9E&v}=p1s#!2OiS&KGM{`?%QMD_rIjf47bi#!oVKzuVibtHh|MWhk_O5d@(_* z(21f28VRAQz30JTL^>2Pxm|b*tl1}Zxh4CyTE7FI+Qa>_G8_hw92G)QE`IiU+wcP_ zvUOD5#H!IIiPCZ5mlxChv%M>E~*mm3z zJ#`Bc&~LNkDx%6(eHK){5#H=Ry%D%ouCoxPaGrO=I9;A1%|qst(^}d$+X7&HVvk58f=kjfPddR|lblPutxlsn<4H(9 z)16h#A^N{*^si(&(3~{okLd=N20#fu2koons&^~B!%k3r!Z01pg_}W zoay!%V#N@lp1G8r6elLKm-ZZ0gz=^NY{qJn*G3|SknzVfd4oTui46YO+a}6%GiAD! zGF|6n8j@@>-5}_pv_e7I*twmhkx6*xeyB$?qF)mF5tq=A;zR`q6a059Z4BueLQq)$ zkp46hhaMUG&c@ztZ#epIK(H}7$F&}^T_accE^>d4j>pIo$n(eUHd^`^F7oVrbral` z)C){uZB8A_rk2@qP`)hByKdw2@N&>AaD&T1+cv6CEvv^@Q(*dtHi>DH>u9)pqjdOdmr zS9wNNq8_!b6wEI&CE;9fr*oV~+o@A`kjiFdwXY{r>bRjpCaTh#cBu|>TMx?yKAb`F z^xIn8Z{g*W68;+I8meY$4OUUhjG7dg78dL7nm3ENS}GT|brjF)Y^}0(&N!gmSbCOR z(KF*eX&Ia)B$1YpDMS*fdXYhECz^u!(UiYz0<7IEO}HtT9^2*xbu9M-Z(2byEf2B? zNFYX%?@@rdzJma;tOf6!IGQ|*EA@GREEAy#c6JF2g9cE{8)q>18W!L-6AH)et(FmPpKclOh~rewH6Sy~o=AU{ zNAomn^AZjq1CfQHARJ&!YSZONS9C7oW@cZvs)=;U(S`5#h9dPY!9w_oO%Vut2*%hw zxsrphuev9Dgr0DNxAz72Cwsdm?{jMm`XhFM!|Y`P5@8iddy!lf zw!07DhHk?cL%6fc;h9P3%-nKkxpJKc5^pG{EYfSC54QvdmXFWVux-5NY&CJWMTq{* z*77zJ&lj@5vzIG8d#Nsd_?B)+Xf2Z3-pWCajxnO85fc(?afmZ0QZ7}PdW}hjBdRSD zWa0&8NDtu3iL%cfm=_V%n#@U4XpD0NB(z`c&AVFpqlWE6$vX?1!v&)=<7i2-Ccjdk zSg@Xuw9U9EB>nEW5g_UH9rBR0-C-j`QpfD!Ajv|&*DzR|6(DZs9edgqO4sDQxkKpb z=ArcOITvg-T*mEZWtjut32uG+zqw7G!8=yqc&0JQF$4-?lH;Hy3akC&pC?ixZRrt3w!_hgk0Y`{l?g{b`MYV)4QDs5TwH z^MADvg}op^F2=(8oiK<_b;2M5=Y%2QefEOfBiYp5%oBzupyk5jtu%s-xMky$F)!Nq zWIA;ae zvIh-=HR;%V7B-B|lZs9k*QkxUrG;igma8nVfMUOeAM86b+yK;dBr0X~)2bgpM1as0 z0vR@fJ(NRp8bvKY6~Ps1l5`854|l)|!1KPhJBQT1QwC0~L}_qh|A#9fDgC-H2Svm# zf@Fd=aA37`1YRAl*!WY!E4Iq8crx8@3xeP9CXFFS$4~0p+Q&h=6rGBp1HpmvZj?Ic z3G8q^*^JszbooSCD7-07DTB3Us26LTr5}h2$Q1)0yUxXxOOc&pI0*v}ysqYWIlHJ! zk)J2-;Adms4#%2L(fb3qwE_Zo^8xRg(SR7VYa(cJAJ11xGvr+0~D$wUIUT_!9O2RUtD;q5XYFQYMUIa7E_5_ZEAsSDx{%s*qAND_I zk#y#NwjrH;A;xQ=RgwpA~Yj5T2kwd%4`D@>s-@6 z(Ve~KXmfPW47syA^2v1fHjm1TD1Wpw5)S@k;rNXjyIifi3Q!8HwCNM`di zG<|c*uK4TFiV_JB4V@g3hOQRWsD`eQv}x#C$xuT-y;H7+UWjMV(3@aJk+Ad`OuQY$ zgD=jlF`;p|Pc0NMm2~5$eVFmu|?@*pTBqjotFYERB80de_*Gll$<}?OM*OXza>Q zKx5x6TNq@ZB5@Tg=Vtq$beYJlQ^uyCCoFdw+f+E*MzYOZ>6Ehr^k6Ezed~&A?ETn4 z!AMEFprfF!e4UT;bmc>WJBt^nvyrDOn>Wu@+E+=b5i0F3Mgp>j4@flUcrSb=Ut_C0 z8^9{i79Xo+b@kjfvqBbaiwOs2m(5 z0+xeB42gqet%`c*kfMH&>Ntb5k0c^-Zb(sA^U2@blVu@A{j4hLYE{&K3MuM4sHknA zbPK<$mo;*`ig)a32h!kQ{DS$>^rR}!od1pg0q6hUSbQN&4u^<76@PS&D9!vaJt!$n z(+}g1_o?ssV|t|~B|Q*I(>Cx&wD$38R(zhMjVIasslu1EO=6R1i!S>eS)NP`u54l|!BlfH%{k)SsEo`T z<0$XWZCO)ZNT!{@qC2zXYIC;f_%BDhXoFj~;3fZ-JNVSH@RBgzZSd#8;PEpOllnBE zOvmrLG-}AHB~2)`X%ouX0tdR}E&O`ckP|c?z%%|x|K*yLG)cilC4f2rw=)=Q8`nb&m z=@0+?VAPj8&ev9pBYoo6{x6W8It(!rXY?370c&Ft#@lit@FL@K2pZgH$`shW&WRDJ zMVDB_sDb1k04DicCl+zy2o*Aqb)|G5FkjN9LZ}O5%s}B8kPJpw;-^ani%z`n*Sr8h zoy1W9!3VHyO&=SO)@`;J=3~dt03!4Y^s&u1Lb@F@wtK^(4+D_P)Tv-7O?!u!&M; z%dp6TXl$3-omiM-#5FIevQ@vqv)~u>2li#Y*_Yc_n0;A+7YQ*vK>nDHh0>Lwbi$=U z?3H}ih&?E2BQ}+X_0h$`p{~5GWdDgDI|3$Z_?D>TTBe$bow{It&@8}QRtLNT`J9;r z1%=Iwnfvgxt)?LSpgZAbDZ&nVv%9jS&4(X`0ACV^*Nf-woJ!oo(IwgUFm7q*JFqP< zW6lU*ZIt)RGjO}RjXf~W8t_8+WD%3iMH{>nixI#(;jL-k;RNfD0N|n@V2>t(gFy~m z-^njw%z)(!?R*JQ5b~pgh~bq4=fHvV9)Cq6=}g>3(l`oNpu2)VoVlSWd7T6lhfK(Y zOv39roXvAsk8CSbLh$J%W`LaKENsXbKzano$zsMRQ44?;5X*!k03zL}MR z8krhz?nwmRU-Rag=w=8I=noZyPzMEL>}IPW!zRoVH1bK1}=ILIlmw7oZ!n58{sJuG)G2o zuP*1Fw>KLHDj~oY;Zz<`aIj3TX^DYlmyo`KdrLn<*Xz9fAo|7i$bBRr7=59!?+~v1 zv5Oo)N?Hc9qKne;J&!s71#qrvzX=7uql?2Cq|78+ZUeR6DkanL_qNy#OtF2HcgrjE zD7Y#Pe{! z^Uhq#UM+!R^Wkw-(m0YQ^dyj^tfk}k?qVy~y%|dtsLE9fT(s$Yi%iawD$N2*S_D<* z1w)(ny^C>HA)WV?dX_8K!BpVlBx*{q0fy#z?f9r{+IB>;CwHy+ z)Du*``od7zrC(tvwTqu!s82DDTTfceph`q|!8`K#m20@7tCBVN{k8i2ew%TC${fUd zPE}TPKFN6zgvu^GE;-?eimn;32UNm>1!@5a7UPD(CwdrejrY(X^>B70L8S*tEpV2k zQ%b7kk|wFp+ZC3Hc`u&GA(TSLb(PX-*cqS~F)-o47J3Z!Ed=rXfE!V%pj!=@YlXZf z8g~Y*>ms9;`hr7vYMOJ0w{Qkohl~ooKHMk&1cp)wMZCCIU-vK2ZV$;pacsJgk;Ew6&jGn z%?how3`ET>*SY~eCVQQJqPTO2Hs%@6yI5kMFI5mjZbo?*>vA{B_(3a6< z@2o%N4mY(pco4{}l`2FXbz01dBmJA@8`1IUp&Aut*0_0ejiD*)0<|8awH~$L@Q9(T zLS;OtJu@DZ?tvi_-rN(ihO&Tvo-mWG?T;Mtq~m`dYj*PD7uRAZwKkK;`HoM$ z=aotYT`aB2Sf`KGP@j5Rz0YzX*12ihl3C}5&-<+N#^nj0bxubOTKP7ARG@NPEU?Z- z;&QVS{x9%XZU4_=^S_h9T5h1Ah6O;p&;4R=v;s2YUODf1+qG$H;c3~8kTwNBGoU%&e32(2_|^^2>cT{D}u+MXo5+v>BlQYnlH zhErPr#wRvyTMXp>R*pk~4q*u+sq&_g)G=|)+bfBZ7+eV9gg?QCNt4$p3jLJH0jc!Q)nS|6&as3**sC4|GNNv%3;87Bd$527 za0(}w{Wte}WB?`DKneh*iLKIHa_vMOzWyOh><>NG9be#LcFJ)vu`g-Ixdn-?VMdA! z$PP7W5vzn(wWp#}1gg={C=umgBw^7|!73tVZHJX4P3SFQrTq~uiG*K>=UU9e_C0c-M92j_%rl zZXMly42Y1ntxo_1%`0e`dodY~QwaZy!;XZ$_!IIcCRMGrVBYQv;Y@ITTg)1Q9Ab~a zBz;zlgqr8l9Tz7sDf>LKWNr9WqxmEpuE$P$&fCf-6_z~!;?We!1&C>6s0J`j1{0;v zPbAY2k<@cC&+;en^a7_@Ugl#`1b@nj&N}`)`;Q2QM1KSQ40~02dgn==;0<5yk*AdMGHg=Jq z<~f)lBR1Y6#Knofg0HLv8*5&Sz(zL;dO!Mg>3DcjHsQxNZ_giZ7v+TU6NiI`a}*DI z5D%CeY=zgi9Mg8h0ybch-47*;EW008o9r$ZW%n@sqk8-fdwlC1rT6&d*M#x|F9hDP zNGzHIyDC%th+rsFB_pc#UA_p>nx)l`+IyIyHF)H35c(A&)R^oeICNmLd)GdmoAEmv z&$Ut~wWE{#F+EF@Yvaqm%j>F*mg({ar4rZwK`Nn?;%7ha5Nq==K33U?H`HG`sSbNp zNOj=G+ z`!pS0S)I^AH?|GK0IKTFN;6yy5q7#k71!%*EoXg|xDm8jsJ)dF07QjMw_>nvQY$FN9-;y?neAGhb9feMf!atkkBwoF>Ux(nn+(n9)wsNFp<6uQhqqOu-9oCS^fmu zNyontb3t7jkCl7({WRMOxUxVTh&GF`0Nqd+Ze2OO{15*nI^&5a%^*W2=E<96lGf-N zeb=U7t+%sQAWX)U9d-sH@`4cZA0PHvJ27v%0&)K9`8LUQLUfl!4Nw92sMr72cfz}U zLY4+YcWZ^yRT3PpLMioHU~8oi!GyL2lFOsa9u$D6`%(GYnT~I*Ks}tSW_`)j{q++D zDmvcBa1HC`<@~K|)#6?Ddvb@^kI4)piEr3%Gcm!wLJ6H9ia8(v1v59IXk@8JH`>ts z+-I>h$V{CbfhJw)IZ%{uslAYW7Y?g2!5o;@d*rT2Xe*_!!5*80aHqmoHUGV^$??6Q=T}LxowvI?a3v?6>lo zj{otADA73SCnFHH*)sd%iv`r2DzyS)@m0Q_j&J)~)H-Q}wzyc#KBz>oc!Oe*qIq;n zZAqj`;{*}5gwGbIy-38D%3Gdb(@3I_{*}E&Zg<6g;hUryBCh)ZV0qo zCUwrS6@@)w-!hkBUxa&cD$?GSSl+H@aj}7r{hs9Sci8%8Fy7()4)ggcegtQsCM7)( zN>lpz<2&>+_#++qcr{K6boW^w5y3f=M&fUB#z=fli}y^|cu&W@N)b3EJkS%mX}Yth zIE{FvbUn-=-U(7bZEo4Li@>QhUY-I^lS6X?Sj#5H2)p;@{$chU|IYZ=xIwtUHfso` zs6SXQak2cB*kZ6LM;0oDZE=hHydz#=pZxhI0D}e1P?$vG#B#aHJqa&FdFkdMg41TP z5P+C1*ES9d=<&30Hopb7@~nBe3ZY%zr1gym0d)OSWc%Ki@-PO9YDtrAZP)}zTPGtg z*l*pD=e+bR$@ljB<7)q7d2J-?lW*lIpkid*_G5sIG{iWi09oh$TzMOc2}3hlziKLj z`GRm;f($+xU>?FkzTq!RaEyOK@~PvA89%Y{M5FgeEhM{}1cZ;}P242NC4rS&SLn>P zckW_Reg-|O88E{gYcMG6fO>)HdH)`op7`|dnF;YH!M8ezWn@?IU zTRbfsvgq90vQJGeP*zs?bc`V&tl;lYNd=dDBe#O<3svxQ3OOo(VPXYWvjPyJP6(m! zeb-(A>V3!aoQU^6Z|{LRQz$ERCy(^s6M5U7ucW79S?$qAo}*19<5!%qm#Q>;zjWH} zNYZ6Y#}{sBOBRqGGxJipU+L}H%YM?!hPQ>j2Lrim(EG>&=v|#x?gN5~F|3RKemgdT z_`#25O%ghvOz(Zc{&+uCOh>oezUQK;cu>^O{)=SHKyYRgR_8x`V z`-%R0$Tne+*XROFs~)pR)2drt$Z4{Moc;;B>~7r=N`E($<~JAIJ0FF%`rXC!#+i$7 z5%k)hz#b{T_uOp!E))g1@;Xt+P5=$00aDU!oUhEU*>^0h3_76=1ofvURSmfL4>m%3 zH-MKYhJ*UDq&=60<`dP9!BRW!(YCGR6?svD>G-d|X1t6?lxjV6f>ck3w5C^iDoKLT zW@x#>w zmW==N_yI80`yGWR5eORIt3!Pna5VAr{hmG zxweWD^;XeZ=5Dkdoa_#c9YKFC+R=zRD9tNz$ypfu4dAlG`wv#BbJy#t`>A-78q4e8 z(TDQ!F~L#KGY}?HTyWi?=Sxc6vYdX9^~nkuEQ4m+)qS1TJt{Mra$ARAyy)Ig5D z3?%)}bgR%eLRWv8?~4)YwK1rLzJLK8gStrRB)T~a+F<|ZMFjwZ2$B`4D6j;JIu5By z@0X{s6&yZk{gZ(U8qi^uPNeE-oYi~-t<=$&CnU3i>{}uOu;+bg0$m4x1{C$Rif#vYHzN?$hZia0WcZHvw`w~H9p3gH z_-MMHLi%S6Fu*#~@!sWzj!^f@y@TeU)4)OQTC_{C3scvkp;;;yx;fpa%Lm8msb5Kr z;y`U9Ky@uD2GqupK;6QlAR>Uu;A3?8K>6xUgx@g+y9AvhofqJd5lw>(y5uh`>+-q8 zxd~L!A^r&BOqJfOMzV-_d{MQ5SwuKY*HJ#RxD)FuznaUFQOnrE5L9|wNTWh_3&Ki2 zAW^DDZIT}OKBe@2Q}P-CE+~@d*<8Lu&iCFwPCLU;B-G*U!uFy*$|b40ablWA1^u>P zL-6ObL@xH1vwomRu)jhwHV%bl(8_wXq7=R{{~+2P^*w%LK7NTiQ`-e-Y_L2i0Gkf+ zB*R6BP!5#5GH)rr;(?K1HKhfBQz~+Rxc$dNUW499(IAR6nhd(t$?$g zaVL(xu!1-W%=>BG`uwwQ zMXU7ug2x%yDcTqgoj}E1mbn#o0TO>9{XMB_uK6>kTx` z0M)()%6m3ng}MPH&6Y#nE4{}qC!840SE7Xqi;%lrUcO$%iifN=i3H@@8IEi|i=gJ$!UX%V1QnbsBs>hAlZ zfSOzYsNRhgs9uW_1w;`k1(Bq$-KG{>DbxUvAq({1=NsSc3SmO5YO50Fq!UU0h)UMR z4e9u~Aw8zd=_^YMp@;}McBu3+Cn#$Ixs)Sy1hK5jJjO}lF^)SWm$P^toM=aL1!CUd zu?n=Q#=}GhZXw6`cAt*7?dS|Ruc}R)Ldeo+U%V*LXnkZGjafQ}*92?6Jjv2%Z=GF4 zqp9|Ax?eP!R-UWTM2Ul3qS2J3)M(QlWY@Bta^|&OXE4n?f(e!rzI6QAlZs$XNG-Hj zD7~RTo^d?dnYq-%4NkJ&1AT>L=$EChW}Cjc{c6)!N^flG64ZApkEY}QXbHejRkl`r zRduN{MV7v*rL(yY`t|+utU_O3RZUXbgUr2Zu<(f}z|Bpdjd^dsGtqyWBTneWTCN7~ zLjiPw5PGP?MTMnr!h z67+ZMrvseHtd5au)Cr7Z9PizA39Iw1qYN|`3J=Rbv(^nXIbuf4Qrv!k=3Sc6NMVeH z5#f-@XZZ*W2L?h~@(w80%s(-2?_1TRxp#9`FBU>o2bK$gvE#=4l_GlJ~k!#JW^=JF=3vA69q)+LmOk<&2TO?=wHNFBJO z-CmV)%8)Gg!UKLek)aKDdaeEcqwY)KqbSn8CkaPHaK`nD%IK(3gMtRnWJMVSw4+hu z9Thd68#QW_1aUV&Faa5d5mdaRvR;eIs_TKcf+hqA2r77@qT=ytkMTfJK~eMl|4&tQ z_w-B>*xmR0_8Wd=YPzedp8I*K>ZxkIE&BlSc_tp?Cq))iKPFPw_E2MY;#jlh9Dext zh(HIC4!`_Wy@qtfWcCQ7+kT&!kvg5C*+XSI=CRy6`I8zP55pIpp7)_9*&dSgm4Re0 z&f08}eX+0ASftx${Ad>O`ld;<52)bLyUD~I1v zh`5Ner1w#e(Cl<+Ue6>#m8058YwL)7jp3YUaaB@=_1v8Rjps((sd^BmtPva@5tDaT zK-Jlu8^;%Lc3|pxkgZM)nSLCBeF;ru$|uEN8hT!H!~bve9PwXG&%I;+mGq35HSaX} z+zSb_|Hbn8&h`JF(evW}LVD`;kI5h<<0GsLcM=o9CssJ?BKUz&LE?XBw1jII3?V%C zdgBOx7;jwQSVdGTLIV{V0MTGpunuvH$%~8SU3|lm08^1BRUg z_zeDF%+ddS_Djh}Ril=VDD6QR*;0^wiD8}Jh(jkf*v!Ft`mUKO;kJ!hQD&9fHW$B5S0CPfA z)ar>>RR8@``Y)GmF-WX1g-TOMfk;_u^zMhqZrVsoT}9oK99HfLQ*g)#&DnI|Lc|W- zPm2Dm((%+a*J=Hkg^IKbtMmgbuQBCB__av~fM~+}v1VbY9=E~CXWUzr>Q)s<0$rEL zDTc5V<+-e@NNiSG7`dS!CB`IM0xR2B=V zt!BiFKUn7CUufrULGY!2j;zsdZEvJl<+3@`nIom0QIRzb&UyS{a0V?U!iBEd=V;jl zrZP)vW}Xz65qHi)pRM@sd_3}!vYt1h9wOtc=Rr&=G2r8eB2(=tkM)%6O&Q>+B@QJQ zWw>*=U2!=DoT0=3ZqIsgeV&y8>xGmdA=s9+O(v!X{vmKuakf|GX z%oK8JuA51D%C*Nd(5TVSfo?)wnNgxxJ1$EG)@DYHW9yr^IUeK1pAQ3I-kDr-M?Eh# zrb$noYKLkj*&=pxKX1+x37e6~fPh5i{5lEjncm-yqXhb(_&I4yZkt3`bgk_BAEE0rTHkbPa3UNSW}IY` zJ|DoD6LxhoWM6Wq5+7OFm(%kSV6Vv|}j6EzsYifKu~8QBFTgCC-*n#E1~ zqWXV9A?lwM#+~t~CKKRsJc7NhHe-vPsugVXl$Iq*;(eZmF*+D{D zF{MT`rHrTT%I#Bw2AzLgPS!;Ervh&H(<6*=7HK^Te7vkkypWa9avrkx+n+{A#7Uyu z2!Ei~D8?HShtdKj!rNzP40-^U#>QYQsn8$qm)ck%9-QB%r+@Qr<4tB>s^|qLnkGNMu?n+TTiW20cD@TXeiugwLN)}>w^*;B4Ye7ZdWJg575RgmWD`o|Ts>%8P^w6|^LXIL= zvR25RJBVtB*$C;!@&s&Sq$dg3lq{-%O@u@TY%_s(eO><0K+Q4O(Q_0#hhXV=5I@TJ zgXCod!L&}$RPO4)pwRrCAR;js%Eqwpbuiqd+-PtPvCBXO41~ zimU@8s6lI&2v?y;MfIyMQx-C>z0sH&9-#sc5>a0bTv!Vv|9~%ap+A26({z=#KQiA* z#_&TtW=aWV5eJEh>v_v#PlW$MAh9eG1dJtga2~E@iSUOKZ^>nLS2hckB>9}=wVl}yvtH9yt?h^O>cs`+S!jtLLM1{OgRekY^+bD6 zw3G^%Y7a2I0db(-W>_UYJ;n!!Hip`@1#ZiFD%WXUCxAHXSK?UNz1BFPrPivOpY@vo zkPCte15m_2IIr&IjBrAp6`ar`84c)F_>g_&81(?y<8G9Zl|A(Uc&CRC^&}9j5kUju z!csHE$7=#)fqmS43Ulh)|5Kj1rEB`C7D!^)$w7|N0AQ40iJ#IOOcvLGDk@Q%7%)8qdxytOC& zi}22_((r-+SA%j#hRj?KUi5)~&W`BC^7A2kV-w`1VPRos_?z|$CX-*r|i+MC=9?U$@-8S9R@KC3k!5#Y{M@fb*8^)a8CHv1@%1RvIdSW9FuZ(ZBH~1 zZM7TUrr%lI^D11-g!=DfS^LV?WSG=@B%NQ*4RwQv>TESI2yVA5oK! zAHSx{G=HE!Mw=vXKA!;RhVT$?Xd<4o^i7DZO!1{u9;l*h=Lut@a2}*QLGuBAL;*|0 z36+|6?vkd>r9R8J4-i3b^ihl>c=JF5QEu|#} zuxPlZ2K)oVjujpX1T|-af4DRpJZz~Q&L$w>2Z<_yqv8XZ>JD*1C(v8|$+Oo^Smg>y zKfH03;RV@P*{Xk#lNbx;AmJ&eeTwg5a#zL7Y=@b6+|SRxm9D)+NHn;aY8c5CgsPzD z#rC+1w9GBCVoR)+<{ayVmoAw0!e!r{6tIF%tYY{r3QN>SApbsMWwl!|*a>Q9gbe{1 z(3EE4aqLK<8xo^fppT4TCv|s|3=nu2VxTe?kExFfuP5K=^gjV;?&l*x6vzbzWaQ)E zERB6Q5D-ct>qw$5zJ;~%WEmfr*lUr37OU?RheCNoUjqg-LUKbE0Jz-?+7AxFsIVz6 zbXxIjD}IvF{w4g49xILXR6Ei$R!fh`-J}8dVYyd;cqSgHh_(re0PGPW0i@eDkC)5|1{1cM0?Sg7HYZ+rKa+==n$M)fFKK_8d8+f#orv|$Zv3@ zL64(j*~wl?tdb1(bCOH>m7RQ8NBu6p)O^G2i(L6SBVtW@zos9L*DJD$539|wVta_} zNQ!K&1t-&Q$$|dGnMC-Gdk)4$Oh>uN_o({%_`z~D;$F44+FC|qB9B-X1+t(hmhX1+ zyo|ke%fZc4D3O#keR4wkH}1P5dkk)F|Hxc_+mFxc3p3llVBH~34@I*0hAT{ zj<2H$Hi|)RXaU<-D4mnJIHumkcjSCRaeHvmBt8&718`wpp}4(vEPmjAWr#m6vtsM4 z_?Q9!UT9&TQ2ZnmhhwYdW*Fhi{_N48E{t%h@y$-k7V2KfAs}|@t(;_=(ws-BGJg8k zo!^bVK*FNr97WBN0!7W$pk)g)XwaO|cqdbu234$NRa$v>Q_J#xN`vU3z=WE8Q^IF^ zoG+2e6V<|S_iA71$7l9=8XqvlqyKP(TK{pr!=LsA&ylq}Qx>r}2aDOTywdo{P-zUz z&9fRl-Iew@0+q#-bjruy-;nP51GV6NxDbe00Q>;*9D_GTWfOa;(t{7g z&9!GhRkd%QbELGI>jLeEcj{)f_qc+xi}r??_6k$r>&)KXvmk@C%xcIaE!XXYWD}pX z+`DC}wCt8DEmvMfckeMvA|vm68R(}+-MO1B|4@Xo42rOzB?D@&T$c&8zwMBYT5F$F z)DBKXZCgQ&IWj3z8&Nu933hZW)2qGBi*A}cO+82BTa>~t><-lO1nkNMI}|Dmno(EZ z-*3)<=I0YLq1k*!I-0AuFlfS4Lf?m`ph@Nd8&MfO!xFJ~#DS#58n#qIRhcj5qD})6 zu3!Ubww;fkzfEUre4{D&T3&oB_%!WXr72WPfxx(kfAUfW#J{f3gm~`@(-HqP*C38a z0Em~QAztPnjyMa3!Y&iUeS1><8D7YO>($Pop!%fYKdKw~29h3Y{@aTgkj%}9;Kae$(zdVHp8Kk@8H2TawqkH-QRqZeLJIqgWKfOn7R(s7x z&iv)&FJ#ci4X+-WA-Xzgn{=adMGs?iRCML@m($MOY=2o=-i8O30W%#wp{;$4* z;`wj-zf(7hf4@DK0m&)LG9h`u99H%Dzd$Pg{ulh;DH@;7?e))R8vi%iW3M;W|8>_s z$J3iMBqewmJ2;c4r&rYkP!9#nuNxc&e9mu}(bH9LWj7E+I!*c@V5z>Q^}2uN3YR>uQz|#OQTWP`@d^9=P%{ z#LQhMg&3JNdZDVBC`O=cKmCz{*_xsk+0~kscsZ?sGyQ#@b!Yl( zMDtT8;E&@BAvQj9VW*tyb7KQi!rVGyCg#@+#TP)8k6+$OkJt3rOnVtqBc?QC`PDx> z9P%4WK;Z9x`ElLYhfeIJ?!OCTx%-pd8p{mu4CxLY2m+8+*mvGL4>A3hb!9I#{uTdQ#&Ys|8I4Z{dQCl6)9e2!yr<3IRCre(qv3@n zo5;&^CI+P4pTlt1Lz!1|JnKIp5XQ6qQ`yNAvi=jHflgchnbrNO`6jOalxX}aiJxBo zX~?+#bFpvzr(|>1e=tq&uKEO}C8xWeNe;7M4k*SdbIo~UXK9@Y7qUKtGry+kXbqo5Vq=n=t9~lK##vv)5Smw2evP}nsC@gTrA|DHX?4SHm0u%WF~3G9 zVxV{Fhxs)+T|?#9NFs)kC(I{md4kK(@&uoOp@e;kw}by+eofs`LZ69W)r+*NArNx2 zbmqG=3To^$9o*zjFsHCtiweuLJmn`%SqH!Ftoqbh83x?%JdtSuKI{ARS%t)R(10zi z_%r!a(1lvYy^$rg;nLn0=_Z{A*}OB8wGo(G_OKb8Zm8qbG#8aIXI#PA2N)*V^@~7> z8v=;dW}MnzkLsAAPh$B-6v?kYzmCxIIo9}3AwC~-h8!SfMj``x)^mwD^lur6dBfwG zh?#$XdNxCJtsy3xl~s!IhLE3JtOzM&2Dys7RE_e-9ejp_^imbHG>5{;bidgTj&Y#9 z+pTI{2Lxu$Ka!z|B{%mqOZR-QRo7HMB z$H`R8TU>%mS@te(ukNsa#%R>ucJBHP``oo(cGx@p_(_L->k5>fT=5f<3hzbDY-a)0 z-(RWphx0QcNC}zt!rp+F=U<&~W?G=Yc~%TTx^mKw5fi9>ffM;a$2m!GkQ^9R$MGOv zwFNoL!vN#(06f#Uy_kJabETEIG^DPK9)*dfo`J<910Bqzky>@{p?>k&aRc#ZG$ud$ z_YTg%oB)Ozcoy@#mxh9K-o<0#z?6{zK2^N7?oEyriV*F?h-SCHZ@=~^iDNI3FI-8O zlnwXXpfvoCB)vAJ_kxTGH0={R7jwvu%t+E;8#{GfO$idBnJ4WKr?uHFn!AWcB zeNiPi`6HBqb9S^^KJ9@u_o1a*w3fs^P`Bo*Tg~mr??n33LW3T z^|OPMcV_*D)@-+fHhJJz@G<>?oZw_R%&eg`=eYQeCGl%>(Zhn0;tj!u`Raij4N(rT z${Ba4>L+K+-smG|an9kmnmrEkBE65vWzV?UY9I0l8PoogJxB_)O7IAa*vQrAA}y{Y zW|uVB0Q)zq;cK-0Tc8FMM5j$niopbFI31wfeeD zzKCcoUT1@i&Kt7E91NBO=j;r=gS(#&wYJ#EH}>kATdSMR?LA6jtCDXZgU{YuH5E}! zNxkebgGep5f)+|*@2SVL#{~7|=5|QIN9|MXFaIWZd@5gQ_M>j7w!g?X=TMmX3VU16 z0zTATxB?l>uVTwq404UHhUV;&=TAFTeZZQM^+~1;wQLAjEx!%52G~~1nrxVezJ=!a zPVwwaw|e&v>R`@1YD`2;%}F;gj1omb@dr_*2D6_}Ju%KE6?FXJRTNGG=@x)@J zUB*}Q;3s&WdAw;K-=AIUXbK)j(ovf7>xpUR`K3`u82?nNZG0&*9K{RZT(#*!BE8eA z6Q4hF@Mop52lHo2AH~e@0R!V($g(gV;dOr8&2+QXnIR3Z|L}=es6}vg<9;|w5eB4q z!MGBAF=yORD}Gg>mAIq;t|}+ka70hElBj~WD_#(67=T|TiT;0p0_KdM35;KYc@X53 z@@oOA)IC=k`_#(9*{3E5z*)~Ltm3zW*L{wC_@%MeOJZwF1~iup&-o8uNS()CGf?a z@}9PaMKJ%Ir1~7qSn+EigLq}O++WTsZ41yBdojSE7Y&j00{C?=d5lmkD|QfMwvG$? z=gNLcCrv{KCnAc<7oN)w@OT;jION7^TO5$SHLr>n2XB0Z*JI##8+ckW*JyIddYgu`Uq8|(vN{ZJ7uRD)-47Y`cmcX${v077C zEP|w&BEm0qBnlZGrC=ynTSL~?c&GB#-P(zRGWX{?bu2qo{)kHEefTCO6-zs zt>PN%=8D1}r11=*aJDR2F-XC2srACe?)YsarzGo5V`un^LZyvnG8g#ndSKf<}fF zij9FCa3=A`w%X-?6_0eHe8sZbpRjLJ#U6VCz(Dd7j=i&z-? z7lAOJwD_+``-5r<+}IRf32RQrz>n2XghNV-L@vv<30FDt3zR`@fvCbDR^uLQ_w{E= zO=Qt>QO%ggBY4r6$2Mb;U^&D**3mpt4JBV*zep5v38O-{3Xz1sLU|kuS!nP7BbA4* zb7>o?Yy{(FV-i~kcZx~;8?UsrD3hqnH1q%+h)L9QJ%Cx8V9|r9F^Ldize$t@A-HDQ zfHZ<|T8=G*RirH(rO!JXOVdw72l%ximz~V|2<8U9uRGAb#%wWqn%q8-(>Ym5yvB=P zk}sc~e1YO~$bDq5Fa|y!5U=VsmU#mPP}_}m3DjVIu*J|X4?_;o@(^YGR3=@ZP;UAH zfs7DhN=b8BC$2*5Ha_~9iSQmjvB;HXy#M=-dMRV7fc0<{@AoL=5Yz;e zn9idCL@nQbR7QCM@#OpH1?KE;#lATXVUG+hvVzxLhpS@zzAWi@xfEAB;14if$l(x@ z&Js#r8e35k`;u}=b&uBnet2+FwP2)ot7O2bW0}F}kKa2uo$#ZJ(;gXc8oK{x;PgvY zO-u%HllG?FFhnJZFHoe_M1B4{2Y^?9Z~?gg_H?4YC?^bT22sz4n-9*}wSME_HJ3R2 zba6kz?fPU-*L!E^diZ8^9fLK+$ojeu1n~_P;)0G>OX0jbmWs#nGS5O#i>MTGAwj$d z?@TYjj1+2W#n(F2nkmw#M6l+zbZSkNz^*du^vQo6r59)e{i(<>mJq??Ijo?jJaai6zBGlfC%lq0Up;W43@_%En{u57-0bndJY_kYBDk-(J4N%5ab$Y*v?Ur z6%Rl0*#sB_iiaNSiXFudQ33pbJ8}~-^6cC1{Svk`^?Xf8XoYG+kGwJUrAOX)TBmv- z0+^9s4(7#_Lb&c0r@~r`^%WE?f1HxEKr+WaOzMbcMW%{Ww78z^SGE2n#cS zEgQ4d=xG(aR@Sa*Qz5TrrB8)`a)_`bxMD`Q!!pG_!?9fZDZIvu5)CIb(jSx;>UOSz8c>M*$J%zUnQK*xZZf<a&Wf}HinB|yZA`_~)Q+JL*>coS>E9~G$)gr5G(r6~cPGUk!}F9@9N zk(h>e)*H{FoR*2FFQvSd!^uGlFn%b;^aP}@FUC}yY@j3&U;DPWS~$+bCP+D)S?|&3 z-hAc-VYhyuy%j^#CsTIo9}g+SdhuXwf)|+U<&1)+-ZtG-T|n zMlvc2GeLK8Cr`*acac1yhO-Vn2gwsK2-JosSdd|z+sUZFVI|H`pQgbK`(NecfSyFS z31y(+*Pp2cnm@3tPNu^vq_o~~j;qybJ^V?z>Yg`o3x7k7EGyOn0>$^8;t%9gkGUae zdd!_?Pr8vLlXt3PZO=$*uu<*oEr;F3RA_N~jY(Pn%W$xO%nT#lEj~IzlNpbqcydGz zyVyc^4oy&<7do9oUt~7QIqV`=Iot4@AfdR#tg;x9uqzR|vfDT#!6Pj(tSBmao zaAof_#iM(v`0FGLYM}qfg6d)0v9S&R0u@{bXo!>i^!QX==iXHgd^D{sWc7eg6eg&#*B+6+a z;%nha)q*hE2uhRFPI)tMc^7Riy*RjEOYpj@q4;Pjgu(9k9oXg8QnkF*!wp_OUoMaG zUUpUF9;gT^Va^_Zm8@#1+u7-uNKk_RIugk^b*P>=Ydvz=agCJ4-51 z?pR^;xvnf_kh}d-D|aGzUt(rkz)canKinXKx25{(p}u~L$;F@K3;n12zug@Bmu~6s z{@CmEsfvwJ4rM_hdOYQHKnvJ&#;SiqFhZK*x~#?aycl6C({SvXZFwEuYZTq290$Tv zKN8`Er|%8tiC{Gm{`u#M*bC{mjcF8vY1cdg4m91k3mKP!F_u z;vyv|E^wfPan<`(L-vLdrnAD{xn@ZW2VQV&p=v zAalEN&Y`rM)BZZy;C%e;|GKM#PkQ_QR%L~egagG272Msm-(=cH$RQYmT4SL}{FRIG z>8`Q&(O3kHsiPSD@QupwJSW)A^O0_z@1NoM4KSqY`IVnqE8B^U1AxE()w^i=z+KWY zLL@DQ_7h6M|0`z{Lk_W^&h5?mfK)7qhu4?xpoLA#Xs$gY4?I_+Wv}nHSL5_hj8YM8 zLA`gw)G!7FdoXIT`EFpP0U(v7Zv)ga(5eWbTB|izbG06;W9!#h^FbDVCRhXBB1jQw zW=ppjUMjZ7hlzXCih&c~K(lop>gI$`IfVxdf9t3TT6bFOe^Y^`bP0tmW0&n~9dSz2 z@7duLdXZd)T3NSbrq?svCVQfe1LaS5=XsUV$r$01Uzl_Uar z)~_RRCJcBBWPy%=x--l(xB!~$ZVid=cKLy?G)p909wbH}(80T*fVPT4*)MVh9G{2Wg7CJ4u4#2@nm;5!Hs zqO-sSu#|=nsM9Rw+S>w4;*5CD+{_67>YX+GN`L9#b~}r629O@EW3r80MtIBMEmz`p zzdw$mCq75YZ=))_=gYNy{>(6JyU)+$y{$Pnrxo5$ud3Ak5C!#&;UVdd5ja|rknYUa zajW0exTTxN&+X2|&vhxyr^#nu(|#G{zJf!+N+QlewJD61LLwZTkJV*hDkS5dklpkR zZ8z84!A>wuoD{X2)}s$(<5gB~%S5oCRk z$?3r+tR^EPyNp~jb@opmIzP0pTjw! z)990-X~>e>*&57jGbX;)99ELRoQb}_H)8Hr0@e#4Ek6^i-B9mrq`I~kN>9BF2DsJ! z3h%Av@=8{Fv%N;jWVieA%WKv4Nwh57P%m$~!h zPfA(Mms_p&j0tRManCz&ImQF=Cf3S+$>(h)FtR?h8iqI1y%dV(pf?T2>1;R%-tc?iewclu_8B4(|;$l92dFsEdrnlc7tND7;!@(Bs-?$?4 zOsmYB%KWu|MtAmAe4^`l)2`<0>$WlSptpW-oktc?ClNHR8UH1|YkVJ^?srN2+#c~u zd!Tf#6+Z?{x*9Rb(fB?cUUM^!%Dv=TH32AR@n+o0sT!LIK0#>|Y+`go74Yw^^kH86Q^EeS}5B!>p zUt40jsW$ZItz^@}in_NzjYt+ZDo41Jrv2Sm?{=k6Y~N3h*;{9#N4-GuAEw8|s(+sz z0@#0&9@v?Jw5py5PXuhVEMQfH?8_CNUC^vp`FTEe^EB|tcwPUZ>$_3OKgtUo8 z#CIN8B^M$r;J{RUOIAPC9c4UCU44VK@nQXlDHO2ayAL`*9tZVb3}aYq*X{@dXXhOP zIhA2FpvAlfBSI`c4C+|qR=VIS?5#?#ln8%$@1YrPuxEb!^4T|N`~K%w!xDN@>xR8z>^(;c zbO&TU3;~t-hofQ26XDCtiu~=I>2GI?uG*Qc+L_c(jTr4xm3Z%Y?vFIn`FmvZs&OAa_X*A@e4k0@-I^pH3 zSkbJ^*sorpQl{u?YW;w$lz6}aJ(y(Y~dhNr-tz$`!vnS+6njCCrxN>`K#%EMBjJSY>C$dw3AV(MM|c=Yg=wf=+H z*ICIJe;kx=?|3Yk&qYd+OOP>&AxlT?Hdc(Y5e$ zmE_pq7g4Zc+kzG0_yP(!#b}r`B9*ygOz8>rr1IirT1K<9nMI;GSC$Q>(Ak839x368Px<#ZQ^xE2K zu;Y!i2K%rbMC9`3a9RvCfd%1MLVBVr%xWb^Wr&ZVH!HM%xV^Xb4^ImE9-jaST0&aj zLo>ZX6{Wn&l(CVD{)D4ewbl9vsK|qB3ULK7!)$RdN=s&|H^O$-(8Pu8pVs}SxVG-$ zy{G|oB=gT|*wL#uHo7(2|AeN~(5s%&4@`rYs`rl~DB8-@5|kbP4Ny!EG!u=DvVP84 zF}wf-xoy*lwUgtfbKV*@z+^qtlR!L^KT~Qj-c$Si$qgE=Idwk6bt|UjnfXhn>n3EJ zBh92D84qtg-w4>ZBR#kVZ>+|E#7~oW_`P|idUHzk#4uLJ` zk|yuci{w3GH9JRgGl_7{4VvZq^-z%Y!wwu}LvE;l?519R>v!Sd_Z0n`dWgVCR0nx2dqdSRB3`a+aWFXPoo?9lXxzu9 zEieV2&Zg(_IE?EA$#4Q5+ODuX>&Rj9z3Vw6OAEip7X@Bu* z*UXl@X~Stroz^dCH*Cgcrb&vyThtEi%Fuir^D%cI=Gz?uGihHog7wh%{vBgoGFfYG zb;Pf^w?Q_cx&3I}KmtoK*%cy)j#qQ9O1moC?s%({_7Q-Btb-b0p!P zr*vx2lKVizlY8P1ROA9i0Sz01wMTbF!8lq=i7~(2A%l8MT1jbb*w76-&ha;P4;pjX zF_n!Z!g*aFa0#kF%WIJz4;0oRk^zZ5AAfu^uj3t@M}b+4GEaPC*3>{$iN5X6CAS;Q zU|0`v*MV4sx*b)%^%Qas@gNlf@=UFOGeeAmh|Jy#Z`~w|@PIa)1uP+ecV1+tVRYd` z{IN#IA3G38j!$Qz7MVde$asUckDrv-L$VRS7IQQn;MCFj91oyp=<`tsDO_nYp97o~ z1hI_o7`e=f4bgEIFcJ9k?42>8Z@M&`s2OI(_fw+{dR;t0E}Hd@pWs0_ac@x@fEiT$GmT3BrTsS~)CH4piJhDsp<&oqD)n z6$wb+kUCAZ@jZf0@_};VJ@Qx*?}6vF7S%n=3rz!r+0Nicx^Ps)WEkjVn)` z)3Ac6{Y%ZLn3>Sd$1i`Qe$n)VKD*p%2;jt3^i9*42oF6#%jZ!$l7y5`Ug^TumGKZUtc00Pi|#Av$aLRh&0SU40&1v)i3 zl8Yun(nLIb%ZsjWpQg(Z`?$jti3+40LDf#a<%EhdqoP(#K0_J-B5gnXt2b!)0Xlt^ zGYA#0frNd7>VdBN2KN4td zbyZ!8uLs$O^$;x&&)u)f5xYX3e$H$pF;(iF*EOdDyX&!(N47z}j6mVQCD=3jIoTV{J46>FY1D#( zQVLfetQdq_IfIwRtO%qb&k?O==*dH*vGei6JESXkg9hG1{P3O$c;CU&oe$nWDtLQ$ z4(~t@yw7vq$`A5bLXR84QX{e8 z#^AqbZj^7AsxQIDXVE(_{1Jm81ci44m@sdT3xfhDw1YyG>*$P%d9I|*#6tz5+nEW?JMe#+n0 z%D*up%FtFD;8Y|KFSAq@R`kRh%$^>Lg4Z$_7d6l^OaVH2*>ofj8hap~o0gZdAQn5% zUhy;m$j}I`l_|S|QaMXSX!yH-Xbe=tYF$laOWKo`VO=;SIEF2Aj!!cpIf$ctW#5x; zAuJ**4{=`^Cq+mZ0QD!-D~xNQd*1lpTfOMm?E_BHUzF0gXeO6j4%Tq%@- zkPaj&Al)^MF+cyLOIgUFhq7YTLUymeE2OX~6x_q9`;~&&_DtYW(-}~56e<8R4053T zbN0rM3vZ$^pNXw{2y@E!pz|jf!pucf&(H#M3i4rji76+-{qNm7V8uB9k5^-+I-y&3 z6{GM87V8-26^aI|Qqxt{xF>rRol!#{v<^nrZG}LKLW#LmKA>msR>;FM@y^P;Ft;PMjXz_Hm=rTS(rP-!@!OlZwg`r{mD4Jly zBk_F>%eOR8DAn$Y<)Oz(_fFdav%7>M5#DvS5id;73V|Kd(7E|P9_E9^N5?*FQ zC&=uw4bC*(2B-De`2ioZD_lh{MVHx!rZn4>FW7mQtuS<%4Gdjo14D<|yBH|CXZ9Ym6|*~O z3(W2kibVK;M_pzs0(Z~s#~<@+_8)g7CA`e0hXafD8188HSdV7cr!ad){u`&~km2p>4hWxpbJ_w0Y-5kLF; z??9?}*?#~L!}{s&4*OSmbbSrW9>X4Wd0)!-xiP=U&-gwDP>1oenmmk``Yz)qY|jqJ z`1^NPhFvx2Wqi@!{ER=Xixzidi!S4jO=%YE8iJAQ(G`Y<@f?kKbR8HvEI+_N(LKu# z)vsgdq%APJODGcIqaJpdt?1D`vlqy4#B10?+mRApW)D%!KK*|j!(Q&u^$MS^H;c@> zLEIAg-I!nQXZa2WT!-b)-sNGr)OT5aIbsRL@+V{g$290=`N)U-EWeiExP=!OlcOYeT3J;?`Hkm1nmk>m){CchuJ$8yfm&M&hKgK+S^j`y z*YiB89`UJqKuF}OdanF#%#ZTh8_5kcpgOF7`8E&hrM}Dh5d=wCzp%ezy=u_Q`ZNFP zXZ_eNTKqhS7G2g~p3-bnzToI#y~5K~b%m$PD21oP`r{2O-Lw8=8Cx{vciAFX-z7we z@Ti$C>lJOfXZ@vC5SxO?vYa-W~O%liUwN3l7{ z3^ca6!%=KoSjU!U=dWei!{}-+qsKB}tMD`W3y7%lZ(MjuFEgwfy0vW#ia z%joOx@iY3NE?RtROSI^!^j#^`8)9S4cX`u#t1;`CgSMYBGX!g@LP%Xn_)=0eBI{7kPkKsrp{W}1gZ zQr~6z)&xeF-cMG5OoLvgKX9j?=`C{1m#l|0DG1yapGFp~hv{>+RndTgvngM&gXYc> zESvHbhKA`f({4B}3mOi)?=etx&+hwW0MTh%V04#IB*Oo=!)3Gryn99ul1{yhz8`As zG8)E|jJ|k3N5`jl7(G3O(KB=sjp4QXex_$`*~5uS6K%X&qd?pc3;bnRvR6ed7BI*ve=tiPkECXUm+xMS-(nt zBe?UkK5jsDSU&)VOX_t>EHALW%lagu3B~$7WPQjq=wz9WV z>lK{PTOaEco-XSZo<`Yq8mi0szZ+P(XZ=$$iqKiDXu$}RqMYm5yM!naeqn~odWA&y ztUpw`_Okv8qV2FA!&kDt`VGgtS9(}q?PL9PAM5YXte@^@{d5DW!}|SV9!5!hm-VlS zByi@fAgFkx8uYUM#asNWUyaie9bxjdcokc8S-)~CZ?jGLf}_XCD?DA+D?D9BDLfrh z|CE8Hd)7ZE!wQo_-ARkk`Ys_#gqv@6S+8i*J?n?)t_y{_Ku(y{^P$1@`arS>=Yr)b zNU=m%trl;Qi#QiQnK|^u?|UgF#rW_+7LjOy%N1yZ<&gdPD~bzw?f)>V@(s*c)GPFR zvK&apxj#u?x`eMB(d8{!4kWK)TC%=$0@HkT`8($N29l@qOJ5p>ykArP6uG;&eFDGq z?Lj}e<=5~|58OVOU;6g0Ke*)<9Dsn^gZQOy@9@1_e*QbTUC1wed#kl>`AHm2iKn;c zm%jZ2a`;U7HkJd)-kwYU)9&8Bp5;I?`K5d5jig(yWjT=i0LLYp24DEXEuYPDAo!s_KACG(#LLjZ4=qFU+-h&FYH32CUV*as5=w{28cz#v# z9Z_}J3(6gdz*N$(tMRZAqOk(WyQC~p|u$Eny^Ui3Y(&*b0;pWM;FYi zd>dpxlapacy$?>>Mf5Qf{(m^bkH1a)HA={1@z7xv+9r|3WHoH;Q-gDgGqVDx!8W5Z zGmY!8F|nvB6rIb zpNIgdGF%t&C^v;J#N(hu=i)I-dpRQ>NEw27NXn3lY-aHYhRk=?k^BM@hT?D&H8ETk&+)~TpY!)30n&8z+DR6OnyT@pq}I?^3SFk0)T_u zB7mFVuk0(BnqM!~p&|B`FDTdG=1&D1KcSn6hgcgKa!S9-sL+$1$DP5i4_-RBc}Sq< z2rAPoX-SI+@`p}yHn&h%%n-C0WeCm^d{J8iEW+VT{T|twi|4_@*Is z$Uljcd8HqMRP@KKBL+zxAiYL38yTB*uqW|LK_KMk3X;#@&fu?!W167qCLiJ>~)DGoR93 ze>511s^(=f@3I*l^yYns4E7XQF{EWer|acDw+leGLTVKN+8@Pbd;1r@_F8~Ar!)a? zmoR2;28C~7P#7`%8hovJsc0MxXv4#2-q?O}qv3&7GF?dC4TMLL9NJbgdWG8o2 zvCUtZ3Wv9awKdDlBN*xgk~^rcrxD=b5q@0#RQ|L7GLxT(^F9Xd=AQQvk+M4PBid@` zAFR&%$i?L>`{I-EYKFl_fs#|hJp*>{X?R`3Nd;R3?0de<3D_HE$QdAmC;DHVWuG%G z7jnuekwo~HiOlClDw~Y7pUHtuPK3w(KGbKy?MrKY=Y~9TgLzP=OG32u)`yTiPqlOK zN8rc;c=?a`iUI4aY_njK9w zbV}bVFxK>>#ZjD$q_p~FmO_OvI@L#ds(+l)`U|=`Tuz5meS1&!M^ma#)zyibQ~e80 zBxqpbDb>%`)dQ&ERG;gqJ|w03ex^DU#;G3jRNpS8dPe}LzCg(FnLuH79y-PIP;SaY zFXJH_+5`iHU`9(r&nbrD3`^h*M5YTU*dg1-6N`J^7*^-abp1ZL(l)Kn5oXe%0VtU4 zUCDT!**UxEag(od=jWNNmM6HU43TIQ>A4Y;6WzW{j}qE%rG)5@-`>n#tl@*>b@HL( zJ2LSXuPTt!#^5ILf)Bj-6%k7b{3TAu5fle7-KeG4(Hw06S zs<(z94Z2b_-x+*;4Sdm*_YYX^%kDD;Y87mbex}kCs-*xHSSn@Sg38Zaf+Lzz!_!1~ z-zGQ(XM@y-vOx;@;W(gxS0M`~l(mQ9C^^2c2m1%)JhBqgmTauE&tF23s^R8cK8I+a zfFv%Yh=FE&U67Em~$JR)o(&?!f_-A#~jc7WQ9#L!E9 z{P30?Z~9_-eG7j9(gw zU4hQ2%h+LW+hfwm>yXsn-s+b$zEExBZ&4^z0yv&a`Or0ZF&@aq-LQMhnVn%P2Inum zJsLMc2${tOF?!VO_Kz@A^A>vb_g7{5gNf`6{#EJh>lFU}ragflU@Jv|!=M7ah_IEL zWW)r7;dE>u64i=iI-f_2b~^$8X+zjUVIYi4+N2AVnETAtxoFX9lcx?Y5kv zX$IK*IP>-l`3PPV}8i`1uYuu9^m`-6m^YP2$SI=vGj#>%wArZde&b<^p zu>WXxSBYA8t;c1;Aoa)rJNRtpN(8+pZA6=V91LGSo})uiqi};R7uqW^NaX_}78S4n z92xrI9b(|E=6s>>4ik{|KrenK4cvhCxH@-izy}D)4&td&H-4$q;KUrwzPwcq`?ymR z6y)i$Z4*9s@&2!c4Ej-Pgyr(s?2j*cN_2ySBwwJ5cfFX*X-njP3RqiTWr4{ap@{@V^|HP1zM80Zcq-t6wLO?ssKs)9wLd(;U zz-Giyc;kXzc;PsVGtrIrq6Zay>dBRm9i5RQfI|?;uNcmlxo0LX3E;r&TuPq$MbC#4 zYT^1d-dZ?f;>t#)pSkvN>;<%d-Q`41am)BUV$1NB2|QX9KUtcHGS+=#KzkP7LxYh# zN3?hmMf>}huRROgjAbQ9;!6`G4gY5~{ubL5>5-km z{eh-^_(O7t7{#xO#497k-_!QnJp53GT<^9YA| zeO1LZWC?Hxk+h(oU_;ZwwsDW2H2j}7@{Jyf_{NZijnQ!hEF=cqHyv_@-=nw2X^0UE zZ#@A(kZ*{P{Q!e zgOxR&sw)M!{_BT-`BMgd(zgij@WkLZI^Y9ZnQLP0%3}1^Mhl!{%Zc#kziOEOj@NJU zLBJ*y#hCGM(o>l4z!9>a9j(BE>h{kEcu_Qj^NZw7otofUwF2!gq3`jdV*~T;X)rcy zMEd0n!WE|9gS+b&bV9rK{3|o{+xCqU1UV{=ekn}~3YTPldNut+(`)PqXKDSJ{CYf4 zYVr!=^VGU1;<1^y&QE7cX@i?b6fX%TwuIe+O+mmPAGEGF7Hrx_6fX-Vwx&6Y>DIB@ zEfzhdS}%Jz+FY_0HuJ5bin-2rw&X z?>hOd4j1ei74}0p#Q%!;(O1TMUdbLfe|Ah_Af`m9!qay~zg7(eiHKLr6B=v4MhnIt zMr!;CAmGfIE&(et67a)D5)ku=F3MgiR#JG2NY84)+a({xjw(nHgNE9LIUeAP?I%y zbOc#X{7_RX45ur|FNveXe_=g;Ch87jL@;fUF4f>nZ$=1@IMIkgI)(SJmcz%D0!0YHngiVsZqdS*Jbl>Vx)weWZUlb?g9F<|%q=+FlR%hR9 zYUuf`zIuKu$+=?fJd@`$R0t%G<)s)RmpAYlE8qwckYZRAk1bR0!+O_R`LnhD-Plr6 zilm4&i*2B&SOb<7zY&~vdJZth`Gogs`7~1$u{Ro8v-MH3A-koXFmoOYT>xc?nP#X# z9~QZnkbKav75D~bkov6PBsJg8*b==#MY-aDH!}`c#@pkl6!CkEQkbR~#yRbA?o2nz zr{z3gjspYsQxg?91q27)mHs03s@1XBO7!ouIA;)(H<|^eXHsCZV&9PmnIOs*h<MtcJF11rjFy@iJoqhf^(0W{EaMPKyHBwh*^E zWzs+kAsQ?#s5%1Pv=n2uDx3tR>ZrTmJy#zDY7CgpGf@e}q;QFzE^rF1~Ec#U%K_p!STHTAKgR0c6qYzXpC$MHGdW<{vk4)K7YbM2lP0Ey`{ zGZ(5c7{INR|Im{Uw1FgD$R7O~v(=<2ee5~JUzi4}2wSs~E*DZ$z_fgj3nI1DD2EI7 zBiC<=?%L-g$zKApNAA)TaMY?5hs3MbPKNBu@JcXZi&xNq5;R~1DDYJ@P-T_(G{9!~ z2S-B36s4}}fvkaFoRiu9fcMIi5A`4=E#VZBGzRC?=xBk+F8VhYbhB$T@{Ip@!aKDtiJOxZbp>!nvzhM{V0ww|NY zN0S2QX7-}kCPl|e=qeD?v2N;*32;)(O@9YFqk!Ejx0svZ!lzRh(-?D85?fl*(NYp? zE{VOa_1a}!stPI=QU$L?Yh>(n;u7mz1w}+-qJpAQ#7$ICWj2wYinXGMLT&I^h~0imy6}YLofu=%NDN(Zw&2WJH|ni8JP#1WHH^K_owM zshP!?`A+pF9OZzo2ou5ZdZ{QHX&4OAw6{g%)V)KsUqKE&^Qq(uEqTUYi4pnDI=<=s zu#Rt<*%<&Qc>(Vld^K#iFxdDgnAou4;$Y)nr7$Mg$ZhHk8%75kr=b8_af%f~2=gKm z!JPreSeD>B^z>OmNeGT1tj3z0mC*A$2o{5l!_f$~N6@Pv-Algk82L?=pDy1z5jPQj z#GE#PiAHn_s@q4&o>_V-2qgTqdA7e;v~rp?v1k=EYa#pk4>9UOKK&ay`w$I*-fZYM z*^`;pkmqFLw8s9Z8r$ZF-2p5*MCZb1G0pg~N}%Ups-DNOpszfW$PhE>4~J}ErbHE~ zsqy0u-DshGRv`{Jp180X7dSsQN8*35;y@(eJFI|z5mqpePJ}Dh zbqnfSJi#ObsA#5=lmek8C>LZ1U>nRdnKwLFe~0*O&)?sLju*W0hvevL z0f->avy+Xs2&Y4o0(=-+=b19jkVKw?y&j8Lgsz-JjbP)SFa?WOUbnRbC`J&R75aOo ze9zFQt-t`vZ-npqTee}qOIZji5ols0BL&bmfF2DuH?X!oWgl)BzaV6}5G08`A#I!~ zf|yoHy+Qvx50e(f$>5~E^jy&33h9l3JWX$W(4DLR6$cFm-KxuZ_NTd=2{5hbr+75E z>TiTOD;yJjgbm~`1NI%Y7lNVJ)TbxfkVl;`WdlV9RvnVW=m`YQH3SB@Bs>E?5*>nN zqklQ@7$bWSduqP)j^U1Ai@1#O<$z>N&T0kaa{WIaZ+X~j;&-<+TM?qA2eBSa>WPhUlR^N!}JVZ5~=4!D-jp!j>HTKARuwX&Y>o5 z7Smx({y@DjOa-2l6Us|Q<=qQLC*ipAPfy)dM=l80~ntIft z9!B{?xpT5E5gxh!0NlXj?Cg0odz_qyK`pXkNIXyn@~WX5AI0-97ko}^#SOAj!^&+@ zaWeSM6T6KT3RN@lo3Q!`v_ZfqPx*+uGOZGyM6ikE* zI@lrY?ZdY!s^=v?g{qotuLR0|etvbg=I2=GvqT-}cP6pNhcL`iMd%aa#2mtLCzj2 z2)Q;@9s#%UL{!lmeM5j~N@H9PN`#NR@6a?;DvyaB)o~7ZspFi8-7+A>g2GnMB$QBd z(f~{u%K&VsRwfm$QQ)-X$ImM4cmw?&Q%R0^ZYcS71H6!ZI>T8Ym&qO0OP>(8rzF;P zXQncMgQ|Xh_P6MjF_4!trwL)Z1$4W2iL+mkbCr-%~e>WQQp#6hWwrTkVb99^}=~4GN=PSSzSY%F%!1QuC=S^gya~{?Y zZ`GXwFM5Fuz+@!c2~gIZL|Q)1#oLQVu>-S8-lgPJF)CzK$=6#3R0(%c!?qX6(04!~kl#BZnXnshyOv4HRM*soa~ZIC+5 zZDvW}C*A3ZL2!eDLe6Cr67yEAoaBe#2x@vh8Rhd&w|V6ggMwx}VaDm5c7t%MmNSy? zE;-0==wMqq9UZ)v?>BQww3L)PqJ`=9j%5~>*&6twSMn@4=WM)#{t(-aAF%&>YzkrE0{BWiuF*HxJ*C`B$~trq#$Z;X|38E^tAu?7jX*gK`Rw_u^Nto?sQPy!y|CyIFdC%^H9g8ex>zA{o6~a782Q4J-B@CBI&( z5cGLk>FTJhF0>)LKoUP;)&Oi?Y*?gIiPef>@9-;ke%K-T!k)in2u$p!Hu9pYA8J2e z=`GryNmhsjU?5Y7woIYi6e>)iQVOs(Q7Z=9yd^g5)1<(?KuRby1y-yt(9ywUuKg}v z>q_f{n?f>evtcG>@JO?T9)0aMbdsOibh8&;-$Q87B2a9(OoW^zSVeSh?_Lcspi${T zfkCAj=Pa0Mf?BRMO&GRW^8#xksRGVDx*$U(JTzWtlNm=zCWW$_1P?!dX5XaoEg&jF zau$Fljk>`TYNzpp&Piyo6JjM?i?Ch=04QiB+tTBMQqz6}_&#y-E&(eBrk*B;>FZGi znyeyInE=r*YcEyfAg4xR&|J(P@ixtb71JY-nmyD}CIAAuM0=C_4XAM&%Kh+l2D28SwHFE zoib3!t9kYlJQo2!fqUw-Ng_PrR8|Km?q2#P_uF74+H^hmeckKawQjF7K5%+XUg7ro zKR>4TTHJZBFP@@%-7~G%RD?%*y57<4`U+3imuBetMIJnq8Q}*^*N-moBb?gx>)*Oq z-@DqudfnwN*5Ce+j`i@)yS7i(SnuCW*XMe=-ox#Btf%Xm3|%kb`39M>KHPNuOdIQj zdrA*r`<4-H7=y_Xaacgovc?>jX3w#ubJ`?_=*4DB3{A5PLV*jEA4_zkHHK#tvH zK(=-Px!429`56G2Go@3C#0?<#FBXdA7(f=t6v?JgWXgLEMLxL9rO3PAr&DB5=YV{F zqNd1>1Vm*kd+k@EF~11M>X`ZOsjw5A|F&{r9I#eWhHngW)TH)0>oIVuFrZ=}`;9C{y38h4+S?slX&}fA27{Ib#Kxe}){1@eSEq6E1kZB6fo~Jxa3#Q;9TA zdt4o@p|RPE5bQ^T4cD{6WnV|khDP{G7$Ue%dvX-<2=-UJy|-fe+mEto8ZL+c3u3Tf z@57@sbeL}`VGJXgjqFM75oF(WjT}@)t;B300;f6+6&^zPNdmRn53XZ0;H9U2-{1|} z-oibfiSCIl`iBoyfK-S*wGVz-4TUOs-M&U=BTM}v)~}Z9=i)k-smpl@&|{knqaMb+ z>&ExtGU8Y;whZGedP%)qD>!L7EIW?j#l>p(;#s`d%q$f=7O{d)tRf@@R_qPcUT{(& zYJi9@zp06M(<4420$73pUWMp8?CL+0f->R6mN4cV2Uo>eCdQTclWX@IrmEm4t}DdQ zhP~%$yzclil=NE4gXD1xv_dZ+GBUDEDgg;TfmBRXVjpY;u4bHo9lH(+ZK2)?6~% zPkcwF55s1+#}Q_q$}qdFnWSi+;ZGg9g;UV#X7YNJ-TN(gtRs1j+?NUbO z%U4shJRyo;L}>Qp9WGN4ftr-p7Us!pU_?j*s(`tq_0l#aYaj_Dpavwv`Zw}DWAJ#) z-+z^-e+h?_80)65NN-x9;r#Wt*Wa`kA>Yu9YES8>y^FLbL)|*adi=@|Hy{QlEkJu3 zVMK!*$EbY+Z<{K$bxPo)4uMXjupa~wk@5915qRPIAI}%QAI7f?d|!41C6gfFNlT(E z`?+t)cR$f)8lv4EoU<$UMIvuZG52bb48`1wQN|F0D|>D=**=*ZDAh!Ok`a_iG(Ww* znymSskzU^{B5P{^EQAB}QkmkxNfSvgu>dYXPE*=X#iynoAX^HN>`NMP(j*>^oHq`m z#KZX&7}Hf?^PB>?#DDu!Zq)4n+`%8YR+-<0GvtQ&d7jzX>&eQ0o;rr{P zuJHYRVPMnB@EzvGx3EI+8lk ztgB%l7O>wv)J36ZO0@~P8qTXlKBTAG=Q`F>n3n5my;&{psn(WKZLqFJH)mhysWvO6 zS|44FXENJ|d#c4!s(s3Hw?GhCq2At8?b4KL^H9xR&)kdzEH6Tw0J_(!xotX%dkDN6 z@sp0+65%_~RRJAXiUmHYP6v4s;fja1IeT0n_I@n9aTRKze+YSpecK@}34b|`kE1gQ z2!?1dflR=@(o^mIlxo}QY7%Eyo@(<_s(piVx$G@)SmWZJJD~q;Bd}~;eO&oh@mbSE zZC~I@&xlx)-mmG$AhyUkZv^U8#G`I_xuU+^Q!KU{h%gEhr=q?~px>&wRv?^pkaw>N>0syg4t6BdaIPE?S% zjD{L*P|zr#p`s=VIB3*Zx41`JYZMfeiC_f`BoX2;mMX3I6)UY;(c(^#R#Y|t7Zk+> zS8(ke8E_lmlWY6wNMju+0 z4etpGFImHfc^`$iMW4mgr+E1(%zg$Jz@zZn@G2XS34gz>ga4d^a^QQ_MY-@jr7?TU zmh1OV$M?>W1sKcrIP)FD>hygC+bP9$E_f$gWB7(O4ed;1<;JHof-?fdI^q4)#+Bb%MpYaTZHt3g-UXAzimVwrZJk9d#zhc6NTE&`P8*Bg|`I3nlXTPHELIf^Zl^==aV9L4UE zKVuy8#g0@B;+^;awgO8=YwSLj>~ZhgN9Ub%Nr5-WqcXxs(HUpNniof!Uq%~f|0R|; zisJ1}j8g+u@E>G9y1OeR5nc11DLC)BTB4Fw!-T;bAhrQrS#0pjV<$mlqJP`}^^@p7 z_IQJr!K=pBLgt&X8e$lhv~*^+3hPR;&I!|vVh|p2L{Va$(9~-@SEIVYKE|R2d<`a*H4D=Bm#_UX5wJ7AKH_RU@)}4$H@Fttq>?LL zEz-T$Pe1S%QSQF&nUnYKLUv2oo_){0oC1aQO z)kPYTEATFzu^o7SxonjqMX(74EA#UA9(K`VEq`16Sxa4)$9{bCpR-!(3RYHhzw(rW zQBH+L`zs{a?^iAPGwa{O)sH<`!HE2Z3604nqpRPxc_}?@l2*aW{GjfOt?r8pR#sZw zl~#A9)J^;X>s_w}Rb^X&cuz7Q*oqbiC@e$cO1Z`J(ANDyV6bH}I=G%|km;6Ueit$- ze|C;jqTrmiJ|+#Zf71JhPnc)Tl>3U{KC`|3erx!yt4b(qbMeIZ7{*TkE z;RB@S;L2YtQ3*D~9*pyJ=qVpNUR?}ck!N z(Mo-^9*SV_riq7Qhcm1c!*Z323!!WgPdWwUhx880!x(;~@krc_Nbb=IGaWk*oi;3w zVmx@$1oWaV2DeT?_b2}c)L(7&SJYn`Ygrv@e6lds0v=^IwdqR&v~sCbyK;$KVB~@L zQIru2f#LfqDt3;eod9nt123!yBVP@9C`yrIB*xtJmQAt2-$tffi)yMc1s=( znF_(pturuXf`R`(!nGCXf^~EA4P*wF2Cs-rc}^N23k1H#_+3@YiuPdyJ#S`~7A)Z5 za`I;0G_C}xaDw|dbg(M;z{m`Q0ur5}?*;)~iwI#YdA)*dtHEYS6Jfa5DEEVoAjc5t z@`9@D_lhF=`)m&Ei)E1D+tFaL<#o$&D10;4hsWX5wtnj6;b?Fu;&0aTlH#OY?-NP4 z49iP(K@i8gUT(dqasj+y{e$@)GpzH~dmMy<^F207o0{a9YJN@bmuY&IE(J~a<2Wh1 zh@^3(>1t96o+euPnYT0Mj?n7j1}gMYc_p$;J00>*=|Uh6kP`T;5)R@FW|5?oD=F8A zVaNsiv5vPGN%af@j;oV53*NKbWv7dr^|$#0 ziv9Gd8pj_;t7zqDU_%_6*;)g18OUc7+@Vhd5{y|dW?i9a8wxqm0D>2KuVT^>=YuNX z^At)fGY}BnFmt}gh7_@F7`i4E*a}hry^4*ffU~P!1(jR2Nlo%2c7eVFeHR*i53M)) zt|DBhKq^WaMl)sT24etTN*Qn3T>tr-XF#U$QzdqB~LR%s;enG0PBbR3YQ!beWdC z+Zjp|8@7*?`Es>LLSOa}K=$Z70&@$nEAWzcAXhI#TJfrtXj=P8Rm&329+jC^1y?LL zzI-bNQV9xZa70r+%BRCL3@`v-lJ+JXA+Px>@3bps|6 zc^l-8P}Fj^ayqMyXUmjT#|?LE8po`Or4@Vwk$XU{*(~a&fxxNsZpEn&sTx#<82oZ? zv{Z;}!7tYMaUq8e@;i0zLP)x(v_Y!6XTbbCoTx4oz%R+44f=K~Ei(Y|0yd$0e^;_Ia)H zpcjTFhIbj7ziP?iZj~)h<*%ze=(VGgGdrF3$V#uW&k}r%_XR`qpI)-Gdu7XO`AaJg zT5?o!dj1<@ic2c{ptRTUzWdPpr@HO5S4$XgN z$+BHgd;T+4|NW5(|MBbZnO*;WE2bXf*I$%f|IWk9=KA&TkzIfOABO+n*I%4n|GHTX z7yI>>WY>TH*FzJ2{iWIUKX}&W&3^s;vg?2R)w5gt`pdHG|JjZ+M*8&+%&z~&%Vz<8 z!+&{p{nsCT)nEPkhh*2^r(pgFSN}Gl>Pc;KLCcGkUxQFhc^B-n=U0_|UdOk1RWxkd zr@;k7^Vd|iJiTObSFi)Wn%Sx1;flqTeU<`ZeAQ3BdTnU_i}FIl=Rn1WwT&p+wR zbN8+6^CI8|ugOPChJqtnmM&Sc1FrmNcISImE=X1Oc^bf@sGjoG3q$kQ0-`0$dV)U` ztaAzve8mT=RKCgq*2z7GcJjd*(iT{gKm7AL2iEYyw%}Uz-P(WoaFw(L*N3a$>Epvy z-WFW1bUSpJ4_EiL;F{Xwira$glb&Y|^WhrU7F=CZ@7?XgRnQh(n{NN?dmpYn z+Jft~PNOgK;VNqjuIsAyOFFoe*kLk~w%{ak*inPO#oi;si=i2)E~sk2g0JPTBV$ee z>hh^%DX0bN3hEh*z%I#ON`Cs;`L|w*m*vPtMMWi3NF^eC)V=(JAMmmZvQbM>!}O*G zdxmum{pj&K@Uk#xop(R~_HlT*N6tEHk9+hhye!RG=a@xLJdT$GbJn?H(k-RbvALT0 z?a%-G5i)kqS!HwCXD{JpQO+v6MyGYb%aWW`4qo#T1+pw>ogdu%#)o)0BxjwQCj4bD zye!CB=Y^-uTP`ihz$~Br1NLY$>Ju#gtnZhV+k!Sg|0Qv%OK~ zItUWegsmugNe1yumUAe*4~!m?-vA=Tws(-FdU}Npxe-DgUMdVc@kN#5S+S zo82Bq2#t?M@KK`2cD%r##}hR?ehasCBgyEHER$Lp*@SC zwO}T-bX(AML9l_nBmS7C|IHuM3pI%}Vj|K=U?S!R_E)gu6T8!U`)@=Z=SjfhL=2zN zM|A7aJCZdL{eQfdVdS+kVT-+&MF01LCyCv0zlirl4Z{#Sqb9$OSFDcTN*y*&3&qQ< zV2ujbNsrcxbtM$y^2%o<7p8ikhX*POG@RoQtb8LRcvbD8F?yauQ^=cg!>V9 zAVD#yC%XDkG8J*OAGE7P920+nkW)emVK=^k1j(n_D^thCBW( zGF%YC=iD_}c3V|a?G_(I*9|0BFgk;M@GK4Si>|RW$l+E*AYOp<41i)Q;312(SzU5I z6XbB%Cv!=MkkFCNX4Vl8U{V3WM$`(u&u0_%pfL=(&0>KPs7em{b3YxxD`W`G2I#;l z46ma&@CgRvn7={tfcdaL9*?exPCF=QZ&Zooy@Ivp#E6J{QjyGas@)=@g{DKqexbu6Yc}E6* zTM%P{I2Djx3%yHZUMu^WBK}}y8QLgEHKIN$B!PJUIwY`0XICkxNY4DtSZ0HD9WD+q z`Mm~wE>vyafN2>AeNxeYt>|&QmOE;kKp2<`jKZowy=TNx3G-2* z*LxH>ljFZ2RSi?cOx2Pur9@}bfeg)oo*M*ACA24L;c>?StPWoZZBc+Qo@0Sx45wap z2ZvKjy$_#$X|s)_t|W&9)Z0y}J47BvKPw9uyVcTU?0;EW%2zNHBmvL1vXCf|wi!)2 zOLoJi@&pDUVX`z%`3y1!X7gS=Lf4-FVGMBuVQh?)&(;{VpwN(DB}TVDAb_!(r3qta zOScPSbakkOPla0e3mo1_^w0kzTmK}Z+F0V z^LawB@%#+$uc5mDz8RsX=1Zq`q2h+VrQ<{WE~a1Y!Yn=t>;k6zicN@j)Fzyd?P_yq zcD0S|T9e*m!kRtRhcK$|pZYDVa;iJVBmf+Lfxo2j-F|0T|D>FX4TwjFqG1Bo2gV10 z8LsaaFv)e6CX-xiX()V{jYJKVBj@$t)uVlbERR^4Ssu1@C`;=z+3?Ih)8G+t_B9ba zX^w}SJ6F$XM1dIjr`|1B!zH7sv|3ez+vW=Kq*Su1O|sa7QN-B)O#F0j7oH>T+7djA z%70pTCY<5$^F^c(Lvde3cI;Au;evvTWTpeCEtXjDRpcEpG3{K-9QfMfCx-9M8iTJ! z;2Q(@q!SYTRfsRn3-QHSK3~9X0N6^OTBVPaQJ%AnfgfAsojxJ6nK8!}&?#h#L5H?S zh8)$xD@V1M5&;l;oOjdFdB2Gq@Is{VL$C>+_sl|h7@SpCZwZ{g9Q@`Y}vy?P;ft2(FK9iCX{Re0X1EqwgB8|5a!sMtP zd6>_Gxp^FK#o4v1s<2(hBxLElqVssWt<&4G5rdaracWh|YgHJS<%E@YV||y(My)!j z1`DTTOX>>i`%Hi~=j;Ods*nQdG34M8V$WNFN$nU?9j%u-y_~O?Gxc(^UaI5**zFh4 zH`!EDL+zvc)xC5I=*;>1GC=_mn`$7HKSpnATpIH?-H|QJ#?qIYK+pLb&Z&ts-GaUx zCLNqT29qP8xnK)mYjpFYxXkaFEukN=40N%}>GZ=)fJJAQRM<_C_kT%s64jPy{!->| z?830wZ0ww?`LJJn@F{JDblJaRM=*go(nl9y$R607XT8S@KW71=r$*5_OYaB~h&S*F{ZpPW6bJUKdk=-zb=^ESD=y0C0C=`;4u|rIKKLud zCa1>@+gIn|A$ewKE$AOnf}p^AzlyEq^tk!#9kGq*+iEBIR+fdXvmgxf=MQlcUm!Tz zJ^gTB3QT$@Qz3Fs|Zr72D|&b16l+fXQD(vo{D#J!Hi*=B^cbry)KafO*S zN6Q5rz%+hvHBNB|X8ja;qh)<}bloltw57oXrgK3HQ9mwd0Vro%4G4;Of4UBkfGJBU znovGIM{EGuV~Mf&oQJ}UEM>jLg3x~x9pWGJ=PS7k8&y`@+;5S&=_fGyDljlu15rACZif}n@;<%-dhMcpMd@&UZZDLe3g}lc ztr7~z>-`AL3u1)3!a(3MnsakHxrc9Xx=fdS$oQ#IOm|MLw?*-odW$v0d_%L*zyy9W zb2!r6f+VWE?m$q(DQH7zd{hUJ32F9`Id)(gA|)VZSZrW5V9`RaY-)hTR3*ZS-VqD5 zVXZS_iSZyjk0y>4#Rflp1vC?KVLRvNWJmR{q!x3oda3fIaDfAZ|0s12CUF6E@jEUdpEP!xjaZ0#J_A^j%)XE`{Mt0^7Xdy4NS*hZ@mZC?c*=! zTy1}OneK=~J@H25T4Xd)hZ5Z$U04>2^jygVQpZpsAN>cL4MiG{WlmFuI(@J~J|sx< z)UughG9z~Zok9hWA?P3DORxl-d{kAz_MtkNunT*Kp%A(Z%AP~v2hrFq2&-gZBF)&{ z)I?UYF%iqknb&hrOBHip9?G2t0x~t=Bj0VCW;dcYr9I%=V($>CAQP|SVIP~mV2(r` ztnVng19inrj6njp9>t0LHN;!=l%IvsiSaNuJ7**eNX6#H%NJ+0;N(_ zkD{k7h${~x4nxFGj=j)T1P=iOa~^{C{uH8&{NDgCsDjAUxthwa zAC)mgxmW+s#EGKYT0e{&wkZUNv$0^`*}jb}^gikrWQrFenn&ZA4}`HX%j`a{mFlKb z{pA@o_CL$_)x{)ssK!laG83B!a@FEg!U?Wgy6oX<^HFWfKyZ+_%5XuwdDr+jfyAEUmL`FJL_)O(*G#?vdtW*_w2! z{q_0~;Lw&GqSED($pEk3GT=KzrcNb+XtZ$Xd>Y#fJN2{85*#a%09&ksAnc&o(6N)u zF$A^NjB6i#JH(q(F{lcFv16opABt}}DBqq#T(l+l((T2n2zD9Rfns0p8+vzXg;*B= zxbgM}i0pcTjeS2Ee%fMTRqPxtS2w-BBX}oUS5Su*dC#Acv+TK6_5)V-LS8}B#d1$A zJlpCut+z&AP#51?6Jmt%DnSse27Z8CTC$d)rCSM71z;-l&XN*12|zUnr>G2GT7QNN z=0bXYwb^*f~SkR$vH{68H(`MA>JnK0yWoX7&p*MRSd@iDPR zdMM4;%RP`7_Up#Rollnp(7s=QkWt%SSrt~ZfC*|42poHWpFK13upgXqN0Di)nhV9e znb<4|5x%5c#9x9_RF$YG9f7bT-OMTY^!SmB3#;;B7Y(ldg$ivR3(O$a=Rh8 zJFCfm<;Ux~wF*LXxStyycaYt?1S1v!rhC8u6DkGEZt`0{_x?Rs0Q^`k{6K%1_?}Q< z_^zOS!0H-o;@TBWtbk8;HUWdM0W$amv?!D?rfOCGPi!UoQ^G(V_*K~pcn=@;B{ZF! zoSeJ%_9N1=f=f18WF#4 zr+rmN`0|PNQSI`_wl0>G(hJ&@;JH~{rljZaOJyOa%Becez!oMsnh4Zr84Z?A{8EP* zL6fh3*mSg<r+cRfXtlIoyq1=|l4WlYIK`xmn!N;j_Vmr38M!>#>4 z5q;0bHZM6EzjgGz=y`2lDckqI(Rb94usk*x8q#DF5(Nw^`_&r%%0P%I2N0iRol=n9 zGEfMdr_+4Euhc6}@Gu|mS#1S0d!SO%X7gF#IV^&i^qF_qPfMRgGBT2-Qnrphy;uEY z^m+CdKNWr6m4TS_mbFWtcUJ!d^ywagKSwAs)lmh+(Qu?3jI;ULLgP zf588pGQP7F%+n;oz4iEi^Uy$^+kjVe5U^o7D8`iNAh;B;bW~wXR7isRi0Doj-k(on z$Y=r)ZX={z7LOsZ@{@H)49M;7hUdOxDJVGRE4*r^3cbIL(ZCZv1`%~EZz(@+>_U6v z;!WOw;5+)~7+>Gr)-1UAp|>%`&Ii0bW-Io~i(ksJN~tLeypKm~b$HDHR-$X`@7x$e zZ*m2|0Gh}Z4FUvb9wei`x!>RYWA|^kXEoUj`&T2cwxVkpi$#C2^`91#ZoSS0rw>NY z-KD=lhX;XbE{jL;_+`pVze9{(fK3+fD`!_|m3SlwlokpCq3q4EEM}^f-<5h-f@%=U zvT%G@`v=bsvhrcZyPh}8wY`d&Q8a7o(eUXcG)sg-hA81!)7EUM(tNEHo-f8-ZuO)6 z_cR63{!edm2z%)Ohp=Wvg#FLN#~u#e@wB0H>?@|{x^yx+^?Dnd-Qg51wSeFQXc^S% zS~T4sk^Ksp0-u+yHIf6F*47$ptA)RSPvF?iawlJf+_F-y`=Kn5mH8rqM2xV>uu%Qp zz{a>%FTmPam7AC8HI!K2dr#21NPhI!BZv`x{YG>l}jy^guk;&7Yq-08GU3g*9veXt4=b z{+MPL*`*6y8o_su?~~E*Ug?Rp0rQG)NUK-SEqiPj?j;MQAZnkxNkgjW&u-vzL~^A- z5M!f!ry&t8G6^P}g9F@5^cR9~&pQCh;^VdKuSJ>;>%$GIS4oVK1m+Kvo7%kOBqBMiHvbNQpf>YQP_+pL^ws9| zgcYKRI;e8c+6I=3n?mpMku1nLld3s?$?qFYbBcl}@V>dk|Bf=Aj27*ZsW}(CAJUwv z2DChp7nD~jg+g}(=gK%_L*jE3;?U42gf~vW;1nE4UIn&tD70~8iRVqHiLNcx#K}{>uG`C+P6hppeG?ks7jUYprSzBT3?puW5lilc%?E%hnPA{`k3cpQ zQ5kU=P`=I$lofgN|B@1}DrVRR#+*mJ%NK~B$B&TlXb#X#ppqBflXYHk_Tgo7GK63` za0J$8HPran&QE61)^fka$I(=t=$_TS2?zT23S3`9G?D#lT|(smkf3A;Jrcq@U}alT zROk(kF#^ZB0dQIwO>HLWK#(@8MgUjGY>#JIe)BHByzT$9*Q|L$wd-qga8jY76P1%{$nQ- zFA4c2XKNf%M0V2Gl(U(ZS>I56TH~Y1`7)Ct(V0n|VS#C0XBHwde@!WAQj5aRc7-P{ z5rV-DF{@wbjrkI#`}JXN*XVEBsILC^%vPcQWKK#A`q2kH1y~R*UIkoGjf!@MZd-?Y zj6M(Nzhi{FF=C5jIb#GHGfT$H6;2bczB(i;IRz{f3{-QWca%_4>AXulSk%RI$tFQa z7o6fE-)BSVEgBk(rbU`Ip+i8(^7&C6>z2m6F8u@`4=kUEUiHHSz$EH3T5oCiGSSN| z4LpVhsL<{PX`HZsBKqAo%uSf0nIoi_gRy0#( z$KNW;c?`3~c~R$t$R?p{C>vtyaF`R+ABGMw7WJ55l}<&XFKsStIHwO_&c>wE)4^UX zPKyJ(X9(=V5ZK*20`?-49nNwc&0>=WstwYW&rrr=)a7{mMGaU3I)c`?L{15Gz)wG# z`Z5i-yQKkn|JMO-|7L08_AX1ei`y{C77>S>V@(nMgGCkEb{l3Zm-D6 z%W02jq3_2O3ZAgQmK+nb1c#ZT74c(bW{tGqlK%wN{l?O)?gC4D!}ec54rNE zae50>323ekuqeksd86Dwc^7%tV0g3f_wv%L0+3f02V2kMf6yqk(d*C}dlu}W~*uitL&Dd9SkEdfThXq<-etJ&_ z+F_L_12-Gb&WFQ(zT26D;Y2L~H$=eydw)-HsBUYW~vl$M-g0S^HX`;Z|ysr^y<0{Unv*=8IJ%{xPOpD=O*wk z2bP$B*+4!*H=2{-`D3~wl#W>%;GRg|=L9qq(Fx{iQS8o=v`OL|yD9YEMQcf1unJvo zq@ciQ5pgO_2g@L97ZE70*FYr|s1!s}&97}yQi*HmNG1Luqyzj=$DCn@q=BuZ7Qx3b zEIGW9=(+0{kwWwE37AvpZ>x0*z0?=oWCepPCTRLAeXNx$h^2}K?*2JLoUUl&dKRJ1 z+clOJ^`zAkb?jy*&Wdeb>v|NCrjwaD8NGIAQvrfCEyeG@jQEQ3mc_OtAX%2gBe#-p zI_m^;ZD8p|Mmj_~s+C&NE#9pM=fu1Ei;8!3DNIE2q;hfTqLbfN41iyw6D?irJvv!S zgn|f7Bs(?33)$FYbAw4( z2WcgRNe1abhA8yrPU?m_{X+2JEMZ9%r#X^lCJ<9KvU%y+KSJBR;op-5BNYUIY4sa9^tOlL@c1Ti#e3e^k_FjF79brQxh;LiOjaOWQVIB@44u{2mJ`mm*; z?&q1MWOv+5s0MccVNIG;E`_y1onu=w8m-OT@*Yu?a8UMaQUpv96lyRph{K<@#h zH(D-Ph$GJaI$eYY{X1w?>2Teg3WVklmZs4B-qM1h4Z@@%9j7a^3B|9|i5%$I@(1A4|8_9)QsS#6EJadKRFhOg2!Df=wn8gh6t-iG~OP z`JCMevIMOZorn~GxfIRQl?Pk8qr4_tw9BB?ZC|%%mNc(oS<7@mE5W~1yMDJYrk?mP zz|^CbCZ-;-^cFA`6gxSs*t!ry{W`=@wH;t6V^eBH z06BJdGK&JzJ`7OJ3)w)>yg{yjTF*;d)=S$hk4ebp2j$6SrM5`9ege@li@ESRep%?Q zXS_C+xD3h+!kauGmK0BMz3m#v*{Ps1`-kYYlzNvwOo?qDSYI9TJUJ16DjBVtO9lqf zsph(dsa5n8WXZ~2n#z+i=rj*kxE-B=<8#0LR02d0tVK#WtZa|(njY_)MxXfC|HKgv z592(C_gF!Fbw)vdC?(R_ws1lFrWZu#O3jfRvi4^bnL0<@w$@iN${W^~<$*pq7$`8E zKM2*RBz>hnPcp^{2;Jr6Y_-1G%WuWjiHu65%GTZ5DqL74`aIMw;&ovVWW3x%+OZmP zlhhlh*MHvlhy0zYgnAZqkF2mw&K8;v2k?{y5Zop|aCf*TbtY@x_wa5-WH=Kjr zg$QCYy1vrFK`2?OqsQi5)q`lD=b;SYvJ-c0Za6nz_5)}acjv$PU*qnpKLK}Nz{fP) z?MB?mN}+)?`CRYSw4bK1Jg69{)JVN87&j8Hu~KMzz3-OA`oEARSzE{Yhb%-57brZh zp!|aPJ*jW$0(0dL52oBUPG5Vw_>HOe^zrubX?TFuK5KEGAuJ1n^<5zZMl+a?!sqpP z6cwi!JMGrG9tG|knffPH6_Lo)B2tyBd48Eu!MHwdHBTCQ|2(}0S?QzlT?{Vr-gyLd zP1L$@%*Cc1vdZ0SYs;-*xh*VrpP<}Gr1^2&Wx%{_7l9dJ7%U}{@L>oy{j(s)Oc}sW zpA9y!Sm0m6dLBb$8MwlsI#^ybRfaDbHx<^On^D`T|4VJss*_pUiQ(FsJ>2PuHMfv5 z2^`CG8Qi#N&4$2@IK|R*BdRUkt{dUpQ!L=!jI9lD;Zjrvfkhd92@GS6X`w8=;40t2 zt&!_RDZn~=2doD~&`N2@KTZoUJKm%>KCEx5oT^B#RW zy-E&UIL|ZkR#4scmS%O`EZt6ZsrS)gKPD z1vgcN%sA0T&ZCA?Q-4ebXS5!g%QEH^&M{Zjf-UEBf$I(St)p5886kLC>uX(dZ&V zm?0XUQC=t-JHMIEr;(=BB1(=|-+LqA)%BJpufAdFc6ik%DVM=J>7$5*Zd)+DW5yfl zAcV>P{%b+?8!XN0-?Vf))u;Y}V^U010 zo2hvr-I5PwX%s;X@3pXLtEGZK+4S59=0xO8j;lWyYXK|i7xuLfOUv!MzAmriw`gOL( zjYH8BE6XfqMz|QQPl|CdF1R$_TN1(yEBv0)2FKO?*9C0V*V1IGeJtG$TlwJVPLLJT zM)u*OEq68fm7;*2E^ZVB<~=J4IO+MMy~%(w@lEEhG2oqn$&R34x7W6a$+=-nJ`fND z&VhKg>X`ZLBf4brL8|^e6Yg|%< z&~EB>v1(vJnDjYDK z+WiZlk&AApo=BWDZt9(7$Tsdtf@x>iHz1g=fP;NuJ)HORZ3rn}g^=>amXVVB3OmFSI;Lgg-PB%ePv_Pf(3D*x%|A*YfMcAWFy&*c zG=#B|5XOqPjIsaGC}LO#m<+3rbffs(O99tCZE14d3QM=cb$+p1Fp5`afDkr{&%YQ{ z|BR(s{Yp!>Q+?_VXvVEKil1b$)+(WFuwlTK^`AFaETnbwry)Phk{jW)sf)Bhuh9lM z?9)LQy;dL0kvh#Ju8|vMEdeHRRt+ZqDJ#w^si3|WZuDN?hx1u6Y|2MTj93Wsl2N@U z_{v0AyDYyFJ8=N5k}~WhFtr^_nVheAIj@;xiHE+s^}O#lOu8+f5){8*aMKF`U2n8B z>H0fMw?kLI*#E{VIlLBmy|!1|Q>+6Uxy)}zjK-g2e%=3U#e4sYbPsF~c}4~iZ6yP2 z&v{TGc{m5sAEg+(CcxonOB079E!{2-jTvEYex>&2E-5}_Z+eDER2U*r_brpC^)|CN z+cOxpP3n)VVw+TV!~jssZjq+n!qlYx#xV^!?)5|AL}xy(4plrZRPop?SIlS{0>lUh zH~o$nbfP6su98}uU-a_x0rp<7G_kkZ((Phzk@c@R{ZeNC+L6gmwG*X~ll=Y=DAKElm`BWa$p0pfih2 z52T_s($sV;RNtXk2%-~9h!0;aRICml8e(ZeRBq{ZAqpBwDENr=v=5S>5h2%Xyx z`=^qSS{iqFR^<#bbW7Rfv03E%&Z%GUqB9SgCcrIn$FTx5yBE{kVK{9Kak6AdYS#c+`aprTg(XT|2mfF zz7IkgFdRcmX4&BC=|8-p>%}~w&rBO3Z?aVmvvuJE!q)6z9rP59+gyH$5N0_$Ky&0~ z4MY4`;ggCaPa}(Pm;0fZ0t!VIX}VLy5ya;>Ulpgi$f6_8orXnfU;+4!Psc}^_hR-$ zbi*?Nf4pgF^2a($OJ^fbs#0?);{fiUjCVua^>&E6UiY~RT-#>ul903%hoof>Us~GB zy&?qp(h%g2cLZ|c4Bl=iDcfFuSr-<)a=lG5KybDI zIrF@p_k~udAtwleWoeLLj@$MgNC2t)_#Cx1Ad5^V@ur`wh8cAA9ejMLC4jZ2$(Po* zo*_5ZDV`-a?8>cL54=bwUk?m>I$)hjOOtgDw=@8g?F%_p#i{->nxAT*1m~qrfy|l2Yh4R z^RL!{1^VgSA=Fc+Lu9fxP*?Dv0Cp}587wMhWzY?Kl;GMAP!@RK9m_>K_$b9qHdEYn z4N7>9{~N>uB;C?7JYfJfCN0uwb%$O_1MjDALwud&6j7TBHJg@T~XNHa(l$%*BD zV*q)uGb?;B@G7=Ye?EqN-}~m;nN?YlqveZA=CCMT!Z*{jBv<{;f7!4mec0A1USlmM zTDfV+gVlEQ#s&F9zcl`H=ds`Qweg?84gT9;ImnBiODCe|t)djTZL^{^b~^`OKo(B2 z+qt|=M&GSA{=0aWO#V9nLsH}IA3bl4@t<{)Y;GbsR=Kb`;AT}Ej+u=Y_k5F}&eN4}R3MHgVRgWhmvHt#{JdD= zcu@3G*kXSl9))+eu5q2CEQ+AA{&L%saPIerY*E(B|f&W~j z(Q0#cEmT99t>W@)!14l&sT?y@0~d%wazq}yFO`x*r;#{-4-K{rFd$Ba-k=JC5n4CZ zG+L@Qq03QqDXSJChJ^X`UlCN6h|X9MD9!1X1~k!WmM-${JA&1khh+GQW)$V+{K5n=d&&)^dFw`~8ne?xRX!l~|M zzII}wmN|pAI}{VwG38gJU=(SC@9s{M8Hb`nFjZUyhzX+)T#t)&s@y#htCvTXW$dKa zNBY2N`N#)uY3@MCf!J9p`L39V!aCq$`Mq6CW(M6dmgcq+`=MV*Up0l-=YIJG+MTsN zSGq=f^+3~|xd1K-_C|U13a81H@;SYvfoZYQ!n>FQGmQMN(Ph;Q<0%2;CcbE}n?i5D z?TD`F{xUMQH(rEk?Ze=f#<1ckvfvEeb^kEgUhU#ix>1G550$s=4p4bmU+{{XRLNLi za<)3gLXG1dZDS2@J4=SKV`FH^a9>w=;*wHbCX{rGcf7+FW-J*V@>mJL z|GQ*3BB)kY?D&%5mV#is6lXFN*pgwR(33KrIM2v;j#BCYd1xaI!bCU86H|W}?^qJ3 zvObokDvMgWs15!qrg@Lm&d! z*An`@8hN+~%uOdYhnB)4UKRD&M!A7Qn-1Hek_Ns=oF}kpA54J@9CKm$#r#ZovbQX( z_x)*B%=hO;Dx8U~Rl3J^e{zSK@bLvRFEarT$&Z$m%xd3C2(C5Q3aW@V^A$bgv z7Yoh83|XB{#V0~kd^AMGM>;^oWHf&v+{G*g6TMyNEuWRPFfC0imJtCmA7E>AU#F-3 zH{BOMF2uigJ`zy;&z2^|Z?$wg6i;;)oVPv*^dF+MyBidWLAa#t)dBTY6+7Z*7?Bqb zpx?B$Mg;a{hVV~!2zF@02{=)gFCaZefysP{_g0T5891s7@T%pk6M&ie5PYQo>$&F; z2FJ1O!o0&ygn0r@=mdlsI<|iN?$_LoS6jJ$d<@PuV{NGDCtW{Y^sITCjw=&7CkFa+ z0(|qqtLXy5PoUxe;G9k8 z@xNm3R0qM$7jQ?R)xLk1`uCSmc%R~*>+IPOz)U=HGwWa?MnG2K?!n&tJ&@zqEKNCn z+0yOEF}k$1P>0JfyY4=S^6MBxgJ7lguO6V7==pgwKd}DQ8nNjJ=TO; zlT{OFy6Q$CNJUT`c(O&#b@=cVi4^H~Jk7N{X2cZl?0?L&p&U1FPqlOn3zSIx;Y-^y zVv1SiDJ|1E@Ik%DNxi;LdG><=kJMP2JaUSqLoj9XNJlBgV8`e(@MO7vV&M{HCupii zG}RO1Z%9GqJ$jJ2sp6DUCR)}zzx2R=`F<(;`M#N=!cZX@SuXKwpNiCpxN!moZHyrm z(g51B)Z6PC%w^gNz9VDDxvEHH1M+~?M1O-1h7?v4RiI0T6b``ISyQ^2$bFlibzDl} z3e$gxmRy6TFD?r_bR`%B8fPbFc;|gT^szvaIPaW-aSci;^t@)QJ!*#NE*Ef`n~B+$ zwD?gkoM%W&1M*ssG8wJRRedb0`g=aeSv@hkMk=D43VAP*k@k-Pi;lx~gPRN8;T_9S zQTQ!zXBbR{L!#ZKCL7i4kN}=4@MArqD4BGXNJQvf7W<0a5J`UEY>{M?z?rRgs^CZ2 z>z(AWNa|~BRn~f^xl%SJwaXPd5Xcp>hxJZnk`^5~&(`C@t@84ArSL{yJ0J&{$7bRA zC~o|cB#AP7WH%~m-GKtB%otsvu&JF2qAiS4IJq!t*O6G`}}Lz$;MwvvuKTa<;B6ZVzh$R@TBOg%2yA1?ZWIy<~Jn_h4a^R0r`a@M_lq z1K}f=JWl=((i&DRek|2@i4j(%E>36b@hdC13Z@ z*EoEM8=K(;mSb@{stjG!H%Bx6zJHEp9GN8}dv>51-UzCovFPD~6psN4tl`=nt1*zm z8m?EtI7s!d<0sR#G+HcNnA!u#z8we|XH%pJ4mY^l&=RyG2=Fvr5p+9nh$U#ZAqt38VWjyk zWXJ&hx%C|Yy>G`rzv1n+k=s7#6#&d@Yyjx1xmu@NtAgIV8VykgcWv00M*REkz-hbP z(sbHxvvfO78w026Dq-t6Sm$tmS+9u zS-Rc&r(69Oqkb-1gIRed)FVs$H7I+krCD~PrQ0bxb-nbTJLEw0{G1MugT-_x1K^0@ zq9e@sx;cM1_@hY(S=>j+UCAXbr^OnY$|t=^V9 zBZ=BrmV3JAvb%P7~Sy1PKupJ|50veU(vu#a>HU$@1n`=7qcc@%(`$f8~kFv zz+C$P!@&$!9wCTT58NsTqp%8pzu@j1)Ml(DYjxtr`R%01y@sc2XmO1%w%(jYr@ia58sgXaPm5$Bqs{ zI8He6&VZY*vNXB5-qP)H^WuL4xX!H)0vaqJypRKE=_uOxalpe4o_LK5a{vrK%<Gr@FOfd3WAN2YDB^i41%l<{EiHC%mc<`2+_>(B3*KZHn_KKz1wihkk zPTKLkWvB8H5bBupdUtIM2+8S$@O4FsWdldIO3gNjhNw1B z#u68^I~^?H8zX|JegE;2ws?|!E&d#`aQwQ+8+SukG_3*zmLwloS+igXFUsMFmRqvt zCQMDs>-=eRW4u@n>t2R<+teE-!5kB7qP?@=C~kiKm}$OR~v7Dk~0W&N#L_6GX) zEu!&%*0)c|DRzMZi8P(VDuThXb+-jv_>!f`g=;L`4j1~0$+Zx(PSCmzSdz%D;=waS8D$j6o?~sT7pzf4gL-ku)>bG>e_0KdX_Y!q-aY-DD%s6u( z5pB68D7e|uEO@e|+bK9T&veC>1=xE?IKlzqa|R+O8`)60e7LH++rTGW0(Y#ryR-Pf z)b83?BbE7oMD6|(kjlu(-XZer6(Y~>xydur)+(GSGe5!ukKh3U5~GKTv;ddBq^^!N zOPtf2`sphOiebcykCNC-D0nrBuhJN5h(K%%6`oU4B-$e_o{bR*ifsljzlb zKVUJAmyCK?t+p6yldED>h`EyXpVHpTVC&}@#V3KE7b%{S*rHnqH$>Mlj>hS=u_Wy( zhMmLld|AV*R8p=e6#Qq7W~8~=56ue1>OMo55&-iMkteCg z)I4{*ys;W@6)wC2lCP_6$h$-1NRG!2M#USV1t2EpR)Pk zbMP6-Dn1m+s;34`B$BW^1Kmp##j|R56*0G)!^fH7TRxMB_Zk+O5%Eqt2-9DBut-6dQMenKi|fuNkd``= zs0W}#^ykCguH)8bdrs!4Il#&ace{DDv>Y`Yw}B3|c}NfrTl)YB3D#JYd54^WGYTg! zp96?6gqiw{(zGv?TVpu{oTE-0qtL0WK3m`8lzffQ)Wi(vFa0s#v5zcG9{bSJ z;wdfUwd=B~4Jd%3MKtqWsG%zs7U!KhejF9z#57z;|H472|} zPr)UhCLo#bG(&F8cT$bRZvRp506Pw6UG~98d8u*WdnSTkz|T5gdeI7-FD)~}$M8cU zcDy8#(f-y61buA6LX4?8(y^K!mb)AkmgBHzZJEOqjx%BQ26)Mq*>Kqz=KSvZE)+dj zxh&QKUtJ|;6LPcQ7z>7^IHvKYZ)Pbxs;~t}(~qCv#}Kb_z9^L(UeDk=j&vlW1Mab@ z7i1H{=DjeUMRCju*^2%0xQf9);A{1dS{+`q&P3N|_jE@D_9S@#hU~k}nRAVLHsY~I z?62&SjBcK~Cz5PHGI}F2GL8M&AJ=+|S|77n4XsHxy$nhJ{bkat z`;$g5U>`k6`-*Au2!CuH=tKTBF%x`_S71iT7wL0E@ErtGGt?^l7;r21CkRx?ECIG0 zkfnMwlJF_wh0X-HT&vh2Vl2IW~qb zYW0huBp#aP9kmi{lgwdUow`GyL5_%9jM}q~h&$zbG94jA`4w45#0{Y;oxGg*U*;9; zFRLx`W!WvBgnya*H+`w`AEFo0c+oX7ISMnSqIHt)RL{fT%W=MaKbEL?*Ka#f*6X)K ze?WF@e*AL|jlJ`wNi>l1b752OM=lOf9MOeyL+RchYw3OY*iA;8C)q~ZKy)dwEvzHb zT#!xWmo7f9lSgmWQek+TqzlLK`!6TNJJS>#># z>MIiBm93qdmRhT;eRM>c{=#Qa{9+AiRO?~(T|r*_nph*+EyJgUY`r(PSlb+Ak7EvT zuB-=VX1x?yU09)>Q{?JU>GIezrt&4_koKfY+-ZqaeaJR&JT}M;r}aJcZ&#!l3jmwR z4{ts${4n|B2DTTfmLks|({m(6+)r1{4b|ej3t+iBuq_|{PlpmDroV-s+N_` zKa2v;6f~G(*=~x4mBjm9pH4*Yrk(50)pCH*ShD})Uu75Z&zHkR5LqNzoU2JA0}cjk zvWYdpM$Z*uYkPQLmwr52mR-mH<*4Jdw(Hn_L`Uk_5$8w=KC~TI=BVR~mjad(=uf(I z%OwNhYHZG?rgqq;_XDj4mkfiSB-POca+PNy8;{E4rH~N3T_P8ds*YkXhN3YZ*!z7i zbJ~$DCJgR9w}71N>qW>hvOq)R(uzBMg>RG5<7$49q2Vb0$VSVA6sj|qemqmf-am)D zfi36TU^Jr|82AWUpb$!L|4%k+JOPvv+$`=|!FF@hDUG{|a};s*+HetR-1XosTc!^O zlA2G0kcC0r^kp`vU%nVnKhjjf9LebO$HO{ok$*E<@p_KZ|A^89M5MK1Mzhg&=ecZ-#h)E=I@De2`e6?=UPs(zeqV4 z(z{S}KlKiHN=!u|QxJ;@C1cQsc#8rJz8<5dg5h0sc%gGB4syZQ(CYqb%4GCsUN9G1 z>tXSt@*_=eFsG<}@1BP6@Y63uMpphS@Jvk7ex0L~#${+k8ztSL zB_${4T2lc4OxoZinzV@o7JJ_h&veD-uqklGiC4IIM7cB3saxA6?Kk;gSRKjYQ%y|N1;z zpl*L&Ssr<@eAlr&j zC3!bKn9dfiD5WQ;Zk$oAobl2|;f!;x$)=~vDI~?5IATnx>HJ9v;Bk1X;B7^_Hl35T3Sr&Red_Rz#EcCp>A}Bj$-enJL z6_W1%Opr7;dQg^$aiFx1q#ut?3ESs&LeKuq#ng@u6T_j;9 zXti!HP^($gNtk#?p^|De({Jdhs`|2(rs$%Is3)UydbGpD^ccM7WEYvh{=1^uVB*N9 zB&U7kv=`_13&k-!b|EH!6{iIZ-~2>Kdg`j+ysu!}e}%h!l423PP^Oe}UzX}jEO%?Y z$zgr4lEMQipvYz;pbJ<+zd)a9eCy4J>HngC+GRWKtM){C)3!`^s?T5MeH_((>ic+< z?;SDxjm_S+SPkI~{O9(0-t*(oZGC#;Tj+c($NNspvi<7`QoigrfYtM{<~QO!hz~>x z4y(tZZ+lZqRuDcWVv+!tVgmteG+rNrb^RNC++?`diHE2CoL$6G@UZ+oEuN0)qQ{&S z2T#3c&qW7g`&feAB5oYo*OkS620ufTn_M0Q8K5H=#c9N`-`E#)ZFYO+JtX~w#*d3* zfU`8#0@l!|+j?t6K_L@tgjgl-k{)D|tUhG8hsA!RSq*vyap81qEaVuOhI6 zX?0vz)=3U~v%AWRpf~%C=_Paf3w71qpEA-&P0=l_Q5y`9A+ z#)8tv6$K*8il@k%lkw*0q8R(pvTdDiHlh9KTEAMDF}oIl#XH)(xHz^~}9909cW?O)u>> zYxn&IDJm#DJ`shMp>XsI0$_M3+*mw44zjnZemDz9b9$mGYYnQB9X8?=D~Y!u-0mH= zGC*v+aE1C!`LF<_?J~QkMUZ<8GTjWlGXV^e{VLU6l~XH}Q;xUeRA;d_k>l+KH76XA zL&g3t#DD0o(_H9!v@Z991-ajc3{1i;+XVjNk1krCbQ?8Y5K6c8+|P^o=abCRQ)XG7 z_kZWB6ai_rb{YC1Od-M-*xc=O{pHUvEc3fLK5^Z-?@M0O;f1goM8 zyb)X_6L@(qmiEytkP7N|`O zMgvut&^-Ze)PY2B(U>=ZENaOQj@xjCg_mk&%;` zx~;z9y8?ORr+~I6Tp~;mY2Jshgcx8DUl;=%WNDliE+)^)LX3{(I0lF`y+d|Iozo5yQL7=M`VEkEAfZi0ufMDupGW{rN8mMpCL{Bp{sv%zKXQVnN#-j0_uc>oa{I(n zA-QefhXh&Wb_s7mASsuU$QvE2l|RnK%G3Yk+nBNHKch{K*Dhk>;~lO)|Rub?9*hJMb|BA(|mT zXeP?nEZ&0xS}~TvNu?Nx;}tuL_SN&>Peh5^PIn`2GfT?kwV3VcCFOEst*nq6x`EJ; z#3RmspQz(PZAUg1JFoA=4+>~XnBmNb&HaJ_j|IQKG3V;9;;v9T&`-tNJt3n>yMWTQwX1I^p6^EBegZ>bYn646jbd-kAt7^7VM1Z%qK<73n`fGfy?$-xVrN1W zG8fzMg_(;^mM-$DwUyXEIzQsKAEmrmlu`R4_o%rd=9yjG5op;hDMcz$21U{FT zaT##1P}vqJy!UrRO`0q4tQh{T+jgNC=o|&rnN4H(Cb>w?>qPuz>Ju7&Sxj9a-MJV) zSotLGanblP+FQ)`kmFLh!tBYF>MCHGF~ZCy@Z;r%0>9`@(#W#-Ar%YZxM4WxYt2r# z3H1coCx)|AUQv`nV=|;5QDPsGEi9qK=(kI8Abv4#q_{+n^Nr(Ek){L1l?cLq4FWIy z(=^w}$`LJziWMws$-fTLUE1o%)KK>_UuSkUUtkm4{bbM3+F0ULcnsLd6E$oU8^xYl z=(t4hs0DAOYd_RT=3)!PRmFXc-K)zwX6JydxM}DuR$HX$7!oLPJZc;!>SIidxKq8d z7vDjzfRo))c0qfSu4hN@vCv!bx>9W`{euI?q!}AJU*;gp5WvlJ&XOBC2-idT8f!t3oDUd4`zS*^qS71o5^Yne+R+O7R@givXfxDYg z$2WPB#~4Tpq8)U(X$J$N{zg45mV|~Zr=zyy#7#LVr1b)aQufl==B2bd4jQe|P5*^2 zCttbuR&H_+Y;aB%r(OpT1>S+LDH$~T?2=k*q-LM3vxi>_M)cPDWon%(v6sKMpe1ZFbgnfn;=c+GKbdK{!E6sDH+{*H5)qa++t5d9-#I!TepJXg zy5JW+(r@}GK-s^27pL+jRFNIQUwfzm*p%VI%`1*O8`grJNup z7ip5AijcBGWm1CJQHch^($`qzO*Sf@SJHq|4*JTRLypGa6ZmkWkQ)5y#CqPAQHdjP z2di=pLfn`ca(pa#X;~}@9t-Bs_Id!u0zq(mC0W>Mr{J+@bcyxkgIIhgj`x=5)o;h3 zAoP@+0@_|AVX%I;&121xSghDfD^@ zu=Hv3WY8qT(wM| zyMKYa>3HC?H$l|6KX|!v60*l!_G(EaYRcHC*7_aDC!QWfOs13Irp!D_#EN5yic&n; zHqtD{5}E|$qr(gq;G|Cc> z(PpiJC{})vcflmbLsW{pNE!4ntH`dSsP!-p7vmKl5=9wplvjBvhP@o3?3#(M*?$c1 zbqbJ>T~^}E0AD>zypbq~O1J`TixhF@5Jo3)8U*Io`fa~h6Sr>FoFV~AgK4wRbN0d z=(9r$K*5Um(heX6;xj6Y6q;soGd|X0eo&-oD$8u_LJL<_QpNYuz=|?9mK@os53nDc5NJT)~s5`S})9rwf!EwCW<=h!lAjh#@pmqFMx3?O8-zPtj#W`s2?sF9%_{FWeMeMJVBa zpR!NWIDuAR2u?P0v(IF?)hVnLeKY~uI(yUPhMm3NTj4P>6>9K0ad>vh6=LnuEBU2W z0)`kx_HoMy=viy&ba+semJYu521x1RPSH*_egpXRMCbIP-zPkPA5d@-OUvq5<0qZC z-k~vt$>uoZqYKVS!UL=c;y*M<-8KS|QRQMAz=7goz0#niS718zrcPH}MKS@?hPQYv z>#SwVQRkCd=NicZHOo4epiZ;$nRVJS6F^hsRY{#vwD}L|Q{Gx{@~*-Z`rss(La@E} zo3uxNfhF`#PJ6T;A62A1lG9$hrIz`o2Z(E9e!xY)H~A5AtPD-GMw(*7ANAw;rtP72 z3i!O$={tINun2SDSQ&Hx_vPlQQ^y^OV7%L13Ab z!N(bcgA`=&w`7Dzl#I{OF@6H-6jI#ji>-nU?Jbp( zc|?7R3N)X*CXUc!XtFREdJd5TUM8a8A`pkmsG%#6fYLS-R!<25=u_nu4y z`kac-ipW3ccyi<%fru>fWLiy_r%B2Y~TaHNOF-X-68DSNKNwC5H~q9{~!^ z6%#B-cK%BKjh-)ZTbK-e=%OELnjoIXg|?HI>u>ehW#&rvpyTN0H7NAgqAN5(trw zh0+Y+Zt1z77Xfh%xe})+C@++`Ae1h2>7<2lll?pI3+!-S2VG&A)G<#ty|j591Gu~a zU2WE7^E)225fYG(0ar`}Nt{s>>-$!0@P8&;shE}_S|AUau@o5<&4^9_!?SItP->g6 z-u8qUi)pV*H6{U##=2-f7Xtyj5-;qeuaf(j65gKS-OZ(Yla~{bIB$vcbu5pH#ZnZ) zQVe*D{?942!80{pfKNeQn}Us-V!uCz8?g6mtq(U~(%BkI2Y4v{oFa)gHzx=O-s2IY z&14d~FlgF3flxTf_3_xw17z}!*6$`J#AC5UuM0;&1t)s^hLLnyg`2k2$ZXRs{YMQGL9IWpJs~}YADNIIZE5s}K7P?(vl-t@ z&M>LRz*BDXF~ghkb*O>K=-%h|N0|_nWOU(+fiL*|o2&{PmdaEj+^s<<`Jkt$uu{ijFldH%Rp@FUKLhg??Whw%|!HPl7w^;Z(u?=;^H()JNXai2lNJ? zW*6UxeE@*sRIwiy-SdS2#lJ;`N|{v>@yqU|2bd16JARvDKtB*o6pbwfC@-=t_vI~h9!wMFsO{(E1#_p$By2$%WiZ%(~ z`-T&JWT&!;c^CN*)CXD;+!m}8D)Jr`gBUL6U}A&Ho<9)qwMtfRDj)kQ+AZ+~w%UM? zFfsH;g+0>LjgONSxXreB(^#fhyjPjZT3_`5pTce^Hr(b5LD_772xs1FgA9 zzEk#b=zuBv8C~1|f*ccs9Lk}Nu#u+utR!(Uj+@5N0WK{#lys>qbP@lG!5bh1EXQz2 zde7J=Bs!A{tGT$2bYUQ+pI6C#9x%ulEd4iclZ@Vk2dRJqmc?J1=vbN7O=(>~Ks(Ba z2X|&07nuOfFPX!_;d80jq+=wW$)kggOyki5>^97!(56RXQdv3qvt+xSO z^zOpYXTTrgqLA-7c`pr%vE;>w-HP5@Z{Y;^NXOrd&a)|8va_6^!F>#l%uoG4;@$;5 zs^aV)PY98K;KqAYwl0bi6fD#mv7kXvPc&-kH7eG4kCoOG14IoNNP=vaRoYU;7B%(C ztF)z+A}Xy3;SvFByn>2~RqHJAf~XZl%4HW=}yNHN)Yq6T`K1{t-%1sVn0RSOjh$FkBZS`wQ2SD~JSW0BOlT#{Os(3!99 z$$a4KRbKQB>Zf6%6Ciw0E-Hbrco?*p-;3%S3m~A&B6di@0P^{?eRvJ7C*H?vqTer| zp_H+X_5?a1j?W&Y_TmLhKRLb&_5vJOlil$pRtBy#_u@kvi0}50&y=L&bKPx<&q{W@ z#^N)%)tC$#rnBo{8z^C-M6g;c1BRO_(%?Be5x{C6EaRDpcZt|aK`ih&3Joo`-aeFH z9q$so2~r7o0R;acdQatO6&4e12#)=jjm0jUPHg*b#k*1F5bD3l4mDOvyL9nDO0fx{ zX&2#IXd$*9?iFg3K|`#n5MM)#z<<~Z3%uw`uXCjr{oLz( zp5AVCj@Q{tGY!+upcx2SZmBAk4F3vrJ-xtPRg7i;37ZjqOE&XcL8DB06%YAOni(Yv z?rHNZj@V@i4?qITiJ7e>%hiI+oMI^S;`o?oDz{yMc`xC%=`OJabj9}_{kYwwkXSPi z-yBKKC#;8SX%3J}9Z~Z)WTl7pG<(=bdL*8fASe3fe(C%<{FeWWKL=X=OqcpU{LA2r zNSv!dXsZs5(gF*AgZHYOB!wDeFZql1Hy$W>9N3CRj10C3SD-`=aBxV&F|I|oNm?b2sV^jJ6qkp6h9&u-MJJ)9N;(s9!P^K$qJDRQ!6!e!5Ch!7{d$d z{^AAk3sohNVY{fuzki?@OJUd^9j}@Oq{V|tvlHKdKcO4jl@ZhVZ}9}-KbQfbA@m^| zg@8;xng1tT7g~5w-PXwXGpM(s;Ev7N;>`TWBs>H}H{s|i}XsNs9JFJV6- z>_Q`+IpUp(7sbw)*MG)3IpPg$37DO@ z3F?JC4E)mR)qA|^i<;2FhW>SUk`BCBAuZD#<8Szoao-v%RfH43e8kHwUxhDSR61kkdUr_~FqmsC< z0;;kfOM2F)SloY4@RS@XI*$l%6#IhWiJ+LPH~|z7|L%vwySUXEra?fsDz<_6XSbm1 z2JJ#Lflls2tC}50{9s&oVj79k=`;3br4KABfdsFXOMQNL1T*oI4nrX5S3dwZ#BzU) z1H73sv?w2(<|KUm(n4`3XezTp)Bc1CLJN;Bo{mVy$B<*H@jQGfZh#e5bfth@!Fx8( zv0OgJi5dg-)MD~s!c|^ptE=cCSCJQ8OHkqbBnbENvij!%iEVEm_{ ze+`hWA)x)n0k522$`g~*VAmajnK>Thk7B?mr7JV4DP@d6B7BE@c;~6&qgF;_50%D$ zb6HJ&4fcG4Tvz5XOe@1nel`bXR)>%PTLd|v4qU+KsTbVb3lImr$rK`B4^N11tmt=2W#K2?W@ac9-TXZ6Pke1Px@cvpZG+Qy1WqqPC z{YTTal^#i@zuZoxb5BcF`mmN+X_J-<&7*-zPxHGcn&NnwggYMqaaRF;m{(G1XdRQ8 zG(sv-XA)M6hyS+fRG<X=hy=;%Tg3hXm-V4EBT;)H|X%eT+$)f`&(E=29$0X zo$UR;w9MZBQ_F>B?%M>>vT)KR+dz*FUN}E!DP40OT+u&5QSvmEoV^TJD^sZ-_UD)1aq?}g1+M&`Yg@hmWF zr0f-zs@^M&_U>Pbkkf2jFSWk?;{HwYP%U*u`2A7IZoaE!cJnPQ7n*+SGIXeKfw6Tkm2ZCe zs2H?f9~Pm?L3k!Ovu7I?EG6R}5SrviJR_!gD|X`Bz7*h7Ly!QpD0U~s>oohbZDmnb z>TA%u{?4e+_VlhQOBX+U00y%S{%2w$UNWD*Dwbh`91zVL4XpkcH&8qc#e<1pSg=q- zPoW-olzbd3FHG{S<5?Fbf5RJyuN!RbHtAv@{k<`6o$>;WIf?7-mgLD)`3wzAQ*FZ{ zM<5wlCT}F;hiX!6fL|67NU-BIuYOrKFW&cn+;H6DE9_nPYc;Kmr971+dnE|I?B9 zJ z+-`izZF?XgDyKtKA6Uaj8O%n%f?c8q35S`XZ59)M0eKuB#?9gFqRsl+!?G87=GgI< z;84@e-q|X5z&rT9>MOWjx1~?0VWkxComJ+`)oqE4>shyDa%kF!Cf-Mfs(VuWGN=@fGNOCVbvg5v(Z6s_w1+xmn#tUAeTNRo}-Gc#2=W!3*3P z3x7v>+4ykfjq*%-{qtP?+~542XD4HyxU6dKZ~n5B{r$}s2w9isK7-5I=Fx%JDDLO? zLt~El>84I|&-byH`GcFj>@@eyLTUO*xbb8YwmUy&AMA8~!zQ>a@$f#Ql`ybFd4$#s zDIi@&!#2djqr;39&@;eYbHe>Xf>TynJ#LO{;FGm5-f+aL$04`$gRkfS!~6Tx+;9it z888>s7lBC-GzPD<$N^PFL~7ttL+ddn3fn(~|MJb@PjcN4h8$@8#lFGDpT6%EY=HOD zGm~}qaRfvkMd*#u6V?p}+ZBenLZK8eAOY?rRWmQK@3%$*a(Lc;r!3 z{Mp;VJ1hm>;^2ORm3)zesgeR(E4H5Y7&@6cR4ii&Vxhyw0yFL#deW%_C-6uGVXGt? zRsptQPOexpf9ddzy-M*}oC2R0gs+A#(ub^L0Y5?k$iVF=2w>nF1x!E$5DZS>8X$pT zG>>exz!p-EfplOhGISMzt?^vmbv<%#Z43VYba)qExfA*WjpYI(3KdcS6llx>3&biu z1+)2PjA9YM$|TrmD{1IdAi6Uo2~|2ggB(1lAi$3iAAj-iy|IB=Y~MuctiH%2b@D~B z0b4{sGC99>$^?;%*yR{jX36J(xulw*3e}P6?a!-FeC!^7*%fn`jR?PWOa=)#lAEk| zk&xmCyGqEn*u#Vp!udt+XNe7nth6Cou|xK~`V~4)J7r(&die*R8Bj>}KR&wuS`9Wm zb_I~Ye51K|g2SIhJPOI(m0bOGy_-W4YBFih*B}o|^x5x$?6|2!LZN zw-r`M_8MfB50FBP?FCwVMXh_Nw0T`GPxKJBJ7?$ZCuwEr*yUF@7WM!G^4>Pp{0r-s>1 z`BX4R9wxYlo=$IXhHI~!7)`UZxKcwn(`_5L4eDAJOF_tB+kBk?n1%2HJuoV!MP{t+ zbRcMx8WdVRjFPH+TFH{UU&WFzjz}6hq>@&Tk5nn@j-BXvUzH3t8siOE} zN2tm8W4T#MwoI|-kJsC6QFJ9`Q~KLaR2RV)pB6obaB&sC13K7g8Ph_7@X=v;pRQ0m zyw_PykIB#tR?fUNm!@xKTiwI+$^mMAzV6? z5LAP5`f)Zql>B9+$AC-zFX-{hgGsC|YQSgXm`ibm$Bvn%Q=j@0eMUkD^9k}80|t}T zLX-sgn%(Zg6lYjMfFxi-t|@^~lNet0aPr4a`3WQ=KQRqva2qEghn5$`5NdVtLEj^aHLebvnrmyxV8UBt z0T!Yo_N`f#C9}b*S_B$q3Z|R`ASpL|6U$`}tck^c6MxumWiP*#p5q_vm~BeszB$c4R@8p;{yxOm zo8lq_R1zhOs`R(dh2@Zuz5#pi*aiO=`scr35561i1k<+%s|Ni4U=J47{C{E(>fHK= z^OYW1G^vnZ&cX7>GQ+5@EYVlJ&WNeI&iJL2q2n1X7W+H}@o`RR$^{VsX92BzioKqt ziin{jXm_yXSlCn5?!{KS?-Uy7EQ#MjyAu*gAIl63>m34?Z zsvRGQ;#v-vCSL}7dd5g6whPpDi#???0W1L9w5L;#pgpx!kuBG*xT?m_|f9A46z;<)I4WK+k0;8lttbb<#^1ySdD(c#GNkvX8?J-Dq+f(jYN zI3G=EDF!}3OAfM?H7mIL9-_mez1U3xE5#ILpnIO3dx_!OEhtlIP?79N$Pn*cWD}#S zyRnvw;Rc=yemw&<=<;J90j}@QjLLNbOZ z5SZBHA;KE(yXW#80OXj=tu^MRqmPIee_@MjQ`%MY{I*cIUb zmrHXF9|0i|hN6&A^zzL|Kc|pr?;VuBkZkBGBx#sU7n14|G6~3bu{*sH+ikuX*x#`Q zp`8cd!n*miGM0NJ8j-T*F5Qa9%>xVQ91U$wJjVQjk#YtE2Y>1Q>*}-Ae;r1{5aFX# zgT*pWfl<$xhrYD=bzRcphAJHEyv%16+hC6uRPiM~Kh6Kgc;7%4=BN(1#Q)?s3n`t zI%FY$4I@_bYrW;r)f^;8d&_K78F>OPYpgxrT*8;=$I4*OdI7LjLujprv5{hC)mLG% zx`yhcj*t7Jl`dJ7so{t&_!xAi(x;r&SFm~{$sakxMvWeq036i0`Q>OAKZD8_ zO4*83|64+77oMUPuGcOA%HQJL?>0L*bqb%rz+*)VI)qY}tbFs!Q$CgftRflcuA;q# z>XVJr#2-<+>dB}@yEcqHr@-;8}E3akS9$w4VQ)C~G z7ee-1zSzI`Pe-CYu=^pBR3#ispDhZ^GvzPZ-6{J3GViE@pWH z1-)viQLdSUxF@=P{dM-2?0U<#Zh?L`=GnKdscrD4Y%!o|D9(*{JY)wpehmGXxPimG z_@89B7!SWXAe~g=M$GHVukVfADZiR+NS?=M zz^y=LC$5ABH}}dl^DBFZ$pJL7zjS@w_jJ_?hVe1B&#hMkrcmQ8&>+O{`dO`CDXj*=k9$?y?Fz%o`-r?<+ENEe|_{@A}} zDcQ2$Cuk%A0vbu$cfmriP?>$v#Yw>x6<*Xv<16i;4N%Qz<)S)%sH12$!_lSfDA>z| zM$aXmA+MHsonkgoqZl{XPMzVZajr#GsBwzaqoa``GrpR`teMgr{8#vLv!zVmFdqKy zPj&_sT8>n9ESl6(I5OIp_K2<^6baA<Yd}BxhcpR`b$vr?WFx!yt6Q$LeCm2ecgB zH{hZ|dWJ$J3)qf3c93T66jEb)BzHL%3dZej$(L}vnyV8v=sYwhP{twwwT($D=k`nGb6djPRFvj<%!?mAv5(cG2N(r{Ohg?_;6VXem8Jv*U3<(QW*Qlm}#MXP+{++!Le>!cct(yTX*XUi^w}Ims$;H!D%b%YGFn?68Xd zwu3iD-jq#-v<)vv=nOw-%Layh`x&?azP(kw@(sNG&Mn83OL3=6)4*0PV1 zgK=V?CmZ8LRF2r?hcEz529_LXPdm^sg1rTO4)o8?HQH3jr4Dwc$ zyHX<|g*`Ln9fm(Yd1AuciwgCA_7*YhJibmSpRVD_|}7>X$5se%GlNqt+z zcVU8%YLG?`_x<*JhATb94#B225hna-U+3DQl;;P^L?VBwHaK0~q;$2+J|DnKvAg0) z0Th^xf*|6m^_?<&kw9Ou@7sA+(V+hktGHy?f@$Ya!>{>jZ1D5nP}gk0*LTIN)0V{s zFW^O0GxN1vV7~jk-J=IejWsYQoB5!7VTZd{_)zTlSLHxO;zkId6wsQC(*eECUvQx> zow?MVY9;D==K%UUjK5Ah45g8wg#~q6j|nwO(5`-S_V{icvl(_pF*Nl{bcCa`52FuAJ~a7i;2BPs}+aqmK9iSLD+gPnQ!$XTgjz zuVB{WgBny{f^6VfVzYiAfD3}LyUiEL7=Wup+ITJSSvUG9c?37#jJ=r#OgwM(01$Vw zZHwdOat{-qa_I2K2dN_yheEQxjb0{e2GqD=F)-z2A;c>D_ zY9cmARI@2mHRThV*T)L-%;DG#jS3jVpy&soSo7VC$b@CeVREG3E%19Gb%XnQpbZ|Q_jyRa^D27*onCz*@SW4v&I zy$todk+%^)G;*Z>Nk)!8CvRET8RUjWGJOsJTH*{|cgY4kY|V*j5f<|qKj;MD(X*sH z75eg&(ye&-%6t7m)d^d|fR_p!-!-|1=OLud|KM+`dk>Q)uK}kT*-P&F(kYz_G>V0-e|)IxIgeP{cVz z3O&_}uOv5AkvSO(R@xDTaCHmeAB?ytk8SXZPtV zT9O3{E;S?iAu5Q(H|OqW=}|!3LMIAk#EGJq0>&!f`x)J_TDeaAK$okaVg4pz3`QdE z3%>%DV)J84H3D4mxQ^}d zR25HV@--ld74m!t8^U?Bo)6P=3+NoXsv;g9noxa$dLaHH4ao=?B9B@V?qGlHFQIPW znAgC6x=UP)pw2)IFcWjE;y}xF+Hz1-Ov@Z9XVdFGIpoNJJ>5=+fEC*zY!#sfkvuw2 zeJtZeJG_Bkz@y8a#IKOnALtbAETsg;2hg6D49Z!S2H>ou)jFytnKo_W2uT~TRhT%M zr|;Y8FS2`qkTEsMH3PYx97}S|(Z`cSvEaW z;qk}c$rz!iEj7(!Puxp<2dbG7@_;$P9&WdXLOFnB_$BS7=D++v{n5bwkf0faTe852 zMj6?d)`l<9UrB+(=BUB>_N?)oMc~d-vZtbOnwce!%dm~q0RF8}xKjpBaI}Vrvkm1| zEcTAp#q&)}FY_hlMW|8uR?Z~X0ENZQrQq01QwRIXEWe^9>fN>716o6C?VpImO#1wV6!Dt-z%1u}$9%AmQJ$Ru_=Tac|Sh9c?b^H98n zw@|1TO%d-K!k!CA3aG;_DJ8?N9CzCATPKd>WUn}0<|uxVElxupr{#5V9E4MvSPxJR z^ocbHtPv?}MQ!6tuwln(!!HfiwvHb?%UIiaJF0E?;Og*DD8?4TJ>wK&2hIdYLkvqW z!mc;#SZCgx9Yk0HU>r(|)`aRmK%pew_lMJShGWuWCC&)+a=?wZYnPNp`y#0h zdZ9FW4K!*Kzps|WUp)N4Ui(9VG8z?bF!cAuILQb~^oKHIf!X6g=N!QNR9_kRwoV}j z2?*S8%fc)m22YhduadzNbsh99tIwb>_7#Vao)21uu~ge>U&Vr--)UlbVi1sT#v^$? zv?n=cZ*WW>a7<5p93vuIoZ)Jy@e>9GMuw(-$m6AQMPIC(ZCQA-99y=&W13qSTcY&R1Bp=lS8|;*GIR+WVmyt(XXS1i66zDNXT~UAR%D_C?Z7B0a9hlO z6)*t*?Cle8#lIZ!!0C8Nghz2+U~c$?o->;S?V&$l-NDxmq8UFUb0c>MP7(I@O7Ilw zbx#}sTL52HKh7B}{5<93Izo=I1C23%EYG$@V5_!&1>z8Al-M{#g^fduq9xI<#=7sq zjImk{-K8pxhi43Sy-J#9j4o=iBrw$QZ`5xN9zb3sf1*!N1yTc;3>5%N3O1)zz<7B27x?aFs6zylx#L5w;a+*cA3SCAszkHDp@#CPCkP>0_w<2fEit?04V4^UBm ztGy-vll*S!x9(`6AMgjyk)tL0^4AD6PJ0t?gcc4IRntJFZCB~?8y+ZOb?zT*sgI3y z4t<&OSg5;Tg{Dr&UFMCaZ-CX#+HapDEuF@v@j%g%n~_-DcW>^#1I<=_3Y)4fVl&mp z;(wp&!M6JS+zajFP_$J&OEMRb%#l{}#IMB#P<6c8oF(UGR`7D-e4x+_l}i9J_)Evn z;-gewbB*g)b;(_t&xYN9R zEf%<*y~bd@>r?pm5YorZIn^M1JUpPM@*}+oLSs&Q+sY`6UUN&>QdVO!S%>>DrrjUf!kNtVz-)9p2SP?iRc+ zoSy;SVOul7`|=T8;XNh*FFh$N^Mdr)uM|RR#)@;f!}ZR69lR0B7nCpbgiNemB|{Tx z6W)L&gy5ND>a1E3;}dvzke!92`pM@TAT8ctoNk`Hp>A0*$Q^NZsAH9zQKQ9lzjS=o z9-;X3$UbGXG37FW2KT2!_F=1pwMA&%i~Srbq6EsJ49DVpL}tbV1sqO9j}vQ-GqL94 zL?PTl0Eh5jfw>z2ct85g?UyUFrBaq`_1lAQUH>G#OZ$6R-T)*-#D#-L6!D78q-)s* zkc9zpo7d8u<30P_)ptF6<7ek(d7(e8)k!>=T0t)9ji2Ou*;qmhG6b;+#Yb%Z_;%u7 zM=XUhM6-?5{*Ik16LEsG%YncBrQ>sugSXs*TIfIpK26Y_1ko$3n{_v8BJ>Jc>{$Ex z9(so4xe390c1a>oe~}&9DC!~Xih58(Q4ewu^@sd0fO;??X~LnWIJhPx?j%$3NRaYY zmPn9tuHl~s&qXF-U1xDj@9*%#g+59DMDozGCmexsF81EUrya36a&MFddMzL3c|AL> z6OYGSfbW?h*mAZUc2NJi!)*NwmY|V*FZ2}X&wPUk5g_KemQV7Ery~Uk+bC_xp0Ed6 zou1Qb{{0K7{WCcPYVQhvt=8}RS2mAs!ljy>CLa{s+-<@rZle@h_|q)(q9^zVpBdbo zJ>f`%VeG|xTx3`Kpr$-)+L-fVvwm0x5biXF?Blg;-f16|B5r4=>xpDmnN#N{45R!jp=h z9-(Ooyn>2*kj8?IJwnrD!BPD(1a*I!rR28vazoRekmr}>>b-ohg1y%r361t%cfD8O z-^-bR{DWmkbd>rc{`GDX&UExZJB9xB>quz__q}Kj zZT8S&56{@cllCyr9v+bcz)Z)_@JK4XC}2Xc(6n{z738|*lVM4+g{H~pco+oYogqG* zx`n3QCunHJ&PKdd=-3+;0!}*uzXY0O-IE{_wrOfqB(!Q>?LsYwFxa z+<$tnKfo`B>?7*X=(r=WKj6(LV_<@B9WV2yyugb@M2qRc zF|#~$^ILpqA3lU^1&Fr|z+tP;c4Wna3!aw)-sCU6{V}$E?B9#=#qjFn_+p5Z?f3%g z+^!J@S)N;f%h~4i`#$Y7KN|N{r}=iJY?hPzdU~Rr+0^!Ca9kV@fBuFWM@V2n6uKBT zTBgw#a}%3qZnh(eq!*qJ@4T?!i~9}l%6Q`K*>rkR;&$=( z!~J1d{B9Z}d>{}?GKyxhZ}x5of z8TwaqeWw0R-DJH&m=zbpG{>|B`iK3(k_)oo^@}M2{4hoEf6`4+FEK^pFqrGH-4S|M zAqUqxyCXn)|2{rsxB3^()W6x+W$NF!iCyV;&Wb?)CS{~w&V(OR`S@zS+k`Wm>P<0) zM|ClU2p0IJP|5t`dO^g+_E2UIC30{P6D9?VB-(%J_*s4MZsBL!Z!*#U+D!O)aAOAg zFAw17)*$`C-(Yl0{Y%qL^Qjq3^8jG6i)r4IsD)PIxY~@ID#$s>9*(t#L2_`&Vc0)_ zoDA|Y@1Whn&)c&y;HUhWO!yf$zAOLiwM_66hc_*Q82YP2S%mXxufeg_*aCc14sm|> zHAkvCV6kigS96u?RXV-b73@}j`ef?Q^s6)V=jBhk();A4yW1ajrJOx0Fz>Nvq~wnJ z(|h;&Gve17=(FgmO#RvChOYGaS!;lQ!?3;E;z?ES7w6$utikKx=v?$8>Sf-C#@%XP3KEfW`Yq0Mu@Z`(xinyZrOx0@%r^xM6# zpBoMK_V@AcLjV00f8`uM7n4(1@La)S6dkY78CdfR$vM)fH{1ioiTDTw>`NK#PK00- z@@|C}1^(^6pP#e(`tHP{;6;5R407oc4N;6#c=fmCXSuatsABut=aW5AA?Q5@)1gNf|U_iP7c z5O|)=B$~3c8JGAioOM#k5u8cXN;;x!Wv#Y?M8zkW8`dsWxHY9NqX*M|MH@oX{(#9h zE>4SiIA0l>dbgZodj2JD1&a;qqI9Vj=(-1vT`E_#%#8j`asrZ=l|mun8nRGK zc7zx(N&}$UwR=Z0(dqUilV)jdLhHkFsd8{~3-YJGiS@MM% z2a#5!X{fQEkZu1#l~!qO2sP}-1|=mFQ-xVPsc!)Vfjrr~2*QW}YYqPaeTcX4n>a6L zn3B|0$#@QG!tEKu95hVuE)oPny_iwI=Z=fAI*P&5uE@QSRqq73e=i|&6|c5mCE%pc z!gA!*B5fXpe*7#|!?ENqtbh2^iQq#F%sBwZElTTKS6=IEEI z7NQ9q&G0d(4@E8JjoHS)Eh4*if2oR4!>gzd3EW?-hMB;6sd3a#dJ3pivOdZ}P4~g{+Z_%rpW>mbw}2}asX$o;`48x! z1Eaxha3e(9oGN&tTn8++aJN6%g^DVKIz9zi53l&Yq`k89>$Saw{-7P|^@GgNHIqln z+;|(ZRd2oo!6O8J?bP=unfe|fQ{N}b)c4S#&Da$M)7_X$$Meg_9VBXPOV;g+NyrFU zp^%(`LEgM-a;Wa5($Qv0<=h7^z@PEJ`o}%ho;Kk@F4_>a1{+F6%pdLPT3dt;!)`Q# zc!k!3KbA8->93X}2II_o>H7JI8k*iv!yxMCE_-%QXYJ6rGv%mRvhnc5J$1eubwZ&) zDVY6osR$UrhadpeE?We)4cMvVKhT*OxcHZEE|j(8i|xWq`B;nWc@h7<7axu{><3`t z;mNNulS350i`gWrrb$IR7B)KJIGHVg!hbfuzMDB6%$TyO(|G`tON%a0G>AlpEYvcW zwFp{z&}is*1UKeu^^jec?n-wTC(U{XdO_B%&_9r5#7iQbuUL+Txgx~~6kw%~4|7eb zT4kX?aq&Q;TRaEG2s1^z2ZjADb!bZpMo2vL3@0ygL# znoXIxbX5l-(~7aZ%AYY=w24Z*N8&;rauP22F=3X5yARTfqe7}rWM#`0EVN82X_I(Jb zQqDaysSFyf5FiTjhDaeEj+Chnu|o2q#Ex?|BI^4PlDvw(46~LRrDB%y%_GTG+9Ec& zgDTwM61>IX88B4GcJQNs5OZ{}h&AaAAdSrMy@ByGWE+htiAj_x&zU#^3X#?8o0fsG?q7p1W}j4#;L_@EsBI%}EuR=lrj?KAHapI2&Z6a$IzE<~Jlu0F*)-(AMaN|HkWA@Qod3 z3CwgPxj0CY^!}CRDm^@!OE@?Tg2u4PL}8bFflKowO)@==z=J;I7hv$^gV=cmTny4^ znTcwTtO}C}VWusHM5D_z8Ze&4{8wO(zA@l_V7aZ#%HvC}qbw*KLU1TJgvq4%Ok-$a zVeznz@dt($UXmSJSeea}j0p%B8m^9JcRUS;E|`+grT^Xi{sYeyWZR^_i1^XH{Vn?d z*-#SdsFzzI8`7KXPY(vYgDg|5(7R%KQ-xfYhm2f*(OA9YTu3coAyg-o>>Dda?ZW%$ehT1!fmL9iL3Z%~WW?)B$7@7neRuXULtg0V!)@(g z?q#sJnB#k*2`p}o`Dt%x>E6H(l^vP~Lbb~3TUlKVs{>o9cLBbl0Db*KR~??F2cK=0 z_CWin1<=uXCkqvjuoco#yakkU9ik%(8luOGC(>}j2b?4^T<^+M8Iu^%rfRuto&+l@m;hP{9(b?2^S(bErG^}KO4c5stK7^-D$Bk(yOx9O@i;qHd zSL*^YiNXcCaNk=|N9pCyi_e`YUgBx?bj4|Ta@mn=E=lG=!Y#(nlenPI52(L_Rnzw` z_Az)Hu!bm0jTf6+$0lI=0DyI#z-5;d(s@FU65|7?<|ktX1ik?r=7ko*MO2(H@s_;OCGazk8Nx*T7rxqU(|@q;uZLiUQ>Oo8m_)aSv!58w(m3?7B&bLD3Ez3vtIwQQ@o;cG1vnWxy8(G3%>>GeQQ_?8X(m0n7H?2L9Sdu(v)qaTIi1Hye>~n zWC{MniejK z?rjBWTu7|~djg-KB>H>_d{um-G2ZtV0C#j05iE-?eqOOzK(W=zI>Z$vHla+qHDe$} z*6#tMcy13h(IBoX2$qake&;Rw{k`b0MD;(y9x9-$=VsOR#{k#GL50L$)}XjH_iQPSPM1;Bdcmd$D@!Yn>e%y!wwpG>%Td z=rw$n2&!WNKL#R1ivGnD%em-du@@h4xknd$IJR@U0joD^*>4$3n+xcg$4QEK&_O1* z7IU>ws6qCM@mGUbWKuGq74qq~z*328!%;1e7%?x!I6TuZ6*!A_op$wLz+7eF1n@+B z9pU7VD75gmq+V#@<9Fg9`2`S&s?5FQ3(?cEWCsu+Z(lL6Nqof{`d5$@e>gIKVh=Ox z8{m!W>1BN*hR(9m5=i6XQ~rp+Vpn!i=@C7H2=su!zGo-`1;GdKemW|9cEX#=j7nHu zqH+y%6M`wdq*2tYnSlwb-xeNF` z)@k`ll;E3mp8RiheapK5rn)t%`NKEXzEXG>B}uGT!i$GMRsgNdk1d*;a&9FRP+L(+;&yN*bZ$W~P`3 zbI_h^girH<&jKpI2m?04A2cO)^!6gXmHO^blS$JuOV^phK%!kPGY8)T`3<_L7B!jG zL#auWV1lg4s428?F0+1%r&l6aK|^zuI70zH$4zQb7HeppO_uJ=I*tdUtWbIpQtqfZ1 zA>Z7yl1L?Vs2bE7ZSDD5f&px;m!tKiP{|FWG%SH_1%#>+PkdQ6Ah;=23!bxeJEE(B zI4C3ZL~RvL0D#&moJ7pK(=tov?)2J88Pe&Z-5vMIZVBK%Y20>`L#+TLa>q!=0hamd zm;l>>W6N*{44{GbB+2rGWI{i*W86tjA?f$GiS0f>|E~%G{?U#f?Dh)blk_yDSy4W}p~MCUSs9y?p_Wr* zHI?wcA0%w?5j~5YPf?jFO<9{WN|R|T<&aa9g3bk`C|j)30B=+hMf0Wi=p6C3NKQET zJaG^RvSK^7TWy_=yD^y`AF<+zFo;C2r?N7|>$#s00%f3!+onPt(AmW=Db zym*@4IN)o)r@}QZzUakSciN=Nic$Hf92juZ5il|+&y;JIVLBkeeSi?Zo(-S&8u+w` zrE~Wn7fHA(P+myK(Poe&-h#eG^nCyiaEtnUgJX8$bL{WP)3rQiCGN3@+j!9TjzHNg zy@c+n`I|i~w1+>*0dE~DpBxT<_CyLt89fbh6r1XYL^!nk{=cQg#W=9P_80KaM)zN& z&e_)+;hb^2-G+y_5zl%#&ah4a2))_93=P&G4g*iU`llIg$f`b`qu^LnVh^z=W>a?X z*hcpX*od#w{SaSc%2Kw{Dxc<&X)^!G?KR}yU^69^7-CnEUTdXNs$uFcUh&m0)mn`k ze&b;mrihT&3dw5%5l)8iM8LwVo_*hfE*sx`PfWSayNG7Ul`FSFGdx+x_T8rEaG>T3 zJTm?Z$O@&XS?-8yQcby{C6`g3HRB7cTZXDERCb~%Hhnr?i++{;LUb-mOalouo=HC< zHu!Yv5+uSjp2YJg26@WllH4A9n7TE+ zZ>LFD_Y`V<2o={b4sgnyS}&`$Xh)UMa%TDftFC-T1L4bpTu|mI`&u8+Z zPveaYesmpc#^xndy<~vUwEgUpNk1CjEP!ht7zlKT@GY}IwWJROu&s%q4{7nPTg3YO zIYXya`6ZG$s3)}WP%pX-5CHf_)|&!6Z(tB`EpMa(zl}}I4glXIz#nIy3;G4 z1iyRncI-?D*5h@27kms!Av-ZH8M{P{Z9DFPdU^1TMi+I28u=N8*lePQ17%*}*a%KS z6Y7J5F#ZR~ekh=xjO8B0Lq^SHl^RBAZKw!AJsTp;GT;B4?wDgf-(Z3uB5UeJQ);V^ zO|syjNfs2#NsF0#1XwVQxz^gA&&2CH>bcr|_B;^l1&pam5c+RDYXVABm7(bgLqv}# zLO)W&Oz6T!dD@M1b&%^o>?YfR6BBl|>|vaJBs*~tZFIN9 z$vnV1R?|Miq~eh5-vGaVFec*ITW!j@*^Hbhyj9KfeDSBWepqnKH~Tup1#XY07!IcAq>!ccpcH2Lgu-zNN;bDYY&Q2 z=9%f-=rnU4Th51X(`oi69JpRULPAN~$y8iSuWy|Z_;vph3{6C`Aw_f91N(bmlxh6*Zc{ZGuOC#BQ{s*A(eE_4|h2b@z9NcbRdXLuA*8;#E zG!)P)<`Mt$*f#76<$eEt=y5!J=ZWdd&WLopCPFIPvyle4R>Nx%bM}Okolel%CIHJH zZ6t9{b3lAUo7CaJuh& zapHl#7yWc|JW@gklzmnC0_W7LG|V#vHg(f*F5Cf>MR-$Cfs;a>ERr`gsvHkjU1|Bx z?=i_}_r|F{kURni2;AmFMZnkNZ8!1NvEH0l#!(VoD`8y8BSWAg!PzY!eFYA9A&GA* z@AE!Xd5`ctKt*2HmLSB+OyF{igdpn$<}3!y>#=PBDod#k^lMl8UCc`9pWEKLJSDqD zAO&!(eOZKYy({zkY_NrQ@+Qze^*HdN&4n#qx8@?2DEO6tdiC}x#>}!+w#tk#c%2Ss7hMf?fqJ|fA^D!=3<&$>h?pKKTNjtI0YtsNIsA-pF!X=ER$8!#y+8dM-9y1X4ULS{q) zXi=_(MFD7-jl|VvX;p=?O;1GAw(AMxH*LryAaL#;Yzz?G*U9W`DU^>;4i@Mh+SEO0 zQ?ilyjv?$fXYv4pJB5O>N8$!6C}@bkq`ZK?XDfeC{HOA_!4u@?JfNIEmKoRO53`e} zgMoLf7wqgV_}f_&JGQqpAOb`?-?75-bpg;DA!b7jT$luK`AN2! z-7ycG*f7+W9uUZ8fz?oYD)2Pm9Ibf>@$kV%sr0mHwv{wmo+dq2mc=1QHI~62I@n4N z9;ES#1WZGzmb}Ms`T7G&ged1)3fz=c}PZYH4`qsVBw3l8xy*ztL?7 zESf}v9l|=IOe{N9Goe)&Y55eYG!XFxU%TA`M*O*Gx9XoKJtn6~McG)*mK?GJDz#5g zTYzqXLPzDcxPKiRQ2nMxo3gGZa!v|kL$P%H0+yERut;Bv4rHgEZR3B#QKL;n_Ss6@ zD(5NCfBfV|h7Y!fhr}0DQ9U}i&|QBi`l(Iz)0($cKS__la?N;}x`}w>k7a_#pI5)A ziAM~8aCJS4_#uI&i3d=NFX2?!7N^p!DN9*3CJ4)`7}jq5mjp~S*Q&B=c^ye}=<+(w zTE&*v-Gf8k@;a(Dw8w>T`(R3or(XRF-7#M%#aKBc0Jb1-59Z6=gC~@F4;eaI1r_1| zM7pr1s4!MJL`*}h60AM1e;wK&^Hq6&%j)^F=@=k)mSh{|+fQi`izva7_hq_E;}A7zpni_1n&ue+Zxb59Gk^EHr!stRl87YT9PWS*0TCV4}`&rbWPou4mv)XtZ? z_#f1qwe#Z1(lLZyRdWl5ZkCr|zU=(xFt&-%R+C(oTrC}OR9c(%(0Yy^itt%qXXrIOg?vK?gGV=CH+Xh}V@H&ZLg7mvqq47)d|2cM`PN^qIthM%kjT zG2U&jOs|t0Hu{Y^+XP$c#kT87J`LqsJ%PCy3xlj-!(y00nI~6T$8M~#q^1=>X1hWhGvgu_gdX+E0yty{_Y7_(_b8z<(+yz)9EH=_-s7RXrg=&$o|b5&f-4 zN-sjXv+x>>BZlr7Dv?LTc#i*(Cpv(Pk`@A5F)E*Jn*(J!jo|EB;~1?A>zH$%C680_ zqBCGUmme%s4`&D2U>HYjc~s5CRzK&+Qh&ZcvZJ#~cIm9r+;tYze%Dd^aYCH@CGi_i z#s^M(EhRpn(@*d|n)O9`A`~C~{62&Ae0$K$8%du;L`}zd0nA5O4yMx(AJ7#){H*&2* zN7tx{=PT5qYq1VpGQ$jCVE8QdN734F{(0ml>^tGpU5WPs;L@WzgH_qB^L%jW(G~K# z?$P6eJF9;k5uqO4bd*EWHp>+NZ8zjYVoT<5j4-i3>FC_F*?ij$T6PqUfz;Y?4BRs7 zrUjidVUVaY7N#EqcDM^u_1cq66$s4)Rem#}iTNr&D0e}Xe?NmP4D*^fMWT&=V-I)Q z!yR&f8oq=UVUNVAIGAzv-i`KfjXhj$pX`>nmo@@1nt-Wz52m7v{$AIv`kU*&9y&6) z{_7qoC)a;rJp$K%-HyxI=JnrV>DQIVtm!nhld%44;wine%s-FJ$uirHL8Sq}F3 zylekT<7-$X5-;R*Ln^}ujj8js;3h5EYDqbL||DN z$YOsK7Fs+zMwh zh()*|IlhJF|C05A7c&QNrh*zyK1kkNJ>%*S}kH-s-Fy@i6O> zm0aZzPp%e6+ZJFH0I>LJ8YQ*>vq4h}R$#;g0E<8oV1Vvnhx76IRC2aXf;^17os?&F z@M~rMFCE_DL3rPNtLB~Vzob1ZWWPf1KH*37%`WMumQ{mCh&e#64Ox?p@x-H(`b^qO1c+HeaS?pa$ zsNn_H0IeiS8y-ohVHB-nY+tfkC1Op|%PJtRcc`(64@dVCDMXhBA9&)BtWv<6Um8VD zflXjP_Jh}w+Y*dp)mGDjdr-DD2v6wpZDItU!5a;buzs=g73QJflXY3uCnTTO>7DI# zdZu}91h7A4DX|3p3xs^_nE6^UfZZ{zHtjp=l`anqa}Rj&KCcWqHS0$|$upOofI2n0 zc*!MRV{@ochFbNvau*c|@yCx!9Rr!Ko7dqT3MRvkHuNYw4qTQI;R$Sz6C@)d71o5< zxYP&NP z5C|Q3Ee=@FyI988CTK|Ymy~a7KW03y`n85kCddV2H0jf1lDV!N`w0{x0%MKGfK4&6 z0gZlpDLT4kk71xG+#X2{wo?%pm4~N%ot(0Uod99X_t=3rB`wbAuuF?H*MZ$ads3v$ zjTm51cOxXx+Jl>Qw`@JdYv~x_Ww)XTN0Dkhz(M9Dd4aqLRR%4A$2P-+t?$7%>fi6- zA-ay2JX$q;{}!go%R`p{VBOO$)-KkJS;uGNn_pxDFq9umvYgF1FNrh8!*lmJQs`uE z`iK-Hto}6coc?vJoOB0}qA%HVK2@Ros1xpJLMPlKW??zQ!qs>LZA05hUYQQjiGSkS z!+c8<%GG<5DpY3tLD|%?%xeJ z1Nrgr%lS&xdq4E43cNfUJ|{7xc1yp1l6raO+gsRa4z{ts!EMeNWDw~pEb}p!W8i2E zVtdPT_XZ^CU;F49kLd0C7a=MOy(pTr)`Edxa%=kj04pN|kEshOFH~=Te}LJCXMQ8F zKY&OC*n61uWEUQ4Q2>QWajQoW-x!sYXKf7^itN2PB&K;J~S9YBX#B9vLX?Lh3HSRuXzeqij9?y<`5DD_!x zQz+?GR<`O1MY)nY(%EeXbTblrF(<(<;6Rmgr>xZHa}sSFWaT8Dz#+(A@Q3EA|Mpm` z`fqEc%eovFT7+X<{-{xg1j=rXo7cs$*Jos^k>%LI)^BS(g7W~eKI13TZOWa%gSZQz zibv9v6Dzz_Ry~}x?X+eL*k$AmZAXY;V+l0eDI`P;>TgOPW_#4Anau;{)@0fkhNHe? zPki!x5{9?oyC)H@Ikx6l_%1z7X#n{-Pda-bh6F-xM%+z%pt;Ow7W{*;LMi@1RNqC& z1ObFY=%{wKF3;&!5`C$JDXlMg0~7chX9>3g{I~dYTe^j&e#{ale6e@kC*4Y!$(w+J z(69wwURDzQxFou&G}=}=u({Nq!`3;eq9viJ4@wnwD#?p(u^$KI7eEItkqNDyG=JHv zyyzRHm>X*b;!2|rOQfw7y>BPwfM2mFAW2O!`F3&tI=N{hLYxPq=_;kWR0_27`*W52 zhlyTDG5*mD1Yi zso&ad5)^!&6K)lCaUu?h)e`o{%_%5!-aeW4_ptYS@cukp9{T*y=EOrN1mZ!^Z*G6l z6@OR#)|^G)b(7BRX&cGKdXkdlYq2Zjtk0ir5wPa-0Qsn*0;?fv z)~hvy!J$9=f}W-}HAm;5tg~rpsJuv768>RJ>-8j6OnJvKT%maqonZEgm01K7sN{xG zV2k;^OOH%f#$i%9dAWkH2`~Vd^YFxl2yrvo0v6aEBx6$f_Dt_U!`arCI{Up_|53Jgb*Iag&=Xyv#`vepZ|-7L3(A)Bs(E0XL%DW$rdiQ81m^2yawtWfTvRfF0y zlGL8Hv<6OfVhm}Hd_B+S2=hEL(J{D5;s1%CZY=ji91_2xFU*@k{R#bU3|J4>RgM>c=ly`S{i+SWc$Y@{nnipTKGX} z^c9LL85Xs`1G@>ezysrFiB~kE>wqa)*{YGv9jFX$)moHLS!-$Zt&!~=CH>w)Wp80_ zi$b6;Qi*KDX(_fLi^sH3Pfo>Wdb#B%_xt_X+IR;Uw(xs@Q2x6zYew< z{f7Gt0`KebI=+AB*?JMsSBnmfNR1=Lb%gP`=O(g}3PS(A0nM1_f&w3)=;FN8jqE35A?P z)zos(N}*3i57mW-}7u;gx-E4;$>^*zbu|>J*gB;OCby)U0St(hv5;x{5`}Adj6y2|%XwxrSX*6MSYuKce#U4{%Scp&F*DFQi4g01 zaPO&EN#BFuf!&b=&2bR0T_%GejTp8|!`5KsB5{#bZ*Lfh;Un%A!!^SgvUT#A@JY|R zNo@A{JfPbsFIHN%$J8)CxkIt?iq!>-|Jno>2vRXR1Arl~ZUC}a z$C;aHILNa>!_mZZF&w%VM$&d1wU)Mn;R8qjY{r8Ab@K2MnmG#N^CG?w#%31KGOQKA z#LN$Rls*ntNN2MO3=G!GafZ)?8>MRJBDjIIfJ_S?1bMnVdK~!GrAhndZsHmlCeHl! z2;pdR@k=SgL{(mSL{N26DDJioD(f}bMZPFyU6eq&IkPB!K4EoHzgZ!6* z&We=_>#X=bxyl8cm2J{gsYAL*$;gHOIo`|)tWH_CVK{v(C&=GX|DbCrj&5@8_F zqF7G~%)!{=iKGHKDZlaX^INpKnd#L@muz(+>R?8*s-Jxwtby>veNtH}fBF2Q+yYc1 z?@r^Jpfk(V5B#xAS>-RtYo6~Odw_7o18E90-^{{yvD7^lN~(Jd%_@2WzN)AIz`~}) zmbc`vjm0`iqrtQtDG|%m&R)nN-wHD0?Sdk0MFGU)4Bs{>@iJ;d4o3;>TVPK(Dr5nKeQce2oG0WzITh;KlA#% zTO3-5+wecXgXOT{t}6~-}p*9yhzN4zvcCV)!^74in$z7 zN+{$~r~qoIv*9mKy$to1AaXzTJh2~k4~0^!KN+~9lw|0tn^h4NxrZ8^r=5L%cFbpA<(dzHbfHzmMA(kYG3Cqk|(SjLL)&+7JUZD?R2S^-3X?3lW zOKBvFHs3q~Rf;FMqJ=YZ!WAnmgT2(80D~bkvPu|?5$5)U*YAzc!soqypVP(ogZU*A z(h=vth^(5r>j&4R=&qynG(~r9Pj#zqGbc-x<_>$PvxkB9aF{*ZCt7$& z@rS5*tdI*#XroNg2+uUh6L^LxOg~CeP)Epkf>O#~iuMY=iSk_gh&Ks zr=5q2VCSh0*>Mar(CK)%+cAE6(#1as<2KD>JlvY?vK^*8XkjntxWlDZoXKG@&{Ts5 z9~`6U1+nm-E+?z;ee^Qlcz5zeBv!~?GK|}X8cq_)#@770;5K#x9@fRMu^Zsz%o94x zFi_Ebvc^`qvRO zSr@F!F~PSLxF&pCDTR2r^AqLUNAaCYUrj&}_BP`yJEz=?G_& zXmEMJ5FW###a=en=;15c(4==NqNaU(Jh}x<>a+osscHits!H&KLX9Ho^^X-%lOzL+ zdK#K06QZaMi5o$bcx@u)7s_@40Yt6)Hh?IOpmz&V7&NCM>aT@9qIzAMMAQVdVkvdp zeVGvz58pZ~&6zHA-e;r=%N2 zJG&iUJqk^|g1G_k>)Hh;Zj%80JY3gz=p%MwTUhnYIMhFYHPA8Zqg9E2E0}z2BWhLSP+*4r~*S!q}qz-vlb&w+AC$obiyGOcJo{#QlUh@@Ny-cVR3iokT!LaEw+3y&#Rn zteYxateDwM9@t300%N%>Y0CzLi~#N1nd^}CL_%B6w~F5OOEtrKd0yE;Oh76%b#&9D zj}@}Axq32$C-e1WnCX?zA)<^QbPCcRKP<2SxCwDid{4u?bZV9$c2mP84nBsVL!}rZ zw7i!C(~Y!283ojD$-DWg;+H?MIfIx*VQvOS3ukafWO>eFPQ_FTDi(_&By?>8-JJe4 zybjG)ha-RD%($|ud2>k*+F&FN{??o$MRSHd%(RChdzdN*E<7niKC8LeUL7k3TRZ;; z>~}Ih;IaEPUet^y2*VHu1Ip|*f4p80C`SV2LRUuLgpNAz`S;uL9&isG!Lc6hu4hd! z?dI2irbk~&Lja$Yw=9oXX4oi?DKl)=6FkLQ5W{uMU|CF=ArCLX#&tn*PHZCftgp!mL){v*u=iv9(-AFEHA^%7MKACT5u!mehps- z4y5lpgcZ*rDUazFT_>d1!n>%8r&&Ja|KhVzRBlkL$^7408h@B!t+1|PABXLt*;yGJJBZ~wh46WY5ZH_g;1Q&xpLV-%{ zU=VA3*m|C<7#ZJ-LzH|zjC_njjv8@4MLvu=w|D$brILB7e%z;6+$Ol1@H1tp?GBxV#v3^qh!zEY)pW1k zO6m$0MFazc-10;~(;@XWqrlZ8E;$g2ZEd2D)Q-j6lE-4}B-Qt^S}z_hd3bM;m3(d} zxB<`ye@Xt;^>4Fv{E3lyYB+}o=a1K$rDV%QH-Eg|Zi^f{eX+oOsmoDRrPc8d)=SM+ zA3C{5Z4)a3T0{{9Nd}qJ=pU$$uS7%ogz}DxLU~6;p*#sd6u_H8Ajg~!BgfHnF&$Np zI;o86rJS5uLAnZcqRI6s&GNp>>(i9JdZZK+EZYey5KVkA#*L*#S?m;is^B04?f`W2 zH*7jisKK$=|CCSzbct!paA`N729W$E=^Y>4f4ZChxm)$sW<0@ZJrPjQlO~cs(v}ud z%98KLuPh|<{f?5eKF|FK!=qSkGY`-MK~p^EKn4|TC7m~IO;~+1#$77O!f}4 z-z?e>kDBTAblG4^B|2sJc08Q(sz#@*Q}4$5Lg-9G*nQv8A?z~?EEj_(Ij)QPV|}y& zY;2eNf2FfQc!gdB_OJca4Pj+FJzTd0psy_Mi9=C5e1NP!1pCFqH(nG*UnyJh@S0DE zcy!GCMnZOAwB&|hKi60vkV1^qH|Kfy2$93tjMY>l@o?XF)f;*L$rNuS94oPP=b0Ny z*e{()u&SKP4GK7m+Y8#mZ=LQC6D_sC0|Xd&FG{UVvoAt} zZseODm+%SyX7~YpH_yCqxxJIhK5O3a*{7MTq3qMfGFWCNj{LDa+ZM?_@4cbyGkyL} z*r%B<3wS`K)GF*#u`-Q)K1%E|`+Ts!&pt)xCE4c@)L=En)xXHhKHHPG(2T37G0??~ zMnV}E>u5TeW}B0E4}KN0Z3oI`)q&LY+s*<6vD{i55-YIFOnU0>S@wP@?>~n7lDd08 z3aE@-Ra zVxe3sYz^8=o&UN^{Uc79eD;-fpv}TR`r<>*g1ztv5DO3pTPSyhVN!r+Pt`)UL#}FT zDE_DjigPVgcQ{3oPoZ*(1dQyg3VGQLKQEIw8Qlbl!cAm-{zs#roIz+TKjA-^DhB=W z4`M6%K6Ki5P$_k;#Jvs?AmN434AV8nKh&m4x2R2=WOZ{Kgd?1RCXshlqq6oF37W4al*IxUa zGmnH|?f>4-e?Fh&>~qdOd#|A9%jzt?x0rs=EjPBCqn7S>HeBXnkR9wooG+X&EtDJnBVNqT7BI;9gFb z-p{>xE%=6tcl&z%W`(>_cq<}t3vaovR0$p0RXS)AB|+51ocw(Ywti52+-R$Q3d{sR z#ZN@h%JkAO9Bq#j#Y4TECrD22(BQI98xe^Qg;|o|kk(ab&OMDKG9O-WH;x)E4-B_= ze_$zP|7X(csf5tW?T4;|J&8-pWqqD>RGaW62U9+LL20q%A&-6}gLW;&`f<-gEX#y& zIj2ZOklZf)UkFy{wp%3=#!@MniQ;iW_%MzN>~dB)86-Byc5e#IF*4%h zxV08Y!{be0Yd>2kAJ9G*(~n9PALl^d{>xrLmjk@AK}Vm{LXWtyKz~2|z8IF=sLKTm zEaOLWaDu1$|R*o!f{9d84D_T9%yNUbaHIM$F0z;I)fyj zBtjg+9)pr4Ilz=GerLa|K+yd0IRil%On8x0rO2XqwJKr}>PSK%Km!3QGRtI?NU_#+ z1&Qm?W5ZdkFNs~51cIJrTgf8EFbt)ar>!9IwEAdHTlW8&Nh zqzwk*hH+#RRE#+~0u&BOq@iOuKVdmHY$}T6catDgc!xf#EwkwtY4V^dj8d66$?UesPt}Fy3V-2xRyPd{1+#eKXJ=;5FzFXz{$%W849;%)L1m zcYGZ9`Stu@R($V;-JsjP{pqX&lUg^frFyx~SJtnSq>z z?4rsv)x*RBEU>-)L~)7UN&tN33Rc=q*Rlo)NcvIKfe~A6p*i(&`ZvPH z43Gl=u;c<8n%7Vb(Gru_g^EPjz%yWgL~%={Gu*#|gX=**WhmZVq3W2zlS?V|a`f6KN z3CjwjtP!rPtui~xnGUbL@W3<(0D<0bt*CXPC(?=aS)*C31iL)>NUOQf+<%s>8Q;22 zvmW2=oQqJ)AK0GB;=9)>ewPbO8d^qepnxT&`OjaM<6J`O;ny)u>o@Wrq@nW+0t)~>^MKbGY2OyV=?&GAAL={xN zbBz{x^V;qvA;dwl(*?1xjn0C#fJNq=t9ZjU@}^xDa9@>c z#Cg02S<;=yz9@9H*m0%2LL(|3*?Pu>8&rS=Y2s(jl!4`%9hYK|MK7!H$=qHPGsv zWIgx_;L-USds!DrFziG><+mI~u#=%MGQ)|GD@5t;ipVE~k=C77ALZDdyW0nBvF%32 z?IsfbJShiP+W;G%l$DnfL_Mzr#g#GVLV?JiaNo*%P5?ZSRjWe;X#l%rY6rm4#N5^s zn@Depy~hV@@C@n-Uj*daDT6}u-O60=t?x&d;b!6J^zXfX*JI-H%gBo5^(j-8&x-?m z?q&bgv8;>PgKRoapk`gWOI=wk>b36;`h5cts=!7uMQ}e-XTh7m>3odmc$*|O(71H8 zfoOTDiAbCBx23Z_F!e*^#+1xsc^R1MqQ9|^dv_V{c5!!G=xS`khDPY*4@_N-yUbb+ zCx>V)UuW(oCAVppOIH7U{50*KS7Se>Z$39oc0lIdOovL^?#EQ!ZYE%BEbhO#Cm!dU zLmxrG-^ZdgbJA|ufAgIM*q&+2aHM|y9~e7K7OyYYxxDZa3V?5(`TJ4URDwaN?vur9 zM$v*J&hhCV@do+0%`CsYYK~`Y?#hEn?5*7*BHKC4)}IcUT-I+X5yo`#gU6 z=Lj?H&5t{l$;FBQ=eL3H7-l}xfs-gcU#b-lM1RxmNs31cAHY0)qQU~DLs<4)ps-w! z4$EH#3oP$+jrL(lTn5R!9H=Y{2`tOyVqxKid*}xcmdB6sra7-FS0{!Ll!)~Uz;ddC z1xlZ=yy@t&`kpkpjIgj=H87nnJp#+}uUNXsC5tXc`LLYSCoGSgpmaf9gylj9%eT^D z`6&%la^%MYb{>}dkM!vB@KJry-i%OUBoOr{Y_jy&)Sz>*m0(dF(V`=ZO<4i*X==<@6grOQucn42sw2DJ-v zh9EX34GP-_ShK{hYGj{PJy@Y=V~HTE8giFbb)=4{tH{c_)8xp9UriH}&mkrh***Dj z$1=HOvF7{{9@_sovM;m`5LgD4qOd&kzAmDqg1J&YgGEBw1!g`6YB~m$Qu~^YK(?dP zvfapRh)+F&!Pq4F&Hk2#2OpfVb?~`I6D*c51H4gs$LxIKU!j>|%lS=qIUB!`QO>8| z?4z8Kwwyz=%egbNod4>poVPgSlPvz9@0^f{*V&onoX}S}KeOem{~ruMrPF6%W;t)F zg3n2x3v4-a|B_YC;|FEX=dr%Z*#qUQ9Q=c)rpeZP)!1$=m4Ly7ZQP%iywq(lfw*kt z=ucj%#$MLiLj_K-7mn(Xd*m1BZ#S26M{J#D1_!~PNG_F0V`j^b?99*_ z`a&XKWA;EQf&F1lQ-^Gkon{6T7hx39NhN`r8h?V06w$&v zol&LzZ+cufgO`;j7wOVG?D4tYblzpL9_L|=jTZsoovVmoA|Xy};@%B{uA3m?*4VjS ziZ*Zp5zoo`HaK%afmI>C*DC`%zCR4d!Ob{l%zzF9D$g_BRW?vqMklV^I$>D;)`L|i zI$hR%hxHNf>YN~k<(zlD7O}W8jm1H41g7(uQ+@-fL1f8drLds8B6z{47xd#$0X8H) z91BmlRl8*O=7lI8MraXboXnk#3p~t-UsEuTJ>B8^P|H}}pnHK}Zs@kCYB|b#i|zCevv1My=UWuHm-lvH z=(g=#JRSq2wWNo>xYqiON3I5#J?V@^j(bf zq{=DHHfGknQOap4#-m|!k8e4*} zuC0cwTPUmx9t3YF#q4;H+on&KPkq2Tkh-(R^g-P(&aAuZSkz8Xx5h`cZ|XktAgKEh4&%v5 z-Ik4VOpodyq3Q7=|L37EpJ*cAC+?js?B6fGo%x+FNZGQ}`k<`i+f1h2u^RZD488PM z4G7;h^p~s8vib|s^!d?!(A07(bV0Uu z-GMH+^uMh~uoK)0tL@mQZ*DyZWv9->hSNcssxH{Q51PX1IUBb0lCWP@-cweN_9V=~|4?q_$$YMGl(o6>52j3o+8P>bFD#+$r(DM8Y=n zy`u5GR_v3wjbpzcae4k(ufD(+R|1P<2&cbFppyQVjeYiyXKzIDsXMp&^!*>$ucgof z=Dc+b7^ZHwm(BM1H9BDNyNLc_T7$8;o+W^YHHv!f(_=r-oUXb!(1N96H}dw#`x8=PKX z*AvcM!HPHs=hvU@jcoM3r2h|}$-K-%9N@}9)ycRf7dL@-ELC+>$2oQATNFwK3Nk8U zuZ9&H)L=&hx&$;vGEvM1xsee8?4g4Z0Y)@fJ0{3+I6!7ZB=*9%Tmd5y)eJkrHIS)t zG9h6iI|pt%VE9Amgt`rBqLpo-*j{uwT#pEdA+POKFo1*`=~bW)3CG{>S`?WHtrTJz z#M5;yxTz%~VnMP0=Z`g@lhpSpqrkjcgU^x@gw+mD{5AG@Sh!Fuf!?qW-xHzO^~5&- zAH1z1vy0R&F@NG5TUID@049QFpwXOHXqa4y0I7{c#Jz|&?pNu3E3dfklzZ)CgPnvK zkl!+a=liqYI`JMw3vIJdK39eGu-vE5?7@!|af}Y8_zeZ?!_-9Mv8W zsCK_VwO{e7z3yMBwyhUzSB&(rZPPTdU8?D@*@9jJ^~@K-R@6uiZ1)IMyKA7@!Ctku z{wvjzr*gIJzJY4@4ph6RSM8vGrCO2O9N4}-!YA@ZO_RtkYC3F^hz)*WB8w`|QEfq> z+ChP8^So;J?W%{Na8RjMFrm;CxMo&2G|5>xIv=X%S}aLJPa?PoK1SU5L;>T2!#$3|gEc z!#rOWEy@G57!jaFnMaGy3<+$m-v@vAo6U`vJ>yW-!J!pim2Ij#+owC;kr(-mE@fo}3tsMLd zJRQ)EO1xj1y>aUY?_wpK54R2ZcnVmgWn(>z$x>^%D^Hv*W4(TxRNA}D^ zTIMTF;dt%6#~+1e4-N(4;cf9Fg%=8axxmxbOK{{LIHbgXYM$Da_;Fhc7R$p=>#MXl z6PfWsk9l0!TVv#~&PJecA>#S!bIj3E0t+duGcj$C@6ydFTfv`CA4~tnOG*Do>^)ge z+p1Yf3K~5Am}X1!$MkHQlr(KIe|&zoO#;L5rDuj78F}`C(Rp0JkfBOmRjH?9P@yjf z3Oz{X=7G>H9mjtln5@>sK$z$j8u4-oR3~2~9NY_vo-hd2#Cz@$@~FI! z)oc5}x6pY{P+3|g7@_!&C2TMWp^JZM>R)_Ec4sV$N(~6YLhCHHg~F&x#c&>%Pr86` z)K$fwt-=;oxpt)Gmb;`GyS}6scgP{Fs8Czwx$_LQOT{(3rWy0);a5$Q3uh9$kr@W% z=MLk*6AqccX5N)+amZ0}*x|CL^&X*?e7@>gmHLF8toJcpJ#D+IEct7^MBBeS_hO(L zKnSkqP*k$`l&I^xV#w4EWDdo7Uo!Twpab(m#qLoiiI~Lo% zhnu#S)E|WZyVf6o|9jMb75{gu$HJF&laB=!Azkr;4Y_+(;-khjRh4Td?ZenLdMfbW zc@j+xmPwSin=1u3vwJ#Kf}Mou^cb||sO1-x(%`dQa-Foz>D;7>~ntP(qtudy`^w>9F4Ki=$V35n z=6Vz68w;U3B!hxyH;-a7f?mx!3Pz_sQM~?O(hZ#vq@UGv3DQq%y38B{!gvH}nJY}W zK=+}sK1Q8DuRcbD-k@;wF!ctdE0CxP#XBIuv*rO3(Te&+iaKWp0o@28ZIbUDtsHBh ztIp>$SCFG*(S4ghwZ~or8XUEXw-~~#+z^@-E@1JF8t&>wi!?9B-;dMYqBk$5Cm{jX!bo8Ql4b{q&qkiZ&ZVCbN-p3mWCBk+ z_P_`5@kl#HSH{qG@Qy#$DuRg|(rUQ3?drH|feNa&ouhv5oUHXj)Cx@xY$^3Q7@?62 zAe#m&CwEHq%E=q#M#kUmCMc2Qn9}dUsNMWy8Z~Uv81xCL*$uvk#yMLtZC~5Pb}Bsw zD#=OZ#2P}?mkK!HPqaL?M6M*HC3j{H`>H(3fl`pgGPP|rp{#2)D|ixsDZZ@4m#d34 z4ZMpl)O4A7Y6%sNsy(lTkUoVB_+kNu2Ugz2h}2LpD5BO|~$`fW0LkweB2Mp`uM(kb;f;HSHS#AWvOE;TB0f%{Ew- zD4w$`XVuKnaM~(4Lv)!rIg-!hfXEGP10ieQK0V9c4J*rz-k~)tHl7^xu(H@7+s+nd z4f|9G7#j8o%MIAUoSvjC7XPC_=lXC3sg!|3?CrXVla)}Q~eH*@) zi(h|)fS7qi-rx|r(5yoAz{kehtK!(=`4fpk>J~lR_V7Kx6pdrWZ?D^;@?1YM6n9}G zFVVZSY~--h0cZ$|#c;949UYR^%Varu^8GNJ_Gh~hQMxiLuuxurNzEQ>t+$;aO#G74 zQy|x74N|ACj9$oAb4rOF2;LN$$DhhsVyk4BqpM{(xv(nj-cq@w)=KmuxRI}MQ)GS~ zqEs)^c(HDE2qoKvB2%Bk7@40f5zhIETpY_hhBq#KCeuSwhcI)U&3v6)(qvM6Dj?e6 zhyq>mUtjZe|9zS+!Sj1GU1mCe&!%uLuy&*x&xf1)J?4RK5FG)PSh;@EaqR4jqHk(7 zb{{8jsC$`O@DYH1{83`qr;!Ky%_HC*0_n!xG)NJk8GgQhZ~L!H&(Z!%1^X`z%p!F$ zfgjUsK>n<*h?5PR55yGQ5%Og_hLorV!Reeo1%m}013M^Nn@tJvX_!yZw`A}bYOap+ zj~eLAH?eexgRn|$MMWSYkqPfmffq53t@r!!j&~$2@s45AxGM)ghe!G5e?EPu$LxC0 z_8#;1m*2re#y{g}Z}ARGk40mZ9`JlcB;YB|#(wuitsv6T9ww;6WtLwF`cc>+F8xRB z;QZ;zh`^R|x{km;LB9(9Q4pL`m=`P~6W?JDo^gbr7R%gEfo0s5H?4rl{K&@}=!?}@ z2ljRXm%ItH>`sD;c6JV=MjO#ezJ5Jhk?{aPiRK~8+O|Za(gUqOMHhwAeWx~~0fRXc zdn=<|EM`Ls#S-fiLyt@>J%#R^v}SC@IPcWsC6KvEKr)NpqEV%9HQ~mf8Vz)FPPiSH zVL!v%aF2_`9o#2*a94P60|SK{7!d9fg?rqnO$u}^nh=v(b#Bn(0GbDf1zR+;J?5OP z@WY!Ze&)xAfN#MeKe?V1p=KpSNR)`?Hb=sc@m6{tWvHwu*w(Bkv-}aR{2I1VoisXE zH8-~+vjl3I7c-T_9%)I`6^EsE4Go7Q)O?4$#pq;G*w=q;@|B8cb8d)%1`HFnT7g+w zf2>DEP)u7NqN-E`xk<&BW484{I~>@&FZ%;^qeG9BDM{h?;8-ji%lx(@>q8jUx*lZ3 z{NU3ws7rPv)ff>SX7|dN$PTStMGaMQLlMJSI8A$CcNY-Lrq@5Kv^}6#=*q+`{cD8& zd<68Uo>p9KSs!J3UM=1NyKELJ_mBrODe_<@BLC_vi+r`mLUq75;lib@yvDn>G!aZnOYHlZ@eBqnypsGk%`UN5iG zNjl_)evouze@MD^2Ii+M^xgIDC*uRUe>fVVek~nAys)A2e=HC&&p(l5L|nhv}=Ax*BKp9D_baqLMIz>CP_r;Y@M09JpQ z@-zPQosysCFJFERSIyTaQTio6UDN&#$j^xr|M%smO7?8=kcn(xBfNb-Bxek}-TsY&9(mcxNFrE%LrWyA;`t;FBb zoY_;o=81UCQ|&d+INLmX{J{Eiwd~5ADK0Fc=>$Z)SnU}6F}_RcN)Vc`=ci6V3OVdA zQ{PWKMd@9R{=skK+CP|j8LN^00pp9w;vc&=OI;sx{yOPCR)qoX*Hov-%DaGZ%O zT~1^`pV926-3s(Fkju3nze9Fg|GfkPm%?}kZb(2IzQr+?&3TuxH3Aq`3whur3 zI0`EvcEZ|*v=i3-(}Y!=Ha+(l^7^jIYwBhzq{rLKPkw?HSJVhOyDy`-FK1X@A;2>x!<`OS}>sPt|_4lEC?|g-OBb^W-Pd?o zGVM&Km!~z5C!NnXczLD-@&xF9{SPhOYpCgY?H%x(+r1s^9A zp=PQtuZcvat^IPlny6q1+lUo=dor8IKdnQDD}UvcgLm_I17!j&qkvG+@TOJY6q);^ z9CvojVhfiBbR&s#ko#2h%09`Pj@>d2BnOZ>5?rY0u0P35r-MP7egrab_YcfEY6IQ! zX74#0o5U@)(|Zt7+{`-l2nbA`>Ke7WyTgfN6&b^-_S8q<4zNtKyC0oP?BnCCO%ZjAhO`G-^QZ1}@bQAQsV#dH60i_o~xoWI$ITTwm&anRpk7zjV()n3LM zG%g$IegP!OiZ?B-5Pbap{cI8rlowV)+1M9nS*ZCo@}_h+-$5#xs0K9EXs&RP?W8^_ zPcOpg2dxQ(7-1Xq)2lF`h5h;X56GTRJ1(I`gqjIBpywna_H*Ypxhm#PWy+2aH*t%{ z(|BLGIyCD-NwkG#oxubb9CH3nC{~VJoUViI{#HhMo@T)fQY}+(bXJC9LnOzDEm-)i zF$&8zCt;_ihlnxGSDdBoxB5cQShMN+;%p%nP%bhL$RrPOMXXjtOhouozUsgNF+38`%~@R@m_n;!|EA*PVxgr`w$ zsXcHp`~O_VO!l^yOYG%*xr}<&?Ui#BMIbM=H!gt8|7FTU<8cB0iE8j9s&NfALiyOr z7edYJNPpR{a}3At5*HU#CC)9ZN}O6$C7T%^B2TXd|4b;Yu1ef!`KKx|7W@ORj{kPV zKO0enu;^S?7UUnLU2@oaY5XJ3q~o6}CC7-Z!awIo`J#5n zKOccQ(fEjTRw3#c%5SC&tUH@&*Bd%vhsZ- z#D>)zX9QSt8CVRg`FmW<^aaA2H`_~_z5GcoU`_JmXzsoIEEMKw#9|iX3R(nznf&?6 z(WI)xgE@B-{Oip@r&b1@+LKi)btR7eWV4l6JdrA6%GQ{(ro!}^ zP+m2OXTKmW_+_@&h;OpJ09iq7+l0^^zeJYUwsBKN0?wJ|V$&FI`~g&B+Y2Y{4bxwU z_a2}{?Iw8-87Q{xO8MfBv@Zt87f>{5UtFSJOpq@wP5WXu`C_+>FNVt(Y!KEiEmOoq zdu-d}8I`eZH%UofNh_&9N-AJ>M^-@lI;OW1+R63J-M@`(n;L5V0hlGWtzpW40^fDt z*)hI9lM-0F{xa$LO1bhsScKzAVrt>ZgOaYd41i!SaK0-U0^YqE4G4^O55r!wi?`80 zEj#^mJ_Kv1Qxj&Ykk62Z-yu~KiCf=i99GZD&hRWB6EJC@S;&mX!LHTq-Jdw}@ zv26umEucGXlrFG7x`|41sSMF#R^Sa7n2RJA*r^&4%{Uju!ORFlbu6=drThKC0nOuE zH^n1a{D9jcEh#nAM2{X$l}TtpcM!~d3!34(RfL62LrvZ(H|+X1*5V`V|9h#w+E1Wn zJD3m3a+Vlt2SR<8dZ;b6XIcsBWSi+iP20K)blwjd*i1Z{^|OJ~H3s%in>h+GL81^KZxq?lLk-pS}vyPkagrzc>n(n6Lghje>?FJV@zYTP_vaG5#rr!38z-T+BjC>eE1 z6hLplz2Gp;C2Ay*8yTETK|lRreuH9h_6WoPp8f3crRO0g0ST?;_3C-VZ+S)Q zmNv(Cf!(lvmQ_G{-6P-2CR~lJ`$~SQN=_uGoT%mI0Xb{VM%f&{)$fIPzNGQZ2K^7P|S0i0s48vNbCP9GMqQ!g_FOCpWx06N3Vdsabvr_&L;E zC7;tPpw4VLfwxX64@ot^P|~+K7{dEbey_rtI$82Hgj$ZJWla`uMCGbqq+!KTwVj{T z-pG>LgZaqGNAyV#j}8Rjnr*!*t<)LpiL<}8c@E1ttILQ_+%s1G1(wJ7}Xj@W#)^;lPA z!_O>+={6?tqhG*!IDw9JpsiSaJ4dDSVxJrlYWcp1JZ38MttiuRd?MlBlfWI`h*%&* zM}~AlP{Nysr3#pA^WkiK3>T}Mda!~3ha-vc^!GFuZs6dPfshi3gA#MGKp<_`I0($K zK|mQ@4sB}hv|4A1`907ZafZ=~a6l0%^oU$9+AV1Ya$@J)% z*6Oe-sVne0z)v>5IN}iX*XxKH5#^8RR!Ol5oQ}06Ht~Jp5}FNgeVDmmugD70gTi7@ z=|N4Gw}p5NUZ1+j~wfwLe znF3}zS^WKp-w-5B(P@@P0HuT!5onXapIZoG4M7BM(%Yd2`{{V*9&h_85zK?1+2~GL z`x=n|KfCCsP6a3YfNbW%5=%7fzx=mhNV42y@u~Qn=|YoNY~d*Ce$+9>ErRFd83$2y zTKo$He{#yU$)V<(kVp-dTV5q4^^N6^p$7|pU@RA%U@Ue$K9aZ) z*qs4m`Mn})jVWIl)fRf>>x?}Pp~jtAR>i$G&oOe!tmlEmQE&D!pv zW`>8;)H_f)4EN*S#VN4i3FcOdNT5S0jRyX3E8^x+W55*qBZx{sG64yYn@K1E7o?qUj=Y z!R_m0c^@r#eTk2XRpwfIzE^u+kl}oaR}V)Oknm*j*!QU@ETjK4<`{jyuPLLaI>4fi z*T0W+7C((IQGEtsZX|g)sCFMnki!g#x~9efHKAhQmk<%si#KJa2Hm(E1_-19tRnIL z^kqmfg8?8KOp;g?2A)9CBD4QR7W!J9bgAYhIN;Ce%a?#(vgKpWfr?Kxby5vr6P;A+ z5_OUQ0_XuiXqI&i1QpLL%vuMv&sGAFzKfARAv(rlv+Oi50+aC@U=-%R63fd#tIYhz zJEV>%SNmt=ZmN0csta*gi0zVj+0yQE-c>bsBO6n4`GEGfb*xCI_C&y$8qRo z?!_pUL#;$uhFUS$9%`1oTkZBGO`KLfQYyzZow)}y6?ik4_ZYoEL=UfT+b)&e2uR<; zte@@Zmi&!R+~i{yeOSwf91xn@&Qz}H?4ZCrz5~aA?6PWMX=$rGA*abFjbJ9%BBnfy z+#n;EpCkquA%q!ZtUqU`NVw^Iim4@;r!EX((6MDze%-(9erwc58D=wo!UXxy?xR+x zUWG!$h1<0`9eEPdLsGv+-wKx)FT1381OHbfFP z*=B6{2yqrzW|*JQ+)EhRNqkS=JRW#6THaWtN-61{0{vk9Nqc)pB)$&}P9t?E7Tubs zcJ(VO8O$1pr&}aqbz-QzbSr_5k?#;gb8^FNMADA-F{Pw9pQPn8w>+XZMDuO_JA50H^5WxqV zu2L))`ybHlO%^}r-rN&>Q-L>sa&MY~Z^}uC8hBAEb~7n9$>KRK^Ldh)&Ia;TSXz>3 zq>23$DG-tt?D$tLUQqwc3q~*VvfvB44JZVX!3NQ;Sb_P`T7D&FkUoW96@Ay{_1;VI z7DLS;sJ$_vNAgBDah^Hn!B7AKCAY?{2VRu9T|O>qyBUvkoW!*#AP->GGw?S$0 z%haz+zpDBbrb0W5oVoeYodW|sTlsEi?p<^f;wM3} z&^I%sPm(Ikql{Q9tj|YvmQ@FAa5+>baFL|Q3Mml7Vme!|c+5w8J_svtQy`DJhdilX zRf*?-g_^gc6|=k=lPB3VfP?H%B?w(l9>{sPqV?5dhFXEgY?cjX>C`PjDaA_)+5>!v z@&C(|PV+e~1QLNxEJb9bj!-1df%-ZF&e<85%7I?I^6bapCH;Kpo_->N$zWfU2 z9y$<~2-u;1Dw8cjQHea+nVF%vGXE^c(ipR^4g!d7g!3>IL}T{}02G>(m^1-Z<5*>O zl8!E(i(?<6RgpOM0JSdC^ai(v>L$;PVQ~PE<+30)ISU7YsEjhNMx0>HVp>{zU+AFw#Yq!a4C&~`g0tA&E z+TTg$9D`I%d_ffGz0KwgJ4n;5Y&Np#T@V(;tuUYel4Y~!hIWmxmTIy@gD{Qsa8FS8 zRd@CR*Gcb9d$?#e@ej`OOo;l>RHV)j{25$vD;56`Y_SC9;6kzCvev5ObU+9QI!?Fd zuH*DVxp&6%QP2Le)VPW!QKI;b3Pn-*XNkpjljbbxLU)r9P%rmA)v+pmzVR%4s4F~X)B zL&y-{-k+;$8>CmpRn}glqLvG6|LPj_LA2zhwn2}>#i1@&AOEC3UeU29h~SM^xPUrr zcq_hfJ+wQhhdFPenIYs{qF{wqG?u@>5wlbyf3-8#U<-=JXc}ZG4r@AWZu_Ps7FgWt zsfh)0N}5yxMKsn?ODaKDNEZBq>hK3C%FXbfWK({p3M;pu*Q$iU^8o+S#^+Y;fK)#ZYalZ;QZ9B^u?q(tg_)!SyUX* zOuaNmkW`<~&n8tC8fSZaxmKLAU=fyrQrQIJJ+^;)(okPN&o6Bv@??1` zr73577Py?7^(7(&m~aeF;`Aa4$JBk~SRJ?x7~-+26-v&WSWh#^*ejp$Ctf5A#P~V( z{~CS_s>mE)NEQz~!Oi+`V+N*mFtAI)+ex46Vhk3ChIV&yvV>KzDKaLYxb-eM7w0C5 z5AO1L?m$hG=MK*DYRFd_(tIv(IE9Q=$Phtt$kfq1QTHnIV?xDH{xa^jX;RrehKd z6Jn?7n=Tz6{qAn6Z(2z!4CD#Tpm!F^z0R(1E%ef1xm)OpimVp;d|>VtIs+?J{T6!6 z(`3KgNliBWHNTN=(KH)rs;0wcX%5AZrF@{ZRFgrXM3Xg_HW78F%!D2^Bh+kdd?W1% z|HqtoCrOs>66|aR#gDw|=$aoYK1!Dx=y{dVgXa zIb8kRN)M3vqy$|n%-^w4K9h`D`1!HH{@}MRY?U8r1^d~D#?kc-W7wR_k>&$!JMzKbq`Q#&%>Xy?_=qK!T$EYvhP;Q>vD&AW$NN(DK= zIe=aW+qw#UsXh3+f`$0UY}#B7RB>?toc#mfeANTzk{sZm>@HGB%I4JktiCSg$g-vQ z-p*3%kWwo@23x?TQa1wzM#tDHJU1h34!j%rAbUYlq}Ba83(6Wj@a7?i&?}oex$l&^ z#fd3C@MXU-4$w3kV?RxY&5eiTfFNTXR{eRNSdtYz*W+QiQL(fdhGO}(lP%kJ@pYQ( zv5ik=t{@Y7orMSBTYk;@mUr2HrOY=R~ zX4Jxd-{o(uc1QCo4*(%|KT~GbAGF7a?Y7K9P5*Mhsq*gc+ha}mu7FAe}30z&)ayJu-U)WKOfrZH(PV11rf52B9{+kaIMBUaAn3o{KmW_@9n{^czGx$O@Qg%X zIKdT-)hTbRe?H@BANyN1P3&*hbl9xjKL-SvuB)#v7HYMK0z1zj%Rj$`D}mH|`oH0y z7v+}JELDNq{>w9X6?bb3pK~@%T??j zzA_`8qwY-3^4;n-5uCogt&>LXgks6)FLZgb_%HVtAmcfF8>t{if1!;PLt%(n=tW~* zHDV_a^ZN^5ETYku#=O46XQ^v6O_sV+(_ynPm%<3LRBnw4uff-br+P|trz0A}|IHfn zx|KcwuGTaOaD}GB=Fz?S(fm8-6-+qXZ~mR~3Ldq+h~6}&@9*02xJ8?xDtVq+L*_PL zE|4M)k_<%tg>2jJn0%tR{0X0MBQ#CIm1#O`zPC?K!ZnF}I8Vdh*sn%~MnkvoF?58u z$Q&b!>+LX$=U||F31f@R6kX8Zk1!&f17`Igf-LQ~_@uXg7E%ubsbhf@unF2j+rCe|ukEV?ikN{>!+e~IQR@(^%>dNroAh3$d}9OsoRKKgZcvNL8CvEi_OYB_nFPC3S)N;u$&PJ1Ip zJ;gtI3iaiTTUDqdpJPqL^hZelMoc4eBWUG3RSdJ$$6<;fqJszz+C5wbMPjS+BREFw z3iP!@vj^I#o^c%A@Z_X3<+!gt4s1wYKmpoh(M z$CS3}_|Sfv)PLzhChixy8CS}ucuSZME_xF~-ZJf(?~rD6fj{y#W_iaymT9AhVJnN) z0xbXSE%(e7UHFJcAHE<`aoa8fWnBRFA?xn!Zu%@g)Xce;a)&kWIHOrd-!q24-DBB* z;dXwJcIHzg?xKhpJ9S|Hg|GYLyx-<9O@Z0>?RDS`c9p;sU=Q~#R085W4g3clQt1$0 zI{y&xQnEPtXeF3t1hV<-7v0Ak*hfiANF&rD#kT29iMjs=*iivhf(5yz1~t@L^@8Rd zhg>2tHIhgczkReWMNIBS7FLd~j>IuxNrIl!B8lK+?mAXjXl^QHZe73zfgJpg)7(PW&e>LJ_lwb>=^f%HBdx*%IWRSe z5vBN6J4v$yO;Z&&Rk5!8(VXesG7t}_F^}Lty^ZwnyuPS0gxUMFMjIwY10XwW{w+eB0d`5kYpYn6Pc zPE)6r0u!LCg;<$6@?a2nN1SfwKX?BEQzz*VnyPbUYJ}~Uq_)z2?vi>57xOx%c&8r+ znKhqfVoLR^oTm~2Si&gPE|I}Hp4J5ygxQ>?`;TZG5TJkr06OHrIOmxP7lO0QCmoh+ z@NztdCds-;fq!%^DRf(wdXDL-Drx$~ohSaNQT;Moz}2;inx=g4$F{J|h_*nwmCsNw z0Cn>O$kRux1awKlg!$_M)2bs^R3hKs^n9 zJ$BMQYrzUns3+3+v;w)xGtoJJmdC+!<_PUL8jBh$&dK86Y)~VF&qO8*%&*=^S2gkp zKt@AU@E=f;m0dJgACwT+;*6tYoJov0Vp043(Isp-1K#e#H{$Uj;5B>E=c z--n4CeoTAqq1o&k_up?{YwurqJIIeU%$8>Ad*e`mZTaz%KkSGfuX}?0DBIn6yNZFx z5mKv~)Y@r&Jd8kde&UzFkN39k3_p%-|6k?DudmPI#{*vPKR;gnb>YXmTXvEk@0$Go z89zqL`@&>QE+3ZSG&rb*DZ6t2F=UwWI;%&e%O{DFEg_>q)583;n=_?C zv-xbl-rnS^(bgY(ubkyU8*>(Nwu|8D`O3~2hp^K9Wv^GeWglvWioiCh@Dfq`YN-}_ zrEXvBND`;+5r+bk{MrXml@yxwk64j|&*FK?C;-Y$Tv0Ak(V5Vh^m^(|PagnY7+7zf zdA7~KlR8ltPzG?qLA_HVajeO3TCmX9<8RTWK!GJJu#8kF4=7r|kNM27Ksi2#%Fi>u zkk36-P*Ax{@x+-xbk*ZW14%0InJ`jue{;#|<75EPVN_c*{&ci*)wDw?AUxz50s^ZEdLM*?;*N+cOQB@^^|T>ZBR17#qE1*7i3ZOLXu>DLpyb#h z(<$46)O%ey*;JCNsPGma`BPGA=xU0tN1w))?|coKcw`sO#(MT;)391;7167X#E$_h z>XLXgPu&`D40EQZ{WgJ+^YgG>|7v#!y`w zUK2Cf3>PA%TiW1BnQXDkg;iL2jt;O9j{$rGCimuXBD&0q{h@I?u@EyTNb`1{sDruI z>9s;IitsYe?9SzOC=k{9lHGTKa>#fU^~HD6OC_+f3ao^{mYJJ`=hHp@9RQnIU^{WI z)#DM0%%xoXmkDjgpeRvtoiMaTkd zBPc(=!C(~J`g5Hu)2Z3Q=G?=0svx?R+#A<23_VlmrU>E?p}8+1CwZ$?zIXupM0-3WMw>I!-#+wo4X;9UZAl_tG{AKaKG?@q24Ycu(Wb_rIe`S}PP|bkblq;Nq z)l$J~RClU}#!w;n!ILs`zwCvxld>EHn}R%!|BB3A|LCt2SBn&X4UxS6B`F?ON-5@& zE)iVV863F%TxjlEkSdyZK&00(yNEDEbAm{&TLrOHtVUHFve+qteX>X{mY-TXQZ;-P zQg(speYAMN~c&@qI2`eAn!>_>LF+Ah8lXp2Uf}J zUT@AgMesevUMlQml)W5oF9*v7SWFAlfZOSx`UQQEO`iqpJ^v7{cpX{2!5bNZ=6e_b z@JEk^mWV&5+a!fF6umUEQ0)}J%cgE+E{W2}zA|wJXeE+I^#xB3{2cLYdVEU`Z6Hx! z7w{E>4y(B=G;2LeMp>{-6iT(`a357dYOIO`4D@|OnGqn%hq^q#F`}4q0Tr59Ou18l z6=wc7tlWbl1jY6(Cen1TWqS^LHxh?4O3NytJm+!JidD+d4_ORNO43Cm6=_G?c%^G< zYB8A|-26MaMAC@`*d0(sCX|a(x@}^vl2L;%53qkm#~U7eUhSVy0#yhsXvqzP2|kIy zifwEwUkc6oxwNV7atpz1VjjWVr!kb1I`%YB<{ca}K=-*7S?S`m@e>UHcFNVA^X(=A z*w$g7z^>gUNztH7OPeG+JBZjSI+;&6r1O(Fp3My_##6;!Kqh*daEPs@r8wt5$sFiU zz>gA~czFCX$XOLfcWWI~XC(evy6Uvui+tz#)JEb%g=vM+fSh1`@{$7nw1p*Ess~}$i=82_Ynh$B?{1knqQk+x)@V^p?brhh}XM4yXz?>d- zOlPiOo3)!`Fb5wzGtFM6$^|b1?XCLnSzo>#McG9|ovp|osq6^N3JYbuE|>JiM4Y6j z*+`MChZku3SQ3M7v~I8yvGSmZ0W)9Mht1i;C`guVqE^M&s;Pt{^lw7ViwFtMc3Jm% zB!6WU+NW|$Xx9A#-pbG{QM@2x18peborO15RN8QTS4QKjBg2<*D64)C*GUZcz4dB1 zqw!QEZf$1YE-!S7y1d{)ad{;TyE|qJ|edHCrA@~iW%%^iLG+UqW?+j{+H>0 z$pQcWqW`amkI;W6X4r%9x7f>MxdiB+Y%VQh6y?Oxg*Oi|i=RO|@O%MoFBFBUs3X%u zH#Nx>94pTsC~c4{RGVDkqRAEAG+e9VuX_8KwA`~R3mAFcez)dTRc;E+`62Fc*v){@ zoF=5eoKe~0bls=i-UA)JSy#&AHzLE=N8=kJ!zFk`o(=T5s^D7AI+_JT7p@YiSZuYX z4ttG_zl}a%6^`7QHCT#U7sc#)mbfZ+iR9sNRjmH$0$Xeu5Ml96T0HxiJXy;MbFnC-cn!2b^LHl2@w~A;vxY}0<*dgmV_D!ApPin zgpE7@tA?H!$p?UG)iAJMCxlxbS=SX=_huyj-ALv7(5!ul5^>uj4Yv-#ZEMhM(Tb(v z_OMiHaa$s3#jQFyi0FjXxyN%`fIK>@z-3th|THLZv-gUE@5-607VY5be6b_5*w7xH<25j z9Vn#!`CujWPnhu7Xvd_M=>olb2zLjOY1Nw&Vzy9k1eqqi5oCJdo_oHUMq#5H_5~;` zB0^lnp!sbog%vXFdDlht7B7g8s zs8irlU_aLZf=2y7GPrdv;Ar58R&-i4N|vEe5V?c;T^CvRMish+vyPT8b(sw`OrBuT ztkXQKl8MHjj6&a3$g9PAGQ(yn<#Il%{BRoj7OUt2hb7BNqN}Xp7UBeA;k#qP7hT^V zChV@jX-0G0Hz3H?{n3uL7TX*Gjnj@6T5XPPN_62Vi=ql^fj}&A((w>L_N>gcAF)3$ zfo|{u1$3#Zak~1I&xB^ZkI&d3@;MYE%dCp8j>fy9m2Zb;tzxNYry5+x#^02XC;Yfz z$WvnGz;E!R z$eAm~q4st&1~c?SyNheGe9|?Mct;e$V|I)Bwl80>>bF6w?wEPzNb%TK*~>C}dCXq^ zU@wd8<-g^Unuoy&^HZBX0-=ACw6AZoml^ibU@zadm+R%SBM)T)!`eb0@k9{Uq`L;s zgC0i*58qTufzg9MzdvpJSL2^h|Gti4e$k<5acWueMg#j1RR~X!>G9>V{&jZVaGjmL1BB?}XlDnKs-2x$ z_I1TNIrCsiLyEQn6>InF_hb*(E;MJi4w$;_ed_59uxl=h2f_DZKai(7f=zVA?gcg)`UWQCqkD0HT)Ml>-u8ZXxd3AOqpB?!^(;C9XYGC~ zTG343JF;$Dq-QyvRM;mo-sfBeScurC;mNy3o_kBScW)oHse5a%zmEP&7d>6uUm4V{ z{gqaM+!ZJ(*KbIvyf5U}W-EQ;=6biGE^G z3gBfb^W5E;vO8jP-dpnq_UO<@oYgIfp3tm~NL0n&ufl1z5UVh8seC^a`!gP&l^nLU zD!#p{XDw|9Yo;S`H?pudHk;Mqex7`?9bssEa&~eAdJZ`G_9m9E>#exWcgtRU0G!6j zXV!iaCpZiwU=$^F32y3g%s;wpxA5?0tkwJaN@SuJLO2*E&OXqA+sYPg!x;oA3<;>AD7Ux@d={-K7 zA6V2DX-7_HF#?!2w7-V)>nQ%U>~GaXZrHesbY(G2b}LJOQtMKzmS6!9>l+2bdTsY?z%qL47%06KWX6A=> zPj%pd`GKU(Bzw8RUM9!|Q!Y|Xi2Ile?9+4PGU^|6iHHUqcd*^VOkp~wb(&NEjafCL zHl^m{V%8ogoq(1060)Tf*its8@@&o@ffvmEHp>EgdCOj2lM4m7nq!8yk4Vk)IT2x@BrXf2Dq~@8922&5YOeBtd!8x$ zLgh`ta=tY9*x@rPauc~v*r3QbNn=f@1#{du_oLT6V5N#HqzVcfMmd^@BrGxPh7ObC z26jWIBJ@!fB&>}eLmrCE9y!29hE~a7MR1{J7L9LB0W`jtI9CjBX6p^O%%2Vc=;*cK zA3)RTez0d0Is6No%XBJ3P|HDJc0@G}wX}1t&|$`E>nhz2Q$(Fhi?k=$nihQ$~SmcR@gnDT8`$ zI)o6=pS}QCgFeB2j3;GxkNYAcAd{aj-!|U#-tRTuG>$>vCgh=9&yy>CZ|jA#DIvn- z2L70)D&UXlR!P}3*@r)dY^HGj*9lL02Q;GD?E#I|c)q+#4>?PYM?W7lE-;rb>Sg{H z7H6U_9s4|g$|aHbh_twZ(yoY8IfNG-W0sllI!h)rkhee(6c#0x>6gTKeg>y80+h50 zJhl2wIcJDLEtH0a*FInGrKOhx@QTd)a?nFY84^08lcJHM0?GWNEf*@Vh2+$00X_zp^W9GL)$~% z1>|J$Rj)br@~Ki_w*N9WhnfjrBp{j7R-hl1I<@FC*FEguO zw6m315+iM0a&5K?Qz2yXErd*n0w0UV@-$uFr9}+e#@fh)u@Wf`oc+lSWJ&C2=?tk?4bH>;*cYqkJt0f>aRN1&XE2hw2xq z5U?UMG&cqNLc|p8E6kGKCLVc}aE`u0I7eRuI%Q-4>PP~eR9b+YQ>E~|^RCC4Ye*&F zRYSa_HE~nR8;3E()?q9faDk2jIZs^s$|!ZVP+X%I+7@`EzkvKAw(G}>pI@Z$;(2UB zaA_y5G9)2aOjMSudhZbDLUg>ZgXi9`2j0Nr49&fQ zDZ9Tw6V4QDK9cv9t3$I!OQJ0_YZMc9b$aF6Q0xHQVjdkL?<*sSv7-3dT7837*TgFZ zU1F)B%sOI=#2H_}4R(&eyS$SSKAnr(v7E`X$PV6NE=!4&1B@`oMUsn4TajDD4fky3 zg>r90@2r}Nf|yatEN0iT8o}&RsZdri3ucG&o|t`062NRE6Br`w!6@M~q1b-71!kC4 zw2X`JJ9Cz`$L>-qXGQ1VnqyJ#e4YJ43#)@k z4$g57PU;r6tkOS;tdgLUZm$ zl(?z`T!E&FzrfxtB1lij2VwU?;s8tq#}E`&WQJk~<0*!kFlH-DIYP~63Cz!N{HStk zDE3cA?~@~5a$LYUn|KAL;oBF}-qJ&3;9yO(a$_jA81Ep;FWWDnP0ayVgh90^9m*0m z*Ep)gnn)ab$p|lIFk&RuJwTZ83aQ6qMpR^e^FB$Z6KmLxj(!ZLqlc(OLpxynl#I|o z`jemx<_dxHS4Lv*qXOuiPZ(Xt=wl>tbhPrxoA<`QP|K@)h=A>F&okkj3tWFVbemm+ zAFX^f6#Fe{&SepaugL6s%sS=gu@m_f8nKQPgcIR+#4gZz<1HZ3rCT5GJa5_Jhb>M3#X=(`tr~)!zo(DsZwNcEajopq(Th?9J zouf4Q>)q6hYdM>XQ!_4O0un`} zL4_)S*dWLtH!?xPs#dZLoKuJosZ+sL6$*o$FyC|&si0wbyZWFv>7r<)ix{1A8H+ze z>LjC&jjyWWN)S0Hn=_P8gJ~Zdf4T}$d(KxKiQ6g)8XT?HBg0>e#@n(dBX5nwU$YTV zQ4&-R@l{y*E|Zr(j10&02u|V0f>BEcJ7J?)`GfL;n60HlJ=92mK|lv_(lvg)S>Pre zI=e}S{-REiiEv6vK8Bn>4#lcjPI4IR>cMg^3v+oNe=C~5mMil~TDoPZVjD73r0D!a zF;W#9WWUC2v=eC&sh5(q(l4@^X-xQ`^_HkKa3d}geJ=CSQkt2i%D_$+>d&zAN@Ljt}6i5WU*X!;SXxyuGZomzDPN7kgP^FTb;wPwnM?xtu;~ zBhIfM)ss4wLj!H8Lpg{r+vb>QFHhP_yIe*+o8n?vfJZPqXAXT2909!x zegYpsz%fBU;1mVSE2U< z^UxmKc17dfv2C}^*n`inh%MU=b?1-V z{xgk-!JGhY8wcwv237%9=Z|?Jfi!i9Jf~+p=RSIqv2EC4Z@x{HhVJ+wQ;@zQTuy~uTYEZ35u_p@CrSeyx6DZp_Ye`=pBh( zfuBfz@U#ic9D(%^02qe%P@Ob^T}X#oBJ|%nmVsz_nDR9~wtZaaj)U+lw*6G>Y-e9W z`$#EGyv9Bm5NfWb=M?*-Fw}eoQW?9mxR9;MU((Y9o(3@|(odDq0tp%~va|;fLVM7u zfb_wK4Wu0twYY)=N~w-E`kokE{P-jB?czgA&CwXzpiyQsiltx?Xig~#o>{Fwfl?Qo z!V6+tnVUWAA>Kz$E-53IFr*a2){VD?q*ONwtR{xfoHCc{sLa`3!cw>a>)1XrvjKHj zBK@Y!mW{{dOw}?&g?Uu^O z-8)!ssQGOM?vll!*m2+is7M%gmMEhwi|p_kWULj>_+w2AZ4w?y@kMVO1mw{d&0B)t zxF|@lqkX!Q zBtof8Qja!|r&i{ttCeJNVR4Bd0-UbC$lu~}-R4F-roVB=k1T>ksqaCa+%A{g#E~*u z6RAvvZXYbnwk8t#Ep|GQ(CSu6Tl)g3$|*I_tq^snAJLoQSnEC`0lgV&K263AN8WrP zAgVM|#t4C-aPi^DEBO#g2$D4NGEEnmMcX?8oR$TxO_k0_ zUiCe=5TEbBScRI$!$td73>J+-%V%8e)3K}&J`3DjJ)rB zHtf5hmJZ=qH_VY3*}@mvxHC0fWS;q~6FNM%DVCT!OM#BxfU9ft`kQ*QH$VEFZHN-< zNueRid)0Yrr~9LKc0@WU0}UP#!O5`oI6wD>qk)6yq=y9^J4&~NX+SX#SN@p3+a{@# zo_Ixd(!@XXu9MdAJIJGy3r>I(`8&)Mn$c@>>ZIlGIh_Q~(IIwxXN}Fysciw=(??mT zHx-qj(P5{O#V?#c3`v5REFKL2n8yA@bDTb!6wpV*kyc6s{YmRDpLD1C%h<`(xd}+r z2`I_pwSS-mz(6Lb9NWIzqzfr!kVhIzi3|yqWMGLlyQ9sv9*4(mYyh(~=q8kygN3;M zNH;^2;y=VzMB2>-pRL1qDY69oUG%M~N$q-r`TwEgM`G@vz{<%Uptm@tXzZYiOS8)# z*;Q;r?9&0ESqIYn;$ZJ-Y}Yb=58rL-k)cOyCt%c6#y^P=EH{heO`&JTXRct??dIZ7 z2`Y;aKbWKds=_N`#-$~$Mqh@Xqf4v9#mH|#!F=@O59#n>vG%%6Rq+j@V_o^tU7y$z z2_62#me9DiEupH{UR*Ov z_wBU$l>sEA3eAyM6D6$~CJBxdZ3#pf8dr@vXtYXbWsL#DAXpoF&{oC{Tk`4H#g8d9 z$9$D;;Zh+RBUmIm_ZMozr;K4p5hxsLxRDfGtLqE6b$P5O9Ev>*w>R?KUnAJ(pl1yi zsw)AjBr2WY+r-gepfC!ovO{TOvG^!S%p;ZCzoI9$w5ci1MAVMYa(%YxC+7EtmC;&obkgo>Dy51yKlR}ZG1<$N=zjywq?Jn2%#)9b(Mz~W(Ly@0h8uX+dTE+QBN3x!XVNA#5 zC0R`V#K&ZE%rd+Z=$dQg&eYh;MRIZNho%;a{Tjepis8I(?02yZZH}WoU7PPJ@il3} z$v5Yu)8vbSG(uO!iq{&HKKb~wk`rG5gCP8k)|Blu!jr%5Qw^gnh*etVi45P6`ZgQ@ ztY3P~{Q4in!~DWtel8cpCaxt`KeBh5QtxnFIz&$1N15{+&djWJE+O2=O^GNr#8+)5IdE7tIUMlPZh8O4O+v$oQ~i z)TtXuXqXPjA*(;FK(B>zRT-l8mp+oMTl+{(8ksmxEC6%;5aQD&Z?podDYOF1pW~rRkWKU{;6NSPH^B|+ay~o)o>Yh+#&~*l&IzYA z!OcRgWE^iS_B1NES)y-h%`&92RgSG0ec9MjQ3rWbhl@hTUNtXI-jAFXdgOo#%#nPE zzHQHPJf4&?KmNP$#ay{i^R}m2;MT#K-g|60T1NbfyIHmNd0LrH7GL_9KMP1+1DgW# zaSQBjlExy*fdaSXxH+YVwctzt7qD+*N}JTUJ(|#XP9AuNT9!>mElZ*jWm+C;S!rK9 z7tsL1HF%EBRJja&SaxAmbbi{Hz>jIR8h@l`Ek5DMkY|@hR`LW+tnQkd0+U7KrN983 zD`V^CXYVm8@PJfE04yN$6%Y#mC-_OJYNyC)P%l_<{wWpZ^dsy@Rs?ItFrPj)3TAlh z4Q*vn40$CkEy8Yf)4i?95ToCY+?;nG8<3fAO=!-WVmCjN^@=)yky$(W_=ZhooTi;* zU=Jv~?j7q%Ox)r;1Wn8je*Z;qB4=~lVa{c&%*GU_aoX5JS9=braIrFsFmbYY#1fxj z9FrHAm9g9mv*&g)OcdIKfn~G-=P!foP6$NE+t`x8sf2IXw7kI}10dvAm-N2lo`E)0bg44XdJF=32_lQW7V0prmc`MnY}s z6Ozm%e3;PSMpRrxZ^C?2tv90O#_3HpC$msta&h%I8t4sDbUn$sw6sfZ8cS=2b_gN4j`XF#8nY-)P`+9?Zh?^d*Bc+H!oq1I0rjP7Y|TX zZsae5K*j+j>$%$)_>v2*sz>!iD?bP&t;59ytk=->>RDa&r?pSnUlh*K$5=|% z5@9K-^25nh(EB0s|FX9Rjzy;7CK`W&{8b?^=pH-6pNI^90*>S4ufX#tQ>T%;Z1i+= zH=9ZCi;1{FE^JqRODn^c&zpLbSQ(sD^-13JeE?My)$YS;XJcoyPx5BGhxl|Ja<-e{ zwxDm=f`qb|QSfC@cE+=$Y^J$bWE-^NkW&tA?nQ#3kbs}{w z_b4mJBdmNH5XM1-xm~oBv1NmjFgp zUHykmVhc_bm#B;e#Wu94K~aP2xOP&5rqya}QDfbrqN0Qv+kk-y$e4^p%codrjax;F z6)jb)sKJ2X4%I4(OWfKwMqAV>AZq@<-#O>L_htzM^lQKG`;U@$-+TAnd+yoqxtmx5 zfq|g$jlh7L65h00HbBR282$jXz~?NdEtoEO=>Das{qtkMt1V$WIgK3dVlCZ8cx}#I zbjMqpmpFMbao&!9`pfWdmKl9snqu^kcEK#PA#=C10nJuhX*kU6Mjl)#1OAiPe{bIN zDn39=?COhnuM<9~ya8>$i{zBc=i@8ZV}a?U!4SmQ#O=BLy}akzS9^EGI}CS>V>L|F zYocjrBNO-$p~3~C5}&2XPep4kW}pRu?aSuBOjogr_drpNY`xQl2+6uwV@Fhxbo?<*Cg6{0 z@&JF>pHgGa*ov}(-z5Jko)pUcILq2fx!Xz}PQW3oQ=Kj2e zp_8&%hcK+fUjQnpK|qWe!GeSmzEMD+ro3PNRy7SA z7Qf#I{RIfda@%+CedVYnk;JVm$`Awg?kS~yfZ?66k4J3KPm}t!8fhr%lDRclnEu!C z`?`vnj|A2b6kvPDZ||PMWOu=9y`UsLnYQ8|ICl-*_rL3D zUVcM$xG@vkP6h+sjBWJtO}+Hh%NOsm!5idfnb(KeOj!4q z*ai*;wlhG-=e2n1R0uFbe188ke!I@}qo!f**9c8!ZkPzyTaDlDMgFY(5+}b@QSn#P z-evR4)l!ajw>E)ahTKod7VJxzlxzgzx-eJi6;dISHB4+XSYySz!WsiX74LZ*F9+6m zS}#lV@`zp@(91l%+$oo2L3$kBicYx$8TUEf#Y{!Mp@_V$G0aM8HP0NU09MZNZ#sU)SN+ujmY9aL6yyy3- zeohq^$0a_bJ$~M*5r1mvA79kDGv-;29|S5#<=jY$Khy`$>{;@*@C^(Q7o15k`0(K^ zo1dJ2$#2&5L4XPY*F7UzZV}5})OldHrCp|_rJ~0T7zsW`Fhph?aHM4{yq{F`q&r=& zR$L>-Kt8U^-=#fB++M>**nd-eEd06Q0}hSv5-~`>74334zmwTEFmIT&vmGP@vtaco zr3giJ)Ur!Ey`^tS>m_1kQ+tpLU}I{}FQ7+=YPeDi(Bw?*X_jxhg>SHfPjm((K~$Q# zRUrEu`;sg$FO((^@W)X7avuoeEwF1+SFgLNL1t2PUv3 zH+4%ZOJCHv1ta}&nXZ&kw(y26HuWC=FGT`+R~&KGO6pjN%;gx%NC5iAp3Grnxtuon zJt`OOYQX~mWCu2QOm1h84Q<0l-H~JznkO7-YvJ<9h(r%9m*2j`+lP_M%e;3M0|uvS zVPf%;ORjSu5yD3^{W5CDmhPEI>kgYH1`Uj7x4LzP5jh6L0S zI6BbZ;2W>+Or;Rml=dEIEZrc5yhMlSr{Q{;AQym{tq&GnX8ga|{N+|FhB<;b7>2!o zzbLq(Tb{d5n(fQn#(6H2ccBSlR0qZ0c_@f3Qwa$I<~27ERA3h0A<)w#$YkUxng78J zXRs95%?zlw=>b8frN|#qMchV%{N3zwDLjV=j?Z)@uJt9}k5SiCEC7CA#f(Ui+0SB66k&AsBpXqzu3A7->uK)MXgEaNz>^0N;&i(GDo1rh64RMc z&$_9^AvF^)?xqLR4C$nscpC0uFVG?4p@b_No+7UUq;16k07&roB@WL&MP6x3UO{K$ zNp>Z_2}ELXtlc|#rSMagUMl2*%=~53@70UVzSk3P%QTbVaCs=b(xrX9W(r%d1-$m7 zjFty336blh&U_UGS5PcM!eGj?%|tN+83>%Tq7sfQEWnj!d7j)`yZ{JC@d3g`^Qc~@ z>%DqntP&mK#O2UA2ndtKgb+W)ePyce($URWIlQ{75}gi4vW~*z5Dmz!Z5(YNjH5?= z8JU7ZDzM=q#&QO+04S6>1SZ)PPp%%#Q|3Owt-Qy?d=NodV>C8p9JU$*7x7^qGA6_w zS8eZn^cG*?jKx{W=ie6_BP87a7=LQHAc!s^R>n*O2QO!Ur-rc~ z>MQU~w$eHPlcst`3-9S%tiK~$fErjdmxA;b4?cx&Hc8r zB?e&dfwoCLpu3GH(kc{D&6`A;PGW$Z*%D9AI;%koms3%^d&%iek^ z)yojMAb0qemw)d#|9?CG{%G32lYdA2|HHovQ$6P2A2e+`|30%^`1f(WT&$N`y__MJ zF!LfE@UQw$@1JY-zJ?vAaU(v!YCEh0V~0FB9QH&45z^1GNCZ40TI!(&tU5gW7HaH7 zennBX-ff|nEdB{%M|7=fsXpR1HCvjX-dft+}thqYoQ_0j#Tk!&GPsmh*Yf zZ6Ra;4TmRAxsXqSEm%&*EiA%6f(b5+3 zgspjGg9I;F*BYMe0Z-Eqgh>-cGIr$cKZUGmYnoueKs)L03DvRphqTwNH#6@5Zp@;! zhs6^ehcVd4P=@c@Oz7|CKI*34{shd^IOK&%x18@qvfB*F#M+X`)YCx=SV%A#%robt zjPfSJN4KB}y4tgcb_g68@I2?}&jGIi20D}OU{RQFGB#JJ^SEDl;-OsT`smypbX@;wG#VVCdf(o3Kg6ype)c z0^GcNj(%MuZha=uoN>rFKKMI7=PK7Ec1%>#(W^U>2f92WL>B126JX0htdb;;MlB zMemltoxusr{*zbBI*n?XQSisj{4veN>n`o~grYRkRpW#u5)?<{aHi!v zNzPY?96YrE_tcWYbzt5$xmVAbs);;Mfth5HtFIq`oT7qKOog`9|1s{d4~=M{^ZAZi zNFHLk5Xw}K5!=%ohL^fM%~Gz{2WyQpaB8gDT3)fILt-GyOb!21RM9#F8+}z2nR*{? zaR3`zNY-QvOXP~Pd}rG}Cr-n;Gbk8Z_FtSJ?X)a{XuM5))@#Bf zkqClJcPJ zK7cW!61D9DD!8TNrc{Ko3cNK9n_Q7JujvKsThzl=L5~-Eum3_rDkTi5AZ)_P3_uET zO>Q6;5f{o`Jwg^3hoa%@+68t4oFV#WH>KVllUOl2ntVb-Ay<=1JYSA`c9`IhG%(PB zxGU#cDqsk)NI?sA8ZqoBDMuzDpuCcJ6^y1{{d=;Jq;8g!NFY)iLtxkzE)qgI1kMLr zR~d%EWw!|Kl|@umN+mRp$kSmradp-3WVJo1_Sy>BxSV-WYb8T|ez5^~?$y+bU#Et@ z9&bJxZPIvJJlPleK0@xmR7{owO(u;8&e&*jW+5jqL4szn!PsaGgS?T%T<&$mqgw1a zv|Swe`J?8m3Z<+4v`$4D_65J1ft*K=zyVeoX&M1rxNvA29_mih;)0-{GXLYIyi2S` zU_DJI%WK7_gp%b_f>ZtACxxg|3910?#l&j~abL>8MrpHB!y1m)ul)+*d9Gt9PSd~oR{zqXAUutv(CY4tRjW>mQ$UyhUf z?p&I=w#yIt3IJ7J0aRXDH9=qTHk}1YLIzs-sB203P53*Vn9zaH6*FUh80MPCw|FL3 zQmEx}b}8^=nG}g_p^$^xlwZjVtp}JPHMmnIHK@c>@H8}qVcu9IRrGa<+c#t`!dDiz zdbTA8U8b%61LC%?Oo8}sYF1d>wt%~kr8q#^GC_xRSpF^IcHi$PZtP(|(jab_c}VH| z4~Scnh)*SyB*j|hnAo*Su5;}qnYkj?fp}uAW45}^D{gaC+%n{$Wi@2amoi=Nlp}bl zE1AhRLnGlq1X>-QM4;7+ygpb`O#@U+lUzb81pSBwBGQ8V#y?$&>Ga-r9$}vgODRXM z#ob`JOHbl%N=1^^?UJx7Q+j9YpM;Lo09?F(JuKbH5A?FXzTCjCPh0+fj(dLznV{9*)9ERy>(36EkZF6*r-4^NXFYLBhZlT!; zFLIaIy{t3FeW~3qu=gT>OWW8I_>V=A)LUE*g|YWV>ks2f5lokXBZG z(NJ%HA@ih$g9|Yy^F_?wV4OD)AGl^{dy#pikc_BfTd^-~Ar*96&nCeNi z^%m{avWxBKI76gHg?E-okO*(9-Dpe%+*jaLj-}TC>A@>T^obxkU4tRw5(IG z3x~F`u^2BPU#MCYO`-!Uek7wOY8Cq2H4tD14V1pLYha8dSSc`VSiAmgHo4$7;{roI zs9rh8qWo;Ii-=)J`BG#LQ8~TJ~9bUDSZsUsiLp$(1P`nmE z1pH(bOyllL@s%{o)%c;?bzpq5AB-Z&0SO`@;kV`*EUJU|kdCE$W0uNVs=^SFAe z1#uvvTtP&3$|f(Kj$2F<2rm>eHWT(TKd}eI@n%f_Kh0D_e(m@F$vp5*#u3Xo%)($! zK4u|@ky&`{3A6aTnynhhZOc&*1A|4INvn4-z)$G^k1Bu(2u@k7=6^q}%BTLHrqvS& z*!-WNRZHUkG_9hDLIt$qU`T!)$mm}_9k{6mGyN(94R_qlV1nD9@-oC1uo~`AUbaZz zgBXH)Q_S=h>3b0~z@?d&zI#AX7Noakx*)ysBY9K7i@muINATedPvT4VP9K7cS1#3g zBlPkexv&)eGU5+Kh>uwOVg6ATe;6nI_W2fGovD#mx)XfPg<(aHW9)>!Dr_$^V=lxx zOtbIHE*#!RrhUxbQ1ea*e)k@qFEg?{Az8ko`Tykdzuk)g^9h(Au&&@|yIT=;IYn6g zy*mHl9XD6T)1_KDGp8A4elaL=(AaT&3gqO;8ev6R(&&^a|_A2<3`> z2xomjvJQN9X-C6=XP0JY9Tv{oB3U18-P`--XHy=@&idVO)-xpQnV0q(@!*tMV}h&> zVuG=E_=7U};DkXf58U_Mkp1$1fX4wXyEsUhLdUcFO$F*H)(8w0vumP5D>9W0^V952 zDPn*>+m0bY31vhtwRAb2Uu5Z+H~*|$y8&;%S_)Bbzeds`Qaa$n5Lc0R{t|wPVAn<< z)uIeiEz2OS^&y30DP0j1T;^@POhE#ml^k5=+AM%1fk|{eBp`_o%K7z%k<^o_o1@ok z8z3oVX(B0U>6rJ+GxH)TCh+T^8+$@kyazezdBuh|Bny=0cVzz!EG-#4)H^%MsYt{n zngt)aWoR4K7d~FbYbyFeYB$^>=lW9_%8*4>7OhMALA0m)X+`?2MHHm~MijlGdX0iC zkfLqC4B_RqxaW_d<^sZI>B3ODL!N3LFO+5nf$lgHB1wHzevK*n6bfTE z2L=Qq07HU&GwhpkZ@(9n(qOwv_E9i7ERJrFSrj2zu(_2)L=+N>h$tiy5s4nSO~6+B zTbgXOkELT?{M1~w0%#qfc9H~sJ4pj=C&WRqVPTo>fUt1BYJgxc4Pe+1FW#W3#Murpz(=#|9N~dMWbPVV(@1x7|Qkg>JxS2xaQ@O-$P_9rn91T%y zV0IEUheNi6svNRoJ*DPTvcSf|xdIGuP)ku1XmA7Sy5XUG(S{z9zGuXVV!zb5Bf^A{ zj5p6A#xWN*k4k9y01;Z}PWoT^?Fe7|n~|my(F;OqAdXo>Dt(6DZXIblNK=C%O(XasuD5$! zhC^b$h|1SHM4GnOr_o5$0A|`Ae9F_6z!3x;~-u0Q9roV;2;x zBC$!#!EV45NiZ!G9MFwPVWUUAJaM0R^A4B_mRMIfac6FKiN&SIV@79hY;U*dJ(-e* zR}JsR6H5y#x)$M!hG%s~9o7o&!rVJCH}+m_M3-uy2mt5XVNKOr?cVkZaYQZ-RJmru zJ9~e^i~UltRSFa}^Dt4b30(svX*8xLp1>wtfECS%sZOFLAo=;I%507f`7Y`_g!AYZ ztw(o>Om^!J*)!)ncnlNP5FI7N5++e%uHXoa%VPt)uy)^!EU}rs#1?*bNqIn1`ioW7@yqowF zW+1Yefg38uDwEt1^h9ioNNvq?)vEZX$h+_d6bmOJFqUpD>+?`QZg!)D}|jfc(2$u$t9QqJ99fFkgVV4s?0 z@kQy8@yTzB)6X99)FdsyB(TQJYhZVUD)HER2*M{?abxS zr10Ciw@5q~2Y5_6fW3!U7Pyq&F5Z`-Zt+$Yc}ALgGVG_DQe7TzdEVInJw}ypEL7eRbj_w!jm&saQn?@hvfX zVI}C*1$w2A#V5=Z@Iwj<9$1ae7wNmN#cOIw44ABOxPBZd>bLWyF}V)HRcMBH^+GTa z!@w&m@?tZIEcU#dgMz{M2}4-QUoT-PTf+|FQ`n5#aADwtwPEqGbLYSkNQ;LJJVDCc zOh6*-&0o3VSuD5e?W*ukcwa^YnB7>;bSgTzCa@dwnnij$56^Em&b(dh25M~O=fi+J z9gpIIFZ2M=zn}-iAJe6wbeT)T^{7Hxt)H9JXkKTHyb!Nbkt=G7Ep*rf+XmPy^=_$R zbLmq-6~Hr=wY07RS9p_7gT;sHo+$zeoG?F2By_@cyqRt{&@Ta=rQ%ukrqmmTiaBJ= zrf|r(TCO&^8(;vS1_H#@ydbnzywLi=^R+(qlLS+3JMw}}VmL43>eJC>a=H&{4-!Uo zSWGQg!dsD;GVgo$69Ow5qes#n_&sb2H90mHz?R4yvy2;cfcZjcfcpDIk~Yj2%MCD} zRToF0rHudq)9S6E0HvG*p`;f<^4qAJv0$u9vD-lVW37eiuJ*RMg7mU>)8>$5wWQ!U z>I`UaOr9k&(4a=Sf*ic!d4Yg9-`e12p)}dbq?zja0zyyn>#7yO=+sZ)_OpMwP&-~c zTltqS^4VXK?Tb2hoU=^5yoB$Id5BljF{~Xt&Ax zv2=uFftVKOZ`wIqgC77iCJnL>L@N5}UV$h|k3~drMk(U~GJly$11wiApMi-%fH~4u zqv1Tc0S&#U&ZYcD7hjBnOfo#b;Cu0WTvs3L#W!&&8FtFsX(4y{qrC&-MK9o{j5nq? zD#irB%6kF!?QiGT8{ZYT7z$d}pH2Sa0_fC+F>nm0TyYX-pkb=w(#Nqpuq!_7^@jii z=#9+|zAT9($Vbn=-SyOvcAmsObs%nu*{M9r6Xe5!Im`GyzIy%xY;Cx72}V=8 z*T8T@-OzZt1qGu4{;xZGI{&+Q>?yF<@8k1hbZGi@;<^!gx>^=I=GaqyeYcbn*wZ=S znN78)x}K871CwG;?>S;a_H@K4`Q+lMq50)v&~N{T+0!3ZP(S|%?CHz#4YSv#+0*^O zdcHlqsb}_d%^&_3+SA7*KBari#L~9A`8Ccf+hiryry`)Ag>-n{t zYgya4jrN8t>pxEnfDJ5bvLwF-S#bk3h;LcHd={#=p*BAG%ihrTSDenhg2cG;7RJ>- zpo&%#E9&Ij16?a`7WQB$Nr~c4-A7C;r-_S=MeZH>j;A)k%0Au)C5n~(6v776MC}S? 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

l~ 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 z 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 z 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∈JapVpNtzl$l9i%CVjkYDfpHdcpP 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�C3G{+kPF{(l6+KhMoyN85uN%JC<} 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

  • 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
      #Fx9u0*Ke*ldAJCN^?t>e#^(QBM+y6Q| zw*)nje(*!`hxGpetbg17iTwCWVFYM}Z?%7Mz|H%AJ#$~u#0lT7|I+kb9GZI)@0I*V zeup4n*fbg6qxg&W=_nZy=^yh0S^swXC4A_5`lEND{Dp7(f158Zyh}Em@a^&!KAn4{ z*{*-{!YlSmd1dZGiI^W$)W5}Zj%uN;4_0_Z|D+nVkmREiUeSMW?n4Rrvit$h?mg>Tni@t?rsBsJZnx;r^PQ1_3_4`KaVtDBD%v0RF2YcX^6~4CL3@49qYZ=#PwwuvvI+fT{ zcm@iG*k)bzE0@W~roUWwK8Rh{Mjbk{{=zr*qfj$!a!J9JhDr@DVB@Mp5WOLrlm#5i5M%{{=qAufRE&`J_oB$15j%U4FPZ zi$g~*TzLFKJcC40yl^Thw;d(tv;1#D%(xj0zrwD29l~jg^^;Ma0rSII|GNBeXNk^F z)$!BlAXQHcB`bWBf98*H0~LX%HWY(QqEY0+@r~>9bmlh%43V&H;UwD$zSWPg`7V!Z z<8!(`HAe6|D*JmlL3EQs2m!R)5XEycEycbfg{<&({cm^~diKZ9 zbi&8_w}iI^mCFS> zBOJuzD6ruj7leV$5-~rjtN#|&e~A!2h?}=uJz2t-$KgaF>6GD>6+V_fMtaKbd z%Q=7Hg|Gc@HM)6tK;in~d%N{)GpT6D$`WN^R{1EgMaX@I`_AF?d|7Ct0>)(|RKThLE=4klFYCJ_M zh1*KbQ4Xcv3*|3-WB(-_1}#4>KT?~4E2tybaHB4MBL`mi*#FYG>4~^7^(9jde@^C5 zH84M(^{?Bn)pqs-XMlI-h`m}@zwrBuS^`%1CjTW~qoKd>b^YUj$r!l6jnJ14oj~>- zeub;c;iPWea-kE%NIt}4P_kftLR$U}kH()m&>ohOv%*LJXC98%9>LLDTBrIkd?$Rg z{|Y@1L{j*#T7wu(Mah2Ug^%MG37C)e4*w#j_1JmQ(Dw%+~LQ@+d|BMEQ65NAsuSdb{jkDEw*Vg^&Js9{4RL0Y|tpK`T(m zNn!0K=>HR0|5$%wtU84KZ3ltVJAWi#g|GGJvb!1H4;X&FqH;P+#|W50zdQ)H5w*g@cjhOt{;~c=9*z@Y&pwb)6s0++6~4AV>rc_A*4uFVGG;^1 zfD=CYf0X}tzTWO|hjKuC<#YLQ(*8C@@204ihZG4>AO2V7C$s*o@{2qIK%A5({-TZ* zzV@GH(Lhw`Pr?b`D!=V2Tp9=gtX5mhqx<4F`aJ*OdH5sGo*mM28oKpS{y&BFkMmz- zdW#UOcRBDRCZ1UMn2w%c?|QV)U-2B22>mj6)x5w$!_ zqk|5Gqjy0eCw$BQg_qcu^No~+?!jL8PWiQ>rf=$CoLUOzr)B<6@|UY{XJ@_PLF8j4 z@-~-;6+X#7B43O!=|c+^rm~ammewy+7jVM2+Mf_PV{{UhZ~|Y);#6F~3!msu^5x3l zPy*(sEB;UX6I`4-mBACbbDD)}V=yax)PFsBQXjXxzq*ZkbW^x6M}t6rM?@LZ=RVD#nmnolkr{eO>q;g@(2WD93flkm^M zBO_TB%+E~gf7Cw=8OAp!%X$$qL&F!gm&dyA!`1YSXS5Tm^G^8a|Ec_U;l((J@#H4r zVJ_4QpkDaKf7t$<|H$8=t6XXZ%+F%|WBaYkhY?g7;~(K;`>FHqVHZwMzzHAQ&y+{! zS5`eF=zH@I9!^}kJ3|SWpUwK~^4|;Zhu+X04i|N-@Ll_3tsBq4#0bom-s2G>{o#b~ z*#G+IjXABK;{_Q!B}Bv66sv#p!gu@!5vZ|a9A3?k2O-qj3;ll%>))xr*YW5@tow9x zQLp^Sg)Q+I`^E%{jR$xqd~Cm^{I8GRrrW1bAC1psy`JD1BGm|9_)hzEeT3Mb`>0@k zF6*D!?_GX*jO6zjz?S$Oy%=+fC6CdYH+d4Ng>SE%@QwXL;b=G!~^-d z&|4q8@J;>u+>S<$BP{rG=R2_e_48Q&#{XpTW{PD$S~0{5)Cw~JwezO(7rrS!;lo1q z8On`TB#vgI5Yn`jarx+kZ}QJPx%~aro%w7rMGZdJmL5Y2zRPpK+%fStHdytiJ%FA8 zwE6k0f1Q8fG5L#2h|^CVzWWXZvDMmeD}3!g%<~8~tiT_i(mu@M2+PR1`jr#Dwtt&P z7$o$ie3M*Z=_@aM?f;RNJM@qY@fe8nL@GQ5$EzHq{4_N$lQk7*SK%ZC_DDv5aEJNEm!uO;8b*n>PcJm8_Q^p*LAtbg5p zv;JTAwY%kBDOllS{<+8`e)09N_k&2-SU;a^X4)RE6F&Ms^QRbsZyv68i|O)(Ef!H} zFsCcvRUV^Ay!l2CxAh7q{eKbbpUTHucNjbF!&~7S{c%+{G(n-_OZzKDHk@FW=nMw{V^Cjs3T8Q}EV21W2L$g|F?0gMXp$l0Br-?hEw)C9Hp} zKRjPJq7`clKZai4MEkGu=(zVW9#qyOgN_0g@jnllU0 z3D_mFELe@7Ef#q4X?{GemmV;kpD(Z-m+?;cmj2gA^T(m>!ASN@_Q&P?n%ocP_HM>U48jwrh4o7>d~Lt&8f_OE|3C9vG3kC0>*t^N z#OC4rWc$+P{PGUz|0`Jky8RA!Eojk;MhytTN2gK33!qpI$x09PU--KH2s|zxhxLar zgYSL6)(KzRUwB$PJPe-^NPU55<|X}wZ|RS*B0>h>@5LS|m|w~Ick_?YA5!3~AJBV- zithB46~3oe|&V~%IG4U|JEKsbi&vDPl2D&E8a>1Uien|g$qMn z`N)exqx^pr>z~QT_A$qQ`S|E4epFJh!nf?t@+TO!;TSm4Y)b`({haWv@^A4&H0r)UeUjiU&uT8pBG-S zf5PJ>yD!kc@BT5rhV{?%ca0b1dE^_QBU<-iG_`QMy&LFo0=kK+~BF`wX467a&u z`3tft2S4Z}6CzJ7W>|Yso33CA^J`iEI{z4W(b=CcaR|d0`h*7kOpm~3g|F=w4!z3j zrQzKw2oDZ~d~}VE-<|Mv`KdeyWK;0U3t#L13_=%+F~%GtDaEAd|V#(u1SOFjh>UQC|pJ&5`B ztbbkqME@2qrqpv_g|GV$;iK}s!byMOqx}%(j}EY%Ek2H?Tj}!a_RDtLlS{Ab(oz3~ zkNO859p-$QCUEt&qnVb5`3)~Y!=gY2)uZ&9$xyZVKAI2?BSW;$oj|jhoZhU+jlsG86IJu?&MHOWcXlv;ku~>sP?;@lsBcQ) zCo3m>?SI76?rY-%6h4tI^kMpxFT;7^Qpb7z0dZ^`tp z4Mzdc(SP);o?`qXe4YQ*BP`s@spIer!R{;`WdHKfl}x@9zP2CMtWIWlcAU-)(HaCz z|2X{O=t4%r|Amk3ce7@-T3`W*)((3Q5Sri0`nTnWH8Yz1jp*21NTU>ftg^z__K$0B zTZ(x?iJD zm!5Q2jEAqxZ)5#q`-yD}I=YDCPvImNoG2{joh@;!S&PAHg^%r5*!RMsH8SwR`?$g| zVE)SW@E`2Kd*NgM)sl~8Fxo+))qCXQTsizr`hP9!ujD^GK^MJeq?@m@!pHWrC0~|} z_#i_8ubl8o{=*s;42bhcxYD9OA6xk>|9oow%~e>h3e_j9=@l|yemmu+51I)+VFUNJ`11+hp|!CxGdf`4nfT zV0*3cK@wK@+J0R=>;qmvr>3Xigpc`uOoP2EIB!CyUcTgu?}Wg+*DpN$VnuiQ%6Ivz zxU6@Ey#t(|xfvJG?qf-}z?)NCK3*VFfz+2p;(0thMDPOl9`oG`H`nSqY)t@I4xfQJNt@_jDOIZ(zIpOR2 zpO;^+1N%MrFbB%B9=QS628|`KkOZJVCGaf5Nx?N99ZY zk^-%U}3b`Q3jwUr*`sCn> z$NWFRIBE6iaSms`j`ffJ%RFXI7<^#j z@R|7vCy{!N&{*MP{saHs61JP-;P_2wgQ~QskHlvAcf!Z#52`ttcrD}3z#gZ$}cQeR;~MZn=t3}*7O zqbxY#lkz)%biBEWQ-|RR$jRc~;SIaSTwK$^3m@BWl8+7C!y9w}nirA6@U^i0TA4q@ z`nSsu_coi=2b#R&`VWSIG!W0SV1;kz9}5`q$Sw^aahI#Se(h8~&LZMQa(VyO3m^UW z^Rx9TUOIU9jZfabd4F_p>-IbM5AGb?zL(`5{ofyE{a=v(hofr86FPd2g}>=)wxRPk zSbm`aAue`48)05_c;lU>EUob0JMx%u(gl(g=AJmYfWwi-x=rNZkkI5P;t!;5Jx0Y+TaNBY|nIWPQ3 z_=^|ks|T2PQ5hg|#{+(VXI$R}l7CkJFn^TwkM=L{cf%ZR`eNAN@z;`%WNv;iLaveE;f|I%GFizIp48HZfZfsayMK=8v)dvHZ$Br_@4& z##Z>+e(ztsn#dp6gmuD?qW#{#`q6~1H&OLXSTB5SzxPw|HLhpBGJl-)Z{%Mq*iV;l zg|Ey1{cEqZ^Iyl2ENo>v;hX$lYvWDv74q+eZ|t9lAKb$?f1+Fd3E#*s?BQDB8~Y{2 zhkDz82Eg_6jr@>O*Za`_3*Xo;k>BtI`|A=p32Ezb{@(1E z))4Fp^UBU7&pzaHQWYvJ0%kLD`+R)1 z4B>>Y^%wbS`6-JiUiguC<;5^u4X5Qcc(VxemS*~@Ed!fB$NIxI|+ufy{Qu$6cEX#R3p|Aa5; zFTCbI2_Jt67n7SzIN|H|tL6Wk;r=&l{2qL$hlM!2=C82+TKf^@_r>A0!fX0RzAp~1 z6J9I7$YW1Qh72uyVZWtDDbsc=@B-#Kp~E>6JD!-InU#`whwtte(M1mM6o}MAxXz~aGdR}aHzgc z!u(CvKe2y{?{$8pVuergPkf$vH4u_3$^j0CsOiyH<~9SUcF_`0Z}K z!4*#0#5ufuzg9hbFn_C~KhDq58DQ87SI@(;F-CAQo4S)s^Nw%JA z@db>}-(CCb zS^lh?@S`YS4gl8ykO5E*)X;x|ofR*WKY`W&S~0{(;|Y z77g3l3&+)rZVFcT=)aeDoAqTZdQTRYH@LquYtmV-R@+Os%AKa+gpc;W5;w2;!ElLx zfV(^s+KE2Jt#sUK7F*E|FMRZ$EAr}oPYJB#o2Oo{<-yL zyL9fzbc_(}vKV7?W<+V#!u3oxwZFKdc*RQ;K{mMtjAB%rRm#%#2l`EsWhfOE$ zg^%r5!{5*Oue$Q3*RP~^5X?VH^?&VX@})($%ZetCwECa`Y-Jd3@#7 zlj*CkTseNdoqwzISNG+e&R^S?_d5UTzP$Oztp7-qdY-n25G#E2{~Nfmzr{k`1{WrA z>;Rki5>a(ScM7<1-Hb&TemLP{`Moh;PS!Z<{l;#N;J+d6DK zUijF4-$Lk)>FfZ<1wM0 zV>-ys4p3O(qyBer&}N2^m82`Z9}rQjCCW*{Gzlks%>SJQf>mC+1ch6nvvCSN-0653 zIY`y7yzsI8eG}1^mbgEI1g5iv1Ob;!Kyr41-u%yLv!6gbOxkuuJkNFSF6cTR~j?r(7o;*a6 zhU+k-SLZ0Z6+X6~pPVf3%#IMU^Tzr5?&R4gcgs)i7B_aMhqLo{kGJov9>YP~D!2}R zm-gFm;%YOxJ39-XY4wjoK;b-4c-y1Rd*Mg&CBmK^VT_7XNc9CKI6@3&+OByFn17zu ze~wf+dVy*RuHT>H1C+=Syi2xsxq9C+cQ|8&P5Vc)SZcA=EazhM2N{Ckt__|4VPZM?uR#YIpYT%&m6 z@Z1ms170;t+g5 zfvC41emr{d!sC~|D7%8?Gx-uYiF{`lu3ex4;|d1~5>Z(sBy^*L`IoGJ^k16dG+|p} zYaE*Zj^^9YD1YIj{?B>*sB*$b{fj(L2D-!V$_pRM?>UbjRpwu%{*U8BG*kY>rLg6| zQABWc`1Iix2a2(f($<|m+nldw5bYUIA^VjRKHC2|j}KM8EC2b94^`%0r~dzba{OoT z_)ukqugfptS!(sB-hp=9Ofgdd4v-+#X2JCzsyLgZinKtBPk-}4>6s$5ro!F@{ySiSJI{}uRx`&Z`Qv;KAd3;d^d6Re9aX5x1B z4=a4_f6rHaDwoOE4seyPaCzZt|9igbSDF9N)xZA$Os%+lu)^2%=lQB%}_)km!Jr+={ z@KOH{?Xdt8Ws%98@Ui?R;j$)8v?yvz{dyQJrQt=xIi3|vpK|h@{3F-{!F2KBX6q6Q zCV=#-#r}sBl>9LNh4qj92gmJ0xW+kx5Axatji19j0GIF=^tSk54X&Y}9&Z*9icmnSbjz4YYClS`QPpIzFmF?FCR z)igDK<%A!}_n2YPWQ7(#Xc-C9?T&iF(o%N69PjMGF<2S;; z9lyC=J!xI$(!yX`;V($SZ5|PX(HY6zr9v!OCw#0w%yZgY{SCGha(TUv0vTytaHR{7Alh&g0jW6F#;-SmzIG zUEB_$5u`A7D9W&zptOKq_-KE*JT-edI|iIm@)+Kty?^Q(FGQ*)4i{;|y6rDc}y?WPSXw zm4+3*wjXV?_su|CEPZss$NoQT)A#Y68LaQ-KSat!1T(}fnVjMcLfoN6-sL`f2*aDS z!RCK=^w*EymyYjOR``+VRXF~C5RX#IKdXN@UA}t!TT8?XU)!Jazwhz+%KRVJzpj7G z%Yl#KYvfk=*nY77;qVBZH@UyMVGm>>wEnVI9v__WBl!|-EC+qZNpU>S)<0~{ zQ&GoDoES(UA9S5|sa}7rT$f)zJKwG@Pi9!U3_+VhYseiK-6g68%LgxfUH&Z|T@Io? z^(SDy9_wG1AM?jjjkGKzYcN*lX}JZD=dMq&eoT$n3h${PlHg|ai7!iopgG~=_=P7b zml49di9#shtj|`{9YVXL7VyH??HA`i@aJ@C995p)KPA}|&xpFPb|IRt&-$x8htbA_ zIE2$tm%#0F@*$>oO9j`%w__<`K==^jm}R($)8f7Gb^FQsW9D*Q8apyRJ2UL@Sn5Qb zg82rT{?|u`^UsHoTfB*0l5d4i{qK5+n}%Bt=ra;>6xS(Y2AuHm`xq_mGG6h$K3YxD z-tdTo{P_}4^>|HXn$F~QTq?&`cP%QQCEMq99|zpy;(e? z$p{7Bpiw+Jm23yV3O^FFM9X8SFdMxvU%o)TH#vKGbh=V*-=qES<3Ju$g%mxtbeROb^c}Bo^^-~S+0f^K9eu}%b0iI+zNK3sRzT1E_I*E3ICC< z{W3ldPGDti7WIgP{efV*E z3Ec|c)F1Jm?L%xhw>$tHDO;fy9X>eW>-sM>cck-K3HlNr0%5$+H~`Dfc=Js&{c%Zk zPM$BXPvhYr+EJd)!&@}n4QMNT%s;)CfJU!wbNSh!F@1fE9*|;7BnEID`30VK?P2@R zz0^&?3m^Tj;c56Zx_$H3TerCih8Qf@M~QT-|9vyozvk)u1y8=92Kg?%UxkBA^m;k0 z*Xe#MtMMFq920?9ZvfIPWQ21a9r;f9=szbUA1B5i)0 z|7ZrUr|yhq0>7j^W~t7OQRRVJ?>`g4et*6+c`f{5}qI;RqF)L%N3Ah_9^h-TbHg z0d7%Gu=tWE;DqnmKjlLh`y56-yzq7X5&Nh7SD`o53&4C!)_<5+#aCANZu!G>$0wVy z#gDh=XBa@};wvY7tQgV$Jk)!6B&GN+u3gbFlq?l5{7A~A%g2fEc!MRq`O|jM1;TtQ z*1zjN6vrJp;4SI92X}AtrIAcHQn12z^uO5J#NHg^C=!mN96zErDJ7rrhtuWjD8Sv;H0b)%mw@{%m!M;armgD}2X)bzZr_;)L&%e;-c= z!s-lo;XCE0^M?pR*x5fZMlFAxe{V@6xYpKsez$`QLjP%?sZt|5o)2%TC2J zB<994)*KC4wBUB6^=!H+}-^KSo zm{Wfp8`0#~voCM=66V{p{zLL53~>r03s(5V|3dz6 z(-Y=#Bo=uZA(sN`m9OE`2RbU^zZJ1h9&S!z7;;#U*#!& zN|J_qKAsjp65b2{5q5_vRNSDyDxZ95*A78qz9Z|O^xrDaVR#eaRQ~((UC|-OPWVxt z|J5`WAL3B!rHB5%$g4|0-RxK9JF)(G`Kf$Xe)jqJto)qtdHJdGv-0yr{*ad5>k7!f z&ml)Gq}Gd@zL$6kB?Tovtnj)2=wX1n1>l~8&y0^ec;P$k-)4Dr%tz4= z@B|{grZZc=q^+Nt@1p8Y{9(9BikE*D;Zlf-SGLS!&i#nauJa>;FU4LUwVxAyBwtJY zCHY-GOkh(Q`U~H&zs7SZb`mh(mGw`?9~UP%|1#DR;7!tl)u~wF75k_87aob!EPZhM z%MV?0*9pDwY5k$MPhNW!U0^ssbU=@P6w1(iH`ZU}!z}am5&4&-<##nqq zcG5(w@E?(c8~fK78IbVTUR4rs!guXQw;;z5cN@3pCd*a>L@8ZuoTSP6kRy}6+6!tLpzd>U%c??_zh>>5}pg- z^={_@EzI{;^{;svHoORvQ#3#P$TDDs@3cQDU&uQd(GAM4%N`ksZ=yC<^ul-AuOR=B z4pYsrX2|9^#L3L<9juQwH1z*aS%0>D&>JmpFhj1t@FP+Nf5iWT{KyCO72DIlce?!6 zDa3yJd*M6wPx&7En-8=8Bgzc^Nd8-V&_5se@ISAt@SXb8<%{-nd&uvzpYM^+8xQ^V zGhfX5Yxb-89{XA0M`91QAD@B@Aq*fs3|#ZAgFrapQ~z!8cMk5nOV&r_tAp{0Ec)Sv zPscAAU!dXt7qs$k@f-A=tzTQB!$&K8TK)`#xW^oXm!>Y%l*GAIos1LyBl1n#e&Okm zn-e@AQZ|6^$$!eL!~e>Bg!R|#*XHRZf$`h)6mo0v4|%r2r|m!MAO0?9J!tHN*Ypp3 zsD5?HXRV0u$-nS%43gQNGGJaP>rY$olj-5)WOjFQu9O||R`|63u>J{O=m4EA|8%|D zoo~kPthRUP@J(Uz0{LF&!@}eE_~;nd&FMrG^#b|gBkBL5s(;O63e?NnUVht%Ey#Dm zcgmmTpB|ru)oa=}3LCJw3SRiM|BuV};V>svU_R9;L7l1G;ve%8>)(-|{ChNEA~@^* zDl2@a{&e_Ses+M!2|tnyN&QcFdc`K6c{1RI@3fzhCwYC@ugpc(U*++FW;lj}&C6Jc zx{DB2_>TXx{246)_rOrW3EycynP1S(DK4#^(#El#124QpUMxld=pk)b{pw@XitfkpWE`S@FV$>+b@mR#~-eb56K*c z0#pkhGQIF=`-PK7l-)uQ`(*xeSu20x4|hlL{KUN(E>F?@p*9TpR`}HavE00v!hW>= zUVmQTU}pA?oD)8^U(KNOW4ou@&#U>Tqr2ym?Zfe6^7&_&{mC3AjN_%CG&<^6R`}Ha=@eV!$$z5`A&DddPWZI^Ql5RP{_drA9=!0W|JVN( z`EM+EvHrTrg1M@dfB1)_b%<6Snv8k~+OYJ=3a{v2^GyyE{e@TZKgHGqy*tsH2QU0c zvemLxhu8hbTx0#y_CM&K@Fg9r@Jji~+GB6_D<{07f159fue|Vz{n5_9_G-U$wEwTL z{%QLc^l$j0bdX<-UsC`eAa%dJdD>F1-oG$Q+Uin zLK%YZyaD5f^B;CGi6@8dZlRgiS%0nkB-jBRo;h6M8OH9|nXG7q@9Mvrge7xsLvVO` zk$lnE(3N@GH%a*Bi-z|)k8MK?doW~cc|I-UXA^kyG1kB1KP{fKz^kYkURmKg^%p$0 zE?*8;?iRDBSFgPu%DroS_`mQYaY^aFJG|_{<#^?V@7O=`!C{)!i(mozPNbpzyUzL- z_-Oxn{X?u#^H%sy`w98y=R>xqM4a#=NwLwNc&h)s=BvE$9sd>iP_-Vn=>=du&id>5 zU(Zfx)J_jc?er~ZD}1N@7x|6(+Bs>g5B-JD?N4iu6!C#QueATTboD19upWAw8a>f)_s5pLpoq?7Vbc zH)Ozk8SCE}zo7hTo?GmeFLKWLZ!7#rzHI!r%Tpn=HcsW=JK=lsALQ3=+$lfbD?cf@ z{P8g4!F)OEuggz){!KD2KkQySRL4Y^`hczlobVn0Up~f#g|pXQoecSa*X3)xI8&N` z^L^CvM+g)O1cLx5J2XQVagzh@$W5}KwY&E%KbA1nMQ^A1l8){&vDE`lAd^v1M`} z`**GMItqB7<7hk2{0f5Mjv!3y8;pB3Ux;m+;p zn6A>FZy$t6U_pmkGJkNoe3frCWpyfE_>TX4etsT~4~FA=rM{OEF$b)FA5VoxvzTt% zN4yojQ~r&7WV$}Jr;UGv@7Ry{?xK}K!~e_qk9_U>+zU{yn?L50tp7;968~w-kBwi} z_7Gx)PwNkY)r_aRGhA988oxW?Q~!T>HaQ;CUqg81g-`9L@#^ruGM{4o)ApAG*M>s? zFYz;4xPh*}e<^%g{(+B|rfd7F^V=54L~ z1CP7w+tu-^@AeDIU-)$V9C$fxg8|S*g#R4BckgYb3OV7G{MS4#^M(X(u2zrcvo!x+ zc*TCgqx)~sY43yjf0y-F%CE!U!%bei2H)8Lw!)Y5-)gm#8MqUEBx-T}YuhjIG<;X< zpBG;7-#Y(&4rtzC{rmFY=YUrDKKu1KpcDQhn*L(&J_quB@+05lK<3?^@@Kxc0Il$< z|JQuI`H>Z(6JF7uF5poEN>3Mt^P@P+oq2&5UMc_j#p755VufngAY)m7rT!e@>|;24 zaeKX{b2D6wZ5W@e@JjxVR?}yL?Y9$tBx579KVP1VvF(Y5i*8&U(CYC;`L4Fy|K;pG;N&=x^xo2wKk1~D zd)}1p9u06nlOVa&9#(fJ5N0_~1eu2ccTa+FRAZ(w=)=tP?DPx_Pbcqf$$Rg;_uhM{ zrH?{Xbepe3Kyzb=2XxOBm~uhLl@_Zibaw?76w>=X@o@UaJ=qW^gE zdH&s?NqBH%1fW1&DK_L&|HA`U&lwUvXC1hfeCmIEU<+jOF-^dI*7P6n{bVycU}XV3 z`GNf~-xg)xeM)o3^FR54{<`u5W0+`z7W*ND4I@xHCV#?PD^_X&-B%UMe>L;V6Sf(l z=^gZ4q!9fS9~w_1>n9* zvHVLsPoGK?@Z_`dFY$W%R7#`#$*29t;_*4%=~HnU?e_e8^9PGVKVP24y!)=E{}%SM z<9lLQ%Ab5*eg*r7vzL+-8uD5FE7^~yS0#AWZqM`ds+4#4%H@BK%Z_Fbp34DFqkR|k zfAY0_z@NqcuUW5-r2&(5J2n9jDv|xF|F$>Og(`GWpicn|77`Il*z$bV${8&+P)=?CMR z=vwk={Zsi99%az^P+SD=t4;rUGJmx}Y52DCl{8TmY{q%4w(s>H-TzI# zpnt?u{=yKT`)E}EArB+Qwv+dsd_n(&AJw1yCi%xE5ZZAbhqu}GZ-^Z_BZD$@-`(^t z`b%D0+}(w3{3v#xt7a`9(Y) zWa9jz*dx5#E0#azE8oNPvsiCx_8}zTvMSpVptl)AQMN+4zkE zVDUD1VHd%BCE6l?wEv0W?y=(hyW216U*rqX6Z)6=#o2szu)u)ja_^en=r%Th*pN@# zfAri7yc|Bdo_)A;BNz{_E%~(mm-sFOMl{NQVfw$!Z>|28`7Zz7{FNu4$&YQfOC0=v z#!1NNK_-hp4f#6BUxs{dyuXXFyN5UeW}^F6wWIuwx1r-5e|x^h=1EC&$0y3;gL`QD zr}EoxgT+ER;d7*Z<;kb^Hy+|2%h1DWjf-p#;md^{U_(Cj|DKO5SM=YOd|Llwestkw&l9%I7Spr$nDdEW%@*nV}_}!2n>VNmT4+a!*_K(-M*EoqRvtdg< zjXwfJ{6qn`M`Ptr9^tdkemH{Q$&bpmT_I_HW4#?bq>>_H$n|R{kFzFP{Ym99O`TFX&Hx z!uY5`4f$dHll(&gmQEhF3fqz|=zsk9c=h!7{lytBz{HExK_K*C~e#TE0K1}EiP5+_%7H|;1+3uGQ@bTn_Kf-`<-b4+|gM1lmGNI?>F&xruk+Q|5ej`yMcdycba#{ zrvJ-Uoj88gmzcjht$^Ra?|v{@d{wiFzw?<%1=zp1mBP!+Mij5iRY0mFzvMb)^(FUO#d$KzE$pIQh%e?IQIz` zD`O~AdmnTaeevXn@q_Yj2tW<_Vf{T>9Uk6TtYs1qNm&UD1!&0+?I)`zq4fs)xzCyY zL;1;Xkl&L}+aDG=yoc|0aD-3EeX53h>VKWfY>*!DpL}Y+j>p5NMsRDl3KF=}lKvgf zH@7hmH?+MtfG1znzk6U9abEBZ`858Y=mz*(I7K2P5ngjC+M@hDuLnR}>^~>YkNn-b zy{{4mRfFH9S z^gkQdU!Hfk^U*TTjSmSt`BMIRU-X6q8uDrVGx?JPC`JaLTJp78Befql9jgQ*c;(Jb z|5EwI{Fntj`O*Bl6A;Sf*KEq4{8;`i`I7zNHgCSM!T#=v=|946$Q|WRK8;^ie#rlm z8?vt&@}=?zzl+Q07E=Y-l27ALm;a{hEBDm&f4Sg4%M%$nnNGr!PuqXye=^NVmJRum z{mf&gP0&urZ~U|j?%BBhGGKh=?P=a`;5Rv7vw`2_fGzow|LTDEwD^^KZu*z(FZ>3) z^5irBeY|`&yS_M;iwCfOLzizAf~S=KI4^V07wQv9>JA12Wf9l#{`!`D=KliO-1Wsg zfwTp59~aBtZZErqhlf|OkRse{h&PvkJlT>Q#?t?8e||2}__8)=NqfqU{<{qK33Ix9_mX~b#B5A25_=tqn5^-Sl0 zWYtFb2#$6v|G;Y_EFEELkQRUCzK7{QkU#Kv#UOq;b7~kq5R2b@lS6K z44dan{E_%aeo+6T{Db=8VJNnLyG8z{emQ^ly+-Ok^5^vDK2G69H~eOC8pe|^>A$N- zKOzWWAJo}$f%7y_4zcif-%RA6^Q9Wll7Bh(Kgf^V-h4y54-uK|L2=*P^e@R@-^cVX z^0)&tEMXKMD%~I8CwRGdJuZL?Tu2+6upwU;$}izXfYSLt8}fhqt=<7F|MUb7_kB(O zvHUxpl_-{7-h1+?|7p<1l;3Q3E(iEbxIjZb^}h)|6QCuZw%G{>~oUZ2kdviIze+SOo7oFO{lh5=w{t=d;;1CgA$$R%`PBcJ zzr9$#!33IX|4&Ok_1_}@bbhw?Xr?zY_DZ-PX!_^8t=6*^=x#p@HyB3oc1)7NNNxZ2H$s)%vgFe3Cgnc=8kaN6}}v zf}$Z`_CG#-Yv@R1>cnWbksrKXzLXzcgjC!QG5sgy4_S-<^i@Y?@Z=}TZ+!79QfSCe z_@6D{8&RMoKT-d{C;pRY;C|@F@-KIMSpuGXx%}p*r}O7hYcK~FjCd-`s7OP9@@4;x z_<(11xP4JRtHbVxP3a%yFZ~}3A#{QV{mH+~&uRU^5k$w6>Q@cKjbs>RqltI{@e1I`6^GoF6uASI2XFL-+A7GG~~-P z_ajXIvi*C0%>JHy*?vPlw?XrQd~W}ie7XJ{?BVGX7ECK&901&pH2ur=htJ!ZQ#0Z) zd{>@)x%@L8AL%CDOGCaKKQkV^VH^n6vGS%RU$%e77wWM4QKo;{et3eNcAv_VFZ*A| zkGW6PkT2^$;B)t>+85(<_o-Ynr9T4RCjH5m_3!v`{mGa0AMiu{UyL8>|D#R+a{k&@ zjkaClf1Z5V|HzMOkN8KvT>mnDpgsKmMfidC=>Pl})4yDPnm-3nf)Z&Wo_slel8@1> z2ii>XYZ>&J^uU&Ux&B6ckRh|7`?03~)_kgd<;mCL4ERgi|0w@L?2+F$BPrm5C^w-`2 zF@=1d9$@8u(uDp4-flFE{nwMPS*9U=X!+p;KtErvcaGN>`YQ+zrXgSS-;{rTd^UfE z!$8(&ADna^)K1AC@!E*VF{W7=xSu>x|4V$H8D{1^Sn7xj<%kyAKY z^2Pd7W%;|GTGU_o)8!KkL+imyrbV%?` zpNJ=)+5a3;A1!bMvdny6gdOzbM`GQcm3IyK%zgx<<-NAXHGZ;<)y82`ylN-;y_0i1 z0LpD(68y9g$aweDivG|1dp;BZdgO8SuRQsh>C%6C{sj5oJU%#t?K zJ9PnEOFr`-=C6;weE-o}H{xbuxSwwNXYs%1v$3;W2~R$YzvS`!cE-^!e)9ld#YNCe z=1*P%c*MsA(2_6fzg`^8@2pmsKj{)!pYN{@`V`#HF#WUkhq*nSFV8*~Ik3X9_?0JL z)?fMY%#l)4%pd1gTp4a)EqQQDJ}p1+Z+znIZBlSQvsC`zKXGNN3mAQw$9fgqf2a2y zFo1>yAlVv#hJ0Fn>miSJrxbu&@@f2;;*;X5+|MeNzw$d=eyQ1(@|Ki5`Inij)qmx! z-fn0=8uDrVpWsvRt9D%eB!BCD4A&31pKbc5{<}U|Jk7V&u$DbV9HkwcXxdVIh1N|{jyPnyv zZ(-U@Tri{oLv%)L$k+Ua@k6G{y%?&#sMF>rcrQnxrwNQLK*hI~iTwjl{Nd^R zAc66rC7;DF%TKNkL*Ezs)<#oszi>i-oZx`IxB1|R{GNPP|15vw(f>*GkE?IhOy!Sd zGgfCa_=zkL_e)Fue|Crqux$T6)bEbnDU^XHpOt^dhm>#-G#=r#GuSJScgK9etswH1DRoajFC+5qmt`hE-nf{|ZQj#+SF@RU(J^9T3eg1f7tI=#0 zAy1?spZOoC2Zz{o485hm=sjXg6NcKN{K;qj7x;|^bids6AIaamJqS_A-;*EBzY82p zDls_8}bnGB$qGj>@0%ks*>A;C{uJ{t+*3doIV%45jef@VH59`S5v> zZ^)-#=~ zhxV64*W?5+RAJe_A1Bq-Uc^80!}@c)c)E+rs}VKtE@cgHQT?hN&HosE5bZro8o>Q( z(|>3`^!#xB!Y2Ro2KkHIJ91dPJ$Vv?9=S4mVC`L zt^Xsuj+9~8$>74!n-cEV7t4RZcj-j3%Ue%Avma!ieP{Yd}W4^DSElGN3oEC9LRVES+3AIgoIh~avdNK^)%d>TLX^lZx- zJLjfKupyu6FYtM#GCn{ zU+rJRZIUt~g;G?n>HlfTr}~fcGJqMU;eM;>zb&uVx%Syto_rerk$?1g=M<-bElzJ>Gyn4>jh6ht{zZOhfA`x>|Lypp{XO}C{}l5d+P@(`u>ajh%hP?2 zBZQyh;z6x6H{=F-n!S5zx95k-BNg{MO8#$K1*4shm+Io~L9~D5)B6AH6R&@%o_`{9 zI2ix#KJz@3UX6x)8vnZA8{c(ahAlu_l)vMdU)OsZJjA-+S@M77-(9WGj&TOdSl3I- zz>`n?NBQ07h%CGCfy0ql26J{f7FdyqYtAN(4K!Le&v3T>7V#-&ZnQdyycB2U-MgSKhob@r(@Xl zP@*9}w0|f6c;!V3E%_w=X8VoBYRUQu$|^7J_nQ8h|AggMA3XRPjNDI1;K^t5>jN|l zA9l|p28Mm~QRaBtkk9<5<7FgtZNp$32}!$7u5;Aij1Sb7-9O9XJg&-5S3 zUmZu!-`w$bifHCVo_uD%kiYUW{8xlUfAS;pgOB_m%Ucv_$!Fys^3Th0kb?XDrvC^Z z9)7~>fcNA}_CukI>Sno-TG)^;=`RzId(GKFN*D4h^3`7Hiv`Rh+* z-}I>VsQ-V^^dIFr_bXW+@sE7T|Dz*!M@4AJm+c=E*RiZ(1Z~Ne{U>$*k_PS%nf@6c z_x9NJ+X+>%v%S3WC4PRgoOxL;Vsm~Mc>y2qAx-#(e9dpQ{g|(hugom;?(F075xuyv z=l7O;V!sjIDshs1<^FJ?{FUF;y-&EdVDbWVKgwhI-{bj%!$r7zk##Z6zG}!1_0Rc| z^oW1tUmn;m<*nKb7lFG!V)_s5SL9J4Qw2Qv&G|DVXCbU1pTyq>^Y!9woZzxLJv~1; z+c`ctA31#s`jb!WCr#~VaexbI4Buh!CqH?{^l*RF^dIngW=)DqlBxFafAUHEVqTVg zmk{0z#c0SU@ngt~@rE#jX~`$?tK$W;;rk*C-u*GtKefNv%1D_vkaY9_ih&V5`K0_G zV5sQy`3z#*JlQlca zh2jpY9*2tukY__a^*_C9T-IBK;5l~vU)7RN+Aq7SyyvahO2@ZV?oXQjiT(EE>MhJa ztWFnqSMty&LnqP#g@eF5^H-jHl0VzK>$-vfQ(sfBe#G-m@apeKlvnnP4N*cZ(H)I{*nCJig%e03ef$j4f>~iDm?P{$AB_#DzIyVB z|0}=7>4B%Zb#*F%hJ4Lb)qcif4@5XYx43miiI#lge*<26UB%|Fa(~|RPxD{RG2wQ+ zIGD|GdE?31N9*$8tB}BxPyFwo$oI7%iXsj9ME*x-XD73;YP{FIR0GAj1SYlq7x*8kD9e0dP^biF`w|#lCQJ;`_*#6dS(A{ zf5r6A?XSaz7mvDoTyJ4BXUTw`d@g_g)SQ-K6#7)+hJ50GP`z)k`sHuxzgYt9W`4Z$ z2npO@HT`q@MfoS!C)3Q`i{H#YL~lmSH$Q_`9mqEg`P_fI{Mmh=KMnfNE%_vV#r9LM zOKso;?ys5tx&L-V&Sycyldq{ysQ+X9K>y8rsDD|`mQqVTufI|L#*b73_t#71kIhav z`XlU};^{|A8HdZ|_vBOi882N}TL6wH(1)`d3*6iu2s_!JSv?KWk9vj&1 znE~!wM>eyf`x~ZzTK~gN<=$w;;D`J@`LzD7bk*8}=XM24AIS#pTQwzKudjdq{OEy< zIgDOCqD9e?uk{n3A5tFKOEk(YZ-D!orhgK@lz;Gi2itZLv8TkZJo#b%+h~vWk9<=9 zHGeC$u!o=YZQNl0c7oTdWBNe^Q>c^N-nhSQ`X}*|`S<8}6XMAy`t#0u8-k1?k=DRe zfQEeHe^_x+xciYAl z8Oxum=ii^czPW12C*?2s7x|$JxxZKNf8n>gKD6@WYg$y>|A^P&cUwuF794-ykbgPm z?fSU)rO$M@{5Wi1iEgpvkMYuyPwa0zCyh<#5%;a!-#7j1B>!-I*v9L}Do;M~e~f#| zm0??4A67NwlkzL@viPOsfi3x@{UDElSG)czn4r)Ex_@B$m-6p;89u?mSEc+t`Lz7{ z>%T# zjl*L$#LndErEveG;Qv|vmj>4d^)0w3pUBVaS9I`wcX^DdGh0uy6Q1k){2TH~{UMJ5 zUOQ+e{^@<-8U`1n^f8}nrItbcsAwSArhC}f(aKFm^ zOVfW!{$LI%|2%+r^2Pc~`vsoGkyxQ2KVE+Q@=xQ_@@vW0{94=3B*SR+5@s?}8sne; z%Jd(vf8fWjʏ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 Pz+C2^E;_vO*>A;6qgl?YZd-GX-SN@o^ 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%0A=;-|yorWMVn(2(HhYFH?dqnZY$% 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%0Aj@NE@ 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�r-2Cx8i|h;7*MJ!*hPs9bA*I z*BRN_l$tu+C}#6E&U|gk?r~+%TVfEUa0;<6>w?#HMGr^1AMg3db=oe1SECb5ZEI`B z9*B&AbGjpYo|?!c@v;+`oQe*i(<#{FbcOZB==g@#n$`vvIJs|R=Z&dOt7E7mZNZ;$ zK)skgd_BkqJuzG&d8K9F# zrx2}qNMxwf$cnNA(+@2fTa!+tdSTbY7L9;&#VLm`8VP5UNedQ{MC6;zk61JsS0(j8 z>0}%+e;-+LU}V>A^3kO;&}e3tV@k)12z@sO10Jz>{@Caav&rf_9*yl*ZQ+&2#lbo? z+34fr;OHs~<#D+a;vhLqw>>cyB&#kEhLui=1H_ZIgF`BqAH{-lar)-uINoG`;ImWW zgK(;o){R~~H4cDg3}&1ofX}yg-6>349f-Hx|62S$R%el8Ue@iN9QaW3CH+F=Pn|NsEj6_ z7lX#;sZ)AuECFNBFAc~s(0f5?VE*!H7nTSXUp#nGY&fkS;InDHIL%__f zh5du7(iwMgbR^x|l!xw1Vj?(p&$%=v%2m9|FN=fjr-dsjAauXV>X*lW=I}fgZa+*q z{kCsn!Rbsee0)V5j|9Pkg>)bq*1xhuBuDYgtKy;=w(#n>FrFP8e@$E%7nI-Q!$c8T zaBXyd0&(GWF%dP1e%pew>tn)d@oZ8GFVXlXIuN(|i^F$v4(hraBKvIXPUVugB$*$g z;2o^5y>IrXkQR~SQH>uHb=vVJB!hZ zo1^Hyvnh0CL;}ahxRB3(i7SE6EedZmCagpcQ|#?=41*GssRevDAIVOv@@fb86m) zrrV0bMKX?sql;RVRWxUlUg9UiAyj<5uvPCb{yFGLB()e9c;R!y;c9H)gL)%ffIE6JxKl%vJvcimFv#o2A>byQ+x0pud${;V z5+=x3HUuZPet6y85&{zi){FW*1XV}tm|oD1j}-qh1_gcEks-h!%;TXLwesW*=4y`? z4`yRZA%pzR4MD5!7Y{wXuCI;*4)Xp-2mv+Myj9OX~%1_f+wZM(4(SvKM_+ zINF@&^}=5cf!DY<(0SpTJzYHP9(Yii_lHnmsrSx{cti1M2nFvaa3(#y@HL+){t^B` zua}`SHbYQM+!>pNhR@!xtnzHJuTkv=RmAF|OuHzetU_T#m}~m_;rCdG>A1lTUzb_% zT(N+8-C(Y_VTI?5L7aWC`tI)j$N+sq%X>v3&h;m|yihDG%5F5=7|Cu7to>pXzOis% zB)f6&c_h2>F!H4+ekVYGB)f_5btJoO;iQ)%_{B?HM!yopt_rS>WH%Z%e>Do<7&yPE z9q){P7EO%vMLiSk%2ak_Pk+0W!(HZcWI<_;Ex(?p?GOYgkcF zZqOE=MD*odFS$koi+c0Isy>bA&$CE+tHu>|=Rs}%SyXRUhil350Szqf&I6nBd9h~J z>D^JsQy=2H7C}aXy640>g==cn3nc;=`-K8xAfv->*D$VXiUCLFt9}#FU-44~mus4$-iwoL`)$;)1RP9wNP~-qAOJf3yNG_h+ooUAz@k3Au-(6p z=+A$s-~$aU>d_BO{SeXTl)zIPKWlhVzro-`e~jqcI}OKEXrj@RE4}Oeq^OF9Bb?|) zO%zhjgnJnIb0o*o`f6<*!tR=;gHgXka^eQvtU)2Z)QXGRtG?Z@k-T|f_i9)~f80Z? z`7M?+#yqSsVV-F5L*|gFzejUqKpxkS5I^SPwmS3C_D3XtLD07~G{i5hK=H1eIe$iS zrtRO<_7OZ_(;$xx@AFq=HxB4S4T|7P<-yLsBYRSiPcXZ+xO3uQ^oqh_D;D<@u;s1Xz31&HWH86YRio%)Bf1me z8?E8&qUAGJD&%uMotn;O@Kxu|top87(AwY+PG1uU<5pIPf~o7WzZva|)8du1d|i=@ z>he_z0XkDwI*BVhc!!p>eJG0U)PxPAR*gVP*TI|@#jx7eC;0vdvoEW_wv9%><@nxa z9&b*vA+uUYU}vav0Tf@*>vp?6dvoRc+vUf;-~--A^$`* z4~U9O)`=K4ClU@_HzGuS{;>5z>{Xef=iTW3rCY-Qd?S`Z!8YrM@aJ*q`Tj7YKDvlZ zbN;$P2&Y=@t%8#_3^C<}!-vDH$|~^Fb+fa@Mj@oqoT|91BHB_dSG{pGUZbMBEF2>9 zuT#;jKRncp#)v$8Pz*#sHeO?s=nkEnd_fG9%*=~#s#-y;-Mb4c=*sp=*8i|TV+yvM z9>kKHMfc*=b#SzXg*h@nD{NjU>e7jJD{WU!9@@nks>D~F!HQFjV(j$X|X{cPjj;6dttan`eIcHREnHgzg0YEGNXJJ26OwuSpayX zEX0!=qIwlA<*{HgeD8&!QZ`M^;Kr-gq2Bgv8g{M-aZ^^&XboEU=3tJV;X607d4Glh zpG5}Xy@HvB(M@sqY;;gZHe=&Oez03*WIq%c@LY6zZXx0Fk&zuRz$l229~BRa30$2? z;vfNU|LqeegP^f09)||L8WSk)ii9IZ$Me^a#2PAv^?A;w-3PG4n0R>Zy|Zt4D-6mx z2J&M=Jj};KrAb^$5HKJe# z!DXM`F1m+StWGjklCR(TUgN_2n5g;NyS&+aV>e#4ZC*VcJfk23-IndKGI)daijx!( zx-XsPVok$+J=`l$I@hEfj36x%(@V${91Cm3HTsDK?ruXLv1h}`?@+nIg>k7tR7zH#|kx5pB|uAe(5f1KRAb> z60vt;fR?Z_HP)V@z}8@2nywx@PfKd}RCLW$Wg#ACe_8)-#7l~WZ1)CbgU`vg;@QbO zjF_fG{JRN`a|_@t{ToNe%{i+RA1EEOivppnwZD^O$7mUz5QO$dWr4>ltpvU!s|9Vj zRBxlznXkv}4wciD9f@1$9d(wU=907MV=cnVlC43O&1+I{x`~-TlI34&Ipxoq{ydf* zR%|~*0mvU5@A}E^;UkxfyQi>avx4#I=K5?p3Fl}TjgJyZ>Z?=PelI{ydYH1SB5?qu zsKz_83#d3-O=VbTlAEyfQ*IL)9-!ffwrm|PE z@zAPe+?kn&KT}!pvV_dl9}1C(ghmUK5O$lzRwSzLPp9EF@w)~eQEh^KX0wuhz^L8$ zZ|up?xj(w(LnHzH3+E~&9xeTe%-#mGLV1|a6gK1=eh`0iepzX* zYU8=TfLX_t(r|#*W4FYo{Y+~W+LhWcYahif&~EJmsHJ=EyYuW$x`Yw1iZ!c^N~&!$+a1 z&GzEvc(}(@r|?l5awc@VH+O}s0k;zwyv%(+OIWdfkHUH}*u2s-F#NNYo0#8B3%3h8 zybn|Qj35{cq-26KOanzQBR4yd%Rq9T0p?i@5qJ@}4^6H5dipL@r;;!_XMicKtz0Dy zR*wsiV@km%0dmU6JKBDpE|i}UAg327-U^V5>TYb_&(x8|Cl%l!Q)Bb`vZ(W1jo!q5 z1CL9T{7tP`+*JqSsA2{@vi-Q21rKIt&NrOMXtT*j5@#$p;%)dYz=p#s?|uJtz~HD! zWU}-wX!;ENm`~kt9xRYVn%{nmHPUPB~ifMTt6s&$wFu?#n5_a0b zhL)$w==8@du^9sPJjBq-^#x27Xg<`Ci**D}tjW6Rde5}r+QHG?c~~$S3%X-eakyc` z1TwYpW;_d?GPN0NfS#`Hqr4|NM=)c7iSEyP^~aie!bozs{s;qDR?(Xnq>9iMw6eu% zII^gXXmHLmjXJPvD~speM;T!LE@~#ZDZFZ-p)z8XlZ7odIJ$_1&S7l2$}z#Fq!d+j zu7HIKkFa{JfEDrZ!=6_k8|(;2wAfFf$K3Fhl70)u9~W#lfY))^Q?W-@HEI{UEvh=5 zns31)#f(J+Hy$6%hn2Q%QU3sr@mgT_D`R7)TvZ0I7c!v7S^3`2#uE%DBA*Bns6Elp z;7GYSm+0zE)ZiVu*ogDBpK!KmLg}geyXv$xPcn#1D^bGVI@zVhC5%jYWp`@dL`M%k z9#eKoK`q=9q~qAZ+B?-b1T#(z0OO*kB|5rOsPQ||Z9|FEI*`JhI<6A2#%XS*?*2>< z2VajSjwoW$iKh;_;h`cH9BNqNbe9)Ac_h;_CmM^kY_>6x>#|^KA;XMiCGFNssUNzM+27euKsi)$C-MwGYYt(&*r(Zb9H=tc0&-Gx}*9UdK%q*ZlQ(TPP;PsfEm^at#c_t}H;uIa$`TyO~Dvc^aCw z#J!prBh5?7T zIsnzz7z|C;0BffA55l0Sz*lM#86G=go4TG%JDt2j+DOEEfN+TTAJ1@9$7nGmb%oHGHg~V(idbU-YjdYcb(2w`qm(j2J1oaJXIv2h+Y%Q##s4s`IOQ-DIYt9Y)-)wWVgabz%e#ze7^Y z#kz$Vrb=e=v6$1HgB7x3M>5lf*Vc5CVU=50SXbRCkvf@n)_0JFO6m<-y%lEMbXs{y zDNTZf17$VRf1%s(oSO8G9+b6k=oafD@0vD1YB%e7{gHP`M)53R9ND5GzQ-In!vr3Y z#R+#t1XjCS0#sBvB-}WX=-}<+a8;a&x;UDX! zI9ch08}F5{IDlYLeomG>D=fTE5?55w6-%7eGHGQsTVjl$qx7B~_eDBz8EMV?i^3?} z>lJ@8P^Dw{!Am7hscXb(hxd8ZB3Z-DcXwk~>N;^|2qTYVF&QNAXN7Yfl&Ep!&IR-y zQu6UYa+#{&J?2FZNy)4%*m&ilha~|c#LffH{C`AB$8`^X&2sHWH4>6ZoOqC7{Ry(% zb)0G4u?*f9+0mHEV>@n`I&my)@>mE3J`T11hOB@~rX3i#oAX}7_{TM1_Apn-B9dj6 zCAQYO{u2_8PF~fTuuzuMx3mRdTQ}L`L^Qo(d6SO-ATy&nmRigT+`T@sO9!OdMMT&&UZXLQ$)% z#`Tf;y>wq;*mGgbIBDRe0Plus;R-9)YUqTn=fl_}J@`FT3!fDq09PV$aUWYv^o20G zI8H&}(@-&5BX19?UMfaFRo;0;Qo-}&X;p>yUX@bWpc1PBE9J`SE?gUpy;e*kiuZuQ z9Ys}gNq0Qini=@IM5MeYT!Q7JjFhZYQH8;MdAQH#+%+Gk5?cwT&?<&r^s z7i^^+my)wER~E6Zp=ruk?8$NF>yni!EHw5ktbbbR z1Br`=EY!dVU2-j)t4kgU&*_p!LF0!S?$L0nCK-?Cdry~K12aC7NUFS^qPjwCN|SD( za@msh6r3(=dXG{w0$$T4kA&?$mUy}LC}`FtkA`zK$+bh^30-mxtnx`AcWo`ib;(2F z0$uVj_*+hvU77Uoio0T^(DbQfoA#OQa!N%N8_-nJ&BI6aA{_R>j-N?9K8p0vi}WJw zO218)feLZ+ysL56XN)2D@xzv3ZxJ#(X zTmhw>|D!wr=_l!=UF_tah6=j!3NC8H>fdlh*<69zA*d#vzM?89$G9;Z&BFtww5Fw# zM6chs+^AZtWOM*oA(V4OMQ@=<%7sf;=V>(&i|5{Z+82DEXR4HX8P?_0i1s~ zelL-QDHEp*kD#Vh-dLmZu^fgfi`?oA?LG*DerUgw#USPBKX3|s?s5n|MuLtE2KSZ$ z_Mds-kCdeh4pzcgY+L-)myFQzypvIslM9NU^mAXbz{Ud07)LpIUm-9i3;Vq>~sJ#k!$gf0q<|u_wJ)mXeK(!o@F6wAmj#52|a@ zZQ{ULLRofITGe&_lrl&b$#Q(NgcMZar2mf*VwI-8wIhy68eLp5O^vudJ|#sFSJB0uxQvE?zZJrTewxRxvP- z1Hne@my#ra#em`2}&M85|lY(sIycBVp;T<~ao`3e`IzD&Sy4wydwLl3k79gG=Wba? zN9Bj()o)mg&ewZf*3(gWKX)xlK1N#_H>J%X*=dqWY1DH~3n{ z6x1cktpYkWkusw*LTFj2-7B(c0k^NWcmEQUY6Rb{vU&lns=LjmC8$X*XqR)VtXaS+ z)b`%21R)z3`eA~X%YXvjp!P}wO3-Vg3p-_0fekI>X&It>jTFT??aF~tru6ho@n~65 zM;a5cjL*ob1)RR##+&mFnvON)k)YTz!c+SI> zLQQ2;ls4U3;gU-@_&jii&<&Jwf##Zn6jo74iXt2)wB!t`I^PH#wd~05*;L0}wxkvg z+J+mGX(WZ`go4VUEV)C&wmKSB=MK~n4^vU42)%(}<#wD#HRf+bz=c9Z&akAg=Jt9H zv7rRLLPMtT<)5Nl%4pa|M5Wm0Xx_mTAhtSgFom$nz3z^x1s3bU$LYtTR2rwx96HjU z7P=(F6?c>1ccFw&tyf9zr0|Fp3;95SHjG-u)wqv^DzX(*Jg`FHoH<;7D1b-%y3i(> zEUr7XQe_@ml=)eqO&`Cg?)WN&S$aHCEgJZe^6rD$2B88*WMHX0CxB|Hlz_GFtk_eZ zy99Q*z!sEP31s^&idE?;@tz^&v6c%>^|69_t-C6WGlwZJFsS{!&?Y%AuDeflKfny4 zd+VvDBddB6JpGuIio49wWOGM4lXV)Rt^?Z*_7N^SmHTX}{h_sx9jYdc z7zWP{^OM*ZmF8yja6h@CYH~hBeFNV=KSq*L&@?P?*mH!Bp{dQ7m>cOQ*5xt@ct}c+ zo-@L_;B80w>hVNJB6on3%|NG=ih3zHM@o=L>RcE1vf(>PnkA1gIT$wD=fF>*KeCc%No$Y%UXpt(*MxwnPU_TW_qN)=s%;=3Tf~641~S zo?|#sF&&^}N1&PRoKcrN0v$6wYCi!|ar8QF*X=rYSqk{r^K*eKHD$5!L zQQ3Br15_lH)1@V00LWEdkW?C?>3aN7isl?Po8lAa)17$UT!)l0Elss>9*~8-TYOC~ z9e$S5uty^IpSjSyudmqVI?-&b6JsFo+N|{mU|=kRmdgFLh4N8)C!vTZ#*gh zJJpwkf&}-)b<-6*PO5n3g^62*3K=cu5H8)6cA_VHkYtWA^8C1S1Kq5CVp&^`FQumi`CGXsya|sDf^@Gv8K?F~Wm8 zGMSE~GdLEF_arc+WN-ox48`_v z9v?Mj$I#U)iYv1kRts+wSHl`ck0PkgW9WQtDmlWD9vzg0WLwe9;DTEM4>9op_+fA~ z?d|!!YK`@PJI8E|MsgTYdw6l!WIXh3X>pZ`DiZNUuDPZo_08i&^Feg0>mBUs9avJW6u|j&; zyX^EyM>`~AWrB1&*H}QL?sl7Qb4#qpJ;wqeb-L@#H8({2-EIqj*Y$p40U-w(j?40~ zB^`hk85a_d3l9r*9LSbZ-peiVysWFj2n4v%ShbOyq8iDWF}LG)U+{&QGH%9U{B2L( zh?(YMl^#RgUYKL1%BJ`5s+sn zPEa0uxKT!?wKl+GhN@{i;&$W_X0)hF3LLI8)%OOqUJa`}($I_tqjl^WGZ1Nh@n|os zag>pb{c)uV9CO`9q<+Lq{Q&Zb%bp93vXLWmkZ79=ms;qPGx}lH(dGuwxf2`Tn?bxO zQFM`!0X8do&P-XJ7!5tfh+iHc|EoBJPK!u~y2-Icskt8Q$CjAr(ynyEaiv*VKl-wP zCN)0$_|lZ5<}ESM^SaNSPbf|4cZC-lXw!c1X9Gpv38qdgorUH!ylJ4uy1xTXDosc< zY2UZpKw0hhA}5!o_Yl-0J!+!Qy1Z>qF`%aX-C+irQfK$AfjaByW}jL*3tl&OkBKUs zLP7u23|O&)TWFvsdbb}8lu6e%_w>@nak4TWmK!S4PHoB=rCE6|bG?Bs?P69xvotAD zB&|GVpi4WKHw+X-&oc6?(m9~Yv|IV!RNL!Q7M*Q6g_2f1V2yJ)s`yMw#+-WJKJ^gA~UIggywRLvIXooH$Xy?-+c^GX2d6yMh;L0m395gPaIKd{Bpwa?+_70+UU zMHg30yK%h={%MQEqq7}yzGTDs#Z6+V;Bf%acnr6taU%J433a^w!q>)cm*^Q-2VGFy zh7LrwSH0U9wz$v=PRfMZCFOFC9hQcVlBJi=?QnJUpcH7k$SS9i&U`LT!Yl5y!{L=* z-LUz^R<`1JU`964MkZj#lti}q@6c-uO6C5kECO1?CtXrJ*BBv~>!mg^0v4b00&{(- z_5E1_#n%&SVEjLe=Z7vR9*RoRUbNo*%%e`EsfV1s{JQ{zIyPB-{-wtJIJfjY4*V^E zCG4oMMgLd)p$ps$j;gxg4O^7=IrosujGwNs-obqWUE&cn*s+(FdQQK(k%()oZ|7S< zq$;=a6=Ak8N+{Z$7@WlEn#=B5BD=+p80ur+=VaT-6@oajhq^1xt-xWZoX8AL;NdZe zB)xxwc((1Xl2gfdM5nSuZM|flfL;!>?qV4r1bAy_UMHca zy+5T$NRAp4S(tr|%#_Y_tqt&6J4uKuZ6X*m-VSX z+Eq!yFAQn_Qfx=|(&a2yul5eVlf zLJ~trUk(4fx!+APHYoO9&k~nLWBuZo6 z;0%q(W%HXixu}7h_X(%m;*qesrQYK|_sQTj7ej9Kg!omL0~!8{)a9l82Yr2S<1dW$ zOyYMV)p0!Nn{Jx11(aF0`=Uk^vD8XIaicHmtaI=ZjPDHXU`C+Wu5hTheMKXg)7Vleh@*(NVKR*>vPz#BzW zFeJ^>+V!4NMD?^C!(ED^S7<)ZYWK=Kp4hW7D_rK0Kd;l^?|Sq5G}QDZ$8-|%sSv5& zH|m7V?(}Fj5shPDz#lq!Q_@MnW%p|g(iaN9g^KEX=|yNT``=+;?^$0ep+F8hfJsX= zEVwRphc2Cb;kDia8UWcxoTd}tdt=XYS%?%(eGwv>f~UR>dr)JI2riKX-izRE{}V}6 zQAO)G89^v@cE4pZZ$QVdY&R5BW0lS;?9mVTgy^sFfScB62R-@meo4ZQpJ91nB{S(^ zAE}Y^*ZoB)HBwROD~&x`f{<3}evkQDBs){uAuT0g!~`BzbEA}k$42Ltmrr?aN%p6oW+`xP(!pf`w5>?Ff`y-9~c9eU@A-XDyi;hmXN@@ zPx=%I-*%gn%#OZJ_WGt_sU+@<_BiZXV%&3_hMi|N*^5(YQbf@8l+RvK)e*xmNsN{8 z`q4Xz2#F%>_jEXVMkb3lSZNjLDe9!pIN}*Co^}n7OENO3ni%aRhbAt5PKLB4a?`Qb z&ER=ZEYG#@i=+^Z$H`ODUa0E@AK0G6n%qUYk(;Dc+W%I2eF&_OBzWU@R}*P*aO#Ub zOFr$VzbvI!RIvd7Iir|=&9d!FJ}yNMH>Fi}hLlV*mBJ4O>K(XUpWZZ|91)9S)Nl22 zsRC5L>>FechC3)(a0`;@mq&LMCexc@|0+n&V#vA+jjsgRNqiwOaI#K9B4l6E2ymWK z`D!6kGRdwOT~r{$3Y>&J-|!)7B+v=2M`9YZ~ah8W<}J1 z7lDp`%UAYN>Cu>}!gTz6C5a=^#|k90E3ADxNW{G3h5B^v71w!33-g@vp~a-sSAJKh zLBFiy-SWI1^wLt94E|z3H(PZB7MZZWQR<=Th`({xX`(Ds$ zGmUTirzRcoc-z`11rjtp2nPo)4EeA?LfbDKS0M0v z*%u0AO4nNdQIJ!NDo!d8O~K9r)tYw+hm zDhv%L-`Tj(Qy@Ysyi{M%30Z+weG#NY94X7AbOKV*9@Pnmb6NXK4V9>bm*}MQwfv-$ z@HeyPR~k}phJ9?IESbQ5tn2Fn3`rjfRsSgvu$lAR0zqrGmsWwtbrSlz2YnMHql1p) z3XB5&LXbwB$c3}Yf=$tk$7E~Sz+1yVsbSmA4uG*+LF4W#lW@K+$+t3vr- zR1$Wb(wBi$*2JQ}`ns_m+DL9yljxgX^*2S0W{c$a08Kgt+@cClmpw|q-xVUF%LKDk z0ZY6^P2|tL`X34jl6y}+OBE1yPjZJUp+(|}*85XoW2vmnI#dxYG7t5DDq^XuOb7g> z5aRqCN4#*0n%Y|143&Q?ip`jGsFXwo(aV+$8BzleXi{roRair;V$o%-?WF{~JC>~t zh?O8$kz$6~1d-hh@RA}VU9!M!z0w-;-V0whqcbr$Q3!E!Ko$LfBAz0qQhfCW>R0xq zl*(TdyG;^RRFP3Oo_LQrfvO|p!u;*wI+Fcgby|FeGj26a7O1m5QzxN4?>kxv?RhI#*U)8Y&zskY_>AG95Fr@? zY|u}`*+3=%$uJ3k1~nF<`N6Vlnh9Xbgar~R!Hh~d~l>uIdOo?@eZx&O*UJ%Coqlh8eFJG$D;N#M-bwWB~9Jir{ zn9dt+*GcGD@=u+F&K}YmY1oMOxHCjRJ=w||>rt$$o}!bwd?s z6TM|pCqjh$O>VZSp4}U~v}?t5p7CO+XednC zOvlP*8yD+je8TZ-h>+Hk83Qz|blP#bPC}pmYpukeeC#<;!zo7UPwJ$6uwJpb4`m~K zI`-%;NcQ^vr6B^*@&6s7AoconTWE(^-m=#XLMn~1JlUpOYLWQCJ>FNjPzWU;6MZQ} z^ouJz!+;Ofn0)`OI4?pAq>rGK>*Ht(2X*9qN!yy6ZtW{@u|L2&Ns`KNuXer_CMGM; zm4kd{8B3Rp=Y=9fpjhck? zNtAL3xv7MKq@m9iBYg!f_MO$~l2nF!L!bA;#Kc8akMfyiEcH%@h6tHsdMZRJ`J}B! z>)Dw*3K0rVv@}G)b3*IyrYFa`=Z$UJLNq+_14YF=0A_c+74GFu43X2e|9Xh9!3(jf z9HS?f+}dFwD%7Jr6(VHLtZENEyW+>rF0Mo$WBomg5()2hT8JKci!Vb&#Al7#OHWVS z)iEJ5;i+B=S3t8n?yaZx{8LYen7F2wLS)PfgW>Bp2k1k4CZYgG9RIgkF_2gxvQ+6BN6}=m#Lw!;8*boE4866d-;d!GM!{oj@+HqWn5zikTQ(W#jq`$+o zxJTM|e25v^mj5qI%6-!JVG5E{8rK|Rf_kNM!=%hD{ajScSH7eBgqZNW7k!v_43y}k zZ1#i@HuMqqhRKL;T61CukT|CqVM5`Zt}UX0rhh9UCO&Awq!8;w_^&V_^H9Hri6s{` zdvXZB;-el3(^8$(u2VwDBrmlPbu?Zo744=z>Kh@Jd=wWR&?57Dsgi%XPLg|4-#cx! zuNLh2rc{WOc&2;wGU}K5P1Uk8uQW|Blzh@PdJXE4e$vZ?KN=g+n)bZWIeMw@i$2vW zc%G=SRZGsKo*%kTufx62I@7ciwAt>jmvImDFTGguKY!>osP}1}t~Jbj&*CCN?s+zt z5l-Me`-vr0sMlF@KP?kB{J361JkHH}5%D*F=taWYOxj;-59Mg`qEI1mCST~KL^SpQ zEi3afXX}NMk6EGDP&~|mGqomE|FSGhNzB4FIZ*3eNKSEX1`CB)@-AHXH46RlkC!TW zmpy0sa!=}ems=zu-aOCjiG?DV?L%cL@h+3}GU{C})XSK6`AjdAyvy!$v}UPyIbJUl z-sKIw-19CK2Wgpo@3KIz;CYwVib=f|HYKVx!M)3+dNK7bU+HDsyNqemGE3g&G`$A( zE^q5)%)9Is(^69*_byiy)u9itWxN;-QK8=DV!awR^%Z&v@h%OHmYaB&)ASNOPa@{L|c^)AyowWg%8%QdK>8N0Y- ziYj*Dn;bz|E zq%g7MZ{7>jp&n;&GQ@!JISa!yJg@UonB4a}JEcO5c%J9j;&RXTKstnld!MOc3bgrN z7AEB$=!Y-`$p?+kgyeyGq4UC|%nz+7D(0T3tvkeo=db9)EH_Z1-e}I;5H@rU_l3!b zM_MZz0wg|Zzc8WjO4k+9K-0e$5fk?_(G9Uqgx7`%nRogvOf31QIk^yi#X~(BrltC* z>U;>9Qby!5Ex{>~xq~Zz%-_K0yQOpPpF`&6LT!DC+Z$ib?)$BDdjGpisx_M4ps0SPEBu^9na&OQ9{9UIqNJ4urTvTL0a=g zp$bI$Td0&Z_6diF(MzrUmQW?7xequZj7x3r3ybK9Nzd!3q#2gbFe7%{`uHQchBPjb zxZvp=K=G+nvh{#_JBNqe=Wm zf`3fC=g}G&E3V^IQ7qBj>13xi41=F_f}xE~5m>NDVPlXw6#S_QQqfpsd|eHsj#2b6 z=7`)LH93QKWYjg)HC9&BKO@AMK3YnZ#C+lvG;!GK*b<}>2TvP*u9Vi4ZfuWd9j9#Vu*MflT@ z(TT-7ou-DyNFB;P(8#7z$&iy2s#HFQN8&fo7aYka@DQzYR0aItA(L)T;I{&JMh%v8 zGhPYn#_nZt;hQi`Rz#dIacYRs4h(xGU$eI-@Ssiy_Bt&@uRfnh((4CWGqV0W zs(##QkCG$z{1@ZGR;MeJiocMofyr>JyCN1NrB|EM5NW~F<+?L?KMAaLot6rHZKAz*e8$bC zaitF))@#L*2|Rto&)0u$3Xla9XtpY=r0#C6|fe-M^2jQVhsqubC9U zBo~Jv4!x#o%zX+;p<0SvJOtO>UqUg@Z>EB6mIhSW>!W2anLe+S8aMsK110!;(-%G% zP>uOR3CZ*Z%Sxzm(|49q^i8`D1vuGL<{8D{r#7hvQtXylN$}_UsV+Oo_Hu6Dr)*|#T=sPoI zo|XLLfvo7c{mgtC1mGD))X_+ValjJ+QbmWGzP_lIZ*h|+18n3ZO6o2olP45c;x_ku zswkIlbZJmgs#;Ug17U9%JA$@p*-}AxeuNc9wi;Z>RdAfAS(M|7*a9=e-#xrb~;t!1eGzF^TsbAkPvZs!x zK6uLrq>OC#e8&hw1}IAHgm27&Vq|mjawB8jpsfLWZ7wdl|nb;o~GX$>wsUWcyhW{K)96AKHUlB~iV&)5Mc~zLA*E5i| zgo|~P=nuTjC5sc3{eDqcx^P}b)D)c`e^qp_qv9=^KF7G<6fqyC5Se$h_I-MdNIr$n zarW=wa5j)aJ=pV)a4na%Wuo<25v@*EQ(1c=zJ)I`{_{_Tnsg>~j_GwGY^t>3UqzL8 z-+NneHNVr1{2kz9&dggl@@9_@!^sZVyMb(&y z_jT+ye8^~QbS+UlpSOM$g+LZvw3;Hq1w9v+dlNnAKoJc$tgeW?MegbfX|sgA8?xSA zxok;$3cgVxWcd{~?5EIFRM8z4u}j<*B4$glw*;kpCjs$fjcw&M0_47&YzkZ*6!ZNA z556K?PT&`<8DJ0eH^rRUQEQdLhPtwrwGE+#j;v~(QqXWW_E!+=FD8;@JJ@600Jksq zZhJT!HKa{OsiMek1AY){xYHP>)V^N8noPk@j$d9}$#*c3^^3CkKIZY_ilJ_%YlE;y z=M5I#7Aopv3xx^)2xO8=u&tBxQZH8JT*`!Bs6spgUpNZ3XgOv>g`JDNI~7hssr2f^ zc5QT!^nz&1-F;BoAQa;wJMQsrun~vhGnsNdU5rWN}&HhZl9&nEp6Csb2XJ3 zMf1@Vth$9K>UOd*vfAs+pN2~>r&|UlZ*E_u=On374XxMci7q<$!Orz zGN6r4Ti&~mzIKq2Wh{JeGjU4W!MLfY<*Man|7t#$Xt%3@%>2(m^_bEF5Wyh~WM!9tS!p5zBgaD&wxdDY#vn8d&JPQpKVVRNiE2=#8%4+rp45+k& zv0k>z1Vx|vO4O7btiHlXIpmL1RmE|kwN!(;5m8=GJ|AZX=v&DosRbjqDywm16{m}y z2`7$y3catOXXkKz9E=b!tg=fH9eTZvSmbGGngkaYQIF)Quf)n0P|CK)YKGMgtxI-f z@V*?JoY1Ms{ky7`X-C{Lp&?Qu&0pTC4pABxp8DJjmgmw8`X9l<1du81L!&P1B>14Ip0kuG(CA?D@9~z;u z1=PG!J#%DHtu_)Xgd?{^+Jy~wQ&m&s%xC`0F1#KP=Q0yB^PFr0UfEO^X=rYSnY*ia zZH71>j2@$E(*YyR3HDn!fu2SpiC}3!3uBpyi_qUW=;S=+o5<9@b5;IkBTF8lLZYt+N9Bt+A2IWUR9vJKvrmPRuzJUi2Y&C!KZ{t z6I4aoxy%hD;wi|!BgFs@;YoigP?RzudlWwYo-vVkKXia4_bI$(&kcmT@?-?l{YTFIJQsKjig4#vPDW`I z*)d#({Rmk-#t<#cGW^by-9&q?kzCh%!ZeQrqp7>8&XDO|3cBA!G(DxgwG;QF;0d1W z&WmkM9;F)7u_v4+wHlV-8PN3Xjm=5F$Yn{bzby3W%CX=|!YmujC^3M%k+%mcG;r z&`{(+&yWnEcK)T65Hs&`39V#n&Qi1L!bqOND^@&^P?vSQa=)HS{8`S|!K7NKp6!|7 zT0hxVboab;nYwm$<|Z8RC=c(S39=}YDG*kH9u5_dHOj-NJ}Xj)3eeRa3c!! z6ESaQ9U~EXIC*MxlDX*E=CM;Mt8qky7kZ@P_DGyZ!N+Cbrgg_j^yop3y-CcsgV49i zfMRZ&+i|G~_ZTr=AP3jA+ndLzpuEHGOZOsykMFQ&nTU%TFuSunAigdazAXbh4);?p zPuLqpTzxNEg;Ni<2e;t0)C0ThaZ{b{B)Nm`wxki3R%h~gD85@alO><(R`Z`QB4y6u zR!>RBF>VDeuma&~4FUaO1|sXicwbv(z7r-kI9Miw!EpNu}}W-zRNm>tF&GhAT_^TrE%A8u!j)HJxF3=r*| z*E+(^8ati+I!hGEBSn&TKzCVP7=EOkWqwG;JC-;ymN@AsJ6mELvCBd`ARi0-Xof@g zO1oEBc(kFN9L{&6@d#eOH!0f9s^_MQ%ENlq^rkZ5UUjWLrabH9wLDNJmR9-5vE>;i zU|RJ*FOz`3<0FqNF9WOzy?1eX=1F?Oy4ZT&yWvaY`9LuN@qCY8hCs5o~gr5jI0N-dZzWZ;HdJe42cO?gb!x zWyV5Rz=Iug&*?@vsHl>Q%!`U^>LGK?nls8^U^Rfg0eGMs0@{=-&Md<;L6QLyADY}y zE(vu81I{WV3&e-rStgLpQ};W&471z;z1jz`Tyjg!DI*j3G5nM?&&jUmmdn8E-lgT> zvGnVbNlM_-SPD4%Jfm#*>xE;_w*m}<{ufvQhQo9_zz8_k4loivMgVal)m5$dZx&-- zGTk&lc=HRb@;V9*wF8WXcdP&ylfUOhHd(5vflJH)bRX_@)Rnfa4AvIWd*kiqvoGd2 z+*L6~eSjzfWpDY?t>lX}6E3mD;TVyu*W8XcyQf3H#&!qy_$P;&J)i(Sj6kDj|OODfx6enj}$Mj<+QUj|nQX%!d-q{y)Qqp|ygq$gu^wN`Hm!6H^+^ zx*1u7PF!Y`jRG`@JciHBz}h7)RxpscyiEHZ{(CdLHVdS`yyS{9?Gtd*l}6w&` z>)GtaGAw&ow-grd^2L*bNWgA=7QbDK(eD@GaYGn>BuZwA5|kXYhPZ@~&n zGtdqb?lhxF;n7qq&;6H}A)@j4lq~C781OtpU}(8${}>|Z)UE1XGy1Rw$HE-o{yx$~I`g?W2|U~3zP{y$ zHhZ}EzrjKlYA_50k0XWM@9$f#^t~wUajRoV{00S=Q()=;&`2DY?6QfrJVwPF`0xMS zvm`SZ$?^98&;X9ty6Gz>oyGj6W>4a1`cC|=oPOmv{((Mlh+6wVUsza`9rj=!GD0b& z`ucod$c!rMzRUWM-C`D`n)>Dc$_A~boe%wwoj9HOWwsjUC`L zfiE?R*P%Cm#OxU{a9%QsJ36d!TwNwyw2RdrEzdq{68XNMrPi>{W98+dSTz-1`}qF> zxzq->eEh$kcUt|=`5zD~HNWx+vz*H{k5|0!%E5|S7k#n}%dE;hQ#MqpZ*5PNVc)2- zz4hN_mTFq+>Hl)BX*K)czs;)DG4~m3@7jqYp-i?H{t!?@$I5|6KWkP_c$P9VMGRQ!iVOt2WX;=sXg6cRHm6)(|< z>+|j8euFry{AMAR5YsPqARi)~NRIITB1A|s?81F-g%GoM+W2;%n4V9LH`~3hk6G=Sg+kv&; zEo2m>Ib9>98G`4-B=q&}@?Ie+#nBgdQJBFHT>K0ZY1H|e)RG-&oIiX_u5?&7#dnGaP7Y#irX4>D} zi_-RFv;#jEB{!tePYlS%t@u6euQ~}1?qQ}@;+eZzD{OY_k$o&0f}eba1RmfKP3G}y z5n^!SZ^EE2AokAE2|RP}D6$d5B)$>9%X~sa7?044JkFMf@2uevp7`wC* zkMK@aD6&E*H~3Sb6f#13K#0tvUF?fpI!u!uewDujts*0|lR{)3?S;O$J(-E-M3zW) ze+m;4;=TVCMgvGTiagbq$MacwZi|%VFG8h+djzb-D{2tS$dBO)_-$y8)HD~WRuUMJ zfcdYi#)%?yYtm7OcPDnEbg4!EH7`R9NxJkK@M z6;ffk3kx&?($1&j5tV;(8BcIlFJvJySfLR#6VH%^-hPD`6v0|+Xwyke&BCc+LfB@_ zLKwMefS|4nk->1E-ZB68Sy{X#G?_%cr?KPomTRBFfBS3BIRk>u%dQ{QPM^y7>vI8Xih zABBYU;31f^VTdFS*KiTeGQHLVYi?Ai-b@aAPH}<1v42`HsTTg=Np#{eVB@vq^_O*dt?%%4PkT zt}phy((Fxx0_p|Y;V!)Z{?Ml<(@?)zkZNo+heypGt50u-_w)j!+HpXTswJ9E#9)Cw zy&XQ%3y^BJfk7%#zAhYDkdEGxiJmMFc^m%!*gVLE7*96alX=DWPwyu!f_7NWrQ|U% zR|B_TOtcb=z#rYwT<2gMtK-#zxz6fIg+x&u(hZ=}B_);c3T1e)q}GUG zu=@6Dp2*Q8)JAooz_UK1P=XNTI-*cOASk&eAR#O7%*+cKiD&0`jfffAeg`$vgwC@x zIYdMXq*o(r!5Tr1b-gkmi;xgvmc?gvA}^1>hRN`ux8G6CC8Z=dl9v{pkZ0yl6lUDP zc&u%<8c!i4$B4oMQkwVi#59yQlU1cm);nx(qn&)9q$I1vC6zf1q;Hwi;Pv3o7K+AY zJlSRyKC=g#(=aKD*W|^Ztx!g;!-Q)J)6sEs&r3&BbFwh1vVbwwOXc}Q9OX|I%JGQM z7@mC$8&&yGyf=lG&kQLIHwAG(J1vbtRR`?stI|fe028Dw3SP{lEa4*|!(LL6Ox(q% z5$D-S<L2{CU7&Pl_FTEnLHYk%wQlqy`?B6X0X~C6&g^kwa#Ab0U~L zgp05+WWgOMpt&cm?gjp1Qgl9i&3`muKGv-9)NquC2aD{)e>OOYBsB70W9cKb@t+gv zBOEDyl1I2i`UQ96k34pIc$&-Le6D>Ip1(-`CW{Q%TAeI@Uj##Hi|DZWEOc)Q>XPfF z=#s^XpoES(s z=nTpTr~ywV&%q0!B4KjShyXLre-m-aRBx#h?Sz*fX5mP%@CTFOkB#l_X}QbG^D_sN(>Sqyx(L< zK|p>z@(R&UfV0Qi5Y31*;fNd0|D~5((}4~fCP(P;LY%&Y8o1*ujMn1>1Dmxt#iwBR~vkcyJGpE^ z>|N7-T_g^Q76Ik;WH4n)+4QYWHichK#XMUs_1FDp zTG9330=ZZ7n$qM4JZMj#bo7jdCBggyZE{1tqT!jLAKM){%N8z|3!$K8(ly(bMtvee zaq!*=afG%2huU@Jl~DyO;Gy~`3z zPDm9c<>tsw_`;S%9ZZmn@S()(Nt^sgvG&bryk%VU_;M7!CxJ^+Wm2<26MtyQrZ<|( zrLBnZJ{xv;AD)_lkg;TJ1Pej2WqNfG%D?|0kejMGRB zLr~G0`10Ix=%i*L=xD1rHCq;)JY@C>X(~)`Z76ZolouKP2~{~uusVb#Cyje4@UAUY zaPdGrO8wt?%bdxt5VJ+!-r^oh68Xg;34LeN=h>1duZz&IH+9r}TOxW5968EedS~p) zAbP(0m|hD)*1E?goMb$LbEg>Y`gyDx39Pihnp*O~jFEcboer@k3VNV`UxJTpDE*Nn z^FiJ-2b1BgLoMgXj2Y8BVgJYsqHj_ZAS!sqma7r7}1s z8%WHV+;g&B&KPW}ZmAx_xq{8KASmcP#&@pg4!**CXC7HMT zsc_7hHk7&zTTZN#!Leucm0o)1+Wlhs_Rl!GuV$2Xq&4KVtoC!POu2Nkbl-eNOxv+J z`DrlY+;ZuZf{`d`flNKGTw19?C^@A~!a2WeTDdz^iJ8ZG=7KV)r#g5uWR@OV$yeYx zw=9B@7g>-;n(#BQ{Cw3Q$irt0?{Q;X?Vv{3^kzP0>p>KNSe_9i1JPjk1 z1@MR^aUQ>7>m^%^`1!Br6OdI-g~gXzmr z=PG+D$=i5T)X)504wdX-I2rRTw_k0OGlho{ELv<$&=AE?UtTXL3r&I1*H}|E;v#P% z$sHW)hrBdc{a+Sztqm=aOsp%gkrGIShpZ?&6WKU^B$Mmqj@NtU)&c=MaIH;V3-FEj zsYoa}5yCCk^~r$LL<)0HTg#o-+Zez@Rive&R_`Y`H&~D`m+U<@`vDu=XiYFl@=}b2 zrobciRBYz0jP!q>@Qw+AiA z)rd5~t0u#WGAL!A!9%#H%eZlweg6D7HBy+I&I?pK{ULioI*63HTsY+6GHB#l%(KM; z)zXjH(D67mmL(dfHsDcP0)Ir}(|ALY=WWP%oEl}JfoiWmW|0>jmnLcxPk@IWx1X6^%jT+(ngO)u$}X6-J{8BZVS(!iHKGizdi*LOAnj z^PDR&X`EI`gxSwn(D`v{q)zfcwIR=1P-ueDM8-5SSYbh45Rb;03j}c2bLM##acP`R zB)}oh+tBd9FQ12}K;(sThYBvNB=Gd>HhC@#M)Ro)WpLIT=H!8hG|n4HhL$%iD0zUHAma%z`mHi(=Uw4^A+z{1OxA(UtiSpt|gc%9Uxbc0voTx36JeAiX-}u0iNQqP9`4; zlO|E(B>jUS`^%;$gg(Tv)Tw1zyN{qMhROu2qcnqN>- zBHRRP7e5Uq=AG<9k6e+EYQY2qaP3NE(#j2jhaS){JK7`OzjC>>N_VIdv*FJUtJ+h` z!Dzwam1S_+YUbo>NE)YAQ(>RgEeJ)N8gUL@pjxV*ErI;Pr9ia<*03d#hkxSnXdYz= zY`LZtu^f>mvC7Htw-seUG@4IaAc9xdvdJxtu9E0zpxV7_TT@7JYV6(0F=g=3I^`0o z?^-6M?(Ttgt%)^^le;>}_~#8Ci*lY+z5NcoFyWfI@d1PLu>=$%yW}XWM z5pilHBT^DfDT#1BgNqZ}}8 z7RT*UhFLExD!XeLSQk>&<-lm2xN@)+ltwvK4zb2~o!949NE*hpXRVDf5wFbjjlzKpQzUZiGc1)F`2KM%qAGm=N4)1=0ooG>@_{ zTNvc?whi15>ggG6Vbu?6f!Vv2g`?p*ukT(KmbUi|_9zQW`+=M6uo!vs&Yo7*yfdNV zds(7*V9joO+W@5?7ks z7AN9JV5f-|SY2Gm-Sz}D7;niWYr`TA1jbLc00+0kVd0cMpjq_B@hyF&p!MXbefvs7 zE6%*BeWqbGDH`c35nD9z24X9<_JNKT&|cH}z~JTLm>GTHAj_<$@7EUwR}!XWK!Q5Q5Qj?7+0CjXlT` z#NK{gv>cchQBd7x2j(08uxYG3Abl+@@$$g5n0~MV(>Q>6j)lG8j{nZ>HsHYC{(ue} zuy+4`ozA{e&@!Kr=qn8^{dEuSGYzY@i|vS9e-|IF>axm%1f?bMUb0*`ErF$}vf=E> zze$%tpzNg&>b77AY@6R~g=I&&d_332o;cD42DsKZrIWwb60huZpPREXUbvr~%i9sq z9qeR}J&2#Ga^<|Tv8-axx5rc9CJXF=bT#vlGJv!Zopgx3MQ;|p>7h1I*5rmAW{qK6 z#Y^phd|UYZ!!2wEH-MXuumKnD^B!|#pYU`mcfnD8;-EF_o`p6Xe0#R;XbTkc81RHW zh8+|VS!8X@8~y+5I8$U6Pf|*xoH=8cg$yUR+W`39&Pw7l+VCG#w>I@<@9#*?qw zf@Uu_gXt`ORT}C=iv*1hKfUC$vIZUm9#$IIMD`|wxQ7jKy2o7qjFOqv!KRtO__yZ4 z{9a}Q)>;3qG=UPh9L&JpXO?_u1+UA)S*1C|XR$&1%Pp`v+q<4sGXE^@IA}O;3e;JB z&;%?;zy_`V<7|U$%LKYyIHgH~%k9B@EU~B1 zz}!m=Sw}*@e;TTef=f(QN5k)isx?Dk|4Yp>P*Ve!o2u5rm!_&iVf_CYW?&e6Z>l;R zcE8M!bp$LjRUHY>n5vF~{+AnOU^L7zRIMEX*O;o-z;~vqwXoY2W_hh03P+o&4uhvn zRfof#SC+^CSz7@YwWJH}i{3zAJO*&>t2h&0cHak{%LGqn)a@+JR97k>f6UdUnJP*3 zil8c;FU{Sb5L;}T6&?B;fi7)57-ZFZjj81za;1N9WNE8~0g9&xbg3Fqh~4yBbIaqj z@t}(ZLn-Te{P63{bD$l1E89jd2)0tWDb3Y&y?M^OmFTYoq?CCN&~<~k4GgAWx3$y# zmmdVOlqnV0d!xBUU1V0jn>fCdT^;%?fi7Lsy*r*azS-2E2RKUrsEwJUW)*dld{uzV z>|x7WBx6>{s|2$2ld+f2_8@k?RkBz#qcZ9yfhuiH4ZnQfh=t`u-m=g9i~PDz;^}Ez-Hhwki?zFMgz$21hTYM|D1W~Sz>BX0{tpLrEQ55 z{tvy&)RKVwDIlfoFmK@pV;*<6sktC>{d+jFv{f-__aoIV7VuIIP6OWQUUS=ICQE}> zuN9zD76oMI`^@bK|4&w^9sZTvy@H{XQ9Zu-{&I65ePs8xAhFAYM3MS;nfbtP>{bY@ zm3c%SvDDnEvN#9*9^lAQHdWjy0#~|L^KBO%slMrhrZ$7fO9j&0DjlBexXjihgMd8?TFxQ#uI`bnV7tV!o+9{z-lK?%6plN?yu zW^i8Pg-)F-C`!4V5P}_^vdDvcW$N_;Skkf#t9jbWp0WV}_X)6pO%>YojFnw~*8-jq zNCTr1F7m9EMR}V7-Vs;>n+no-&fKbIO96fm_)?a2=p&xDvM#P;TkQpoGq5U9CkRyO z_QTo>3jtjJMPq9;*pQ*l5-3w^u<=WFhTtp#pf+aK4y&D&z*`El?a`Ps=#ax;<(DPK zLUBfj8NQ}=q>5iI6tJLY7KkUj!s$JH0DiZSQ+PnS!>bCq=&aWZx50@4Tq|IPFQ0&R zeJyN#Hb&2OBk_3Elbv}DNxb_h3m2QHxAo?nND{9IZ1he_f$d*6u+oD&bM3txL!#$$ zXgreWNJn$|tOHM&kW^H$oK{v(bvkfN;$&q)IQb2Oj1+Q=bMWDDc7V}+?CckkJJ|0{ zD>9CSZQioN#d#@yXorjC-CQOmtUmU(rBxcoDB$leH-M9h!j1&Qx>EP90YcOja-t4A zVgjkCa$}ipa-4UptFpQ~(+!)wXJ9D+%e$R$s68%+=H54f`FX64J8mqS!0Vw?@0;hd zvf7U%#Q<04x?t50Y#3Z8*PM=HLv-OvTi^tz*M+(dZOnPE9+q37yvO9=g&*0NjAUc2 z(GK|73e@PhIf82b*v8b@WVFMD>#Q(z{bHR@Y|Mztvd9YNWV4xUJG6dkV2e3gR^Y_H z7rNTjJ~N;}H_6+&?`>69c)n~R;c^3vSAK4rwee9mz)|;wEl0%3VSsr)mK&RJl5y&* za$nk#_&t&wA`bOml}pr|?#}1D_T$24UmNhy{7;JJVx1&Hom6QI^v0)y^GwjnEBD?$ zO!$w1T?H9v@~eMiOAycaZxj}NYYWHoBa#iYcZ4^;vj($D51)K*i;S~R19-XJ@}mJk zE;C{J^k_2gz%!@#nN?Q~*Y)bqgpe;I)zu}&w2vF(jc3}f6|Gt-?c>8YGJ+s%Nj z{w{+C7MFt(#^F6!C*(M6RycI7R8gho9mj4NNUc;Raz-N8Nj?iqv?rXnR|pdl={PK0 z#elJCZa$h!hd{`Y__r*|H)+GbTfD= z;kxL<$Wuz-->tx2NlEy`>IQj_BvRc;dVlxWXbin)Z#5lxcW2R|Y}c2k3Np z-r82Ca79`AYHidyWrIl@qR|U~*>OnLA6?hVIu@_zrw(1u3W(3#K>aKqmbqRV=VLh&<+Z$AKGN_e?p$VOXxqEDTr_Kbd+buCan=HtmJ62};q+Y%vJk9l zs#|}uPZVA?8(-a*d=#|CJO2xGqJnKZ*dT8eRsLdEWi`&D>5{|MWkX%48e(mh%+DGz zilHZ(OY}JKNO=tOL11Q$wfVxaMUI?*HK#k8&Gin(6{0RDKA8LPIOcUaS!<^mc3^t# z|0jFw@mhxRfmHY~vPkZG5-xr=_@N*nVKlmtXi19PFoVbTtCpx)Kb41bp=Y?A!9bl_ zZ-hOZmH1_r$UfDk3r5;yvpi$$!A>8gRHZ_y?yio((u5+oJ`G!s<^(2#`U3d%0#2(k z8!`<#WRU+w$sp#z2W@+>n@R6>;I?=FE5+JTSPx;Ojst!F>r%>qp4&yor^z& ziVoSlz;(XCZBf@5F^t5p(ftfef}Qp#lw$|tA#lHfZhXM$Mry5@2ptN-Mtka5X+9j> z1euY=Hx1_(SHj>m*MTp!O2PcaC*lBV`d)=b8#38!z8gb-Fgk#4y?7fiH*0j|$Bxs@ zHaKSQLP}YU?a9GE>P*zUvbn-YnLg2a^@Y5AwWkIS&`9Y!Ux)%}Vo!@*di}ic;1{8X zjXhK=*-(^?;&5H_eW9iy<4UcKg%3owM*}a3ZM1+ zjZJ2vxe>!)yC$8&14wJ#HVUiI;)3EjUP|7r%941V|$666DrkZ9QE0yA79Hy0G_I1RRdW!1MGJiavl1+DT4k{loK{X@E*^4&VQ(P@PPSY@v?iDc#X@A_mj&XDpj>T@uVw3oicb$RzQQ@#;*rWAOaJX(vZI z{hTvDhmDAKu?@NTB%&Z1PbSh1ylsrYxC7XEiXlHbTW zfdhL)jEu^7uN0oMN8+>)8e5GF^6XYm!ZPZNCijUt6*(R%1yH7W=B?BiVlF0-^-))a3%j<(?SQ|wcwF@WPW9c5*_olcceh(1Ix3?$e zlkr$I9%nzm-On)7DnT-n>B@J*fc?utqi=HQ;wmgNBS>R6?qwbhoMmX!rHJwDvbajJ zo97uFJ-a*x?Bc!QeEl3F2I`LvLtUv4GH^|z{;z%zhhi6D13U$R2Kq|FBHd0VGB^T< zvrRSY6CJQttR!tk6|z=VN6;@j&}pncEloOL94@|Y4IvpD6F1HnMqtyt-C_d~+1tgj zFvL+Lhu7Kwp?|xv8QcN`*I0eB(*f@qYd562VM2##R_fYZSYob?o#@a`Q*OMV6>c)t zo|I3*&IwcQshK=(Yu;_Fzi&RnAO{?5YGQ6a0~5PUwb4M+e2g4~XN)0eU@Gn_@0BWP z!;K}gUh}-yL>pTr&yNS&H(k;QejkZ(kMM@6W-ZibN|NTgsgHpBORJ){!;=d)?k>sc zxhovXQm1fTX+*TU+eya{aB$856?07uc!SN~jR9kE9v;m>B5P^^A0Q0}x~A$lT=MeN zKWB^~CeALcPRp_$zut7=TSIMV%A4k5T&9h#!Z`4*4aQq;I=;u$jyGa&#hD-cWsDL7 zb&8ueucWnXI-aeb<~rDXqqszit3huXf|wIpIKQ+B;^4+dlkM<+X=O6dTDGJHHt#LT z>o2FBYOY)h2Q4sW9tvNZD-VMOhZr*thkl0|E02J)&6P*OHisEAkAhRpmGRhCV`X%I zorjmq1|3yjT3U}p6D4u76QN#mnnSjK7?+<`8P(_`+nk zPEBhgIfUmhu>*tU^KCd$Obw1ldz@HDCr(0k#VN_W!Q>xNc$*(nS~s6|qwVM)X$%@$ zR`}2WhO2$C&KA1J*K%xWE1h(5i!s8TnYasMjw_Am#&6_u^_ff(&NtO2YrLx;Z%9qn z!69#|P1l>@3sZG+s#?;S4~tGP%*}XbKKU+W)e}qW;}QdXO>Tq))Meon0}Ku=h&J8% z>xEG#m9|n*)kESAJR_CWWE<Ar z0^6bfjPgukZlAJ;Mp*GSoM~;8A=}}Fa-o>v31?ZG#omfdL`XAU_iStY*mxe75Ej}4 z8wu_cdt8JXJo+5#oU*`=4KypNFro~nx?WMX#r@F72D);S z%3WTXn+~$CM@4CgztlLgfdrzneh-FU!J)WZZUejzfkh?@_|0?@=jHhAv0II8HGyB^ z;#Y$-BBm9;hN<@E5ksytW~rzO@bI9G%lpnzpNaQEWM!*aVAkS7RlN5SvshV8 zY?F_i;Mf1h+EoC^RbB0a6nAg2P;9fnY*w;K@T`O^WRp#HLkJ;+*_pSy!_LkOBN1E* zrC2Fe97@q51zNOdkQOgLP_(!fw<1OU@7#Nz%iK3hT9Vy+zVn@PUEY-l3``5mURV1} znmmYb31|QCnJriD$dn3sY;@(bu6OuV&7{+iLzMLAxu2Ls&&J<3~y}@UvG@L0+o73CV zK9nrd6@ED~0c-F$nKq*cXu#fbl9Vz3qo) zN;7*0)!X$~Wy4aS_{%fzn<^CZ<$R*MtGiRS5WM-Fw!S?Az*|6$j{@ugzEXq9h1+EhT`JPmYONWxd{g9H6-0PKlBc*^V zER67~wN`9YmQ@U0dRDOC=u@$_&Dq3z8B1v8zk9i{A}9CP zxq$^AP%aQR(w}@1Z1?72vpKr`#s|P%$>n@1pA|5*y}bJ$UQhZ^AJq8rY@bkc5qJ55 z>*{T{#X&CG_8~8?8^evxsZ}uC?tE1R!%fe$hyAu(aW#|VasVCUWp|S)QiV2r#Dril z90WMd0>~{!&6DPruUK{>&hrCCDUm30`+@Y^5tAK|PhS z!u>B2r#5p>e=N$PBE$aQOCoVhhMntQMuHR>a9xi_8C50fq)5;n=BbP)17K`vVN$F> zj(fsyN|elf0t9vSR$}8jmrU(@tKsYf-|nA&TRuvp=w6fq>Ai4YxmCFTeVZ#s{!*|}t);?6pVVk^a>)#KA)zzn*sIiHD-0PeZ zn$-PN5V21~5Xkm*^1@^$D{dZmL{FD}qcfilvQvaebe^9Dig_^5SA;nCtL1m9)pc5>6*e`}VJfBc|YWMZT~*93d0!LmxuK zcHP&YD7OHJEd(6MdjNLygcmaSlwRhm-UpY^VvlgpDDz>g{0M4&Wij3F5lc?Ikn0J@ zHUVRyEYNDintR>tO&6->%5S*CgxfnH&`~L!F|au4Vhe<-7z|naO`E)w@wH7N-JlK5O4NSX%^v>HZ9t=ZyyPZrkSy=Xc$A#d_{Vgx% zyz7$Tge;x|u%xHF=aLqNQziC&Dqd&p!tIBY|Bp+K8{(Jn#edU`0W2w{>29~!7%3%t zdVAG=v@Jhy>GJI~5Q@7uli4z@@}WzNHL>1a>p6IKK-@KujzX2dgYVpfEC=6#7V`Z4vQ?dGrlPgoOfHtdRdarR%1rB0{8KfY0fdW>dE55Xh z*n~`%=*v5Keh9+h`#WyK#kH(_HjSUL8k;~#z$wj45u4!`|2KeI#NrP@5;GQVyWazf zh{#jS1!E+E_D762hQIO%iekmvG03>fi%^>=@A%rIi3G(Vp*=)YYRA!`B2Zgl_~1_$dOO1N40B;4`%hF(-la8mAQ99k+}hIm2uX z>iD0ZsV!43(TM>9OcI6cod6l{f8XUhKN;`2KRqCvm%-jCA!>@wy=~&|XHb69^NN29;*VqSV z92(d1hcnHu1H$dC>t6*+Rr`9x+I~*w0n%3jam2K3olpj`G5wDLa*IJAR#?}; zfTxqN25R8z)Ff|kjz6Ow<_+bE89nI@MNOTPFQ%z(Jr6eos;(RrAfl(efjD$Y`>gLJ zLA&{qH!y|9WQPqr$dO7GjqjW}bhA@}8$L2AZe)MHp#wjh#4x^8=}&TVoez|7gZ)6D zgkIRlK?SezQD)N59YGd5*W06<5>9gXN$>r_0at;txleBFk)$&V=g`vup)_|BKXh8M zh(2T4%{-ER*@o=n3?DKU%S}obI78VP(OQ1HxrYP8fy_uUs~WgH#(2afxjMPk7M}2w zd>ep^NQpN7rALZ0J;<>moxzB323sXdw8xeXFy>uiwSA&7UZWIsP#)Cv4HyEFJ!_l}LzpV$m7=fGDc>*zD zo#@J!quk^yzeNeNgZm>}1O?!pQUX?L1<9#B;Rx-)-*^_lw?Y<_?}< z)N9#WUG0=$$t1~xJfm!0q0x|VC?14Q-FU|I z^y~mZSBd?-AV4x5yZ_$^2=6d3h@|bt`;Ca!{|u)9ZI*<8;|xVRk;N5pOmjf1pN5Bg zHwT1so4dmVKb~9MO9R5W^x)BEzn^prEqES5aZyK$1A1jRtLXlLvg zAeD{UhXEp#cBMFJC%>X7u}Z$q&VIQ)Xt*<2ss;@Q?&8;Vo?&|=K<@7H6T3PX#H?+G zGo-E_jUayu<#E9A0TNLd{x3ivMg!aL=3rM`B{d-UO|VRj3EmBs(&XL!jOb(OPXXcR z!D-#eemsv44h#rKF-GA-hx2Z*kY={|$)F^==DP!gqIaIy?$?5VmIjB*K6+M%UrBY- z7Y2w#pFFP9ujB5Pj|o7ip82f+k*jk)dy1c3_Rq`h;g|Tj+qnTC?s1m}h8JnOseV!v z9dzz=MSzIAUh49zaPON54(AT|nE(;G+g-Ot%0*YSy5~mPF7=`|RXAl?MIrO$O2(@hQy=kTC4pvk! z1l2o(7&V8cIfEEAhjOl{@@H|ml3wb z42OfN#&jTzcO^BHll@|$peQf<8%DTe({QOU(AeBi7{JqZSRL%gDK9Ys7NZt=MibkI zt+6z&N0V4~ASY|WyGnfYjGx}4kHS^hacuipNV8`~c)={_-Nq)czd;;m`&J9h(7n+Y z{C1WOw?g;et|nbLJ*f@tq2KmJ(584{+L43b>VicU?mb(VTIS(j!|}oqkt2z{BS@V& zA{N!@X)Uc8=x5ZMSlxS!{D3K#E(C|#h8j`rjO?&}c_5d91r+PGL)dQ4h}9y6EW4g*^~_`_J5)-!aJko5GlE^=}%moJOfhb|h>VHcb4)yrQc z`dCYcV?Dc+#DxHK&|s($H}h5DK=sa%U?ds}C3IA;>FfgStA)ksM_Q_doX*gVGdd24 zBb8+>D7S}S>LPol(9H+xH~`ij>KWF7V#+6yYqzWpdI0N;1N5dAw!(#gwja^qEy>zK z&uO8>&a7$q+#qMkpK>||gi0^Iz-Eo!AvD*lc}8Ae)6{7%XzPel@PHP+hd=32*Fiem z0-L5w!@>Ca%UQ}z!-hp2N+7X5hNl4w_zz9bue7wfuoH;Bje-uyD{dV_oxxIsKW?~a zIUmr+tAWnefno#hFoyBiP+=nNj+9GozM-T2TBVqkbC>bELbOQCP5^aBwKELqTK|$GAvO z#8l{^BM*sTg0?+02D*pdje=)fQ@WXlMKIe?kwI7MVO8d=cz7r?ctysHghL$ZjEq6k zLTeup%I5$B$r*B43~&$4I#QFGzSKqb(2Yk$kRk<|n;dmz)1x)PA|saQqE%Kr8;%!_ zh|HLIOoR)nGZ1SXNMbZ*UunSwmNVq!U+J)$@E+RvSZzGLrjPBRi;s&SMryd4uvLGp z2^QHhsEbzF@<2FVI3luThvOq$@MH^`uBWu%NN3q_WqzZ>Zo+$LqZ738bf-SHhYme4 zf*7eW(NS66*2IcTnS7Eav0Q|@FdWWah%DLg}^b@jEk;gd? zJw24!p@B44(Js=2Gh%A=&}wJKQK6e-!F%Z7vm)p-^06`NzKLh_z!>~b|Gf^a$kHpq zp_zinna$3QAam859=cZx+ttH$X5l$HyaL-po#*O->0M1=4_$U%1ZAesoh-@Qimdcs z{(Nl(7 z;pj{Oeuygdc{s?C&?0M~Lg!x^;ek~HmET30b6FgC4{dk3HlF@ZAB$=26%oWG(Q`X` zBf3%-EfRXZHeB^YcZ4fQUqseyeN}`PR$3!#6zii}cnRiK@7O=-@LTvE+UIJ01^OWd zxQFh#CW2a~iFe4*c5N&bkyDq((@_b#(siMh9IlBxJ1!jRu1=C#4j-ES9Ln!da%gbw zeNux`5B=l%n5L+5Lre`!y>5(9sbH+-sA`vMVny~X^A}BGITYVN9L`>d40|>l<4Ai{ zvf0p}L;o7#fK??K%2~AbO)=0tbhkE~Qa9@|_s|x%L|{1`8e7f$kjZwWz5;rL546!D z3%hO&^+x(4a^?PTls{K+X~OVrp{x!(=L<)+NXy`p{x!( z=Z{?V`6M15i)Q!h8=xr<=!1J`g$EkdpM!M4B6l9sMXSu&?(d0LOC69&Kj}&^I9x;53b(Prl;`_Yh!!pi*T@gFU&7aM_|2i6<|j*w4cSb83fG+BNfZ2%8Z74VdQZbZ341AVeQI)S0`qddGI`Y} zYE#Am_?K!@Jusii(N+J9V^!=D#mR8I9r|P(J-!b_sQo9V8s9tGgQt5b^?z~f)z!CU zhco#-IIVHzRiThwLYq8QI|F|*zkd|^I4X>YQ0LQeTqqT?nX-rnUkEMEssA+=!63G< zax$dVnOuf(LlBh@LzLTkSoM_H7~lHtyfn@2;z`LW=&QTU*;!a{Qw9FkD+)DYzC|HoiI0aW)QYsrGNE}=!iXFErzc~sv(ea3m`Hj&q@vS*s z1Jm*RJ8#{5dlWupO5);V`h8524r5^^Wt3bE!Y=Q`bHvTT1@PNZF{l!F*t?@~!zzM5 ze=i=*l%ioAY!qE7^7N=UI7P1b&uF|*DN_IbXh^ISc`znTH^wK$C9VWH{DXL&xF|#u z_2DQ8%qD6y99C*<^l>~-(AW=jF2tDJl_2+xl7-V`{wJgJL?z4XqolD?=EzUu_#-|b z@~oE1pT*G|L>D~BLvb{y$q`(?CDt~n`SaRIgcr+v5r@E@yiSd!CuVjhK*cc&)t}_? z6puFe($vOWG^XywmTtiOx5^9?M+{}JNG<<$c;KE5YjZpZj%v<}H%NGDD|?Kw37PR~ zw%qzv4Gi7GX=5Q>q^}A%Iy@ZU?>CCd@LFGM8y49;1Na!(tzs?XOfOi<8oBLOO?~6C ztC3MkpO-wu!vtcD>}!k0xAqa3+kqq}e(Un3R4!IhcG3t#Z13J8~!kQuatvyYJ4snQV>Tm zadqPKA8YU=CGTC77oEQup8@tcDd?(Y*KoFWb{<4!4r^K)g7#T1HiLM0bXv0C$ci=0 z&*L+|{XLQuoUchPAKNdE9adhxdGgI>(TgD!c*>GDbdpSGzV3ZI2ME9su-*`ZWG%Nn?O{fKaYk% z3{ZF5HntBKpsG5ww~?Z+;uB!1Evpgq#Sux_V2dXZc!nkxF-!DtU2NAPnCZ;1qonit zw@v*|KuCX%&w}bI*Lm;Vt_BYl@_`K1fQ{R}b^=~?zhM;mUAYvkzC-QyaU&&VMxl>u zIOzLP=;OmE4JT^%UpCy-5SyW(p2AhboY&(s@Ku@Cw6{d7Hpcb=uiA-mfvCaOV#HCS zBr@lKt2K?zAxv6F&d zIVK-^`ec+WyoT+J+-(y^=at1*qBACrjtaB98O3(&q$#Tj5iOn+o6-Ch*GNy*t~`l$ z-?3K9jpOK~_{zQorbM0NTZqmQv3tR1?9y8XMyP40nq$#OXVtFUMBmn~+)M}TT(jFP z^kVJG<7wMnYPQ@;zp7n%0(}}^S$t2NxNB^W>+01INPOYBdK3g!$2VrT+PyG4y)$az zu)fK#E40$?HMn6>@PO`+Q8Dn4?xj&N@Stv&$)kz|hGo}}ia`#{CbW&l3sJPL85M<9 zxVCH`jVEUDItMI{5AW^|;5rSg8g4dpm^{8O;4xV4153;XzOLRHvdYz{v0@UvYv)hF zBxcj^{v=dlTK%gjHF%{yr;Qcg)4l@3sPao?JT4JGbq|xOrYy6Gww+o-tVSFQh%(DA z8a<83uPI$Wfjd}7e5Dp1Yb8)r^}ao8aK)mqs`?|NqA{!b6b-VqFYDH<)3L~W|~bT+i`B5Qa2;=E-UpTc3Qn{!QDHp0>Q~yF7A2F&J9$7 z8n0Oz++bJ7FX%<$iXBafd~vX0af5nUw}hx*v2b!{Z+qV?`d>6^R(lH-`@)Iv@k4wg zXwMXej3Qpx!y;lz%vRO6gHvaRD_3%OfdU(=jC40PHsF?8`Hbf(dxxutJ+Ts&jDX2U zQoFEq_JasiUHuRq<|qwe;j242m`Rn!CKmB0G3uTZ?g5Sw4yldG>CC`D#+Yhkvm?nI zjoC*_sa@Rt3>Rr|B~K`~Ug2|6u~f^3D}jH4nNl{v*2UfFHY z-B8oZQ-1Id4?XW%G8Lk8Q^Egc!9_mK8}A$fl|)0q11$Ly##fWdPWo!-n=G_<@McrX z5fQ(8J_P>p6$d{+=63cl{9i1*^uKXja0J{|CMWG`J{`Q(H7e41tStWN~bjK%cO5njryksHL-6|F~l1$Y58OGg~#4Mq(I z`~hD$Ki0ST(Oxu`%oh6s@s11K;|mqfIqwBGX_I5TG{!;nr7tjN&;h^lBC};$=U88$ zLBI6{4&r>UKhPlKIIsHDzV2zAc%>1K!#x!t?3JUmslN`_FVgRQ(mi_>_nyal6-|+1 zzS9Rdu+&xR#bhvpeq`m}gsJ0oF`sPqtZ6eVMsbO>U8Jjg2m_ND@e0UJCwPg);3bJ* z$GY=@l>;jcygxFV8Of9r*xA%p!Ob#d{xXjTRSlvOwed4~Zx{Ocb0Sr6{fDrCVMG#x zsjp&yyOWEpr?JjCDatR~NFP6uzVgZXV5gC5V(3j?h<9qZp`fi#(X&>DYqr+)npz@P zR{O2K33^o%oJ=2xUHi1psZrc=1Pq8{v=m;RWLDEkzccY@(W|0=1+)W%))6o0Gz{hk zDhD5oQ)*N2kAdT9vNhfQG%YY5j7|6EE5(#SH|S}gr)bBL2^7Yhu4MwJLOZj@2oBek z=o&qhK_jPB#JMzD`wT5hP{V^l6&xMPps_FODRHvV%lg>q`F50s{0Q}&spV8UFDxX_ z(n6PuOBDUizmHJB5dtiF;QD02eVI1Ya(;ueb=XDeko`bKTY=}&}fZSXZAKN){3QL0-!gd+q7mC%hj-$`@!DZKeHmU=!%iQ83ZI zz8ZzVtv{+(j7@YdE==JEuTTy1Qn;YrxvEVt{ z>0*6fTAS&-SnwRJ`3HUa937>L=6eLq{CY=M30H=U(A-Nj9qPq(Ky-<CEjs`bSN6 z(F`9N2W_>)Z|G{FH8Pu+sh4W{#X73Fxi*fDXd&0SEW(Oe*PKEW%Nll24R%X=^cOqW;e?3e_kkiTedJR#_-BjFp*Dbvx#+q; z(MYnK8lu~;4^m5I4ct$??hQdQ9BnO7;>I8mR(xoKzXVD0IirxorjFJA>X71uB$9e; zBAxGCY@{lfb{}_>C5A>1Gv?QoZ+)h@N@ z7(2*@^W(J!=J$8nLS=<+x!a4;77L&Tfj&CO~d!v!3S0HynJ+T00Cyo zI6H(APt$|MQYNnWp$naW3^zV9)?=|l1+{O@r4D+R7^}VQLq=*?RhxlOAXd^9=8I5_ zT!l663pIuU&9&w|A3`*h%GtU1d-avn zr7T~uxszFycex-)H#h96k9j;4psG>g zp#UR-fsPLn%`))4A!Xo6c}1}0!vO>~O8Kk6mqvpnY6^c7XnG`owrClrT^n8ItYO#khR}<%F;&VEGF?G z>WZhWAiG886hq@E+>u_d{!AE5tY(>DI!g~HNtgXs2&qgjlT?CpVPI4Y`Zz);)ho}2 z*s|-@cU2*h>iFj(sLV`U`}yi1Nq12c(w(}A7a~YqP)WTs2;a+BveVHoT2$s@RwG^R z4{V~@FZqzobgw_Kg?4<|his+O{ecsRUhyF((p-PwB>KP?h+}VaU-hatHqwp$z$W^^ zAJ|NLzUEVJp|kvf6B z9rHjb$7~Nv@AR1^!vxSJ+4t=rEitrGJ?X<1!q#=lC%)rw(Hcd|P4&ly$}p1tJVYo4 z(=*-;W)_G17pn>9J}cyeE~x zcWB!7qbh8B8^uy4pQF@H)%jcN!#MH>YVPvc9w>QDovkhK)FEe^?7wC z%rbSQ4ptSb4Zn!u<@j@jS2gqaNU$<*m4|NBHhK%S*Z;89p0=O z7G8wCWa}?mHIkwXd-e9KrYE}U-vQ+qNk=xOm>v7e-k9Y~0t}hst6yuWi*3J=1pZPx zX?b1ae%<>l-RhP@N|C7lbAP7mLln!07E5(+!pjaFy@IYY5hUxcXp#tD<~6p=$9^EZ z?twMIF^3#R$5?V?xlj7BC6(GO^Mf-L)2A{I;Z+SRuVfl!Qcb0=pcKq5JHv*BjR~x@ zF2v^+*9c%iUw*;DMteYT)ynaB>>+_-vIFSBvAv$cLIgWR}8 z8x+mYs%ytK7+&?2y>I}%8Q+}fofNYiZ9TG1Y@daqBT1~^>F9N9BoiYrr(gVbBF1Ft z_2Lr-^o%BRfQTB`k8Q%&fhm4pIDH+191TZE)nWSRsz;w}pdX8HLuSQ_HYO_9&o=rg z44S1V+MuXhpT#p6UT++!84jXHejY1+R>e{=k(KMlU&JTzB#B+QG8@-GW>qYwU#fEL zwMjg}fZF3o%fJ!oMw`Ym;j2InexHn9(I7XcJv(ex-4Sbn!W>!KGygZ^s5?dgl-oRp zT_`#_`23i7s#cHwO-#j*R);>_BAx>wJfgXnwB=92C0c^5wu;9UQOm!KNhPcGy4%Ea zz^=m=)}$%>!kOE~v>H%f=|3?^{I%||x)^TQ3l!Urt*$03YZD!;jculzG_dZKivMb8 zXfIaGs;?fcP%^F=-lc*YwFtwDw3lz~?Q|RzCDf}rPeWBKT$~PI*?!=@+AJ`zr`URX zlcUPo1q>fx6ZjZN71K3pAv z>Xeb7HCw`&a9t-yg-ULWGye2Xx6B!P+F`tln+JorG~YjTyjviu^VROKx_W1N;4o0J zh=be9w7M8kye5}MXd8E^(?1sXxy4QwS$woxY)Rb$5f;I6&tFdt6(sInD4zU)H?A1#2> z$B8=zT6JKZKE7TREq$D@lb4l!#C2w`_ylmRjN=2mQyjam+IRLUD)~M$W^u`p51w4* zLxFye_HH_V7r**oYJ@N6#P<|&*~+V7kQrD_9Kz;)+H%(rl3oLc-)HR>BArn%a&+JB zUMb9X=GBTMC}jDPvWi}OV(YU}i} zD$P0hV!A{Z`NYtaqOW}-(H?C!#nokqmN4I-S^*>$oooTnXZXe6Laaj5=rqKSB6H}< zJzNrJb49C6b;+D<6=mJB0Rsa$BTEmvgK@@Y1cxl7sirO$ogC^m(r?_svdNPg|8k2I zTNl3L;X(%q*=|o4se)ktrU^LQ4Hz!Tw|?jWcQ}p&*}WEyePhQn9t5iN4;xELbi!UP zBhJpi>>S+)ZZ|{|O`X$RsxC7k2BLbO6M<5VG<_d|Q4Jp@yIt1cMqe>g$Qm8EmQnii zj2po>PPqWiR<>cfi!A_a`gTrLr0L;uGhCdabZ_Gh3+`(F<*zZQ;%iSr7919T@fM`8S`0)(9XKHnZe|<#MzufJyPTdz3vGUX|Td9i>8=r zNdy$Jz1;}Ah~4WJ-~_VBYJSdd%}$p5%|m< z7MzJw`-0jrj<718w^#tX9dn4cn(cDW83USO%WxTGqqxV3Kld;6grf>(_;`+)J~w*g zoJC)F!fYK;Dkkr3xgkv1V!K?N9*U90ZmT(A99(3t2$hNl9~siJkDEZ`!afLe%tKY1 zFPxOIrhixnJB6L{*12xlex6y-JPze;JUE_MY{;UqM+HbE5kxr4*y+2p}Xy4bac z!!har-Cp~JT9F8Ouhp{iLt#Z@B#%e>`oj^kB;xgO1ix`AW8Jxbs38W4m|qc&!47PE zr*1O_@jdmtIfCH*>~KNMsp z1s5k;HWi5z-V5L%06MFgyJiT;2Ns0uSpZ;OI*LQpEqcO2`DskdWCL#VoGdRc9Tb0w zV?@V$1fubJ#1qIhZ1n**gMC@jY+Hi!U_8hxPUSmv&#}Wr!*i?sI~MzZ7;C%nvq6j9 zlnGC!`@`9pv;4ufKW|#XhEk=!oHY`>Z>)@c$h--RPe&$EUZ)P37K2eZfO>@u!5zb; zB-*o{VrC&medrX&CglCZ^g}d?FGQppGL|vP#8=p7l zRbQSj9_ShN=wXW;&Lnm577}dte#R>n?%baBC}C@LW?%_DG2#gq`St}uoh4ZmqXrod z`;O+JoQbkK4KL;eU{rr&B`9W)nUqM+$vCHdMBan23?x{*Wx*pxj@SfhI(n5CWI?bk zTTEEDKPZZ(t286mUg5V;FZ1GTCL6SIF^UYk?vo=WI>-yMnH1uFFTxcyUV2Uz+ma=t z8;|(X?j?^+o6dv0-HQyM6_kDDDwG2CAyA=Z!Kxe7Uom06!eE1*0mxe#Ea_O0--j&p zKBlwq?}$_Qd2eT@@jo zl^Gl=PtI~fzs?a}7U{W3MT>j@`7ygIjl*CW+@fAgbmH-oEWJ@3s18@`e`KIdFE2e8 zjN?Y7v1uZwLH4LXrrCY%V*B(f!D87{W$`T_Ens^d9ms;RC@*hSZr|jCWpMakVQ86S z0!g|ik5}pg!2sM-KRK6H7p4CYj4_W(%^0BOV*|~Iu9-eQ!7Idx`>Dx=hI&g~j@H{x z^rA4Ob|J3xA*{n?w9!dkZA-@2eyV2RRv$_fE8(Vq;224XNmSaGsMyqoCH#s zr9Mo)QZ8lE2HFzb4>oAfI%kEjn5|7I4B%~VUJ3)M;r<9ti(K)0ueB1dYP$06TOY@Pvk&2`mvJ&klwNhyP~K1UJI+r*SrhOks;4v?E9|7h@tFkyq~g=7(=>8 z7A{=ZMG=hXP_t=A3wgf<_K|v_yIkx~EN@FGzvY~*fyB!_i|BI=pjaq7;1AVp^9gWz zLlel3(ws~5SY@o<)F5m+ElyI`%&`kcxEs%c_&&?s|Uc z$Dk86z_W8jWQa)T_qE|7Irh4|x+`))_z7L4aAWcnn!Lh`hjh^@0ei31WJkaMyau)( zCA5?nqUuhHoM#JL=OvQ2M7ufhyrhx^lKwQb|GJMkKc+- z#zpb&d!rDlSp8{f6v$CN{(N6`pj9*uxjz`(Rod4m=INCXF?&7ffnZf^k)hK=WGKM& zV~DI5vkQEv+5f>{+F3@rk}{_8#Q=0eB!)f+5sR-RWm@GQ!4~k@NL~Q9ZwLUfw(9Ke z4+oRT+_GTP9|?x>ogc85#=fOIKWX;25S$}lUwbr|sxPma%fCP72Vg;{X(Hx)C2k@+ zao=6r<9-mAMwVk~lr9UA_vKl-{1bj{S)EWj#{~!rsJ5ou~t3rAK6;U1kIi8L#!#EyR{gw_2y?v{TC!vu*{9fw{H zMp=M0UI_*`>iq4m21Cr+dhlz(a#>q{2#|7ZrEOmKtJT$8m5k54nBPP%sRj)gf$jB1 z6?*PIzN!XFI$GP;-mJo?N@4D;D!8`Q|D%1diiY{xrlH>1cFBvt^W;Yu(ozS-~)+<{Cx!b_h+c2Q`P14QfjR<9}Qe7e_uq@`Q%o-?B#Y%G4ZI3&q#JNpjfczf z!ycxhSdmAM#2ZCR)Vb`aNob|zVshZR=EViP(t)id*uBt`%we5T9<4m;r=U`6s*TIX zbc-JfnO!mlDp}zYT_2Y~d^wc~%ol2ioh0&W>a8op^uH-Sh02%%b^bJ3dJtS zB`ep?#U2S7+UFs+4rtrRI6$et+Z-PtD>Flj;n>!4*We_@#WW9OeC*h&N z)nZ1%?T(eHvV63xJ}Nf5p#5`nM3!5stX;UqsQq#jx82q>+e)$7AXXE&FjK-X<_U`d zt!)kZ^Vf+ULt^665kVM%f%E60vILC&us6%7Orh==6SKP^fY)8bvIJN#mtrB?Vn?_a}# zYiz({McQ^fAD0`vi1((6u^l~G4U3OZY4P9yJ+ZzHZEqPTW73j*@&;8jxY04aKA{>o zt)jQyhE-TOErc6%ST!gf7{+q@J=I_$!D#$ORSe_pgVdBPP7%>5)u5ueUE$|d2vHg^ zBs{4aEG1s!d(98Spj8aciK32&Eb$ob^Y#A?rokzt#3Wvsjn` zM2-QtPscp4EDP*Nb+FiY_223^+5C3zP}Mqbd{K=pou8-*H(OkBE_zBsReTB`f2Z>4 z(t9+qXwhks>NJ z%}rHlMXy9B`hh$(=lntQ=EmpF3?Qizk!)QUV+~pVIpgNzf6w#_{@#&WH!$vNF zr5)Tv6(UrP2Q3W)p?-z=i`Wu8h z)~w7Lsz&LKCXtqzU?MRCh`=oZ&LhSxBAkM_xC2S}j|jP$iknUh=THfGPy{3^)A9j8 z!sBL-4{7H~CeR->2kZvGd@*x1r)Eo;*f9XJ|^-IGhxG0Rgsuh`|D0zAIsiL^gp{d>r>l!g7QX^P1;ZQP{AJ=j3#-!Yf~^}gmw_=u*4uKIxgr3C5rmpIA3YZ=MAL<{m|ISBu-Tfj**iU0C>q~?2g~f% zdHe1_X8t;UoKqwc?FxiAibDY#7mf0eQ7JW~vKf3dTcAE-j$p>2Rv6!_rXsKngZTuW zL&K$4eSB|kXAb6PPOoAtNV8Y8WAry|-MV_)uJPKOZWMvTFu4T%d5MNQH z+Gp`KT`4wsR&1A%S~9v<$IumPDm*8b5ni@e->jvoqMWTo*A?kIYhkdWJ+@EZ_n8&k z41`Y2jQ3GB>8gl-P?NGN=DW_W#dk#Aj0jydXpo#08^A`vhg4sD9E~L%$f2I~ymHxZU z)%V*n>q`GqYhkeJ>~}G=d9f@%h?|wnh|k_v-+70!iu%2^X}co7-n^PT@D#t}N6Eqk z@Y|X>+A5g9;MnGV`caW8W;WbigQm)Zy7}>qx-wvK4FpL2_R2^FUy89iMK%B*)(pRq}1JAihyo@?~ovK=O$ZCOuo5vKU}d+X3-i=Zxc7 zFjjg0T${S;xoDGQP1aQlNWZB~-D-pA>)HtTZWAm6jTE{|l((nYDWD2Wr+= zg|8)5s{^hgctXuIC=OzF@apbj4l)tO*@mvohAg zzpq7k-^}2_$w8Q2lC8mSsSVp-)}lQtxk%nCa?VH%wtGb>mjv~>SOlfvOo4YYVD+7L z&&O7!|LEx0$NKjzXqd3z-3Fh@{#ZxHE`pXe-FT3OFdFVn^6x`ycLMo; z$ze6B+fIPxvcqd+QAJ_+h+6gS0x|x`*c{k>sU89Exl_TcSWC&aP`je?Gb*Pb=p`#?vVlhe|ecA|!dUVFWc0pcS% z1Z>i&lsHMls(G{17dl|uMN{pClQnGEY6iZlixF4(l-PRC5!dp+)lld3P}a2JP9yK@ zXu0DiJJ;h*)$q=(=o;45{Z2z)#7^4#y*A!uX7$rF%(&g;oj9mJSH;&t%d?c!`PxQprRQ~&f=oK6Hov`-Qlm)`j3uQkWqW?hA!Z_OXAsfDWCU8 z4doygRBy20QVo4a#Fg65F4Is8GOL_dG+*e@IIO$1Z@s)mCuF~L$Q2su4&zd5%#|8i z5iyr6Yh0zl;;?P!IXbu}b(Di#DA{%G+&{&0z@gfCwT5b-dD&gAa*c+*BkrotyFo`S z#H_O;`r_Ky=AG&L|EP;WW$w zWp0yOG|c(6aj^_Wm#g2ZrEKu(4R7+s2E5WxzLLcuf9%K0RSddakD+sM*~pb}ZEA;6 z!fU@pqhNq7O%rd^a3E8%)a64SH|S`IJDMy-{_s$u%Wu~(hf|Ew*Pdb?8%Fqs9h&+# z9YsEWYgi_`QPOw0Lqm@XgG=jO9W8vzwv_0bJ2mX^X-$WJwDH{?^od2W@@9+Ov1Ybn&75f_pWL*on|#^j8MOyFT>VQVmTs zEO=I2zNi+)Ro4HEi%Ff3Y-;+~KP@up#Q!_5C2DvewmB;c z=$iP-=7Lt`!Ps_X@qHw|Vy_%pwER7`Ni-n#rut)a^vgI)!&6&vD=juoy{)4pdjh4h zpo@204J1y(^bC z7Ss5LYqmcbn*ve(|ER~XC|^uBH!0VZ>MDlv_`nX?s;i52G|YQE2uv z8m3SKY?WzzUNueE{7X-<9}k7n&d+Lq&1b;HAn1M_4IKH$&{*DLr0!o*C2{6+8U_Q@ zsrY;WYuU)NQdog2>O7v)sUFMlJZ9!5H}-J2RpSQk^Bw!Hr* zwhmhPwcd(nNHp$8=_rZZx2AF>+TtAzOKv54RY%8N0|f(j(MZJu-qkQUA|K1_LnA;Z zyr-d{T60!V`=QzN6ow#rIB`gU&D$CZ=zr8z(tFH50H*s(N#C^ zTA9kL9yIL(Q`>zuK6vA=TlZhkt!fUh1oKmx{1Sv5&F}J|mX?~M%CXQTF?B>aZ~Z8) zA=IclpcE%HQH;1>#B`cEKQ>i$lG360sHG_Pb5ERKHB}wj`+VXsipb=vPC!uhI zWXIPQn|Ul|zz(t-<$LTv(e%E8-yMwwQdxPAeSWm(H>OZ#fJ5{bOC-`(NzjJKbJSzL zb!d8pCqk&g>gqX_tf|+(AaSI2!M@G{Kc)ssd~e5;UK;sd71)$s9IZ)~=^YIqW>z^$ zepiJNEo4frHr}oW74`3z-)qvMj-Ou*i@38FRR2R2QpDcGUZsJ>`-CEPboP%`h#8h> zA4yN+Qn)Lv9i3MK%~$4dTY?A2am8+lwpykJEnXn6)rp~mY1C4#+tGds)u~q|7(N*xa5uetmC>DR$(Dc&VQhcDRD6&4crluL>j%qL7ilHJ3_r7bz z%TS^8Z%auhQ-#X@Yiq@Yv12`L&WmwWJangt_Ql%?W_xGIR|F~5j(#cM{yv}xn8;^e;4jVB%I ziZ*$rL0_Jic4+xcW9Z8jQgH_m?XX!4#jJU|T1lB5+B}9f2879iI;}wsV`6B|;XCuu z&y@2WMwSO+Sj4}lHUg1a)3&I|xMMAiUWr2?O5d1Yx{UT4`C@KD1NOuWmm2Vlj<}L5 zA#Y}qbB-h8DWK&27)L{tyOAw5oI-cj$FELvvVWtaP*;y7N`o&e>dKX{>4)ZRrD4X_ z%1EuH@w8@E42+07w~l2>9^Jkso|4@C@O?Zbm9=!iHnAL(m-NuKv6SRx;WOhYjU<=! zi<|xF@_35E8p_71by`lARM{wsM>+P3r=*I;UGcO=!~y->*jWCh_`V%_GM>^wq7Zh} z$FwBx{il!O>6JtqUZMlH(=cZ)2Q|~XI&jfuZLz&MVDK)cMKxb^xuxbFk47qu-9aM~ zXd`5tW%qnaY#p?c>m}kD5)I|?no6#+{Zc$7SxTog=((pX$x?bvJSAC5e>pCuB~?n7 z#M3iN>1#S_vg1$>_Ov%@IH)va;{7RxhD^D}CVd++*)ENtVP1z%U&l}~6YSh(SM9@# zWRCfLWL^4Yi>b*|2YtOOp*NUszzyi~osz%H-{t!bed3h|BscGu*ndU0nYV$_2~MGCwyt)D z)YS`H)^hVVfkKD#drfc{v$Snj&kvDX-hLDUFdg1)qM18#nl`bOuWsU0y~2`kzS-fc zPl5)<`3<3^sq$%yU@a>NzZLhRS4$p z=<;FSBUvZOLdUl$LQawu?SE7^lu7c|^irFdIqmSt55eAidN~5tJEIeS{U;^lV{sR`6k0VvMM8OSd)y#pZD5Zgj+ztA=FEV`zC0!|lL5KJqB z0IMzXyDVENUS>oic6cNpM^8k^MN`(WnAa2v!-JRsiih8~ZZZ}&iRmCOjVuip(}$2b zruP9XIO^4fxjY$5OeEqNfqT)y$yHsyUs#&YXBQeK@xBK~6MNv#T5z?#F+ac=kIvjf z942_%XH}=3hlXQ4Oua>?{y|DNjPUwBKgcJZk1NrRhiWN^5tmSro!4G>5h!3>(x7kCEter|E$sd3C#V!12qVs>_Tz}{xXgMMtR(Kt8 zT=fN&V~N2OmZ_WUMZ<-B3%s>)Wv4MX&}u!7nH@7vt(Riua(__xTur6eP5hOb2%lYE zieKnbr(vAfNXShu^GaeCuF?2>8D^GEhy6!8y%^%G-$grwj)InKACO8~&We*OqJ4PG zsTVj&Jxs34BZUP`%@fDbGu2TO zCeo_^4s_VbHKCOzYoJ%U2kEi*;C{-S02m8BV44=Mj9XF88Vf7lJVcl9enMaDh4vsIvIr5?CSKBg_<*SmYAN^HB3ORop;D z{YRU>7NVtEVyMeT+1b#M5vB#O{4>#RVa%WCYSwZMpzW&EI0%>dMz3-k=A+J z>m)BcHcp_Of(5OV4i=23lY<2qd2S4IMwCeicJfL2=N z{U|4!nrWwKz&OfA0#M^FhyskC&`gg<1IE#hK0rn+E6LTf9X{YeKq7ZtxA{j z#WHrSs<{V^0PpS*ler~w*mAZ{RLGYyi)CN`fM1A@C{p&R!-sk|xmd4CVETrShIJnX zn4ZNSU}uF%FoBysjgErY8lKd+i{csP2-tAqs5;}vHPLDx1;ZTmbGH!4FixHiLxxGT z+(hKiIo%l!AaC<2(QVF9p;MxN%P@1plA5M0_c3_wDR}T!DTlpw9lRa&apNXTqF=L) zDoIsssZEOsPw9HmZ5InHBY_XOb54jw5EZ{IKXJt`TF>EkQ*#UDYt(I=g!uz>BTk4o zQuIrbTHbrxgqVU>kWsU!UzX@MX4^l*Ls|(XsaLBNY@sx*P#kqvD7kmT8)socj`kFW~SV^8X^3 z4WGHPMyj0PX;yX8w3?R5>lZ2GB-Ob&z@vW~^nLTQmX=h?oF4`KOFufTIugcF(t?u& zbs9yJZ{V0;Ulq(qb$jZOUk13zYfhL5`u;XurU!$xcqWL+qxxfF?SE;t|GKJ7a76H_ zL9Ux68mSu!RxybatFxf!Pkb>mW)Im@+b{DcdMTDU`34eg@s-0zM~-P0!muP7mH=fRn zton43IyxxG{IEhPF@fHSg>R*;ztxC`#Xp{mSa>`e7YpA^ zZ^gnl(boTq<9{O=I(SF-c9{+y=zATofm^)AjXd4hph~;b#&+GP z>Kyi7@QumVaKk$)zmVCg#n614fCrne=qT7%g7a%>=#yD<>@pgrkPE13$^NW7A1qR| zsH0f0qKH(Yn{-sP|qVvRFq&q%@*Z&NuTL2G~fq3%93l$hRsly0Zqm`Tt#b^#6e}$sI|5#cc{&tM|E*_R zI2W$c(GHA*i-vwyYdl;ub988&aS;uHe72QibA^t6U~D`@v_h@%@es|`A@avaHNPCE zt92M6;^d%OVa3tK%0ZRXp>o7aKG7uNqoZlZhwH2?@;1c}Ius7$u7{r3hZ!r?m=Hdu zt8|!zD`vyvD)3+HsJjy*kfjR-kXgr^Xk5NGS?+4k)w%p`a(9)X>kCc%!Y#Pb{z z;MNv){TLlZ+jZNr#qdl#20QYq6j(%wRW;&ZyJ8br3`goPIP%Zy!9R8MZ4d0k@Dhz( zO(QA}M-YSNCeDtcj$)7p7Q_AV80=KE;~-txbajn5*sj<_mMeK321hD*J-Ay(-}WFV zJ7iQgT0vvgOBkqAQaFCo9 zkHirN2gy4+BxWqsJY&0cYVlqvFOH|IyjIE&=qL+s?V-)e>&Ehy4cf|k>nIC@R>yOW zj*2^PE#0@`>9VhuZsU3y@ibkPZDCnQ#pkNjy(gZoa#iZCw!W^bW@9m3N5k!@sd`R4 zRd&==eN#tOBqvtb`cT8G1F z-YUG;>1etWOEWSN%3hs3P%ROe@W5tbB!c$`fnEW zlXVmW-8UItiO1mZ-ehR}g{JfSW(E&V4$3LZLLDXB@ec8Nqm$t8@d!G_^OR14jW&+u zw#=ycI!eKAOM>g-5jfqJ1V8E!a8Z#*Nq7X@wuweey-wTezl*0XUAEO<)lp}Mr(_lz zX<0h9+O!6b9s1>X`qE{G{{1@omd`R{R@$sqpQZjj@$?-&OZ_W#^wj_oZ%6Pd`unWn z-xC%5F-a`qlG=z;qC<7i@T)shDq$q-*iWFNh;Jo5`07E+ZlU3m_^`r{42zFQojNK9 zNX-BN&WJ-h+QTLhlbv4@0^mx&nZsmaoG+-0=MFEwJu`3melj5WU*S1k;) zjDsqfqLIcHOB8lcbYItpS?<0yPIVatvEJ4WQm5BqPq zp~v3;L5BrtNtCT6e{yKu7o^3zgrLc%O~n7bJ5^}qtpYrhV5w_cuz#W%L0Z8U99m~W z%aLbDEzi!$5$xd4;^b<=-queiU4hvwKN8=>RNU*9A1o$E^dmBP+t?AAohzdQNbB3U zDZY)~$_PFHFVVL#wk~!&W}5d*YiG%Y@r{TZi*agO+r~O$V@G6bKjN_=bmuf!snTa~a`|bWjJuvzdO}%T`X}8KEMsW-Q_0rmJzrS=T$Y6&-Et zvfJxgTaX&eFHpNK`Dfham0f_IIhUt7@ko-*$#i;R|D@*Df#wD6eE+}##0b$Fpc}NA z@TTu{JkndBFIWY=#7F^$PjHFKkh92z9iyimci1>^t8Gwnrv~|wtrBil;b+5s1x?@P zQ}bLXckw(x@OAGGL#s-znr0livsOaJjSt*7$MR8Ln)eVmM_EJQ!N8jD?8|cL;k& zTjd0YB&Omo+?muk&gE@aXJ@B8zqGGgU`IoWe*-ahdI`Rp!Mw(}VSq26ReLMxjtGdU zfrCt+N5F@{z^M-K^5k z;)@=i)tymHBkub_Xu4`9kSas%`C_qBD0k)XyuH)oi~M}JXbtm8SuW)=VUhmjhk4VC zub*o(-P~Zj&&{HN`CrLsTYu^iGXW^K;8`)5g!0-{Y5N zjoe^)NJu{llgcu;X{*m|ks32ZxfClzSaqPj5SY3e(ZZeN$4O7IZc$94&X?$JKSa7~ zLq79EILil(oXquKPOuZxla^ho!*J$!(gF9TeHu5A`1bT(0tF9mzgp>d%r8=suly2u z4YaJZV-r~N;ii@o~tGuLPAYU9d(hcV6F-If2=8iFS%~vwS#+&)IYBzGe zUL99^Bspx%E*S%rY)=x`nKH+Z;P4IAaMH*12iF{_KXQeHI(I^eDlWm}n+>I* zL_fDoo}tMhK9nQju7uETqFh|wK?c3)Bbsh3V((Yq+3N=c%@f5Qvq`orT}nFhJLQ(3 z@~X?M#3Q;XEEm#QfcT39U;4(^ku?~+Jck0~xJ}FEM2a+xZw*Y5)pv3F%P0rMjt~Z< z2%~%{vd~9_h&MHfh+ksMjBFM!q-IhWV_8S&n&>G2e0gpT%6VY!7^+*tbo%+OmhVBd zjkISpU>qG137AAzN6IJCi;(;L7At=Ncg>hmf3J5dxzuoPJHy2D|&6Wc_`y;@#Xxogv~`D7f6|)51VNQw!^N=hHo{ z&2&{22+X_`0_mX@Cfj9GReY-u6j1KkE5(II!YdJ>Gz+?33G2`y4$^urLg?a3>f}f% zg!kb~3v-XE~qoekwOOxezh#gE#2B0HIy+CeS01@>cp^qNwEx@eAs@u6HNDFZOKmK#0&EM!VXc_!99YagJJd~G%Gs7I&1mqMEx#aXfMJ_=R0l6;)ITZo9L_`Hd z@IXXBKtzQ9_w`xb(>2pI>*v1N;Ol@zIke^nde%R^f~T?3_XhOgz-|4zuLWK)$pzZvu^@)CF6mS^&^HrCh)@gv&I`3#%t5Tu*J!eex^_6Z{yKu*+7 z-EVTNf1LRxDtjt0X(4{O-w4sb6nrHWT-QEtu&+=V$LQ8hSk8JfN6_?wL>BTbq;_BA z*=%d&2t%^V08?P#WCh;Zm+u=d!y6$^=d^+~y2}qw)Rvd|@XB(jMlbszORZ5J8$~z{^)5 zeIXy&o&wXULO3h%f1mu*KNeDg-b#7xG+p8ktBsVWHTt{1M5bDz8wsT(;dMejs6%6iqQtkg^zf3Jn5eXNdgTY&2q7+6uPH0 z{|K?6CZN#`Y63C(my$paWd>D}kfpUs{0!Zw#81<|z;|oSc6qz7TrC{IOOwTca=sVW zo%8Av=93o>sU#{zrz-K2^nemSL7S{lu_sQ8mG~N+8i6lV5WfK3t;pNu@gQeuS2)XQ zzm}PuWJ;`5&8F>p;acaNHd035tU9GR)eZ zQ`9CYHiLGmdJj@dl|&tvdA9C?|BX6U^&dr5JO+lhoViN5V6|GRtg6P5K37qi6Yt3W zK}FUn-0#Rns5#RSQvs!JLZvAxaryHZ7uB=R16$13gyV5!B|@D6vD;ZR1a`Nu&Kao}s2s zUR4MY$Vr^L9~xFlf%m0w3|!#65LS1%nmXsxag;gFtm*+ZRg#)X$Os98<63x_QZ7g| z1>S56mYKf)Nt~Qx?bFCCj&nedo=(}9&#}oG`a9J1hkf>T6k!mjB0Zv<3b$6^-i1>m zoZg`xuU2rhc{Rdoo$9n}1y`e8BP`D;r&a#J+xaRdaPB^?9;2kB+tEo-vpnXNQzy~p ze0#{h77R0e|FbxqZ%-bl^W7a_L{F#KiaXz$(6_l(QI%Ie+seEE&W#U^s#(S<;?9n( z%z0#0lThUh-rRele69(B2VQZYYugwg%ysn8E78eW`pj7CqzRfcv?e+^O_xO{r|9|U zN11?mR zlow!DM-`B_Dsf^9>eBwjbVDl~yO;)Xw3IP?KnlHsS0hoE z_0Of<50~4=x4l?OS1eylMkMCkrGxaH7EGZ{d7=fa#*4w`O@=WoounH=FM{2L6+1Hc4vb@07ZrhVOY6A_`){|QZ+kkuT+&iKX}V8>r07)%lBAE;T?>8M z5;V_4gqJqqh2j#Q<+w@5x-aMKrf|B!3ldbvv^YHr#OY1g$w%HAq30Ov&~Obbm6u|F z0PQ1&umyCO7h-O)qvO1QQn?Oqo&g=V*ItHDCtCZ?AUIpVIgz(uU>Vys#SEh7Wn{}m z$xr_HlteS{RH*s6hk)BulK9R7{v(zi@prlyQm%v7xG^nyiTqNG-ACe^-H|ZoY;Ajc z%jRnXy5I$~*xcVhdje`UjtjZeG!*k=Ath9DW99N#(ZIg((Z&%+h_#%C?TNRw;yRAw z8LqJ3jKWMaGdA5Ken)4DnQNjjO%LNsqA(Mz^XVu|(-rY${YJ z?Cf3R{Rk8=y56sTO=C@?n;i?yOM}GX|1yX>kEWAdiP3B_qZ^w2&j@|wNLc8rOT(_? zqGh1D)v>VWqGmcH9^&kXFntE;RFIn!V|i#xM_cqLM}f+#8yj{j=Jr4Mp7Ig1wJy|$ z^m#d|QCABzMhDB$9{REz%+d{VFhhTogK660D5Ow0oFDz#?EfS_8S!9y0Zx`phq;#l7DZ477i_0EXeM3Y|u^& z!c0%`g-rv2I# z*VGo&X<10{;yO(=1*2W1Z#9LksVy$AT~R8~eIZaU?!BN_LV*1nrrhZZK_fv~S{4`sVGN%V zUQeYjHPP%B%MC$|ZfJr>CvAss+n4(yO$o)zQEiHe6^P1o9*F8 zIqS$-x_jaM$Sgh@50~8^jqrE8aBOylV`Nds59^KW zdZKHofbmjxUB}h{Iv^D1ca8H8JgnTPqZ5s-KG^3JWL9{>!uXnZfE&4JGNOr=@m%HGQbV?Pt&~hgJvjtJi@^qZK zPLU@?s2L2CX5Gpwdzq*fOYG-Y8e7ua=bdmtKWY&LALxM|KhF2Seu*l*)Ph>$Q*E$? zde*6Oi|yStgDoi7F*vEy7h5pQQ9e&k@l+e#-hwIYV|vr1Ss652mP1A^kCS60^@*=C zSaF&>kzU0Ur_)Scn`ran=C#JrV*W>@m^J$J>2eG0r10?U&=xdnPXRmg*XXM)c$mGi zNWU;ic53ZvoA=v{n zFs|3F3$5>H!Gr;WZ=7zDHND_pjsmVNzBER8$vPN-QjRNlYp$}+t=RLM zUN$J^0@`2HCE>?&UC3(HDuZ2lMGvEa>dbCP&J=HIfO;-3@BXipSp|_*>fefHpIM5% zA~@GtyfDl;((5DY@T#P)U>b23J6p5)x1(7jXu{WQcaxVJV|19h0&#?M)w+ml^sc%% z4*r7O=G&$v=iAFa$yln#>k^!pC-gGNWYNdRr`KWBCM09gSGpAJJQvU!$?XsydiYD`}8W#CDCyx-wdt3z{?TU z_PV1ki+RW~J;%|iWk`|FF6Qy!@_D3P=vl3(#>~zEy-*FW>AuOD)eN&LPTR7-36{-v zM}g?sq?5Wg!2=hXoiFl|pqlZyGCW`4N1$k^eTFq%_5VL=tM;d!izP!4VXR|LiSnq) z88Xo^VN#6SQueQ6U4z=@9!Lop6nZu<&NeQL;hqM;yGhe%^GiCDjM0IeNyd8U;tnOV z^!E-WGnDymN9l~E>9`IhQ}m0@BojTf^`()mMdw;?6zja}y$^FwI0a>{F@;l5YP3dO ziPfog6x^z;U=XfjI2*<`VB^aor$QK5?jK#Mgc`EOo`?OV(K4OKg0g9_&`-iXRGXex zm9$Skr_X$^^}>!ds?+t+SZt6ekMh&SRavyrcB?RT_FOw+^YL zA9NZoPNwcWxnJry+Ro$L_==8_y2O|)S7$np_N>mLwQIf3Aa4Gan-<|m4tJA`tDF6H&LV5 zRUM``o{7^@9Sf&>=>Cp{6B*j}>Q2puk6^xIVf6NX)TywR$3#Vw&k2*}VhFA6V zj)n26Ug%snP4R0wH5;eU9@DvSj2`G%7~k@C*LG@lB1NNW!Zy#W-H%a+eR`7ULhoVH9_3 zn3S{BXf0S;%Z|=67i*yRT^|ycz5HaJAIRg&rnnYBN@#3ql~FCxUE#x3yL^j8$H;j? z3v@lRLOPwITE3t-Yx*&ZV|kHbg0$rgQp-#ga1op0*WJ&&2yv#95hA^`b)@N}6YDb( zV@<>(#Jcy5Et8svJFzyH7$L1%Izp_EwvJUxJF#wjQ?ytk#5u~UyuOY2*7>D6F@8Hj zjFxA-xnCzj#P7)?78E)0fA;3~DYnESM13AB3s1A9!-@5=2(k7LEH&y8BJI9K8fl>d z6;7OE%xhDk3Y8@|OFBZNcgrJ%qi@aVADBwAD*kNg)+iB2i1a{K6rQ~WoQh^u5~oLr z4U58ji*1BB|K1`_TZ|#QfP2uyd_$Uk?O;3e%vZbuR2`HymrNi zFEx*lxtF($)2j@hixy{u82A23t5iDqT4h$7G~!-Zy&frNAC|{yD{cjwOun zLccAK*3shR?voK>HrE~^M4SAnG_|G*C(a`C+N73u3PgzVK6#X^!HMx*(0C!Z8*Vyl z;YiLKGE0TJeMtBocZPHwoyCS=m(h8qDx_R*_SIVY5X>Qrcf;AW3)f201wh>ZZ@8~z zasR~wQY=Pq$*_12?R=L+XFN*-QY=lMmtq7GV+C~RV!Bo7@OQJ z*o6xvmo$nin@GJPX|hr5&F5FH3Tm1XNwx9n$`ygAF7p$LO@t?XgvLmd9Ur{MZ)_7` zPmzEL>6I%3HcW^FB)5t1Es?-E7EI=YA^~~PM0i&u2qkrwdj;cB%!Y6d`F>&;s)(Vo z*}*tm3}))uGMy`i<&8PjMqy1Uom^ZlPc$lYR~VXz+vuwzn!`?cgKuKfVzm8zf=xw3 zALT>+X%Vvbr0u=VdxHX*i8s)8bb2;(OD{VzDMyV zy$dOK7j^{~w8B@y+Ul90**}wEaat+GG&(+r3Gd~~Aci>SmGbmNFx;yNVzF$THu!nK z7E5l~C=cc-8G>S@U#-)jK}6IW%hKt<-MYzk0iRCAdb%qUh3T$7cwXc74(vj(ocAAS z$sU?B7!=s_{_vN=gLGb_4ShK@D3!A1ENTANTMMRdgiB#a5BFv1ts2ijswv$N^-T^q&`3jH6$@NywP zXjHLP6g$pv#~pp-!4QK%;$3s)5_?e4A_-*xcZum}!f}hi(GtoaE+R4NXiC`Kk*<@l zFuOHX;G2_PkPsI070T=yv&}={)-J1#;U>Ey%>I{N#75LQ?H_?kCrU`BTSj$;ZUF9n zr^1dntLU0n-yX915OcnVUISNB6I#=0Vh!m0PT60ENXhw@932fQXXgkmwG%#^Od>&7 zv_NC@lpIArWy6Q1n&W9ow?LDWZ-K_?tQKgD?(m~RF@DjHpaaLZnbDSy_zbo8OlAC` zJmG0=y2R9J&W~Y`uo7Q_Syp5E(-quMRH`rL6OQSP zHmt!(>v9O85MH1Cj>6z%yY~xtff(aZhgNx(Zjo~u@jU|M>yNZV^p{Z z*YWXr!_!-vK;b>bvG)8@69Ku5*42I)AAK^A3tlYwvUBi~`-bQsIUTPb{_?0Va2xuW z0?ltaKJt1wS1yX|UxM9K=&cP;;w$z4PFw#bM9S(OS~tL%Jw@R&VR>2|F2y}luZPK9 zOfLjd7luiJ!z4)ogw&rQHHn(78>6^-fp75@hZy?5l|9kS z%~gvy52ZOAp*JJc{U!rhcX*}gTYO8P2iTn3P5kWdnv!MiR30#|_@ptwZtUe+*Zcx* za|!6>FuFh>2JjlTjiAlusIAkyLKVC!D41=HJ%h&f*6Gu~7wied1C#4~ZkQ!TBcL{Y zLR^e<7z_D79Pf#~2dVHwO3fRFaff3O=dJ~>8Gbn|F0PH6mr#Ycl235fn->uWVX*`Ng5NgF(a?Dl4V^ZJyL8ym+lX`iW8jJ4hTkMR8_X}%Ia zK_@El<8-eQU!x74Rk1%t^HunmVLVZZpQU@1_!-*Z4+{2UJTPC0pQ00$_({4~iJzbi zo>Q?uPV<%c8l9-bkI}sI40GK=+Ou=9FZWh z^^5IOlPgqn4IKC-Bs6cGcr&Xw$pel~&tR!6ZHiaz?c_Ng#O z*Q0K6JT!s`4q2RsqXvpKD+L!u5W!iBqR8_RM9e~Oo{()tv+GOk6XO<3`^^_4$e>Uz zHP#lfEMvuUbp#owSQl8ZE)=zW{~jS-EAX1K^}cbviVc&;N0Pt>(XkR= z8Ewkk8$kvqZF$-7ftMqg#b-(RvS3LBDRa_$h|e@UB?3EVC*Zy)T>Fc(UgQV=(LM#0 zvRVESN5TFcmqn1$vGW$kJ5E^foXHX)P7k4DkWq6-!XUhQjV_$f*k$cdfI9k%iW(H6 zhEWUO_1gPN`*hUpib`B<6FjSpbO$viya$S4xrm~r0Z8P+P@8j-zx8NC^i zx(G+@4vrT_>y&-Hz2R&MOROs7>*I7p1PLpt^C3q!gKn=@Oy*NvBfMoM;6U<{pCa@O zw|T=Sj5W!6(Xi*8=Kymn5Fv(q0Vjdiy^ZE{B#14heE1>;aYYY~2=tQ(B7&L!jX*CN zb<|fV?{BuZrqq~RY}2PB(5sj+zZ$%z*)VfL7t^&e-w=8eQkdj{VO>0DjU!@lcwD#X zr-cLVu!b-yoJFQl>R(alBi0$>RBO)`W^fbP1YO@=Ldf-hMq$_aa8~MitF7V7aiBnc zpHoAf-7&^I zY;_ELr&4P3VO2}{YF8VMX$X2b4@Eb_y#HadcRVv@TWe}Hd*0lfLFb!Ia(bx*)%~Eh zu>u>waiaL~?TJN;d0TrXsu?Y2dd<<>?b&cP=r7eN`QNstni)24TF07t73_$w0*g3B z180+)g6-akNv_f#RMZ#SzG++Qf_H@lQNaNwy#2z>PTlbIF|Swe8bN=jP(369vu3Sn z-PL(qmWC*CSys{K-jlU@zBHiGSpuhn8hbh(A58>hV`#kGsG$|7d!mU5ZO8{`2e**S zj+}K15m^y!W@G_;XU8F?2z=y#o1D9&iEs|U@AdufixdIaS}dNV-e`2#W73a}OgCSk zDRXx;8CYa`7_ImIs0rZW(F=B)ddsW~(As`Jnqnl?wBy#ubhhK)(b$+Tan2^(YrRP6 zgu8&f`26{30_HiE@Y=JaP~`58CWnaNoQR=$jy707s%h2;d{veGrxr((s`2(*OvIc5 zy6-q^?t13RaH+!iio&;fS1Vqh4hO~}PI~-zE7n}BN%Q2)yy={Qiw5$P`M(x%k6>b! zxBsFhDVsd|7*n%9Yz`B6@M7c#tqRu*wgTun2zh}*N`CJH&|M$S!NnZrY_NeSF;*;( z=tcIuqHX{?k0#=LfsnbPO#36mY0hSQu|S#3oU?t(M@w{_sT8*o!9!#ut7me_OgbMQ zF|zcugJ4InAKCB&Y>0W2Q9j<2iR)Q?G?&&gDT)K}?3gIgpf3QO(7G>R)Sz=6WyzRk zotg`7SXMcYJO9di7~DOoAW76@2CmjzN<}? zVo1`_5C}^MyPU8O31=^U^%B9q(cNKE>>_5q4^zr7VM=YZsgiN<-&Yfe)2R?>`@-E7 zoLNU6MGr|N+P)@^hMo4!uJ>w5hgf*6BA{<>}^;mPsP3+cHDOY%!=!PhgJpX6zobM}FOo#M$qDc8#>3u#FAw_OH za}5JK`>nW6f}~r{S8JI=eBb#EQoTG3ozjHnDUJ&t-cX?@DEVQT)gjvBR8ygAbd3rf z_bn^XaotgDtLV1l0H(4EJwsQj(9`sH6?%&H*jmB%Bu%K$6Lh%>Jx+gBp=-43HVU@K zXiR~Q1E(%kp=ap@6?%qt-Zr}JxMnw}LQl~}D)c1%L4}^6SszibJx;?abdAmj-K~Yf zn+v;2z~(?cmbEu$o(MpHR*47uS+=?4ccZh;Dl_O9!jaGxSXrdYYb6p{HoO z9TjX((g7-T-1nbd9#&Nx^p9r=&o~{_V3>=vjJHg`S};KNj8gM4ARv=qdV& z3Oz{=sn8R&=`01?cwqu{eQWbiJPE(<$=>ZjbiZ=d~g6&D#PlcYKFRRew^fMK@ zMjzNkp>WbXuv_*Py$OssPMSGEfsPY*?^2;>>HVLMZcHpgy(;uH9jii5(d{bqB)zLb zPta#~Rd`EQ6+*{BChEJ2#pwD*&||dEZjp`AdV1(66?&F#Q=w<*KPvPz?KxY) z_7u&i(35l%=n-27UZF5A2U=M!Vm-94s23(_!`&6EOV9!pdYn#Fp=)%H3Oz>a?-AYh zY!CIR(6e;B3Oz$V1--KuL7RL=AsuO2q(V>8$tv_D{al5fpbfheY>(3d6*~4us?c#C zkOCcZg6nrjw;gkWeJb<}9j`)9(@$0CDWaHy?MeEa3OzwbtI*^0V->na?|>fdQ(4M~ zLG7g}BsE4yD9|y5c(V#UOK+*rasN_0y6u=koB}<1&e$#WttxS(=xr5xl6n#fDM-+? z3O!CYs?arhQ-vO*R5H5lm_Dql(6e-{3Oz%wsnFA;r4(#WQALHGq^nfu33^$D9;eTw z6>Qh2s6vm?4;1K_417_Ao~7L~(QQv=XdHCuT#7fL!hQyxuK-=C5((CeROnbQ$|@uQ z>qRPbtQV=!v0kJ?$9hqZg6&u@QlMiB@lq8!){8)oRvnvndC{l#jBY$Gr^&0(({!;4 zJw?x{(3AA>y%cOu&|xa{IDJQjuF=yf^cd~9cXZn^d3dl2JxkwIp=anR6?&Ss`>cZP zDLO!fo}{m-&=d583O!C+@1tP5Mnfv}7@e&^#}weBD)cOE`MKz}YZ)3)p{MC9D)baR z1bVcJW)Ai#vLomg`zn~9q-84f1f8xzkJE!Hbd5IYRj@rqixlXX20U4Xo~56w&@;5* zoanaW7S#nRbew0TLQm2?D)a=c-=|>{noC=}QXi4Bex^PSbkxqT8LKUIliNj!|GI=*J4|IQ>U~tx?bXsKsE} z$Qt-*vy&qo4WWpW%{?)?Ejk<1es3$Vvy@#B*^+FArWDv|x=w+eqSqAINs29uZg+x8 z3hX#t0e0js+x((mR?x4}9{tg6kI|awY|Qa}Pl27KKPj-`AGTj)yEADTQDCR&0tI%G zo>pKdXop47?T*ty3T%zOuE37b6Vch2s@rODWV_Q@TCTv(&>0HsG(DuiPSGYyqT7x2 zT?KZ6PEugw{5l1;M(Zz)Zg-64L}z2J?N|ji&Z|&hXXqUTHrD5sMNVZZMbirGB;BCE zPSEQL>^Q{-qT8)eMS&foE2Fb9!}gK_J4>_ok8C&3uPLz8bg2S6MbCrnwredni1Fqn z+o2V{HRkq6-W4O+55r7%+xq?uy;SGBCPtP=Pj`|oP+%wMX$5wib{LFqiAD!0uw(S~ z=xof#J)ywP(pE!}?Z)idas_sp&QM@uysp4b(k3gS+nu2O6xeY(NrA1=y$Wosudj@3 zH)hr5D6q41tO7ejKT%*~KcNCUMSHG_p2{RmE3gxEg91BFuPd-MiXRZ&?if{~voV); zr2;!kFDbAyH2c8Fc57)GS74{;QU!LBo>yQe=o1G;w;TTO3T*7BP+-UCchT8BwB72+ zW@l+-baIByj!sU~!_mnp+VtSaHlx2Bot&UAMJLDU?&xHV-gihFn}waEp9R<1o7v)2 z7VOs>;{EM>F~E$|@0hFCb;%A*XC2a-SfOjzA(qAP6pI$iZijZBmS{12Gja?#T4K!L zV@PnIB5%eIpHd2B(?-Kl6JT9*hT9Hth0G|n_2Pt%Xi*#$If_19-eX<>W%+hQe+{p6 z8b!1e3?CLXlQ6l93t^^bmYEk_)uO3?NJag;X(OkkeQ#aC_{HThCFS2&QQlj}cH?m+ z{o9R1HJ%HLlIjy8tDcLaXzGTN@>e4(9|&_yjb8HCEFs!@+__ok!K?PkrfZ|)!L0;bc=tlsydp* zb4yV(Vy=!e;3AHvE?3kVJsY+vN40mkfwLH`L0}&aUaXdjIL`0ELe$n9y852E2u2E4N&C;!_ZRULJL!aX2!Q6vU z+2%>xXGUe42V(y+Dm%`{Ty0v5Xt#N!jo}DDwkNp_G_b> zJ*5p>TW75kX<2woU3du&;H|Ulwd%4g_O^=H5YEG64?7m@n^s6@^TadPw5;a5byLIh z*R1B%byLGC=FX@jsBd79PdBdjnz#9~{5dM}Ry#Hqd08mdSo%42={_CT(z9&W5ek-D zF|$}hNz6KV%agvV6KVM8a?G0_sba7d^FX<37MRr?$U24XvJPbJv&I}1Z+EVOQ{Ml1 z^^~*RnTm1+TmUDoEU=Cj)O6$;RXCb(hZiS}vwZ3(CEIywD_Fsuq^`or_{Y>m+34+$ zRxx_sV%(=NZO=@zctJ(nnZjCb9NsA4oNHXCXnxy2=|qV+59WPtA38=M9gZQE4*R3a zcdWsA1vhl8fwOY`W0g`6GUW1d#WJiovn^r*Yt5Ntx?kAU!i3ATa@JI z%ng2_8y&BZ3M|cym@UwNl9YeL23vhWhw@I|ztW*R$G!I#R8s6e6pQ6g?MR*_pHP*w z%j`}ks97wopmMw=MR{)#lcjG{m9~3&>wi(rYGGlPqa9QfN5hpb@VY$!ijmGJjYnC8moiCn@`-bx4x)v7WXrO3ZVHf|b@k)>)&M z-HT3Iha{TT@tzgVtnaR~CMU<YK&Rdn!*$lwePxSH%Qjh0#bd1Z0)^h6fzK1IQLGiJL8O{)qz zCFZB9g1+i<^HUY=?ak+_M$PQ(u2z-h47xx`$XVa^KH670lecqupVL&5>%{J4^{E|6 zbE=wJ9Z11QEIer07tFY({rGz@-PH8)@Gx2^@WNiFjI}>NoMV zIuN$IFQ5IoLeeeY3+J0SNnMmv`b!lto1K!igbyR`gKkik3G@CEJ{x&+9l*Y(%Xiap&{-X-Co=@5bL$GP`L*0qYoE2OTVb zRY&r^A|!g?qm~cP;;Z6>ZkaxU0!}@BM44tfR%%7YMF z{*;n-pU;4&*%!=O_x-L)ey}HjpbSr};~ZrjVr%QyCnDzix>VIZe}Qr~46&|*Rdo3r z5L_F5p{(-`1)YvFfasOrXb!_zf9$g8>34LP&IUonW*}=kt5c2sirg2OS3A-7I<%K( z;cE2(J-bE?qxVO0^}3ZytLT zgj9>cY~ML*T16)gL8}bZ6ZI=w*Fc<_}*&%n_bg+8cdH7*-JJ-ehbI0 zYYbusw`FW1kz?NI+I37@>w;!E%(yGbC#`dAEsC7aIp_V?tz)`c6$~>br*wQ?A*R6k zyz{04!TesHQ`X9h-hPG7GWb5%N6(88-x|NtCbyd_6tuJNi=&Qz=ajyqDDQdgh?=}m z)_K?s(Nk>t$LHft*_pDQdKr z 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

      0efR}=JN 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

      m0JM{)6#a3zDeOP)S(#qO52ifU8m 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�{K_569xZ%evYyE#33&9!g4j%~Z=f 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⪯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

      fk|YWt<{45DQ~0rbsZxC54xBrA zyt?E5sT{6-8qfDycW8^a_}whOZ_mNtp1GlMWF91Dnt@07LAc%bQbIBKD~PUBM!|~Vl-(dCtL2U_ozgP2f>#t-W>?1P zp*-{x5%tW_GK}iHo!zG;PVJHT1fLzQho&Wf+RY<^n$J^sws0b_K^?C#K9Tf{)ttNu z^JQ~f&gL^wEg!c;pFJp%R4tOa1}GSAw1i@0dPdf=oo5+^~8 zI!@B^Y3intBH|^9PjuCXn4?pqK=X0W{iqAd)CITHc>^RSA*axz(~Yn+$!F14!h~Ea ztV&!=?EMd{kct$&!-u1G@FA|jBu)lyEy1*-17S@!g4xc#-@0EvtV5^zb;U5-5Yx(B zJF%#1SLpK%v8;}FCsuRTjd*t=Tx^86CFM})gqAgHUihz#$y=&?MQ+y;kIR8gNJG%` zL}3bpq3m+ccd*-PH~y>iGbzPjZH$on9!fAlfT4|Tb+K{^fhihmUG$Jo(A1{O}zB|J;?_~!*($_ytft!`@AExnM%-DNR zdMb#0p*|Jrb>dVt8GcJUa@EORiBbr4;JcMasI#;~78-kxnB_+96Xy&4-$SJd|3_Vx zv>hKoJWtnT0@dKlx@sT~RPsZ4l)&R|G(zqFUWyv`QPcw#jPE4V@L~2!^V{e(q)^7| zu^y6CL%_l6?dBMF++oUZy7_HGZh|=;39xcHSiKYJyc~9BMTF9SG0?CP+1y?g5y;?5 zfQgRzmX?RshiHi;!l%uPKSkL!{0KsQ+vW07ECW=jMB>_9`NRSaP6D$M|z<5+iDXB+}^)fMT(oE-E99E{5@K+gciW8D|XPm(N|^)swOMZ_@kqlyVd5mJ(j4Bc<4 zz%sIv3Hzes4M;G#21)86!St8>WQ(*Q!^D<$>Pycv=_K-569hAjM4G9|pU8FK8rVyuMkBDyiXNa~sB?o|`-pOInBk3;$ zO;T)wOehDw%!mm3iQp9>b}8AgtSa=N`+(*4kRc;>v6ZCcvyRr~ct&~|xm0De`)A3p z&+kZ9L!TA1iD2w=Q`lW9HpX$xhk%ikfm7F<}6=xGxDh5Pw?IY@JT!V8q zY*|jdITT?KQ~9xkAeQwpt@Y&gRi+!$a&!e!y!7_VNqMnU9IfQ@!>5fV{Iz=C%cl{1 z6)W5k=`O$Xe;oZ~tRhCFdy(`vvDHwtw~{^VT}l17A;eJ|OtLvXpr4Z&u*^)0`lEYJqN ze@{F#%DVR(W3AwHu6#sHGsGxsHV#2D0%#1bY}V-sW&T4-|MJlMctiFY!~GY!s5q02 z;X#@Nu}DxEE8;Ye$kGDV_{S7Rn#(Svxf>XjKa&l`;a8%o|{D?WAMcg%gWqWP}*-_Kh=iFWUI8w)V z<%Mfdg~Dg|wl91Rnxyb~F)VzJ``?OyI#@-)H4YV^{ANBwvj9!O6j993Z@OT#lcrM+ zSsz2lGYfG|eI(G7m4g>=21=2U>_E?(>5*gp!;LbH`kU_nh;{RoB2r=zDOmXI<)mb2 zJfADxf`FT72mh$9s2g{=q0;zxu8c8;Uv~d_oPke1?2TT{8FOBW#`rrJ4ko>c7EF2* zEtvHtT0*}sE*)NJG~BVN9lId(ww$Bw2h@Of_q3zreArVeljkD zzkSF-HSP!u|6NVX-v=$o={f)KrH8zKD7e-y2dySk^q!+?{ zCem;=*dkze`veUV^qosK%qAOfaF@eUof^Tl@&-4yrZ|Q9)`g(eD*r-F%VJH-6E!W^ z+TfsDIN0NoXqgU72FvG47dF1Q_k8P2*lNf>_pq~_Ou-$PI~%;_8XpT9H4kzAVHf*m zpiTo2*&la*lG*KmCRjOrNCwGCc@0L)*J^Cm4ut%~M<(@xYQELjYSHJDuo!Sm&tKY5rDcu#HjUzN6BK{OvIUh&F>e>Y*>PE_!PAHC^-yBuXnxoiB$ zd6lxA&5(UbF+ciA_mN2Rz#$8&m?l|=>IKn>$c^q zL5sCrxZs5BXKGsDgxxzLdpKc=HiJu-pwzjbMZC-TVACIpaHI`Rne0LuwhazAXk#!3 zm+M*~XoCSB);Gl>KloJlM7NN^e{z!+w~)b4CY#_VU6V$gK=gP3&bM9&T5T|DXsXwU z&hN+(rwa3?o61N7Y=8|bumPCnZW|qw_@rt27*8fU8Y9y>7M`tE67Lnd@J7}~Lprj-=9wlW(IRs~! z8bcJxG*VK*PBivfY_e~WtS?doHCswu`rI%6$0sof)ti$%32k<3D!t196lk5ibvvtW zw>s`~DoN^i!Yp{ojGj2>wh=c38_c4T=?=HdmXg0$U@jilZ6~gn&fLtX zkwT=9Z|_*HvKJG}YD6$g&nLKH7<)i_wK8Nh?4y#T7`!g3Cv)YHRKo1rt+4Iv8)KZa z)JlH0_|;(8(~J|wIp>W{#tAe86GUw}5WZtx39>q}K6})8@VFarVoIrjy9%RYlNg4u zlbqZPypUWOih(;uj1cUpX@I?vlDtgCwcS=V+iD|X%=QzrOak5$jK0OOytF}jPR8Q9 zQulGgNtYYWo$m|!h4%UIwBluZrx=>CxQK-J-AZGN*>2L`oE$5S=dGCvQO;?r&tdk< z5gBAnbc95@B&CdvixyleY|_}jkHQug4Z;5EhjgJ}S>lDpEKfV>z9Exw%5LqJ=oHUmsCnq<%pC=FCzz&6Vhh~ zy@+BGRxj#e3R!gR_UbTR6@)?* zxU;@mctBEM^I;A}BPj&yPPBHauzdDJL>x@|cZ#L>0|(YjNH zdaUz7w60AE)#=1CIQGB{+kpQ>kn8ZRFbi6L@GgQw*XjU-@p-JH)#zR0-&W#2NqbsN zQiIu1)nq%4CTe^1MZ4l_ZGI&)*=elT;0h1HEO~H%M)uk@&+f(sH{pC%IN{uFx_Y-0 zN_~uX$tg|5GhcAzhxlM_@ey-OilCq6hfp_>A&vF1nf0Oku*FGSgX1**5rZXIA(Egh zu|7oj?W;zURUoMtoFFyHJ?Cb1%3)UxxZfJ>`jKxr{uQHQ8Z2H)jCbTmu`ZwkDp4(z zh|(%@+$j>9Yefh27qTYjxLhIEb}S;&=_-*UQ;EasO+WwA!=3`)ii90aJOe`U-oMne zVAyc)NS@|DlMV0|?u}D2X@AWlJy(7}%MWY|29ejkUn8D+dgds^!LM1bQmI?U$?)RI z|CbrZaey#1Yue;=<}^7r<+8Vn7x_-7jks;;eAq{m$sQ!<$(dtJFf|Vp8@~ zbTcgmWJ{7HQ_ z0d=b`Y~SjdoLgJ&yBz zY{b*ZKTy1KSTgKpI3jK3*VYxV^Ae3s#7ggw%eWEJyn`4MqD~drL)d5h!bh!86Bq_c zI80T6&wU?7YYTO}o6bo2AA}UlS4VGd7Club8@2yx(bge)uY7lIkJ^cTcauD_teBc4L^M2g#E*d3 zAIx^yW$Yn0P?&4bMQmh1$cw2UGD^h6H`#=EmQ8VC+Qkshe`9HC-yo~ycar54eIvdy z(6n>d6BSW&ZBg{i5tVd+AgdcQ(WL)FsTubC!cSf4@+6J9JCr+x<(i17qIVPJgn`iS z#BR2=1lHqNp;{Va0C0Nx*bi zI~~@>)E_Qj6fBIO8eO4v{{|%_rg|>0Old$t3uR($7iph(!(7nd>v)j&p{3HE7iyc( z!Q5NE)&^b5wHCEApbz;rU1mWy3ft82C7Uo$WK%+NPV0Q0lv`D$wKJla20uY1AR20W zly$kj)Mky()ELSo1|fKZ9t~Mf&%>3QOiSbH0lOtzkq%r?z;ano4qnx_q_o zPe`xs%ziVcQi+kkJIqEq{$fb%K1M=cOpT@KR>l|>-OWhwvwxbFnb!9++SujJvWw-3 zZ2HdD$kVZebUxW3ON!2abjV1v!xi3yH@9}(7qgK2EjZEMhQ zV@1b4)k8-#(O-~-7`pqd(Z|uZvKe>lb~{Tq$E%x@mK4o`L#L*k`NV2v1wxF)h=^uB zPyUh!o#yEYYc)?6Y<55)4Jpu$rSR2(|Ak z3O!>FEj!gy{$i7m_KA7+-$Dw0 za5dOZg`ao_o~(;sB@m})c?krExDA(Zy-H<={(}y@W5OIR+53|G&PTKcmA8(bf6(82D(-4NXpjQN#~LJGr?`n7~xC}*-f_UwG(8dc-aqp_T@Kl#FF9guE33obBTA6aGI(aw`$(vJs zJXu(zWw4*ovToF`JN=qf2_o__n0u@l$Oac`xaZQxg`H0n`Y#P{AV63wd?5xzO6kH@HmTBy7eV-Y*l|Y|jt;fi81NabQpY zYAh9>H?W|Vm=d!h3$xccv%(o*)uCLmn6Fql@=^9WzVfthn<`ez`5|nS$PfST=xHZP z*uQlR+HxcL-hq-_suiuD!oOwga#+`SvWvLuf8AQ8{lNJgqA(edz*rIAYU;J{rj{b z+8F2Z2E`?UKqhWo=4tZho@iZL=au*Dx|af?46;{W!9UkTS8rF6I33w|oi=2xWKU5V@C z$Rcii87mD(Zz6s##VB%&>PvlTS%ka{LZ@u|yUYD9j2MY`JA0ax-&^_H3n4+B*Np87 z>!^~ew;OZV6HzE$N79|J=PWNe9K626(h~904%Nqjm_7zSRAZKLKzHl&P?YGRBFn$# zw{>O7x4Kda({dU}(@Te-h|uY)Fqu0Rbzk2hG#k_SleeoW5L&0x1uiN-Zj|*kzH%&Q zI)4`vxgE}vJj*rVkZ7a7XK~lE>$`&Zr3%SwD=xb?t9&*FFBpP9uHS83kN45#+cWJ( zya~_fj3kuqRq*VX{0}QZ*F_s`!#-{Bk};+bWnl(D2*Eh6hjWuTG;})fo+tT)ptBRX z@;z9w8_y3-_8x&>xOaPmUX=K zrav$-0eiah^^|Rk;g;b9l|Jk1FJ8*EIVT0dw+%aYRX_l0B+=*L%WcdxPU0mtx z*gsx6iH7T4gJly<-M_1tqk24g)FjZ@YSiAjX8o~JX*^of)&>`Cnz}YQ5^{9VKk?hz z3w6YyL+(gAXuzl=V2`|O(>bNG!vX)|Z`wX3C+AuEu)@h65qlD z*{i>xpzZHc-Y2m|1`49W>WVo5hbXUde#BfjdQ>5zv&Y(r$@Td>`#harTu7#wF0?o2u4usb>82HpIwLFr=;D#6F(1pKYx}b+Sz>S-Fn0soDvpY zk#JbMd8W-fF4Jg&o3)$IwK1^5tfV|OX&vy|&2w$huPX{^KWtM8Yd1gMc1!HRUG|dW zwVN-ry+$9fv-XllGEaNMIfGL;rwQ7UBrrILXiObAJ{^0}!Q#&-PY#;>ik$oIfU9+J zaa-4>FHs0iT|=#Q1Pcn&5R@o^C}*(7-aGqLrj8){HqknjPmbYcyy57ezV0-x?K1z9 zktA|X)drfKRE5Kk07VorFUWqmF|c9%u4@x%_KtimtqD_EfmvW~jQGMxhQqU?G91H@ZbMEqwJMef<;&Hcs+=<7#5|2Cm<287EQ{r(j6UZdAVON|G zUEc-Tp^+DTP<`E9AP$!E{rr77<-oaXRE|E zhSS)1ATfk3%64n&2i}{QyiV$tQ0?#ZZ~hB(dfBWAT~P-eL$Xs3y`@o*=szd?D_3~h ze9woieOw6a`HEmd*TUKU@S!FgaiZ@q`L65McPC_g|GYJ>tAdw;VJK+jn>OaX>yy<9Dv90!kRM;UMv%dYx98S$yv-vtUYwS$SKc$p&-Ny@Jjkkj}F+rF# zt#vNyt-t$S32{t+)QTe%pB*(m_0GhrBuicm)3ZqadcE3}&>dU}wSSoHJ4gj%E{8jA zCJRV9T=@=#p4HUr6(6&NAjR7JZi(!MQ!TfV--kY!YQ*T*dhP{;k$kqc`ODx2N* zl_Ta@V$Aq=ep+AF_B$(uQ6@6_|AG&30}s}3F=t?~iG>7QTeRQQD4==pk3OYPWWjh? zw(_spJjU26)?-pimclRrYEy9p8tK~f5%TXs`iI}0a&DVKYXPc%Q$#8B6?`?j=K2mJ zVWTR#zz&KXjV_xCUnFxppYAdZW|;zSxu~K8n#AutZiKrlfBzKTGkWQ#0+30uRV8S= z#WmW)ndHq|UE@Fwr9I~3y{_ptWWCUEz)@Q^^#Qxlbkx1G4>{H;9HN4&P(6f$&Bk)LO#=@W{QS32y}LLO zJo-KVXhI=h@Q^2t=T9r}C)%7vPJkzEUGl9`0kC%SlWpB36|WsO=OaKKYkq-^=%Hvh zyXKpIM_avjn6$LD-mDQK4DH?s=cbGtUVj_bgD3x|so zU;PFRJF`?*1M$?l>txlo>7>cVX_zWyGEXN=*nih1hJJqH z^v1O*sl29X&p~8kf(k7bx_Y}^?PmF1)V%A#4@~9ZDwF+>8fvB6#bD9xu5ZeN^~xGW?av0IbB!FQWIqO@n&IRQxwFyNF)$SYmDwdl8^^ z?+UM3tU((`NR3ieb`qR{nT3(Cg&;le8xKG=97X1BuLD}W08w?w4}`im?^}R z07+VE=T1#M1fo6@ARe;ZM&JGmiHXy#znhlL1SGQ}fMXaDnHgsPNWpXzvG6K!Y!^)> z1-l8*qzPj|Q~oRsc1F~-Y43uLsBT#M#IL8EgEZH3hzd$(q~bhWht_;{ex6iF$A);a ztO-aVix3Oh!HU|56idC#RF$slT<6OZWPMEM_%H6B=r(iqrb5GX(Zrpo`)O&ChiVCv z+cRr;%ql?j8#D(XMVMVb_Ip+XHj!|tD2d+kvuejr`>e&sajUr+J@XN=F~@SUg5`Uw z9a4kzN(!9?AW2VcS2dckzNz`d`ZgATi*K5HbE4CJRhg#yguiPQ=5>!I{N2lb-wHBC zz#pgXwfbR-xIg~kf$KY@0VjRw>^geIA87w|Z|W1*gKUi*`cyX^HD~o(-2@op5?(kkKL~G8M*6_nU%Vy+FMt}n9wJ$`9mwT zQ~s;=2KjD&Qa`axi6&9XSLP~Qn+ycX*EU00`w3AJiR98dosI%iwpgOSePhBx`L2m| zZSbDBsn-Y*Rq~*3i`I+G2T9(}1~TzqkwhZ0>3&wkN6$dX?$FkFDeaBj`uR3fZ-yz% zwd+{@x{e>NWA#e3F%5*g(k|gMAW~ql)U0BS?meeMBF#jq)pWI1Se9CfyUYx2;9LszEjB-+VRz;e{BWXU8A!?7P>T@`Fms z>JA*8IGH!wo8%|9=G>k?ksps$%= zIaU-X89&>j%ltQTw?w7HW!S9CG@Nv8U9Qcnr*+c~I*R7!R#$X8X3AyyrU-Lv7ZNlV zvR~luV+HJYL?Y*gQ=ij8!%U#G_3RDrWb2sOe~glv8$Rz^q?qOgN~&Y*B%aR(zelFV z$IG(^BqFEa_KK zb84Km#T4~lpmHTWDM4uBy)ongCvrtjJ|9EWthDaMvrH+ zJHnBa&IJS4wdRZ6yIy!RQ#@bw zpM}lbxHCN+tmxr~@t7hIA7ErWK^Yy_G<5yE z!f9leghPC=Ib)PkV8U7*pVvI`oNLqNN&!ZOtgcNQ{XCGDq)oWOM5R8*4L+d^yG{2< z$dEtXxYxDmI&~)={cF=!t1(#_bkLxv#Z(W~4BXH0273jbzu+btG6xWrf-e53DSSaS z<=Bp6h0)%F=xN&*sr6Vhrn5MY)aciF`W$ZCgMYeTKZrKQJ|LWHT`R8BL#Fz(`ns3K zn|`M&okl$Z1B!UpI|Q%9DzMqYN~r~Dyr9$v(d|&>ba}G0BR@V~z_Q~|Z+X|QoAyps zPUNGp>pQk5pURT~>@J@W`+n13>cBQ?R$n@g{U81`G0E09@~0W05AYXEzah$u!b5jV zyb~h+sJ?~HxXfGViUYtKT|*(?VMuhpZpE*x`}Go8J@P*d{oU>-y0fhCfhW4!S}y8Q zcx946BV9>5-8P<|Ky|4bYhtEcS3gGQ z0w9H}%j7<&Jy_j~z!8U4nBdn}fpRZNm-Dmx5reVS?J&Wf#QL}=ls3#Sl4IR7yz6*| z845Xya=7gC&-;vPv7xXZU-tOtd+>Z`@_FEQvUm>9YW%$aKCp*wJl}IKMq>|U;R{x% z)4`BzJYe`vLEj0wd&WY#+0B)@zNl~lats{*22~pR`hL8j3}Im6uoO_7jjjz68s%f9 z3L?B6Q&WZE-n;KUxDTF>V)ULb^&aZ5psN=2J<5?#2#GqInhs*4Y$P?owyr(M!kBts z+xQ;}#?Icib;~ILN3iV|G0lZ1tk5*32_J6$Yc+QNKGFkKtoy^d-TVdR@1~)Xb98Jy zGQYF$(66J7{_|I9+tu5p?e-FGoyK??{ie2W+z@X+>NhuYa^LZQ?Vj1(-&pE8CXKh- zx<>iHCP-``;O>=vN2WB}O;!iujjyr*2R`m35hsGgAtaCoLO|E1Um|`NG7~`4#a_#$ zz%iq5vLeS#68*HdP~CU<2-tL6PgSY{gOr2>9>HN*RhZ_>DHccNxt%G)EKj8chPlki zF*)PFE1wGhovsTMs?|y3*RF8UM4>u0X)NMtYzb($kV&MPg)sFM6)yr~k@^v1uCyQ1 zWs~!pzf3{ywmg++M0JHD(^8XeE$2$GSh2Oj7(Ww=r)AC3L3HL;+`b8TYT zu>OY_t?XSS=qSElAW;D^WZ00%$<~KN5}@0_2_bP(m*B2VzoI02SM-h@DJOEVbiG++ zxmQwkTz8QH?#6B#Q^LB2O||&&w&*Qy(DWOZe17EbtkkTxY4-WG>;7HeU-#!Zi(2cW=1F)NAcMEilc3j`0czvB?|i3LT<%sv+T zMMcW3CKa&RDigM2^f$}@1~+q%b&gcQ2Go6Rj zZoGP9kGJ}<&DkK1vKgp3%0|vRF*cX|l0x(*7K2EH@P;Hv4@>FV^kVJA-t(P&%Z7B* zPuGo?KcJ?TaG0f`+VvFsyUYDS) z=88u2t6fX%MTuAV?Nz@0aB0e%2pvR^HO~kx8{5UvyB`WNMKX`IC01d$-Y>(7^+rx< z*1bOa#}c3HQ@?6L|GKMN#(J@|75$^-Y|xMC*fF)-7xkC5f_|{G!2)9f;}bzz@hXH7 zShidaEeTx=mPW3NEn-Q3to%qq5G2fmF;;Z0UOVzUn>fbqVdD~)E%WIuRYrH5!uplu zLaNoV-orStD>rVIFA)?$fVcjW72w%`o%JyZriDbo{)9rb>xG>9M%OJ5CrWXQ7IgX5(2a|c@Z_(Vf z{ogFPm_?+;O>%AUWOMO*Zp1+_lC0U*z13RtjvMDs-PkQf!Djh`c`5(Lny*?S zg6d2Op<0DaX0ED7K{zVaef}FN3YTY%F%a=_%cY+h7@m)lJwOW1_J9RCUMDcmdh$`)tQD`|tEYZ?SX|h1r2Hf;qW=t=acC{kzqx zI4H8|% zAn{6JXn$^^Fn(Ge?)iuRQegI>Hupc9yEeja4i;Yx>X2JJP{O_KSg<+9x5_ybmE2j} zYw5pD4*bK88HQX~@f61Pn(N}Kw-wEXLX*#WIbVpSZCa8d^&omTJ{O7U77a+LM#0Ii zeUI7+>)AV1bgkO72f1>)_Ap3A$Rj)HndqMB1koQ-qFqNuaDRQwcUU<^AAdOEj>-1Z zk*+ItZ$D-Z;_B6nN8A6?zI+XDh{C)#e14M}(#8$3=5p;;ETm$MX}dAFf|ED6BGc^( zVGzVmf=M~Z>Ny{zm14X9q)EU7z}V-sG1?fzNJ88igt(HH0%6WLlA67Tg1!`e`QKGGd%kXaQxm^ZAIb^+xQR=t|1r{J+=c4$0tfQrCfezA z4M*%|)9mg4t)1R-VYKlfHXS{B6bBSzH*jgRh`gJTbg)de0^yLY)?^~2o>ihYhC7yO z-9thm@+l4|MM5L2UT*pwGW*YqbQ_qqbf#=cW`Ih;i(Dica>%LGZ}sFZaF?#bbO&h+YVrWD~)3P z9$)Wy+d6GEO9ePrYodI}j6wZwS6>}-amV#G@#+b+IgzB-n}}i{SExXBe@$sP)jj{8 zQ&vi(Rh>t7g96sq^JiIUIVATQV?{exzL;L>(P(ZB@slh@7PN1dgPx zO#hD=snN;+aVDSMf?{-ZZQ{(wuN1ziGqoM9 zjOKsT>_e=2q&CX0%{bwmA?&^J6YNts>=PHgz!AGi>5$D>>^J)iIzNAa0HCwN~N?)AFow7}PUe2ZyTG(*FwN&Jc?4#~CBJRqh zROw*8%ho0lQwo0Hszzgt&rJ5e?fKoyMo+ast^Q34`+=v&Oz`5sQPk48R!UX$;g4uH z`z@ud)dY@Cj8~q$Q2@lxZoU;6sv!H%Gboa|eykgWFVfmt<$@9A%Gn?Uns%!c*rXz{u(KaR(tp5PnbP!$cbpi!xxOP-hgTHjzhUu zBlCw02>p7;p+Zqwx?RgazA}LtJY+u22k2u zXuCF1O@1i-m%mM!$&d{3N+cz#)}3dp*W5rUaWoXLNXDWzKTNLIh6&Bu zA}FFXB}5pOT#yvh^P7DGx&zy%+k@?iW&<|Lfn-tK-2`@(FS{{yKiJ(Ee}0XBevMtf z2ueeAr{$jL$SE~0mWD9vU={3E;-xAmSa44i|Ha??&<3jnznO3JfkN3{mspABaKIe5 zuI-Qq2kfQ*NV|QL{Zh_jJ^BXz8kcR|h~g;cj*~cbG4HzihYLeS^k>)5wgL+64*mpaZ#VXF zpwzQ~&Yz9;@k63+AEYT;*m~nPDJ3HXY$3;z%txL{8!#Kjk*Obj78}fso#A1j2*?XX zBSN$uaOP)94zzKAM=DAA@IWPR?i(75HQs6W-5cw35bQn$bJLA$I*B&i-epXZlIpN+ zW|s(dzWY~?VN1(#yQRb&>*+w4Rk>SEa025lZ(XI<$fF&LjcTt+lR?5&L$ki zEso~u2?s*=daT{N=-UjtcVXJ{HEq=v=*Sz{F* zdvpcup&6ZKmQB){60$9#D?so`Z0cyF2Vt@7S`Gy+>$m<*DYG@}>w?6D#8)<9hfols zx!NW)bL7HcpFEo=I5i#>rfxgtF`Rx;Io*rM1|Fo4E1FUUzge^9=_zFl)lV-6r_7l9L3UrgoiEZV2|{F|INK3u9y;-ohN^O?R8 zq-x`{*chMjHskHpDq(0ac~eL@Ieboo@Y@vaC-+k!@P__;kZz>r;%@T+8amxZDN{HX z-{j9--mxufW@hJt^Mgc%)Q0@B-D<(zRNoVI8MvhQ7De| z-eoe}@pvcY7lm$XvFn?>e;9`@=Iy<%;oQY=c8~HEo^~QTe0L^9Kmi=}f%|&X(U#{8 z2fIX-8!VORdd*+P)CQ+z8G0p3BYAReq*;{g{%z$My|g(rqQ2_*o@#HQwBtB#|EoX` zd0diy9DC8rg&pS3OS6{)Q`!++P#D)kE1!Ky*+kMMEHE}&H(9Lwsmb2_M0xV`UK9qt zwns&RdpCmm>$>mCRU9|>z0ge0f+dP4pX(Lzd6}Z^`oGM*3w&HxaX)_L$4Vs$QAlhH zezYu@QpHe3ekDo_jb+)6P3%OG6cPx*UP-G5mUflhl`V&tp+F5S#n1qOQfgWr213aX zXh~b3rcfH7KnmskgQoqpG=%af@GIfb^8e19nK|d)-Fx@SPV@Qm;S+1;p2wUybLPy< znKNg=QY&j>B;S|JSd-0O)rfm6RE|DeL`?u z(|VpUZHLP>at-1_2pytBQkHg?D2VfDG=N|T_t7O14W%_*234q~a4qZr{tRWCTwk7y z)}BG<=RDpK850@?0=pfEJa36>IDvE{E}%#>_N_h)B{#D2luYO3mdgTWsQUP_})?Xq-+dP{KQY&Rj0UUbQ$N|`nj-3NmY)(8pc#1aYc9P=%9 zq98fb!Vv{cKEszJw_2j_pvmAIphe$7iyM54)c5AZtOrg0PC%l^5}I4m@%&~$`B#z1 zNpNU@K(OrSjkx5p3rfB`n0Z=uo6?7WGFWy!gzKintA0VVUkqMxK1$7|7k$1b)*6&d z=aJ;C!}Q@F^i9(Gq&##fb06f~JQpPs#1AGaka)C~D7#HclL6yVo*P__Oe?v=qe&0_ zCD|k(=f{ItA~s2^D>Xy*$19Q^5}QOu{sMK112G9!0mNBk=Q})vbg;`fmHVpy&jOZb`Hn z5cNgDYI-7yZc5-96n$+l`;Vle>14etX!TJjy0JffT8{^7bdH)$C+v#@4AxT7gxn2~ z{iC4h|3cBt=|#U06#Z2c-I`eY0lS2{$tD!tn6d5rywk6%caogEJe>xA7fjeVVVj^q zfWomrR1`!0W-w2v5Q`zL!7qolw9FOi2$|AvJ>iT*h&?Rr|aCF@!*ZJQ)(PR3$6~1?05=X+>PXg!W9wW@UTaN?+6 zTY2A%FTdiNRh~ucf149j5(>j1tyV}K)86WQdzun^asZ%d=={Z1FwX#&YU_*;i z(KqGmT7(ugbxoPhozsL|K}f@MaWS5u9yn=Yp3bLjb;t=$X*K@a&`C6$TbZf`L38R1>g>E!XyV_Y<+O5PXSW>fciw+l)1)k?CG9@N z8;kgcU=VxZGObPF>?WMRJiYmfw+gx!Y&f%ec&r&W|3_KRjS5f{UoH9s3&qFT>; zw&@^)D7LJQ6;mgx+E&8Z)RQP*k7JwSbDl>>t5*mbotj=rmm%PXdIs;oh;bKs=DefUrG0T~Cy7c_tE#}Ov(RMX^~CsZ!DmmPa`vM8#h zxuQ0kY*iB!<2a^*lM8D271}Vw90ied8Gx_^z)!i}bn5X$Pjs&BE4EF8)&ld=t9y4o zoZXv~bkZu%t%=yv-WAdFp8V?+z#gP?{qfgb(MM?X61k_*iLrQK`jbm~)8+7`;Jc55 zdt0F3zm2q2DEQc;T;wb$2Tr)2-i#|sCYGhG{g?M4kV@g(iq+Z4q8*iRcI0cvDHp?D zIs~4bnk`ds;YXkB)=p^Hof{mJK6pK0wFiyS#P4{DtYlzH^ZqRPt%;s4Nsfsw++UbI zB%G)!V|v9)<1vJFyX;ku3CtX+u4hpu$ zs>T#$au$W{22Lk(5QQvILbj*a+;eKN#$t`~JytmnR2~-CR$N#d2hUKYSaZXR<8!kU z@nbsYua1F$>!SD3&k@8{0 zP)-JjQ8?w@9becb4Pw_ph$UZiq43GC>~?S{27by@$9J*JQbMj{$U_v|z%eo!;_D@P z{e*@ zlW!P(_LDh-0h`%kB&#nSdy9E$z;YO0Z1A<9!OEo54xw4<1umPUR(fNSHwRm`rsJfr z$YhP?g#p4`F5K^V^_TOylA1@@q6dVBjFxM&rMYVs=Mi&6yr>aW1uE_m`AhJ8mo4sK zjY2+TEYTKS>X2H|z}m&ow_GIx!Fb}G-^v-v);x6IFh;zWW43HMhp;*!At|QaM<(hV z7j*+@u?BskiYvy%?w>I2UeCJ!ZW>8P-br+uRoEOZyT&v9g&(yi;PF48-S@0h{ob?V z=f0YAPC}GQN%hdS8xv~}g|^wVPW4Scp3Cx%2l{ikhC^e?Op)O5p#!eEV9EE<{>Pc_ zzO~n}xxEv_Dvf=H{24zwy2z#$)Mv-K2cIfSV_dWDbs1;^4b$e){o7I~#<

      hF&{< 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%0DdZLx`5|@&Kmih>P{8Bx*b(>X;3vC_zcg4|Q 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 QfHF$Zb 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 h=Arzv_Xis+R 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

      w<+j*S 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 z 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

      0z(efI( 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ℜWO;(mRu9>m%t0W8L)B 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®%-6Lz3 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≥7 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

      Wj=RxFSEmV5NnsJdEnY?=w<$V-Qufg(?6vm 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� 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%0Dq25b5HJCsQUwH-p-3RS ztW%(9hcEnFycLWch9_%XR9YTb^Er+=>l`TB=?m|t1^P7XXU@7sW#ga6z)AyaHUdvN zg(8oc1>>Upjl`m&6~3Bx@$n#1?RsQzlS!`?p~xp`#>Vfz60_zm79JmS=(qnMPmWnI5gp%R5)P zjb{03W-!+_nx&1RIeY<}jUuC?Mg!4jrlC=lNvByYxc&@j8P%GWd)k%(-dFU66<~aP z3SOGYr@~8jD4f7%`3Su9BObO9ZiZKGe11uB1J33%&_c%-@!2jq4k)d2`^fpImI{}3 zwi9CdZ##MgAA=yn%fP$61DTuO?tz{NNOK@zwl$FJ>ml zBD@K3z;{REU0g1Xj9SB>j3?UV=ZrjgfHlOP5m}m~&pN-IL>WgLA8i9_gM#%#cqc4H z!VghZ60-*JN+(*VPaDSGI`?VA{Lh;Qw!o%C^IXu#XRJR9kUtU=AMIgKa)NIhdmIczI|F!xE zxQN{xEf$DQXh5k5=&QKO=o7?kwQ-(Yk}fms2mv`j#Q4+dT|d_ z5q+f*V-7{{k9nTtDoO>a=qYG14x*N|8z2P1I>MK#_~36i&z=-69R!DL) zA@XIW^b=Cc_rQ+`-Bu_kWkh%xA$>8p93FDq0bbDw<=82yN$N@x`IT6YS6 zBx}r&F8nf$;+Yn9SrB>-&9%a19>A3s{tPX}90G`;JtQbH6!c*!&%vdR@VtJd-ru6 zT?bsvDx$A!0eCGFvWfz7dQpR+g?hEfx;cE3uM^%#ol0GV>gapX#hMV;KR2*5OhG836agUSnnk=LkQkzuLn2YwDJO>aOo4MnF&L(wVHPV^aF*{X#DD8m;^r6-~M z3U;dmH?rG)bbdvUC)!_Po+2oP&Xb#|@9J6hw1<}qEr7#v{x0A%deItuWb?$R8aaZ4 ziu;>^);B|`OCbzr3%fuT#%0AcqBYm^HgL!WtKl$qqDj#bu52;#_{cR8} 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

      ^cd>e#Bctkd?b`w;xlACHHWAH)4kS6MUKl^hse3 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 z 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 z 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,kMpAdl$o5uiO$#Fj(O!+77 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

    1. o zeziIE-;%^H_}?t>C%yPO0zaRXp33v?)ie$_#^gWLz^)X*zx^qDyYq+ni(lFOkFT`* z-^BIdJ5=HiClY@!h4`TrVB-V$FA3GBF8{;sg`!8z+*!Tec&7u|GcJU|7 zUlRDktL*&E?c|ScCjV=1A%3WVT`7WpRL8NiT>NSa%Aex5cK_AYcK#-=58t7Z|8Y$G z$xXx$tpFPz!2i!J*J!!ED$l>nU--_>A6;edzx7-n+)#->Z6N;iGUA6C*p(vqS6|}X zmizNX{)G8+-`n{WzfY~QVg8Wk`rw8t;WB6sCp5GGlKV|;h0z1F@+ zQ=R9})mD7``;(ntePPd^dae&{sKg(QB>#)d53R=k!UtV$b@{J5kpH=#1^zGX{CTbq zZm2YVChybu8Qo3&7g~*f;w7PT{SzbqnI{={c6pPye+a(|VWKbrYV%!BPA|J8SP{^oY_>+{L~67xf`KU3lVt-}v$c|V-U zpDe-S|8MsEQSp zA8`IaO>UIIpWik4(ZwG!f8kF%zxvVce?8X+H&o&eFJ%9jzm^rerh>oUF6W)$;!l?1 z_0L~+{&cK;{h84Df1T|ru7fh#Yfrmr@5W{ z`Xchb_y+Mq!D}k`CpX>dy#5>fhsK}c-**4iFZTRt;`;C%D)}FbCH|QCp(Z!V;GfaB z(u1!2(MwbQ6x3LJwXBu-_g6cAJ=X^}RN_yVzmfT&nVq&OfdBgqE^@B_ldb9aCD(!Y z)628@lMb-wPoC?88!GWf7nA=9^Fv!9XFh^|ubm!qUw_|*_)E-#ja2;q&F+75JNeZm z#9v~5DE4P6_;(-tgY*8Aa2a0z@Ourh9q>!1G6d>;3q*q^E3Kk3MDEf;^n{JEv<{OWgm z{^YqnxSo|0*88gv?)9#?G() zwEJJr^}!95_=EApUtoS{HU4W)IsPLTzh?eiN8*o*#`u4%-Tyq-2RBsWPnbXD@e^8& zKRRmq<}UuQ6X!qkV0##U)L(Z0o7>4BT}J-TXMQO5XDagN!fD$&^Cw3Bce3YCaH)O$ z*~InXJ5=&tUC#N#<7dHh{d~yLqnyVtn(tpKENkZv7uxTitmpdRhDz@hR@3PEQC+vb zWvij4??FCx2L^{7IM}+6p=I5&Tbm(bM_-k!Jql@`C?M+Wl|h`tThp z`JXa>iTR-!=vD>r|B^d)(aA)|_}`z;|F2-@PsZE(Z#~xsH&o&et|b3s=7+XI&U^%a zzdo&z;T?AVCaw?Pp_2dl8uDMQO!IF=Gt`R<;9uk77cY15hsgg`?EJx< zcK&*<4{oT$A50|vl>LV;CeD5W|0$cU|D}sRV*cE!c7An*eg4XGeQ-l1{%8{Mhs+Pn zQZFunzu&tnujAs^!#V#Y{^f-6zn%Q*TH-G-KXfs1_7nKOdu6T3F8+l1i>ulFkB8Wg zznZu{e1}T@$IKsc{zJ3Wi%Z}?_R1*d;#cRA|Aj7ges!0S|6Cv3P>Dahj{Rr;0{Zb{ z-W0Q#UCC{>*wMccK`LgcK#-=58t7Z|H%!+ zpD;hv4^882{VJAKpy<=Xl(K zg4a~=*X{6q7Z-nm{QrmD|L{J$|4m#UzC$JdQ|1qtA8K-=4F1C|>Eb+pqL1L?-?i-g zYPy}jp6i1fD)H->{I6wxD0oc;f0qx(IImwM82{H6_&eM4C(rf44VCzl2I7yHA8K-= z4F1~=p5}c2PlEgx_*23E=63Q&lZn5M`Jv!775qQ$zc6&=e>jTzZ}FdY|I^|2%(`brUy=MS$Ej(@p6xS
    2. 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

      N8!+c!-Eu;>hQtN~M z%*XZTc)p4>SM&aP>OW`oulcO=;t`s8q5L&p3V??Bxc#-uk5QC6lOzwJEc1f?{u1Qu z%$fE7FOvT|`GJ=Q9$X!|kMHqc!+ab+oqResfBU^VJ4mEA!8k&$1YsT*{vm=u?<+Wy=a1Ywb9Z-X?(G}=KVN<_;%&eD zl+zyi|2MC{Q2rL5_h6mp7fAcDgHxFMN7=Xk82{(_*5y_CHf)&};unr!An(lv6_{7Q zQvaXVzrg1^e`^2C3;v7#XSu-=Sa^*tmclSE*x&Idt2MH4xlD>;0I*s4v;}^AguU0R z^%-ryozYebZne!1_20ezarx)VgE8Lx4%ok@nUBlg@Gf{1Vt`>jj$buTzhE0fHvM>I zOY*V)*LspTg;D>*>mQGwm};i(ndpQ1XFl%#YTl`j4T$_fWB2fzVLr7#rv1LrIqwU9 zbnDM%%J0*Ejrs21d;?Vf)9W9{KfH0#^OIR`^n(5+K6t(yx}6CO^NIbDg4Q3s2t~+s zLYDc&e~@=`z8LSF`OWWugT2$A>VJ9tllp7(TmyJW*Zh@cJ}tkKzg(T%T&y;5 z!+acnKE1)!f$zG@yUX2AWySJ4e$f7N^}i+mcl;ji|3DhvqWYC)K5qZall9AZWtfls z-|_VNV>;szEHA{T)mK^O)*+b_-y?%{}OBF*I&DQ z&V?=Wg8q^GTo11PujK!!{Ji}%^FsZ%IzB4v&wN~eZT_K8Mv{4gWj^+wz{6`? z8psR`g;e!TPOUip1fIqaJ8lDtSa^_{`Plx8$=(bn=-lpsoacFK8s=mD8@}%OGJ`nF zeB6IAkGv(jv-NRl0I0s1*FUcRl+Wv+nHS|_=S!b_Q<7ivdHI(4#QwDWisd8fdGajP zfcoZA{ktVk$Jh4v)z$f~nUDSNc>0lg_t7KVXzrH4IxKx)n2+t}j*nvezIDe(OZ8`& zkLxex^EOc5!t0-uzfPWVXGQ*#i{9}69-fk~lz78@QvO=L=kw*a%*XvtlRctu2&TTJ z*FSE5T|QR=&3w*&IEP=>pZPfc(CL55U2?l``dV30e!}Mp5C2o&O46TrH*Wo$}r!xAMvEeU40)3+>&C~e_H0__T#w$)3-`}8?S%Y{&)4OEWZ?gbbo3`lcpiOa1E4PORBz!Owmf@6{AXU$ z-}5E!$NCrZas2c3|LzR4X#Z=r3e^{Q{k!q!y|8#zEP!UdYd=KpP2cH#=+At&{UZ6+ z00*+!^4EN^{OUtq|E~Qx`B$m)f(vTq#qtkuK*N08|4^mX$;W8jEL#f8e7F8c)cZ+QAZY=nmSuKga~8dU$xcm22K%k}^5bM+72*I%~n zQv}k?i{&3u|IBymkLC9SAe%2glF#`DBrd%A@L8!Z%+)_7uj_Asn)z=3(eR}TFwA$` zUr3&p4P8zH%e+wkoP00u`}6?y9ZLH5SD(Y1FEhHUNQU`yTsXh}NkVDff@S#IB_mu6gnUDRi&C~Jmya$+){QFq{zA)m4(I4F!w9Lo#*Ft&%fcmap|2Y1Dzc*h# zVcX|yN2Sp@p014=z#Hb{_yPGlXIQ^oEczZ{nUC8qcnTl1cAwum=ZvYoo7X?~-;~d9 zK-A24{HKwRhuuM8ZX7+%*W+V`Me2iq5N;*1^oU|x%}#Tc>QDl^YU?T;e1)fE6sdd z{|R4ML^aGy_G@LY%vOM9KK6f>-(U(u8--dKlQ!x`rke9Feek;MQZRyasEv+FX84Y*nvFVr7ZF4`+EK3@kdi+Y@u?4*IWmp znV0$>QaQhKz?a4_pR?bq?0{5$sSK8R$$z|jUw64#ocbcKzvMrk#0?UC{-c?f{HNjb z{$mRA@d~}a{TJjnd|tj9<@Lwa9c}eR7u3v4_D^^*h8X6h_*?V&;#Zb=$^V?s^u7Q7 zVz0l%RxXV3|+aPs|tEkNQ%v{@Z+Z?Tt#KnNR#T=IaC=-3V@&m O z=L8Jd8nDbu_21&N7EtHC{*wJ&!|%xeq04-40u95wRDQ^RvqyYonLo#_!Q*ddfAD>H zrM}GTFV)}tgxTiBhW~s=gAm3M7`5CsrQ^>jUMwwSH=k+K4+SM|zd-y&F zFw9H-=R#&#d}W!J{D=4+yi%`t{ge1bS5S|&yN4P>SUiW_tMfxMpVWWMXImfYpZO&I zI)3l$=Gp#Ymfw7d(pcsb|BZOp17()M)djDAVn62ZE+1}YZ&5P6oDnqhl6=0yLzm2G z3i3DG$^Mff4gHyq>kkWGQzXz`PA`NM6rGCW57b4e{!?B!c+R|LKCb_o=g$Ap<=4_-8aW*wSWnQrVdU@C*98XiPdi~GwlYRf;}NR_T%)YZIF0? zoB~O`=JoI4o&R;C59*)!g8hs02Qx%I`;R2wGGFljOwaGVQC;b+|5Es?H1mb}t7q_D zV*K3<;l2Mz>Q|O|x&9{W_2kSQ{*YG>;Qv>>{&M+SJUl2ax&KQuFUQXopJ_v;$nVX! z@1q}BA&p$d18uSV*!<&eZp*FyLH}!|`fvD*`juur>Hj!>G<-(=$}lh6uiaW!6CH)&dt3UIy{tchipLtpThR^EHysZD>K8DY@KsMt%aAEZkufJUWHje-- zv_Q?g+<)L2wX*pu!@L|nYd&ZG$}%sv|C-O4zfy0M^so7x`76!5tUqklr$6(u{xzT1 zpLtpTn$PS1(USf(pVyyxx&K*j>D*r~_EH2j%**2+=Cj(P|7TvdKl54b;s0-X{m=Pu z?(cuS7{<@cXSGNF&%A8^&0@YkD|&z_%5U)*8(8M$_|f7sHc($ts((PI``eNNn)!_W zEnZf@FfW(Cefy}q0%0@q4``wu7I@gakO`~cI-@9-UVGH;nr z`?g%H{I>1mev)c*eN!us~z?D~uPDp~&ypYcIGjL*&?4D(6*+f2rKXXm{WN?n#+ zdvy9UpV*K1_53NaIO7`8(*9HR)uR9N?ZLN?_h!@SZ0hgAlw3$NpVU9|cM!nJ>o11+ zr2G+I=zc28eB!^%@10@^4qHI|9(MHR9S2k&_xdOP!~FiqX}$g`x__mam-TmBC%6H3 zM7s|R^K$uV{QGo*49skTZVg!G&++4lc%{C*`G_VE{sIU|c`)kxdHrL4b2Pcq9N@nC zTK)jHW*FUMhli4%6 zKlFIw@{c0^X2M^knNR$OcsTCqY}1p!%*gV$YaD-hN-1!9Hh^2^(JD|nju#Qw4TLI-S^Pwb!aUVgXvSC;w2{>)0DT+Ivi*UTsFpZEu#bO)f|eDoI*kv^Gq`ya!6(*B9~kJ#B}0btj{L&EG8V|7Sj_e|Poq`0kR9&t=;l$u}kW#Jd`xH+W+BtSs}L z`ls?oyzGPOZPEXm^1p}qQ$YjGyr@4dJ{4)`&wQu;sr=32mArTl`&s5i{fEr|-tqd2 z|o3pugL>hqsR< z{h1f*FYs;{=+y0eGt7(ndp@*)4oe?c=0*GCH7;%d%TJ!btFI}vf6qJl?wepg&3x)V z?(h}`pyjG)Kf`>gf5eySzbOCi>gjAhS9E7j^$D+kT7O>t{mtRgl*e!GpLf1#=Fjne z@#F7}KfE>$xoh(Z80ORV>*ep_4CKZo@J167#~)VYx0AhRNZmbKk9+g~+>`1*b^($Ntyi?=Ct0zia_pF8})Jj$1y;7C^o0^^eBm*4fARFy?kuE zIL_y;C;687)c$S0R0ySI|9`$cS+8*GW8V-`GoSiT;KS-?ZU|tQPudUS-uTw(np5`| z_K#TR6Z^${E_lLz>T5;+kNJG~t~B$B{}SJK^#E00WtdO=FXnT`18?)?Z{!!suO4{) z-87x-{L(_4z_P28Rk$m;0OI}E8-&^|Ybp3R8_g3c#>V2<&V!wzd3tV}l zgSrni^NIhqcpU!loq+fN)616~*fO8QpO*Ym=@I`w>Gc=+-t2kk|Cvwf&&x;tp5VT@ zDWG9K@gML9^W}VVG@D`$5?){k4q&tL59ZHjIKPKQv>Uf?+{#S?)%W-McjX^V76&ToQdYP6D=qWu#rQU+uqV9<5KWeU_~0I?ebLKmPGoaN+?%<->lO`8a;Id9QhH{Aieu<423{89&;-^1JRcKYmo7 z^7<$KOZIDx|L9lQfi&|;{7Crx_|f#quT3G#x6Ehk*E{}HA9($;Lr1 z-fW946mP9gms7o(Zn}mG`WJbOzqarpWFg>x-uYpR{O#rRWQEw3m#_A`{;~gr^4C12 z@)66RnV0py{dBh6W?53kFdw&{AphR{c)oo=Z!tvS;4Sm9|8)6WA=G|J|9iN?Y>9Cg z#&LUc5j691`R`*4zgp&GJN=oL?MD~rY)+7fF{gfIi{-ERY!TGd>mT=D!G3UE8h@T{ z9?Ukll0YbhW?uFmVD9+i*PgC0mnMDFFVn|wae;tdVH4n)$Xn)R`{NR+^{nWCYUcHi z<44ecXSRNd?T1Cjnt56O0qvi8 zss65x2eg0YrS{+Ea|)=#lKunQKl5_=2eg0YW&73bH(P(USpJ&Nsb8rhufNp(uVM>L zZ~JHd95-w~{_ySRDi(fv+kYS5*Z!H8?LVOX&%ORq`@f0{jC$KY^HTj?8`A!Z{DAgf zjE^&j==y#HSt(*Bv3^&imwnV0JC+K~3oywv{Ne69hgCtiQK{B`@u+D|ht`TwFr{j>4|pV2@wFY7;`{rB;G?Vowse+IPw zW3Rt#zX9!E=Ka(GOCY`LKg`GWfBuozzG8fHMk61(`{L2#>@3PMAKSm?=Ld7#e~$IT z+!iLa^!mr`r_1Noa5eL>{Ikh1)(>#@t?%`5WkmUoA9Vku&CB<_1MvzrPT>f8?33Z$Fy(*nWfhQ7|1A5^)O9WfSfcK{KDor}e^`cc$-<{sSY+ zuNMtN=C|A#9?N_bzc^Zi#UIypyH)QBpw?dh$o>sai$8dInSX+2KCz$UV0?EGXX_%@ zjui~^a{1Tp03)0U=kPkH`@j~;PmRY_L^gV&{x@F#DE{)lZyFySp#rP_17dG%!MFz>h+J}_hhyin7*jeB7ZWkr#>_UEG!`!=A-sE*(|YkIH#*u zu?sE#@(=d2qWp;GYLs0-J(ct)e$e&Nm1aI_|E~NvKJ;X=x0sc8pc>{Q|B-ldR^iJs zAJxCWdn0ropq_dCBc8g95FLAA_B@wetF3>B0|3DlX_KZ-vI zPfzLAy#GWqAH|P|r|fb3f$$I`^UKNlYzzt$c)a*1#1G4SY`@b3j-2JjNBVzOs{an3 zwSZ~>>1 zIYAa7p%+n~^ZG~ix4%BaKOes{*kmNz&3xp4E#$%ompC7}M+r3Aza)P;y#KMx zNBZ-AS>CnpLSHui{Q$3jWPiViha9ro*_Z}z$0uvN1cCj!2Gq<)@%xbOkKWAS1M_Y1 z^f~lrKC++ZaR%ke{*ip%a9)`^8yGs2)uYVN(ux(|$gWH!d zaJfjo-8Y=XKD<>S;Toq@Z3e6l@z?<6N*{a~;E zIsON(>DLD9pTcV9)AF~1PVok6!+cu*4WB=IL`AmDr}lp}E_yd`vA*hui2hI65_#)H zuIBv%H1kpWh5Z`ddr+K zTYkqkYdCG8t=~2CY5O7h?16WXh94)0jxWj8X+r~cdGo#ri*N59&B`LJgFw1}lY)DM^Izb2d;WRD+L zn)%dzEuNw{vX4mKi~gVa*nh&7@!smMY>{ux;4)TJKf>!D$Dbgd+farj`)TIm_5&WN zi^AEbeD-VT&wO0}F)z0ql8*St{5k)p&)?Qs_VC-kGK~j}`jKA$)c#@OKzyP3Rhs$K zexC2QpXuX6RmkpBS?1&TiF-q_fpN$S0QIB1{)zn@zg(T%T&%DawlDzI%t!U-Ry~os zWRK9o;1TvWl6=Pxdi_yZ=A-t8iYFdx+)^Vs@Z4}UY=M`f9h;;+PKszLo2uYc5jnMd}X-P!uMsDNfZ zvR}$)WRnF9^O64{?dBuTJZ{|{Cbj^}d}RM{VByvJ_Fj=C`Rd1d{iF6zJhmR-_)0Pp zA|n3M%t!S{{5zBN^x0%R^H->6Ensr|U5(&hF9c@;m}S1BKk-x!{GV>}j!WJArGA`H z|HR$Z-g@+$LIBpxNB$S{bcu>D%U#_F=HCqSk^gw!b3OadZC3sgBgXlZ%zwLZg|hnb zUjL5$=zTx-K9*u1si2wflz-Uu>6OXJA9nq8Wpn%n$CaoIh1gByS3kk)-|^qT_jF-e z;#)WV_FUgw8RjGVM|`&FQ1L6veAIs3n_Fx?>c4)sQa{n_ANjB6Z#LK8`VXWF+%)r% z{ro?#uW!xMh<|zct?OI!Pq56NbJnQ*_{abAaQ$f>2BUtG*I%$7wSe~hcar**W?s<0 zzCN^60K>dsf0ErhjkWpmH`jj_3ZP6@f9Q+#AJ1}KvXNUqH1k6F+kCKPi}b&mVe;9Q z9lWx`_?f@Tu*<8T?DdcO|Jq)?*Pm9Jc|m`-Z@tff4D*8jHP?^U<>{8+=K1FO$pWu_ zO1A!+>mv)iW?t}rwt3lxhWT@>np=PJ^619IzUx0L%X}0++q@5-`SH(B_4>y=a$g)^ z`p|#o4MqLvX`D}OgPt?!w`bYks$S(|kE6sdK|I!kqVP3R9+pnDS-6UuG7pneUM=9bI)EX9mdk-MJe{v6nVKEc1E)ua}S- zsP&urxnBPg@7tePeU)Zj^dGu~wb=$ry-`cD|J5*`_)l|v0M9>jG1xMn*x&I3(&ty| zo4o$9d`^GfpZ>kl%*XAIc^9~M{3f=J=Bz*SQTd0budXcfk^OnhH+tpb1UvEkJSww- zq<)^)KZ-vwk3&$|*H4vZJ{tctJZ=2JtD}4jGG(6MzUO&cE`OcKBBOq#e!kaVE`R^} zn`U0Nzgs@MGhbjHn<;={KJuU1euz9-()*7s%CBF9WS^pbf!9B3|FwMoOWykE|Cx{4 zPlwMa4;4&_=gD`N$V*MgG9UFHLH@-PcMmkZfR$MKO#MQyzgT}4>pYC%6j0|ent9QF z)cX9@5!eJV>9F*HVP0&1p&#Dy*XT%ESmxvS!TV+d@5XVW_)7gEufOPj{oBtg&AiZl zULB?97=$7i<^}sZo+oi^#%>>EnHT(z2X6J7*e;Cns9)^$7t3Eae|9LL{F-^ee%x%z zFTf1*LjCdEhj;uX3S#Lo{$XCUp9?<^CX&5epL<@~e2+NPA^iuM zdC~sB{NXKcKj{&Mc~O7n^ECADEq`hDgZlraUVkBeu>K|Kh=0rr?bq@3=!lM9sDW}h`4D)gM2dAH}Ec3Dd zC%pgjU@Zht^~=5fas7FKQr}6dKCz!q zpUr%s`YQD+r1~G6zPr-QC-(R9cj|Xg^hS?f#dQp5B)-$_VlP-`2w|Cz>QCS^c%^=& z*Z&-s%+3D=o`F5q`Cm)^Lr5*8&#p|5{GRmLm1RC^KQ8B2lRh~&ccl7MzuM~`+n>_cHoWs4sq(4* znUCu~=1V=086Y1f%q@RamigHJvHW8D|21C!D1IgObAM7cF2M$x`L28d!X8r5_1x18 z^RfR@`4isv#+?$_Z26h@%4cZQ|F8A>$MK_)-;;i>(#&`5=jCtdQNfiurN{W6`JDY6 zpHE*`S?0U`+mcVe3bN@V_3Nbe-{|k;=hN3!nt9oN&FClRgNAvz{$FkOPG{ENEc0Fc z2cJ zM`fAs*w69qAkjS>L|PmS=M;@vuocjc}RYUZQ(Rp%^)2SawY^CkVW@_qkR^O=WO z=DYT1KD5D13sS$;>mT)Bt@8Kw|IFv~cl~Ff|2E8b>))5(@$_q^0xk3B_`m!3NA=g@ z3;nnHZC?MJ{Mr;5`I>pzes%N7E`k~6yZ%SzAJG3ZAGcphUpgrLY^8p?RR6?#`-T1g za3Ap7CVPyTl2A+kW@2j{_YqR=?BhAKA|({26xsKrC)`ca<$)!JpiqmU};PM?{a{Ac0zLvHj|VpDz}(!^vW_bf^D# z1`qL{k;PYr`Cva>SAICV{B$`TAJ6yKtIg_QJDwv3XYk50AL1{%ycO<^p}2Xsxqo9U z?mePssz2!U5A6pYJA00bM`NKd3^kC%V}G=u%S0!_ELt-k`Y-VOZ^14WqgU`W#3FLz zmlrR0=TGJZ_)~$mc^;bvW|91vz^gyx^%u(D;nxDMUx1g&Z5LMQcfG(ee~$mtd`Y_%ac?4d!1=GcasS?EI>%bt7NNLHqyGP}*T423 z$1i3O{&4rsr7LfYF#N$;tjzL9rI~N+=XXmo|KaB!wdFZ(_3b=G{ZX%fBmXHK8yr1E2ZZxS zJ++Vc&wS&*o=1O!&;c8s|BUnB^BXw^8|EAPCH!_pf$Z9qOa!#U_&2U)c=gA;{*C{M z@-sB_XZ{>pcJ7Z|j`q%|`7U9<(*z&lN}gak>7f@7Y}PQ3nxyDO~;Lc+GrT|FjO{=3$$&UAzcX=99cJN9w zpSGV4-$mUgCd04xK8>I~norS&Fonqupe*yL{pbV{_FazlPWPW6{?Z&uEP?uyUjNj8 z!9PD6(E(ay{z4;`TQB^d`PBcy2o$Nz_ObU0LqSn|Wis+P_F(|kxR3M%o8giDY7V#U zbs+Vpy#A^E+@zB_Ue}$j=bOwBOf#SA4=+5OeT>FZs7B01#KAihGR(K)&uZ~>Huc*k zk%f{kfRS{k&n)wG{8(Mblw&fz{EY5@r`~6uQdmq!Cv(vQ)SveHhw{7B5qEtMd$>Ht z6}-5|F*o^we9e6Df5$&uZca}q_1Mh4z$@UDk>t1d_sNch2UzBV|C0Rc=)Jh)uPj%~ zOYRCJ^vPte^h^C2uYb&kD9k-4)&Z88IgDmL)Ss7+_eQ}0uIXJLrE=41O)&~S68-X|F5WBXyk=j*RWd$fP%L;uD03-^X;G{RyT)Ss91pJKcA ze9f5SIDae-HO(n%W9p0eldh-=HvE9>!rP}N7Y{$=Hv3yD$?7?{!PRD}76bHWKK7rJ(>=U{x~uzpF!fix z{;_--LBF?L3>ZIX=HvK7Jg)8Jiz7=~80O>hW76gBP3$kfWj>By;G27sO5!W^*QEN# z>}!e1Q<3EM&wOmZ&7ihNPcS+D;2sto`U_y0kL~BQpH2I_-%9;;sr};x7VX_1&;x1a zWBtPh@c!}}=Ff3^^8J6{AIuJV9$_>5`go2T4EkpP>Th`cWB=Xymu|Q|3j@)j6Kdw; z_>0~btAF=#@@iY8QUA=x{Xf0@8RmbM`8fX2(hvAs^PcFB`1d!x{(;A?gVD1I*4t*Z z{(^b)-kE<7C#+plm1*XK{!dQ#z%3|!-gdph%b@kc6ZC}HDXd{W)PLaLImHBomcMD; zOye353~1R!q92y|;D3SFw11W-5ryej&uVfm?=XTi*Y!nGgPdJlQ`&&o`R;_b>GJ z<7h^S7^z8i@yakC{O1_2{At6@^%41B|Narne9)hGq|Y3RSL*M2{oC?iWdDlJ^H}un zFTY{FDgT1rRw3}bv%9OYZIEtX#vX%#fBWg z{FVB9UjMFq_vQlSaM$3$B_taD&wS`V8u`?Rj6RE15Uj!b7jWo}Iu9`&{$%XetRG#Z zSs?ZyxZ4XJyN#XQ_s5p`5dTp3HSe~u=dVt5Wl?`W_Wu^&y2T^^5Y2p}e=Q#|n@jBy zkz!5c!Go^;d7dUwV_Ju%!}E_b`}ZvKP5syM!|C^3JmPU~3$^+OUjN4bWgg0O%1$3> z=0p5w*)NixDSl;`Z{kNs{?qwpzRf9MnHTi;A|GEY=0H&YFspyy5xmB@3`5xbK>9N; zlt1u3ea$Y;fCv^e1Nf2xmidDIrRy6j^^d&%P5ZCy&*d*{-Y5MB@O}%gpgcY@%nR+e zmhalJj90do$6NSG{`{c&$6kM-{jz))g^o|3-^PIMtWyfjyx{-LH*X+6_xTQ9nO>fg zN$=7of-Y}+%O8c2&I8mx@%rb>-)_boywc3)?H73WCa3cN!+aQjwc-cc&;RIv{DEaY z-~Qb0i*d$$mHMY%|GfW^_u&jrrU07xbNt`C<#)Tu+$$LA5r%mo{?h3&+`+Tn=3+lR z&*tU(?yn~YjQVF@f5CpN_+#t_Jsjr_QEBGe`X5c#!#Z!2-!R|yAIAr`LG|PERo90} zeUKH(Pdp|+*nzXbkYilzKh!_>`nT=x_~r_*eCLnyYv$YbBi=;~Oahl!hTG2aHE5Vm z?FU`^2M<*L%(vSw$!|v;RzP%O^)I~ssr)EvL2*x;Dz-6 zS6=_L{DChHUcl=TIjPeHVF3_$&BuYb<| z#laH_qnS_J56dqP9>5#s)A+-DyBVjdyT5IjFApB@1odyc{u%qDI}0~a$c;$%@HB^c zaC>KWhwgC{G%(C(>=%V00k3RXzIR{R0zrXDc!2u1UjK~!+hIVUQUAyWTR{DGAfW`7`HcVb33A#E`1X2r+Pwx&{X4IJru~-(PbiOOK2v@-_}K|3d4=*D z<}>ZDJb1$MY+1f*zV2;4ouw1xtAFqHPvhsH!58Vzd|LiNgD>!g`PBY{24AE<^X>Yl zz4}830O~(<>)-JqfcC_1&3wE4M0`&NVtV;<0W9q+{3LTg-JbHZ5og*%do)G_-Z`+@Ezg$~b_$1-@GR(K?e`x4(yp_uz z&QN@wQa9FrI3oV0{;Su&UH)j$QJDMClQi?K_7l%t9zCX4x?|S|#iHF`hWU2=2lwln zJJADdzx<{T6y&S_=Jjv2-?;ptFqr_LnQxarbRBe%sWf({;uz-J_6vM?3qIb(^2z_t z*?R!Ul^glp&)Jp}oYTpECmnBh>E$r&idu1{vl)h~k(MOH8Lo84Thl!=Ju@x#bdS1w z7$mQAj&P25&N+wk*LTq0EEqv7f`T_If59uHzR!*=OjJb$g zQ|u_{J-`V6P4d4)18&!h6UjCYvM>OicUjDkS z*YWD_u>OViv-aJA9-xIU=)ZRCPrRw~UEHdS-HErt$MH-2-|@7Q3g;>Ajm~xuPKZeV zQ-3$F{}+?f^V61^E{)4Y~Cqrs__nQ&ElYi;XY+~UV@e=14{Sl-U-rw8)1FZ1D z{u7*j#{PwH{&3A19`*M#{}+BAXI`=YYe{GLM1+3f_(tda`E)gb(N|kIJWBhoXb%tH zB3tB*@IijhU#1g;oI&?p+=)NP(Y=Zl4ZI>1!lJc2T9R{m@Z&pAVlkrSZq zim#O2w(IWXli;Xm#MZ@Kh#D1dQLsau!?z>L^6~f01r*&~|bvA!K zgE0@>jv&&hhc{YyU;ijS<2f4R0BCUsi4orSAC9L(>@zvN&>kJ$J4XhZe$nn5D}1E? z8MfWI7KaoxboQ-%et8aU_KV{$^#fS{jDN&`exn^tv55*vH0VjCO)y$`A3q^KmG25e z`SZo%9QiN~-A0~*`5Gg9q<_R8&asgh3Sc{AO@HBo{gJuEpLZLR(_#}STEd0pR`~>? z`hl!}@ZWiRdv}M@mBDwh0lpnQ!%q0}*q21o!Uz55?N_$%?|cQDCNX|HnWO(5e1s7` z=s#~qv*mO2S4WHaX?y4XuG@ZD-2iC&{5}rwgI~gN*NWe$AH@1c@*j@(&yTV5jpE1A z-0cR%es=W5rA>TV_(*=F5Navz^11gH)zojUMvd^1{e9fTraPRTMe>Hj`tjYy3LpG; zj;*V_^^%U>BZ(5W@nIv{;TUI<3L2;%%=$<2FVB%OK~8>S7vNCuhx)JZ?(i|?t#HXF zkO-#Yzox>Y9i`{DE4(f7l<5G?MkGf)p!cls>W8rYo&9HUI8IhUF$+f+TG((ot~5X` zydOW)zRQs`0qV=R?%K-g6~@29hxR*Pjh|x=n$=dv*~&$D>o) zMlJ_AN-TY6g!k`?$P~*yi$MrU5&iT;7o`2ZS5Fv?UqT4`=f>7Vm7XN18Ar!4vU zcrkBvb@3Muu(|wPcblf~Yt)a(^k;t4^nHyM-un;4cPE!x4Ej(NuKGqR+@yL^2)>Zt z2>)@ZoWLKAPAAisjt^(S_xR`7xPHvJ_vjUhMxmt` zsD=0O&%LoA_229@B(I+L^V;l2OT zXw40Kv2m(BJ;zJ@{-K0CCNX-b`@#(J_r|M}`QfdX_tBG9{N9tGqfNJ9h zZ-n>pSN!Kj`#zl>f%*s@qs3x`G>%0hSmCqwi}Z)*r<%jNl!F5YTC*Iqb$ z7q4)Xh^+Vupne?d-}%41JRPDVp&0|bz0Q$^sR&d33*Y&_@V@`$+04?=)p@iLKIku3 zr@GZ58ToJuPWR`%e{5d9@b|{28_?+getf3C@DF9+`T-9ks_)-g_*{NB@>?QNBR1_m=WIF4?GeTW8k>~O9rsQ`}oDOo6CPji(OloK0@B~%SgX=83Fj@GE#b9#%vyynEt1J3hN*I4{0yXXwK(|*37P6 z!Mit4VO9J`3-9|My!g}6gB$JN_#O<}U&s6NXFt0oXxy|H(L0h zzg(S)_>Dv7PqBSzHNJ`Iz!FQ}8R3Kf7kD`WUVMbDl>cz_d>362EdlJHGkCiQ<4g5% z)<2g& ztem*ap$mTr!67nW!-LADqx}o-^~aKlOuzB$8^$v2b4(?-uYL1trDvEmJdGhRgI7I2 zX@&RgCodnPF6?5cOQ3#M>i@(e`_<9p1Camh>Gl>HdUF<8 zm%Mvf$li?l7vB4?lut|FXD`WdDDNz7ASu#l|H23Tk-8BZ7*40}y42%Xcl+G=>gdut zCEua%Y)^jh7_dxc=>x7_-!Bd!)Hmn)*Z9)zPv|dvXa6!^Q@{xC#~+k6;|3*dce|Ld z3C3L_f=0-TVm&k1B2P2!ZWRbSk=%p)1A4sr1nVE<$DUaX_WZRu5_<0~YaN&tKGa{z z^HfY7Z_F@{>4(YD%K_e&cz5|vxIul^d z5dGa#1La%cKQ1+kb4&E@h!BJ%{`b+CFblMrFKg+08ucx#fABxzXY)4l0ZKnJJDMD0 zP}85r(87oKM?7BL5p>;BjN8S54b*s}6$#THM)=77!Els86XS=0*(0=n;e-Bo=RX=_ z`IFXxvH8hu!tkr9Y0>UCb%FH{@hi+3%yDzp+U2!~!By?lvOuBG`?TPq(4&}U1U^zr$7%H^wXW&K0>*!MW5xi+_TWI8@t zQ7qy4qtX+!@WFoA#b|YplN?zeMHJ&;=v#FYG?J4>_6Ov#dnjMsKx^SU{k!seA-Eub5x%QGjN4uAPK3~I0}t(oU11fg_XI0^XTOO5+BtTU(cV*f zh3ld23-xAR{}I0!J#W`MLkl1L7lWT{1N0g0uX$c@9ap{)KFANAmL29#u>%gffEF0W zT!7=&0+1Cx)PK&q4dwg-Q?h`%#QJ;rpIzO@35=^Qe0@Uj5cj*5vv;IDQd-?VJa1*@I z!sqo*v*vUH2eAjwkyNk+0~+CT`ThFqm(YYq72l!9*-iLebO432=__@G_0Q`sDWBis ziciqO`}XVYm++4$nS2p%jPSYtd7fTCu^)i05-SZq8(WvZ%Yc0o3$ZVYc%!be{ss9v z{ywgMtBhZ@@V@_y^zZlwKAn8u2BuOzQZHltvd;Ta|H7yKb8X}JrLM95ss9%EiVx~_ z{F?Y>Hsb5?%LhmlZyZU)Q!ajbG~R za{X@_zqIhV{J#CJi(h6Fejt8X;nVna4Qn^N566{15Wm!?SpT&BXZ%3?(!%HU@5^5o zzl`t&`MdZr5Wj3){*E7rU+OyRpT;kzf5#8RFD-m-zfI$p5&q*68aaNx)y1zh@xyM! z*W-u!H0z(%-&-5U4=sFJe{XFZKTM_kP2-0ZK5c(*Z6)!8He>a>9`}uUhxJe6$6HDK z7{D7Xd|rQ>#t$QWF28R->*9yqgdd0>>NBi=UVlmX1Mx!(pZfn>Y5W<8A4d4x|9tuD z;)kuv-?iU?_@QpF{ss9vejt8m;nVox^zZnA_+cvLZyGzwfgCUjFANbZe$xHW{@S_HMp6bc3=M-ur*fyMv(Eg?4sUeg!wed;6Dpy3eTG zfUWS}e{$Zf0@aIe)Mr_L-~Nhxz4%58U(?@}?+?@!R4{A!ugMe!wt$XGLvSm+pFd&w z!^VfT6{tSP`ls?oJXats>KDt`!l(5Y@w|Jia{D&s|JIf7)-u~_`BwPUf1~o(7*Ks1 z>+j=V&wfkXD32C_?bwCd!~BQvzWwDq=I`B1ViCrdMtJYPdCI9BUdpPj0a@XF{V`9o zWw-!#w)$W)N8+G?Ey(KUu>RhE9RFx`;v&c4ZOmHYEq)q~B=ywL!u$Fc-c4fO^z)uo z>7l>y-hPe`6Q-2-t zz~LKA3YJCC!YB22_Vi$R6{kMj6=kpd`x)p4?iG)`}i&MbrChH%|j|EVFWQryraTa!9|5K6ov*_dL6n7s_ z4qDtJ|Ew6njqpDHy1gIt&yz83ZiU&AMgra0lhWKFS;JO&3Hsn)PV2n7#rk{y>&mA- zaBcC8uJW|}`-I!kqAGr4syv6hHR3l`c;Egy`F*D|`~-EI_3zssJ8_LzW8Mh3yz#NNGJ~$}u>QXN5&z`Y`wwn^ z@yWfLTJPL{@5%1o&4+tW_8xq3`+mRuY2khQi}>B`FFo46e|vlI0Y>=P{!i{axc%tf z_Wiv7L-@j869*Ej%=fV9=o?%MmZx%XSeOlqY|GE?NoUN;UaO(?Dq20NIrnGZ+XZvBn1JvhPe=q+x zzJcZP3(Jo_y0HAlH^$TDSU$}TKl-SEH(GeVxf7c;4@Pu)9~;*W=i?=9BE;e)u9K#b z;L8^4(z`eBcVh`7{5Q+PX~zYI8#wjrQa|DFCv6{D&2g)KELDzn32w7cgKL%}^{YA5SszX|Z(d_Majt9Ot2o79+Lrp?qxD z;nWw%|3bG&lR~^HoEP*XmIN`ve~Xtt;>8X~q~JE=_>^Xy@xWN&zt!{4Xy>NvT7}`^ zO0)zFBhG0=<<`P4d`lV~bjDx2h`Zmn z-n+e>-alPk$S}ft`(M21S5P*4hOO|J!QV&*^+ndd6|F8lzWOOj`Px5(P(FmAh4=mo zzKqj|9NS^@Mr3;BU%OI%K)HM?{DmO@wYOqED_%`TYsXnxT(is$WFW0}qSL#pq`0KAEzv=OxekI-t-`W42 zGG93Zr0%o+q5VCs@bOI&kr!*>JOBAix%`U#jPODJR|_AF6+YBI@x{sK@+7W$!1{;s z58US8t-Hv-QG84iec}JY`}liN_#(UGyE1WB{4m1%_}lT(`jwkMF2LZe@V@`JNQZ@A zzj!c50!u8SoMJEO;TvuGdsjN*zh?bI`HttD_iwhygno?um|Mt)bv}MD8*6OkNp~XZ zK_2g*kNH{d{=PTdL8Q3&#^k)uI(%!ioE#LbnDAEkpugvf=)>^{`-0;Ks4ubpA%3pm z=~mMC0b2N09(oZfhYKhf6V)2B4|74k7yaDcMYNyKGfeD9$_$6zflia z|ImITo`(-KWT@Yvr3ZMYK6bwh-GOC<5B87BhpcP!&|Be4_9x!C^BeU%^lCS2|7rO$ z^8Cg}wL7%5@D=$x9>RoQq8c#5m*mIzZ|w!3cA$LkKF)C}dFa(%z5X+vBX}e`ebmC2 z^v`&DHSguYH^PVb8QDMK{Vy)DO(%pMke>zq@ZwM&di5x4|55p#_rv~D9(pZ&sr?0h zAP>C}zNEkBhw{){;Y0u3mwzx1z50OlA1I%CRJ3Axg&QyOUQ`QTieDl>M?uQLxVM<# zSb7{j8zX!xRT{_7n6F*HY1fzUBYH89z4~(9|D}9b)Ti{%qbK}d_yPSRo}buxFZ%xt z${)&OZ-pPQUlK;*vgxz>%3A&1L@-@SQ@TS-3qMePrRB0DW_|fMQ9`HUwu*OPS>XrT z-(Vhl_3dl*AIxK~*YjQ6qvae{JN#>eA83D$$D~FvkG&N>j9;n!(*=Zae=~3iiuw-L zzsHO7UmOa4&_WBJ#2+eOc-$frQi5;Y#oGGk-J$wU|24dCyna7~Ti1_5h!s8=zeME^ zHa(Rsaqjx8IfDt~}uf|hCj^)-Z&Tafr5W)%{;!lmoSpsB3?`6SI-^u!i{(F#j$8i!3 zwD7G+bg{W|Z&yxYErW`Mu(QCv3hR``~F!GE3qZI-}8J*nw0v#-Gj zb7X<%Ut$?_l|RE2HVvJy6ZhSg4>cBeBYd!*pZ-inT;siPD2UYz|JuBK&u=#U*{Gk- z`Um@azWDy!-vq9O5Ako1r_tj$$W9-O@R|P626V^N^%p+)FPFdR^lzg^Mg3_5Y~cV$ zL4V;h{VRMyf8jIz^9`_d{e{o;#|G4mroS7tU(}yA@NK65EAjn}m`3;zf4TlD<>zl7 zX#c{u;#GWS-R2v3)B)@7`OD+g!DWmAE+cqdrfnqncXVkVFE7*a*1;m3JVBXSc;9{; zzg$i`Hrk7V)C&0%jPSnxE}t(Kmy!HuG`+mUrLE)cIg9yxb!oQDo?(Ue_PZkgU80}a zKmLCcQ@J1Nko6Dz)oX9P{i*Ape&;hcZ{5DLefPc3?|k8l@87%sK!54s?%tyhzWkMM z|Bjf~RerR8fUJYZCzG!}ou1C-XJ1<^SLe^3zj*oem^Z@v@efj-T)%YX>ZL2!+N+B^_CTxsv^c7rf0yl;OUzt`u#7k_|MmURr}y8v zdgan*4o8QVu3kO7dg+}j`)|XN2Up%cI(+-BD+lky571@)>ZZIY^Vc@zZJB?2Q(hgV z`hWV<*WVtE-~RNa&s_P;HRwNn`_emaedeu8Z(qA|^~&hz%GGy{juQQa_x^ixI(6%u zOU{3T)ID+=$r4%YWFd4JEg_nmpGoej`2qG!(cKsB?hP9H-J8rX6^Wyu@kIhw_*R6v zg|wl_8G+OKThi&`*fY-Gf9!a^qMxzs^jRIV{@#CXxokT~KYTvH;dz%g=mIT>y92}* zmY4CQoR)3F?KXG+}#7RDzf*XHl#v}btSpQb!+Ij61xeu{-^03_z zAr5gA{baOyv%NFw?_txz`}nbQ^HaM#QpfBuO&L-83f_MgPBX_QFd6@a(d_Pc|K4bE z^9)CCUw+|y_J#B5&GX~k@!5le)&2RiJLyqIE4;TK_0WC=eu*q3sEd8%PNw;Tmj1UJ zUQrQ3O;Z2AM_mkd3@%$_&~=|__LNh|Vn2b)<{Qheh4+ktJ9ChB4Z4TSmfw=rY5&$3a^h@4=wD7+E zDQC;pBftI3wok zbU%B^P5E;c$|EGAKEZKhy3Zson?9?jssF#?@_nO)_xeA6wdME52_x1OR z%kPbvX8OO{@_VCm{?(Sx8|wtU{$oPV|D^G2Pf{$E@Et}LH7T6o|8)%e;QxDmb; z$9(*1%jb<1-jAQ$edm7j$_5h%YL?Z1dG)@gexrr=^G8Yf;oTXLYag4*w)W;vkxb;<5RCBNexKN20PAHX`&r?A z{295^0yJF0z@fW+j$S2jqviy=0@7T9>MYeC>4FHRTNiFeo9Gdb=~s>ULn^iVPYdt; zpYtXo`PJkU`{v!)4+8-1$FL86>h6Szo?(Rd@hi?dgJA>mD0btB!tkfDIsZz#&rttg zWBo({yaL&QOaYlmaM;Te=&~?@~A@DJ6g%5u7&sQk9q7f zLFQo0p^Of1!sOvN$^7UD*^FWxjPR-a!taj9$ieUH;`s@@CpVxSDxdjK`WddUqvf;7gc3O5;1h#*>c?|+;&RBoOe%NAI?J|PB(KgXpb{`bqr zj^SgvuE_6qB~SL(khpEUaVxOJ^7+__e{G{Sg(;05$DyEr(B9-?!8a)uWmWH7~< zH6(p;xxc{1=eUv>YJ~Ux|BBo18k?8T+xLpImpgt7P9(p2&iV)c_55br?;0()|&^%DM{m(R(9y3}9TgiXoB@k&oukvva~2R*Ft zq5aaO8Sc+6ngLzlrPpFM&8dHIW%XRG<;(b%OirK=E0b?yKtCwf$M?xW4i zk9eL38h(I!$@=^FeZc&IxUtLom^~qR1=eMra*yKj;KecC->DJKTR0!Jr_X+_O(r0X z@WKDM{KazAWdT0JCBPUvoz4%>r{_uOsDI&u|3y4z&TyGFj!w}00m_DNx-K9N0_y8o z`;U1p7gI>{8Ees>g3zzXV+Lg!4gVT5z{k1xaFOi^++gPJRF9m%3LoMp%a4)!4R>fX z9tgo6&uCm0pJi6xDCvKr-Nimn@?C$DvsS(qKKQ>Y|Asp^fvFS}pOEb*BiZSr$;!vD z!Dm~f;%OW%6R71b%nIMia}Qvk z9#=a1SDNf7uom98-!e}L6x@ppno%b^eKNui%a54qPVQudgSW!B^f3HaE+41zv3rCr z#OA;1{#Cz__3z5Z)kUbJmo#DnhL;uuFHQrGHyf9bxT6vOh4=OE-jeVJc^M|V(asMs zWE{_qk^i4=#pd_<7;lX5zWwkv5$Sd4P4wGu-g}=!pftSw>A%Jb@BN2Hp4*hWFm(19 zexnh+&I41vN-EmIu6_~g@9U2Se&>9BH0jErpY|@2J-$WX-1~eYexrr=@i)x3-;pz{ zm)z+`YJGej@e)o`MvpMUd;bf(WFHQW@7~_<5`@7qI>hh<+mj!;{wVB>Um)(|0@(|g z0GF#2F(T~EfT~~2`Um^_^#XLeCvFZCbQS*C3JN9CP`hW zzQ)wbcRYIVH4m^gUZUok!DKXo>E}UGzl8M<{^RxU@qQ@&6oD+5ztO_?>W{CVhtu#7 z0v_zv4rnd_AHoBS@ICu;#6pvy`zu`KI~#gC`v+Lzd;SL=(}1!1WPYpyeDYc3{*C&j ztbb^~UjNm}VjS1tvRs9_#-sD*>mO+&BGP}q3(ct+Mei=8gQ@ZEAnR+L160bl!bkdJ ztTZ9d#{qu2y&V_#?T_gqdUuyxzJQ~CS?d3kXaW$b3#*MQZ1|#afQvzrkHH&We(EYu z>bKjs?|gonn}ExqkuN_rCg-QPK!mRj!kf4sK%(k!E_K#k%B+X@FT9UmN5msgKchP< zo$u5584K~)yp0iQ?*ZzUr}Ynhg~7W_9g6eHdkoKBw21|D&eLoe5-^S4buSv9`^1Ii zCs6e;Dkb7|zb3p9-nTz?5;=d1^u3m zOfS*t1Jtj`^mk5*dlM+ibWAE{CJW(FMm}2=+ z7IP1xDoW!go0m_=zustHcgJvV>YWc*bhIAVv&K!|iK2dG=Kr4WcJ16V5B3+HhZ=9vVQ`nbcx#EBvy&G| z*<=9qt62YB{uNxn<^SHgw{vfsH!YVW(8BxpE&AiY9j#uvvr|i4g@c>$aHj&@N$jlN z{bPi0D1g}g%1D})uk6}hB* zw`ZRId4dh#lzOd}1xEdvqW&GfCXI|1K9T?8;}2=U>76%u;{naPy(xp=H_?t)kpWDR z$MnY*{_nP%g&@Ppsi=F}D=k`1PQZ9#v}iwAGhMHX+AM(-H^ z37^!z9^#^q)D`_O!YA#Id0MXUk!+iODYZXam0ys7vZ;La z>sbGS{8S{_Y*2nJd|Lms@ArM0>%+}A$Ef?d5T;swX!}EWV}(!Rr?a06wbBuA2rl&i z>esXWEg1vQwCcP^#4t)e;7Yf|Kr+^@M{Fn z!WZ<%MzZta;0OB~;WPP{v#WC6Z3kBf(`{@NJPY$Dwp>2(yY3ATH^)r}0=P1)ecZ{=%gelp@rX|eAkEPZO{mx#vi&n>-yU`b-P%cpRIQ2@~KK4+97_Mwk%-q z6Gjky7gE24^-t};KRMpop$_+=d_oEd`IKmn{{NMD>~73>BYbMVUiojj+nfthSmD$9 z3;g2`>EoB@3rd1f(m?%I*1r|G*ncBlYOM%^(Zl@F=?d)-uhhB zyH!^^UV@7v#%FZ<4_cw>d{ z>+g8jFV{bnLH%~tzwdvJ=a@sCAeq#CMQ13xYShB_+Yjz;$Lw41KL1Jl%>OXL_w_IE z_{wwsrxm`hf8gB*a$}@lfjH?y)bC*Zv-rb*$F4^PB%C~`_W&(?Za=!Sb_;)vw}8oL z76l-B($(%dW%K>v-@4}2Z|wJnzy5aM)$c6&KkB%9W1|}PzjZawkI=$r_M=@?Zu^h# zJYRQlq(6Q#!l&auw+k!cxdPtFI}eCph0p9C%BNw&>oECS*IX3n37~!#>z~D+l&{E6 z7SO`i%MW!A0sNinofVDnng6=-cWE=rctLa6WX@ge%v;^X_^hL$|3LX{dmnk78T$JF zZq~mgW$>TGe^;RAo%#ja)8A|1GyS8(+QarY!e{nR`2qXeviuS6^zRRRNO=6Geh=$k zmw(uPTKLvIE!Zz9f5?7jpnRTq9JZeozGT0^57Lb*573+V~^l6RWh(Duc znJt=p-HjJ7;6FzA%zkP4NTQJ>bd$D5KdkVX{bC-YxP*?wXQRHmSpO-%wY61ygcg24 z{x@6j=z>D}t5^Ud{Gj|{;i4t$IiJqnyBNrUG~>1K zS^Ox?{`X(L@GP^IcW?1G4@cM*hrS$kOeC%Se zi^fNp>JPI1Y5zg%m1nqpa%(#J`b&&Hqz`rdNNhdCf8kUAiJLq6FCIWTX=2}}CmG>W z|A~33zgqM}`xicKe<{y44d1;H%b@;Hss6*?B3yON=VJJ}vw;>qvmb>!(%NNfb6y)- zf5$rgg)itI_)Y?6!sG$AF8?8>zG%PrpbY8{v;M6-HL_L4m;Fx*pN^lLp%T8PgAu+^ zfAa1-D1KvwPus66Kjv%2H|meD{ssFZ)LegixODix@M-&Z<#&9wbojsUh4uq}UFqXv6b@YBlpVBKKN$qVgbzo z@E4sD>QAu#x%}X1-Y4O^FFIbAc}#oqd97&lLDLYu_irP77QZ51BrdO7fFY(Uo=L;&054;w>uRrn78*L_0BU8W#pY^}6f8gC?FbxrW(Frd9 zSm9gwUB+((p1Z@CrO)cmvi<||yYhn@XYy;|TX}F=eo}M&?EZ}wKK0*}A8`N12;Yi6Y`=(i))yCm8uDl1 zhg~PXLpvwT+o1aMrS_kc&t~^toIOAbU(g>mJjUYd9u}{n=LO06gAqRUKlk^Z$NWvi zXZ~mFygM(3l>N~g97T{+0QDD2?cbHhJf&L>W{-#TZiYT$hE$%4_AMM^-t^Xk!HH|!y2Bfs2KOQD%irtgkGI07_H(@7wB5Cx{`7I9zK8YCi;m0Zo-Vkc`l}`X zPkAgqxG!$c=T9f&RDLad!G2Ocy03^%qbKTrZTYSPcmHIs&Q1_3e8GO9d^A7WyU=eu zc!K&~*1zC?9Up>k{~22NLj4DR$bpRT1^>zMwyC;G_UZsk>|b$~ zOJpZUQvVq1UyvWWFAm028Z<0!;ZZ%)IX~3G7s@|4!Qpwohr+)}Iw<o->Tg8$+SOvit53>QVYQA(el5%ds`5s2?Z zF5+#f>xeoLjPP0iP3`x@mB=%H)iz{>FT|e;-<3_D)IU*e{}i?T`2~)k1^a2?TX}5M zf1QqAP{ycb#c~XoI*+4U62CrsDcoKl#e^Sr6W;YdToVD559*(+*8l3@?2F^^+07}E z5mn=d7QWDaQ2QJ|eB3Ba02tv5_1EX~;0GP7@CE)M*ly|pCE1{89~+jjjhV>u5E!2zK`9vvxAq?fkZ{SkLsUh z{nPrJ%#OA&ZI8fD8y!}?ds52e-=(88zjE0oV3MYru()Al3f@*g|0w01%d(KWtXEOC7IYubd2@IC!8UmO)5eoJYzf8q1` zYvv%BCloBJXc~`}{ffPf+JY=Md%Ux3mYe!l(LsUL%3X94AmnigE-~{|f7$ z#=nlAzj*2A5m1f2*S|&!pT-~0)5{x)?#`lPJ-6?`M)6{@xu^{K>Mvq5g$$MI&zi z9pA~$0tCh7gB3pYUs|tuAIonv{WGxn7|&4uTB-fVeA0Sd9~#S`g-`46^zc*t-M8ia zFT$tt7x_Z;ME_sr>B`V!n(&$&+;o|IYY80Gzh3fxcV%dgr}SCNtw%d|A_HjQQ~xXR zp(Z05^)Gzd|CaeseiQ<1S$^a>n;-)Xy};76O*9b9B9QtwiuwoM4?!#L-)P}m(Te@o z-4=L%7js8PI082?{A)~=-_bmExufrmmQOkN$&OBphhJ<_ekz}MmfAnZ{~npIQGbK= zPwS6)h(DuOxB1fD+*uq!YT;A=@A$~_W&amG_5YZ!E?qiPSm9eSOlSWczIKMv#Yhcg zRqqJ(Z?gV{@_T$K0%_s<`tRM=-hiae;cR(tiIdnaf^;=tgipsG1VsEm1z6$J{ww0~ z9^Dn+?*Wu${j2gz4x2l&nL2-h7QXL4B7c+vCugYw%uxA$+GpSyw#q-cvx)uHzs36Z z?H}<2_SeGq?JxWq`y1i=_6z)A1F-e-XOkD+0qY8=f4i!`@B_w2{b}J_s!aUXwZBK; zeFc^>H}T&a;S2iDp3dgaXZOde=SW0RYr-dKs3@TvO@Oxj`8|1C<{rC+V+`U7?7cz$XrPukQ{iy$d z_3!upfv*Qo@LKr3{iI00@LAbHYlN@J&qFsF!*rjz!2`AbP531e=i_3Z{^}+4{|{OJ ze*6>p*90Ife82si&8O2l<0UPk;89!y{Skl>zHdL;Jr)n#i^IppR^=Cdjr{6AV*S(p zN2(m&BcFC=NAr^VG+Owy{({S_seQzM;Zyqs-px56g8PAdHhM(;3!m0s;N`|XncwwkGFZq9w=j5L^U9x^UzJeyqU+p2OFclmAGs36sug~*0^sIoo4_5fp ze};IPi|(GG{*#jb*LXcol4s&EdVs%${&rY<)W7hph{WS3F2Cbz+N1u3PyMgXr`n_b z|I)Jtl(|(88zjQ{<2N ziUo}D>G*MwPb^@CFV%qa%w6u|dhkP=H^P_f7x>P0iS86K ztnelMUG9&;+C%&QFIoSR|3-W#0Tmkkr-d*1Z;{V5Fv7R;%sBq__+ITnf8k61)1^+V z8$tb7tbZx~2APW@c`#tL83pX!c)H=^Y0`2*B{%la3~cN-8A59p2GwD2YWYam`~QvBNg-jPg`IT>-jGt-Uwfk-~ahg z`?12e^32%(I=*wDsA%_5{r9YY$$v_GYJK>>@TK~9n@1A^^xUU0!k6@q_^JX{_)`2T z@|gnae_;Jf_UrL|_i427rS`My7Vw7+V1zH(FXn3ou)>$xPnk~*p#DeJzhwVD-#363 zzGQ!YkNl7YjPND@OZl<|tnelKm-t)*^*`0?KjoLMHuLtQg)iA}4|hlm=}ylwgXMd^ ztUK{m__F=_d|La6fB$p6{ZnfVu_t;NpmP0xTKLlVE8)|@jK>=ze9?bUzVCZ+djKwx z;yQ>Y!0Z73!Dum|-4{c3p#GP-{wZIs11)^X|4MxBe@6ILEE31>lrQ_A6~5$uU!JVi zyuG9T|JSOk1 z{1?|Bu5cT2J@@xU_>%twz7sz$zOllW`VVC8pcz!AsR0okHy%i!{&&_tYri4Wmv3|a zXFiLlh0p3Q@GgPa#V-G0R(xZG&-^Fl{rqQMIOMl$uqlPUCnrq-w0o_Uy?wqwE2(pACO;?{_vJhiJd@_|J46kum6~@si1{# z<*Bi$W#95(`DR`Dk^!q$z7;;}KV1Ex+TOahrUKOe#rjwHHKil|316yzl>g3};u|A; z*8aWx>+r@7$$v&Whs694rm%gvQU5pVpN${6{En}gztO^%{C9FTTsFCk5k8AwQvO=? z8#^FBx7gulsQ;&4|Fq}#>h)nAwD2YSMSRtMW=;9xz_s)Vja^gzx(1;B-+KL%{OcNk z7QWPe+@9%S^EXELQu`r(4c=JcGyi)!d9ihSyr7FyaObc)zE|ix;D74>WBm&}o&CVn z2|eoJo%_3VnjQyYCC>RDTKKH}62xamF6IwNdq5+6=Kpln?iLaNP$E*d?KiaD6mP8X zS^r(z~=*@%t}tzdV>y_GVNBbG;*sTKG(V;df?_mScAaGo0GE6h`>8{`_pyu1o&AH^RO_4raYkfE7NiKhI0-di-JXMNl3e)ZZ%kfAZ(m*hA0J zoACZ|Uresfbz+!T;d`TB)W7g)`|$;e{>iVd*zk|~+pK?9f5~YXTmruw9gVm29PMBn zT|P+q3!lcnq`)|hUhf2%5xy0Pc>Gl7gW&SP3O}H~WPfzmcl7f={TXmmk$3Ieo%gI4)UKo{s})&fAzyZkXilRwf-O7e$q2vqlF)6f8Z1U zNi;CR57M>U$!3&qq~-ymkskZ>K_dGKk;4jDKx)E3tzTBMT24c8{y0T+wnE~Tj9(0@AJ70 z)IVhXH|2BtYvIf7=lB4_7g#WDd~pCU!l&a;udVBEj<6AqjYty;RB6$FR`^!FOXF|G zPLH^Yib%u&De(>>)(`5Z1qJe+0bqgB2UV zKQmQ8zcQaHV1%#8AC+GSzL4JvU-sWv{;~no4`uz!<8O4|*h4p$F;qzcEqva893y)c z4qws_?4o9}bOOZ)pSRzHNBeibBO&FR-+e4hP7Nh zI14_gg)hn<@val2G~8Jo7~zZdEAiPF)(T&&e`oFoY=k!?i&T)DKd2u$pnuF)vQTN^ z^Z4oPU*uB(jPQB?(jTtk zJe2MTN_dJEJ}ZAY+S0qblKum^`{@qE`PS!0%acIz2P1r@Kkl11n9ZR3ok7oTd{}tfg_*CYfIRT!V3QbbzYvD8h z6&}fh4xW0HgKsv6VT8}@Cp?W6ZZ4O!kl_=Uq~bSrkUuy(7x^jpx=twL)sJEQ%kp=; z?}Q+J9DW)td@IkD_#^UzKf@x%_H4C4`pvBAJHiNG*5CQsuG@H331C+EEPhG(?$uj9 zKUumAB$*iM#}3s$_-yVjS3(P4wjbUfS8fAtaKU|i6<2{7EMIu)Ktv1T;|j3Cm-Szc zPe%{ub1dG32Q1GI=f~X>lw$p}{!dDKKANn)7BwIT$Kp3y__F?vuNRIdnPU0Kn|8II zK&9ltR`|62g1`2u>zh15{kT&7ga6dkjV@5s!l&_TiM&6!>~MkWAJ)WgBYf)r1AJnA zjQ@pC>#xsq@88crq<(y<{V&hP&s_p}m;J1p0p#_RSOhJ6W`E+3=8MzON}hmjn|lA= zAjAlt*{{d@x363RD}3tzPX1@3De|9F3MJYF1p!JOsQL-4f7*Wx@v-(8{|TSjf3?8z z{bzK8*yNOwFMIR%LZA^ovtP=0K9of-)PGri;jsbr?i5#f;T0_CpUSU(BI}>oPk6V3 zht9s@0n~d?8bMN_iyvC}p8RlquXg^kqtX6_PvZxhYbn`#r10VmN>=#He_Yce{%p#} zh}!e1^|-6-GXN z+Zf@q_TP=Q-Rzee4f5bWl*}J&t$aULN1N*&77g6xIqD~~{#pHXh-)-*hg4zwu7xkk zPm|w+Z~v(O^}NWxeTu%cr+^hcYkw?1moGf-b3HhrBRz=))lXsli@cw|pgJUb^6v?+ zg>U8CQ2*WEhZ;CqjE)l+zZl`O_`~JVl~>pRf^+*KK>rDLNPf5T6ZC-m>Zh{)S^MMi znMePf=pQ%VMhjoGAGT582I6Y$C0iKbv-bNE$rGp3tvw9l5sNW~r}#zD$Nh*Tu)^p5 z%RJ7no~4(dq;D@6|Nk`Bza?StAJ-p}_C3edL*vDk&;KQ3kEmq+do6rgewF7gh*9^i z5k74{ecnagLjFK2d>X&|JnSa*kj8KI(@XV_y}}5bxWdvOfq)P3HsbsQj}|_y{{qiA z?T3!ENBzGVPrH~C-U{E!w^Dz({P1B{^S%00KVu{P<6YFrGqmto{rAiFokunTFv4f` z=lR7m*MHaBkQF|SAHn_wJ~3aTzKQj($iH~DGh5Y5$M{G1iv4?hS~}`q_=^85p6zm1 z9tDx)5mxv#enk2|g69t?pgzv}XYH@Ef6gbRL;qnOTi90N42wGqknyI%FLCL_@z$+% z=_?y6d~UzM`v$>Z=v&d=cM?VYOx8cQpYYi6h`XE?n8R2iC1T+YK`ngRe^Bm!Cx6bn z@Ex1L2%r03h38fjJ-`Z|*B|qHYwf3g){y?Z`Z4qnEqreO7b{GBV9M*>&b@8Unia;6 zk@WC?;dA{xk0H$9B~VuQJbrlIXMPV$Fj*K>ZQ1{G9vRj7QHk{Mf8jIzY4WYR`t72d zjPt)IPcY^3iKosV9l!Lv#q2wH{}H~Gr;58reAn~gQxdxgQQyq^XZFi^r@%d21#^=1 z;9B^s{X{&wti&&ViHf8!!dK)^lJ8|*htt>!pZSk3A8##A^e%m4_7L?6)<5H?OWeNg zvVX#8VefIF4z%!D{Re&}pOE_(Qy-a4eiWnbUn6|K{mjPCcgM>m zqUPS@;OTf(RKKy+@@JU*bEAhr1E|+o|GxdO>V)g_*7=_nzOR3o&;8G=*SU?I4y zeq)92`>&M0#(&itwf3L#H5bxr_;vnkgfH38Rldxh`}v1_{mBZS>QBQAKi=epYyVp` z^l<*CF0%e<`NUtn?iqeU_j~*dUFEwQll;=Te_qU+D&O6h#C-RA%v<5p@dwEtu1sP) z{2J3}|391c&+NCDZasSVK4uNh`4i?p7y1tegAfU3kSlbS2T6*hkz8k)8ZQ= zd@Il8@hkCer2}uS3>TJ89AT^Sr+j#hl;eM>H(CG8evp0Z5hqZ_39iL|f=* z-TY52d{+M%Unv|9F~Vp5NBm~*KXv(qccH-llX)Nfe~a}``)_Cen0GG`#rGfK3-u>F z>t22T5xy0JM)oH@8Ng>%=Ljo&+JBv&PY$;p;id{SKKJ>~{1mwy^TjJXL0xA3v--<< zmZi{sweXq$=R8J$)RXrGFv6$$KfAh*8$7PkpkW2M$BTQT+2n{Wa~3m&A6EEO|0+-G zAIUS+71qDZ)A|`5poQop$^t2UvpXQQ@MZZiZ8Se$9E`toK3|P`Ws?#{_|*Ts{0aYP zIXX@^&w;lC1@)N&Kej|KI{){imZ-r0e*NabG`HVaNO>3~|#l!D%9=vM;>a9}y4}Z^mZSV#E z)553iKk!ms=zV)H5k~mbevbeAe7Tz840^5WMCtH<;nV)x@w+c^=k+OV|5?@_q24a( z|8jInw;yhB|DF~;tv}({-kyl|FMKM$+(MxyL)4$=RptH z+dKjLsZW*s-<3bZT2;RFB_Dn_TKLreBHnj@l?^Or9q%3$u41IM;G`S0bv~@#M$&js zcD_UZsO#1G_q?;*#qf}Tx({0TLj7%a|C{jX_`wxM|2$zKp15_CC#XR-XD5RdKJC9c zel>qOo;{&WcqJP8f4ZQ5eq~r~@)2U_5+5$Eef%L#P+}Q%N^8j@&Ia1aPM?hMiT?y% z*4^*o7$$CyD{TU>oA8)FS-iKHpW`ToJUR%W-eLWd_UryA%=%&s<%W-Ls2*s}cHYIEL#r5yi5eTMZ<;&+xWfvlD^Uk~G_ z7Cx&#zg-h=@7)GqHe))7G{Pt2PoM9~g|4U`vUeX6!dT(+M`O9U{(nQ_&r+Au5Pi*cWFPffs6dT5k8T>!smTIJ;Dl~)Su&b z-PuW8TQ}XV&R(JY|C~boJ09DYpHlWv-T~HM`C$dL@Gbw!`^SoWNqW@3@X7e6z_Z)- z4{=!G`}Rxa7ak5Rg31r|b6NlO!Wn&qfHhDNc_}wMYHmWc`!)A!RWi9)u5lF|_bW`|a~& zygm$JjPQy72A(jUzAnPxt?;S+*;d`WIX%Z^;OQAr-73`o{$w^;{#Y$_^kda^0P&*Uhg^)b-P&qgFLoD2L<%^gGWsS-Uy$x zKR3jZke|)GX5Cj~g>U7FF8&I?KKjG|@38)<|GHTd_b61i-}PM#fm-;~|IUwO+204x z+V$~`5k47z?Pt8K;FS6wD|{0F4siB@CtSCd2lF#pJEyG_r3kFH3-urKt{1s^h=W{o zg|Z)+hx*gPSIbX%m@}a6gAu-!ubt5;?GCU1_=zL`vvVBzdn8y;@Ob+tOMhw>ny0= zE9rlV(_054-mc_eY6Dr%#}%N9JWW(xJecndy$D)?c5eu{8T{Iss;@ zJX|dwdlqz1pJ)A(_UoKbO5^iBVF>L;lHz;xLkpkCe@yqMFUM$u?&xqnof6@V5x$i# zUD3?r49%_cqa$~CYc3n{d-k)!C-vXssn^0DvO*229o9eLPgbk5Ex&6Mk<3T20ZQUP+w&I`|__~fc5fg;rsOu>&=#DIDPn#GRIN|2I`h0)47jE_V4KfX}@H8+QPkcg5|>b!cC)>&DUt*d-f~yekvxI!3dw&53Ln1-H$(% z+bgS=Z{jJoBtP@`mtT2(+bK-HH0mDfpNv14U&E3*hj z_+qq4 zZUfK$%k>Me>LKf&@LyfdXIp&x8NyZ=P3N{J3u@t8HYd-2rM!y<{hDLI2%ofn$8WU! z+}LXQn`n>s-`zs}yYkuceit2-C=Nih@Jaob`CmCwA`+5fP@_v>$?<<~~- zvHpqtPtW%;a-1Rs4^A#%2B^zE(;I_n;ad^Njo&>_uYELyy8Ud7LwKdvzs3xepYl%s z+z3|qM1NoY5%$eLM9}b!s4#$1k68aCetUj4-#tG#(Q`~h)*hjSPxPOT_HlR67PcO~ z(T2}cm~`Ije~j=+{EdP}bnG_1#?e=QV}(!r=M9qA$0wsV;tm7Cy0mi4P`>X}tdkpV+_5hw`KF-&o;O`-Nf05=O`7HR_3O zPv_W`ng?L@W!8Ul-i5QEgcd&0-|zQF@Vw~Wh3H+Z9085+N&UH1yV;`?`^4kUj2`+pYQeq&>Eny^h13+>)*UOT zEgk+Zd}2T0@dD|uU#~vF*5&VCpI(q(eMh1GxinnH%9n^|Il93xa5-fjjfl@ zY&d)%J(&2p|DnE<^)Hm~%ZvM+wDQRRg)jJTe0^@!fsF922o$xyKA+j15L=gjlk006 z^&#t@#BY`srG>N?GK)(l5kcjL7QUc=%%{E-J;Ds~^1APnZ}^B3@mBbx{|@rYkW&T` z{yxJ9Z`99Y{geJL;{CYCk3%pimKZ?`U$$T9^rIW7z?F`yuzl5%zDdzrL$c`z8H_FJ9l3PGf7~)A}Fcv-V#vAA5e&>%aU0beuxf zz5*}NFc}1^1J=JFf3N)f-IFxY!YAV&KjDf9Lh0iNuJ3A$@Jao9o_gEv`j&j@%^A`P zpVYtS9YI!0zHprXM;)^M#qx!Zr!zh0f9ef*UwWE3pPyh}f$t4I@CYk>(*AsbB7gF$ z7hHa-aiRVb0EwfM>zmRCXyKFoC*iSqkz;4qpGA)_!YBP-##0(N+~s@q8kR5<=f!iZ z@OAyeDtI3TuZ~#%qW?PkNvla@>J-qz56KVzkpzN$5sdId^82F6f8uw4lEMm~^uHbu z`IBEW5!CUz`tP=nvO9IU(clUZ zuTdwgf9AiNrXO##@R|NqUepdhjPRNNN&0bK^zut*@T30v*9JV9Kpwb{g!q#)K}N) zj{xA;Bl?ptTKJ^@Ov~%WPtJNt@r~J}{Gfind@Fn_kLC6!`n&RY7+;zGY}C_&{+KS^ zFnx2Qg-^;K;8X4K{v&*1zdp|nRG2}x!YBUc|N8ZdqqE5t_Hdrj&6UU{&~x8LOq?X{^WGBa-Cn{Ax8KC`Dqbrd4}o40^V5Rll~(ue|LPa z7}pd~r>uW!|3v>?Btmg_F!Zel{fBus`+Ivne>y2jkNOwBqQB#DiuPP*Zsqf?1kS(3t#r1LDb1%gfGhvKHi8>r~oT`x&FXM z3)uy{QFGS6>_6)_plIRC^810nJ+}#~Z#~q%@a6jVR`);q8d%|z{?pe#r(o&=z>YUZ z=K|_%!2dl@0ieLrQ?&3&|CN>B1%UoTjPR|9@Cn0FgD-5ZD;|8@_Gw!m893;ypXPs0p2 zMCdg^wPgKUQ7ZC3{@WljPEZ#1@981lO#^My>Ya=VZ>;cz@sIaA z$A@81)_&Cs)_=f$czsUaC%e*7|C{hZbp8l?QD z#tgjr^6&lIBcT7+S^sqW(EYvdL~D=G!l&{xkNpelu77Ausr+7Z3G1-=^#hG9m0#ey z<*U?w>Km+oB7c=nmVVrWwD5`jdVKZzfW`=)w7&xHn@}FZt?)_w2z(*^e>Q`xegW&B z^gly!qw*i23D!$T z{1d(vySVl@z-Q)bOu76@`g_@m8$HAdpZQ;f?}eX6{X*71tG^20kKbDO%>F)o{JQk_ zjVYJ!d6&TUU|v7MZ-r0o@6(?TPTe{ys$azVr|l==VKPZVSW17`XyMcL6Y=$-i!0v< zpZZ_Kv&m%)!2L(ug8=&$V_(dAoYt2{!hhFzZo{~(R(N^qrHoB ziL{+E(C~lZ6aOQgPE5Y;FAkzhV|g7UKY(e3PyB~@y#LC{f%qQPSb4}{hj@Db=4Z*~ z`#gH0|NAAZe=2{n;KG8_#g}ydPJDPBC`?iI2; zgKdRR+V6SB*VC^y>X)+qiT~v3R|lGr7CyCKlKvD6sLAg^cluz2PvuYk-pxZ)`#<56 z_Lr6yY~SmAP`>(Qtba?w;6JXvjnl6-TKFV>xbk_^DxcfP4)I4mY=lqRf6T9I|H7yC z&(n`q)1Nl#m$Uw<{c@gk>A!oEy|nOY{pEZ${b^%_PyB!L^o5NTKJj12%Le9~=Q#gL z=a9>dNd1a}{w{soX6H||@GThw|2h8=e*Nhi_gV zeV!XOFY4*{8ZCU{e;vOr{a#~)_wpZ4Rww8CTiEh&`4HzW#|!`C?CJ64^VwvzWIOwR zt?<76(Tc~7mJU6ft$4cgMtkAeyI29n6~vf;LkP$3o<{rsRjj`+pZRn?*7vIJ z&Q2V*x8{e@)!XhtT6o|7Q=SqJjt(&GPG&#CRfgCHx=OA9H^uV#+$jDW0|4xTUbqaz z%N8k(+Eo0;7R#T_TYuY7djcI;0PF&A>uB*K)UPSk|031fgXlnV18Ct>{c-s51+Fbz z!DibJ?m~;vp{vEkh^}*t%Qpp{j!xfbkLYjVbMtlz6O3n64;P+g?$g*z{>kNei;O31 zv8d|2FC~LF2%>&1>+jp|(9H*P*IQe?q0fjy47^ zFEIdpIBuU}1KEu>=uRKhZ(#j>{LRbvJP*U1McWI9-6OQ{o&3+}*p?e=jz_Z=znzZ} zbzLo7>V^Nt2p`&yL~b!2BKF8t#5-t_cnzB6{g18iGsF-?kHz?GymIF^B`V}65Y=yF z{qyn>X|e6>{EQM<;5mA{n94L_r#pSp75;2==tAB;dTa{*w|4g0-Mxo9_uor-BYfvS zY`?^Av<%V~jE6_rtb96pd*c(>@Zq`)8nIEe*D!-uc(NjeiQ5O>yLSI z;K^uuXFMIf#Og85z%DCK(8Bxir|>9i`HA)r5o<9yqgUn|pP(pCJ@DE5aM=lAg!lf- z{B*Qj?P28j3+zAFk?;aky%dB5MykGm@{7-iD-&%9)Oy@`|)u*A!X?o^}}KGh#> z_!K$hNb!3(eTuyO8vTChF-CZAe~fzD<>c$!+(&H~2*7akKcQ_MCn3xV?=9+&?%o9a;pW*sYTwpfE$n^q60*q%aMDm-QpS!^> z8tv?Gv^bQp^Jv*V$3;#pe$ps1;_XKK1oKaBNOzR;>bJ7~-hYs}>P9<$fp&)h15Uw@ zFqcBD){V$9_*#CfvmJfX!h8KsapW8$me~!c%8`tIn~kUKcsf4CSlo3X-7}2vt$cNg zTgQ;A1R=K@_aOd|JuoJWEysWr-uo}6ytekw>AtYXm_0k9L+5n$4IM+k9#S_A))kIV z>bIr(ui;UD3EpVoTlqTTA-2!L_iTbl)-N24sq^$I;Z}X!rWeV6mX?nAFT8JmQTdSd z!^il4z1tt+XQf?CYW=AH-@*E~^2Dh8jOP(hC|Evd;S2g_ zyqgs0m2ZUi@6WaJ{lh+>@l+&)t;^2>e|YiCokqe+0)>tUbsyF5Wc>^Bdp@k@?8$+? z_!(MwA3q}b15cZ{y2~tM8vZYQL4VI<*5d%9*Dbe&c8~IDM31n-ckw5*f8ig0Nbi#f zXJ|`kk1iE^_W<>~SpRzYv<3LKzlVsL;&~K)8!dbx{z&<*89$_#fIWJu>N)bm6d<$j@%s*=@Yc@t$f|Le>xeT((wPad>1z;4_wY$ z;p_hEcp4B-pN;R0&URqP=ppL&vi@=WJvm%-o#%og@Q0x^-e*ES6jXE#zw$6wChW1{DUqnv-L;XJ1KaPJS|3;k;9-@Vh?N7Xq*RJ#7%VXFQ zStT0bbNv&()_IZsoAI3!dBx?Y`YzUgP=42S%5_Av1{ys>3m>Ac0-S^AW0!=jR1peK+f$+h2nBz|J*(gcd&6-}8f=7wIp2+<%e% zgvaPD${~pUn-h`-@f$0A9KREOsPn^P)bD5gEAkI_e&Dt6t%&5?ugE{#`GGOR{BY+7 z-U?r_pXVQn`)FKAidZ1R;)nVJtbc`vI=(8r6DQ%X(ZaX#$V~r;XNzJPL2QUCXt-q=5Tsm0+RoE7V*>{Vf`cfXS{P^cmqZ;S>H|N>vjA<-$}d?KCZve*RARMh_^%hn!b;C^+#F% zsQvnYx3=#gUe|eV_-gDW-qiWX^~! z#F#k$pZa60f3Uyf_vgpw%Wej0*)o0M0;ZtS1!OIJ@IS|g)z2knvQLCQnk+B_?sf$D z(xJcbt$cNw^6syNchBlb{$z{1pL^R6M(_*KIj{bB=KmAix{j$oI`lbSAZ_~g3knCv z;}$CkG?AS>Know@r|_f2@i|ZT%?B4@OwRkA2W|%SwH4PGtpfWEeUwV6n}oB%hx+gM zU<9nX`WpOPUV-XQWc7cJI>O>_yE+-msx1#Zv6ei2iGQ*MC@p+fe#9dUEiL=5U<^F5 z_y8lkx8Dq_$17xPZ?S&xd~%3I1K|7e35!y)t`us)3g5~%fyduss(mgCaI|w^iVF#P z`PbE-Wc_~wy3j@8s6uZ8#R2UGTxZ?QdG%rV!2SzOt}fyI0Le?+!%S9c_` z5kBZYcdL}NVmQG9yxaaT#?-%CKa}azxD8t2egA`<546fzfT=>MJ4*MTs6UnIkL?5Q zuDW)HW7mg0ImFE2hZa66A8T)z<-z`!B_`0ZZ(%~&OQnfNK0niF)1>w+LL7u?)#bo7+@s}s_^XZ{m^WKLXhp-+!6s`A@ z@$Mn$pOudVHy`och9e%iw8wK?|A|S!JbX3k&#?a9|6C(==>kxN}mM7yw+Ksony_e9a|3Az6`~J&K z7Gne1A(}34`a-kaKc7rjm#~U0lgMrN5G}mdUwHXLx^~jl{W;&GKIU-L;f)bK=ueZ? zH(FVB!rL>iL}S?yi|~ahY%9F4zcYHlLtk}@Ya3uYn9!}l^4_U^%we2hJ??2YgRA~r zra!+Rwy#}y_S&016woj4`Xw;>rBgr)?@h88J>PzT-AZ)Z{oec`9~|R6DmNF4Q8e=8 zXBgqV{(hu$59?^VSnG6)Z`3H4?icdNu5f&^!h8FB-c7Y^-Ev(Y8XrBu?LKmkiJqYT zJnO#!kBQWAoAY{*$7?IKnH$mzK@b;#qw-CeztPgtE4dCyKEkN&1aAeCgLaQ1c*I-b zz5k2;H`?16wcMF3{3B=(lPx{Er>MWc`uBL3Jrxn~aQvc`2MyeXe*7Q!doE?eS_5d| zef-FIM332I%00;ua+u@+zzE-yAK6d23WiN+g>R)^LiykyaK}R)RMedi^_MF3Kcd#U zR{cf`-;6K5Zv(N#|pe-gFs2jo#1oS<$FR#CVX@&3Nr(5W7%Y-f7 z^-kRw;w6UP^1OWi+h1Y*Td}8q_ikz4Xud$?!KnXyHhPBLsM*q^Bed|L{Bu+pHZfqD z1dpJ1fpbVfegATV5fvSTkdpX^5kA;YjvC_)_AYi1O=-VO*i3SU-GFU^H&*x%znQ0T zgYWxzKT#!ysqe|!zvuU{^BGHD2fO3b5kKLQ`~7oi`C9nU{yk6rPy3$$o$k-4^cI76 z2;Pi*qkD!CKC~at`?t5VgG;>ffUUsp5l4vxw#J{*@Fg0

        62<14rW068_g($W6^ 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
        wNUnCp2Q{?Q+fZ>7^Jr6_3e6EKS3?# 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

        {(ci5I6}aD4UMzGLCheKD z?+P!U|M25TK2A2!A~fo)?l3ivutXzMQdM@p^dxj@P~QCk{;qc8S8)Q}e~~+jP3yGD z(XAQ%ou)I4zPr#z+Jn@EZ$RG)?gUof??FrIr5$#R+ol;x9}wGFpkmTHHY(>Cwmt_& zrg+4k3c_l(yOR7WSNiXt{DprT$e)LACzu2*|BcX+DvC_Mxbl)t{bS<1LH9xJLKL87Se!e4PYj)X%? zQf{!nBG6;JF#R2K^WC4zPOURv0}tEj02soYF}T z_OiEC8`;}W6cx6)Pln!gRht__==w0Hsu|wcULWorPi!pn{h{KgSv(ANPe|$$<-|{b zVXqorP;7kO>8z4t$ke#T$hiSI(=G|@NJJis%ekZOg&J*9I z_97qJmXY^vhHA_BZ(sfOa!`N$Aq(-_N}ataqv@3*UWylBf>N8FgDEadxu@o@$&KV^ z40zB@AIA2nyO(uSa({1H^7_c#7;Vz?@ImR9=MhEYG^{*xqN^FuLL4m1b5~@YJvEbn zFKo<3La)2&tHlg6-i>pTVRBlbJoJkMlfr?K;qZ*%9{+Mea9r3e92+eCrb?BGVs0c9Uq@K04O0V$Zbb=JPHw;SVAA+x zLK#S)luZ7q$_=JSg$Xa?@BKIv>JsiC=mj}i8|JSg(}Vpz%s>1uX@QX^1l?dJ5fIa` zz*Kpyu6tKz=qVMv$xFq1B%V^1{Ju(>?kx!3;YF^dA_htWGt~E$Hz#n3>uymex{oR~ zS3FQnYPit6--;8>`<4CGGokCj<-oq*XP_nRy2ZTTgP(P(hue2l@7THB_wZnIb+4

        %r8A-DgN4BA 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 %yGfxk2 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 #dB_c{CAfziPFGaua-lW)@J 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

        (_nN?*A|oMa*5Dbidio^+7#(eY^IUd593TN!+RQ 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

        e`SO9Kt4bGG z6?utHyk*z8C#5<+NJsmu%DF}J+R04vO%fC9WPN=juF-bV@7syUM}rfA)pw5ncdO4{ z7nKiOSl*Z@wB^Yey-04>KA97t_$nVsU550wI;me%c((@KK z;}-XlG|lF6^OoTqc%h$u^u^&P>Hh}#2N0-g;uA)eV9z75d{&%UQ959Nw(@a<3r?W> zzjDEf_}TH2xETo;8J{1YUtYc>elGcxmsl;0kaXw5NKNy}1>#LyWOx*#C(iE*a2E2_ z;5uOKawD>YA--SBkNov7hDYgX1NMPMo%;{>71?K)roa0@r&c*0;8-8;JRN`a#fDEk z`r_OXyQE#qIbWb7uzb2AOW2cL1`XYRyA)qycq~Rw96e%}>yUp1?g5s^1IQ9ux69sH z?2BEhE;W31pf8R-c^-RSN81tf2bRwWWC<%BZ;0kzlFy} zE!X`3G%!* zxW{UqoIok0W6l+k2E{3ZhcmBy5Gy}8n5-Xn#cLH_g9jlNTxs|fqdymZlCS3>UkEPq zIZ1ur^1P0{@S24e>jATum8}v%a+USX5x%BmsX}#-3OY5u-a2&T`+C1a{s9DTXtGNO zWC_+^gRKYmqF>v^*Ik3>t_WYBP@+29w=JKZ?7GE|1oh$7#tsSeSw7bz z{|~qY*nGMRd4KtgUsAr{)MkhBQYS;qb&{;R5MtN|r-BMjv=`SHJ`Ly-K3hP$8)>_M zLSXq+B1^FLvG2*f*r!+ySs`E85c#@sa6eLSi%jV6>H2$w{?2jML|9~T{2Z2#TrXCiKLy@P0nZWWZN0zWZ_3)gM%CZu3mSSOtF>c{OpqGyn zuAQ)Go$I{pil>4o8~#{HX5dAGY!nT!atJR*?EI!2|HAOy1fMv+Bj97?ZQx5_`EEy+ zuwQ&R6TYlmUSJ8BC7f^Eju1=rhB(fVb_0CHFAR^uo0{Gm<;WL-)xh#ti>!I%{iOHC z97AEJ7sqNd{`IN#e7q)7?Ku~+%r2s~x!!g({sJdYtekciszyIlRks?R+u$MfaT2t@ znZ6pB04&cEWC=g<{pM%wPCScueYFi}cI)7;-H<#&o>K*P*;m*DcZ@x9zGV5g|JqAY z6vGBd3?33psJh*xqsHf1#O*hb{|5d6Y&wF!FzK-Mx?M-Rm*?H@VKDpCNjwnz+2eq! zs>r3TdL$6+ggcmQXUL^)HV2HGPrFW${5B{WuHNn z@%&kp6vIJy_=Dg?oY-J^Y(r0+-!-89t(*f5`U1;i0J4OdfO$?o^7|+IXphDwQ};S` zsd`0DD*ROPhNbFJ;INgM?ZtPvs)JN!go-;2uOxbHdAT3?*Wf8&dDS9I_{rtPmcB8RN{PrduQ<3L@6$ zb-&?Lhdyf;wVt^?kO?fGY~=mpV{)byKAl?fsrC6J&?kK2;4?TQu3&(HA-alzdPaw3F$2q%ojickxmgZP3oWl;^uQG7Mp|i~yUmX0 zcH$2hd(;!Z)gQfs_aJBstp1M35?ap3?UVj-Ws7#Au)T>w($_za_~p5kcIqX_tHD*i zPU#1?d|vmWmv%tu0`g!1o5N5YBjqvLfH9}a*H=f}HoeXUe13xrVAIa*E$+ZO`0E-kq{c4)U%xJ6~-GrNuZa^oD)Q~aRGhXi`99j-^d z5!~!^*?&7&J|-jLkcm6%RUEw)zTU0q5POLIBfnx^4`c!fqW34}yR|>NYWyrPN^2Od z!Pz18wXb&`I&3~%iM$r912!MlBTLwC{Wj@3EBccax%w%1TIWQji|!$cj%kC>XB+w~ zpDuT1JAJ^x!15W2ETQFo>wPO1>;kuZ>@(3s=}#>vX+6a?rd%Y^YkA#^{3zH2EU)L0 ze-`;Z|i%maqH>Mx?VemMx>90kWuz&etca8TO7^QR+JIR1{2B^?@h{Ej<;}Z{=e28o` zJj5J_Addot!15?Umau<3{N1C4Q|Rrd!lc4k7sylH6+P$j^Z1 zf#p$$EMfn6*j@Y99vgPChx4$pNABHC<00dbr-Gw_<#7_S1iN2zAKzPk{V~?8dM})X zJ=$Q8r0YD2K{)A*qM0eK5&Nr|I{u{3XCwOJ+>!iw4f#FrS77;kjVxjR_?X?TdCmDe zzk5E;BgQ@>?rGw)0QnTK3|Ky^koTVtGp6#~7LFPt7L4IHE$BvLZQn{u1*dDNn( z07Zr1@5tYPe*??oM`Q_`TCDTkw|Z?x`ATz~VMR%K(B#uL>~gZa;8>(VsP}mk-P^Pt zW)<><;4)x&tU;Er_3icg`qRn_yKWn)RJpgZMMG+{TGzP{&m-boWUeaH(K^+Sn*7;{ zzCv!T27&un=M6dm%V#LEgoTq$fA?a4AL+i?1*b>k54+NnW>7gC%mcm)Sz zj`H&5sFJx+-iqGAsU>)}p;RBm@JXJU92gLq82k+f8HD9g*P-CohIbXb;@l|$wa9+} zF9XZ_4P*)XSI)8H#8o8=R!HGWy4SnsGu8&NS;(X`Q_-scm)->jco#og)1 z$Ac1J`P`1I!)eBjkNVerw&RRa?Vh3DebtoY-VX{6+SAj5ue|k zVO8%sF9ta^*DJ*bJ%|wdfW5NV)n1 z`5$0Au)Lgy3@_`?+4{HGOTN+J98@5z68$Mir*LYl>F0zvL`da(r%^%SyRE<5P0}o( z_-VtZ7=5;!pO1VESPLwljmQ#`t|>nYJMU9D^4krSrH$rFTp~sM43N%Z6>2f%+=fdR z&O2cCuY@*kmMW2~972Vg?-t`Zc%0U|+3?%}53yMi^n94L-e5SeJf|T`DE7;Hr__Do zSyE9^x@_UGrIqEVk@@58X42wzB@}~BZRkYGdwaHa1lneF4qmRp!3eb#d#I1(tPeF( zPMy`E;2FcS8XjWLdhjyx*Wepqc@BBR@SL^A@LTMkyR(=4wf#6dn9fO_Q}xlESDOP= zpA73?Yt1DK^7U<;H$&s-LORYq0|&kWl0ss#SbX;+n}1Mjtx$iee-iT93}jT8=a#Tq?;+5*dI;0*O9I` zY2E^!M}7;u2W+~(LY5Fa#H8C9zEAn%r+X3y-j&E(konpt0(xHdR`*90BAv;gb6a>2 zy`&_b74f*vtU@|RJ8~@ffAH=UI2<34>>PKhUNSrjA2sc-28b;|z8YKyEYEsm2^*Fe ze&0X#Q+QI^Wg4zm9bVR63A=USZ_H(w{xL;=-y!etx>VvIsdwy^{ zrSM7DJ3*ZqxXuj?2psBO>f$l+Yd3t8>n>L(ke!-t+^i$GLzq)Cpy59Z7)mx&@(BHZG`*2Boz_|s7C#T^=A(aD#a@C|rUa&*zU^k7k zy6~Mh&l?-YIj{C4TJVP9y#roUaOU}coHI_qVZid9j4UDUzvt|FmwkM$Ouq5_-(jBr zHB4H1hUznsLn&R%Smvo?q$B#c%=3*87+M_WX@qs?kE37esNW;M1YQM}-!^0kU;gE2&*|^|5ah24e(v+qR_)dgF?RmZ@%~tCPxFnp0NN-IeC%`FnQY9XxY`qxUYV5NKJ(7Q$z-P$+1!_|h zk8ETK)-T4!0Y9bO?c^<^UcG31+uR!XKs?>Fg=2NlxiIBKj-^VarT>XiBT{Hntx%V_ z)Du(G${{}}t0p51!Q(53W=l;&PDcz)kEe72xZ z>{|%_i=6TVWMX`^KlGH;ufC2V`?-yK?EQ)Z=pz7w9TUa?@_VQACO)N27SSp(cW6nAT!Ox0G z@|+4^?^bk3-61v!Jjpx=$N<(JImi+g|Frr;>u>Ce7mqnAjPeAnIX(93Wd1|M9dQK~4V4|pG2_q2Me7{M1DIc#Y0DbuT+k?SB-DRw_!a!tyzl36?^xuepb}Vqw;)S+-S>C9+RxX0`yEttu+%|^d)=!-lA915)d$;dxL|4`9ic(=;~x&#Vz(%y$dce-ec$+9B1r?9z* zim>2w!>0;;!bR`|^0VL%!18$;`DgGU_3*h;_)LKht@f|r)0w(rFnm(oF~UbmP5cYP zCtlmcXA1Hxa15|~%8-8sAJ&4y=NjQN$?*BX=QB+68EN^%zBGI`qR+lhUPXQbyzO(4 z_sLJ3N4DjbSA~j0AkI`~T+&nE>&yLJlfH4t6TxI4;b-Whv*+tuXY>{O`c^m7_b~Ef z;5R>8pB~F7AbkbSZM>!rrrqG{bDlA2;SK8aLLLgn0Gq#O`G2?Xg>{GSQ+?~Nr|Xq0 z?E2#vH(6K{{E<li9f`mY29p*kl;Cdq) z1hfN|M;~MfwJpvaFI~opK#qSK$hn&XCdv<4hf(X&1LtdSFBxrP9e8S#V@X^FPB_wq zK{(R;FF*anD|P!;a1rvg;6`Be-i<6_;fZ(X>xyU0btkcC~9 zpFUZgdl+M-@4Gn9%;99SV3KGjs`=g|j(*5dt5S{*O$_Afc(5G$!}b=<(8hl#Q2H%JK2R&_?+crrp4I4AXVvYA>5h5$Ub*obS{SdYZDo)_yphM3Tq> zrRS5XpqJVDYwJbnc50G2fp5dEv9~xGF*&&3^);3 zz4MVJ>|sCMP83YRkrGq5m_|TnDaWj52F_@;fcNI9-G(e- zt>3@h_?juNjr$5)(OTtx@9Jrp6#adO{_Y5i26hwz=XCX*=&1YA@F@6$(IfRn1@dxm z2CzKN_Wy3}Zm)~VRxDmQUvHT^LhqiV#H?Icyrg8s$&AGgJay&#(n=P)l`bDxaq6Oh zD_4{)8CY6b$$6S~XKJx?8!gzY6b6vpuW^UrTSBd`&!L|Zc#*muv;~&WACVzgY{w_gXK?0_%mIA5XZFnOotev>-kFt|oie**F5$Zqzq@lckN+cse>p6(AD>)4 zT{3g{NGx6W$Q}6?Ib3u2-JN)&nK6(?yzO+{5|fE>SY}^h5sg{=YwjicU6U2RE-Td= z;YCsy6+O-yt`@l?n}3H}-uWVhgJGM0j%3E-|KHDWwcvJloX$7v}jrvAXoo$ z2d6s9yYT|$jZn=$BYAHPS9B72wtATKRQr4jJpB11{{w6XHa-1bHtDJM({ucB|2O6P z5J^v6?Eb#5#N4{rUottqyyh@T&>)V$+po{??z9c|{nMRZVkiIe@3!6xE+-RVw!_`S z18MGHPI+pMq5M9;7{<$Jzdp=+73`nI_`m)Y9(4@U1Wljg*=)JzkNvk(6lcdj5O^4q zO&LAhHJ`)WpZ57g%9(`fLQ@{|UorlArT$-qd^R{ANZ@U;i=W>8f3EWT7MCwPXu#y< zW0#FBo_y5&Q%d!^l^7+FCBJS=t8{97UbW45b*iJC4|)Iz2Y}bi6(uWHE}v1leB~0H z5AUAi#lo@H=a+zs*i7&!@~^>@2aey=vgNJvx>R`8`Mh>C<8|zxnacqsK*ImE-DZ?l zEGb)1vVy&Z17WX;rG$;zb9YfCd;UAAUB-9RsJz=_<(sF&=wpBp3_T~mM*U-X}zcMXd^wR(C0S~E;hd(Mt%(Z=0Nk?Q(ixA zI2QZ-b~NL6WIcX=zzlF8>^HM?L1k&H4Vg`vSi+pZh^AHAl@+$6@>Ef=SlT2kO=k$IYQ5a=(I>ZK)6t6=jqtXj- za%V`ehHj$aUHCV{Tjt>|LB0m81(x?c$jy1%dAOfn4u%Nt#BXK3y$H_LinV|J)M!Xg zkF*b`cwJ?KSQy$Tso%Ly!6d`C0X|~q#bD@1+0GPj6tH|(Avfo1=h1#XU%eEn*1gQz z?7Fq?O|HIN>_WXZgg3RpP#>iV`7Ywf^bC-y+G6=%x|#YAQGJvsi;PcEZ!#I`R7^JM zsfDjiPw?YxCmZAfo1XE=2PQpwDOIg|c~B?hDM?6u2nVE+kP*!iGB?5=k2JC)NOm+O zg@r7qsO^#z9qOi<^i;vursoah&%xKgrf0|}COwIx&ANb(W}55I&mX-MtJb~OWK4BH zC+puzk`;D7Bw6$2S?Jxl{dm>B9a)opsA}Im*v)Ilj5bH(s64m7Qf?>tbC+Oe4_^@N z*@fVR#;W#N!8TrdR#cznz2mymIU4kE^^6;Q(Pg<=O|eP$YSLxX{Sxwr;8S4J-S5)_ zm2RF~IURfV>0ZmRj()nkO2SlUkL?TXbAs7kbmw%p9q+Zz4Yv0}{Iggv)5|8^VxI8s z(_J;oq&rEvB;6aqbIAYs|JZx;z^JP8kNe&;cb4o!2oM6u$f5xe0|dndjjTaYMnI&l zi4X(@5+NY&(Td_euEnJitybLQTHNDOMe7n33`1WI8yZy-j7JL7iVn1?5?AKG`wqpMUY3yHu{VmzfKT_@Y zlJ*~%-hO-#)%I`j?XNh>w;%h&{&nEj$e)5QfKB(sA9u9B)n8xvqvL;!v?Ex-{fIeH ze51MD+u_sX@8!(#y-dk=BO{C#O0;qmYO!}Mmyni*v0}p0F-$x=Y+bD$qEu@<+SpeG ze{0`O$S;E50&Cwl$f@z$bM{I5vX{7Y~fu=f29S%=}K zoL=m&Yx(iz0kC%7h^&KOPW4#3 zVNAK$+3enD>ZLc#ZJ@55cEZ3m&T;kj!ocO&H2g(6y0RYD8=t$lqyz9#sKeF+Tu8u`S}IbR1@`~HnA!M2aQcY3IO zG)CG-!xN#+?!_TD5!#gQc29>d?>C=5QTjjlx5vzv+kU&#{D;B%A%BwQSi@lFGjAdX z5|AEro!fp1>1tPhBtUUHFx>D}`A{Du*vZcaq|Ctt?W@M^x`N6&H#d}AVnx!6d z163ipg>Pb}r3o!(n0T7sX5wi*U;iBWUa$$+czPaLLeyU$v(#T-{^QFWor%pH{d7vWIlukeZhXy;FrMiANr-?@A&1wwRt_1PsXBE z4Q~u?b~gmw#^9z7w|mSd|K|VB|Mal=oqzLx_n7%|8*X=+zZ|T!ekE^XjRTykLtEq% zokf!QL`yeH($^QAcYaVlN#+`+Eti^jsl)HKe7+y~HSiX&@$z3}9eTQa z9_zRFnoW&!dxzVJy0G3Gr?my0v%}++ZrNQSZqb)LnUYK^&&|_C05vPSwLim*Jm&XY zVeG2>Drwh+$ajK!fwk+m$eFRrZ|9}8>ridiMC@t_Iya=VE9ToobYaskwN1h^vEJAf z`#Nb?4e~kQ0$}a>6>?_m8rPvd^(#_)GqvmK5@BKIF$~i!1>Ho@muakDoJLCy^K{3F zehHITFq#Wb(OhsEt~K^K|47<575Nyj6j=LyhMXDu%D36RKmGvw>KcuGt?-xpwgwFU zXK!a3*dJK?79pqFH`m{X^hei2V|9O5tNVc2vw_v;a+l~wBKlfAPW~CIINP9) z$7ve=WsuHiQJQs3`VR=dmK%&cP4Kn$e2v`q8_u%<)}CFFGh>hL@7fl7)^CeFWj7gn z8sIDT)PY|kzX9F>)}Bw1C4BW~)9>-YhdtE)F;@3?wYbli6&iD2mQ@=iQc|#ERAiPq zmAIIo22nilW;9$H2n*f4$Tz<HoW+ci&`78%vGw9lS1w=0$Ybag=A2J361 z)Zy&w@=_$Fr^&mAIw@34uiX7oITdqY)*N;okXk$x3)9)ePp%v0<%p|pu`(h;x6=lD zfL!Ap#t+|Mr}e|cf3uDotN_*z_abM+5981(?bEb=xW@S5mQ+7nt9zDn*l#0^A9k~T z*j>$62X^O&V$=O*{m^i)@q_c7@q_d~PDNe~P6pNwcO$3zp~w0k$4PsntNyn~OpoI; z=JvhmhP%jj#HJ38&|PmF=Tz*m$9{2W2B~3&y4N+ep8w9GSAvlW?#gzm9`xfMyCnX_ z?uq|l?@F)|Si5gQ&WzpCUfDLg&kZ~-U9*>q-EBF}2i@C!Ao0J2-3*vu_v6`4{Bb}3 zW0%-1_2KycvY$OT3|PBYBd6NkWA)*l zwPzY~X6z~7R(m#Xi#^e&jXeqYiapXF{Cnj80Ob_5+cOL~)t(;fpBm@)Pj&1MzQ?>K z++uE~f2xAy$dFxgc4~jHevjf9uw)lPU)>jcwLiiYf7aMn2Y;LI?nmAXUIaG2K0r>j zugB`2angPv-+gW})p(t?N+oA`&L6WU@q$y&mTuo;L7;DTEIcs4=2@qyFLdJzLe0+^ z{$=#4TK=n$*MSRx<$oh`X822cr3?OFY@L7E3x>b+3JZVf#~rVV*jcK`nF}ocI^nY=Wn?<3Gs#0!7Y1VC|TIoEbZ$9YcR~H+EdR4R*v^j2#W|6gwop{~GyI@CC4T z6v-Zr5_-Bnpd77Rj*s~H-5(7y`F&rL-|xxUBERci0>3vp*snu=PyEiaVZ8$V#oQb6svZtNs_OLa!u9XBydPmLb7= z@Y{y>dU#ph?;y86P6Sl-Ve>)@AX zJyySz>;8#m_kL5cbf{lsPFG{Vc_?=`cFkJVp>lB?2G`C|PTL<1|7cc{|G~($pdMKM z=OSl@zwVFdmj6rL@K3ZF{w?qm|HnX|>>?)yh6BrgImB)jyY2kre>VK%@Du)0A6$WaH+TS8{vRW!`oG8OgYjtH^8MAmOF*@-N^}RNVL9a#nT7LfvtXseQfNUkZbHr@cpUCSApw* zwewwM9sG25Ur)_j8n62e63knHI%l*Wa8oPTJNjDC%m-Nx8I(dSo(e#`HE~B6W4zR}!&^g}BkzXX*3g$q-|mzGCXwe{n?F(Qqi%84 zF-)5-QP&3PL6>QvJB4O4#?fooz*tt6x3W*LZ&sgtm$Ky`W>=o3&R24L_zCQ&zb`)% z)T3_Rl4xAjxvQP{HzqzdVvpF{jDepb|6A%*Ui z+_umcVrWyA)2t0;r>)8Aoj_n%ek?2OJ?}EVm$Ks^b&Bl!UN4tArbnn=Sx0y`yCJq? zC9;e?Yv3#PtOt)Ge**pvZ2XlJ8hh+}Uyt>JjGur#^glmudfpj)mwtHvcB}cc(cDZw z{0xcNi1S+h9=dzkOzqU&J$n9Uhj+kyY0f_As@G+RQHQ9zO5Yb_kG1y>1azVc$ zrwCZP_CnUdpJzK|t*HlobbYsLxs)Fb-jnY40k^@s)7&05w@*C%cK#uZzLAz=gKVjd^tViZdcvvscG&_a>m3_K?b&*L~mnf0z1Uc34Hf^WUsi$ z$pY5SX~+`n{Kjvt>nS_OW9RTzZ?pTZ=eBzHncHLL_CQd7d4~D4xBjpQqnmS`hob%z zD{Am!YB?^W)!&smR51}HpHDlpI8E+Z{rV1!<>fL+OH*5Wf?i#w5}py{IF$u~XWbCh zWwCpq8$1;ITKXG*G-9v#VcE;}Y*k$d02f24iky8w;-Id6h zvD+VK@YjWOG}!;tjonxG^7BB_WG!vY?!-_({bQHdT>*ZN{4V$aSi2(wjNLt7&q%wd zr0xi+&2@T~ZNPb^*BCWGs?FSf{VP?!V%5)M?UG*2l)Yml7|!d>7|{)`SL2@OM28#x zarjyOS0HZyHv-FlGqQx9=db%OI`IGKf8d|k!SIg`H2kIi?qK9vP!BBsb;vsS`K`zL z?{>p$GOp5;rvGkx@)Z4d7Zi?FXLT4GqPfC}OJ^&#m@75>Ti_@D7yf+)6*;?ra$xya zB4>ubZl`q1|GIAYw~X-9Km2U^`91Qx-~(X!JKJ^S-(&sNyXkg`PCpyv9jB3LP=%!b zh)(~#CEcrDo=Nx8*TKAt({N#) zGQ6F^MS7ii0&-K4XM;n4{c%IOF})TbkEf=cFar!oV|vq z$!y#l%60pwJ-kRDD;UmJIW!q&tCM&!9;oUx8#?87HvBiik7`5XKf*Oen*m55TlC<5 zgnmEoZsU1y8Eng(nL!pC_wgtMsjq!LadZnG$$wWM-vDj~)}K!zOW6FXdEc@7D*t$Y zN_|cFaj6+!9tXo#<;)vQqMhc|s_nA#XoIjW)7vh@KFdLNrJS!Q=*xC7evE8ycuN{S z0C^rb3|QWakyCm1T>91h{_*NrZX9n#Sl3ctqDHG-cs0>cu$B;?8M74!JA#1mYGQqGiT^6+@D|)*`P17XS&F;U)E*NrxA?$%I(p z^Jz)p(`P7cCom9XjL!s8j?ZU3eDcT`vedKA=Tn7l8*euuZv?kzl#kR$G2#tq|3oyO zgwLlfh0pk5jEjQ3K<4}-^^1wG+qHj+J?SKB_W3lR+xq9%$eY0n8RaAOhT-!-3ZFKg zPw{Z$iwZc-M_ve)0$U!e_J42t`G0(QU^ip08%PuMHn%q4`DNq;_aIg3wDmgS;a&$l z(yLT9WPi|Pz1A@%-!;P{21kD94BMf|84bn(%X2qm3Ek|+{=653%YgVjeuT?gv zo3do(ar0`Iu3A0@E$Q|uTmQ2L$pdm$g6;Tk-qYAu1^*cQB|aWReiA$btbNZR zOUOukm<^}4$OgL-BL&c|a=a=zW@0G%V|y9C(Vdcfk3p^nYk=i@GO`34AGZAOf%xcx zZ3S$zKn{%S9FK%Di6hh!KHp~e#NZ?T%^OwZ^aTTe+Jgbv=S4B(NMB~@R z@QA@f%K3YdUjVNF%k%fh60Bcszd{fAHOVsJ-n(T{(igurP?P`?@OeUrP`0<>9osqS z-{X*1fs=sceHyZajQBTRyP{ru_f@Gz$3WDUdHbq&4bk{MhUaE@#NZ+2NUzb%aRZZp zKlIi)U$k&4Ff#rDYQn1MNS+X3@q=TAWP`RzlTjY;)ho{cF#=NOHmwMwN5rL%OgoJ zN67<@IZrJy+3;I@$G0Ni2Ob2L_oK)Xy7BW5cd{w*4q&_9dYzcNY=z_3sfKT4Y%)F1 zM?L|Z0xaJKWC>mRxyRThIN9%F*G;%{^)mQV(^hP^E~oj!Dqno{Q_A+2K>DR z+l2d>O7XR6VVgIc-kr;Mch|E0!%;j)NC!*PbUY=rZM|m1F^=i;8i9 z15J8}?QVFBHK!uq2AY87eIK#}>)#%1=XLaNN7e~)S5+B~4%xwY{!1A4fEFshJVb~_znv`g`KF~!iYU)zclF@CLAf_>S`yDo8@#7;g z*VvbUe+>Ro2mBTJOYjY__I-yep_};lQ7zsMiOv|=RTEwFs5sd0uG}lhdjs*DvP>-`-&U?iGAQ`~EThyrvAwg*Kc{>x6>3=TrkzfI^ypKVa(2c);c+2-d zP7lW6DHUuNsh_NSh@bx96N66zsJ-dy2NQthyBD$q>t{P3st5W}ID9pkg4`(*Zr zoy6fre*@2t@qDQle~bJ!cn?_pe@2$jjom*y{h0%gCReXoY5Jdar;tt zfT_UpuSS-z-ak)tQ{InTM=&n+yxbP=;o!@j+u{{C8)c`pT{#~$zw`O1FM1sF$<)X% zTsFu|{h7d8I(D-$A$GK}r`hK#=c5KD6*;{?UtsN-Ioa4_&qpna-=rV#Llcd)M@Dly zoR50z|9?K}|Ci54jh}APW95|OIR1L%YrqB|LGq!U_hak-AD#}oJRkMe)bmlRd|s_7 zyvnB*IlF;9L56sBb(n~7)90er`MlP^LEhN}uOhz=-pU*=Q-*eZZmaOq=c6|G{EDX~ z`PCt>1SfzD`E72^vO3O0PkR86aPv<^rTydc+mynuXgX`)zyOe8e%-~dJ`J_e=QkfN zHh%9wZUXmZh+lW-vx)QMAk-$GS6d3NX_ZCJ3~&I*gx@T$wCA%4vG!9?nGfXiOTfkY z?F;0u!M`%ZZ=28M6|Vl7s4YIv2{V#BuS32b+ypY=$Fw}VONsv3sKTYy=lf9#-@W!L za`pj}K_>Wib1tuV@^X@+)8_MPfP;MWRzcb9yG_LIx(ML6@8*pwlD z@}k<6>-^(Void--Hz~XhIDqj`Fc)OPZ^ElPm&tLd6+W*79IU@SK>iE(TZVXba~`jx zwnoXPai3S|fk|E`BcBG&1ex%cX{>Y=ljb1QDxX(#3a`RhMNS{kA7p}8m*??{x8x91 zLY>cRJ{)X3-idrSxIdG;x=Uaw=b$$D{Ju%yHzQu;%mi_e3BPqm&7Omr@OdTRVEy(N zFDwtRLK|qIjGG(zdE?s_vK@WdFC9{sLyMC3a`(RzX1QpD6j6EmOKYF=JTtV zXZ$uFN3BJ^6#NX>{>NL9CCvTu27NF8#@v5+zfXsAP#fL#W`Dgw^r*JD&K@OdFTHqf zH@$vJWwCT_I{UgV(8{^A`MlfUWz*yMLl{E=djSbO+fQZrn)NRmSvOaiT(0EA&NS(7 z9lC|jV(=pJo8Vnw{rD}i1lxc1W7o}%8*O>%^^+;<<~GVe`0TB%n``)~;axG`@GgVf zTI7qsWx(=oL{8=XW7o+fd6&!hj=yehqpX{&OSf(=dY0kY3J)9K!+%obl!8$}LT2K7 zJP(eOD&x*cY1YkE`MlP^!SZ?(xfwj2QC_l6vJ75j&Ut!Wm|4J?@cBdzP4YPaIS%H6 z%=t;yKgQq_qeDP4hFPc94q1ZjZ~yW6ufsaE3*FjW=k~~vtW#r= ze$kPC>wVBCy|3pN4E_Yq_X*55rg?mupH8n!=Zof>%{%{sMWd^f=-1|La31xK^C9mIg;I}}-hjSpM?|LA!@<3@ME zHn~o1W9m9JpYLMf2Or^kKk{SXDPZ|Ni!31{{!Oj`>#}GmyTtf4y1?+1a^*1OdT=7J zJWoZIVEx*I<$RK57wgnErdy|Wso}jDUNLxye|selUMaU&r*?(0V?s^R-)oUC z0+#`6$Ip-@WW?Xe6<}Sa=VqU0D?DQGko3IMq9SJsm;o%$1CS+HfA?T|PO{v#s!{W3 zz0&x1J-lLkBl7`2L;eQ*2Uy+;784Mu`#P;tTW@$fi<9YiHuB-18d%;n$PzM=j=NZ=wq+|E zzg}hdHo+$bA4$*7k|Jj?7zQlgQe+8T`uT^q!#lCZ=&WWe8Buc6Mye|9P=H(WMKJELza*cf2UdbRgtbyhyH}mHvyj*pCx^Nfc#JJ9k6_z zr5W>g8n#=kQ`@-3I<@PJpDW=dyv5HyLv92&0n7UqWC@w^^NDpe2h`M8({oeOMUB|z z^K64h3?Aa&iOcBc2ZsU6^C)Bq8A#7_Q&?_ujTmh-{@n<#7`(*4{}hhPi<}^^yt9xc zWW>LALP|IOZSr}>;Sqy}`1j|?4}gb(<@q?WgbesMm1V;HY3c$?v-BpPUdCpBndNdd zTl1*9-uO3CoAmEt$P2*|V0kY?mXHzucCpSfT?a_?2E%s~d}8pa16g&n^}&w7^4$qp zg7tHcwxhRcoh2=$H0vxYeqs2pfnN-MlAd2heh0hd`E4F5E!Czwjns9P@taI~SO>2dyrkUtGji{h?AZq_?}5k?tbcp(J*A_6JF@;? z)>)EWw_ImgceAl?G5lljmw0&$c{6wsSo>ZA21k(jC@WMsG2Ei|do|u@w0i zU?Z@6Z%3Ap>G=2&>nt&C%XOAbw;B7sfqxAC@_u>HD%t>`3RwFVB1`BdK7Q02TZcr~ zah+x7S4_>L>UP7s30^V25#Hg|jP-#2!15l1EWyUh7UfWnvrewFOcJkC6+(g#y~9uc z@QU$S(*LiJo58Pv<^3G8gl_!(!{6LwO2by#hfO}u=n2Vme+2Ssa5AtwPe+zu{o8}( zP%6u9ZXdSXY5cnxUNLxye+RB%{}Zqiu)KFcmXHzuc3v4;QsJ*-?OeLhUTHFX*T5$R zp9FXw`QO6t#3Wx2S%UR*kF8@JH@Y+1|8*TJHQ1KxSX=HjcE#ZxgSW)P4am2HyMc{| z`;jGNBpy1gknH;Ho^uB7Gkl$s3}0zS#*u45J+OS&AWN|E(1Y#BPHekf&q>3*<9g1z z2Mqsa_{HES{?0p@^*>-Bu>51l5;Ev-{Z`aff{$)8JQu?w1`kQ^_ac7`J_nZPm&g*{ z{{9Ai|H}D=zW2m<4V#JR8is^^O;|6<9+_-E8b!j~&*|dyyXlPXTM^Zl`b6&V@DI+j+bD|DvIduNXTU zutV&Ofc41Ng6n~`^AltV-Nomcy6WW%_pdooM`mk;Smbh@Di0N^9Cfbi=7zF}!@+DF z9VyMrEeR>t3-Ft4m8<%y5>D&$dS&GW@`~JGI2`VuA1+iQ)G1yt7?yYovXA(aA$6UO z9f-VUcu#2H{fv*o{Sf4%z(QboFF}?t*FX2u&O1s;hcKSA^Oz0~cr54Hol85n}gs-=W=SthR5j=zZI(Qpcy;_}N}q~aoK@sDpyEtdO=ENZ zscJ8>$13++*JC!F4vl{>eyKcz{d@UF;`2D<vjE1xMQ z^BO)E89rgdXLXX#PvFD8!-smmcHLh3`O&uxpEuAaX;aGgza#$#sGlbJ^g@=1=h=kt84|9Iq6!I{AN;}Ybp z=ua)b(&#TwtG~_H{|3*u`aeVdx9B@7segOqt>~|@<%&^WtBpU~#rlMDrik`1i6Wdk zQhbnw6js?>b5zk}kF?srW>Z-EuJOlWU!Nr66OqpX7Xa&zEB)Wwd|~e?>D5j=j1DYt zqhkxgoGU)dEl`EdOTk%p1Pktzlht-pOqY~U=j(0dxl&F^UQug{oNQ14tlr+p65f8R zn|zsCQjJI!RaG~!cd7G0d!I6=CQ?|MP}XYfj+^HZ%TRo3&<_t_bJbRo$ z{9iF&{wF^?LE^_e(Igai`Zhi<6g+6FddCJya*cm7@mIVq#UIF{K$-bYC(NUa^+z37 zbK+5B#**upOTCG?%gq7H(eU)B)g-j|&#g;&?wQDI!MR;MclWW?JUGsSQ zShXtcWSfk6dodyQfw7}CMc)_5UxR;jt?y{`RiLlJS?8q~qBBHN8^`rj`OmL7H|eL@ z$OnU;nC~=^R6mU!zpL28(jTh%+okNJ{PLf(F6B8_BmW#+-}Q5Zr*Zf_op|~VZ}gx0 z4bLb;Pcz6rk3BO$4A^pU7i0D0e}G4ZhueNslx2R9?% z2Ob2L&r`?}?ko2BWT)dJO}j~x{kDv5;FUCTh{p!kZFDC>tVKDMW7W>IWNzZY2dceQ z+&$Fe^hKxfBf}$dezN^G2Duze01_1FqW$LkqjcngqZhQR@7#)ei0GYXlD*U9>uZqb z^W0`|8}cUbD6n>afh@tco1XU13HIxYF7!@rf5DSY6^WdGhIHgi!w0Ql=g|Gs5PXoQ zW`_EDg&qfW{?rZSsi>Pp^Y*}k!r~QdLFI+@TUwCwI>X^SO7W{)?;7Ra&PG##mI z6&INI=*4_jgIo*hf#u(TETQNNQ@`H#S99;4|D2lo8S`Myd0zL+d4LjiF8h}ZqtP+b zo2@934)vD0kgEFB@YswVn|}U+{1x~YuspmAw>|y%ZO`=S=SDYe0&4oq@Tf$OM6uNO z$0OH+HNNg`Oh4`F)1@D~^0V33*UYnR`uQ93_rSX-Y4;Rl32U-UemPvF%QrgRrs&-w z{e0}|^z%WszMV#VwBZ72S!1BiP+rh0$jL5hQ0&td zy2>R@^$+%O`xbz3czZl_mg_yO+&@ITDS`7Pq6kf28$YgxcZ|=Ht{z2x7Q6s#e7=D! zVH?s_ie2f`)tPF`bk*<=!y|UF@$Vbx+7)>+s05Zr4YGtct}uRW`XZfwrCgfJgaZyD z54;fC5O5m<)y^Z4mawzy9%@&TbQZ7N!y*?dwV(Q{s|L9{E9H)LoTDhAD%>kvj~x@I zu>IQvUOcC&U!Xkxt>M>tFu_w;RukPSNXM$&D-8Pwi+t}3G#?V~vKHxlZFxP2gx*blq;S^0hYb4qn2 z5FQYA(Y@JK>nJi}|1o^);3MgE9k>j+5!?hU-zSkJL^_=hn3nJSS+k{SUcaKITH4El z8q}wO?_IY+4To=&$4*u|t3ryjULL3G&Q<%XoV>z9-d5bO+s|>T)yn}V{=MN9xy00m zt?1qkc^sGkEU(4L5-zyV#P16ybrH|gCm$dVYzo|^?h3d~fwfusw%&Cfi?roBr_Cm& zFIAyF>NKx5dayb=uzlocua|n8tzg|iuk2GPZwChR>3NA1^bW8M;IV2p)#mkX;A}T^ zxH^okwP%AWH*bk%L%k7Pt)*u8*>a~9`A^_4KId&IcaB-GYy=}CoLbc0>F^lU)iZV_ zcZ;v5^wOlB>B#$m1A&BX)-!8$&5Fe})pYLA=n*w9Sv5|puV+2aY~Y!44)(psPk?8D zjgQZeCA^(5@eun*y7(v^sqLCmQ!S}_c&m3+mOi`s5{2599OqSc2I+ZL=vfsiS8M6h zl)5nA<5m6v*P9T?5BH@@>_c>(<9dHrp%RXVQR|g@$yE~z4wPKrzim=(<(PPgUsj~^ zVio`CIOKD{1;Fxt7Fj~YSB7sxTQ|IC)z!#x0>hhvXREt{Zd35BkiPvjpl|faJr+q6 zIA^L8vEtxRNbToMQ>E4v&Rx#;id2*9ouu{)-L2FTFCKi;4Tl2}ZC6;jOdfT;k6bzd zvE?7it@S<+gbpqkntP$E=H(R&&)&wa*yZLuTFRQ;k@o@>K!U`37w^x0`-E7SQoHKt zr8WF<6{M@2Khj8#hQg|V(@le_Pskk_4#~3{eSPbBwoT9XAU^;e2G);%MV1hK?*@JE z)L+ovF4FP8Y?VZRt7JhgR|aB4bgq8s3S>ukP4%ScQp2;0J-K@WvJ3Lc!^-Uy%;LS_ zbysn1C^CL1yMndDXsiTtkdFcjf#r1)vV;k*8(stb{=UxTm*%yqZXtW!>8?J#`E`Ta zs7|M&v5%xq#jDK-h)q!|RBu%l&dv=6!hw9pIYNEuIxT(te2+fivj)6_{4w|(SU%ZT zcH}eneZ#98KDer+)olp8>$duo!tMI38F&Ymp_``Y3(8;hh=F7mT9@ls+U9x$B(g4d77Cp{g+A=44Ux zgkAbVR;dB{X^s;sHu_t5eg)sH17C`+pD|AoSpDOXCA|8%@xzUO?#3Sr2@d7$ zK|SWGbAs*yr)_}Y+W?>W@R9ht26-d616aP#Axmg^!|?1jJyox&Uuw{F#zdanx(C()Lu0cIqNYk_i!kkp?(j`Jp6`#e7$Gkl7#V(mMhg-<#1 z1TYa;KF12pvi`r{Djr+ZX|oC zs&pffP_R!{A2VhaK>r_A#!$2oxsEQLY@w00ju{A|MxaObQ-C1)h=k%8j>=QNrCSPwO&yDd-DR>O|S?~g|dRvesbTh8r zv8bnLl_J8QCjU_9HP-Rr#@^y<;Vws*}&?Zhb*DX@$s};yI9!x(3T4u<2x80 zjpz{$;`d)6KLMTrmd9U^C4A!7x7Po@`h|>lYf)FSVtCax3g3@(o|Jj0#U*O2DptKh z5wc?}d*{6Tq8wGBg1y6DuTU^Z4Kv9f`E1(J@G1LwGX2d!o(&EGmd}yM61vC-!Y8%= zT^KdGD>t|S2$29Mm8e?9h!*4Pq(VYPsnNTU=h}4t1oHFXWnlHbhAg2Qy$e&u!#nGp z*;#LkuQzs`Y4;WL>~iG2!DL|d9*!)b%5PVs@&BS4IUrbCU?s83TqYV6Vr#SO%#-;7 zieB#=&AkK};}co6wf@T9L>@!jUGh%qsgf4=6SG(S?qYg?4R1^6ImzXxmKVCQ!Kj<(_9_g9^C|L%5&KF#B8mttJNfpb zFUn`Je-rY<;BlXW*uVbGwDpiqZ+aZhW`GJ9R8Zc8y)duop4ZC@WM$>I_m4+M8GX^l zq`orbaaZ-WxIEBXV1Xb!7Ep&ayYUy?_wZcwqlA{X@~&q;{x zYc6g2wTt1=gq|3B)`34De+d2tERXOFhDULcd9R$(r^EZDq=(XxTqo-e z{1Ky%saamL0#b8U9nFx9RLZn+A2q!wLNDPtje$Ylo@)Ql7-p2@GSieuy*H=xyP-5=T;Je2Dxl_#RljxxX-aTlX}6`DXkU{z;u5!l3_^W+BlT<~GrJ zTDDS|FpYAnhEi*kI*mfg^+vg4yd|o{sT*f_#L;8(>q_L+;3QwSy__Wl!Dg6&UBQ%-eA5B}hVq|s*g9O-*+cJr~h z$#vp@t%sFFt5a5P?5wykslOU|Iamp-{u7WTY^#31vo@XnxvBbFef`Zm-`f8!@|WNn zVD%T=)G@wee!Qo&4~Xx%E0)wPt(h`)j>#5A`$l8^x`1{ zQzyE;`5Eju8(eP}_Ym)SrHX^nDb%=|pAXP))4>_YXMuG-r>&-g`i`_Zj|WIjYze75XfnbC53qR|3mtBl7>wCnc5CeJXrP4WA3(vy?vc zaXuf4@fEysqaeD6;nQaI@tu1!V4Y;ZoXJbsBRp~9bk(`kI71CKeYCB++g(-s#qY_JJ z@HSnqw&OHMs?R-Dqj|f}55R~~r(ZGpKtK83e*B|P_{2fZEzB1O1A*l;1X+UR)9F2~ z1D``yEHSlt!aZG2jtW7j(Ir>xqK=o8H=1_wK7Kynxi&sdLOvCo;p^(A9O$60y&8C) zjPIX>QRhFuIpz89BEJtl{2!m+v91v%a$%V2l5^VpT z-KWyeKOO90kBypoQ`TN;%G%y0eI>}oJMmt&KiN1Opk+Q;ahjJ76&1#xo6u9nHwo|@ z^6TJjV0mQUW_Tq0dGwD&JJj=<2L(Uc8SDBwq(`~dN%C%F>a4p5O~6WiCa96jY|iuc zR*Sqk+UoggA?>oT;WyvcAK}|$k(Ytvf#tW#|Gh0= z>^;>_enAt5Rh%J`xD+(oYb})bzMf{DBjrpbco+FE;1gi={2f_B7wxPS3(C7~XT2cp ztkEg$tct0|z6rM*|BK!Ok&ggJ1FLr}vV`(~oAPCXf1Z|apXlw-&T8N^FX{UJse5|R zc_GpkaP}BQwjRJNl5EwVqDIj$-cL;qL?Z(O`7(eUK7yIY>Yqvt5j|zo4X+mTiq8d~ zAb$?N1eTY&!|<}{vy%`$_-Mp93gKBjlSMWo-5^w z=v{%l8k`KQ-pi3CbW!hi)JykN`?%(GX`nAzKtgR)(BN{C^k>GH=rmaEt}4O>xw-HO zOKF!-%I4SRO5=}K^a?LQ;7-aQ&<9vvLy#qG6R%F=ttC}Oyu>U96P%Z1g2upMG>(Ga zLb5ITE^^f*&R;e>7F#{&IuZF4&;TrtpZdSI@nP>N>7_k8yhL``!Osn?{_{8U|BHFH z*!eN?7vP`3KL6jy61u2wjsLr?Z(GvVw~hN5`zr5B_R}pwt_3TB)xR29!q)rggi5j* z>hBlw0!A zW`S~&91-gQXNEe5aVKAIX_J0#gQWL;k*9+F%y(LMr1d7PH|6oEshZ@R2s^)xaG7W4 zaLQy+;K?*o-iG-^re_X`NHWJx?lMtQPkK~=5&YE`%&AoTlGzf^xq3oni0Oqxg2S>^ zDdX&2|7_<4^!zw^ZV-Kpoze-#-DvAd=TN%lOsJY={9kdm@vo%4gOLvhRlxfH82|Uy z@AmHdW#!`PF{vFzu|b2goLA|f87Q4&^o5LOezSx|U*ATaCq5Va8hJB#!Pg<}h%U-C zt%n!ACCAjPtREq}Tj`p&LhG6>Q$U%rLC=R=BPvAu-Paep$Fy4{UyVWD1MCB=eU-=( z*7r5_>%u`D>RGMV)Uzd3Rl3XLRe6_OJc=Q_d{r$S-o2TcVT|NCiMa7=g6B$ECU)MA zd>6Ra*VRpXsgs@UEv8p#%+$;C8vWm_sBA*8?2G)O%AxrqcuP2K>y+MCYO&`g4Yj1J3x?cs~mGRkqiNThTbIL5QFaBg` zHcEXNXNpcGW7)aXnEP?R%w@bbU*^4p!@)?fuj72{dcW}8aj2SW{2jT^ufHHR6uAtH z2bSj~WC@jiJipp&%Xm)mG%fWZ4c?uB?*ncF=Uu)k`-15W|VBXGarQRI)`e(+&;{#vlOX2Eejna04&K|S+|_d(KN zn2q);^*n$e3)`0DW|8hI+^kR){yI1`KY?Qk$K9L*o9rwrk~f=D30Am6KI4pA}Z zwYutiS6#1Mo|yQF;UD+;NxD56xdto&mj6=!_qH6c_tf}qf5Ci>Qop#W!~12MuV)j_ ziJ_wuypH@H_z+kQ-aMxfU}?JR&ZJmGdwn;Cx)I%@G$bz;5lEna4GIs z|7dkb%Zf*A^cviEcQ`%Ic_Y%c1CtnK`n;Vp?oX+gI!4zDeqF<-(ad=3=7(2=3V!zS zCMxr@mw%T}BJZg`w}0zRWnP;75qXOKl>FA0^z+jEfBno9U9k0k=)soyOe#hD9b=jC zTI08mew8d&|BLKyVtxdWfSbD*M;KjMy>hX>Ok1^l0e=~F-lVV_8Fi}s=T`CzDf*U{ilQ0~R1|9lQ;O~69qKr7|QsHtMA z9es8heSI5wp7rme$j^cofYtXVvV^a`GUZ{%^?p?N$H*Yu3W-OeucT@%OP8u77V+^t z?qC`KGrf_t+tD%Go8ropcpc&^jJ>4~ndis(c0BS_uphAcXWQTV?|B{jnROFK^d{Va zx~JqEdefQUBu(o7x^quBY7I@D-Iy}tL{}Pp>v^8F_ip4(;89@pJ%KDCeLp(yaAN6* z)FfL{b@EX;&fDz+-lyuObd#?y@^Dh$Amrg-B(VBMBX5Jg_9T3+dsH6E@NNh=X0uQp zP*rd2Tf_4t{Yrkh0Qquo6|nk#jw~Vl`%1fgwrQnTqP;Ed6gbJ1Xt7mB-$y*p`cpl^ zIRT&-u=@HSOW2A(QfL}W zp*ej&>#LX7&t0;tW^(Pay6P1&iiTtVC>|~$;mXoO#ubM!eP&b; z$J%j<#?`+4=n)>8%cDh3A?ODzk5R}H=KAXsI_95U((qUlXzheRN6R$gq~+s zRj>?_pV9Oc1OtOu7~w5}10)`nc)Ws(?c&@>sAN zu>1}}mN3OX$LML_Zyo%_3eLrIYiAf@b^nwBihS{pa-P&Zo7+KXNN8W$ogqe_vkSr@ z-YZA31YH#|*rr4L6vL+xeUeTpz$3^{gXe(d^E+e-7kI``o!-BUzZNkAqPl*@a;9Cc zl#EkS_j9*43r5YZ^AU{t(V8IR4#7J^m;p5^FwlvfYV^mN&HS77=op7Q9n1t)|4GOa zM)~uw*Ik(=zWfw3q)|QRZct2e{Vj{RamGp1P=Y5Hu z7#+deWk<3~ddC9c{&WT(Pn+lv_CDCy+SiX zvuFo0GZgBBycLQ~114cdl&>nn75$^k_Nb7lMRV9>gJNpB{=*^IzCs4l4_5>FyzV-U zXZi8(^NhjuUgXEXQ^4BsqW^pQ9%1ht(xd-EQBpQ=7q@KXE+H6GY<{PXJV))jPTCrF z))`r2ti~U(TIG}^}1moJe5z<#*&EBBq+8fWb`ma4J6s4Tg za<=hD=~E^>37_f6bHIFH`5cZcVW2-hwbQs!dpWAhYF%vayHM6Y&?2&9NAI`0;}pdt zAQS4&G5R<1e9fNYyq^hOZCIJH2V4* zd42_-1&<>?1AYUn{+E#@Z1(5fq}AW9eRPWQs#>wTftCw!s#HurCw8u%{(o)KpOhgJ zk*9(Efz>+;S;BXJF!g0xy&deHv2xb($*WeZ)&+3Y5wsa1Mt`p8Uu>pTIE}vk^*mp6 z3m!s#0{j|S{hN^`eB!T@N~=Fs`llMW^6qy^f@~^-n!18ED zmQd`^vrNk)X@5ErvagQLYkeiJ9cwar^a7(lvf1Rb`REvpyr+ByR{s=a32}d(Wm^3m z;@wcNK4_$z*&xfXg#(pOF>uax)sFh9v{!u|3G@gD!M(_jf+vCH@eHzr=HG2oI_OLy z0STW0``mDpm+O~zbr<^S|G8wnSB^XpOafN_G-L_eT<^6v)Vr_vq8Azc37#M0`BmT^ zETQ~6WB&)An0x2(9KY7>puNd`(7j7G_Q^`Q7E|Rl(8&gvxIovKe!LUC z*zk!xpRD&PkY|E}faP;AvV^VGd+kISg`zAYt{%l_a2lOwki)uubZi6@NR#lK0`dwU{J0W*NrdjPV8t<`%e zcBj-mDHUH#GGnshYxVW7=lN0=RDey$kAtUy)xQ~8LVc@=|E<}bqI^NE*xledLx8RL zsxI-<{|m`_Z&&1fz!YHhRw7H-TD_NIcgMOXrQ#bV`u&Qp)z_ck`4v2W0=O6XA@CTm z`kz3S5Zgw(J1Vyo-wy2+U;I*IcjU!ny|)u`IhX*f-aU~eY^~l)u{)&>N>+TOe#O`9 z>uunrMuG~#Y-ziFM#W%7lrQ(ZSX6*fj=ZaoQV?$r!>^v|I zSiQR;OW0bymtt?aIw!T_8`a3e^`t1C+wAjbKu?^{!eb+H6SyB(9uFc*NOW88wX+zV zj>O8-CBc)=MoV5>ru+Tkmm5DgFDL809g)ky?!fAwh%8}i^QM%~JeT3+h*`s9xG>SHG(HEOz=p3Z4Cc zbFkV;KaJ;I>D$lqV|*w1{ubmWa6hp6A4Hb075yhJudiOyrSADj-A%q;=apnW=#RXU zd#FHknN(Y=7r8VrWn9{O+soxb7qeTHvv61Xdg@d#w~%`< zKgfipV73a@g@V0u*a^Y)o^LqDR-qivBb+~*^WmU zIaA%{su?IqTy6L?qc6s1;qw;qXW&a<`Skvs;bX^(?Kn^xK9iOl<9FFLy4SM;iN@;g z`kE~%H^2(f5;h9i(HqAI`*6B;$1njaUlnBK=MPc^{n(3UxH?!7jXThb$0rk_*BYLS z;UV!E0cRnv0~Z3z^BQCcA9Pw*+mYv_CG})6vfJo=>uFDtkw1_eeK{SQQ5KU9QG17b zJH#mq5&Y2X>;H)7OWvvgxv$cv2nGSGe@|oy*S==j6Sg0zEB&*V9J9E7-=%(6aNXJf zukzKk1@K|T$gOG*Jk>ukkv`TaVUWytx9j~zxuz?ot=tpy;>5PT+ zT`yU*q=xNJk6%?Sg-3(LD3@=Uc*?9CGUawEM5YYMLH5g;CR2C4;jsxlrRZq{?;`&d zdF@iq6&@yaL4=J_f2ZzJIYKAkTprkisS=0au1Vg};lcSsIJA~E zFKSnrl&VA94Te`7y%l^@1y&(n39bQ_*Xzg<9&vx6@0I>Ml8(G|dD_`Y5}i%Vwa_mw zcbVH~=C;57?r@3MkaJ&PzKPfDDY-u(hX$F^FXk2r92?yBV^#;# z*!!{CQ?E9@-}Ux!XL)A?0*7mU(O(+7N?%X56Q(0qgGIpFwGLTAt3Tg(vA;iA8oQ)x zfUWV`%bF)lu{T|pH5Zu=d6?21aMpX1Nd~?BWXcw9%$mw!B5bgCQ3(mQfL`QHuE!1) z!vcsBT5dLc-+)gApR2%E!t)K*fdI?57+J!`i6$Om z=(Im>8a{ePZ1qz1#$9N6CEQ1Nos)99m7Xncrn;QxE>TSHZoJj#|A^;H`L_n-{((9F zV0&Qok3*I)!CxO#JiJSP(8{8f!LWUMW??AoZ1t||wz>;tB#bgJ;C$ijr)Cg!L{o6P z+)0Yb13z=UMXE+t1<;PU-SAq2-YB1?Jh=?{N^rH$Me$wd`2!vOv1DaC8KNhS=D2fS zFj%s`)8Ie9m1l|FRp7tK`EPQz4zP9)N0u)G^8=-k@?G)Tayx=&od;ECE&MH2aV))OHp8>xC)(^3_jUOIaW9;`%?9vZ& zYK~t;bk)pSL>d_0>|LN9_uOXhDOcYvG@s57=uboSmDLvV7c(TK<~Zkts~Kp^VxdDM zTTC0JmSKK`eND0>1-a#sQuz%Vy!9TJHDMNoPcE*a$l*_d19KyTbA$Z4Ur|voE94b~ zxMpP+F@f|X?-Ey?@2Y1NE3$aocwU9;u(#<~zWvxId9j6&&r6XPy~8{*VC_HkU1NXg zvK#p;+C@`u()Tp!QjY|S>50L&1TG%zCI;WG^z8{(-ySkwK4rdq#(epN`E-H#^g^Eg z%LmM-PtEO7^CzEp`giL?`qpS3cA@!lt@(7Z`47*T|L}&n-C=I6=1(3m|6#NF^5^Eu zD|+i^hV}Jq^N^P#$xp;jW1Vwlga%VoO%3&DrQPXXc4RJ5bcK!p#<3-C{wW{sWGl8{ zemJ-9e16TiJIk593jOOM)(b3CMQlt{T{1v_AL2QY;n`|wUwIMPCp*|XTb*1O+&Mcx zTb-r03+|MymX8b$l@CLLJF?($hhRarIx#=EOE@R@z}-nKUn;iq3rCn2B}t_hi6W2n z%kkI@<~>9sk-+I*a73ZHRR6j>#O^b))k&mqh?3ei9Li-lbfBc9& z>dheNQrTpyfJuK|jJ$ccI)V?h$IOSJjQ$p?VJ zKd3N$A9biYHc*`1s-P9gjSLM(g4Z)QH@Cog?+g|g1;YE&XzoqM%9FnePM;FNs4(&E zFpa=t3!Ot{X!$Y~cw2?ecHQybs9>FZ{K(ColJmZsJ1b|u{88?aIj7~;dWQ!N%Bjz- z4b2Z8lrt*#@SLL1DEAUKx|&j~T0N%vU+503cApCN`_LUYqu0_RrnSE724?g+vG`p# zc%|FxD!1eXxBr=L;f!932QJFmZ_u=nyN|e2jjE^auTj;3#i2RDVx;yVa`X;wX)ZOd$`;}Mnv|_~`1;m8li*Dpl-ka`Y`<+>b z&StY0wk>-pz#rc19(A)j(2ftZd~V8(jjhT0@;AsYf!_iNTdyw{R4=crUR^V#W>Ga` zGxMsKu99X=1^KMPIWten_mCTkgu;apc^8)uZ8LgH-!tzg(&nCyJRckZYs(b zKu^)G)z?C(w0O?O{3F#VvbZx}jq=V!(FuH9>$-1<&gfT$*JkueJExd0KSBN$d=D(I zg?}=xc?_gi9{emT22L!jngSF)IK`J^t7z<~!BJ~LKaZGSjID21}zgut* zuJZr)2~I(p8XTFQlRv00ZE24}@KriI+}{LLO>mWW4A(IpJ1(pU?j&BOz5H+Ae(a0! zS?bu2koWw6_BOEguSJ$H_ahS@Py6c(I>yT}?Ax_`iA)o!UMk1cVmo`6obDmNZNnthS@{Wdmi^ z&n#z(_hl$^vUb5OrEz!>Ja?B|n9(UTcY7wk(VFve)G!Z~v(=G2Hz6-Ygm2JO#$D3O_8&6l4fX++#}UX9 zyuX?BV%Mc~OfOsVI6>A#&#g5H=S7nO>U7-K=xZ;?wFI1F$Fhqpi9VQ}L)7*bDUzcm ztKMF4IP;O12em-mA!mA2d4}&s_{88NoS#E}3$y~uH}V(5H_~YzppJa~(yrqhczpj^ zZu~5l%PU82E z!=nW~u+#6Ae?$HZeBtX>e7}|VN>SYYW)(+ioIU%fj%1%_4ul9X+t%E9t<|B?*Bk%H z*e`ASWytHmg}~bX8)OO1{`>XDwC~wAp4xk4TbX*NU$86n^=mWn^p{Lul+{mX)8AN< zT}FTGj?|kw(l z{d|Bv8?R3zKMQ{2bJ%*kF4Zr~?KH}8UzzhUFSAU$)DcR{-6(AH^~F9m^{TXcCLyahA?aw<)Utam~+4+sVqLwz#o?t%M70BwJabV&;3ThOu-_ie{MVxx{;d#U_ z$(;&@I z@?+pBVEOzBSwc~_{oTG_)Af`l+&AeGa}(}S`Z`}bY(13|&dLw7vBB%Ecd+}kFrpu=!0;~n#PmC_=ev2xi@4N-p z^{dajz4NNQUx_KgcPKqK`1lQUnd!RX0$RX(>Atkn0^8-zR5Xm{FqF1Ptzgfox?YCY zX7oxLZ2%u3e*^vlEU$u3eO~^28G8;v+W76z)79qw)BW6a+uZo)OwPu0%DK^#GXTa? zL7W^Y$ek!ryuZ|E2f1TVuS090;Z=oR;Z*_7Kwbwf1eVto$P)JIcHGDJ*THkAO=x#j zN!^m#JoqGB_Msg`mlgHqKI$O-H0t%{MkMW&wa6V%mH0TAa{_T(@Y*YC)_k`Lh zOE`wt%;vknC8r*}kCeewn9soB40%fqdJCAA>#7Sxg_9^UJQkxT#^)+gC7i=5oc}cqI&zD(7Ri z-5oAFc8qTy?sh8r8vSc{zU2Q(a3%7s;4WbGZ$_3drPF$pwEjrxp>J@{)?-|gWQ@1T zJzW}ujREH?VrOKiNbQ(Q1cfH|imDwW!9WArrmH4J7j0`l!z-?kny%ZQfM>Nazedzwx@d+BRkifq0)-*j{zq4RhBJ(DSKrELS}8skt#@UTv>=cJPuG72h;)X z%>iwW;|%ic$G&#^k>3XI0c-!K$P$KiTaK)hoxM8O!cClGm}0b)x^w_+4DCso8)EEz zrW}=Uu_z+6`FtjPVfyjcQOC|fZux(hdlSI8sY(WR@nGnbP+EKgsvrXJ+m_&vTx$Z_fcQ04-0;hf1Do=RAyp>(w~!fa&+BrfS(2 zFs(gpr|XM=*`8KxUoWxj+okIErfGkALEYxtA5ONfm#eS-<+eXPtRA0ef4Erv)MS6C zv#(oy_U#kJNj+xwN~Rb)y@xSFcm{)|Ypf;iCD_RRv24iLVKS6>lj&`xAu`Qc;9fv0 zxb$*%5q#YoH7q@I)G*H}Y4q<)t#f$$TGOPT;69msELqkG?pdmz;}7Iz`+42Z*08hb zQ=IKT`+_uUjyvH0tx31%kf>KP*u3ZGhZ5d>&muY5?`BcDSGmirV_loPB_59AIo9=n zTpr{M0`nfzf1>YhYx22c*b{T1)orHVYGxipAU2pSS--RV%Q860@(}x%G0&Kzrux^g zf#x~WMTfAvP^B;bM=C!3#OGA#uYoIoj?aRBsrYPv<7PV@yj3$qeD;sXxBGWlU--;+ zf31D}n%llTslNN8x?N)0U;bVFcE9@cmdpO~ZS|>B-L6nC+^as_A{9?Z(D>MQn2Zcu zZF(zE?vq-$4W^I&6-uo0Zk3^nPV-8& zmTC-Y=(gCOj0hJpBWinRgpX7Fx8i@0uS&q3(7yox3pD>npv4Wn{;yzW6#uv-O8+O@ zFh?K+m0KE+EyC-K^5dQG|2xu7p9j4ZlmN|tIkdQ;+vx=}7f`r0R1R<5@NYn*Vdq;`IJMt%v@75DBGvoM=>OoElpkJPE!0j@jIJugx}-PPlBhT_{G~Xjg9_2$ElBLZo*?L2)m#$B4`91 zKK}ozazOaZg`Ni%0dW$p&xTwdxhJ0!Lt9#TQw3{Okx}aK3FD{aap7|#^moAbqxfk1 zqdHwD3eOsKoR;E~TV%95e0Jey(BWf!j;$9E0OIy0o`jFYRezZBR8)02{8r+(4p$5G zW^jHKzv5@N+q_c=mrffcL{^EBUm_m#IsA6ww@4s*{44Yu;O|lVMmhULQsK9vxv8N) zeB)I3f@@SdEchalKGr~=3^o99qR+e((}(DDObdxGq(5vbCrnkbM|yGiy@lV|4!;o`w3P!`n9Mg${5ku` zl1(q`nlXr^jQXn}P7m6CWv^A~Wj%iD@LdM|b@0t7eyN7<% zK7#%P{O3#ab5f|%=}h4lcK8)rIsN&)47w830CAFDQZ2`{g*(M+wvIld)8V%Rzk~QI z>E$`-KY*8_`04S(WaH1~7gM0kwR!e9{PJ8mcAYEymO-xo#{qE?zEtZ2n_rANi&Plb zsr0fHzvT<)76DQ$IwLVh(BoD5|=uV{AE-n!tDc2mn>*1l}@hi~n;A=p)*S-NQZtIZqX0fH) zTwM{io799{4gp5k%Eq6PlU4fZ!QUXCMaLgPe+oVany=|qd<){vO^hwa5Cqr>655`RU{66Q_N&EQ<1`Cb4mZfD&2ZA0>P8c+G9n^vd8x5G3J z2gX?}Ef1ce!rP6%EAh7kyaxR?cpqrKA3}?(PKB>j$|R5c@K>6o^WJG1CBUe+78>0S z-(sJN-vazDgRTLafaco-EiR?_6~0bclwWe{5m_phk7~!$LWjeDC;sd7_A2z>z(0WI|30+1t|8lh z1Mqjs=KRv~)n29lmF;+{^`E`L34b6G{tD&-tj;gLuq>cb-*KII zTVo%Y*yZrwiT{$vCGWos{Tg@^X#Q_Qi(8%=f5#wyc0pDqtV@kmWb`H0XgoSig}W$C z)raf(>SX8&Py;mIv!TW5eev4<|B(4S66Q{`@`tkVt_ALWrg0)Lo)jw)eGdOF{14*4 zg#AV6SHNF^=Klt?xRlDbs773*j4SOg>5%|FB58vmUw(R0GYw7Ft|N^;~qLFsk4=tsP(2V)PW( z?eOoy{}Mh++4mCkU%=mh=KnUdIK5vzsq|;_k7U9~(R)UJ(OY_!6aLHy|5KpP1eHMZ zuYneqQn_#QSBnNCywB?AZTsi&@52B7^bg$&UI&{0o6zFIFKoB(NrgYA5t(0fXra_R z_!Aon3br^{%}XOT@1jCU`_wBC4Y zk~P*%aWKs~%3958m+|HX*Cguq3Z;)H;4gK8q>b01-vu84EuSTa)#29tOQnl=yNy~e z=dWmLKC-5!&K{A;FImMX=mrEL3bwKRJI9*qO>>RIV)RmxWSw=4?J1XVrIMo*K2koF zfJ>pj1#SddjxK0%_gt#CL?37%eWmG z$6Cw0M_32D4`!}9kEyz#scypHU??ie+1=8f{;+Hay;owlC&ReJmCr%w zL9#-S_#=khhuSeP&dPJoCYvnf(+DeQPVtT>+t-qOKu>rZZC^?IARr$7(@5-Pzf_k9kY=##1sADfr*S`tU%|K>* zPPs@bqjpMOa!!TQ5-K`R$*~hY>)|71#S74X2k!wbN9JfH$5y8vDsk2u#LJi$aE3%iJT`btjt@)?=miu$+jb7{b?pH0dm$UZX z@ppKP=iMu?J4-K(0)@>+LF*RNDiqrWVr2F#HXrS9$uVWhWq(!4wHv-7m*{U~9(fhtF`+AwusS=%K3{5d<+?9Ya&|g$`1$%5(7y!TK+E|%=XagX^gUjGvZCb3`g)`+ zLY^YyT2C%(@zfuS#W{ao@$GZ?=8aL|7ah%qJ`@}YG~Y7kcg;`V2jW}0pqPdWmcn$>Gn{_Fp;cj65zmLR0>-rQrCJTOF>uL(%<36d;WH>Q52p0s;v?30$MEv7Uvo|i7?YngdU|1qvsn+A4TIL z@xB831h58Zxi&y2r4KEW#QS>^@1@bvZiKH;{I=m=7!M`?KLGs@_?5#$>d(@+@vZpq zhv8%QbfUXB@6p9MLsApvw8O_go-um)f`H6{E&)da9j?vL;_4myYlG=K!Y{gOGr7<8 zj_ZAw+2_i$uLT5|D!6hoZ46o-tQ5_l(N^g8Q*Z~USu*ALOV$wQ@eP*4U4gW0UuF(P zRH@Z&7Yjzul}bO|$h8f*!U*~*^t<2#pyke)pya;CIWH-(+^Wewt;h3_`x%ef)aE|*WbjP-0Ql60g^+ zo!2UPw!p80&plu}^zGm-pyhc8THL6&Q%DlCSRN^VqqJMlNjX9@E!p#Kj%0W{y&p~bE1 zNt{kFNhwur@Hum$89YiQi$`5E;6Bj|_+73#n$QWsP0&`^kfK3>yY~LwgzOCdb znymC7@~nbB6`TRIJeNU>OG*!{jI<1j-%aygrZ-|8%o1M|SP07~-|7^aJ^zl#Ve}PYdmT&$PC0};j{O3UR#+p!d zTUBUPMYFxLr_(Fx#A{qnGuzLW{6N}p_O2gm9pxF8=C|oZu3>&o#I{CcWO5zuHz($p zmvy$UyT>Bx z3ah{sV9$JppKM09bFl|uSXwr1@oXv@b55o?30q8-O7A7#S90Y|b;<(-SqObNSO&CQ zH$#g{MvwNvBdy3at<$qB(zOqx1w4)2omp&iD5km-$e-MYS+mTM-eRi0VOUxm z$#9FNWZX)9SJ+Q2>VIC|R_`vdSbE=KT74`8w_W$mDqMZYE$O2aWKPR5#(_ydhwFZ5 zaXMV6=rDTAM4XBxH0PpZ43mo+l&`ccmFuc=N@`PDJ|@dc)E(=tj=8=6i-^ z4~zUF@e%C*CC@_`CQuwmktju@#G034GwM@jI{RUV@jW|A*oGk1nZ$sE{_~ugnUiVq zSD0yzOSh@fP#*RvveNfQ>@qU?b|`%q)75x((83M?^dfKw(E4}`THL6(dE9~YL3tWA z;xetv|CIkuzuD#gt-48x(>}uJ^G$RA5ZgYSmNLd$;4W}4l0OXh2xc)5F$S$IB>cna z)v9lD=+v%ZG$55_!(@r(->2c;=L#VPI?I6De54-S4D-YfPV>}CA!~+eh+*Iw0t=;m3&V*=Ozr+zQqE} z{9-myw8&h;(T&xVZM_nyT;55WX-BDxl89!UfA+{gUcef~fwE%E*yp3D#as<#jJWQH zlw9TTl^j+ME`k*3>x(PfVkq%y*AKKLwrzTJApQcO9?# z9GKbbLtMHrth zw2qfy-Jc65iq&5$d7gk@37@n1`aS5~;J-l2lQmb#6TdDXK7GW??bZ-tPYUQ z556Lulpk9nhTHh7YX&FmTC_{1((Wpd(}J-{;u*G(wn~;29P6?sqasFZRy`Bd5enFxJ5bNt${8FA)w{G zaGsL)9%mk7sQjGrh5eU2Yd)G!%gf>SvD_`b9ZRV@=Cl&)5X@g5f(`PeoUME~ld=a}CDvi? z>_aVjLI;Rs=0EHf*wwW&-^rH_92V)RF0tdyd575o;+L0@g(FRe;?O?Q@~E z;C?wq`aWrMo0%^AYSIi-w2QeIGbiADtAF)5zizO9ou|Wu^>}OMH2?Je=n(GsWTzzP z9GM+>Cd>L&mPCsYd_~2}6X;#?Tabu&9r``+A<*$MalVQdUC#~`FKczbd|H?L1Mi*g zfTVa#TKMMBD9N@)xu?0Oc^7&Y`&asp$vl&`W#>?FOt%o^n?B2C*!>qJ zUoHG4or`=ILw^%=04?9c(BhKGk7^tP;cm*f(=ADb+1ywBi$pm0bnn6b(=_kb6GmUHx?ROO`oOi}rs$oZm_>Ah~_6-UnTsJZ}Ib5yx5h2`*( z_IE)#55Y+;YkbftAIR_0b&%YdDF=jOIrT46!nc2*vTCR=rO--e+8ls=8ldI9-@4n76_behp)`7A4$q`N=b;D~hVGilWCR&sVDM+qP4 zbQ-TgzY9J9TF!$GR&s7hIB(;~$sooFbz4Hx@tM}+{kH!ZuUita-`Fv1n)QU~)&dpS zqg4~^>nwzwMIE((^qhydv!HlRtPoskSr0M4Y?OSafA>IC3N$pP{@8)rYEDRbSjrqbRc5j%~N`hs=ef zxCxjNw6Febd$7$*Ddyt)!>su(KX&5hS#w?fk;5jK9-lcLOcI6^ALmgn{_=AHB&XM&wW{%JuX&50>&i$%UN@1@(CC@haNqT7q_d$1q$AFgS8EA0}-&FDpww_h`bJ3#onKzs7 za}pRu8dF{(3X24fVct`ehJV2<#Xs**C!djEi=kJ5Sb#(`DQ;A|LZt($vYdM*9!NuJwpf z6Q!w^p6MFxrf!(V+Q6AqhSm~K&`o0+S3XwBS9-YOPqHy;pzA;b(DI$*{I2tlzQ@bw zSO6+VqH^Q$5#{Vgw|9VbJAAtECkPMWvkUr9;8n+Os@DGVDF^evU}pbF$BenrOErSV z2Uvv27Qe;yI{bo1MCzTBpx1%*K%DTqJ?`9^`0&K=8*nvu5sZtB5mLF~vd1ZXZi7cL zpCz0RKtBY26~$MdyP8xu)r7ZVge?kjB@Q2>M6J6PJ~N@`fO$Zigzt%$R5_CrpNg1? zAjJ=x6ym}Tzc79m@LBlX0KE;|6vZ#`y5p$$>u*~sR$`K()8VrVKehfmN75Dt8937=Pji=nRq*8(lajnLu}jYke3hdx=e9h1#cYI%^NPkM^B6zp9U zS29t_(F>m-pCzq%mZ1xf4YV91p~dO*YzK>v{?ryzSmc)+js4RPD555pi;0|(MyJDf zJ^t!=xE%T_a4pb$Z-f??sN9I~9k9^IFF%d-b05em>8ZdtRh_nE7{QLyDuo-T|ltckWioetmi_*=?1>%m3P-vCzw&G%Yp zaf!;62;bO31-oM3Vrh}YJ^h9PU|e7=B0Wt~;ogP+66X>Jp9V^zgpktLthLo2b%8{(Bcx6I}yHn6gp9=pDn7l zJP_EMyJEC3%^Cr!tc+}z2NmIeu?xO!*352t1yb4j2?$y!7-{_ z?}Xn8(5HbipyRa)TAVJ|>m55X1GNMC_1j;rbK2q$%{wi#%gQ8S^_U#Li^rUvb+qj% zm(D3Fe!Jik3B}ef}rTyzs0Uh(FtoTtHe?eQvQTGEaM>@2)Wa|AmIifo1m}md9`9sU>wDrQQs?2hfeWMj^18BNsHFoF9l$8J7n$H=c!rXr7d~Bl zUJrc7=NQ95F3@u1LyK!odY$ba_0adJhXTmZZ5l@bOgvdjjG~!}e>whd!~YU+1@yPT zjX?ANF0{ChoOLdV^{_`_l^@=Wp$@x6xV+QWK?&)?;os}{pC>$^{{y}Nn!k6I;;;GY zyHjp8R4(j247Ie*n7byV>`;{0yw-6LE~A2eRusvVeF?ZyhhH~-XY*Ooeh>5? z!7D(A?@efNmpT3SxN#EUd!lST<&2f{Ib&rh94UHhXEXLc$Eq}pgT<&l$_vg`;VU>n z@ssc^gI)oS1L7ony8ItNkCE`L70A~ymP+rfO4yeefAOj z#PzDn>~)Po>Ry*|pSgk^hl|;uDW~c-vQnEt8+9D8Q8Z7hxfqiROk>m8)!Lx z3N3Ebzqi}>*JIbO#isYF+7R*8)_@9Gw121P8kgCDJ!a9N&v=w=y>3+HVLYae_40me z0c+~YQQOJhQA~l4V+?V!HQAS)Inf#D^kw;7nOT|c3ctsf$1ss;eL&@Dada~6)P+j^ zK1V)&H{7K;MkW{u#7R2V=~v&Q^ry-L7O7kA;N>!XmScP@-O&O!vQ4y3mu-EP#X(=< z$`>hqwT|DCZ_b1M3TOvfUza++YkvA3#}}sM#%}ssdF5(EsN3;>C+`RGTm1hG^zXoP zj-SF~_p7&Z#T<9@dEwTkLeYPvy6N^{2=3C zga1ubZ%(j>qU~X5q2m9h$y0f5AoH9KpGc9Ss{qo~XOg&DW%@#@0jUHOe7RB`m^rdST2&49 z-EAklPDh?zcuUz=3_gVZ447-9!VfKOn^Rs?$L@1=f(91z!P@7DW$Rp~WTSOK*%f^2;~D`Vd%mo5nph>vWj2 z+~;7X^47`3sB+myD*iqAFZ?AQ-h=)p_?N>|_zzM~?GX=7Em8#MB8s9+*5Bj_rxJ%x z@wy0~)1l7-l|Wo7d}6Dt&!`uBOp(9T;j;rjB@QKYzlMGu{1Iq<22NHy2dS_22v>iV z)oXs_dDS#~%_9jSXNf&;uD0u}8%?%Hq;aT&-@VeVs*bac<9?k~RrZXMk7~-p;5X+4 z-0U{(NlIkvT(0!L9(hFGA_Q!M{sy=jXn8xK#ci9R#^<}7bH`)zT_iuK+JWW5kGbsS z!rNIc%o^Ac2+b_|CDySliRTC)>t@S+vlU2}Lo)v$)fS6BPBH1abswYT>Vt0qe0#u% zQz$dRG@#|$1TC($Z@YbutGD*hV{Fy+fU3IgmP||4bt6+AZl*jURaZ%W)is>_Je>KQ zY$`9Qz{XL51$6~BCQ^Y>1OK0Cv8>{ImWjWm$E$GcbmWxu{S@>w;5nef@dxL3U7qQC ztbY4v89tAyQtWVdIedbrs(M9qb|mz1;6$MLoCGay2>ai$EL9sXwSRr-Yj8YGg$$W1#<4+be(LQoAhe>umcv!?+|s zarTjGqIadY#J>!)3v3y3ufPb&blMrR(qk(3pf%2Y$c$lT&^64QA?D`LL$fv6oQ_44 z>DCOM8gFgLxtOPTK*93Wt;V^2^6jwQVZP zL}2RGpSf4R=34o>Ym8KF=Nau=6u%vge|hkG82WMW8=(0;=lrhu>3bv_ESfiek9N#u zf%tYzufs3<^hi6V5PAV92I8b%8@wGOd?MwxZpScAa#?^2?HF0CoEiO>o6e#J*4;*b zM}J9{4H+~DmAkt?Q6-T*iFORFN#)8fQ2e*yzi!9e2mK51ki&E6_C;(w z^tWR!3rIU=IPDl)@D7KMab|?i6zJ(-CJ>hjpV)THWdYre>2&yn@v|5|C3M$7-voXH zv_7AO7B_f1CN^AA?U-#|yB%{F%I#C_m~k`+I1VY7B*!6-v}1 z+&kT7q0OE7=Zl>9KTFBmi-3ngp9D?;THdpv#VtHWl~XH^jVZ6F7h>gg+A&?ef4J`S znO(l^mVFzC(3Dovj>#t>Y+!YaYRTYxhv|N;zbV7IJlmCDqU7s_|4P0oLZH7w_kn)_ zE#L8Fjy@gx2Ya?>V&#i!&(PTV+-tY8UN#Z0Jz#9(AS55FO#JAz$?l5FcD*XpdNR8e zGwk-vaEjG~>}7Vc)NZOZE-O2?zg=UmLt>D_Y2R$5gHDQn!L+WhtjAm?e0nce;o9cN zE$y4zq3;BD10AmWoZodhr|)}~cckBP<8lf*-DS4*SMqhm$0(1qGbTaL1apDrGY?u^ zQtca2<3Oj2x1hzX z?AdPL`}b!zHH4c(EiHvL^_<2a$F-kZ(OfMnO;tnbkE)^chPvHo8CL}QJjOUVT^L(= z9y8NFnt3lFGQAcVGTrj$ct*hMZPU7(^~UADQSud4sdm9mxSt8V350=`@2Ak>ZrP;D z!Rif8c^E6-#!zFZ89`UbQsY$|nciGce{^G2Q*~YAMg*SRYi(0DzHTs$D+4_qqk6J+ zKj(B>Gu?i_Y$o(g9&0U_m$5j9ttGzkUY5=I@;oEG^iX}79uJ?~o&~b#k+q!5*lB(+ z+ar%=#>iR~z(-us(<(ehbtF8qp_hQefez1^(Be`F&+3{Q#_wZ;bBPMhQbN<~HhzjR z5)~X0z-Vg;=d{`Zk-(TNB#4O2e)Uy>rR39Rl)PQYBV~q^i!Vd>f;WJc_Y-Jw@#l0^ z#p=IcW^G$dO+!VaEoG>A#@x!f*8X#`J4ESR9yiCbTsDvX>pWLRnpZ59UC0^_alsxX zPf1A4|B;xCdg$}PML^4wS)=4J0xBI`nKxj17*L*NO>K?#S-aDEM*k!5%xJS`^!sik zYiG@*c@m>xCllSXt>ykS%bS^zmgUa$o|`tCCcDQ9=A;K_xYIFCn49LKk#Dj1)d!Wy z*|=UTv5n3hm6je{NWHa`v9pPm&%4BO`Ft5c&looHW{y6{vQ~Re^!d4)fkJjScrr(1 zx-YfZy~2U&=B%acDq(%LFEDPFkI66ND%1T>xA_yxI>LP1?OyA;*iK~Vsq;mpr&{z- z%;&e{JLo&W&wT!+x35*hh1j3>kw4N z7|F}7Lx{{%NpN|YYgs_rK(^RyWq2m0&6+rIsvmQCvW3IP#sq_=$1A4whRLhlFDdy8 zHmY>D4H?%$Zv^!~%fAC!+^F5ET)N(w*G!o1bV(q&zSDYA9e(|Snq)mulA*`wU~FeO z-N|tjR^u#}Cu2krRGN3Zdy+NLlaYq(X1dFrIhkYaPq6%x$V9_@-thrX8pDD|S$}2^ zpJ|?Mi)WPnS%s$$d38R@t;G%i7!Slrd$%jz-a~BusaHkTiA~j^wN1?wUvtSkyqS%} z*~TkwX|mg{+~HS?-xB{pa1Hd0;JZNUuM=9_!ub7FiTSp)z&O8XW?=@*OO3zMf?OW3B__0nL9rw76Yy=l{gT-=5)Kdu~M-{+&`}aCw_i3d8t{ zHP!Zw@yl0~zH5aa-<5((p*z40K=c0}XmK}{s&rqwa=`T8g0hb~Z$)$H90_xWd6nA3 zydLK5m{oBfWgVGzOkhSv5j9z1dPZ7CV7M&TEnug@F*HUO`R4c+*?f9lRdN|;N939S zJqr{8E!PpyNz3I_WCMwIiRUQmE=)j(Tr$uQFH`AXlsp~q6Fsd2JE6P5V?fLE8)$Ls zURL?6e_SCpoh)l=Zf*;=9@`jhYdyNTxv6=seHF>t&GRlAW?U_ib@*(n)i4g1dEP#U zfA%KTE-Z$}Lg=NS1Ze)tp~c0YZx@$Nj%_4QU=t&bclmmTIj#=0o5m_&oE$k9Jp5ND z{P-{7-wN)A?gozm&HuO1;`F@YWqMvQHv9!Mf+g91gDIH6=%0y(%Ae@cR+am0%;#a%43qIdnZcNIR^*URxfbaU=DtGwL&~ z+k3J3u-EMN{#f01dhAc1SoW>gLc-o*#_vrwf>>E;SjS|HIL*w+^RnGrEKta7kdL0$ zaP}2uFoclB`hUNb?f$+==WH22Wm6IMnt@T-W9R@gNj7cx?8%nb%$T1&BNwYM89X!v zKRC>n>6G!N+b{NGvZ)*0+|$h&mJgd2{`3G<0@cEB3RO>zndR}hGDiC*VH|+T!J?6# zQJDc36n2e6sMZDO=z!? z;{@#?29?K-u}uyww69_NT5exobfLa(ud&NDk-(2+qRQiztQYX6(YN-P!~7GZ<&6?E z+)S)Z^-S`x*9N8LTcZQ+kar>T%9&}NbWTX~jLfcQ$|Eo*V+=#_>#etF=-|5ERpBgY zRONat--V#JfD3^R=XKEH^f_RIrjyuk>Jxan&1bELO}5Xhwyz5bR-eoGsrz6y&@@|L zwPu>52~wduCyQ3&y{7e`)Lr5_-&gYW!atACCBWO1V~hf0fR=9>v^aeZTaxjxtiGuw zBykY_rX1>e5EvmTmNuh%wpE2K-q{`&seCtacQ2^# zZc?{<)$J+E{;fj7HIh30C|aBItURxbQ=W-!s!WgtGQ2qqEidMmqa;CP<&H|Xjw7jE zV4azE5PR=2hUQMA-Ra62S@Wdj4|>itmz|oMo5sUp+UiXAp`$X{N}uPI9ntCJ+cU|^ zn3{2ASOw{1yYabpO7&TR3{ODPER@?bscmA$u(7W30eU#4*47c$iRK~bwER=0=UwPg z@?SgfoP&K5a2n8hE^1bKUgy}eZ*|rOCD60eYv|8{eP-+XrrBp+U|)~4uQ#y4im!gF zZhup^?do=<{nK~UhwIesJ$2h{qUeq+IJ)zXBO+!w-^`H67(v%y<}fk}ex*%kn-zEe7`CQ*{$%Ft;$U;% z06Yu=NV() zb3G&Nd$wnoeNXdv0&M*zCJwc3@-iJ`-ryrfNdG1sb6h*|kj=du`~>=!;8#G$(}&RF z^n7*yzQXwWF1GxrqT|1^u7%oN%t}1Vybfk17TMPcsJYu^Z1Yb<4b&l&BtEGj+*zQF zVsR`A&qm>CjO$rb#?MU4@wu`_6NFDq>v54wT$fA9U(%w|ndIp@=vJ@=X!$RL7N^Vk z{&Bh_25e`>moL>7tra@a(@nY3WiJB#LUmJS*&jyRS7}+bdyT*PXJVqv z=Vks)w&l_C^P9(e^QedzIfcd^AsY63$;y_01{F)CdjqSkO0APTOT5>ao@=$94WA0v z4&;__b%JN1{{i}d4%gH+6|T-NRC!r4DyeWuI$2KGq|ofLe&Dv(V1G}oK0eX@FiMh( z*VrDIiRc(`0xtLG>^O}CONN6-k%$OT&N!cMDtnmCz(K?hCJY#>BT%j-?kZOp(T$Qc z6`n1~8|3qP&**8(k0*Hf2i zyY)k->xQQ0kXRR!blqV-qKxb>zeX(XOT)Me!!&W@>DMet&ljH?Q4@5zQY)(6ryvGo)sg8ahi1>BZe1+-jk(BkfK){{Lk@VFlnvJv&Pn@`)@aElS8(}h{P+3d3|;%~WK z%~#7LX+9f^E%7=>$*~hYl79T)dFU6xpB&y6-)(zI>1B|5r#ZAa)ZC)8WZ38kgpKkr z?}Z)zgXgPqK>R-h`f#ue=y0xv7FQm>k21C#sNt04NA52wl2zoLmJF4!FPg^8QtV`( zi~GETn*Gh;?pB4Zn@g?UZQ?Tj$4mxUG?K&;(5Bhg)BRCxQ~Bl$(-7;_=>{9qQ) zauh;~)9uYc<%m+V8UdZ*41pp^hmypDBwePF3A7m#qdZ^9u?0Rs_>_R{(6@uTfR^K4 zXmRoJzK1>rltT@PhJP%5(@do3F^z116l-l?8NV8<;roRVWJd?bAogS(+01l>T(@hG%7ojwN1e;hv+ zKk^rqM#^tx*D^A6o5m<0$%6vPcBSK$9N8B|^5Y`t!@)A3%k2te<_yosO>?DV?V4uNG^q)SCMr2P;UoEV zCAbH=8$1TI9KV4Ur`J7ojaKdcC^@KOk3IV6qeY5#^Skzz@udjTXBxkxo6aaKV}A9v zCtQL-CmmcIsaIz~&js^=I4Ku(`JmHb6u-#gul_AKH!>;GZLeo8a{LcR`QHJ39r$*t z{@XpW7$%R}Opvd{;j;@rrEC{`1pNv4PZXc{e(8YW(5q)zXkX!ysv`Z2EGq8-`k+YJrQSrJc_SMH_Iwo zS}Qg-Hr3Y=!2I$fh|$6_pRrA1bgoPqOm#C0xYAl_d&mB1#lO$-Kaa1?ud(I_i~^ef zcxZ7tU+a4m|Cl!326n@23#>K|vSu2^tLGlHG%J&N$Ac}TvR%nk#kUrJgM1@lza07+ za6Qm`w?T^=qF#v-A!?D8YTnu9YE<*i=ymw+!rvhN`oTxgpMd{3yd)jzdPIk_zaANg zTM1FCnsr8SnhICZ<+j}I;{Ph>)nKjq&JJ7o-*4p?(pjWlsOpcowQG-FDCskdA^fm0 z3Ja=?Y_UGUvivS;2aCB0CT`MgdW3xT%Bt!Bl>N#6RX$~lbxC`jF;L_s798m%r?42a+I#~>B1%kjVX>ni`0^4&V<^T9NORO)lD+iz>vtrYDi>`T|-}JUw@;%QdM`RaZ{k% zZLBP0;;NkCkttaDD^FYC;Rq6H)bZF%n>dV#hi2<{E}L)PK`Nf!a^w+tzktr#O1cMH z-XOHNcITYLg&C?I-9uiT`a8^VwseSAa? zT+s|AM;JaqK1)9M9`r5XCqT<_2eh~$@h zH9D=Vo8tOB;%|>5$8Pup`7HXF^bKsifg^yHV;QtKoj>+yXC;=R!@N|*91ShH1nO$X zA3d>d7&TgJjE=VwguLUaoxJg5d znYzD<|LwDtJe>|dDPQh@z6;z3v^)aJ1OmAA6$G&^5(cTdmOr2%8IcsKghS0ryVMy6-j zh)hmrnXB}Yccluqq{o@i3&9eg^>VE9yVke9_sb{cgkv?J{0EZedvOz+TgjhY zr1aC}_$BG(VdzJ|<3PvDZ=BzCeCT^jyx@5`$|+~HQn_PTFYNfAeRZTCJ`;LAI2dUE zmqLq+?}zvMUog|o5i{mSvV`h(Z=kTq?-yj}K{9Xk84RAHke6NKTH&p#ryjUtYwL&^yS7f)uR%D$ERXBIy zUl9Mw!Mo!3x3K>OG`|3}xIydp(_^@GnfI7?${cdQzK%9-k+R(l47MbeGLE%K@hx@y zmHb%&T@7l1=3DRluJfh7la6T*HnJ*Q*I8lXHX6krq=zMk9%&0Jm&J-tr{jxuI3b!ZL!U^7eY>l#9ZB>#S$%WwMq>>DEC%Y)X?@7J)1pdPmE#Y(>=QO}X96otSI<5?l!`0LOqa z;GGG%#>1ckl!GGR0e>8iY~ZV44VVT#9hYl71%3!NfhAxV=pCEOS>^Z(jt6<*_557p zXJ89h1tx+2jL9`#0C#|PumQ{m9`MJ!T;q1|HLxDc25#`eXr2e{U>#Tn^1$1cpkhyJl6<=0QgRJt}z4Ln}u$` zGnvQ%-W`SxfCqesS=_Cl3M>Vq!0YL`#@*nnU@e#m-cN%EXa~zd8u&No);#1K$RhgOk7n@Qx?f*a5a) z11S~^Kjrt;2cl_hJ)AM!9UOrP68#s z0#E$|dxu~Hm1c!qR@SnGk1>6Q&!BHR&yz?ge-@(-& z1d4$Ny!tm}02hIi!8GunH;@6`3cd--ByG2o!?=cZGe*60z<8<)u zv!prD08H?$9&`^Lcm`Xz;Pu}Tc5oZm3|4}%;N7PQ4>$&V{1i4oz#8!RZ;=5^2EX_X zdxSs@`1DEq1_yypp2#sC23LbJFcrM{Yuf*y6|4X`;LXQ#j6Z-1@bP1;sRdVn4WIz* zew4Gs!F8Yl%mYF2@Bbrw;D_LRa12-s-g|^N1gC*4@aV5t=MNTwe{>TDa3&ZDo_v_R z2@VGD{x83Q)4)_P61@2k;R79@63hZ0{*rYspdB=UrN9Sz9%MWWd=s1uCW1`x!UN<* z&;*tOAL#i7^GTo#oCq?&6FYN^OTgja-}jRTK@*q(-nfr`H#iH71<&5gxGT5Cf>8YzHmiXfPVQeHUpS91s4}MY;l~0w4JJ z&K%>%U>#TnMuOXZMjrz_eh1Hif837!Ffa`K=zl1KKnX|(fBGr5P{6lA4Oj%+;JKfm zd(aGy0`q_gp4)*RpaYx<=70}>Oq_r#!3CfMWP<29@9>Fb2GFD`gkx1kKU&W{X7q-tbQHo$8i~LXhOs%3_$vhk?nx2_3J+ zyq#L;B5x-tFBU_^YG}%m#=Mt;jM49v>lk}RX%nZGdAcl66C z3(S0%Z7G8(zQ%cl4HeC#qJ$|s_9e=JhNi|u634zH+)|cRE4NCrM@X)TnCcANR@qw5 zfK*c>V>OMfWimXqx7?MN$uh33m?t@FUdm}*UW$4%h1A~vW|A^CS1l|Akpgiq(tE!j zEe)x0P4em5hKi~}x!BL|g@Dze78U(TGPIws3)eD-kf=UWHH^GqM{<(SSJ|EyZecrp zatxdoHdZC8VdsUa))YBZRVpnH(ZF%CRRv+LXleLTDM$RU^JS81u%EYeR|e~pUrOPH z_}FY>jgiw_F05^0e7iCf3b*i0xVh9NOQGs10o?1orcT z)Ch^CZ3&Yfo3RDaD*fKjmM~4A)>>3uRY-rPuo<&aY`BY(=}UWw*I!O#r>7*{cDtwv zBl(;*X8j87i*!Cyk~e{WP8x`AktWtb0zXC2eJNvqdrs9^Us}G#*v{ye_OH4sVc(Y2 zSKU-aks=#BqjWRa5RE(>+EURFCKV)TKsa7YGo4A&B%f|MudylIQWsq*4JZne>!B^= zmilm6TVq{vV;pfwbU=UYY*<-GHQ7w9x_3>Cem_`cmMGZ$&o-v;ETc zECYt=3T3P=mFJ~CN#%L*KdFSP!=Z(W8a^B(eiD}&G#xi>WQ|hcc@+)yb2rbo@8RaU z&Ftk#tqdQ~r+wf>lq&ZkIOmdeL(S2>iM{Yd%(TUnh$lqAeB&6ifJUDkZb(1aT5TEBc0(S>{nP-+t#=#qzd{$O49+=*iU!8tZGlsXqeybDXbCM|SXgP_qQad-EfpEKY6;iOTTmEgDsN+Ob zR~{`+tp~YraFN&#AJP7o3f#QtxtTBJ)4q^MEy&*&KGlUADq5oF#`ijGF*U&6`?8PH z5$SQ?BqKc9H>n7Z_C;NdNZ))1qmfS#ver3q^l72|G7epy)z_yBhR>_d)>H4OPNUOA;N=T#o|1t=Wh)?wM zjP!9BRw{3_gsRjm?oe$?H9uyLNHjM!wI)^1MvEmcr6QCJGep-~1I9))1AAN|B@Us6 zGWskMuvA{F3N^Qug?0K>Dod$IO=42%+=|w!+QPG2ni}`}Oo%;nFYS2Q<5SUKH|Z5= zD`hWIZEJl?AxKiE_S1D$n?lJ(g1iuJu1UfBO`-G3DmJpcDw%;(CrJsHT1JVOhTjw_ zqhKIgrNA=sY6C~GRB(v*UcFpZUzfyKZ=ss4RBx_hcvNO8n+m_= zTx~TLTdFqJ%3LCIqURR&U-nkW0X>vndCdGuN{MGcFRR-c_Bz)N=piLxP2FC%dk66{ znbOjpf|3b|LI%+iR#TCun;WC09WdWUJ&gZRQJUcCMv1S46DkqknLxKaAEfe6DYlcy zQIRDIELE?imW~S9e&p4_nw-dVmyI&C02=&^c`}Nozkw*xpPqM8=;| zONc5>>M5%Olo6zAk?EHNGDa!7p)zsC8Y@+471~#y5N@_GM_RYBN+kjaz_6;(q(={BVIvdarDc0?2Ub)!a z-sA>D_IwY+Y?$$i8AjRHSxJqX?ce^U;$dGC#WjP)Qphkh&Mm=i!vH= z*J_|N-V|z6 zc&j#4kLk?R-VxJf(NU2E8(G+$9FvMlwKS-ZB|gb55^4_B)Q75CW0$j~qIm5ArC(cg zau_gN`r%|2<%!t0+U%lFV7A+CoK<%M=i3+T?{fL zT$3ODMxwyl&sK+1^jy7=jNh$Qw%<+R1@T>D2tLs&7gr@7uCqL$sc}T(_|{x=tN17uwH<8mpxf6SaPRh(Q&3Bg_Ku zq_c)RoJ=IyYkiY>5DAibOm9t25SA1cph(b@TPq?@)}@#w)$_@OtS;PKac*iUuK$(f z{7>pBSt?vpQI$fvVQH3nB^m!~n_6PFs1BNbYm(b8B5}f_;imffGH3O6GGg#bLmN$s zWS*^VY-wmoIP)Wd@Fas8Oll>ajpPk`1wra>Bqe&CGxDEGEy?(9U6bk}uwq}zkVLE^ zZ>SgT=Tl+XzqD2@sHuo)(hrzKV&Bkah$BtuBwngx$7#%}!X)0QX{t{+s~0Pp{VAaa zW8c~D(x!xtmIKNm_4ft`{Uq8uDoW;FQgl1~uCqlPc_EUzAVcL+UK! zrmhE!=RE~=Of<1@Ws910NmWI*_zXR^wk7Nj^m7-ZSuM#{t~LYvjhe*0lztX1jk-IV zpb}N`C$+Gu-*YC%!dQPvnBb#cIH!&A*`y;iiCsMXen)M_NG7N?$wyNa3ta1x59A)J z#8T=@Co$S0!`m`j-oN5$khHqr_!94}4He{BxapP zN+QR4g@;2`d@1>yM3n2jYSPt?PPqGv&wgL{p#!wXpv(RW5qru)jr-Z|h7Q#JUSOj6 z$l8)2_h+W0OvhT~Mh006c8vIh8MHTre`IAK6sIRCDu{>Ch5+0z!(Baw=k^#3E zdsF)|!u}0$xW2B+UYCu5 zSPuALIE8N7{x4ZB1%?g^!&?W6VFSmW&>uQL!K<&sPDB}9$k^>H`!nf; zHZzEFpu)$PcDRZ0#skD}|Hm4ct=hKatwMBw8Yxvy4I%X?JNVvnD)3Pg=ZR&DLtRzuTDKvxw6iHWYLjp(kz=2|d45x4 zNVWwhHGd!bhL{&iq^OuTl6p99S?_@HWc%8RNr$9-loL2*p<8kf*Rwh=sV9?b!N}RD z7}c|*)LvVa)aI$Ew`5U&DzU0xJ>Q;JQLCpMo(WbL^uOs4d-JY-H5q+te)^qg^&}~3 z%&UoFEskH(k0(ACLHo?aErHmS+>$l@k}RN0Dt-39(6~9N=ULSft_vqD%XrMTotH=- z_97Ykp+S=4zU~#vAa_+OJ6l?t!ez2AC`!Wp#)}qCsJhG^6e1d1I0EJXF=m+p1JVbI z9lgZ^#)`36)_#_?g)y8FYCd3Won6jlc9-;k@@3n>feNL)xW_Rbbf9?Zv5*7Bj}vpM zn(HbLm`{|md4D=UXxHQt3mvjT6$VDt_0*>bBUnpJmAPFp9)rn!4-=7&I7t{7v1 zHoCcar(q5-zPwf_b;|DNWSDy5zO*0cwicw``>PTx>xM-t_j6cS`rPccxg57yYk3eE zUzaVtXXhF5q)uF3esO7zV}06anUJI3>xLm7x)ROnq|msS0Nm`zs6y_!4i0(Jeo3?Q z6juQ?r$dR1#kkGA33p5eYwDsl6rQ_iVz6sb3)8HQnH;$pH!3r4W;0^R^Th6cfEhW3 z%{n}JBnjWB%bRu&n*ws&h62?r^@g0Puvm~v!F{Ego(UsqGc)fuO?qzOeI>c=gN1jw zvhvBy%qYsg?QHJ;2?aSBy>hd9hTr3Z3k|Ww(Wz!f#-|*b8&|X(PX5l^7?59D}!%NkL zShnw{-5@`!a~y~An^A$_I;CgQudm#z#+P@{996j-7iNGk2HD)4i;7F`ZMmx5d6 z>8Bu0|M)3I9|fU56=cfgSW+f5Z5~I6D>ivhiARoxAeIe&)Nw>fma=fVUEGd_E6J10 zuT@SC4ogKU*tV43iBz-n^tio2I*;OkVhzm#w(t>Dq zdQfYS?7SefWE=F_7@6z_?g?rIGBLk4;O&@v8w;W{UP%x>xLRCDzgb0sBupzRV!onO zEMjJEmK0i;FLA0%pu>{{B}HluP^ln2mws=H1j$~QHYIM0PegKRS{l|7V@LG)NKTce zX3Lvd_!3p7yg_FX$TD`*;E$S3_J;8b$5;g=Y2ti#IT+ibzC+%=eP=i>IUqYDEt!r9 z6cppUi>Am&EE;ksAVIX^qNj#S1qdq0g^)2DyUL+QGCL1vDsh@)VP-C_BSk5q7&|+! zB#5=%kjJf!<+TYDNaWkA@2kL!_A^H27qv<|N}vh}9&G zT2P8J#sP~WzM~A0jv&Ln11Tzok;FohC0by@er9Hg@B6Ie^eNLw78a?elhibfgc5c( z$*IM~g~?b6aEA}F7F*S{A9H(Ls6nv^V>a>@BhZZT?#am|Xlz04k_*FX4GG{yze3fp zjioa5$~2q{;-Weyun{W>nEFS{)SVZ*|KNm}*yPZl(4g)P7hd-578FKg`IbcE-f}%z z{Y9T^`pnBN%E6!32eKRB;7`-YF3G{4)(f&5>)=o84cVnQ_|y7Bc2gYuX`Ljy0tbIu z&&Y0;gTGwA(6Dj`f4PpK{)-*_X`Lp!l@9*24wT(94*s;>l3j&^zg)-Bu#FD>w0@J_ zCI^4VI`VA?e_991uGYby*1NJh?BFlg&ou0)gTG@v`k8}2t;c0|*1@0F#j^X!!JpRO z|Ei;Ty5X&ovNu=EB8g?xnfVjuFEIZw<}cjgAIbbLUXB%G@*)y46x{JXF>jL6gg-rs z#^TRt!r#_}|07NKuWG`7T@(IQP55tW!hc&6{s)`z|F8-FPnz)mz6t;OCj49Ch2Plq z?AU~Va1;KKP52LK!hcK?{*#;V&u+pWr}ba=-z)InEAZbd@ZT%&-z)I{?-f`l=_l?y z!8Uzni(Z`>4`;j|7)q@ePb`W&9xHCmBD-_@9ic`%3$5!+2-L!x`_# z_-Mwn7@x`bo#%nqyXfxZa@&OJG^mSOc}q`2x64;a+j1X6ZcEF3pz_D1aJg@?mF+<8 z^OUcU!sWh>oL=tZ$lFvuLLJZA)sAg{>R)fS=Tm-`nE- zKPJe1g{UW`_YPr!f#AMzIZ?9(l*54OR3i9B_B0p;${Zqa^H9J<}Tc?iUA7jN-d z`&E&DWD{4WJxrcGv|=MCb1S1WfYd2DYX z@yeCB*YV1DB@OpWiXM^>8$l*aqD#Q$Hf;ATnv!3dXC(!_rRQx^Pl*d`yPWZ(SE7&$ z%9+pY+|DVTP3FildS4ZsLMfLs`S}o!9qHsgwEP_4Obcj!@^d9~dabGRlbEPGq@tXU zoWK0Mk#OmFQy4E`yqxh(j1O2ZmGiSNOZ=kDSvct-0-rP8PrTu_K2^^E45hUt+?D5eY;3(`Sad zzBzf~Clcs0L!DN9;NpkG@!}@&i;0d)7!nshmL))bLxzryA0ETDWASNJtXQC`I?*8< zDUycA$4U{T{9@w!CkzpDl)}d(#El#vAA*z+SDOmR51Oyyz>!egN&%dBALR4mh#6(3 zjI5PQj^`jxjwE@`1Bz}6M|w`BT64+OdR|7z-=20k+{4p@BkeuRK+&}-!*jW*?H_HW z?Ft1)j)LU$M8%PzpoVRMBSB#f+fE$u1vP{R1O;$J2$&3{PQX(-5G0333#*XB3&L6; zb>*%c*#nZp$tFmkhV81rDvktK1p~$SIJVUe$CuQCBQrsA{3w?RE*zQcG8rhw*KlMl zNDe1B79WS>Dc2$#B!?#q>C3c|`9!ikn8 zGCTf?Hs^7@>)KouYeO8NOCVAUE>`(?H}2oak&ici4x}y#*B+HnLw?`jT(3BsZ@K4g z+}T>MLt?Fp1nzp&zee{~Vl9mH?WVWmNI|<|Aa&){d#gEey7~-|I?mYJ$dM@H1fb|D zmaXT=%Jm0<)Ljhz9rf^);2UCX3_aV;3pY9X)|TEDB*l_%;mFpGM>?6TmZ2x@~m>Zk|(>&yUdc$y|$qx#(*J@kBP&W5{?I7UFNY^7Y0Y!Bj@Vc%8M7G zI*N$ryTP(EKX*Q!Fv(gGp9MvB(Ui;#B7J7))^^|2T&laD&9nCfr%<`L@=@iU;klpH zBt93+aSGANj6WpRvwxPnCO2)w>%@SQpWnfmdD+ENq&KSuf%H8f*Qbu#(eS7BWGaZ( zpEQgT&j<`pJi!w$5e=hbNjxJVB(z&t_wXJ)dqu~@#>Mv=No}!W5p-ZY{bVDi2_v4P zD^AVsO+Vv7Kd%=MDhQ#y9YYB@ulNN|ms3b!2uCVH-T~h3zExhp(@`F98PE5%06Tli zZ^bFE`UoZcXw~PyudB|mQhzI)c=bR@?cYdc@nqz=7XS<0i`Y|gD}oT1 z9mtXVzye@dU>WdsC*Uo}k!aEnm`bvMx4X8Mws;Qzy5JxWAJ!;Cu_&InM$wyW{+$usw?TjRjA>BfQ-GE0p=O?mq)Bx?iJm zJ3D(fi2HEkNDC0%e@pNPCd>QZgzfXp?;`lMJHmOKaW4=}9|=y$@%(DF961M~e!qbK z$z(Zy@)Jk)gJ}36@RLlI!z+;AHkRiu@ZERhPw-xi1JU$J;NzGqr!RNm$Qlq0uLOUc z$qnJ{YH&3+wR;bEwA~lLuiKq*xIPuA{q})q`orKSnB0&a@9GyoG`s@5ipg>~!SQ;s zV>W|RqH$$c-kKv@K-BMT@b{Q3haW}l_Y;VQUj)C#WI4PX=ev!ab1nFLcbsGl92l4H1++Dnc02XEpz(uEHKX7M>d*&z(^ zrSh$@@Q0NTW4}2qXP{5{g?Ja_aM~XAm9H=Mz59;+`yotjuht^$%pKu8 zsUYRFm%*27I9`h*3+9t~)QSQT=us|KEkO>uJig-1>aY2;2>+J<9$2uUQ0$i`lSuxo zIf@_2w<6u@!_dk}tRD)Dv`309qIXF3f>Grov_Y9pStb-p01d_HA03+O<%*m^}^dty{V}d+6QNIw!5>&i8pT@}!gs zqU}iwC>TVWc~PJVpcK$t5bdYmE4_Sth)T#+@!p!Hd%T-+PV~PE(EE;8d?cvsZ!?J! zxwKslxd+|8OL7u54NnM&?kE~OmdQ`#qizD->i}vG4#01@Y2T+2kSov%Zj?q}ywaCXnQjaOuk$CNqB=&qG=AIEpeE&Ct{}EdY0~%{-6CFS9?1=_7;0*V6?s8 zJ*oiVca9{0=>C(ybC_HJzJ$ql+dr)#Pi|0%=}D!6gl&`LC~)t$ng3lfp!=mxuJ0F0 zn+<4bkQx{6mA*sc$r^m`mENZzX5)ff|H|(dZx*dnpcY209BC!Gm-V`~_$#h2Fq(8!m`#t44EBEmWaBs0v1H+10zNH%Df9 z&jOwew4-kxwc!P%T)Saylj+w9*RhA2f*p7<#2$iHeQ13sj<(yFZfKj@^X(j&VSfSG zgfsOwp#+<9fip}`1D`eR0PZq<2>jS|9Qe8E3t;0eflEM*S)?vPJy>cgMZDRj*}#|F z*Q4(>mCxrn;_uT1HFV=nEjZ)IEe=>(en1zwwe9c|O=p933rLzP3(l1^@s z(t;yzxo^QfGx<#HGb1De*P_B+fiu5ozuNTqlk!MH_-OQYV$h<9BT-)cNYcLkq+@YH z`Kq>q_#L|j`%TLma!t`Xsj(v{i0D+HC2SJ?-fe72RzXP-bYo2Q&Wq-eGaH{~+r>AK z@6oNhmw%{Fkfl>VSbM=Q#JgkHaFeQCOAY7Y>ZEgb(L1*wZIoK0x|OFq?AUN9;rHnp z5;6f}efQ<=OfTOT`8giIDx#jgQcStMDA!NTO&@VbdU-$1O@HV9?>D`?fBC$cN{@$E zbm-=aPR|k;8FytIYJ^4|ZGRMlXmB)2G962xZRca)4SjF4W8`+totad)9&kmE*Yyza zBiE0BM_sQ2|8}(lNnj_`BEEsXKsxZ#*g-Vo{c{!XqU%k)i~im8bXKp_UsiydnOqKT zXYxhp*X<@L&YkB^x6PnFAgb@11$r8^1#}#A8HB1q?EDS^pMJ+Bc+BY#YTlzx=YbcU zt^mDngrm*c^G08w^@bG~bt4)Wdm|3m@5WG|gL9~@jMq)5r&?TZ0c?4_70`U$476Og z0DZ1^1o~e02i|h~xr3a79OB*szR!IK{GGcDEH^)FM&H={G_b;434GJM5AUMO=F5<8 zIcJl***CaHq}te~ednNXtCOL%cc;Ma5h{HvFHX~6rKr%%^z zeL4n&^_6pw^ODQC{QNF|R|=8CWiH42SJTV&!M~bbZYTV!>E(X&znY%vogLks*X3T< zkLs))T~q1h`bWNAa{bxd>)%v*IUo5L?sxz4@!TtYQ{_kA-@Vey$1fkRoKDtD$m!+l z;mSPZ>o3QT*&#{tam)U4`d6_WYJ?M~c0&8bOZ}C455`uEZSAf)-h@_!q~S~9GazS) zZ5ez0HT!jP-G0L^<+KyEYz6l5T@4}Yz+VEI11Rkk(Tc@Y{5Ph(DF3 zDFC0xFTP@fJxpuujynP=KF+4=udA4gl^=y{?Yj$;xv zkg`T07&+4RIQ*G5k`Nfv$I=--KaWr4^I!mHdOS%{Pe)!|Wz z>T>?cuiF1=)L)8!ukx2kGlY}NpIn~hbcE}v=oR9njOg7Zw6k{$l{L6e$H1=L+I07| zv~TOCcZ%#Gc=q-0fza1Xa@yrYTE!UE zZC!b-OAEd=?vQ(s2lPk1gZkk9M+JEaUvh#_Arz31`cRaDu_y~VRu-i5YYP849_S=E zp)@()*6!~EpZja~%lqRDN(07o4SJx_;0kmz^ae&4;(+}O1Aqe!Lx5upV}L1!bYPaD z1UTDJ2E4mtE&JYlK{{Ice5YBC|AvNtZ+?1CQAtrIEwF`|uxpfoLW|{MFnnW+y(+h_nQ_j@4APM)R=Qv;Ue%sRIGddUh&KC9UdwM|opccok zT@GBKeGK@7b|bJ_y9xM)_D$dx?RMY}?E&B+?R&rvv>ySFYL5cXYQF=X)BX-@#Oalo z?dYV}1C4rDpqt(g*hSw97@>~?_S4fDkpuOKz)||qz_I#qz!ZHtFiW2goTV=V{?m0J z9dLhq@#9Dhei+HdkHe^)na4~LjH7cTCMX82EWKbtE67_g1EcHX(8^NS6)2g`c4uIk zJ-yLV+R#2>t&e^=v!dxz@?;VDv`kn9%j6q;6R_Uhq17TzCd^CC<)sz&|2%vgspRDM zwERAj{pI(oyxoHd^7yr!PUd&+;@|5(-D55lc2=%=5VgS~%`)H$%}U@CnvK9}%_iU* znm2%3HQRwZH2Z;vG>3s7Xg&s>(wqW*srd?cM)Mu;oaP4bHrK)q^-_=!jJp;R@@NP` zL)%0Do)T)KST(N-KCirl8e!9^gTN0?-2hhDcj0dCwI2e$Z$AS3#C{6+h5bvQqq_;+ zASLR17Bd$qQ8^oZ%N*9foD05y$&0`rVRAM2t4zj3*xTl*%KLag{~*fkBKB_b4Api6 zcGrdjdun?D`)d0Ft=br1f9(L^AZ;RWn06R&oOU8`vUV~sOIrdYAi4*7j!xieChNgl zGPyOlJCoai(|ywTJ;8f3ITE}-las*5GI@dSL0o}Fx~0HJbt{37>z)EWt9uT(T1Us5 z*XY&)U(&4yZq!u+U(;;|?$YfA9@HHMzOVZTcvN>3C|%Way6cb~6bjV*2>m<)FZ#hY z2Q}P>8OD4T);&o&2^xheCor^AoX?Af{W7Ewd`r%^m@h!559Y`-`I05b|N;N5G@T&w*bW&j1^9IbVhZpD#S6eU6mI}8 zD=%X-Vzg>B20O;8#sbs4(=bN4%6k=Xz4vTl!1jUdQOC9a062r6!DB6fCBXu% zR=~V~#`jOuDrnx+Y8}v^_5ik5w+Hg-NMN*jAaJxg88}s)51gU?68N>+4oq?`!wicG zmp9M``rgG3OuDfL+WAj!MBIdYa|Q76n}>iGZ{7qJ)EDEeIQ4- zQjbEe1?mFeFwJm0mzz9xdEgp)ed5KD<6dWh-+KK7{LSk(;1#bcz^h)@fVJL#cw^MX z+YXeT#iRU1oPQS~5O0QOh3A0MssX+}&|&}8q#D=%9sIC2#oM^rwTeB!vx@J5(kiey zO1ferz5I)6$3C(YT}1w9Z#S`pM`vKEl)f=2KofOGk|z(@E;fNmY!I>_2V4`_<; z95YQ(6l5>K3uj9eQ@A_O8sW{zv_@lb=8k&AhP%+TfU1HzXi=#oZ7?4(ktjC`2yWD0 z_9V0xn%QEPn2qb0T9Gee+i$-pt%F#}wp+3Ar`dK}w!M~Zd$H{eY@27>Z?Nr-Yq}@MC`fC;6WCsCNm_5Vt^b0Aqdlo01M0`uyOD|Y zlOb#D5%w@L39ZVeT4v(qz&v|jjICM88l}c1+-0EIy7anfbwzcv>gLy#)h(@CUsqjMd+{h1=h&~z`D6Vb z(y=s#lSv9@&}<~H!*bbMhdw3&I-U-$FgGbw%q6)HNIQ8_;*FI)ZlQxvF!(g6e{5oKN*v zz{}NFfCct~CXX)_hnogU2W5b$zB&t(4VnVV0Zj!_JtkcbJRL-r0@6jz1)v!qIyP$;Myh^~|94hjeL0QCgP>n|ZTI6utj?1tH#y-mA~ zeNE5f`S9S|^C}Y0&&N};oOi)fqV@5|Q!>T37*ECl-*b3Me)6q@{Gk8Scs@S!{{r~8 ze+N7z9fSPvl*9zN2nRW>;EJcDmEZyN79wwU_{hD!dwqM-qdpeTNB{b9cvdFVPlD`X z?_=*qCfJkhD)htBZo8KB+Xz%KoCh0e5g4RM&xhGoDx~FS%ogW{NS2vz%?3#=%q}95 zCyalU6hO6{U&QAWVfdq%PtAn|YAoX_&dH#euw1n){;f<9-r$FoT_w4Qi{xpUd`?C# zy@#@s^)@Y-hnpP0xU8R(^?2g%3V;W$R_L3DdG_!uTH1%HIeyTErd`4aeLCU-u8oCuOAANT9M{WqqDA?^ z^|s}7CwuZQJ>&zvbkeN&bnGOf^3APhQ4D@sqVhSk^bPVRj&VELff7=2A`$3p?^~#j>&W}b;InjoR;&@&yv>fe9^9eU!^YQXY&|U$!*`yCXg;_!by{Xg0Z+|B(z+Ha zWlIWCOY)uK9CTUK6eIj-zf3f?$meC2@(PvTRrioASbP&9!%>Xt6@g{PhtdFDqSQO+kmRa7fw~kA?@a@U(JqE=+ej-tQ}- zel(DyD;mICJ}=L5@>Wx$2#M{wjJ3m?ie%cZ8)fH@JEWF7+? zXC4QfV4eV+WS#^}HqQr^o8JO%HSY%=G=B;_X+917O6<8@GGBrGr`Uh#Z0T%)eyb+4 zhMrSXE*i5YF;fU_bm)^DbP=`WBz!(2e*&)(s+W*762!X`&LhBkA~4N66FAMg6gb;^ z7m&2Kw{J`@(Z$jg#}aA@1rD(c0j7v^L6prhze`7rubk5oPiTv_=la8u=G;9r$? zpina&XCP@UGHNpD+1yY=%VV+kw&TrX9}jHWN$WdO)H&#RT~uEK);hoEj60#pM=Ru< z<^nKFn~xHDPJ02ErOVer)?ENfBRi62JIj!7fWJ5*mSh}>NGEUm|utOiJ{RM6VWgfRsA#_G*y1X`h*%t_}h5j?CW@u^wVvIJgfVjRr0 z5env+t^(mfnyk%ADfHsrtyI|F45QxFB)&AV_h_u2Efoa%rwu* zOs5fP&uU1?bQ&fm%%nbAa$9^{kK3b=+c(7&4b%R`Y?F)g(M*_=*_)u5LA1CC*r1+b zXiw2Q!rCdrPi%7B5gZcw&j_~;NNU?OcK(}0ZQ(&tzaTxKzbfjW?I?!MP>pqYQR*Mb z59)I$_g9?%K)Ju}?BT+bjxK&KDl$XU&v-(0(D=7&xZ;$1Y};IDA7*(S<7Ru!M_H8h zjn8}gkkw4zSjHQfrcu%^<_87`)j~rNA_S07QA5#3ctJ=bYlOdr$yk*l=_#(R|4wyn z{mu1MTT!;5i0LHVE6sSi3n~{^wq=^hBhX*CLx1sA^>n7Wke>Pi`x<)?S?e&WaqCJ9 zf@Wd_v=7rr7fTT-d#e(n%=7{B-M zJH)+@H9#L=?)8U|e&;UXcNxFmxp?KX%Ey&&D4$YpQ9h%58(Z6z&ne$gQd?aW%39R) zdz3FJ_bN9i4=Ssa?;++<#QXy>k0ItR^E=9mh`EK-Do-Nj?})h%zn2jE1Y&o#97XQO zlvl8|0Wm5N`#Ho~2cKt<%Tvmf_Nn+ik6%jrHSN#9s!TjmRVlkz2I0&Oh!=r1cbd%z zr%Ga}(}f;Y}p_-|{BqQMG(U%30TyNk@fE1s7cw4>;_%amr6^ zpBejE&$nk?RV|F$-*J7$_pP2Bc|7c`;w$=PgFg&-CHGga)f2z$yJOzpiUl!yJG_|o zt=r?nKM8%K@RD}v!1udUPd)GP-1skgzcc5$`k{UYJ8#H3*Jjn|li^!u{%L%4$j3pi z<<+%cGx=-lE?YhKK=dBVy3}u4JT~lD$mSWpYnCLu=U}yVo;tzCs zIrE3sPmMa!eM`w7hUJML1-?4{H}4lFeHF2D{!QhBvHN^pO8>6q6C*zD_GZy#-6MlO z=vp)F7tiM>obL1P+#Ajh_dn!Ynf;^t(_>Ec*jDJ9C3{N#{a!}!qg9T^%^*M?2)4v zs&B+5c3TvGO;MKAckRYuFGa0*{Dq!>?AZE+#npcKlaKT*e@%Wm&V7HSEh1x5yP}i_ zhJM+h%gV+5>fUbk^<>@Yv!T7U3F?j$_kQ|H+G9_BKl{hSJ*F=|F{CPY^p*3Ob6#_K zXI7^muMKY<{OPM=^PruNEG@8Z$r_;i)0oN72JK7aJd=i5L0^T(t7 z&MaHE#IXBZ%#`S715KMozT0NFX6gwc{Nr{C4&y0trJk#d*`iUP- z%G~;RZoz=0o4;-UVsh(#V=9-wuyEyPHDuY2Pqlx2Ki28(H{;bu1KO{6KhmVw^ZHID z*K+B!-jB729-95-`KK=(`S{{n=ZaRnQrzLkSGzCz_F9jhyh_gG_5a;thPVHLCHdRZ zjMZ&-dHy}xI_Tghv-#&v*VfPaX#5rPR~x%6c0Lrc+0AvFZ~3puDZ|RD+HDzV2>fBr z+9%#yeWBuPpTyU?{ITiqFYoq!aKy8z?p;;3cS=uo{wAkY`Y4NjzC4)G6koYu!Ggsg znJsK^@L!COiYA?yWN~ei4*4!_YPSvku5>Th&*H^r7c3@JT)1#?E%v?e>;fE0Q@dZx zj;g7hHyl=1(ie8hBQQdN5ijU86wqR9CQi^({6%>3r&6tURXD3%@cxVAhvV%vho8rz z$Hy-NwzWiA{7AGV4(-uFmX(%x@|fjG$j@1x2Ub`%Sd`>7%f}X;9I<=?`MBi@r(Q^}UoC^;yu3=!Xr7s8zewd$vA9SerL2u@?1fzUrwHepsxcWGdI4hiCX~p>( zFhi56L4VnG5L&WnEz{7e&2BjbnAau`y{Yc*;qK6fwN*lks%fhM#|MwHO#(z1g>^}J^>g6hu&LIU!X!z23cVrG9?`|>->W(DOU*Ae92s6e99L;{{TLu;$B!88 zMxfbl2Bz9m?{bx1C66eVD_>L!PAN`{omM)1rH*u2sHxIy)_ko|Y5lb!+AwVoZG?7` zcA@rB?c>@i?Pl#;+JoBnwJM#zE<_imo2*-?drbGd?gia@I+fm_Z=v_s$LkaHWAx?v zh5F_C$MjYDxAX_}@9EFzFX~kWgQ0~X-jHBeXn4c0!*IfI%J86ZiSZd@g>k)cgYgyP zJH`XXL&gE7XG}XyADIriCb*4p8|SvfZL`~Mw>@sB+*-6OZ)0$u?mola+%DPUFR!uY z@#cx<$>uHQ1LiNyf0$SB?{y6hNDk;6SQ+?w;I_csfrkQ*1fB{!6Zl+El&~Vi9BL0; zvtdQ$$5r+!-9ycOxMBa$G5r1PueRh3G{g1clavW{s995z}0;2sbYP*RNl^yN; zIQI81qCfQqh{oxS{!}E0%8qsds7^q(|M0Kq1RV7M2kxNT|I*4CIYVTfHk;~0{W=x+%N@Xy zBHAnC#g7t+y+MR&o4u#oSLocnC0`(C4mxlUz3(O9vzWXT{1GO91MR{M5RJp5e987J z$D(}6_Q7UDE@S1*(XLe+)K;>+sVI~+c@EKh$Tn8?UI3SEU{af0w4YD+Vm`pbZ3g%eRO;7kPmTEzkspr>C7?7QY`r!QLWZL$1?N53mOG{`o7 z?VI+rnxeyg)828-SnzPmkH)mM`+Zz{&ZvGY$^XG)m-clz{n_aust?I8k8EA_<&Ns> z!%J0rPPhC1wbeKKKBBykxWhx4d2P?;$ijy%^{j69n(N|OeqWUAi%=|3tlqvSvvg+1 z!O#3PJ*4N2)Agr&C}yr}`}BqnzveXw;T>~g{`|g2+VA70SM~iZZ1qczp8m4;slT-O z7lJ-J@x=H!zquq#`8N8y@hkT{H0tkRu`ir`V}JHrAB2WyvY5 zt$gb1_j?c6KD+Pp?M{|BRa{$qYR^wEYrgkr{pG_x)o+w6OYijXXICRO?ENsy{&Loo zQ3_Te$aIA7-*NId@xPPDzmrxTxBi#&KoNtvbg_KXcOiZM(RmEi zt|EQ^{e%lh-+z%H9{!GV7pYxc`VORXB7y=q|xOU>aErj9e{qMEJb)e%9&ApZl^ZTd6;(l*FH9eiS8Zt8Ta;WMx zCySq*U*d}y{)m@H^{*r12j}FK%nIPq*r2cW%vqV~XbA9F27r-J%rc?6Vq_82FzAW3 zi(=Nr`T6|xlJqG&T_B6r0&70_!A2`oxxOX2In#5B`M_LXf5)`9zx5lA_O|8?G`)FQ z_(XCsc9mKnwm%}Ec6K;|#-rbA$~3VT*1|%j&^u>C(Tf(7)Xcgq!^VoG?AMe%MUUfX zw}9yLIs|+qlj$6gY$h)Nf1b%(!M8K{UGSYCTDQ`0PKld+yindN@>$x=1^PR+czLEFr z`9=ptqyNi^{oi`A|7&3VU;6clfA)M2IrMzbh_=lg`@czI|97NA|5tC&W2 zXz)BHuLR%7+-E}sXGBTgf0Nz1PX$@8T<_py@%Vt-)3?E+F=Vo zqv8K1_!bb2vm0FQs|BD<76hXHq2S$^O#5(WK{fFI2K-y*uRy;|$@*|~Em9y)E$yV@JKzZ^6?HGi@r6uZ2L0v7{=Z~G#|&l zBR2oxX5#%If6szL`?{&MNG8_yCb&=Ze$u>qg2ywN-djr4pWb8neiGa_1&I3lf`>A> z9Gu=~>QC=8y}wkZ_cn~(w;te>sQ(%8pP0+P>dP-tGzyE7?E*l|qWL+2o0)6@@4)1a;FM?_UvNrP_6HATau|3ICieoTMC0@Ur$pr#a7t9}4^D~7 z3E-5dJP4c;l@q~-GI<#Ia3+rgr$pn70jEUeap07wJOP{%l_!ByqH;1gB`T+ar!hGL zoD%iV2A|60T<}6B7lW5Fc{cbwCfmR%(X{2@OPKr!`14F&2mTV1Uk0yYat-*qOm5cN zbnIiYIA`>z@)JB~Coob?XEpr}yn+#GjGUb^+fLsCzwh)t@W)QS0-ZXmJL4*KjsnJXjsd20P6tl!oCiGMd(ao} zW~}bvux{ZQf6TqY>K?51@V^O6txv_+hO}~OO8pebeeHeGhO^qOw_0+zTmN+FsYT&o z;>=X6Drn|LZhmUUtwcq|SV4Yka~8T*O>U)6$#w|4ZHp?(sWGOEoSF1ELMVh%=td!o zLV@U6Ao><`BUw0(;_$FM*n+wxhB(Nf4l;}0EwmxJD6;6H%%Y2OH-aVcnHeL*X-aJE zML~WkzAKZT6&OlHB|Kg1Db8RbY+6x4aUsEUt2`*|v(u%J?DP!G{3S*7Lnaycls)|# zJe8%;qIAqT&dbgu{fEZI$BgQaUQYj^_*hqLd`xugAiR(ZQ;X;#o4Yti{dp93fBN%i zCECCsI&J?LxNJ|-am~g5i#m4M26%JUfH>;m|CRM1vfiFx&bn-4v#GTqP3iU>*Nil! z=Wps3i=ShYKA$#xL^Pi?JYjV7$asEG{5Ua0o0yOglN6m06CFJ;CVEKs?nBbY4H}=B zkT-i|$&~ci(te3k;s(S{FHKDtH6o*UY({!oLhV~6F9 z7}a&y_@v?E$BdhiIWj)2--zs-DKm0Hl19bN?im|h8Xp}!3_BQ>F=|$LcwyF*o<-w| zva>SMXO7km$xqE1SCAK<9@D)jYBn5jKSCWhsw4b96N zJ8EoJ$kgF8g;CSy#P^CGFlKQ7?lZbYmnKY!PMR}fYQeZsaZ^W+(I&=@8k?OyZDhfq z*pmLGX#=PA2n!7xlGZbA@SLn}({gj8bE3OX9~F~5HLEaqOmV*v12e{?Ck+c5U)*cZ z$iyLo;ItBO`6qp)WETMQ-s32 zq0`34%!w-=7#^H6B)nI2PJFaBBzi{A#DUo(Q^ys>4I49iRPdCz8QsTCiyN5UE3;SJ zh}fB<66Va9HEc}cu=oh+i+J=4dyU=DJIjGlW#AMhor_Yd);npih|%P%GAaxlHgy^& zrHhI)x){_7ok_28R%)GyN$;XiX*g#mozkc!YJ-V$F{*V+mBv|N&|?L@(x7rSDO`-0 zt*upSbWX(RtkYs2PA+=2MyW6vT(q3hq*CbA&WLW*Xo<$CR+^kRgWg%EQn(nLiAJeX zYZWd|M!n9&8PqC`i%CgzoI>xUH9B)z15s;SoK+^HQs<=5I~$BjcxX8!(CJmkU+1JY z5v9smq35*7U#%f}oimP8X>?M!sId4FCISpD8Wo~DD~t-gigVWL)Gkg+lYtmDMjd>d zalEirfF-ADm4ef04bCnmjowMEBt{*qA#=Du*oQ`|a)R*|tx2O$yAXp?WyDp{;@q6| z8klo57>Q2lqA{AVTfNemsIXg|8eh9as7b3ca?WbvVo>Q6MiaOa*VjplR7B^D>#H>? zo%9M5=8dRy2BbD>P1uJM_M|hoa4M~{1_x+VDD?)MliH-?v>KcrG*2A8!b)cqj#h`$ zQQ)F-8a=E5tF;D`(#b`^8J$&H7X$7mQPMcDKRxTUnUTFVUKpNM%J-NxYS^EhWX&7s_R=VG?{`%dY*7-XwSrzN*tbUK3 zw^l4WXXT&x)|#^ZYis-3FRWhYPFg+Nd}{q+=n-qo6CYUX&m6M;+;BP$N%18 zy_&n-`t=W6tnIVkus(kAHEWv%HP)q`8?7JiSa02(xy~BbW{oxaI`T>D zAC||gAN;x8y84r)){$Etwtl^4q1AWA1J>U9`PK=}rPjwxGpsv0PP5kb%e0o2BwNpH z8fQIxb%eD;;t=bpR|i;6c*I(rpNz0hZr9WLes!qTIv~*c>hHc*LuCi+s43povhHoI zi;OL;8J7)K&+lEV)n}E~&Y#?j*mnJLM4LY6BSt@QHe!YHRK%G_K8lzYus%t@Izv&#& zrj>g{mxrArs^(qnyK~MbeQ&nd(zkTTGks&qXZ20K9^H3qqM`5D<6HV%x)RjKt;4Hy zxhxssX-e79|NGn*`%NhHc1kJv#gb6Ev(t04_QkK9J?Y~?bJnJvnX_TR=(z_szCE|Y zkJ@=ZewZ|G!mrEboebDB@00qvc{-c>{0A5JnVhBEEm`xi z?StI+ZQss4XsZj_Yx9`D)7E|B+qRP0H*EasS8Tp#Ubd~BxyIIJ@G9Foam#Jpq8_yQ zxzDn7dv==5W9cN@Z!aX;<`ng@1uyGt`y;DP`W5x~jP|EroM_$T(RV_R?>{`suphg!g*|mt~9(ez&kVcw54v;3D;k;AtN| z9sJjcwZSO^D}&48Ukm>H^jpC??{|Y^Tki?({_(-!eM3JC&Z#&S{KSEi!N>QV4sNsd zZ19%xKLl4?`#CtvRu??rmrKF@WBv*bSac)!u`TxC;`5vkc}Xekz2qb;`PEr)JF5|n zf20$7Z#4+j&zgktSuKQCBU%b?`?nU}{=1DZ>BF|dug`c0>(ji1eg5r*MRjI@-)s>+ zoZ%z9D|8afb)5yjYCl1p*+uxieSq-$sX$@W%3vX4K!|Y69xC+N7ACxy7cK;M?kQ-$ z?j=lE)khdGG(x!U5-B{hFG?6#79;fP8z($^JzkjcPJh8LFF{xyIY{twN)&$laERdb zbdqpBeYmio+eo2}dbIGx=`n(8%Q)eK$0i6<3nvNf$0Q5BQK`bgz;q#o&lJwNXA3u5 zB2xEUwE$H3?VS1NGMrSBK)|uRB-xjwlFqeo-nh-CX{8A3&);#Krp?x zK&VhH6#nYBNLaD*A>qsf zRFBz|?n|DhLUmt``b#=*g^n>~gEzJgmg>ah`73wo#N@dwR43-B2WxCDOH(>AI>+U4 z5Y@lD;GiF)I!oCem!rOUlS{h%b9g_4yiSQZ9R)*7Yg_V};KFFY9`d+`4HDdyVkdZo=0F~dvqS~l=^8vd%YdV*?DMw`oR7O?!IV^Te9*Y z+5S2!+O+)1UWd?Y_M3On5jpffW8;U9Oz4*oi~i@WzGudq*x2Y1L$lE-i;2z##YGQ} z$(}Z2%CwyRy-Edi8Ap}IPmLdz7#-F>I%HIQ?3Ba-!^R9L9zP-`PMbC-IqUI0F3!Yt^J)A5+5@(G_E*dR{prr)4C=` zM>uq5?<^gx29j2eZozu1F61m*Eow*o!*Ri!f^_400DE%-fP=VF;2h2dEaS>K=sCGX zkQZ~yI2C!Edx}$%XSwI#zlK`}`6cdUgl^ax2d04RwK94Kb zDD<$`HA5Ldij;GeDl$)8E&Ph|b=0eyl^+9-Vzn35!kq$sj_*vvCXr}a?GNP*rIHA$ zWQ@b7svb}&$Rn!Vz`d%Efk*IdC8itYOf&Aw_n#@OgXWy3z3{;co4b$-* zvj;Xj5A>-FuEgE1%m>b?oChq!8eaujR{2<^6M3TY=}HxOwz3L7_gcTJ)b!ExBvwt7 z2IDrG!N4J!p}+;AUC&*bTFA1^&JQ7<(kQh7uwO{$0zatTrR_s@Yil9Dr~N>yARlTK zx^SX|oy9&RO4ncKOa|x%>6BzJY%c0xFL1XGBWkx<4g3&3u)(PBLKLE<*l5ur>;lnh z<}Q6LKKHXnw2pa*S;zbUqwSKVMuljZ-fD=#n7eF;elX-Qh6RSMHCz%~eOzT{B!U3(0jl@Ilvw zz=vIz0av&_htTI;S3}~=rkj_c!o80gckGsf%v*_T;EAa`rm6S%2eE%31T zMc{TG9$3dQ%43WNN}NYJFvDZIhlb>N6vAKS+1)dQ^zn@FR1m9YG*)@Udd2}4c&_s_ zlMSAgkgGj^^o$_qJ%5E<=XuFfMJ{`G^a>%Jyt?Au9_G~@_>I>kuNLI8SCG)BWw7A0 z@k(jOjlLU|q%xyrM39Ecy@kBuu zsFpkFxJR9g>T+UIf2}@3epcU9w<7iGKb^0V>zV@HOzyJoDoVt4U73Cnz8}Du7DIcd z#2ssCYHd=GHYRt-9wsv|%+wP;yG#clA7WoqI|5m1A*~U=^S)BF8xhs+>vn6%8Sy*S zsh(4D<%&J$0f~jPptWmJ16?c{U@J=-i-NdY+FP87+2RAAPG|!u@ICh47Cq@>8E7$) z!4|0{^pvF^S=Hp&*sDnU`fVd&Cy>uc%VqczA7>xTqVh2VJNWnkyZX!p&i8o^_?FLU z;I}?^wysu-RtJeVD)zQGDz>-NUl{iy;`mlU=WL8@J?Xm}Nc`-6z^=hvF^1Q*A26}& z-P&Y71e}MJfPa2TLTaU{1UJD*TEec3frJaReP$KgXDdSvz*_d*yjyLxmFo|##~9?st|*V;8+!nIZ7i*}DrQyBMk%{_^LzV` z+)wu3U~Qw${x|Gk+-#(!^`GkB(SDsL`ge2=gJYlW0c_*ik~hJ(GTCu0!JYlPt}Uea zf#6N`^|m66+G^VdzKg{VcEdbq5ZxD@??Bfc&?k)c|L9zYjgY?sckBbwz8^I*6$MWF zah)MI)sK4<{kXT;+=h3+cZ29$?pkoVMuF~&_VeDrJckRA-*lM&umkc=HvhqK4MR8d z`+BoE4-w#WJp;{$_66yDh-r{t1>Xdseay|^@*D};N2F^VdX2~Ln+2TB%?Ccf(M1yrxrZP>%q;;f<>)$` zN4dvk(S931_*K!rW7r70HS;`~ugZ9RHaSXB@Eiri_0e$CYZ>FRo1JMK@&e{okKU*|&6w(70ugEmxz!U~L5#KI>| z(GT(f#SqBx$^vCqQmCAXR#h1+t~fVXTzM32s1?e`fR8h~D>X{=rIep3HRKCr9sI8- z|3cg9n({jQZz_Y)!b(w3|la^T9!$APOV ztARBRR#zmuDk%PwLMiLPVJ;VlzDIh3M>2Uf_!1^B178WEb9rek^*r;Z zHPcZLwJmxK{BP!8>VkO^Ae!f4E%Y_h(4tEDKkU5+Kor@ws9k{MXhee2m=koPV1x#9 zL^0<8f`}p@LCj*#IgL4^V9q&b$2g`j=bUqZZvJmqcO&-9oHO^nbKkx9{RdrZ@7i5m zsq3p+wQBFRBq@M05E1PnXPU^R)>@2PIgibVh;|kvl|V$jG-bHH-h(n)Ums36LSLUi znWnF=qr9cBOTTd?L*#W)N*9Gsj*By8D@0z`TP!O?)K!$z_4UP+>-6=Fl>7DdgOum= z^$V1r^mV6qc##l!Ig~y1^*GA8`ubx^)Azc0oG7d6>p_(D^z{(Rruw?{fqqwryiCeL z`g#iGS$+KyjNm4>FX;fYkbztQ=9UfzJ8bTrM~`_ z@`Jw4?LtaG#4=MTFX`*jSNgUhqTPwIuD%{Z*;ZfgLOEJrpF+7-U*{{5r&N^h7MDt* z%h0pelz53%=`CB0@dvr2AgP1oE{Q0K7Q{l_&OH0^m+m(mZPw2GqDgx>>-|{s1Ll>a z!{*1#&7==<22pDZUL-R{!5-~KG;=dNr#&o)RAbSLmP;0rC8HfI?JYTaKaEicx3(~e zu#U5~Wz^V5`&?#C9NIb9O6?tTIi^YG@<@ezjw2m=OXqWBWp3cq#7X#DyX1{9{l_C1 zewRluNU{gkQjR#R8@pfF)q`id#jdI7RjzB%?cBQX^pWY7g|6oQV>H77_v1XhU34#? zsA=Y`P$;Y=PlYZ9WMu_&D%9xeikj%Uil*r1ik1pfsg)cR@>{t~?pNA!S?D+~$$JWB ziiNkiWa(|?%`fQfK(;wY?*h~ddb^3nou=dovUA$Ov@q#V+8OG%)9#=< z$Z-X3|1`S7Nn5;GZfybltu9)X)>$8`vc9$vEjdSBbe8+)b=UULno9U+vu2UI#ViYp zRnFaFLo@{JRrFe2G+yGj%oRt?pbE?*MXfzK-U8*G_+~j>C(zk2BWv|JoT_)v*N8%>#Jy z9qD-9v7vO~AD+EZzFq}-nZ^{DSHMe}U*JW7Ceq74jKwjW$s%g@fA$=9QUsXg)}OuN zjIFIdV>?mL*?U#j6I7SMygPB&|5;DXKReGw#0!=DUcnFpHMfdqc{x72N)^C!>tfE~ z_Wwoauv*i+X`seQdqK+m(;Ed{kJ9d1bE${?Ucp3v#@cY++GRPS4I_sX)T&ceNv&aIie=crLObm&MLg1Fwa|m!=I~*5Si1T z`^Rk28}xA^w|fXb?;(7|3iPVYNgLg zym~8p^F$KAvM=?YeaDk%pSp57ddA9`d^%h9Ab($}T3yl1M~)I1u8Vdl$A`?D;he#p z;-AEa6t?I8pKQ*9SN=u$?65umZM*UufqnYlWxEPnK{r05i~Rn76<#;Iy8OdS%Rk00 zkP!oamT6<2U_;DWqdS^~p%cxL(7L=bBjh*#!*h+sH`3O;Emx?i=1b7a%=e=Ao9{;- zG(UtsVtxeO(4rYuY-@`)=sOm7(YpAO&n;e3S6Mc&q!)_i2J{O#;$%T97oNo)T4~Y# z*8bLbd#!`fO|4s?dt3KL@3G#4K4X0bt;;|aEN7kCW3z|nw=;4!KYv?)TfQr2?m8o9 za|)I-^6jzPW5+ylUb0~OVBVqV@)_23Xym}#B8SH46Aq`*1sz?mLi`;4(3Ko3p{qDn zLF?YR409YoeU#&9^fAX{=t@qNu&t{&RYi|>nuwn4G#NeDX&(Bd^F?Q#_ndE`tGHC- z9ZHhxK&u0zlpT=$}V-F&g3Ysqg(db%Z0Pj_35uIOF~OS-QdXY>4DWE9fH-#k+2 z9CwIMa&{q&oLy+I$6l_{|2TKan{w~C{wlqdSRQ5M+;nqP^Hm~qi0G#fn;M(Sh@#X% z=pjVpG-L^SoBEErv%ZJI7_P9oj6p|M9l>tCyXqaftlV3nx%_r!bK2%K{O0l-nMY}l zs1HaVl+L!LA3}dl|BP-gXB&FC`qgSOJ7pB+imc0jq#L;sB==v)*>k}-mr60IES;kL z<@j#8TravPZ%gUvB)rTba{U_K-{6syW7g|(!04jC{k=>upUrw_zxkQW`E4Obi?g+$ zTlAm21=3{~{VwMLd}kA9J4E^*=MfuX*U$dDL=PCpL(>2G8=)J{K`s#{xBu`)Xs^e9 z{EP?wVcwcQ#vL7ygsCNkQECb>!{-~BP>-M{{wkFHP7zv|78^oQI(hIc`t-%hgp7O4H|(ivx)Y?8A9Wy)E`!nEN$ z1xCn``*e9`bH?w}Wen0q@yppuC-YC<9m&svmwt{tA;#PbUxyfXFUH)9`cg_EqAteZ zi}ClOF2>;J9DAQLK81);A?6WrDsslB_>YXk7jY~8&NzHA7GJDOjK?>O!xwQb4Dl&) zj-@w_Rbd!cZyc+_Fvi|ER)t}_y>YAx!`OS{SQUo&6gkK6{Ck|L?)UniFitf)qKrP) zi#|MFgg!it)Jw!8?<}{f#6?E%Nw`u3OxGQqKYZD+nt!wc!#whe_;nH^7&qA`vUoV*>1!#1Yp}}b zh|mNPM6D>>e5xrvjkU;b=XCNUM z@tL}j$R;d_AWQ^I(oZV%S!)!`A&E24u#lcnG2vWV|ME|lL2|>N*z!lQb&i`KM?1-R zHyc{Cw%`ds&b6t_fq6yFwRz9tA?;5ro}yn_yh7);%#C%gvJA|&^b1%yW8J%16-5`f zDv2&_RSx~o>KXd2l^J$@ReEw^Yv<_0)zZ2(En(JO(L?q9xsFi(xj&c4!F*rNzO2h- z`*UvEMm!(ra?{4y^roI9XQkC;4d3@uM)1>odSA{3uFDy${wW`DBc3gE`GCXZOu)lz zhtcwL23cKSFp-g0lKXUGK2_a@J%MeIKz} zJhlAXN31n1VfJ0ox(x1r%+9XsFXrRm!;_7#LsfLJLoj-y!$$NLeOA~#)X&J7V0$|b z<(X!p<81UC$35t>P8E5Msq7^BkW_P0qgy$(MR#)Qf)1mvndoKK9o^e05k1Ul6nehX z0(9rRo%50j$2l)gKjob(pqn{2N5?xSpts3A&e95|;h|ONdz=~fHFI`#;|ZyyYbSK5 zYa&{5%f+*ipIc3IirX;s61Oz;8n?CRCvNZ1#pE7j@8$mDPYQkH*=U>G@93^qmKV>p zsRL56i&7V%i_)iz<>cs7RwAuT8t*33nxRwDhNHKn?MIhRugH^1&Gee+M(M%m4e1-u zo6@(Sx2Nww?@Ql@exdJQ_KEs~)z7n^Y5o#FUik6e4H5QF&avD%{Z8WDrs18Yc%Nx_ zk9iNDq#-WqV%}9QL&S3a(fi777j*N8_m%zi^}qGL^5T#8l3l19;+9I-hdE=P{l98| z{;3`K_Fv=U${FwV@4l7bf^)~CB_^OUri+j|s)@Q9n=JuQ1ogNF109n>Wj`h4`Quil= zy2zg{vZsstQ(JPTi;U?*ZFb_*I%9L5e|NbXJ+>h-DB0^p?)tpssTW!5MUHxrpIdCoI>W#7PQiIX$hp>qTx(Ovv9^P(YA5pK&nvR1i5zMogWBS}AM;B2<`-C8 z;A;WNIiItFX!AkbRl0CbNx{!1B9V!lkWxYWf+7-`qF{2tl!EC6Hx&F-P~tA5!V4F~ zzgjN6T;g03T~b_DyKJCe^Ldx+^ssevEsTF|2w9k>xXy81%$shJ-CJ^N=oUh6+Z4AC zZkcYC+^dm|DVV7B;$8Q7GJ8vS-ZBg2_Ygh5M3yem-z$VZ^eMbSxkApZ_vG3VnGjXH z<&Gocc_MkZg}+5)|CT(*dWum^wwu<@PXjdi=@R9 zmWzI>=a-jF4dRWrL{Bb}J?qQLva7`Sq9ERXr{KRkOHQe~t1@tyHBalDHZUzE?ONLH zw2J9L-0wtQsSfz;ZU~RvYKzq(7oEsNr@(h7-l!bFdnd9^No$r}-Ej5T)nBh>T$R4{ z`X2ZF+INwQOT1|*ga_neMxaJyT^BjmMaFfB_l?5ar{eu$oXEPKwJ+;X*72-US?98T z%etC%J?m!HUB)O0--j``+0$}e*h2`3otAMa#O|6Cf>Tk_>1?zg$gRPrd z=aQQJWWVmQt|lGi${_sM_pS3w54au_mQ1-4RF$f8HNf)VdVv32_G~w`iL>#LdUHj{ zB@MM1M*AL{gT!|@q_ocEhefk<%pIe-_(z4xo zFZ!7CNoOyb~zO!pV>`^z@ zR<6~gHnN4<#Wjr45D~7?v?u8O{2N?-q>ZwlUve|UHuZI@$jFFFZdIxKyVY>BkaRx( z6t|(YEOlFfUL{+!t7VJ!vD;JTf9CdzQ4()t>$aSG1>Otj-VU61|Bd=3_q*u(`ga5$ z-7TfBT$S*;%WniSy(%?m5JZdy}xO4=~= z=Co~TX43Ywoz(Z>`7ezP?VV1K@bvO%KfOKODBW5bh$Zc7WJ&L5o`dNx)5}V)xZ+q# zk5)fjZ6>{1T{y$1iKKO;Z;kF9fw%^Qto+!tc|`TWhnG9M&gxXM>aRUlS9@1`fye4L z-`7kxd(g1uca`FEuRd$1_BlPKcq7wKnO7e*x%z9FqbargN=#lBwzYn{jkhD+b`}4{ z;d$+Q2echclaz<^ylpge+3Y$KkA1t?^GWB)W;5qc%m1Q(ul?8CHk;`+eBY&uo{4Qr zN8PPo>%_@PJ;okN>f3M9$DZmob8hwCS#n#Gd;6T%j(OW{jpF2%s%HlkY;dRRFdx@P zT`Dx4U3*CLu)E3O8%M0`x!Zm5Q00IZd%unIR0mkxnzhbceXGvi$H7}CwwP+(@ksC3OBT7Z@`rROmhp?r>}Pwg zoUR!(HhJN-$h|e5ZWuFutYzi)E>CW}KGCnP&A=tk9BT|bS$M=(@p}v(m114*RoU`u z;&K;m9N#WFBg;Y4s`5z3!k53mpz~2I~=Xnt(NcLjP`v>*BpQISkYg* zXTI9j_1(iAr*8UObsE{VMo^L2c@?>jjTls{!N{)xyMN1F{@c1w zm(51mpMP*LIl92+vU7IErG2kABX^PTXLXNE$Xw+b_;&H{ zHSN+<6DrzX`sLivPpPGD_g_(B()R1i_pc3nxS(n|`)Pec=AG``BdpHg7Kidq{QPvs z?^8N`sp9=<{o!HzQaUagIQ@K7n%Cvn&3THSt2SrNiIsy2I>mII|8&6aYB#L=mN@gV zVA~jz?Q>tQn%iV}M9j>`gCA$5Tb$#JY=cYIi=JN@xS{m=P0M|J ziUyWZ%~)~lK)0oSmG(4FOg%L$bHn*5ck}_7x~6l!*nm5uZq({K^uzj7>LcBEmh&xExpUC6L-B_T z6|gIQf6w^({-vtVw9o2ovZ~7M&30DvA8z@5%E4CQp(B1B5Vx)T<-`ur^=h=*@Sh6)#lb%l{I7z43iwY3|N7t`3I4x;|2^p5T8A{I`L>Gx&D{|1IEO z5d4RMe;4qt4gPn*e+2lugZ~WhZv*}=;6EDtw}XFC@V^iKt--$x_*;U%8Tiiy{}tf> z9{e|f|1R+F0RCmce;W9|1^*@Be+K+7gTDv(j|2Y&;J+CB%Y%Os_*Vh{bnv$T|EA#o z4g3SZe;xSO0spPwZw~&k;GYHl#lU|y_@4&D675Enh|B~Pz4*s6te*yffg8xSFcLe|6z<(k5Hv#{p;2#D41;F11 z{2zgTP4F)S{eDRz<&|=?*ad#;O`6meZc=F_;&~YuHb(P z{GGr*2>cb`KM4H4f`4xC?*;x1!T$sJzXbpD;2#bCbHM*Q_!j~HBjE1}{=b9&8}L64 z{s+Nd3;q?s{~Y+20{;@=za0D@g1hfPW?M zPX+%C;GZA-8-V{8@OJ=zCHPMS|6uTM0seQu{{i^Bf&UKh9|Hclz`rB-CxE{<__qW9 zX5e1|{PTkU1n}<<{*%CeEcm|$e?Rbl1^)iv-xmA>!M`8)?+5?q;NKqn^MU^;@E;2P zYVa=y{++=;9{laVe?0hC2mjvSe;fSggZ~up4+Z}?@J|H)8sNVY{3F1BIrw)1|DNDq z8~odVzZv*{2mfB+-v|5~f&W$T{}udef&Vh_ZwLNv;O_wb2f#lG{NIBAZ1DdE{++>p zKKSRt8 z{4axl74W|X{;A;K0{p$fKN9?(fd4G;p9=m*!CwLX4Z+_P{C9zW8SuXg{?6cU5B|r& ze--$rfxip*TY~>B@b3ctCBXj^_*Vn}!QfvS{EvZuCiuSt|C``H68wvRe{S$E2L1uy zUmpCIfWH#_Rp8$Y{2zdS0r1}m{`J5=9Q-GMe<1jm1OF-D-x&Nafd5kPw*~*9;C~zZ zCxQQd@LvG_)4=~U_}2mdyx_kB{J((zdhkyH|LNfG1^#)!e-8K$0{^byzZ?Aff`38q z-wytB!9NE4AA|on@P7*a^T59%_*;YjK=9uL{zbum2KaXa|2^P;3jEK5|L@@c3;16L z{}Ay14E|TZe*^djgMTjY-wOU?z~2M>n}Yvy@b?4%MDVW;{)NE*H}G!-{&m4W6#VVL zKOgw}gMUfzKMDSiz<(q7-vR#w@IMRwmB9ZD_@{$^Eco95{}14Q1pIx$KM4E}gMV@G zuMhq+!QTY@H-rB}@IMItBfx(f_;&#R*5LmU{Hue%Gx(PT|JC5X0Q|p${{!$>fqx(H zKMnq-;Qt8x%YeTh_=kc2M)2PS{?EZ*3;s&*Zv_5z!2crnPX_;K;NJ`Un}Pp6@J|H) zyWoEk{11WuB=Bzo{yV|{9{7&|e+BrT1^+wX?+X4+!M{29hl77l@E;2PR^VR`{A+{% zZSWre{t4jU5d1yBza{v;0ROGve-!*HfqyCR-w*y~;9mgz&w+nG@V5m2DDb}y{^sEC z3;wC#?+yMRz<(V0e+K{I;NJ!OdxL)r_Cq ze-QjPgMS?O&j9~t;GYTpZ^3^M_*Ve``ruy~{7-@ZCGh_Q{{6v!JNT~!|El2M7yLVe z|6uT+2>!o=e--dQ4E`O#|2+6#2LIyVzXtpZg8zK*uLk}lz`rf{&jtS`;6D@mv%r53 z_~!@zC*U6o{)@nW1Nbio|3L6x0sc$DzcKg^1OF-DzY_d&f&WYJKLh?#!9N)M-++HQ z_|F3W3*g@a{L6uV1o(FX{|Vqf8vJd+KN9?JfWH&?UjhHC;J*a?zk+{W@J|E(Q1EvL z|GMD+8~DEm|9s$o9Q?n4zXtpRz`qvwuLu9`;9m^4*a)( ze=G3+75vMCe>C{-SkblXu@M6Yew~w?{CeVm0iW&Pzt7s+v*(qKv9Y&X96dTUM5XFt zW@2KR78!YVP}#DrT(sIJVOOtieY|>g@Z3IqUe-Q!YVv|%!#sjco*X-R(4g=6zkh%8 zqHWtvC+pUoWc&7Q#>=&9t4ChCv{|!sY3Jwb*Vo=Ze}2&~%a=Ew6(9ew{ec7X4sG9_ zaHt9S3dP4C_N ze!}m+uWs(+6Bd|1e;K=6xvZKUKRz>}Xwf>I4j*1ns$fCYl3BAVIhvc>Y@It-X>Dog zP%%%QV)If`+yd_3zf%?pO_C+?VQYHR&g9bA$ zHEQ(B(>853G&px|WY6>Gcb9qd=IEpJ^dmo4jfASfth+~mpTYo|>M z+_PYTXT8dm<8poa^zP1{JzWoO+m@Vk{rdW@o}M*SPEHEftgJ^4A3kV${r21bMrY0p z&1Yv<&@XS^63Uk^58vzDdEe66v;9ujsx_vHv$J>WBS)scU%9g7u)%{f>jnh$UlSgF z;z`GjyUMz_l%JW9@OW{TE(d-YI@IMtlO_v?+`PH0TahBQ2A3(*V)c|M)rOB5V|%Jj zoe8C1zdn9($Bv%<`SO+Ocl-9r`<*)NDP(I~pwEpPYpdP8d!tqP^5KoER!uByW0UVj z{rb~vEG+DzixsQ)utSF(9S8=pdwX{%=I&nkU21CU<6E{QG(C1~ zcG0I#e;s)1){^;&iBCN}Jk+-uHk@^H@7~Z+E!N?hFC8fx{xBU`ujPVd(3 z^zZfRO))n!voQJm`AZ%L2lr*6p@%yA`StkLy7jvAJ9kD+9W~0i&B23nN){?qb?3r` zB`e>%cP;PNuP-+L@=MtYxpNoU9ToLk+_h_IV<%0rTsdP#g>CcZc@-&K*nisS(fJk6 zo}H|J_U!1amMzo!mMRs}|IVEilP63t`?_RF+mx|mt)1=dU9a!oAK~-(@zrBBYK+*? zz5DsY)vFKNFlSEbWG}CFxg8w~|GHtrfXo&xR$bY>yI0i$18BKX^b z|6cIl2>va=KLq^Ez&{QA2Z6r}_=kc2WAL8~{0r&@j|7h^f5B@K}|0MX^g8xhK zj|6`W_&*2#{owxv{AYoGd+?E64*sU#-vsFrzXbdp!GA0GTZ4Z^@Sg|%0pMQ({G-7C4EQese>d=7 z2>yxS?+yN5;J*p{UxR-J_w2)0{$N0 ze**kpf&V`6uLJ(qz`r5*-v<9n;Qti-8-RaL@Gk@YkHEhG_#XxTtKi=f{AYmwIq-J^ ze+%#*3jS}wzZUrK0{;i#{{j59;C}%8$ASM^@ZSUe^}s(D_}>BlgW#V8{$0Ue1^%w! z?*RV2z`qgr=L3H~@K=KWJ@8)&{-?pe3i!7M|M%cO4E*bY{~GXr0{&&eeuP{O^MQ7V!TL z{+8fh9Q@aV|0M8#2L1)X|1$WG0smO=j|cx^;QtQ%kAr_x@GlDf1Hpej__-_XP(%}C9{FUH80{okU{{?aX2me>#uK@o{@ZSjj?ZLkX`2Pz2 z`@p{n_%{ImM&RED{Lg{^dGLP&{^{VK0sb|?KN$Qgfd5GFuMPg+z~2=7hk$pHu%>9e`oMN0{$z(e=zt5fPXmncLaYI@J|5$F5o{D{F{LPP4F)Q{$;>_ z3iyu!|2p9R8vJ*Fe?IWP4gQ_L-xmCDfd5_aFAx4z!QTe_>w~`q_!k5J4&Z+X{4aw4 z8t@MT|Eb_V6Z{{7e?Rbl0{$n!zY_TO0{@BNe;NE6gMS+MM}vPW@c#(@&%r+e{QHCd zI`Fpw|6SnU7yOHZzc={1gMTXcZvp>f;Qti-Z-IXz_n{QbbcHTdrY|54z75c~^)|3dJ;2mW8d{}=Gj4gOK!e+~R6 zf&UEfp9lVh!GARPKLh`>;NKGbOM(9#@SgzwOTd3D_}hd3e(-+`{x!hAJNQ=z|2g3A z1^$lUzXAMPfd6jrF97~s!G9q5Cxib0@P7~fJ;6T~{Evda3j9sLKN9@Qg1;90uY&(- z@b3fur@((0_@4y-LE!%#{M&+mUGRSk{%gVi68J9#|MlQMAN-ete?0gf0RQdauL1w* z;9mm#D}sL@_ z_-_XP(%}C9{FUH80{okUzsx`QzXE>+_-BIuM(}SB{yo6|SMc8l{#C%g0r)op|2E)% z4*bu9{~Pd62mcK4uL=Ia;9mj!M}mKC@c#z>rrB70sq(FzXSa9 zf&Xpr?*#s~;C}=B?}C4M@UIH~HsD_${4K!082EPp|3lz^5&YMHe;D{r1^=1g{}BB9 zf&UZmKLP%gz`qyxPXzzV;NKYh)4)F({9A$lNAQ0R{t@8cAN<#WzZLlJ0{_0?UmX0s z!QUPHQ^9`=_#XrRr{I4J{1d_71N<9;|6cGP5B}r8KMwrW;J+38yMcc_@HYeh&*1L> z{-NOS2mY&>cLe_p;NJrLcY}Wc zJkEj2GI4z zZx%5RJhi|qu&#$`V1boV;M*vzI(lk`y3&!a>gOh()nyudP|u(LR{iqpEA{D4FVt_& zJXJf^d8~eN?18#c$UXJJd$-jM2i#OIaKEk|cJ!+Hc+zEcHLr{6jW5otGd7%6za4m5 z9ns{J+PBmRb!E$A>P9aQs~cZEsCGNCUp;f*UiJK4yVZI2>{MSrv|WAe>{j*1JDb&c zK5taJe`OR~yn_eSSrP_a6>O;-L)fHBTsy}3PQh)5&L0#ftTXp}^t=0EuwNQsxH&bs?HwCF%HB_tDJ*}pmG_H#Jg{qQz_YGh5hjHcAW7H~j+-EQK z(oJR6c@s*jcULN@o-7qtk2+IC{mVjydQU=O^|MCqYUeVp>Hyn<>K1SFt6N;ltM)yX zTm5RAqq^T}d-b_xw(4h#tkwG$S*jZ?GgpsJH&aJ%HBmnrofS}aO-8_it6u_CHXj3i zulY7$?1+~El}|qnxZ(OJpnKfCfQzSZ1>{v-4=6nMO2BiQivh92&IK%$P6rGec_QGW z)6oEvWd{T1SKAk`=lZUIb}8EfV#{p__;7nez@6D^1H46U*b=ga<;o1gZtnReKJvdeD&4$C+Bzp9_^KgnjP|J28G{F~gK>Rnc^2Ot~*?*FCqN&+EM= z`S6sTw=V4n9D94<(^U_9yu0&s_3igBo~G7+t!b=yJL$%}ce~qMdf(9L`iH)~c6=PS zHu+P)(?Xv|Y+wI5VTI~T(>}|-Y-?}xbwR<%uT9)`e+`>r`R!C(@V7w|CVm???ZmhC z&RO4P&GGsEb!37Tp?aRaV+Ku%bwSD$GX`@Qz(QX-@ zS3B@RKJAm-1+)cfJ8R4IET~nFaM8w1an)X#?4}(%%w0RLdm*i&MqzCUM-T0ua~|4P z!xh@YWj(dEk9%tSwko3Se65H!qe)S1gIz_n^$Ql$zK<%V^qDYVmid1yUn71q98S4g{NySvtOgPZo3*{)jq7#FRkd_k@DQ336O zQTesu`SNKmPRgT=_~fLWP}fnrafH3L;u>3R!d`3b*6o(spte&9tFY zH1AEuYKD0Z)l9n9SF^iFoaWWXZkqCSJ8I@THrJG`Sx+jsbI!1-;3Y-OdI~ae6wThS~c`IMt z@V=9A-#gE%XWqVt-+FgT`Qkmjgw}g|dsAhNx#r6G=d6^GnYPMGo{q}t>O9IXE%GZb zhZj`Nj&V~iiZ86J)7w+|phq#~;m#$MJ|Sh4@%~=QW5ra;p4JtV^Pc-DC!DCP?7gg- za^L{9@Zx zOq2_DgeiyijZn_0)Lr@ZQxE0p&ApU&!Uibw79Onp7M-Ge zdupiiTdCp7!lOqhyFVJKyjOFya@x`{%HbyCl>57kR|X%Lpsb{rq#T(tSs8e5iZZ6g zG^OkE>B>eHGnKYcvy`Fa7HXlIqkJ`EuF~)OJZ1SV3zV;qEmX#NFIMiKwM6+SYpL>S z)NtUM*RE2k-O`l~<5nwQd|RWu(_@|T?alSdk|7(F6OU|Cmae)*nQP-# zWr@<;m2;NvP)LDOzBzA| z%R9VR4l43d+4jXJWxefRlL?N#PY9(sxdpusGd8QQ#lRrQYjvIt7`MC zn|8=YHK1w*)pK$ym9AD%6?3GL>UHxfswdB?s%DMySNWGwt2{0Ts>Y74t~yb@rph~4 zZB@Q=byQcE)>B;{(m*w)TO(Do){Rx0nuVy!v~8xU)3b$Y{@7Nkvs>Dz#=mN(n(W(A zwQ^i%)uy+hs-=WK~k$0jl?%2dfG^ zNl{JMFihnzX@qLR&{3+OiDOiUH;+>l{yIVRsN-Z+r)N`DYZuK>xsRT$>b-KVs*lY= z)$Tn@RQt}ZP#tQOuDY7AURAC6R@LaLdsJETkErf8KBxNNep_|2@n;d*Q~pa?v`;QY zTxRh%)o6O1epEqAKW*5*JNjwE_J1^*-*$;^`wZLTWi%bApU$nHp`FomZ=>ny z`f0=dY%!X?YBc@9XgdE=-S!y1?`t&O+-N$^XnKs%bgF*Zuz&lErcW5n|C`bDO{3|@ zM$>PNroS6a=UVpj{x}#-7c`nKVl-XOXu6`&bdb?>1Ec8{M$?^)rn?(W#~V!#G@2e| zG(E*=dalv*a-->WM$ma*<-iQj_vtr#QPcA|JjIl5woi`Bag^z!q`I(a-*EGuPYfwy#H=* zDqUj)A~6c(3@JVizKlQelSjP&{SisJ7+<~razs*DrwH<`{BaEYk4!6uu}Hc&V7g2z zVkCUWe=-*7BBPLQIsb9wQCY?ui4lv8HqViPCFiL4E3N9unzdg!l43@LMr7>Z{^ed1q?82Wjn{f}5-hH*n8 zlZ$S={bqfvu+r(Zq%t{13F&gU43wjXZAjmgZYpj5Y3#jj#L$cMGSW-^2z*8=>PO%k zVv9-I`=%yFqld&*f>CWq2qI$TrXb%D!?=9In0zrF-w)Tci-@uL5^?m3A}U1WS`R_`BPqyX79fV)>k@G{N+K$xD-x?0i7|{7 z8Ic%-v_!ffk%+`NM03Onsf_sRC6ICw_Os1!;-2LE@3V$W&wwG9O7p)*}+v z0WmJI3-KrhBO*U#FwzVW`QAl7%7e&xs%K1d330y(3X^OV<-d&oyb z%0nIrWCJ2{k7VbBCt8Ia;)pmQd66oJ$Vnn{P}W82Aq^3cds5_`6w(ptiimtABHv^j zl8B__BTfl&9=V33Go`#aIs_sfbwZOWB>@s0Zf-5{1MdvB-Jk74jDOgh)M!WsHO%$;cpNG9tyYJxB;L z7!kQj79j-Hl}r$6kBQU+i9-e=DaaUP3Nib7e;*0qAhWMd| zxc7#b_l9`)hFJH8IQNDa_lEfPhS>Io_y`h_5U-H?Ln2D9?{-ru2r0CK>93UEDNP)t zH;Ccyr|492WFdk*$)yP2q>F1Mf#0*g}k-AAaLKTs#LiLjg zd`XgL{3$k9Lf7sQ;YraE@w(Y`b0`v``s+emg(~7=lld^Vo1(n*)21m({a9G(pFh$s zLHGSyPGNGiBz8d;W{T1Fgp>-64vm+HZYA|ficXA@vV(Prnf1|{L>#Ve@u9sU z6vY!1p(0Qe(WK&RBtuXqd3y{qOGz;ieTnOo7!j_B42=&9jf_xqjg5|`C5k{$VNr<* z604+Djs(>$v}=T-PiS;fgrZw)QcSoA79}t5@6D9Gx!K#76qDF5j&&16EHpZS?JO%c zwO3R^LiR7zD>UxMe#UhT4^0eJL@{f)B9slF(0^CAU(BtDh)Il(ib!A+i2|0OD3vI7 zATh3MK=C*NYRSj7U$3y(XhmXZSaigXh5uoz_}+hVo8)i)r?*J=#mM;BbA=WLIP5vPa3u=pP{ z>DHDI7aheZo~RHgk*#|a%Bj~--WEtC5vA1S&f_Dz&$`LVr`V)5k^k#SyX){&T$5J0#%#gET*d!pMb z0;0ut<5v-IDg0%^vQO_noA1X`;<*0wic3^Ps(!RZic^~J$B5HDEGdzg95irg$T3Uy zvDR%sMBlCv5#gMl`apcqQN5xP2|FhT$un%-ACGQA_xPxop7LB$Xd=)Rh+&RdtEpnpi>ZK^F>g)cL0s49%rLbqk{05s= z)D3p6T*odIwyLNb>{U@0wyFmr>cUcYmgLAYBK|Xs<*m zY+q3q_OGygg}*F_vZcPg3uPaDJ%v)(#`5y9dGjNpuAmgQv8WsDVo^8P#`63&*oi`D z&rO*Z5$*XYo%MAWN?|*Tc3~$E)Ynre=j-djZa%KBpQL=KuN&-V@!cR>oeeE7hq|z% zMLmU5*wUhIu%AWU%t^$i*0m3(T(7SiY-f3%+?-2@s0-UUUSAhB^l(JvaUVgsN#A~u z@`%1J>}g>~i~M{hl(`YHoV=7}^>txi-`3a7v4@3iE#@)U*Yfwc8N4j1zWPzrlnLA?`YsJ>m;+UpT9&k@R_`ns^ch21R%Hw>j*hlqKE?X5&aUD)8l z_VyR^P^RnKh21S|?t{#9P;Yz7-&N@BZ@I40+1_%!yUzX=bzy^dLPXtQf6MdqWW9)} zccm2ex2PLzaCshVZefRuy0FEC{k@aWRj<9v5|kO)lyNyIj-_ zwy|8twlzaU-JH@xU-zUeqOTk5X2DKr+RE$OeJLyH>s2U)T`d?CwzaUUg>St+Ww5@z zF=Z1(tg9(yGkx7)e~aa}r7aW@%L$_tHo2$^ySxV?z8g&$udgRkChP0{CV?xnTuVqM81!h67C~oJ(e&x2^Jv1gVN&c{Y;}%tQMqYeUT%wr0Y0LUF z^-hYCr|LIq#OK%zk$g8QCLu9CNwyKioGqGF7fX&8)}di#)oV24+o55x@$%Pev}|6L z8(V@RB0fGgUVN!e2wTS;G!*+G(n~g8xeIlTh!d8ln4zJ(%ATxKOtoy@%%`ddFdOd` z9?^|$CzhyemneM1$IWZkZB>;hqmjL^{#Yb8us%_-(Q-}y_40rI_44B5kosb4lH;Se z1#&kGi;wL|yx6#?xCrrS^+wHt*%u693@;JyRy4M#EgJQQ)3D9WTQscGi2c^xg}a4f zrHgrM)@xLY5W3x?qSzzOzj8E^-XSUNY1wWY>JNYkt|airKYF*|o~qwJL_1uPVFdlU>VRhi~>ee6!c#o4pR->~;8N zufsQc9lqJ?@XKC@U-mluve)64y$-+Zb@*kk!!LUse%b5r%U*|H_BtwNucKo2Ix1$b zqhj_tD*8(Cp?wwNuXr0C9>Q|eyXL5e=d4Hlm_H#$JuEIqdyaZ#xmmaTDmm&tsvqXxG}J~y;C*Il1P$m!w*!YGeabd59^;#|LMB>A5lWzUAHp(5@Dl9Vp(!p7Te za=^qKTi~z>IjT+1oBNwxAU-7CBJ=lXg+(A1Y;}tU=opJwbZ?7`=*t$bEnK8G7T+yw z34@nOOO}O`Wo{{tr4o;Au;mK$M$1!{F4C`-&t)HOeyq_Tt2Ss6SCWjD*1`@Aunw`# zE48r>r5m_n!Ug@sQJ?iE}u4G-ru4G-drOH-S zDd=f-tI+9oo6%c|hsnMW3)54&Yj=_e&d zCpsoaiTIdgfwA9+-fX`cEn;PwNe79SiIw4?a^MI!R6qwg)J6|=7={+{GR>qh#LP66 zM9fS}X{N($+UGbdLN9SxhF(D=O;ah|VKw!&4ja&$95$mxY)zK$aD=*uu8C#h7~~iv zRd=lG$g>-`(T>*^akn4$isJ3TGd5kaJUX7w2enjB^}1#d$OOrn918Ey=TB4ea?^ z!~>T_5 zCMGCPNp6eL>)h6(cey=6OYTM8;o7|kx}AG6`kDJn^lSHb=uhsS(SDwlJ$ce0nkQ=^ zmM8n=m5N^FwGO?(Ya4op*FN+CuVd&FUT4wgy{@2t_qvU?Q2DDWO4W(^iN{>EL}e;1 zReh%};(uC57Q_H0&YsUC^kQOxLcLEGTJqf*jBb2-5qfdH#l*BEGAK)4{sk?quubJz zHq`@NCbcX&CUtRYd1*=NBkEsPW~|I5Wv(1NWd^u4qkATFt?bR+#H^}FfM(eH^->L{5K zr_@9ekxF?!B~~fF;OY|SQmehu2Ug!li+H6Rb0U_CcL^D25w(j6_5hVUs`+|ac@(vpj>*`ARcl<)r@eS2v{uz|wJ*|Aj*gz>nTs!vs z2Yp1B{$3n^@m^N=ZA1vjoV(Jf{Z4Jy0JC$hj}IEPpE@@8xU)8H^-ZJpCO7x&%iNfp z_1UQ1?n=+F}|mpk+4?f1_dGG(pD`HAI>+K10==~Jph(~EVC+P9ueT|0SA?**Yo z?Z1wHT{OAK{O1FV+Iuzc8#J~4>2Cmr6?M;5E zS2_0itSOI;+K*QqR{YnIiB~1f&-?Xp_Ws#t&W&2^X4L*@O&RB3Y<%DN8MRN^BNYhM(w-KTy!m2>(-`UJjM{gkWTmfKyLGFL_UHW_-(X<0dFQav#f{pV zs}A~h$=Y)=(5Ss-iCt4CjBGrsol*PV!KLGhC4akzi`bxE!^tSp20@# zr^kfETA$uCVUAIIxd@m0ZJf7X*lg6UyB-A1Kl>-`PAe`wefo#?ur)_t^j$0NdpZ9` zSkL&{w@Tp9!Z{nMZ_aOda=_Wy2Pzx2$8~r<;B5K9lbaj0cTah?dU@sFF84BOuU%xW zbBU5o7L74#FPU-VlF!nvua+9MuUdOzLgk3t8}=Ht--uZ4I?3wz@ZXKv=N9T+<6EJQ zN8TH?w|U~0S}rPhn!RjP{P^(s#5h;p)m$%W)ZQTZ&D=T5dM&MC)IPH3pe+OXTEFjL z)Sg`MR=*_=TWm=-YCm*zUi)dI+K-xM)E>}r)`_Fd{Z6bgYTvwg_V*53%FH}&)c&CJ z;yHU4)wzAosJ-}vDmQ!&&0CRa)ZSsyFU#WR9{XHC7%e&e&hC5GqWS)t+kK4M?^iGK z-uXl3m_|nJEBbc0IPa|DbT^~+JIy@@d}vqTm!U@ORaG9dZ*E-?Z?ZzioCPtw|-{>qJLo$B<)^(S@6@nX%6Ox8uUl)( zf*yMAUt!cfIjdGD<^0G=2aMXQ@0c)ufpdjR*NxiK+#YP1cEe@iC!_Xj$#-_e?4R|* z(J(+pzt=rqznxdjboBZ%M(sZxlpGV)rFPiUp;CWzy0n$P7`vncl7)0oxAG2h1f3rd8A!eh@ETu7KJ%2YE{h2Mk-|$WK~eA{trFTz5nfr{(s67T?eo6zt$6dj7(1jq+9=D zfAnIfJkk=UqfYdjA#aogJ;H@=I`e;_Z~Ch9O=ojSWU2Z;^GdIDHFxVIS^Nil(}VCt z|Is%s7202j+hO7S9(d%*XNAv{j8^n}C#Mxp)E=$TZ9O`ZVY~|&uGnUeE$D3?d(itl z4teB~4tpG-e$3-E`aBu1=!@-f1AW)yCHlR`NAzcpOmuI>5QT#@g=|>(2Rto3%_SSp zym-d*d%Ae$l3YCtQ7`6M#?w?P>*+;Z=~)Hs?-_`$?O7k)*mJn2pESZ#Do4Mna^B_e zHJ9sz?o#d{`bD|d==WsMVvoFv<2M(1v@G20pMVq&54QI(a- ztNc{-gTW)u`#;$uzd*H!`V!eApGi(G-WmKYkG#$ouaSN6cKF7MMbfBaAU^?%<}e=CQl z{v&mfQS7fh^{UnF__PC=#^@VFuCc%8yBArLvL|KnNo5O?b39Ul@tj9^gp(tq{}=FUh;prdrO4;j{DD+ z@S{7cKCdyIZRpGsu1_N!77-bx>jNwI-KH8iQwOqWakL*g1m>8PqC@YT+=oK2@Gd?yp zQP*vRjgROn)vc-9ar#@4`Iw&OOi^%hFtjAuFw`Q)2aya* ziH^%2l@i%Cj`1!LEUTyJNH0!xeUmOpc<0)r7mtr7PBf*MBgY3^L5hc$Djr^1WOXlV_)k|xhA-4oc&UXBt|3p9qBDQ- zTBQ}SVLcduBWBf8BwX7r<9aE9gfU&Q6JC$kPlF35^z0YzzMt{h}hG z!|8&QebrCsPQOe=LUa^8HseAQNLVj+R`eIFTeG>?B{o`jYO#ay`b!;yLPT3+*X$4F z6V@4@ceDSf7^qh>35ACN2k7Z1bIKUBH?~|iAzH}q4E#E@YZ9Gx=`F@D6de&0nb=+W4}SE= zCFVS*|7>A~ZzRS1*{Axg$l;6lvufW`&2m?_PjKjGvdup0{`y?Es*cGs=GI!fn}ZkT zULDiG{5{$F~1tVq* zqpf4W++)tR8FQOP%xy*;oi>bO8W|&o8NYq%?2UBI?c3g$?_K};)_-fQ!^3`dI;l=2 zsu)wdoY&o+j{=OPPCKkUH7{V=@G`EY4s^0PC~IT$u<OM^SDDZrpPj;0rJa?#8P3d-2)6=HsyeL2W_*D+tk{dn77ys40W!axg zmb_QgvvlAY&*YJbw&N!Eby)Gj%{Ag}E!(26s~7G0WQvE&kbw@usPe8VLsz%1pVNi& zbvL-qb8>eK=>5rk#pYs;OCL^mI8}DF@Z{bNr#6EZ*|zpM8Q7-mEZ6Ax?Be5!-*7i& zR`wmw+BNZtotpvR~nTUzo6`p55m7{tiD38|e^jxLd+wM_2ddyIR?d zUeVunKYM79Q{P={+&A0(#Z&`#(4yl1a=JRDiasePAlJn|`;y>xI_S?XO4w>GDc8*{e(c^2N%$zA4N*XR;f* zH`KGJc9mn7DN7s;Pn?9SS^Hd4mnekseT+r#?y2Tp;@VO7ki8dOdQR*h>v2ivF(KQ> zxnGwzj+GPFI!?ZvTS6XLOBi`=r0#?J{0e@ z|K?v#M~(#s^ePi2Je_>ZHgv-&oAM<`*>~AJ#;sTBMlLUZdEjEn z(8Aq%&UF0pMPqy3bF0_!`@K8|wA}33pu-p2o*$g-YwpPUVYuV6guAD&0YJrsKby4O+2nGZREAt^`_0xm9{pui#KvQ0qpI=pye+ik!^yRm=Hb!%1ew2kZ0=t95!RmM~A+r@RxST7+;>m*#c zRmM5AaVclFZ9(1+y<9ww8>YCu+WEp}@~=PG+B~i8*}7;G|AxQz@|xZ^*)CgM+99^~ zHV2O#O&wa)yXCy5(t>~{=NGzET;D;qxYiN-O=W@|#wk|H4(@&D_~icNz)$X@oEraj zQufTYyKU`Md$+##s(Y?JJJ`MU>e;qs)oHf!oS}tk_j)I^O?c#2WJM*fib<`D?l`i~ z{paLLZh?V2i(V>T$8mX)GmaIy6mlEBKi+5SOr?F~`=iCZ;~IJ<-aIYz8+G2M*u!z2 z?Kih~Xg@btP>i}#bVb*z?rnWk?%GWr4nrI75Rx`Iy8Y7A%W2c^tqS`@w03S_U(wE6 zS=`>c?A1ac8|>Yxc#QCI#%1Jb-nUpob1Tb_cj*?jCGn{Xt=|d$-fkmol&_2cP!^LY07DjgU>we zXVkbCxUj?xw`nJWJf@F*;-Yl#>@)UUH>X;!;_cKMAGrQHvzW`q=vpqX`n?riEvf1@ zWPN3irh)AoT5TF79PD4+adv|ywjX;mb*R_qWwGIte$6Fc|6;pK*?7$;>ruL+-md?SrFMfBCb<`yVCUMeNNd-Da8t&2iA?zeZ|@H_J&&gJ;-dBwd$0)=;}`r`H(S+-S?1^niR9B%wN~FstMfF03JDc1BZoGBTl-uhz_tXlPzZ2$rR7rL!;a2suSNcvH zr}|T4{4+XrbFSlF)aSRqpSV=q9qU!{=6;u~cMp8){W!&I!yipu;`Xie_`3b2<9Yw( zt_L2)xlbK8ytv=ScAh`qoDk5hOQ`dMYgHZgH5=<(Y{w|Oi}S7o%xn3hS7V10{)HM% zbvCp-X5anYVaKs89@$SX?N|8t?9;BRPIW7~Xr`^LO_kzKfm0UPjvj7r|6}K5=QT^N zI0e?qDs=PJZRaYBmK92Rw$Jh2^41<%F@Jj9>|DY*;Z+aUEX8QI#D-7YnoQW>I$_`< zkMkR!I1Sl%#Q$)Ekscia-W3{o%;=K5bcKQxJiw@I2sz}cO6F8S@`Hy*BU ztY6zD=Q~}N!%3|8rZhXl#H&epe3eG#SCjcY=(I2IE#25E!xO~!aqvA|l;V;T;HpA= zeTbcwK}>c<0q;q{^&2x!p=uxBC!Y1fdk6gn!<#w7`oTH=;FuHvUX_RI7VcC}-jrQr z@c?0rCvSLRCu$gb6DaI&CHQa9Fj-)hOv=-GSe zkPR>G@~$$#d3a*}jCnaEDa@=`&Uk7NyNSYHjbQhK!bo5*NW<&VVeHC7d?zX@po@1?!9avw*It zq5t~D3izH8*ya1q0&kiCGbARCf9F6Ps<^>JlH%aQ3UC?4U#=g-?kce+41!Aw@%k)G zL6mui!^LJITtURLF^I1hoj4qBaz-~JXjD@RU=ug&9?5+aurf)jd8fMMzZwC7z>@0w|kmdiXQ_I=Pu1xIh(v}bcrwz&1~~&plW$p`7i9^o_}{Cp9-ojI=HDsvx4kY$3&kHSrF=jJSoC4x^TwuWz=yo&QrNBnRJ>OXN-4l36Q+(kS`n-KaC%y{v z*HGa#$GD;J;vbtP<^u#DbzmQuVBePz@>>aU$?#1S?g2GJSN`P?@rw=O9b~v8#}@#Y zZtzVQ_MMKtNrPkf+ChU}6_#1H2*3-Ipc7xTgwKW~u@_i}!GOWNX!hL_apeQcZ}))& z^n=%7;kS62w{n=1aOcHLDgQQ=V&PyS#P`)C;msVdW`~&|ah@?{MXDE@s@P>>FTpJD zH;mo+f|jtJr9P~dG&sK~E@-ge!F?DOL2N(V`H2^zV&EO(q3ot&)Ijl&23lxMJ|6aI z_5l)hk4&C-Y!UAue)FY>@Js+|4)@682FAg?PKZhxmg^f!Uo;WF7=j7dXH5phM8U*j zj};i1U*J6=ru`O%g6E}$JMr)d6Ifjm;$jA{euGgM)Gv0Rct4c?#-|?yk`Ic3rx5HR z031la*_*8dqQ$UpeV@-xyb&1>H?dfU;dn_x(Y`5<7vM$jZ?_8NL4%^e2|x4#R;u<6Twk7r+riovmibwq&WAQsjF z1_H?JSNRVt0lVcZ=ikj~E*}Ij6JuayXEC5fiSVkj_HA2@>h^AHB^X3FJZ<(lVfRZzKzisCz^co(0)Udmbmd-^c(`!xKtf`3j1 zmKu1SUTi44MO;s8vpnzCB~#ED4Er)n3d}q>|AI!Ph>I=kb8LBHAM=4X<>Bi}>}E9o zq!Oyc*ybU`+wUXcMfG83G59_4e4)(a@N*WZBP6K|hb71gT>(cWCSr2@m=kM>^d981 zuj$Wgw*JtfN1ufUnzSCR^x8h*T%l9F3q4=ZY<MqVlv6ZLUr|IUu*nqIk?t-PFBez5M7cdft<>sxhJtt;JXcgFyYx=J^Go$|CQuFP`Ebh_a)W*~v{XU#~^Xl~pJNHsw|ET_GPx*Hd6&Kfv z$n<=AS@v5E-~Lrw?YP`+arC2x9a2I@gtT28AG2*~=csFbo+EWvo}OHIwBZ~1?fz4v z+bfPPy3?}oZEdMh3u^c`m^MV!MteJ;o~nMMped(cuT6Vcb7ZzLV2j)7MniLonl|6`e(J|bCMtxxAB zRcw@d$L)E1k=KhmM$8*pHspER-rX0qcw8^|ME#zA$uhYtExe=bPc1?5r9sh_?Lm)=m&Tc# z8XqYgurI@SrCikMF`0qSO18LrO0*DkqGJo@tSIYICGh4OzEZl(Njq)_P5z~e2O5Aku+JP9!L2#YH+C`(-;+1b-HN<1G%1*w5t>dx?XaD$49d`cF?MsO7y2X=cew{O{ zbjODEo&>K;3JGr;JZa)g)xF$m38z=elH41g>iOr^;t}N|2Pj<}hBo=M@Q|$I5TW1a zpRU%a{kOeS>(ATH4_?}{Wq|U?JjLnlZqKGC-(0*W$7yNgr;Jvv_xy9bCY>45u1K}J zQ{q>p?$gvd61}5L)V_7{(vwbID0}#ocbW3L%B%K`9&NM_T(Z4*LshA#+YY&W%qizK zyZG{#V>Y$?xHo##iuGAzd>dyUa=3J|-pRT;XI;vv7Dk_xjnlD3VG>Tmq77*Lx=8Bv1#%{@u z+?iP_p;Yy!Ek}Q?*RWsz;C)|aP0`nh_x}21WrN;T*B&n(y5PjyN+U)*Pjve0WZz*= zURM9S=ap*Pmpk2RmK{Inj+bXG<&&R=%)9%`nqh(Oy!vh|{%LTV2;U|iH{~sc_E*kx z@Ci6v_=4is8Ugq3;vZf=Ke}S7U$tFJXZ8JwZ{rV^sW7Z;c9T8cUN^T_8teXXY}KNnm3w;s1QGHTUtF~1#u@x0F84cdK;jaVD}{863D zMMiq8C~_t7PFU$W`&JDJt$#{(z1*eWdqi~{Hf(E$_7HFB78$5zE8 zS=;0hVY|mWc5-_DHd|iomf`eXWuFQ?D|n4wcQ?1nuqm07Pj0VUzE1V`Gbgp0dL}Az zdj+Q=7Ip%{g=~M3$!SGwi^Tft~j>8+vW!llqF4zA;H< zhXgjew`oM1Wou;+aoT*!}*Xp3(g7)Z}_ew3wz3+rM_5HiY zJ~CWMZ5v#AUA+U5KQvt75c7MrbJHiS3Vrmq&w>p1Rd$EncSY&v-e}{pa?6|C1EJ0t zCojL;W%pYzmzNXIot$5Og!<~zY5VPdQFZOxH1)&nNQcceRzw%OGd}!&wW)=#hop2B zUUaLluuHv|TiP~7s$~{)nA-Eo+2_6L2j8i^^saHhh@fe{XD96~-=}HB`w=>2aD!g8 zZsZP~@icaLljL^K8r`+6HZr+m)9mq!l+h)E=UpqBGrHolb~7t2ThQ7zBtrJ{n6v$E zjV{|Yrd6E*HFmD=8S6A={OI_Hu4^0r5|R}bsu}**K6#31)~~u9fn`PxKC`cB&Ao*y zq&~jsvN80ByD!cL^hl`S`@_Duv#$(XR=iU^56_g($GpAw7Rxw%HGZ7;gZI-tzATI= z{k)a_^OkWfuKy7CZt0@?CC&!*id;XiS+A5^{xzmPxEax+@bXIyj;ybyKfhx1{q_3- zCmyeO>tbMVut)XS-gULzBM*-)?OnKk%{CV_xd+~r>lXw6HMvbWqp4Zgyiy~RPI)>H zx%D~H>rw9__YZCDQRjSe!v!_8lSb$k*hkdwA9~d=-D_Q1R$B25OJgRi?>TbWkJ}sn z6tuiUV~>;lPmcZVbXN7hZSLF{8)BC_$ZnBq>4XoZ9NnENIFCBN;YK%gQp?;*U7uAt z@$s)Sb!_Gqe=wzx_uqFLh5a^d^}1F2U#5J1f9ls!m%DU6y*g;XN0$mC`(OOAX->Z? zoeLkIx8%s~gT;Fle|z@*wz}=pH{QG;^KKS#w#4~ezn2)(;MV5e(d)e@*;g*P!F_k} zN4>usE%AFokC0|xSAD#u3G5%y^PIlI{`1dTKa!bZnryq<*i`b&hK`-ad!BP&6xpeI z)VQR!4l=jm6WyF0Cx7(5)V%o*1FEUl@2gX8{KxV?U!Pi}=1+HqPSRZ1*y?tNvYni| zKj~^eH!jHI=ike2f1Htf?s-{RnR0JZYmO=8+^1>pjsD)NYm^L5RYtkRHtbV8_)lYl zafR3KKQKOfy3DSLbE5;hJ{KD@;A(M?ttZCUKhbSp!mYPE8{1xSXw@ZYa@$Ft>O@y^ z+n|0}Z&K0tjJ1wG{yyhYyh!|`kq^e!b{V+5!QO37Db;HCxMOb` zaIr$xpFM5`*&Zzxv+I7j(f6xYEw_K{f)!1lmMNDouEFL$o_;mEtvouU&a+CDWi>*Z zy}DB4SmyZCC9jP02#cQmHr1z3|EAl#-&_dWS7i32Pa8cQZPb&$obNG9wZ3x9NBhQ; zb(_kpz4|)!CSM_A(w?YqVD+UXS=#x00^ zt3B_1IX7tY&mNua?$jz4-1B_XWMT4_`E{1=bFMu2<7Bt%LmO+~IX}-$(fAH^c9>Xd z-@tzBuh-dfrbk+*`-}cg*^`zr@UKVq9c2^eN88lhU)VY2Rf8^Zg^rXTwZ37{hP%Fn zrp_6CsmC_EjD4$|mDOt)OK!}JX!IgJLkAyx`2Frr`j5xn$0kp5JM?0Jv*+nAiH1cT zl1k>;};h+Ui!VAN}RjkH7X=_PJ&CFFq=N| z?#-)YX6&8)G9heBnZKHO%qurEHf6$$?pqI++uYq||Epz(#x)%FY|We}B^#_Mosx8U zif2rzzbBYZHS~$<+b%vuc5G_T&-;t+Z@kFgrP8cHXFLCKP1v)?uj8OFp>w4{&mQbb zP>q=a{~lYmv6sBZ$dz@xdoL|=^I6>3;X^ZnpDaICY15E#mDAiepchzHL;H<6`X2_1Yrx0t5Fl%yKH zZ4(FWT>DG?tO@l8tdAV_XFbp1b(2fEN6oeGeqglbX*)x$8f8!TT$(WaM#68t_k5f- z9Bb(CC@$LJLd(Ks9`yQqN{^SVgtNX26pw2u4?nH_Y~zle<=S5I_ubMf((Y4geT(zZtN}*^L+BPK~Fc7D%>r1;$IC@OSfzrd$YM~(R$IFI_{b2 zU#_V4Vfioqn;VT<{7iPYUHdCF2cEAJS1xo=NcPXcpI0P}Qx8!O9MkY%NuO%{rp|F5 zaG-F?mA{`ot8}==7TM-E_l~>Q4ZgEiKiQ{v@Vu{wd)zsBt!v4$I-PbxkH*_BsmHZ= zpHggYN&oq?s`r#%e^^sLWL;{l&g&0+?!6!->8Ab{SRz_x0lo!a8i z?x{^%T^XFYqwj-;r<%HC&kkGYP;A@dsxzamCXRg8t5H2C=f>NI3@%{|OZNPG)8~`h zCj|bWJd^D7%a9{wOD*hg|J&ZXP>Hr=x#?o2q9%7VFrd_mG>x zqXsxOsgp9RLDHg8kK$S<2W+|B@%e{gW8A#2I_;}?@=)Un1IoL0O6s0jMN#!;mXDi}6e53|eS6dq8`rlddz?P9yVZ$fD_t-4 z8`U#*(;e3aQyQo2y&gI{E+f3rlygpR($3fHX#c2Xe3w~oZRUAwu=r0?~b%|`dy z`fzaXhs}?==02}qx$eS>pBlEW(Z1r<$=3y!@|i_USDhB^YG3zt7gv|d4I-NLQvZH> z)csKb&9{0c$_(L0)RjitZ8+#Mw(~ll2I-6Yb%^&&&+?ee=YCaZ}#?`J?yoTB!pIDff;THmcgaC9B#R*ZYrqGV%w#@5(_xhrOI> zzqMhT>NQII^yv2$ZCx9_X}0$H+j`}14I8H0UN5D_l3kCz)(!T592L{IeXYQlbFB=` ze?3xss9mSt&vhL?G?zOx8T(*yv1)fuWc;pER_L~9VDryw+kLTL_hft6_{hOk)=Zu> zx=`g#y?d5ajQ0BCRq5@FUapET2ip|GSm)!RzeMZ}UZUABrlsq>I=6QZIM_6Lgx#5v z5&9JMhi3l2reB)naBQ2mzR2z(_QhiF=Cr?iZ(xn=R%L>w)ph@z{iJZ(!JN)-k7s#> ztM)n!avRZp*rpa^eVwmFOlcb3?c|e$09~-BQc!gG8-=||VgbH`*YI6J;x#F(~sc1#`i;d5V~!zV7c zJkWPZLQ&10vO9*{X!C<%+X~menpN%`cmGk5>b{X>wuJi}JQZno%JpID;gRnv%^9Dw zrozz0V^sI`%X*y;4{EaXk-p>**VyFHvn6y#zr;>HJ>YA#&945vA2;2kiticv_RWHY zZJ&(~n$h%qt0Hv@`^_)4a`C+DBU|P6`RV9w&0&?8bx4$~Aa@oY^u=1(}r- zjDU^d1dv%_+Z7JNM3AS5+_!jBL1u+*7dZ&iKu(j`O$T`f+Fd}qnIO-S*v$r+6}GkK zAj|=o6}Fw_AZS5mg>C0J2y;Q^?=OF=-%r4?!Zyk~A7ob8c8PGhRZ-^g>4jXImoQA?K%fx1<0&SM491AkXd0H z&0#oC6xNE|x4iJmlE4bvZgUXe6(s>a69(HiJN6kcR@g>%TR`3_vD*eREBWoVgRGa> z?ErZv+TG&j!Y+{aO6>N5%nIA?a1b&;-Y>B`1oB}CcNAn+=-qyXCqZU~ZERO(zn+30 ztiW#Y6;;A7@Cz$2-Nkv&bf-aPg>B@U2{J28k1F8|{K86p-?JdIlHd0n$gJe|Jr6P~ z`F$^d{413F<8c>cR(60h(=faT@+*nmpCGfsHmdV$kXgx}_YKIb12QYsF&@J>kXZ>rJBIB0 z3am6oj$s1GtW-l^hW$Whr3!Kk2Y}4Vhl;#@3Az*2vb33g>CHr4X`Z@N0os9_61mwR&q1y+a&tlc z896y}t3lo@;kJOx%5CfehU}v++o9Y+j^PfFk3lgZ$M87FtlUSA;R%q>N$k#p%!&c+ z7+wJRB9vpuF}wsaD{Q0xH){l$mE&l~@G{7(oJNk}b&y%Pj2y!oAhU87IfgeuW+fLn zhFKuLf|7qMb3kTg6WTHS6J%EO$T55kGAmBZ9X5tjH@1 zLuZh^pslB_wuokSj>+f{S;^0J1(}unTsM$e$=?S(KxQRB*9&A;@^gJaW+gwT200!|{u~J) zCra!zAP<4kn!AfQ6yzi*U65lq0_2fUVv%E*3~~yTROA?r0(mqP4RQ>}fIJq;IOG_n zf;KfXdY-mUL>(g2YIE$P6zUOiQNW}w@d8wAn%aa?E;w<7oJ+g43PIj zVH?%u0LTZC+lzDm5Xh{s?E`X0KxXC6!>?Z%&+r7utmMy;3Gz88Y@@aJJjkrDjp7+W zz6>RQUuA)O3+6lK8 zGAnF5fLslbSz#M4iSShsK`f6jCqp%GiD-vQqo4tKJd_-?V>k)q$)er2HEeHLSjVBT zttbb<2=Y@XkI`4e%5V-2g>4EB@I4dwKSxm5`pqbYYLKHuyKgz7L1u+*E;qPs49Kjo zttcEk7{-Fk3fltEE)HZ?u3zUi4Euu2N)~bq<3Sz>CI7K!5Xh{s?Gf4z2ALJM*$ z0_VC=bhr;PtN=1A`8oK{kOC|DIpsR&11S0XB^BhQ60Y=mIL<)HZ&w54L z7Gze~_9cmr(>Rc)N$h5VJWIm;2r?^d%j(X3wIKf_v0Di8MhUkGWLDUA2z@t$%nI9f zAh!i%R@k-&xve0x!nUKx=|N_NZGRxQ17ud%b_2OmFk9=1GZwDrMGfr7Aa{q7|2&L+ zTf71kwgsVG5XkMJWZ^!;kbTSfC=|BI#h-8v1~U7;vspaU;1GJLe7kIO-xfszXsmG$G3Cp&n6( zXhM|N=Xw*xL0LyUqPzjdK{Qpzd?X{v8**M=1MLZs*CConM!mcd+9R5f*O81UZ;bJ~ zp*p{ zAOL=*97FK>Z%h&n_QqP!*Q5p{?r;%WYcp&g=*WYn8bmWQJqq7G4B z6L~}(A+-x-c`a^dBEME#)?pqs$%rOId25W1{yIc8@;XElqPz{-BbvyMWJGyev_mvu zJ#;AN%_EY3Kzp2DI+|zLPBrRvh$cjNJM=@;A({~7?NN`YLzMSK9#MyALX`JHJ)#cL zgeb@T)kN`B++N-r{RojaVSD6tP>-l1Bs)Un<#o{>QQm>eI*f0kJj5fav3~MC+}?z| zyd(NkT#^w@i1G;Zqr4$pRuf`eHQMRO9#P&2?Gbf|CPaB>)FbK;O^EU?T(6@%BqN#- zQU%s3B)4U+0 z`WbNlA)b)*YAgOGEB=BNe}ff$sujJ`ie6_$KMVISYBwRZU$u_+AFZE+q&J~I%{xNU z>(HO}3qsPXt;E-&o{k5E#R?Hp z{Y=4peV}#|l0LN(*VA!@ko3Y}uD3M)S}VsFot60V%KyH8!XU1vlag~ zR{T{~^wFrNaUrDohgtDYM?LimA^A76;xDr@|65t{Z)ru}7xmOGLaJYDEB-C4=+~g0 z+D%CDO?X{OJR#}jczr|lA|$;!#6Z9POSGofjpOTIIrJu^U?x1jk|RNwr$5c-w-O0L z(i?F6Xk8>Ez0rz3(~4ea<@hqt%J@cD8NW_e^r^Uh&~+^#wNKgFApS}`A?X!X^lB@| zCj+ieblyow@ikW3KiGk969-ryFgOK!EYyE@k7hP8olK)UE^^+g?_w!d? zh3lzagcM(n=TEd>5t80yWqzqk9}!JM(UCCEzYy2w;KU~+eX5o7A7KQqe=&3*B>%{@ zeE*|*6Ovws{ZHdYNP0c?FYT9vq_?(ysIBDJTgjhb#Xr@GKFx|=Yeg^L!~4(D`Dc!m z`lnloue1_hwUy_mc~40FFSDW-ti)GX@i$m$pT6HhI*HAaGv^iq^Q@5!ml zpRdsU5vg8(gFi2!bz7>>+0FITF6{&^OOLbCdRRJdR#oHmq30~d9RB=@{e=zH0){ya&8db-c0LOscvKHQ)7XBj@fB3Z5A<3-Q4>A5mJkEQ3Hyf***soih>yh$&S zjS^WJLE694{+B+#`-guyo}c>PSXm<1G?%6RT72F{&yloSdH>UKL4|T*sUynTWd8iF z1j?!uE|)}EhI)TX{y6@0o^NeFNW&P*^Z7vYS*o`tYxZz|%5TkHsyFuH{Y(3URBuhz zD7e3LKey&bdRZs)_DkhFyVRe>U+WQpD79B$JlcO~Udb%^FDqF4wSj#9q6WuoktLwu5g~tKM1AgQ#m-!#1l&Mk}TD$ zPw_m|E!V)F^Z4Sx5}FosJ{cVdrQ@&0=V3Iygwi~gVy|x|MMK_m##d|CX@*c!JMywJR!LeDxdT5D~AN3 z$;5fup9rP>ud~qqCj2`FnlFTum(cKl=b`&hgoaO?r}GvHLh)lApByv<0lcd@s*W#}z_L`K7$NHlHU0Q9)=BI8T2UMo8!Fd2xQ@`RVvT zn5UQgB5l9?68ER`KSGIHo+w=h<#)M1oi7vSIY@qy&L8Q6!kNj!B$ z-cK>e6PjvpzBclN()z3a!|{{$pSpnSe?kHMOrO74_*HgO6zG! zR^k0NJ2W7)WH03{wcmvEg5nWM{gW;9ztql>tSDgrr4}&1vVi$5^`EMM^H1@e^Uq@b z@ATK89i1N#S{g4YpH{&Bm&^G&)e{2~8rpNd74n4A^GnVD()^e2e_nqyxCo+@GE^5n8gB@&*gnA8H&|S`P`O{<;DlzqJKiKh?*0`|18Kp|qZsWW9y? zr~l65ho$*r{9gZCy#93FN+?|8JgxVH(so$NpYy%>Lk!Z8qAc6a^V9xFC^gppFCBjj z-@E@}Khb$3p|qZsWci_g-OtAF%x|(Ve=Oyb@|MO=hx;|Hr-V{}1&$N#pM+97OR}Z> zs_z_sOa7Yg^f%q){qKVnB(zjtDX)IU{b}7Ll-iL@*U=>F3pjuE1-yS^ssD7}dHk^C zZ}`sjBfX&OuZ8s^=R5ZwOZC@&=lrqcFKpoR!UhMLkj9-*eumr8eK$hVTSFPKLX>n=iRyqy1~@mG9j`&DR1#~ngxJuS()0wN#C^FBgL^G(WIs=u~??U(<;>qYnL3BNag>UXx^V*S6< zKjVLC{_6|af4c8n|8&?+TAvA}{cK6r7tr5OK!0Na{Vk2Z={x(+qCeJ)&YK9O{bsPw(M)(gq3xv9W_x~~rIRBId?LQ0mPb@U| zAGE4~^Uu=wDZX?3EcvUx)8AOY{ zXMU(Bv|uhsk3%{O^H2Ys{U=xQ=WHpMkkIs**Ngt{hfsQbXRz@1AM*X&pZbeXT7Na# zQCvbx?WZ`TSL1mm{oNlS>7^)L$J7O!KUoEw|0WCLr~A(552ga<&ne*XM`Nk~vibPa z@qkb|9?G_S{>?=Nq1=u0rI06-`pfZsFM2*eX!_p%!|Nyd`+vezG&B6*nh?X`s>fl7i&)SQurMke<-e{!e;K=w#p;s=uZ9 z(s^wuo|G?SAwK0J`~PYEUA{B^|Fr(T7+;PRrT+Q9Re#s-jQ>BaKh0~ZFV!ELQ(&lu z5v1`+E@*<<7(k9l_5Z&W-^aiM(|SVjrGHQHKb@a+y=5&vHt#{bp%A+4=cm2s++rUT|5u zo>Ly}K7PC*d;NW0ANo5mRqI8fDb+t`IG3q?#tvL2dx}e_@#69Sr~4TB z2s>Kf`&;<_fda>!&VLEj_&ovxqCA$r@1BZiLR7}#d+>-tUoNW=4T$o1^hY!yT56vv zX1S;;jRrE5sOl3AMHZ(`K>u&?yr^X4|$34m;bNxE3o}Ee^uCil4aQbJlW5Dz8l@lWfiuc z>=l3U{vi1u?Z^F>^wRy?>Uwk9eE+xheFVi;ZcpPWtIEfZ)<;Drb6Iwa&p+Bx*`g`FxOmufphUKA#i~xjn5fs?O&AIa_#r^N!<^@3U*Ko3~$q^Nr%=yyJSB z&w9!C-i>$6`$IZDIZ?d6w7zO)nXi|!73S^HZ#9<{hsE0)b9%XjtA`*WKa7AA+0ki3-%PB z>}kKySg@C4BC@Bv|F5BT*S|gwRa^L8W6png-_>N{{{qnbFrDG|J87LHr1_vc`>*vh z{yGbK8gJp;zxJo`Ra?;0I%cq-r}->D|F7fIJWaKrr*@hw=;^#6^$L$qG9k@(Ilk{j z^&!;vH9y|v;P-y0UsQ2iPyJ{_ne-Zzsh_kGSud6Mm>+Kyd$~;hM$}Wk=1622+LK;| zGPOt5-n=~;sr<_Pc%wp@`b&o2r=t4kYn#_s)5ToY*D>EOG{d+)ufOJ+%Zl|}rudr8 zT&DIIC9>=Uk5A_d*47PePxE;Cy5{v$%;$OWf!^Zhl%v%xIOi+;-Pu} z84vL58(J4N1I+VlZ=1(ct>-eG&l)9qBVHfVywzUf`SRo)ygf8tiq%{uz458}aUthV z^ZIIc@cgtM%do$xeMZ#h^~X+b?~DDR!upbI%;4u&MM%Hjyg!UCT&Dh%P3G~)UU8Mz zpT<{#_cQ3YrWnEX^xRATD{l`yXQTB|eVp(A)DA+@WAy}DFLhSz$&Ti+rT?2k@yU+n zmHfoNuMf?CLbVlp+CK<&R_v+$gt{ZVKIBg*Z6~eAy3^dAWJ0p1dgrar7UEOC5YoIg zS*SnRQGA-$@{|9%KgpijL-R&$#h&_w=7kh#Tvf~Xc^S!s`lXzw{vcj~Jk^WzT8ty* zjc8BvhU`_yQ$LWO9^*)P8S>N*WUs+E)LzPygZ5HhR-Er&G~Q&dEoQ!s5T8?&^E9qh zF9pVt@_LLz<4X1_jK$pkf-&8+NZ%dQa%UmX+0r(*-pN$(K?yO z@8CS$|Dt{}qP>(?Ay4Z)*{d)Pt+TWr$#(Jh#H;3;uXi+0RWHo#h?k}E^;Y_K3dUF5 zp6WsNMvPDWLcGR8UWEl-Hi732qyUKe>np|Is!Mnk*3)0Y%kcZ6bbKLo&Vqm44|+@W zdCA*L<419f$QLF8F$d$&d?K|1^GbQuA3Q#dH`%K!#5dx2N!z8h)DLJct)~{_)A2Mf zFODxASBaPPUoQSyiU>rbh5E}d4$VJuQ(-^Qen`9#>tBorL>b1H*3*b_Xk8#Tt%doi z#c`45)moVUTFfh*=PI0^B`6`H2J0i8|751Y=jXKlEAV+at*?5#KS+A=BUGS2t#d|{ z$v;Q>yj}9VUW@Vb*4r=qxI^n5<*|fDEw`uRlNRq6k!<|YT(3wsmyJ`*WyK70S$3SC z?@~Nf8FN{)lH1d9&A7^3&cS%3*UmN9Yv-HGvf1Xc5$j9-nyC`KB)$ggn`e*pC0UF0 z%^M%AFUhi*JU+=`sCnvP(D452gxc)|LD=5`d5p3k`)p;XEM*1r^oT5 z_w~rHbA1}Or}}FbaGB~aTWTIpw#r=o$Mrfs zf1v!v-Q1q~S9^fV)LzQ#1P5woNa_p&nFa?{Cn(OKbOu8gSp26kJp^@zhPuGPgY~~N z{BVZAF0goqfj$lV)4<;aPNu@ZKMnlTm_Ho6PcuFEr!jx%{50@S1OGJU4<~;WKpzhN z;ozSMz7?Q^gMT>qPlx>LnI8PZ!GAjB4+sBn@DB(7>5xAj^qJtF3I5X|e?0hSf`2CS zhx|{N9{e+zKjhB@|4i`DWd4x92gS8 z5B?Q#{L{fd9sDce_@{$^I`hZzPY3^W<`4PV*;_jJr!#*X|48tU1ph3^&Bi|x{3F4C zBaVM0_(y{OM#vut{*mAx3H}>#{IkG63;Z|Y_-BEC7W2pP&jSA}<`4O^z&{K8vzR}Q ze+c-8fPV($X5$|M{vqJs563?Q{6oOMALI`K{}AvG0snqD{u$t(0sj4P{4>BmgZbn5 zXMleO^N0Ky;GY5h8O$HYKNk9~6!Is7e=_(dga1<; z|6K6T1^=fw{<+|v%lvWtbHP8C`9uC(@XrPRT;`AC?+pIV;4j_(191GE!QUDD10X-R z=I#FhIR0tip9cN`IR0snKMnE+;P|J3e;V_L{Au8y20_vwe*lhuIQWNyzjXg!jN=~; z{^8)i81jdMe>nJuga2Y2|4i`D1pmc2{+WyGr>O-{4<$9j(-sN z2Z6tI|L=z59|ZnE;NK1M2Z4VO_y>W1Hyr;B;J*RWWe4dB0l`9uB< z;J*RV7MGk+X^fAIGQf9d`oisSDO{{G+}3i6G9zjXgk!SN3P{}Av` zf&3xh9|Ha%;Gcryp8@_E;Gcryp8@$ZAb$#ue+KwxFn`FO0sa}_pTYcb{FA{y8T_UD z|3@7EWbjW0|BsMA8T^yMKNtdU$vg!H>3L}sypWS6fMo$t3nxeDRI+E z>{Tv2UvbK3E6Fd3Ckx^Aq48B^^89)Ab>;afpFWz)u

        tq1@jW<(v?%r}0BN4~)2f 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%0D-=MyM>eV8w7c^bRxW0Z%*TZ|F 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 z zjg|SErsvGIw;mT}-51EuHTjO?rKd2yTiaXb*YsRPeu~N0cx2{W^#u089M_n(cku?9 z{QbCZe1Q|C$2UEDx4nzk%j65(GyV%bO>9c9}C}et#!9FZy$qHQU~LoikSM!;SV?^SmwbWQh1Ud?+6M zD)(D`J{pfV%sh|bp2>gP_SXBZyUIL^)8G3nnKL!MMcZ5ZX5I%r3NJU2IWv0B!K0PL z_4#F@_L%oAU&BK)|G#)_e66$PJm%)--6QaZ@yqf01NV9Ac0BvY^(S#}n(MFObIreN z{60R;^nBj-p59yL^~PM>GtZ}sog>HPndj4fZSUcYGoJ_89G_`?M|vXDlaQ}WKE|VJ!!UX#Y$%Tly`PM2d+Xn8HtU{^k2QWdKEe1+ZEro^&F8xwA)lH2>v+QFZ9*Pj zv(!!gXS``XPttX~>`#Ze-j-{7>))9*JsY&Wi#OBExg%bi&&7?vv-#xl-j_K~pnsU@ zKc9SmbAE4Zd+XoBHJ=xnf=9>6dC9n8y+luJ-Y5JJZ$^1?8bDvGs z&HeUpyf&Xhy8%zkK0Mj>*5k-2A!H{t4#w%s6^d({lyhFn)8}Ti*}f;eLN{FJ73>y+7Ob z*7K}++P<3hO(Bl9_vjqu9&q3Y&3ybjOJ=L9M|HIJ9h7swN zC;B_g_b)v!{%_w}pOZBC-fi#c^)>TsNWOWqdtSD~YvaT5()fY&cbM~d8u`lPFT$JV z{jMwM3C)}jw!Mp2z3*QC&*9@{x&ARdqs%;=FZpkOTK`U~d45?6pJaTawzuBj+fc4g zeSX;v?`3>1yod2IZSU$$9mV_1oZn1+d)F^+dv~wz%}=zG`nZ^g_cwkQ9vFWZ4~;*I zd*?ja?)N#cH{0IDi_G^~pW~sqANIOb?uW6tZ*SN3*5}*zlYP_IX$Rm<^ZAfd=!wkh zhk|^ull184`d-)kckc7AcbVKbD)YI%UTtsveBn1Yza1W$=a-Z4>^ylqPH69v=QZ%u z^gM%?8%sVTKLd}=^GnC&GG~+Tf0rP?a@)Ijh1t)cc+-5oZaiL_=cC8)$gKM<9-Dn$ z?g}}NzIi`k7d$fkXW*IXe-JOt{9oXKIbTa&DeE@OJlo@`@sn}S%y|zUna^#0jOWG| zn;`3Y=KJ@7cwqcEJTk9)Z^vtse;<#Hce_f~4b5?Fj_2k&JOcNP--K7@dUzX;%)0Yk zE$f!%_0NWQX!d6`?wjlUTD&m%X?SAxr_)4PH#T#wg9qk39@zHQ&ne9PVJ!KkS$8rX zn(Jy7?ipYB8kr|IpMQ(++RT3>UYh*P+GFOQfrn=QJFb;=ed8P9P1AEI9-4Ws!z1(f zs_^nX_j&MZe5&#JuakL#_uYK&wzuB@U(|g)uy)&9e-F;QuG_lpJ-p;W$@k~y+QV?) zd_O)C5AK!xIPQB#<5SJ+t25f(`kdQyGG|Hu#dz|9_`m#nYB@c5A^oH1zrXE0y-C+R zjmZB!MZRHPFTJ5X#%I&>l6hVF3tk>lwu={H&hFR$x6iGg*OS-R4=c63d+V>cxXRn?Px;vO zFY*4yyXA6SO)))d;d4xWcYKub<1}x2uEsme-!FR{A7^?#)Vy);2AOlL>0be#Wb#|$ zeT^TWdDC+iKGWoH!G{@tUh}5sGkmVecfFDMjjxE$H9Z6HQO5VfCzzg7@m|KS)x7C> z44-Q9Gx0&jf6=_@>3)+OS8U$b+7KUR@_XRD%=K^v-q-jo+GFl}FXFNB@9{y#yWjlZ zoUPA)n(r@GZhIHcH~IeLCz$;9$HwtX=#H=l1mn4ZF1pX2ae=6Qc2?i;_e?OnVnX3i(bdnP}P{3w(EnEYHb&yVCo zlkakyJRX}SzeL-+czsQNHS%*zeq-{rIWOCjuT6d*@>5Ly2=bN5pH9AE@|TjIWb(I> z4^93t@>5LyRn430yl#6Bujc1F{kflfPkw^w@0j%8eztxOiFyCI7v40!a@*(i#$F_^ zXQ=nqC-0k|6AdC?^M1&LKJtT>VQp{SKVNn44`c8-<~*K>d**nrXnX7Zhl9%YD0;j% zlAmjO9%y^(=TpDS84Kil4Vf1baWt?z%%f4f|_sX32J zw!QWDwax3{KIF%m{041ry-qfBZi_dJ@1c2f-p91PwXT`}6!MwLUqL>5T=uOmufuO3 zpPF?aYiUhd?H>MzZXx9KaV$!&%_JkU$?#W{hE3G-}#RJ_NTk|fcgGnk+!$~ z-m5v@e)u5c+vAb(gYo{x&uDw={$u96ocu78zoYG~_p8nG#S`?z=K6evp4y!EkJU~8 zKlFE){zdMT`(AAxcLCnte4n)zKF8z-w7sV{&OA#qH0FC$_!y{s!yHvx4VM!UH}J zrv5f%+uwb|MsW#ITLfd%e1}qdjrgUV0C<^xjr{_N{$X8(_%Cp5=(K0Qry-CmCe=JR_G;aM;FxkJM7zNUHO zv)kVK9HY5k{m}NF-ZEy+f9Ube`C7b?>un{IU#0D>&$XKTW^Hdh@0;hHn4S*PGlG0- zevjzk^iMVCaXdZc1!a2&dhr95tJ~f>UuK^tlh4iheUko}X8&j5fq7l}BR!evS@7Qf z_NTiy#ay3DwY~K^f%iZ4=SqFs-ufJx*|&|zH_iFl4xej$FM1-gKZoIoIj+;%-ralL zoR`b+AvoVYdN;Pc^}2eP>~qlGZO?m%{@T3%@CrWD_(ynU{3m>l@p+NTA|6ii* zUA#%=b7HIGXPU?3#`L^Gj~>@flmqal`P|E~>Lz~yUYpOuyoskK|0SM$E#L3x z_XSJdFZZj+e2!~-JmK%l==U{yx4rfK%R^7K&q%_7jUiu~pEu=gZ~dN3^St)J|Hr4& z6U}hHFI(gRnX|v~1Mxw|3w(n4`(=OOx$!L?l>XH8oR5z+J`L|M-uofxnPd8ozyp(i z2v3Z6epq^j8Q%eqjo*roGX5*xH1ljVMf%4YzZ9Qpd^TPgU+WR+sf}m2Z{~R!?`7P7 zRC+w)L-4t#{}z0v@$c|S#@ByL`WvSI6nvcVSMbvGEc3YZ^fmdj@zD5(cxrn3Ji$E1 z$KZwW2l34GdrwNw6q6r}k28J)o*DnL?TdN&De|};%lFrRx4ox#x4Dlk^pvdY&vYNB z%eB4r`Nrj>rx*9_)$!2yrg&<6P}_TWnfd(E5PZVb(y#C9j%a!J|9)xyLQ#9gnETSv zc-&1q=qv-Bf~Sj!XS|Rahc_1!FC^|w!1EsBF+NH2c!^KJi=L9N@TqvVxOfAfiTg{q z{w1EPb6kJo;gaNWzm$C_ml97r`LjG8EG_Qi>);_C;sf!-_%OVI2joZNg~^|S*LY0+ z5EWhJk^=+m;F4LoC? zm&g4;^6G18etGeb>n*~|6>(4g#CQ{r=syS#SC+i|ujd_ur+9;&vv9AEB-O9R8@SIr z1)lene9pQh9{o=|!9UXcYT~*-f8u^Wdgx#18QHgD4e`*EKg-}X9^-4^;hK`q7mzP( zj#nFsr}XcFN1KRi{|G$A<*TiI!wdBVrT=Waxefio-c@)q$o0GN3fK9c#e;1npV2c5 z&+!!h1^2g;e1La*R`xA4zA_%;HTlgnzkSpe^`W@GgSgIl1fJl2`@izM@py{Y-2ZRF z<5+qcSS?mKCk^}fAurP3-U+f**W5RJ&(id@!}~x*WmHR;vwhjF73HQJon_!lX!5c zcsRfKH0`+t7xrrH!R4!-Hy1DQgnaiGWj}*!B^l%W@YML$c!_Jz{@Qb$^yqm%1&?u` z{;TlB*sdy0$&&R?h*GnUt8h+ zL*i+>#q$Q^8J@82fq4C}Ry*|&uqsPT7`me_QC&YC>@76r7*KLWHPf5O{ zXF8sh;sO2zp5rC{8=gEJwI$-X=6gx@Eq_Mb_K9Ic6 zKAeh&ABq>`FT-m*=Dgpa`Hv+ZlD`vA@S4Zb(|Giy)3?Ar-=^|K@^dd|i3U&MX< zM!diS{0Z$b{tn(W{sZp+D*f8Cz^m+o@fGnH4_S8;JTtyKUf?zPgYd?0QCkxHB)o~I z_{DfKH)@Oet$2m!UFAQRf~S8=J`?t)YCm4%?`qFKQCnjCD?IpDJmGx(i)Y>z?PN~A z*K4wGK_~GBz8YQ_-v*C5OFrT{+yl?LihG@;=s5Lx!~^=T!*k;=;-xx0U*h$=^t0|? z>K)=S`2}C+dRRa_B_H7VLgIQK*aR=SiR`dlsd?lYHR_++R#wUoV}B zmp$G56?nLWxc1+Qd%eU%)-5%U7oFq_Z{hWllGpwJQhh1$lAbQpWPkFd#r3@R!oy|6 zb$|NdQE%~>o#Jnk!bJ>D7W ztBULO`J?u%CZ00?0+sB8*U$Ancxrr0yvB9^_rV)$NKZxok$AGEc#fZqd!f7TL_EcP zuG>5CY;DQw{yd3S#^1n$b=>@CcxwDlyfnV>8?rzCx^B;Mc!Eb9*IIav*Z7urwx0Cp z>!>}{HxLiVAF4gLp05*ezrWJChHxsYv_ugdRHWyELT=;mpmAIbA059>3p0)94pyUI5AfDhkJ{b45mb_kvBk&5> z{84zijpR#uPQ$}N?wk!g!_!XkA6$<&x0Ss1-;Fo66OZVB60eNEj{Dn7zU+|y;6u&t zCZ5pK#KYZLm)A>Orpx|ULs_?z{0BX8f4JMz2TyUmem20%JtQBp?hbep*L_Yjzo+C& z@<-v>Ug9}^HXiKFJe}kVmuh|=ab5RDyuf|(Q}A+M$p`dL#cMny{|@f&C;6ECH+X`l z_+NO1*Z87u$vzkROOHM-`rzRK?mX+^F&@#gHQq2j46ksV=WskaQ2Mp!Bs?=d9xshw zfqMr@Pot9zbSvH%DV}p5eiRQ65iiNVhBrrx>-94mj}8;hINrbT60dRpZQ0L!jO6va zuZ&m5H^RNcS(lz2@fc4!$rtv;i`1RxNIX13JRm<_dyW+M@vHFUC~-aBJGB33@rZez z#+$faZ`1JT7<$Opcmpqc$QORW<8vkNlV5m->|27@ct1Qk&z)y0Ji~RL_reRj!FfMi zdoGk7ef~OKy&;~m?gZ_@b^q_f{YxaT`}{f{UMgO&?q_&?IsN!wcsxP8WZgyIk$v#5 z64&Ee36F3+uJ!P0qU3%02jca$;sHJ!_j2)qbq~i2T=(HLJh(yfG5IU-6wf-z7bfA& z8zt{^KYtYWZWT}QN_%d{>Hi$B@eKb9PbN!Vz57hrx7v7LJh?;iUMDFUpnj*g?(@EQ z1Fu>4cs#vJ@;N=1;{HA2dS33r^LxchdY;0Q`&@q$5AGMQ$bXJE@uZV{VJ;p&D0w}u zZtu!I#1Dz<<9Y==e^|Vxe;quVBA#}VFKmG~AHm7*iYJeXNBDl)kNfyBc!4MU9Aq5s zKkfEhjmLOG&pq0MYyb0jiD%?L#G_}Vzv?7k_#XG46A$?Q{a-wsDxT2ezbE_Iz#I6A zc<_?sb>G(0{LA7o`K|F94?D>h_Q3sDC9nNs@EmW_bE@{gMn660Yya!wCHd>MXPS6G z{$9MS#6$AW;Y~ckXW-!*l27n&@dmEP`ww2@y8k`jm;EfJvo80gK6w4Mc)|UlKi+tk zbvwzz+v3gl#2fhDcs5HsrT-|+e<OYC=zWs>%KfB&BOZF$l^|+SCyn`$v>}P`Obspdiyh(m7JnJew`g7aO@a6*I1^M0ad_i~qQMk8|n?D6F@PwXAaKD@6 zbNnIA<39T~9WNJ_d`BwfjUKGa zJg4JLyuv5qWlwjW2ef~2@j|Z?JnrS@Kf}W%#dUxF#-pXg6V~nik?cc`>pUyt>C%$V zI?I2s5#H=A?(uxFqx$mVHT?(S)e7P||H*i^lAE81Co7BV{y(hwKCXX&=c|Z^on_%p zwH#Nqs<>XCi{sh<#Pxiwil?i&`OWa4pPSzW_g5EBINn3G2iN^P3y;>2d`cSNvG^Ay`K|X5Ibp6xaQ^Mf2-QJ|q7Hp5r;*-y2WYch}tlFY%h=-4oCIOWx}&3mm1sk$BCz=i}MN;<^tv;f+ni^|+qGqfK3Z z7jNQvz5R^)n@hfA-EN<9UEvA7Djr6X*Ymz5?rq_&I}9)ICOxC^e1MzJ@OVpc&0mT~ zTe>{qOAI`(0-NkF>yaNvgi^up&c#7-%-)eq{({KJ;n9$crPCBC7v_S8+a2>nCE-V@8iz1*c>@7Z(s3>{Caqm zi0eGN;KhF8I?rgl++RHAb@iFJe~`GozdaF8N4xzGv-c>df4aB@c0Drh<*D@^CyZY^e_IE>`&A9>Uew-d3pxm#mV9xK1BUgxBp<=&)l9< z@$@wDoO!O&{ORH`eh;4D5y$&7o}VT8g8UbFe71PaoSnXw;|xx5Q(7Gdy`)JjZv&y?4a*y4oKPXNv3mV>SP-c*Hyx;PrdrP5N`Z znk8P6e;7|b71#6iiuTMF*L7#(&9B9E-QV%>8}Xd}#lDmMslRi3`ryU);wAab@bqW# zg82vI!LQ;e`B8WS5Aaj9ACK?}c+=$X!~Nf+KPUf+_86aoM}JB_V9vksN~~#6vt{|M$bwg(P3G?$LPEO+4hhjMw}k;t4(xuNHNC?!@!%;yLSvi zYY(pTkJX+PrKcu;vF7oV`ESOvl_j5%e-sZ^!O2g>^S3HzAoOx zwSNmdZ!k|6`44u+{maBF_U9nHzFfRP|FL*_g}9HOfoHhRa~WRX5&2v2CLZ7q;r^A< zpWrX!DPD4&zmJDkOFrO!`yC!%FJ98~kM`%{Iqv@=`(NM{zAB#GAo&>I5U-4Hg9kUd z`Qdo;R`Di1N8``&u=UX+8*ZjQoVZ8CQ-=wN|1`J%bM41N*8LOD@Eo7-H`(W) zlAZ>>BwpY;|JrzoH#y#|HUFmc=$wPKf4b`j;0@zP;oe)4&zR>7Ji~R)OL6~gcmA93 z-1q}{IK$09kC(=0;PE?>&za{7ylMP*yfM?wFF05BIegdk-gsp^#MAfO{Fb=?zUxEq z!uTP0Jj>0Wf;Wv{f;T>J^S9#Rhps<{SH>$m{m9LKhWoYaf8vGlMSquli$8YrtKd!J zo8gU5Bp-6Vw!=%~!?Xw2>wGlseJVZbr{g}Z{TJa89|1Vp3A`}A3SQzm&qjES7aZ44c;gE>t_V-? z%J`AEKS%P~pWz{{Js0CCUekXQ9)IcfJg9lx=RW^Do_*!!-^O#}U*IL4v+mz`^0oBn z<7ocBWS<+juDcYTea&cl=6#kKz$Ji~RK8}Nqld-2@#Jc*Yk|0-UY{CjxQ_!qeUhs+sqyuacxuJd>O zTh2>rd~v*CyboUB3H@v0{-3gLibr^c>-8{1dvKj+G+vpWlkn&->DPU}5RdVQbtmEt zT-Tk9m$DPHy!~a%@WlA_cxwE4JTv|#-Y`BJ&yD|#7sk7KUE06*sWjdbuZ;J>Yvb$V zP2;=Zp0`!|k)_w+LAY=HBs?&F2_7214UddJhsVZiJTX2OPmOnUlKshyFNHUZ_rr7J zo8g7=UGdWRfp}&7c)T_~4sRO23imp>`+q0y8-ETDj8DTuu!aoJ;e3>q9J&&gm^@Lr1mc3J6SR&@O}&EpCAS$K`>{(Osxt|2b`c(I;Q9nS z+)%viA`9PvH#ZS)FwbLnwyAiIzpDM4i3iN{0Ukwe{(HQ}GkX5TlPy@6p84mI^U~Z> zTpy=B@p3D1?FsN`ptxQStKq>m;yL%9b+l&(@q~Fc)%=d)dfo@(F`lw-!?h=td`iz~ zJlsXR(({OWyNmne&&GW`CVv&443T_5{ti4d{xqKB+W#hA;Cfu2hY4fc6I?cY=8$=QdK@CpxkJYJ4_drQ71KMAk#3V#GI z_K|#wzlaC>itBOB#ACc9{~hipk}vQs^U1!I#+Sj<{Uo204{?8g@fsh5H}R6=-3KoY zkbHn2i&qDVM_gCuYyT*5o%05~#G9=9fc78k_P?V2hln>=x5kr0#kI%lkbQ^`6W8Nf z9uLR3`2l!vxOlBV5 z{C=}f@OYef$y|!DIX?yf*oVaPKDR_sLJkeO%}H2`@Fz{x7+e0=1}`U* z=epe+kM0tWIbSK>xKCW?JPXh9gmow4-u?9B_u?7ez+c4u2P9wcd!pXM%g4lX=4|50 zlj0#g9Sh1nH1G^x0{5Sie1L~|h^JlU3!CHlvyxBQ=iRmEd2zk|55^lWxcQTCZ>o6B zy5sR0*ZsU1Z{m7fPvgN$ZqF?3e_336IxQso;NvChE{|7uj&F*muh7Hs?ulowihKAm z>aV%$UWGUCl>RBW_qyZ@d^%p>`ux(w>uHj&$S>GUj;pBLbwj)~9^;kqL-E@9xp)%~ zS@(84c*C9l1?@NfDW1J4`I4SL@MyZYUO&q$EXP&8C9eBCQ2lLjpZy<=S2M&b?vv-> zdF}S!ga@C9*Ua+*?tLoW#6QQIc+9$g;?ZZU%l&hSMY!I+6xYYg>Uj2*ctFn}JpWoe z!VkdfZ`}M@xc8mwx8lL~;;pwe+JBx?|504$nT0og5)WDT54`+YJXu(Jy8CimL6?DT zi0NM*Pv;fao~`hFKJg~^t5JAk0dd`ji}7MX*B`~Jg~S`oIUP?H7SHe>@Olx~{Y7Q| zWKnV5hjsC)yW2ll^F7?26Y;vI>o;nC3Ag`s?e8TX&LjKz8SX7B9t(TF;4xmaZ}W7Q z`NQQUUvs=YaeqbeYGo-}8LtP4>priCd)v7_5D&H&FX$(r({t!3+y!H|x^dY{|?PmK@7bK@uA6&}%lCGPL%_CJY7cusx>UgO&H4Ib?8 z&c8qpIWBL6>wWMVFX-P4ZyX?by-yCsvjfFF&SR>6khu1Y$HS4XUx(MY_TP(Fqa

        E{2&Gvli)F8fg872hvxjW>>`NAKr& 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 z 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
      1. diQtkd_~gCbuiB;-C~nVzadoj4eal0;wWT3Sy}gdzak*Gw z{IKNwd7E*LSZ_pC)5iI@hWMe(`Q^{2VZl+((3M-=#rfTZnck!gtH}5bDAs7$Jq1f8RpXp z=FECr^*L zL)>0{<|`J_3LbN3rE!A#ZK3Fh&-^Z0i*o8>Pz#}s$5Ged>_~I!l9(1WS|B`IBAtoi ziYe*T^>e-5#qLFHT=dU`aw2igfM(7>-8Rc*!&6s>k>u0`2`697OyHR?+>}(Ot|zta z<4ovANpkA?(6j%iE(Y%}J9Rmtxs5X-%BhR7+H0trErw^K(imw@T`# zm@MbPWGN3OwLF+q^I&rPbLaNd3zv>Mcz!}-TXyrvP97G!oQK6Os~{wLC1gmWRdG@~~Lk{&eydu$G6# z*7C5}S{@c#%fn);d01>U4~wnlVX=5j^W=6?&BJ1=d01>U4~wnlVX@UbEVi15#a8mL z*h(H2Tgk&>D|uLKB@c_OcpbI#=N4VX*isxZXOov=3%jJ9v187 zVXm( zmh!OJQXUpt%EMwyd01>I4~s43;bTklSu8zBNLvP@eTQbNUaP)?`|gXS1GPI>-8o{m zEGKsA((`1C&34BZo-K>;4iXxvm(3zlp6n)VzZE8=* zlZrtPjM?`v#OblunC@uX9gX_xmwKZSht_uJ2K%BrDbNuDBTc5ck_z;*%B9k>lq_yp z_d2`5aD?|s1>RvWJ?tnMV|}69jz>3?hIYsmAI0p(>^59lbi9Cxl@J zctxj(w?Y>C^hDiw+-@w=uVR8)-A0eAGLtwz6njuDtt|HU+IW#K{#xIzH{4BP;R}9! zznctWet1+jD+IYg(6Lsn)G>-q(9#>2k2`2mv8~FsjMvTQOJ8`KVurQZbo$5Lx34%v zwla_K-j3f{dATHOa<$ui|-^U0iVZig~wLy$3-zLGr^jQQd9@ z{k;}^&*ELL+j*1g@8cO{=}=SnX4JyF-u;sOMWi+t)6>a@_^tb`-JmfXs?>@o-%jir z7CTThLYrWSmp(iGb)Oz4RS!;G4LXhZJcmv04eRap40Jv{bw#Y!+pXPEHa{i&Wv{-A zyKT}pvfC-|+{Ifgc!4ze_Rq9fw8uXcDe`7^5|+=wt(|t2YtZ{CgGK&>vR)kHwbY^g z7_?K0d8wIV#7^>L#Sn`yi+I?6r>|<)EYk0^d*0yg4P3%$d8jPTxbC>!^*ThYZlkP} zmYa45!Jv4z#cIk8TDI=FLzj*2(_I|#eIbi|Z!q+WPoCezYw%AM(M$(800WzeQCW9O zI=B+YW?%>5Fkw~@P8nqdB_y&K3Wwk5C5Y^PPBM2EFI=FIAplOfW`y7_#EcL$O0g^Y zV|1+3%*d6@kZj#fP;I(%hn}E1B52t{?4#)L_=*tY_xK@`Wd3#6o{o)Xga`%AafEW# zA-JVWW+s%Gjv*A84iHLA2UN4t5DG)b5XwRaWamARM�*s*@C;hu7E=^d0imaaEwZ znuJ zjwJoFn>Vg!#lT3elZrrH;UtsDJ;&9yGj4ZA?cOk<&6kJQh8unOQjANItX>{o!llT= z4!ZEESkK_*$C!n_JiMNS@XlSDD7bUG*G|C~`$1YVI_{OA+#Pj0siX-^Ck{~HO0*Zd zeSxiz8ZO+%+yQ!SXc6!*c`p$Q!8e0Rp|Qx+Yf3QSGPyeL)%EBMcT5-KY8~wBliz6D z6ORmXM)9srpJ*xSeBtEyary8#5hl&hsq3pbl8MYO)0)N3}}{Xa`d=x zQQL^i(vvMJ>dtybNA#WkAV_z3=(PlWF9iLK{ZMDowDI1~9eTn5Zzu6ypvS+_jC+&r_~S5=!ZWR4tNipPfCdH8DniwO@yd8IP3|oHlIUNH^Lgr0)`foah(UlSj6+9VdqCrl21r&_U z%PZnvQIrWaLpDE@v|5NsimktkX(-E3_M|?=V+t|I_Vkhf>8KKZWK|VRU5s3zvxH%t zfxG?)(_Cs0c$s?R@pnTERpi$UQs3uJ(IvG8)C?Jh0qb}vW(dD!#Za`mFBK0^v{C?d zL_2C!VX;xY!8ij2QNK@s(Zh?QL?Y&W>k?9!3+x{2jK!3`Pk)$-=g&33q(lHdtzhVrCrJ{)~oe)Fk z1HZ!$h##etj-lv;axihyG03UvA43!WE5)Ep#Hs9W2|H5@;g;PwX^v2&;MOCa=@=|B zH6*I@OB#ZWfRT2yb)DhJ0foCOhHR2sD?YTj58wgQM>D-GrDSB?v&(Gttl?o*7hs#n%D_| z0fUVU?+(MSJ9Q7&8WIQXjMRoO>uUwR+WJacUaYUQdByrl+fb~pv}rH;sx~uOUuj#C z^_4alSzl?ZkoA=|{a9b)QmKtNR%l!*=eWid@;B$#4y@W%S{lLoJtrG@Gy3( zg$+pR?n;$u62^qov3`e5Na-jbqVCxiWb0*S!d2?Ca~rRPz4k#^4To4SP1i$AL`Nh< z8?QrlJx+((l~`sE3f$h)E4G88o}h@cw;3q*q#xw?X0S1?@7};G19%`~I708%A2dCB zY{mB4ws2wc#6f#qwS}F&c6i?v&E#VTjM6n`!O#Wlpo2<_;ZGGCff~Z(D+tbu{G*UG+BWBb^%=ukTQnM0~U!$j>dM6m-{VA-cLwAZp z)TFwVs&07O{ry@%GHVKat?*Yn6%Xub(oa=%@TTvIBbRC$vr8R3H`>5F73*!>?_;8V zNG&U-iFEQ2rkmYi1Ym*QHUg`ih}i)0s4Q+1s}sE*22AQ**CM4~JWrWkqZRI?CZc>h z%S&Y?OC4)J!^=0k;a>FhQvB=1@GEJaHlNW$v5K64aSu-k*J;yF!(f$I@hEw$jF5Vg zxx5LHNo*BHAD~b!(y)5afJvpm%C7H*K?Y7nQ5!h20u@d>cl1b%Ql+hwy4=*KHSAPX zR7Urk!L>DGL+o%i160&B2FKHfmcWxuE+R)zYv6UofD{NH!q{kV_sY0`xfA#YzV@h3 zl4h@7c}iEg+dX*NJthu=sM5(H*j|CLX_6k(tIDvr5wI!`DE`buvelJbnx z@8hW-awI-VupQ<<1mZ=HZp@8g>sjth;oF89$fk&}h&!a°*akUfj+@)p!=Ug%lH z>DJeE1_oQ*y;RC6YEGK6{N#Ds$NZFbG0;k^?q0dMfy&uz^QJ^-E6~mY>vxSScpMiE zfF@vlk{7;?Fbyh^_AA$V&)3#aQ0)T+)SFt_QB^Kg@a_`{6N3^%0N5xw3Zp&x92eF! zWyA=Y%O*fuM=b?!NDKW9GP`PxFJg)SZ?hj*31Gg&C7`z2gv7~6re0tyG9K$%l&`eR zcCOQ*&l0?NNDNu%+dN8FlPFug9MeDTTW2WElU+mzm>9}~e`V&(i5mX9b z?vY#ML~gW)RIMnO8WN*T3ccOi>jiguH~rC_V6Z1~ZwHHQ4B&9Dc*Ebni8rUMb~p;t zy$ChZiNI*Q6JfLmu@L{-9b3Ro2Y&9^pyRIvK_?V7im-E6+z^LWF51m#_6rxK;dpX5 z9UqWSob;wiH|%3H>=$3g5Ry5f&3DBmkk>H2qD^p#UL239Ovd(#;S4k>KGDA1x`x@dY zZ`{R$We0Yn5D(AVdmX1rZMlvIr*>M$gM|&&ae^uPs*}W0>k+4kIzCQm#Z453BK2vp zZ3FL7QrFeArsqR0JD7RFT|k<25H^>puWJoeLVDGVXlmtC!x#~9oOY-xrz+Ug{;IS% ziv8^#j|%+;HAi-tPLH8dnjy*!j1qS}938T0CDB)V)PSTtA6A(3+(i~alQyf>Djb|B z8x>e~ll)4X4hmu6A5Jo&~twV{X};RM#YO|KuE^gBmj)+*+i=llDr% zoE#wK3*cnN7pa~n_0I64I%(Wh<1gGR#OPpgJV0+BqwYq4t=6HZGa-8Gv8@gv6}2vi zbnF$!NxfC-m`bZ&CQiD;sWZY|TV0Su+NNwq`ptpL^#(oAI&$^EJuTZfx0h36l>m6K2f45h^tEYsmwjoXY zg(AXJ!_W?qaN3#ppiIKtcn8hZUz}) zIJ%~Cy?RjZj2pgA{K^=+v8m09#(SZts{No7vk8JOM%jy9njy!=>`^i_tnS=!CnDFe zPlm?Li>-II`^mVJH2G~c$D9m|7^{Oy!f-UI9rhZr`3&0~!FB1ah2^D}Og@W4JU!aP zKp^paEYvPXx

        BKa9m| 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�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 z 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�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

        M>`&6q^qbNLMZK^b*O7q%(b)TAjm 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 z zUDjVrveLj;hO6zmPS3-w?fdOr)BZI;ILWEbeXXvgz?$nfMnS(`ss&)RjTboSw`e{A|5` zUXgd@3n_yc7s}3@n|lCc(5WRFV8+$RURtgrHME_a?;vNf+Mr8zdo*d6{3h*k)~

        T+B0Fx$Z!)gBV*7p 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 z zv?K1?v3u;j%rsHm8P#n4oRz{6yS0G4R_`az@I(uRkGEd#P7gNPmY`kKVw+g(;a>Sq%`Ud49X>M_g&wWGdVUMEaa?GXOVQ5 zI;a}=F5|WXS!VNcb23XJJ=J)Getf=Z7i9Ug&G+JyRG}D@{J&^Fbb^AVCz5m*q zY!~>N_GZ##Lc;C{zmqiK?^@D9Z+A!eHyBsMIV}Dg1EY6;z7c3H$a(Dzv1M zG(7GaT8-)i-kV!QfqPCbFWW*dqPMYBZ?No02kN{xZN6;vrD6{457qcH^HcR$moF9B z6n2zCmlvV6&EK@a*l{p>a%0t23r|W-CM2`eBRSe{`e1J{-eWO4N3tuAvWsLYN$-d3 z89nZs)W-%%Yw16erjGi1)3A*EKkW4J%ttVkYcLK#;7g~la#zf2Yq2&f^NmVTsVF{V7{}44H zS8Au)EloA6Cj$+4{bsuof==+8fr{PMA7W#)IQe*8*Xixr&qI&3)S$-bvOVS@OJvbKWk9MgNV3-dO=DIr;SCqy&q1` zRJG?~f1B;81?*|FfTBrBIw+LyMyBkc)fM)XRf>l0a(eLXUKhUIt0J@q@7JaYIxo=o zity#Q=@=-d`f;;MpdFQ9u2UYL602t~aoFceuERKhH$8gTN;4?@+H0wVz2ULx*oB|| zsJ?NcCXDHs9I#FWNB59taOO4))vxWgpQjE$Dl%L0&?tGXzK$dCG>E+6eL5rbT$353 zQnDxwPDrlt`X0%imLk!N0^9K7piV-90~h;9I9vuyf{h*tr|86~NoF!x0JCG36tRRo0V`WDhxK_6APic(6r&k4d`DJ+BQ?CCd)zt5D`N2 zsin|#i(I&N^1=Cu5atrk>Msx%P4}sDmAvWVF)1_M_%^s}h(1k_x>m_GEje+dVc9jD zmMC^LO+JNZJ*5pE*b-71qwX>?;BD)(r)y(j5~oZ{zeL$)tI-#GKR&fMD{nJ;KaM9q zGKMoI(IZVoZIqkKo+qx{>FJHc}wltMoKX5dNvt=tW3Oa05u2OS?KeSu#9UM^HdcqaRd>%Gg!J-DP;odDmlnwz(W0UI~vrN&sf9C{LZlv+i|$ z2mIo5Ek!Bod>@!yD#m-_+o1{Jjr<-JUk`5x0MAS95MoI-ipDF~{eQYq)E)!`xgpnI zapdR$e1}}-e19zbQjs^HT`a%|c<}cLe6LgHw0rHz^bVmK){Yd3LL%tos!N5$2h6TX zh-U2%h-v{ZN`^Sk?eUbVQ?P{4xPCr;WYXZH9U-QBtxEPE5!LhI^2-N$Z9;$pPZOx| zhnmJ6d#^sP)(KgEHVhRMIsy}*kz6`RiClp(wRjfe`c+8^M66@kz_F9^-8opUq!}1Q*9(#U^2IN=x zS%`>c3Gz6eB#|(SQ3=70{E>n#hsgiP6E@P@LXte~+ved*W+shAmb{YP{9{l4Z?-{x zvKE$j`c%Opkku|X%HWP$WYKTK&de6%Nb z+o0NlXsdcUj){Z>SNlVF9!0SUX>ERlhAJy?JpXDtJOMDAt$%Eh`BsEv9QP$$kSl4M zL)KKz$Ze4Wzt~D{yhU`+^vo>w`xM*8Ulb}7oB9$LaQ_V+M~pAMw`mJbF#sd=55o#c2mu`{f!z&;5-ryU;7=vSZVMGuo6YLkgmQ1}`i}T4P-(t)27Aka))VK_ zt;U(qu;v=%kxZoM=nzWM@U&|{l!|ZgaC=sh*i@kyEP{G8O*XRWLVMFi*Yu!}K5w#? z8nRmQJpwtT&Gksv4%k9n^%E}(_Ch_4eKqwpi5(X?9ROk9@L(DPw-)rd){76OYQzY| z&sJTFDE0~0FeRz{^#?1jq`gVQ)2=~Oz42g9_s`@THuDY7x`x<0%MayxXXT-^cVfEn zp~~xy#ks6>zbJI=AzRaF%lbn$J!{K`Yf2fJRu^$vN+((uID3S+d`uy(fc!7(*-8DLMH%?+^ie8bcEhK+o~Gx>(ie8aQ(h9x&h z1;?ZLhUI+2g?z(Gz5zZc>!{&^tRcFBwFh&q04~TJwOB7a4!bg{3=W1pNx!|+KFZ-^ z^5Yj?Cf~H$-ULUJ{}ntuQGQv6AFd^6B>3k8Yr28}>@s#%}Y z5Dt#w1{;-IcsLozSQ6EmQ>dXzIKnr^bfjl-Y&ZIo&?lu%s-wruk3_G=y5SDo_~$KT ziIGFfj%)_*COZoi5UVhDFU3#+YYl6WO+qAue|0F9{xZpm5YxsbyTqp@{AxN?l@i$k zygJ+zJyEZIM;m%94-Bi=*0KX8P8ZVT9R|Rgh3a%Nnzr;V&Rlfed2vw6wRn9(uw@Hz0b>tg&k42IE0~PHb}9U{X-$!zvHcT{yw=Zni;yJw?5-xe`FhUr8}5rV@8wY z)?enyx~_ol-A)P(FC0q2hGz3HE|JY4@xfDtOmy&e&gRUt4$d_e&Wf@V5*eQ(v0yKp zcW5uZ@-u6PIfU4~pT+Vl(k9IfqaAD`uMP6bcb!Z<2Sxm5LK4gK3NtSBq0aGijw?p~ z!Cx)*C1F36Bwd#CYR$#qVkl-$Z7KG)(>TIv66UCQy=-x zQG>^*QXZr|ewG@PSrRkPE8eB~n_!r5o0xm(YTy&42hAB>Hm)jEmX3JEMoh~OXRyIt z=dooHYt1fc$ltuuiacI~kGNJ}p1}uY=J8!wWroB3G)7`u z`)&zbtK&AH`)6(Gk_!D;3@4o84kA^iq#T4jVt%H%@#lSB2R}J0OdJ zAEC;pW}2}A@(u3vuB1;dy1X>gekdq44>~28yA9tGdJYNY-HcYHj`9nBS*O^3SP&*& zSO~7hU^h{cu~$(d0e``P2MXZA(w<04Y3>m4nL8}SYHtTWGl|=-Pp6n*Xn#m?#y&NL z6V|}139l6so{v;svZhn16ejqD`dn~1uY7lJYRgaN(9j)*BO%}M*N{JmV;~=@82#-@ zSrY-n;_BG!43Y>Wy!KOMfM4h?7IGdxa5lzkJn4a%<&{66a-Y#N5|~7bA3@t1ynnjB`RxgRg57%(!k>uuxwXRt5P!B#(9D zCGJ;jp5C{Np||U?uld#f3XF?qJfegM)?c5Kdc0z+v5l@m01$m+xi;GhV=TrD)@sFG zY{`$#nHJVMGn2=0=8Zhp-$33%?YQM_vgh;6J*TzwFg;hPBtHMfv$xGp)^MO%iLU(| ziRTX0qCmzioUyTukI(^oDqlRInHZI2#3sbNEMZAXe&jR$#*`o2+|y}}shqJMV>r;p zaL6{}@(g2iC5y$@@L`k>l3RmZ%b0w2J;sTL`JD8zsjd`{oxuh+NiDxg1<8>VHKqj1 zawd1sGHG2I9Imxm2?;med`S$rrtUnhGg?9-Ga;wV9yzL|rDsd?Lglh3kzqpeqyL>I zATjJsX(5c*_swSCCEIp%XS-W756b-Q9Qtf+Uea=@PcKO?jGNZ8k!#2OL#8{aLw|HI zJC+J1j0snYH}niI;iNx8~X;AN3+pbasfNi6uyTg8d9N2+r*8JDDy{4#C)0nmEw zuc%D74 z{Q9t{ghbY!^uUeSwp9{Ii+3W)(ODt%NK#o>o?+h3d(ZHQBs=tZ7Na z6808gct7b{WC66&wBZkTfL~m64b{oh)o`E-&FilD^h^s|L&D+dW@S>fkJ_aN7VN@> zjb`O}{KEuqVR*(h0%f54Y%^WJ*BeMBpzYCC<;VD~T!nzP3$65bY`f^%rlelxiI&ZJ zrBJ9J7_`!ro0J-&ZFwPWi&H2XFD}>|>K1-$?xz!r&1QHo5kG#~HMe4pkp(qnXKbkM?CZp+EE{2E+aGHTlm7&XnxF-O7uoFiuFIF zaR^rIRU3JUcR~h-6k&Z@G;6;JF$_>G?J{%9vz@3;OvjBPHA`|F{gafl#P`N#dvZj?>NkZ^WO&A@;5t;IV4xX_?Fdkd%?ojEy;k}@STvO%0NXLPI0w^{o6EjtVE zI>nRK*2K)rK{8FqXM_AMlYDDtt}$CXTw6d|D&<1zjXzhZE|Uum)!;f6#6U_fd4}4O zN&0Wko3?b4hPC*eQd}T#GDMna#>$@aYIHa#8?*)){#evob^2bM5R}g@rj6xEWTJLG z#uLkByRpt@aJ@DL_LgpDz^tzep?T*?94k3_wwl7Nn2<6RGz?}QfF6ei@pMlT=Z7YP zuRx>Qlb)1 zPRW8Vp*l7`MzsjsCsMfO{6P@0An68L73bH^foqs3WPy~B(b~t!Fix9!g>4hTX9-?T+JtE-DPh)A;sh$3MuCb z^1IQkHyl}#TQ4M=CxhkJLhZ)d$(ebvm^+)Y(Vp<*#-|FgY085#(Fml zDE*RDH^WboW^BMnwubyzDaq2u4eJmGuvg2M0TH=(Z01lEgt+=o{Z>WflaTQ8XZy(D z;QVBC0i-%`)r(`5e#ZDOQB9zJ97SfNxztbEx6P|wNOk=4`iPv=ak*PU!YienVQ^PM z%46jn;&4qu(#hxV6pL#U(q7#;9@ix#KK`%zD9Di-o?cLbBfI-Z_?m>|R{KeIBq6!R z7xWSB&2>b-N^sy`_m}WULW=ACqEb}X5*+)oJ_45INJ5h1eIo7FC0H4uDwc#tzq}{x*hvlL zcVSVUo;hde-Ff#(N|x}bAcnj0X?%t9ixITDlqOtw%y=7=C6m_ELThn;vYwFc_*WLn z6INw6*^R|yQ@Bz%S_3(fSt};D?EqgcxeJ@FB)Ilf#2M1L?k+UTQ?fcM)iP7NdDx(E zXCqvr(i+D8@R(I$pcyEY+})vw7@8%?Rnk}y?fNvPkuC3QrfN_FJl z8g(h2ZluN2nQgb+adcN~(OEP5u}PX1bq#mx6h*O2G?&{cu4=0rU-H}R8(&|C)QvMa zj{Q5;|7A<;D~GyqCdbvjaZYP_y748yfv@eC#JN(NZp_KF(J$t5IS8q(eVvMwxdJfj zgX}IDIbtC5AwL_hP$La^BD<$Xce>P^-`_;7y*(|Gtp- z{lRPPu4J(k@$R&dGPFOQgtn`A$!PTJ$xts}JNO&DCpt-!SIm&u$Tw_BlqJ!e=KXb9 z*`7+F<0v04nj!Ily<0Njx#?b*#7Rky4aG7Gau~~Vvf0UE6z-nn=Z{VcH}r&o1K|6$&G8+Zc{9&o*kBL34aR?J12y&*%1m9s~xa$kGes2 zz#hA$z+vdTNmS4QM;GUDPmuB+9qMERz@Qz#+NN>~1zXzX=^j9YA(q+gj;Xe8(ey6? zEO!LbOTRGEzBHYL-6Qf}?Sx~Cp~Wn}e!kg>41Hv`^;Sk#$D4?av3rw{Km#yYY~y@!oldXN0DmFchNVJjfi(8+$eBMjV2txn8FCt;-JfR{30 z1;+7uLe}dYA>dSoLg1kco5(KDkDkCJ)*3z;!VGdxp4+MWA$7-zo3rT_V=3|rgEgL1 zA+xcLOndQ~HoF&3<)MIYco@~E{!s#B`ca%Rp8Y_a6W8<4VXFIarKf!Z+$!}%2kgrOd#nD}2nRsmd zG_>Dmm+Zg_*)^^vTV2xBxTKLR)^2~%1A^>r9fJ$+?$0 z4cYc5St+t5z4dF9F5W2vVqd{6iJ(Jv&W(3H8)K=ya*??ZNWE?Q@J5m-BOQvA$$sV9 zPU3CBh3kQCmm*~OhBE_Xw{%^vY}*p2?c&Aa>)351JaT=G!CSY{Z6qiiMoR0?OFIlH zS6|KdfY$L@CAu1^@!Ud}-9!p~rJPru-$|w|==aiBT2&skNKRuf$Z`C@wzL?k^BzEY zA{>Arsm&X z0m%VeMoQX^Z=oUSds8UnWC<)!&7#(eaYqTi()DC|Cbry!PHfqWi$<#x`kL54y7ZOf zMth79&zQFDaw!p2q=ke;9IHw3@h_$gh$izEBq|gTf&vQB)4>c!n1~$d9ipJ z8#Tm_JgQf=#8P``XI*cB=Iwa?4w4`gyc!h7MM4>8cxrO8plBPbH{23E3vdEnzmdT8 zA{m3JYMt&5fVV-r^hl%DlnaiBDlhuWC^D2OL2z*w*;$?WglIO1N)9L0elwdcO;-@f zRcW6X8F*-Zzj+gTI~;N{I^tGRD*3~GY2T-*-ZnnsL`i?+=1bw@(FZ%dc?MSsDW!p1 z(|(C|km;DX$4JvC&Ca0W9An^6W%Dmo<+#DPqp{eJbR}ABl=vC;VXDJ}e%4BfrKI5h<0)+UaoR@vvBKLJFHkNlR#*`Agy|-78N! zliKoX&yd&EEr|~tVyCKewxz6k3ui&9NS}*qmm&1ABmqfz%VRS;3Q9&%o+|-2Rys`MYuoadd;`k2!x74}yR+j7tJszjOOQ7w~8w2JCimihR<; zCQsL?E`2tHAeYAocCSpD_omhryO=ld`Mx2UYZHFH^6f@O0gR>F@r~;I%*4Ss1>b9P zMM;){e$PK04ziC(n#)I(wudmZpAmo9bm31%kLgdj0DDz#UPzZgT2jBT=QfhH@dx$J$z!Pz8aJAQXg*tb%3 zdH*S1#(7We@Z!NSwBIp|lLR>p+|!ApdZ68AD_#Vn7x9zITAtdA7BnOf{4V$q{6nT* z4({T}BRoqX)5|`cU&v?a-W>Y%PWsZRz-g@OoSNsTQx5r!en%(1mpKJFzBUVy+2D&i zF};K-2oG4{LE4*Vs(4gs-|!@iP>!sT$I^Y|72dpf#~ZVO-ENzLb2wK{(8; z;W5c@RY*c88&iZ7hD$CsGk(+QG=+l|ZkB4tQ`I{b-O)5tC6JGpo-oJC;WRw#F#0}I z=JNuEr~R3%fIM_cLZ~Yz*%A1Y=+^-X?86-vStVJFQyPoMh{3!qtPhOR{uh>HwKPX9 z;l*(PTsdF){O^yLOOs+Sp%vF|eNrVUHLIe`^ClZtN>91R9)uPyAR#JzCC7+xj`P%S zsY)`&Mu8!nTh}|8-FZkG%%o14Z*cA_$Q%T?1J7>GBouSJMRDhwxTU%&pqAX>(!H%2 zIbjZopL4zHVJ~O}nQ;;K`!)P3?VYR6 z{g(aCOb35hKVP}{;uz+Y_KKOI5!y3uQRleviuP0r57mYV9zR5qjZrkz4530JiXGps zyztVuSj|YP`t!}_hacfW38%srgr;Zn1{!pD42e;!tEs%vB`PuEdh~qdxgStbW6SdS z%7tvph4YoWvK9nO`*QwfR%{A7&$U3~MmhfG2}dWkK+(o4Ok+VVr;$*)8-nQ|n|tg~ zkv~$o`g}xQ4xOAEZn?1relX9$^b-(~fp0W?r{ZX;#qQ2n-~ql~?E;6ufNH~af_kdW zd?y^nQW8NI6~FNcc0g1C3?rvFXu#ARe}f>MFkw7_@r6g6IfVwC0(}1MdKp2x&&(@m zmj2MWZ1YB>!;$Hy`YO9%MA^h>U6FLC13mt`+FKT|a7Kxflc#%J z-(4id1}V$A)^60_)&^D5tb9P^>}YQ`i%1& z-hD@ZV4?N*zsGSUqZ(cIW53M$lTe)O3>G;7Jp7R}*-4Z`i_QKC6?cC~jE1(M%CS3@ zl)#9lOm&t+?}~SX9sj(dkm(n|+Geqt*3I=f)LtJ6m?&Q3$5c!?`DlbKtC!dJT{n-R zgnK@m9!A>b$g!ifRs(h2AgF`}e}a0Ge4by2&b7pA!^kNpvzt(vc}M39VCzK0`3o-7 zekm(6mjVq1`mg!@yzP+}tXvWtKIal`$YeUx#N{UtD!xBWNj5G}BDLqy6avAbtHx5S z0?fS>kO3C7fS>O+C3FUM{H6}dCZzSBBs5VrrYJK`c?})YlQpRJ;fAOYY9B7wbV`9> zK8{Wx zhHV>t5&|;`(D8qmN4T-q$bz4@ZLebl|J;&glA;Z(P-`J!va;F9ndru2ksR`opP=xWo` zu1PfZ%)=GR8Ix@wg=<|oW5=h_5PrP$O{xslnRB>I1-bdpoaGFt~AaX5Mw-@G$y9PA)lAL+s|9#r3j>KYTJ{lO_wol zv1KZ==_sfS0I<#?&=>_ETN&QKI(qb_2NEi4^qo|iTtW3(clnGM#OqvxjOf?928oy6 z;2PqkS5CuGlTV$u`57Ki7J*RslRu)dz1+2cY0Da%x}L8;D&vjAdUG<|so><4>19ua zKWY>6z<~n^B^-D+B^8w34kAkUX+{wxLvYB5mn5nkH~*MvF5^5K82+e z!88aeLJvRGU+^zWPZIXtxSS7vAFJZ#8+0+;uq}r0=kR$5@4}y8lj%Fk_b=j&YBa(> zf0ep1EY-p=39YbHTW7@$Ke+A8h9B%Qoq`FqermCi5MJ^=!fe*%nM=_9A$P5g=p1lu z?8P0Qh=~?ovPJ-4V_6)Eb1*h62GU_+p_=pD)`vsspwj`HxgRHlBq!^K>p`B|#u7@h z`awz*83O7Lo->XmX_QD1uU!50U#KbX6|ndzF6~ZxhKpakVYU9Dc8~J3d)jI`pbnja z_xh-T(u|CdN8ON-p9%Ms^OdW{mAfr-(fPlmj5K0J4-S|qcghzbEDjkrwLmIh?9ZtP z=|l)&ohS`}Zw+DJH=xHA-|u`{C7po5szmg5IO&NWJ?li221sZ!OT&eH!$sGi8zvwG zCvV@StxpxUKJ8j1-4}H2+EV9F=c($4PR&7yJg`w}zWaVRrN&%#ZJ5jU;n1d1CdHBe zNy_(w^4m#iJCrex5On;1LZYKaJiz8+EsaOn5?iRCeE9V9Ju4) zzF~z)ngf4D+L!=#J@x@A!Q$p(oJve!lEh{QQrpCN=(Z!b+?nE3q5~hz;C#^^S+{F^ zUyM_UMVv~a@z=$qwu$qO8x15WE@vsftw)f7k|5;wjlantG&6ks!>TUXGx#w z5u=cb7?r^4r!p9g&^9q1zxTLdB+2zG=|g|kn;wOfU?hQ+XEPX$&^9q1J9@WaB+0cb z>7VZrqmUAeBry7q8H`3~n;6rcCc*J6;X@m}X%U13A3q=cOa`Bk*)BdTElr7}Ii98c zGrd9-S`npESo)_7N~6>xO4OpBa;axh8~JBa4eMxz%w^5Rxypn(o^D5=>S`0vB8%-2 zi}m$QQ2!8aSV=9;=a`e}$W`~n8~;kUkRVWZyWw(qN?K?lh}^5D3dhy3Y5Lwo=owxB zhe8J2dyx>(#^({(-uPzdc;!VWxt>$j)0Hp$2%A)0jkG|iI)4`W{JK9^i);rI1Kp?^ zmO%GZM zsZ4>l#478bJ6b0XO>+51u*sJyXj%R}^kKEH9-RQ`?i(IMrz9jc@>Na~VHu8fvaR3a z3P0a~HFNeCNR?$9u!6RRy_4Lg4UHUX^;q7{i>2zAp?sU5$j%9!SP279Jhfwyu;k(39B~-_1C8rj@wG;CkPDW|y zss;JQru#(Ig7mSe1v$+iKhk103bqtW$6aT+FvL-pkWikH{gkU8Lc}zUOU~u++R{1e z6>vgt@{UF9TI?IXZGHkz+$MxI`dpg$+#>q($7th5D4){E5jrqG8H@QyX!M&XFRrBz zLvpBM?(H-PO}Yy1Ob>-7^_7Gbu$SqG+Lj(HpfCAGwO!*9VDD+W5++0>v9a zv{aOUD24Kfi14kw_WG~APjRCQOle*Balv%AiJJ@?vc?Y+)EfTr8c_XvISZ8tP% zQUY?j2x#HDq+Dm#jpA;r(he?3vltn_vD&`VjF%(h*Vvz*j0_*It;;s{tA8g}Ddv#b z;LYjR3256!PH_`War14rY^)h^AjZxWzBuIK58vw;5#{~=LBeKZZS7jR0N=PRDHLM$ zt`zaIO>?aH%W&EiQQa5br@3ju0k{LU-V4NGJTf-Q++*xL_;qkqEI*@9iJ9>G+@#Ol zR=u-EoBjBGe$wX-pE1qx_<1w_F}E)mbucGxxmBYEOX_(Lh(Q9>`pAWT&V8|;JE|5z zH+$a!kW0^s)v04P70$i}0-WCN@p$gz`P|jAG!9@1-by{T5?i8w*W}-8v#b)XWs)Fdw98UUCO}Dj~qTYY@-*& z2k!Rl@L6k00Kmm>+LHjDPL9&&TLQoho+GffX@L$o^)*L1SZ$l(bCGJ9gz@osKrO z=S3O;`q4%JdKbd_6TjX9mh#^M*20n}PJQP%2hE`+o*yRQXlLY{6R^d{og~P99mB*E zbUsi8WaqiCDK+8IQ;Y80Z%qnVB%TrTsSx;kgbdBnjT)_0pisUJl*Cyc^jfyyKchob zOQ}oAuc&y64pFtFLtFAeUMh>U%LbjfR2YTFSmco*?`^oSHCMRm_~X|C;7G z%$#u@a21@J9e1NnVfj7a^Gk;Htq(UL`@?F9FB_=;SC^LP%Xk5J-~MjM&_36ufKDW+ zffsO@c7xx1pi%0ga--&FJKn%bb-ljEuZB~Kqd$`b)6ZvG)?**PsAAEr^4xq#JD*6t zGHdo%?4QXyK*`&H1EOxUtp%8S3UzvDgh4 zPjEhAjLsT5JGB}F10bBg9}HY#gd?A#pr&Ysg?$f1=o3%gQMSGus1Hexe{>(g)4?(G zLK!G`e&bSb55|sCxKpl;7aFcdhbWNguQsdvE(Jw0yd9NUZ`+SBWUczW@}2UlhvpX7*Y8CwH+A zLg-up(ayrC|CxwmeGoW1uYn}uH8b*&_i;gw45lu zxCWi}Mu+IN3>^~Jps*iy4N~f2*fS!bEgHZ1!m7N_Qy4)SL~?0;?b>PU!LSa^4<8;Kdej>tIF4oS zyr_b@De~~W{uBuZV$v3eVK}8}AmCLzuSzDDyVCsVfI`#ARfegN4ON;%#{UASuKYVt zA?Mp~z2H9S%_shE^9DE)yxkjM1--)?5S@_~p7c**1-wOd!M&4U-=gx~5n&wC0cLC5 z?Ddy?wl>K-r^a^kIp;K~s}l?unTVkrz#_$kE}V86M>q02g&| zG%=abvH3!la;vd)thRadx*N;%BABJ#|6_2$#`)y=h;jbQ8(`yn${S#%e%c%0CBJh) zZxXX_8PcMHN+M%xuKT^*mNEr8h9^g&^(1;p!}bL?Gk8^|pHcR#5r^M0rbJl>B&^UI zH#+^qJG!1Tuy@e>(pOkm*M7tH}>Mq9zJFswP!|A3azF zBym^;lq>CB1xL$gt_mP+>5Y(@O+(WFrpZ=G!FmBd?b?3oIjly*0C>S$r)N%6e>y&pyL(KP6#%QV3rv&sMc@F_dE4|X zD%>q}$DZL0AeFaI4|d&J<5YDGNI+=5V=AP2`+2oiqaEO}zCIpt3SLlRoZ>{|ssIn= z|0;zxoD9=#;Y8!|s{=f?^KNVPgZalyeCE2@I0jY>&TG+50&)cQ#AK9YDz^Jqh=eHq-aNeC+&m}Tg3Iz_NyZSr4TDfHlg}@lFrVwf z)7u|_%tG8dRKjf%6m-3Ng%Vg+kyPDSPpuI1mmMve=GygYtG!xXV$jNczKfZBf4kNHsqcuRSKXUrp$oC)|U^-!rj@KpHBd z*-27{&KU;1o4%#&E$U&aRZqK4Jt{Th@^oG3Y09Mlw><=-?ArStz#Ic>Zp#RMZBQ1D z)3>eyJY4*+f)HA(%Doh__|Li!Lws_ zk8?%}O2H>Vk?SH#d69(LHR}7l0S<64^#*v2`T=i%v)UiLw{ZGK+4g^-iJG+ep<+z3 ziiO@&5<}$FkXD0`S;9|v{pk!)mYxQQE&M4TY!CE#%_C+*( z=vw~9S;{c!XE~kG;-X#@F+VlGDQbBJBbO;0)(-nOyMf68nC1J|ei|_^!EB5}w^ZP% z!Dor6VV)CIWrDNWsJL_iPK)P*3~)^KfyxRQbDYy!9PwH_p3m+MX0yTjCwRP{0)sNo zYS$cQRn0b5gA{{D%TI<6*rP@|S6q3U?5o-lD!EE;m5odq+4lgBA`x+2BOa^>?a65< zXbeD$YpGG?!LOn)_4aM`wdJL1i`tF_qVzfA6&PNgoIRm~005<@!~zND99hAZlh@Ng z>}H{%N4JB}WfG>Z#WaeL#zCo>gT_a$Mq4#sWHj@iDs52BSSvh6w|9yaWQ2-uwUjZd zd5-o`p;q}7g(q-}GY-m!k&957OqY$lPmX=KhW5H*G@^qS(g4dluT*G+H~)$X>5LcF zKmfTrPjm8`(kixZ9xi* z*n*ZFwS~?a=zYABNBbRk89ty6kVSVxY7-2+fc9PC1!LMEATRg9a7=)lgD>~wCG{_c zU5HIInFldP^!vPHNL|QtsuULz4g>HNJX81^uUSXjGd}yT*XyF2*AOV`zf9cv1L&6L z!}>X?`WesAsHwr?0jHmlekYjUZ+MYix{(cb(+EwD3kI84f>C=LHbn?Jm4V`A$CV-r z`b5xzLJp2<2|-|d1dmH2b-D)vqcuItk3Q`0 zKHDO?9~v?=$!I96&813o=uSdiKp>}F&4kT4cas%;^mr4_mM=VtAL=0mZiaS-fVDk+ z9N%ivMYfx@WmX6jQTi4rgh~-&&EIaZBmSoCXM$NW!c~n8YQq9+!MDQr(P~}x2B1qT ztT7@#kLPx#d;WNHt-fiRV9KPe01xjRfu8tHMDM-ol?#e9D7$sof zAj53a7|l5ylK}j<)Doy_g66y-mcVN6{D_W*=T&sQx|)t{w7pmLMu9A%H>2T;Zjg5z?!Q?0;op@j z68w3TQ^c$)bY7o@&yQsHbi7P$#ATE0K!@cGZ+b^x1vOVw*Oz!R(OX1g++5a;XtSv4 z(dJrasX=c>f>gc*^XY7-BmuKMgFb9Z2(;mX%})xVi~tb;!Jf8Y)LPZGdX=O2!(NHS zM+J-8N@2sX^)2ugfTdv@tV!kKR>DmD0adhT)rv%+!!5?>fsb~r!oLGh9c;oD(OgcA zJn5`q8v}293%C^CXKmv}+BiH*ap)jTesqz8VDTK(IdYsVpS-2wMbB`|?&pqc^p-9O z*xTA|{xb89?4=8IuMWT~Ai~=Nr)7q7;zDL{SBQiG%+_ImN1HE#g3Jb(LQJt^2Nw(z z;oXe@=$(6>7%GR%D~AElE9YaW=uUn-r`&^KOc>z#ofMpKMGw2&TwAA$w;2ck`3vJ2 ziU&IGT`~ZK{KZ%#Ih93>MK&Bgl?980Y>cm~3Q+U+&Ip~Y?%)MB-fe<^OxP!JnSE40j~Q! z0&8#hrkW8!gip7=3m-YtIe|Z8_A0LXxDYV&-wSMZyVb%g5OB-~e@3ChIkv~Lxgy_u zkpqC+QQ$|W1D4NCgcJhIKCoH-cK|q1{xB9e1g1VI1$ zU>nXty*3hKn-9N94q_6;_JEz?0XhIU>u?k-Dzy(LrUt}tDyUmF?xgp`Hjde)n+0Fs z{|(Wp38J`ymQ{-)GC;ON zV4p&DoFMWD7+e}KJ1KBsX-DDIrvcQT3Xs2yMhANIQI3#f1Eq7HZ{V-O4g86YOdlu; zp+Q{WbW`xc;*N6X+yzLzsSr=s=<_!9C9{(8d;WO3^Zk(XEIIPeoR`Xn_d9Zt4}0hJ zCLQG0qt(Y+t=g`gSZxs<`oNpT?t=z`y{R`YUEmi|1N<>~DHvHHMo@-?pEzCHq;}Jq z5#ZYDW;MVw-5-=^Gkn0@hT0Ze>oRD=w%8e#{`VdrxT~MQK7~;F6pA6?>jYiyi zks}{e(LGG%Kz6I6Ws}Kjj`EvkpjUo5tQFc?=O*=>_772B$j6h>7Ph6v*2d<+jdRx! zZUCquAjyct_o`DHH}5p{-{FoI&Iw$=1xdFdWL=0)2o7!skyJK0s+mHf@ogaImNnH_uM)&?$TCzuiUNsngzwdo~#_)`Y zAoa~gH2`SoCj>kr9gf!&mOda^i+M2`)<=mG?T8|<4eR7wJW1;OzV)@c2Z{^{-`@`8{*3hf{B;YJfsXjXm> zv>BR~3OcQZ8`!tJ=rBzO_;ijo&i?9QYhB$;qwQS8)r>(he47nNR~nh_1ip=+>y2UG zjTSL1K^bYi4NrZ1x{4JCrh^AzQ-f_jN$wp_?sadmP43CXB&ZC31*&Sd_`HdPQ^mCC z%Go-{RoXAqEBK7#k`_o}{oxw#yOO-;|6Ka?_+2bov~i_{SYx9?%SJvvMSE=>* z+C~5k1pfz`;3cqBc+GE%JIEFH_;=QP{O`qxFn89tecVNY?22&sCj8`#;UurS-r(4s zfM==QUd|+F_c@wJMmau2@&(|w`&-Jjy-?#~;p0Nrw*Hbm!MGhDQ(|ChN%SZjM*=n| zMYX!zI7Ba&1mLasFg!Y>IaceOV@5RTMFFeHd;yw_r*@=42R-yn0HM;4r#50I3r4Ry z%h4U4>;En^%4uZDdAS6#lj^`R$6InhM+Wz{kK(qsC7yX}xEyggN46Zwoj_o#vjg_* z4eb6jl(XGPdnNJW%`lVfVcxnG(Hr4(FQ>=D2)t3Y)~k2hZ+O>Q*U&lnT7#}$64ru8 zz@j}^q$#gqlwTn%xwt4gbt!H%QWAZ0mJSBRYWB1hg!+F9f@Drh(+^|r(3E^1Kz5hQ z*Pc85z2Ezp95YfV)37DW0EwmHUBqyDMr?D=f{|4Pik@7%2464Ja}MRXiaL~+^64=( z+1n+4t_iMK(4%jA98NKuqKyvfNtszLGHL#c)0g^7~ecb%+s-$nksyo0WJD!F}duDmVKNk<7O*5F4G~h ztK2F=uA`{N+C+%lBs%1~iTsM(B=oEBbR=)}F8fda9oNkc?p!v!>VF5EmjBAlr zzfN{uGnZhHIuUemDqoLLwG5G-)gVs$|JQt7%Btw*1>Y0R-{3WCb)!jdnL}ke?}F+? zBmQ*r{E=s!x}%6ngU;x111~;@)=C$hy_MZXXD?*?k=SiIWzl>?RP%+eexvTI^GCAh z)!$`>Gbed0GFDj?9U_(oKXbg^Nz~~igQ%1KT{i+HgGt(@9o*A&xC++2KqFs~P2FYd;-}9H9I23uS4~+LA0Kb^_^weWG1(G&fJl}mk6k$8>yz@QN zIx+>YyuARx(gy@Mfx&QxLR*>!Pc(?p0M7>h3g&F-LUVQWoh7{2l%?NH@}{3^LLxSZ zbU`eEVHgW*w&Hm2`T=8@f)%ad6$^R@fH3?}tQuoi8{I+1nhn2-7H4#+6;Y(qtPOfe z-QqWgP&NDJYT>hADl1Sp1=aA6zkBL1fbRXl0Fc`s2J~pa(+lkuqx#G)1ui9mqpd?XesE;dLX zdLp9)?!qx}n;(tEPmY|^P$|<%BkhWVM&)C%w0MhcuJGDl3-5~OBDsvGa+2g&(e!G>*5VWCiBA8m< zMT>VW5^@ENsb1-(V}9x8y=>+shX=yRA#p+l9cClV5PlA6e0{%0~o13^K9E6ZV@~P~#)ODLn-?vvZNEO*a?q&We|_PcqN+ zjM{TA&gG-)V%vouaIyVVaP!3Hg-J0jDW}z-FX0%xcAf^FX*J>2ZQ58t`hxpWDWbt0 zG34*6gi~I!ftHBjzfk6^f1x=oJ29StOt_R$zxI~-zv!5d5m#|Xs;SY{Bvvo;m)&x0 zBxi;`de94Jc-SkUU?#B!f*_bFkmSsGzVdYFH#TRU0$6fp0Or0(fD;%D&wAvFCmO_P zfM@&r!Q2dUX4Qn`ogh+q#(0L|bR!z|a%N!cq+msJX5|Tb2!OEjC9z!XEoWxG3TL=R z?VvUMim=*gUZ60MYc1&bbF_HTOx@(BKk+tM{h~ecd}8SB<@1goWj^z|;Wv6{=&3x+ zbpTd_XM$zM_fE28Mx@?qk;t%Q?jFk$gXi_444QTvgAZr~h~=2BF)(Tdul=t9&(^zV zs^-zl4p=bo>jxni?`jl5f=vYDtp|41)K9cUMpis9_ zzxyENqwY2-aNdLjyhPpd7twruWDQj$SwsP_vuhw+lOX`jZ-)Pw{hv{e;BMBDZ?3f) zYiDW@Fu>EjZv~1uzV%va;1XWnfy|nG!6U}8Y(6rxw@CQo_ADCsoonF%?%0{KC3qK7 zF+WxE-jQ3>WNVCb=#i~DN8TL`#=O?7{$fi>@3`<;60hK+G-J8C97IDHmS759Bys>D z2ZvQyv)8g(c=g+-xs@x7%12^AEL}H4{)4wiK6W_vp}V^Ry{T({JM4{8P&yQOBW>$VQ< zo-lI=Ju4W#`6IO2RI&p%~>N0Og%FoXqUoD!iQ1>Xxufwb3o% zFu2_l2IkIYEcRFj_82vr!hjg2Kp{r>bHPFRyTU-~Z^bef-4zzWquZrX+w!(BAd6>W zp(orHzT?mpE7S^j2X*e6cvIh4X#_wVDst1bex8xG{A^S5C^sM*gm=P6o9v?W7RA4c z)7sQ4UwGxeV1OTq=J9tNVrC9W2?GZDXGO$JvuUDosjwr!bZK~UWT zp&v$4&5lJnU9I2IrlvykT6qA3{5h4%@Z>BIv0{iP-yHzZ31IcnDjEC6hBv^k4?K9$Nl6x!Rz%eN@lu)(8b<1A)`WNK z$`W7rLcGtr`gSC*@uVc>(gA0ti`2L&+vgDV33p@$z3rkO&o z_yZek!oR;V!0$>ggEq$f{;B}K8%*^3X9f6O=Z7Z2zdFG0@;^Mu@1GsucRLgP{y>1= zRl1Yle`A2(1uviA_m>v~{H{0A?=KJVyV8$Lf`3JT-wh`E{gnZJ*ZI*&@UIH+yZkFA z`Tes3{BCEW-(MZzcjZ?Je&!Mib^NLtO{0>#8tf8|SBr(8c)eYIY%6oE%@eb%zsqV$ zyzc>TbBfoA{RPd=bT2zx63E25{MiBc>HHYvo(b@Q0D#3GSApC0(9c22(03?eKfb_=F3X`V$8gGA{4G5V_>}8}> z7p;`5^kov_jJ~|~#zXGUYmMr%xzND;iSBUxNom>1Tyob|onPmpkFtI7+abxixqZa^ zls=X7;PV81+RCgehJ;3MW}Sn{+!d$YGZ}pa-?3Or@R+q>+}hF`W+pX0{KUTbPt(iWrlz+DOg`Xlyrp&GN;49D>rve4 z3R+r3!rm{3B&B5^dy4k{g>7%ZGDpU9{$!Q06QhhrW0XN=4l9GS7*Pi43zB9mJ+d;C zVLxT~glmTuQqjurwa||JoXSOgAzePF;tkl(sdxkSb1L4zCF}q+Ayj{Cf6}>%EO#i9 z7LZ0{;3KMp(Tl9b&GCyY-Tg9akGU#k0+Pj+9oJA`KkcyilAkX?vy*f#gT z2l&;_UkJV6NhbU(EUZ@Bs|%!%h2@PlZPqQC!e4$f_)G9+v~v%>t-wCJ#Q9c$#%~7!g#v1;XJ|O#$0A~DQ?^n^x!Qb z3Lk=!$GLYAs0o+;y;{&~xP*@zWaENoJ^LsY4jU-U4%Ns-UzaYptCm1>8?>{D$P-C~ zOQC>Qc`M8_0d8c@m|ew#X8#W$!P@|4!hr6@?$xi94)F7DkEJ6%6{b7hry>%`6@UQ< zl-}VJLW4D3v%{uD)XGj9*FXmFJAV~RM&t>T9WRgdWwUu;_Ej&{FLnrl?z=!ptiAFE znJ2p4>sEw_ZV39wwE+-@?*@`FH8$(_tQkuL;M;!_OGNY%COU~;sEgMgy-@xK?19n{ zm3R%^vUwk!SPH|haR4Cyw_r936g|crb0~@`0MS87*>fV$s63&x?D+s_^b%>Q&m?l~ zE|>+%ARWzlp!H_efp^U;VDf_`r7LrZaQ=A%a4Ly-(IW>nVxsVbZye-W`hUJr2iU#Y z(qPX}A^;!EmWcnNsvzh8E=l$Aua#bIlfQB5Vo`9*t-x1iOoq>Z0NP6gpWqlM5+7UD zr5ZJo({`GGmi`_JG9j{oOkl5zhtdIl^B-dANR$lIog_+v0Dah$@0bRD@Ltf70H@G8 z*P_OCP%aVxrkf5Iow^Q=BQFrj|Cq#BH1cw9g4gsrvZIc;>r>LZtwCpyNKX}!%()+R z0Mz}bBmpLlI*#FJ*a3LyeX}JJjypgf&XS5<^Z>d2SdsuUF!NzP`vZy6`;$mX*pD{D zLH#mi@cd2`=e3c1D|%wBIBvcGqx69YPor32uTw0ZEO*v{fGK}uS8yj9R|R;q^wCrZY&>HHH(qk0arxB& zo-KZCR~T}O4SzNs5c!X%Lhbu~|ER`%y!g@u#=x`1$CEJD%@^uF~BJE(uL#ZtpRJO#8^=W1Q+3<#;_f|iIu-0qYU?^30JZbU zB=khR(wjB9-+;%rqcGmvE(!Y$3d0LI0EUS`(R4^nqrxW~MbmC1IF{5)XcYe|BD*p@ z3tG0!0F7oME!A_>#guE8H34Ni9W9(Sc{=d+8vrxh1Dv1H0H^q=B*jjg`K$2J#2?tr z+0qDSH2~k9EfM4CvJn8}VIqa8_8WY4u_!_Y@WoFjS!8!)c)tOl%|!4C_8aVO7(Ovh zTbMxWMNz#EJ|~0}pm0RN^Mgd3Js|GejovQ{z*yJ*cBCyBfzXAVow}L%%PelC&24QalQ8z5+aGi;aCEMej?HyCb*+z zqX~%QJ}aVXWqT&XY&-#xaw4(Bc;fhW5d|>abhv0lad2Kt0ZxA}cz#p?P%e|C+=-)# zV>lXD0A8Lkk#J-IdUwWDyx0Qhej`I0Fukxc*1w5O7cJ|ZT@5(>>H`;<_ho`3o6rWzo6u9HmYbe`(d`$_D8>_xN~ zYM|2pyjW@?U6}eVtadN}f#&D?gcb+0>%}AII2Zsv$i#o=;Ax;EC&a%C_Zxp~c7-(B;rUJ!=Xa!E z9vgy1?Y~CHsNbAwnh=j3J91M1oXQu1FS8Cj=iM`P9!m-&22YPAC8`dS-h~6*cufEb zoiFk!{rYT$B09it{?AxCB2k#`ZX~)c0EOHa`;>BjJySE?cwGSeV1Fzfktj@eHxjY$ zfyf|4Y-7ekF)5I!e2FiYk`lS}-xEypNV;R!wHt2^Kq2^2pV9|rEY!^b@Q3kqM4~X= z-B{{m01Evt^Cen*&uo3~WB~mBm&ei(iNbVuAQsArKhG6B3!igm)p+@tY0?AdxHhGM$~ROok8$RK7Zv zkjNA!ybGC5oIDYLMDR5}sl~sYshtcV5E#Z2!fXl=-i1uZZ@x7EiT)+NOurO@-rFlK zl&%;;AkdwUB_uM136Gb_CTmC5s;Ap@Qff~#fnL58R3ueka&v&V5R>j6?EhTJ@Tn_|D_Ya4X1&P7}fvkBi(7Z zwYC`muD<|ojmp0o^6#ZYHLe~*5tNF>Sc+ogFb9(u`7C|Ov(~z4W9=Nhh-ChE0188; zB<4K=@tU@`K^rC}>_v5?gc2z9E{9A)>3aEYW|k@C^z~EQ$T$8vu!!;QIAjLQohVyN zn|GMkN%(>rkStvR(#C+el4H*=ec{RKP&519XQ%c%XYRGC;3_>o5440eZ7u2N;y@k9dI)&YroPf(HJaJ;N7T?bqLD z&(zx#Q2FMKV&R|R19j0j?zjSlvVCr5mApOL9?3W{4v~ zuINCvYFN})w5xJWmk#Ltx}$X0t9RCJtZl9~mf8FPs0L+FUurD#)fC-(ozdExrjwPd zLAM6H?6*Yu_8tMc8sZOOGV@aS2@1^SmvnPS6=quAT3^SdK4)GekGGc2v?5|POt?mN zk>$@i=bX^m6b9P_Pl7hDuWu|PgM=glNR%~S`2LZDPveG;xEEc4GJhHI-&kL7Y#1Rf zUBJHrKn)er+;DvJmX*XoV#F~Pg)HBBnlBImQt8_9Td3z{2iXzAPhG_)~d0nWbY}>%tYd*#=i(3R(eyMlz-ayyhHFPr!9bu5KXAe9)7U^9EUYL&?SDrs z`i%5~APg$`=fzS}YmbR_Y+gLy+&#`AO6{+$w*o)}&mYgy<1tPx3O(Aswc4szm+MOb zP`W8-V|?iFT5UbR^SL{OE4pBUb2v%|G&z$YTKA(vG=)P$l*=rRjGWYw1m6UNKj%bb z4#NSs3o5a?i-rd|^2-%|<3DX`kOX|qxuYA)HM-baaC6moeEt!?7xC03%?vnm%TGXq zJqghHQ?Vps{9mNluM}vB=A65;Z(L|#joIjQgyM4mg88Lb!t2$|CC+Z=3RnKSZU?b! zPJf{M_}HLybRz(f=CTlDcOuP|5_}-hbYpzt`r5ew1Uj_{p}jcU4YiE`fVq`eb!p^4 zc#m-{3eMuTg3;R(7O52g#nXFX>ZYyD00=v~M=~&YJXepXe+G7zfQh6ZByul=?B;Se zM9J}KD<@0lrMOUn0;KMp5$4NbCq0Jw5OvZq=|_a3Tc<&+2cjGcmBd)TihzdJRp3?D zAxvxnqJ&}s4U02b0&<+U5f3Kky+teB_DMo5yoOxBW5ms zEgDglw>E&U;KksNo#(-OG<(fpPlW3JcivO@yN`)BnZ?091*j|2rdrd;_Lw)eA!EaP zG_TKW&|7|o8e1C-@c2E2Uk2h520Q27;0pVW*_}AA&chIf6m403HlC*Xiq>%&?4K`S zjm|7>wOTbx=`ruO?WHPTQc0UhU3osN;kY%Ct_d{<3GAgvDv&7 zx0YsVCW;#AR||jkah)OFPL({8Q#W=Kq`cWW(FlN^dx=nCap3e6$0g^$h<=WWn8eM^9;OE>?i0<6sM-EX1JZkPLUni5b0{{#)B=nG5%aQiQV7PlC)qEj`jklhfZBZ@P%)@I#O1f|{&%}k<0bh&%A zWh4rK+K)$9dyW=Fb*FSZywe4XC;SblTdmU72x8KlPFZKt<$8-YU=!h6GWdTp#zX%xwz z20-cdATF<9w0I(Fj(*2{$pl)uNLPQs0|Rfs-t~OZO@%OvGPU6c$t>R1pu-QaR(Um8 zq}bCoJE_D5MJ?=;W;RSrqA?0w7@J-EiTlP9<)ro@-D=f@jOW32|vv zEn9`Y=7P@948MF&qWsDQbuk_L)tIqg^Tz1b>UNE1#`XoLD^5G;N^!VDW|M!?zfgEo zd^&TAXWTn4xDysTLI+-Y=3+ulUsC7Yj@OAsP5cRJRU9VI8Uvx1+Eg86mqzMriIwMkp|0BpX(+%mU7C zzH3vq!z43?qdFU|P!HI`o#yxhiVpq|hFc-K;Yh$0@}tKee4e==XCDEcA1IEoKTZyT zvtK_j*$_QJW z-|p8xJGQnq9AjXp^2bn8orLp_e z`aY+>i3LA=x4AQ&4(b8kc@(Vqkg?Bt2^pU1{`vT)t@|CM?uGzAt^5TZi5Qt17+p(& zW5I%4(`c*(cz8PnWOU&akaL@KrwpFn{>$;KV8M>E(%LdN)8Ogt*N;c3eW#u1QItc~ z4OR@E@2B7-$wWBxf^LAvgEx$4CmCjKEx^OWc#t}`zwIwP`MKIRz>}(|BcnpDtsP&h zQvnRf!5d@wn;x1H__Y9N-S-M=rrx&nXc>Rqi(K;JR#E!H&Wqd%BHz<^)En9`SrPrL z|00*@ZV-bs^iF@s3=EsZdX6 z>BuJMa9w{y611K-Rx^icgthIBacV`)PKenV9(d3jVCWrhpv~S!IFvK$V`P11 z^MX2RhVwG|8Kr;vvqr0an$8SploCF5@=%h+RkH`6XTnG?Bn*}jT1lAVOg~}4HtDKrc9LneZc*Dg@q&5U_ZxNn^MKv z&8Gbb+?3xBu0k3R1&kt?33($gegPiM|1+j#X#P>Mpc$N(^p@PH^HdUGQ3c4505srb z4(z8ibW%mKmZc%DHEd~MBbOS#cQ@ z4CC}GsC+pu@Or=vp^QAk-{HGEz^}XiGA%bR|BvWluI0v_V+&mKLlM}D3hD1*YC;t+ zIObAR2svyJ8o`GXX@yi_TPOBw7{+E@UgvBq9ULNnOz|Ti$MJ(wcGxFE4d(;V0f7nz}{5f8^MDj9TeaUi9I4 zAyN4_NKHB)u92^IMa^Yn8Sn=G5y5pX7%`L$!fHj?F-hkCD4k^heej70mDJh%g6k7g zI0CMO zkDF%mF_l(?$7`#b)d0YqcmgW%ugc#3i1FLU>T3a>-v0EoW=TqAO|#EheK`PPAIMW$ zgj)~s@E`>QrCC%+(;0zhi~H`d7pU<@6D?7xo(B()qTX0-+NlG`AOmQdAJQfS_6N{3 zPMf1zqT6i}T8CdL6)o*^5kI3PJC;ZK1{wX`TX-*#ljoC#&;F!T1EJ6+Q!+Vjk_gm} z(hk6R?tegn^)=F&NzGiGwi`XP9|MJCBn|e&Il z!Ms2u%{9Khc7Fjm60|DWM9|57-gNY^B7$B%m7ZC{K&ANk(^10;HaWFh z>O>A?%DL&ty`?Oho4PP3#p<$c%ML(c`wJqJR$Ug#hxE+?UY1C36jT;bvr*M`CIEcp zX+kCpBEEnm)^sUQ)bqb=iKAgVuj!=nOaQFT)4{qe$i0xmHIo-jE;&OtD--f!Lh#(+ zEAYIP*)nn<(MOJ(^Fc6>`=UvNi|U8^9hL(;y7NC(7Oo*r7JltNW%rzAsc57euRtq^ zQ((4DWj^*Q$B9FYa>Byki+3XpZHe)YA)YSnABU3Uod$)s4DopR8RKA*HVot^0F z#N(AO83&WJV@TW}$^oGCr2>?eQADC#)c6E#!x;dBFPjb+;VcHW%Lr-Vh^ih(tW z72tYb9;;8;u1s3=j6SK#$HV2X*d>T2V?d}p6Uv)D&q8P@YiP)%q*^h$;ouD}Dg|&e z*-D7u9fON#4ah#AW1|3)sTd&YhBVi-H6(w zESV!V5o>vj$_cp2*T=FKh1J?7Y2Dzm z17MwRfXTQ*p)~sC@EyD1?Ox^z8$-2%o%E=3d71;hTLhVuX|AwI6P-T!LVE-D)J{M< zm&Ynbp+=J~bNBV+ zZRP^ogJ*+%4h@TrGvc0SGa#r2rhlK*AB0&IA4LU9i9WL#SAQRBG|vT~JNPEhrw^Er zZb(}iP`C>Bm9;Fp1p13MYiCij!OSubc>4r4fO`F~^ddEhv8u;I*=1_@^mN{CaqaC+ zf}JSPgj42?^yaob?}Hq@Z-G3vOPjZC+!36T39fInr;HUqKZJ|>bi%LI*ttbL^! ziL1d4ZCd&RP~7=eQ0CVHyc9V?SHg#Ti`&UVn>yV77yzvETmg-S26hgoBnQEjiRn$2 zC(9+U#V)d{n|rjmK3RXn^J*<>LKc|bLBP=t3~A=1x6fq$?RUY3)jdY+W3{sZfOoD* zBp{6?yV5L?I7mf>fR_)2i8NJ;sFScmmg%UXke`O?(wR-;#vs+bRY;~yI9~1Jlt+M^ zCjzN-+YAudUD4&j1pU z0$}}FfRa*C#0y;S1vB8)XjO25*SviOxEwwN7=X?1oB^=Kw9yHGl{;nt%%Mj(24JN! z17M43BO3tA)foWOT@AFi8vv_xN-#6Lai5$hqG5PdQx$vK*wlYVf}dT`Lu<#l@OR>h zqXC#1EP*MPBDs9hCSP8P96HjJL}FsPM~N=zm1^+{o<OL8Y+eBEu7(v^nv?)0Vn@-$Gos}Z!f08P%O9U9?F!2|()d~?vRyaKgc zkDw2M9>XiSMr~n%@3Y4Vk?p_)%23fv3F=Z@D>SxGvV5OJ+--IE1+LDo-L()V1OmaG zU^_(UE=wp(IF8V$x%C}O+*uTWMqX)&ITc=2go}urx>+yo8Zls$qgZ#f^$d}#rbmOq zDA@dErgQ#M`}5WFaZX9h{nI!_us~R4tHr09z-YEpu}~4kVBviTpcFS#(Z)zAZ$$tk*xDPIc{f5Ja%YmDY%BPj zYZ8)0C$A&1V&e@70O!xnlmNdc0nGBMM*b9k4;~r^1bni)p8Z(J)4>T}3=aaB_pMTEn z^J^-WhK;^wKzA=Bl0c{P+(@T$+*Y?*g+-7yF`#!ZCQ(6SnCDfRho#G6I;y$D83a1_ zCK1w}=D4f4#!=!HF5s3rN%-op*sP0j6x)vpjN*4CVeQ7cRBQ)893~Ns%IrAZ`i-`L3VtvNa+eWQyK8~G zlSp9_rqS_=jYObzUzWr-A7agoG}XF}#+aE8Ds~4H*ySHep@EPL&x^ZLMk4`en1Bl8 z+z+QvKscR>0&imjx}QcukDhd`9}|Mmg$2}ZH%S0BuG>Dqu7RqA`)UBud3h3)SXAe^ z?MRL5T2^H4js;@pN0N|jkEq+M%AT>!vF?0a`gr16vXz+afE6O;A59__5hKP8xepcq z#aB!Sl(kYgeS|t)Q#hx^UFZa_oRD4&26;La5J2>PE{RKp8Z$?{ZchMJem)g&OhTazP=M+D zLK2+U&gAV8NITPh*RbQx>hkVPa7@F9x*j^3z(VI2lUU*2l{vpLWPFF6J#qlvb`)3h zBr(B$?W%OvTnnQUjIXSAA;7XCc-IEzrpQS}ZM*EKGa6WRQi9-RPXsgj(-gMIcjD za&nr7dj{Ph%;*^-@Z6atU@B3#qjJF+!%?Rv-5orN=W~eu4gu;#0Y~|ZTN=S3onf2% zD}mBaM~e&N4vla714^(BQzhyyZr{V9$p?l6rnpx)-io%Ez^d#Olego5(oIK;+m3Sr z%V}ae0Mbr6VqE&*5SREvTmf)~>3BGicVXUlKexLDsQmxgqm?Bb1E-RR7fox&d>X(h zz@p0m1h9LFG-9^Trns`-*AzaF16qSbnwoQspQ+|_BLGVN*Hg7V9u1$$0Z=&|5Z{4_ z_YCiYIl$_qV~+P;K1u`1PC8m#{_9-9o~8k2mgsl|1nZkdrQZssr@=ZzS1? zI*91<0q$VJCHmMdjQ_YmL=bUl5U3;)ig9T@Q-efAdEDo2Vo4vNRWktDULyIiCv8#s z3D^5O`gGYENDUH6CK_G4aV_aOmbbrLbBy4v5ly{oQ> zbD(d}nu^rE@(lsN4`xqBza#+c+-s9;tVW1iDe5?wj%M!ySB%2yr+E~1G}{h=dMUhM zRic;=;nPJ1lT!FWeA{6NR(nT*){CN!avHauM?pE67pQ(ZWLz>IfwURDKm`v)%rwen zTp)`;N?I>i#hGCGxxD~ZW&&&ze1YnwL&hce5&2z~FK|2QuoHMcQhfm%rh~@CwFs}s zVu4nCIMo9t@Ka7@0o9xdB=T9H_0mz}^4W;^UQ!Fdemd|3#^THtP`TeuRcc(a5#iOQ zx4hXG&-{U? zNk4!}QNU6D;*u#3&*b|+X{MvWn*Iv!&^XlxN-rHPE*3g8o8<$hzgIXf!3S3Gx`;hS z)i<6+&h3FxOh=2$?VZ4y)&r@Mj_9VUJB@OPlF>i35~MI$B&_={U624Pd&7a8W-SyLlghM_~i>on$K0 z7B(Z4*dah5cqB>JF)lsr=6x(_E@wctlt_LS<&2|GsWwP;5=kZ+aJ+w*A_ky4iQwwG ze$IFp*h5d)F#pT-iCq9jaw(xODEcvT7LY%4t}Bb0=yYqTm+Kv$Lk zXAs5vhe%IR!hwWBYFz@P{GUN1i5$jdJ3gQ(OaN0(hl?vrJUFgQ0Mki_iwmC~oGnd& zv%P0LuQmbLV9%gjoB$^GXsSixiW5&}txf<{N{4i_)>S7Sq?9KBYNi9m#bOW8)hEE} zrDLYpS_%{Z4H5yP>(Q73#bY^Cp#VJp|0Y>0CY_tALh&f0L;q!k4Ial0H>LV7j?I>bxIT; zg$m$%$z-N2R7Od$TY$nKky4CnPg|+P)81+P!C(Nr~y=l`Li1@Oh0lL=QXz^^<3bhK;%csG%V8p16d zF=fkowaEu5z$v}~HZVmCK9e?+q6MTtqWQ*HQc|*nNl#j`2o0}b0hO*&lX5@_sG>#- z7J+l+3Q%^UXs?p*1mP5A7=MbQ{K*>-zzO=$MIv``d5?oLr3yfb>0oiCih^;W0+32N zSX|&#Fk7YorMpKouSfyZ&K@DTL;=V!9W1UyQE9b60Z{%;sfKm)(-kNRDCG%Y%IR=% zaaZA7aRQ`HI^tOSN@)U^okY0k!ZW5cQFcRx37~^FC#f_hdz-2-QMxEgK&q5TQiI3X z>B-qAKstK_LrDUh?R31jl0=2|3KBpK(jmusEtewz$-gDZUaGvf+)(+m#RyQ!iD*#= z8(WNo(NT&3ypv31+EOG+h+P5rJBf5+TzT3;B#ttdA)p$(HOVluC_|LI$(n^yDUo8L z@y5D_DM5hQNyMJa%}fCTjO}!+u|ZMG4*(7J4oGSQO73k*hEq|~*fYffU`l(0Gg!dr zBx3E(!nW)H>UJW!3O;uE^NJ2Y4H6-zDmv8LLnQ~mb8k;F*zSmg3l5-{W==)R4L~;& zNvHwb!Vpt#7;~DwE#Tzd0mYbd<7ZzhcOTE9ZwsVAq8Cp}%8fATNy`nP;guVpvZK@_ zp;rQ`sL^sm;9R)@lwlO@lhBkwqt`Y1@#Ti{C*=lkitmKl6S<4aXB?aVFYJ9|X)$_+pb_Xx@520-$Em1>8$azmxnasxo+bU-&hUAduv zQf>gIlMWXbZxzm!8$jAlM;vQkDK`K!OoWRrH)F~TWj9oA0J`|DBpb!#Xj7FNN*Cn@ zNHr5lYVa64Jvqk&$o3w=P;LNckd7BuZm6(cxdEu$yOUI`@{aXdE;j&DP6vz2DV0B4 zZUCi|h!%CQvE@b>9pwhVx08uXTW&-Nu`2+7m`Eqam8UH?;wW>u0jkBnPO|bW$_*t? zc`_(96DcMdZ>(#Was!y#iP-A1W3f!R0gOR9*4Ut^^`DsPrVQR}!kO(V{~EUD*Mg`~b=lydRCcE0R!lD5N%J0jUy29OW=Bv+)5<=>eE- zI$T`o;lXk70hpb1xVW(C!P)WyIKw^Tc?Af-@_!dG%BTucnB)=!Fy(Z(xDv#ZS&I-r zblYC`Ul7mq=8@O3I|=EEF(!ZTwK2B@n{PZ;A|)2Mcr*|VG_khX#)5`GMQ;hlTlLa7NC%SZ;}yXTzlH$B%U^x zC!kwNq(6)D#AARmYtZT?(o8gBij$ZU1*n5Wbe$F{Xr@R3O70(%?4xKY0aMEqK$T_z zN$Lbna~619UIukhmPxN*0az&!bgF{I^Z!uE0{G_4 z$%Km*;P;*YI$E{>yq`!!r%LS7VZZkozQYw*!zku`ABle5F($WHL@&7)p#1wH-tqw- zF!>6owqm;MUZ5&b$Wb0+69pfU(|f_`rsKt?_a2_j?*(Tk9WOS7d3ciG3(#=yfPRKA zX!*w?mKjxJ8k;u77o2iBUTli*iS2TH!Rn-Arnxwhd_meyM~sbL9+zI0FJOao&@@#d z%@?Hn`;&|l4dUa{e2?jHo-gQ?L@F`K&~$meM_Lnoq1H>Js&OlA{@P4ma0YwF(^Oxe zavw-izp@yc>U&cAxxS#4(oxgA*(Upf(@DpR&AfarsT)O5b`sH|E~lw}8oEgn0UP{t zs!G$~Or8jsVme&fl+#2JSe2Pzn#5axx-$VZ$sLe(_Ks-a026#L$tb(FxlI-UTudaO z6Dcj+df6h-Dv7AmWsBZK2&Id_@6Mi1I9~*TohO2jCX7HICQ?yjxcC#Z&&{9IINWMA zS^=QC{{jax8{PR&NU}JK&Ki#zsFeRTmYVEzhpCU>>Gq_vnP&c;{Hgq@Mq}+c`MdLa zV^;p23;7EH$PPo~e{2@tZb&B%qTLVqvMX_sUH?7hXDY6E_U*(%edBZh{L;{;^T)Fg z^7)Pm(2F0Ar6SUVsgAcKc6QhK+mGxthpO~NX;5f_Qt+hB+TEMquvtBIwpFLkpf1c` zb{qeXOBbrk%Qw_Fs9#KeoBMZgcZ$6FH^2F50ski%pjB(vsMAp%+xe(Go;hW@rn>hQ z0Fj*#@90LIg0#RCKOV1UrWa?(1bI}bfF_nvjYrfT5B4gr}`OUord>JpZW(-JU_upIiE&17`+Gc+! z2H+|9BzUW}SPP4VXB-oWefwokZLL`KgNZTHGmT>buy;Ts#ACMIS_&g(`3rQ;WN8%2 zVo~6iKNagcW+t4ql#nH5muhQkJm!7?9 z03##)?S%qXn#>E0)do@XKjsav`NsRx6DbZTAMyP4GF;k)5Ta5aJq^$?&l#jSaoArN-LU`i4>6 zS62HI%&4vAa&@zI8;3REZ9fHyl#FIk zJtRbF%rt7#=g>9}x0kBaKMc4bU_&6;B@VN58Y9P`lJJ5FtlsAet0BxW5VT}bbSIGy z(L@dK`1a>PVwn2DdkgQvsvQbftF#JO?PBiXBO1=LN9fbV1j}o+a&@D=6oA&?^Feb% zBjn-W>4EuAre;W-EZ`&LS@Vm14?Oza5F1^zm;N_iWW$f}kx;#XK zIhdbMX8u_1EOXro!0rHSBLUd=Kyy`aB2>-a|P_lPIcXC z966Awd?`FEL{4(jF!}L0sVCp_i?_$o1g+ec`7~=XiT2belt2-by73f6$}k5hQgS+7 zTW_vWP@-&_BIhQ37p`e$EvOW~0`j#@CJp&wwinM-*S0uz_@7#}sv9A(UTxhO0J;=U zLQ7gqUwG#TT9aZDK)Uf@OpwD&DjF36w^H&9pyF4?E5JrUpqa07Tj||*xfA(4Q*CjX z699YgOrar}^Sv6f$dSftT~E02AJhpimg(d0jWe}Y z0Cu~Vf^D;C63vJ2E&R?ttgF#lByOcOfeTCRsIpE7?MoL9-(6eU+N@z90OjG=2?yCt zLi)3>wr0$ptM z^n3yAWH`_m{q)Zl5K=Oi*v0sK;S(RQ3P+Ln_<3a#L-%>6=T-iGZvg)Bpf_fxCsBOx zVgWNHMMcoZey0y(Rn`#7$x#zY3_V+2yEA|Wdfy67Y?v8FT-D8~Uu8Isgc*uK}v8Hypx4av||4NQ#0$}9b`VjW$%sdZbOb|@g$;2MZW z+p#oG)IWaFm4|5z(OPR`>C3-Xyj56qku=+^Q!>w*Z)L68vTOA=3sNln<|Xo6ZLM9q zL53-*k>RK?_4bJtg=%m;JPhv7Jo3;LhDgO}&hWnP0o9b1kAC86Y58vUGgRIvIbBwb zOWa)DI9&@svUw9o^YTP`d*^wL{B|iALKVpXBHjRaqcu#efw<+bUqpv|l_aKF4}+u$fyt6D=wz`lJb{3c zXp@b`=0Vf(#>**WsyrXEVU{c=@PmbOuJ8uT=M}1Y*UZey>obYejb;zgcU-Az4M23T z0^+>BQvrATQzKqY9-?|&skhpjw>4VJMsKvafmiltd2(v+J0%c2(VtXwl4Y@Ls$PBv)ZEdLw^8jr>BQ4Q|p_k;-l<-(`r0%)G z4WB2H=!tKt`Hca%+2oj6tH5lz0j9ZlTXZa9^*A}Po>%I%HPQ6zKVSHR*UU$~#<;#y zHEI7Uqka1L#6*HnTR?q-1%UvAmJ@`4Xqi-HLz0q8lEGA}D7jQ8G8C;F{YvhM6^^Qu zdX>^~mJf0b&xGWoZNsp9Bs1+VVM>@4z?LmZ(|I(uQ}x1Rt&ng2>?c-8c11R00MUl$ zAR;Sz)y*G1^KRAi>vCq;NT{#>H zbu>sHcZG+N)AA`xcb^U=h76v42)+<>`vL^!ctG)Q#HN1y!#YBtPvgc4FiF(OO$|-t zHQ;6?NX|RmVCo)-(E`2r<7wepMuU&Jq48SaC;`#CFM|qb)9Ik8%?Roj&ui9|F|1r~Spklb>s=j0}OE5qn`Q)m~e&B*1ah zQeKR~w51TE2IaX$+>@b3L(FtmTB>ebQ#)2)3t*HEjFUC$-S+_0Ll)#Cb}q zN8Oy^u#$mS`b8KWI;B7a!F2+Xw~vg`!i2G~Ms<~%b3ZUlv-f*^bNN=(-z4&FqAUfG z0Ic?33zkXY#J$}YQvH&drbEDitHP^(J-#WqPT-cq{Nn?*b_A3T?32WPB#$&a8-1ew|&))Av z`F+jP{#)^Tl(r2|Q)U20yRVBfjMVzSiGpw0XxC3~)Rw_G816js-<}om_nU8hK*XE$ys)Iy}5bLctC5Vx>O6mTk}mJ9;v__sh=qv zBRZr-GFi&>=Mo5#!)|?JxlY*ybxQ~zxwi;E*)#s`TI-An=%bl9a4v$b%%CJSx|QtLd=HPi^e>Hg;3vq7r5Z% zkRV+CZC67Ys<<#5Qi-1KD2Ez$(E<=@E1zCCZ}ueG&v6E z_}OYR0Knkguv!R+Yc2dmmwiD zr$364p~eW02C(~&fd+EzzIQ~lV(XI&8Vxd>=6l7OY1kk(lry{0Ggkm#FL;1gf8`ht_;e}JRAxyZXvc!9LG+T#-{^P$WP|H3ct zP@X&*Q=Sa`F$3+_FqQ`z^op1)btJEobATKfYnd*U;oZ`lo*_fxY0g;JY8$8NR1KmI zJ_(W8J^c(m%7PYh2*x14Uylo;F1utpuR&txDb>LIXJ1Ck_lLczoXhkbZ@?4{q!p^% zQIlnsmzPgS1>W(Bb*iZ_Ogk+4YbmwpPy}k!da>gh1cxH``-6tGZ{EqPcXD0NaKyw6 ztY(i2p~2GUiYBvFpOhLXX$3Qy#fNj{O8RQn2wJEAohG@ zpJP2pP2OZURc+Uo`2AF%baUV{K1bU4V$E&1G|eY^dF`$MVBP%!nz{3G<3W#IC;%rT zr|Yx==;?aQfx9>@oya(+y@H+571xX6Q0!E@#e3+i+s%JFjG zCx~M@&Js>b&jiQP(os_O##m-A>N-vBQbKeH;!hMQ>M#%zy}}dg1dAtbyg}NcL8|*T zP%W`@g4PUM@_bqK&$(;plO?ksO>7$L_}Ff zN%JhOZ;^D7pUY+^Mv{qAPoU7r&wFY$H6wb&0O#7OqHy1KT=WHu{sMUCw)$@2o*r%a~ismG~Nn;u&qcGXr?pYEjQor?OV0hIcvmL z0I1RxU~Xzi*^F)n!025C#j@F`Ab{Cyg8(@IoYfpg7+cfMIf7HBY6fTqV8FIAPUE9D zZjlFpi`=syS*W8>;-+icCqr;t->>O?)DV8NV7c0A*N)WJC_x5+ZakqC`jIImI47Gc z=;^CW+`N(l1IbHP(-8%+-Zw(m(rD@zWPHd->Q`-}Y@}jfWX!h;c$R6Xzm@EPtfh+~ zhdl2kmynWyGb+0zIOvKZ**P;vmVHF|*R3^91rR^~O|eF9RyS!cQTD+g1!kNxG&G-_ zaIxl@A}Ce98HyLBkp5IDA-NZw%|psbVlLu^P)#y(zG{w{LsjtB1&`rQQEg0zM#ech zz5fvar}$jR%zb97&UHhAv6s=3HK$HCs`7Cp`K1le>XzaxJMQsAYt%*<;JLvO@XY0A z&+FplRfZ1S;e;96BC+j_*d3Jf8jCV_nkhkDzfheWphMyC0F{tBU@_dGdx9~*1$32D zcN!<`Qloh;fQ-FG$V!rs0Zw|N$zl7d@)c%7-uk@wb<&EeX$9CC$Hc+qWsZj@TD4jL zCd$`)%#hM3kpfnjbd0-f8Xyv2f8m$DMj6^u$Uu`Oy%s8bb#DZJY#`cN2Ya-GNBmNZ zeCQcckcHe^rw{%-PBqt3i{*Md0I}jRAsSY}T5W|5=FON^{q!o2xl{~cYF;@VN7?S& zf#BdKNXwv2g$Of(y-J?Fx^Fj?Gu+T<+_}{ZK(JYkl{m)eLdAvUaniBB1pqJIs?r(H zG5Nzqb)5{laH$Sf6Qe6a2bduRw2igpqisGkGcte3Yg(tjm?7V*At9X?AvT41r#@se>E={RSXCY>AJj5>! zzB(^)MDn0Lyf`>Q5tQ;TjHM`V)rC1od8;l-O2p6rv`TmSG%=N^K4mYOfs{%Sl!j}u z6h+D~2PslU-W>#~OBW8AB^88n>mVpsgDVXQS93ZwqFw|<3kaY}6!4{Ph2sr8YIMV* z7e(|Fy~E~(GwRLefCJE86kNI8c;un0tXcHj8?T%_@(}MJcjI@on&6aMU)?v zFvJX)Xl_JQr;;)=6rD)aSZ+)h_L|5%cIYqEt%~p!<;T~L5#Sp(Wx9L==kE(u`%VBD z>qQy#wZ%Gdhv!jJD*6~Yz|S?tC;~QzBBF#+Wm;YiK%f{Uqym{he!K>Y&K3SdB2tvv zc(I5SNOYp4)VLlgYvLqYX_B3)E}29ElzLH$5N;|N1QcL{C@92;f=a-Z*~}($K!dc$1ahn>W?`J7 z@F2x4JSe;q8pS0HM(vrVJ##~-IVl6*1MokhJzaG0icgf(SUrIb@Qba8ld4Y`I@TkS z2&Ktn-eok)Q;WJhL8lU>r(U6QC56GUa{07CqaUReBU=)&RM|F`AsWa8?T9L8C7L4z z63r;7SxUxt>w!WyN=b#HGDxQ}3Zbc7kpSof7X*e;LMoCFvc8x^Db-%~<$O@d(R7;YHIz?`gX1-1IRi({t%#9SLp6^x ztD`v9=r8_@2!=NrqW2JX8>B7Sn>K1Utps4M8)b4teYDuKQat^Ee_BmMgQNUE%kF-u z@y%<4R8-9;azBA;E$d*pd?ro5%z8w@A>OTumo(T)(EJ7aa|a{$WyCB4T8RMYy!S08{#FG@_sG8ZREraPyXBxE;S!J5;maw-ce3m~1p zJEB>Y7c5xw;-UuSfrcse>{b=D4R_FbIv6NL8Btx(m4E8!zmC_{%}f0nTX6KsS5Q3i zkOUTev0eg8Ua#|*N@b2!uvj`LI?FiL$_22-cVr4{C*7$q>e7l!(#?y@!tJWN1|V9x z2n}ln5TTnjto+stBMP8l3Qi#n&=9Q*xX~o4g0wkFTHu$NAbSNm7|Ac3PUci6w8^^V z%!Rms#dN>E2o>dOY_tMPU?u+|n8l-ZhqfGe#;Pb|rg-9rxvFM?KspiP4FDR}03ngA z^6_$4RHg|uZC|B^JSE5l&c@FS^Nyv?49ricI$yvG?@_kWRBd?zFO_?sYiDk63P7tT zRjd34maw&|VFMDS=o%tfU58|{UY#V=B)Y~u79vpxl7YAJ+LnfjTp_83Ox3H<2i?;7 zQO(Z6Uk#&He@UE9psZ`DZxjqx!042U$~@B^6in-YhBj#CE1WR5-Jn15$$3kUv`Iu#h&?1#2 z(p8?jx=dZ1icrwXxU7lb6fCeYW>l>q#7qI`{C3*hSE$?Ii# z`&~w6v+Ju(!JBspzS-n66~ZGAJ=>PTns%G(N$9u5Li4M3=dUCd#0kD@Gf!U$NPVL#sm57rq}i9QqbC#u!; zPjdYWU3`+H;0avEm@a^J^UyLR9Pd0DkigQkQ;La$=m5l@u!xkz<^*aoFARgh;JYJJ ze?l!~zIu1lfG^h&n%kiLgefVB%Sn{9wSJ23HUN(U@EY$;a_+6=p*`B>LfG59q}~ph znR&O>soQRNC!T5rez2(RKhwG*ee=oi4xW22j@URn*RPUOm=WgfT-WF>+}k;=J92K{ zEyO?listfeH`A%KEaT=taK96kV!Wp!V1*Zh<=WDkZcsEo+xjpmob6ZCAUdtWm02*E z``+1vc#q#oLHXU&76l;5LKL$9Kla`QPR^{V7u^}FG(O-IAQ~TFS-{W<(CJJvnT!Z_ zo|9o-MLP3<8LnOFu1*)JuBxf3PSP_;ruBHo_@q_DpaB{c374a^FDA-4-acGC<_Kzg zIUe)#_-H*I8M%rLJ{S=3{P*L(zWsgmeO=Gg;Qh&Oe$4c$sn zW7Q&Rgbq55y}FaikI@M6ea6+S#qHu-j3W%%aS+3I(rugVrioTFYP9m?V4Bxc?*B(4 zc#@4fa3EfR60whQM=>9cp7Sr2J5WNt>c^S=Ost7 zvis2C3W=1>OmwTS6MHb64*8G2C1OfZENHtVLG5%hTgnwB)S{9^BiRq_=2YAc z?RE>8#_Vy&f`vfQ8&L?NtOvoiV+#fw=KC@Q_oWcV*iyvyVi8=?Q$3@XUGAK5#oXZV zds=pv?b9_~F9$J;sm5B_Agi`XmszFu-w!pL2aLUgx`BCc!_7c~$2HPH-P0uDaPp+; z-KPD@GzCpS)z_mYkQRxUz_yAklzTR?4I`O>GXkiXEy&!0Rsb2vq@G)ki^>znm*AEZM>lsdEriTBqC!NeAhIP%Y1@7fBx3{xWq&xa@%kT? zYQ98DT8T;&6$dmb>HeX+j-sTss6=Tw>5(po2OZLc8WWa+%rojfn>Q;_Q2O|fL@X_O zdnl~Gw!i?{TkDD9Xxs4B8fFf-$ipF+j3N6!iwYCc$-puPuPZUL|A5CgEeaaY{A)S76?g79w z?mBimB(u5CB)kf^snQ+@3SWGi10hGQ#)HzKkK<@ga75PywRiUQW7f(E7-gphguQbO|#M4PkC`|571G6gM01rAIrPZ))4M1>8o zt>&?zTpyLe>mC%7d3(f|qMJ)dTVCK+mH=S?b@?#v_atKzVNW>(;-dAs{vn_@vR+p3d)u!>;AtI8=ACEMW*v28U zmXWy=A%T1?Fblc|&kH4iY8TMX;E72FGlE)*f)jJ~7tDNFl%aki$q=!DEV%UH;a%>* z=$5-C$Z|zk>szf4-0YU>8+yjxDkKv7Pzdh}Q0~%CMcSuR{s?1cObTx6iJH(F(0Bu-tVN~C zg9gqUg2xgPxEbS-P4+!q8c)Qvc|Rd4TsyXTFTuHklRHWIbcc_0yy%C4#R6r*V!8a!=ielEH;^ftd4m`rLvo7KIWZ&1N{X||5E@5A_ za6aJ#PZ9uq;;*~%39__K;drh7UtKCCGJ9|eA~4U8Q1a6IBVN&|gigFd9tVM2I5}%k zdGb6+2X5i`S-)_MvOn9U2}NKJeqr|raqMuCCy9WL@!XfoKEyGbX>2wU3Qy}9j@jzZ zb*YvJ?ZGnyf^`iidg%iZ*XUG4C$8Z{+Cjt#T8j#lw_G~#4KlRO;W%Y~zDp~L#J0|H z5~=$9iBVjSvU9pRb*fnBziOvW?wrReMq~8oJZ@+?H1D1!CzjO@(X7)*gg^L!=<_bY zEUN<%_SQMaarr+v&KTu_bhUw#l~c{^V>e0BCj7Ec82-IG19_>=KpBPg9H z@1g_ulbvrWm-5vA9V^!*tYI8&64pTDhi`q;rot(7B_#X}gHXDiXo}oe_4O9fPH*|U zgGAkPl9RL5=|*GcLSe2vs$XI;?~hT^>NO`ZHLtf*tX#;Q`qdYhD@`l`7hS%T1U?dj zTOavSqP$6h`xJ#{Zq4-WQVc(BhK*(52E=ZS@TaU+C@Ph?gTruuHkb^1$8 za7w`Gc$yGJW{bZ?q#>r=#2>%i1vWB2vd;W=FCy4TBXZ(<6I

        FU&N?qOfd8==4Z< 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ⅇIIwe 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

        B0uPT{U^VtTRUdeCpLq|At_YK0Ik&Dj zvL#d52ei*x^xqvXxRD3Vfvx3sz~@QFO4Yn7YzQ5Wb_&Xw!bFk3bcgR=+u3=Ae%G

        Xj48r~Vt({6vgGAM9+p_bH$6SdHJy=# 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

        ?GmNA|KTD(CY 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%0D)N4&u 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

        o$K4abKg^t@=z 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

        kubelet.loggoogle.log
        `, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
        kubelet.loggoogle.log
        `, - contentType: "text/html", - forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", - }, - "full document": { - input: `
        kubelet.loggoogle.log
        `, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
        kubelet.loggoogle.log
        `, - contentType: "text/html", - forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", - }, - "trailing slash": { - input: `
        kubelet.loggoogle.log
        `, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
        kubelet.loggoogle.log
        `, - contentType: "text/html", - forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", - }, - "content-type charset": { - input: `
        kubelet.loggoogle.log
        `, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
        kubelet.loggoogle.log
        `, - contentType: "text/html; charset=utf-8", - forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", - }, - "content-type passthrough": { - input: `
        kubelet.loggoogle.log
        `, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
        kubelet.loggoogle.log
        `, - contentType: "text/plain", - forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", - }, - "subdir": { - input: `kubelet.loggoogle.log`, - sourceURL: "http://myminion.com/whatever/apt/somelog.log", - transport: testTransport2, - output: `kubelet.loggoogle.log`, - contentType: "text/html", - forwardedURI: "/proxy/minion/minion1:8080/whatever/apt/somelog.log", - }, - "image": { - input: `
        `, - sourceURL: "http://myminion.com/", - transport: testTransport, - output: `
        `, - contentType: "text/html", - forwardedURI: "/proxy/minion/minion1:10250/", - }, - "abs": { - input: `

        6xV6ekm!-2|5;3|Enys8dvCjS<1#~>8~W^ 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 diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl_test.go deleted file mode 100644 index 1cd69d11e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl_test.go +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "testing" -) - -func TestParseFileSource(t *testing.T) { - cases := []struct { - name string - input string - key string - filepath string - err bool - }{ - { - name: "success 1", - input: "boo=zoo", - key: "boo", - filepath: "zoo", - err: false, - }, - { - name: "success 2", - input: "boo=/path/to/zoo", - key: "boo", - filepath: "/path/to/zoo", - err: false, - }, - { - name: "success 3", - input: "boo-2=/1/2/3/4/5/zab.txt", - key: "boo-2", - filepath: "/1/2/3/4/5/zab.txt", - err: false, - }, - { - name: "success 4", - input: "boo-=this/seems/weird.txt", - key: "boo-", - filepath: "this/seems/weird.txt", - err: false, - }, - { - name: "success 5", - input: "-key=some/path", - key: "-key", - filepath: "some/path", - err: false, - }, - { - name: "invalid 1", - input: "key==some/path", - err: true, - }, - { - name: "invalid 2", - input: "=key=some/path", - err: true, - }, - { - name: "invalid 3", - input: "==key=/some/other/path", - err: true, - }, - { - name: "invalid 4", - input: "=key", - err: true, - }, - { - name: "invalid 5", - input: "key=", - err: true, - }, - } - - for _, tc := range cases { - key, filepath, err := parseFileSource(tc.input) - if err != nil { - if tc.err { - continue - } - - t.Errorf("%v: unexpected error: %v", tc.name, err) - continue - } - - if tc.err { - t.Errorf("%v: unexpected success", tc.name) - continue - } - - if e, a := tc.key, key; e != a { - t.Errorf("%v: expected key %v; got %v", tc.name, e, a) - continue - } - - if e, a := tc.filepath, filepath; e != a { - t.Errorf("%v: expected filepath %v; got %v", tc.name, e, a) - } - } -} - -func TestParseLiteralSource(t *testing.T) { - cases := []struct { - name string - input string - key string - value string - err bool - }{ - { - name: "success 1", - input: "key=value", - key: "key", - value: "value", - err: false, - }, - { - name: "success 2", - input: "key=value/with/slashes", - key: "key", - value: "value/with/slashes", - err: false, - }, - { - name: "err 1", - input: "key==value", - key: "key", - value: "=value", - err: false, - }, - { - name: "err 2", - input: "key=value=", - key: "key", - value: "value=", - err: false, - }, - { - name: "err 3", - input: "key2=value==", - key: "key2", - value: "value==", - err: false, - }, - { - name: "err 4", - input: "==key", - err: true, - }, - { - name: "err 5", - input: "=key=", - err: true, - }, - } - - for _, tc := range cases { - key, value, err := parseLiteralSource(tc.input) - if err != nil { - if tc.err { - continue - } - - t.Errorf("%v: unexpected error: %v", tc.name, err) - continue - } - - if tc.err { - t.Errorf("%v: unexpected success", tc.name) - continue - } - - if e, a := tc.key, key; e != a { - t.Errorf("%v: expected key %v; got %v", tc.name, e, a) - continue - } - - if e, a := tc.value, value; e != a { - t.Errorf("%v: expected value %v; got %v", tc.name, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/namespace_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/namespace_test.go deleted file mode 100644 index b0445bd29..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/namespace_test.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestNamespaceGenerate(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *api.Namespace - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - }, - expected: &api.Namespace{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{}, - expectErr: true, - }, - } - generator := NamespaceGeneratorV1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.Namespace), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.Namespace)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/proxy_server_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/proxy_server_test.go deleted file mode 100644 index 79d1365a3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/proxy_server_test.go +++ /dev/null @@ -1,333 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "path/filepath" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/client/restclient" -) - -func TestAccept(t *testing.T) { - tests := []struct { - acceptPaths string - rejectPaths string - acceptHosts string - path string - host string - method string - expectAccept bool - }{ - - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "127.0.0.1", - method: "GET", - expectAccept: true, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "localhost", - method: "GET", - expectAccept: true, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods/foo/exec", - host: "127.0.0.1", - method: "GET", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods/foo/attach", - host: "127.0.0.1", - method: "GET", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "evil.com", - method: "GET", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "localhost.evil.com", - method: "GET", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "127a0b0c1", - method: "GET", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/ui", - host: "localhost", - method: "GET", - expectAccept: true, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods", - host: "localhost", - method: "POST", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods/somepod", - host: "localhost", - method: "PUT", - expectAccept: false, - }, - { - acceptPaths: DefaultPathAcceptRE, - rejectPaths: DefaultPathRejectRE, - acceptHosts: DefaultHostAcceptRE, - path: "/api/v1/pods/somepod", - host: "localhost", - method: "PATCH", - expectAccept: false, - }, - } - for _, test := range tests { - filter := &FilterServer{ - AcceptPaths: MakeRegexpArrayOrDie(test.acceptPaths), - RejectPaths: MakeRegexpArrayOrDie(test.rejectPaths), - AcceptHosts: MakeRegexpArrayOrDie(test.acceptHosts), - RejectMethods: MakeRegexpArrayOrDie(DefaultMethodRejectRE), - } - accept := filter.accept(test.method, test.path, test.host) - if accept != test.expectAccept { - t.Errorf("expected: %v, got %v for %#v", test.expectAccept, accept, test) - } - } -} - -func TestRegexpMatch(t *testing.T) { - tests := []struct { - str string - regexps string - expectMatch bool - }{ - { - str: "foo", - regexps: "bar,.*", - expectMatch: true, - }, - { - str: "foo", - regexps: "bar,fo.*", - expectMatch: true, - }, - { - str: "bar", - regexps: "bar,fo.*", - expectMatch: true, - }, - { - str: "baz", - regexps: "bar,fo.*", - expectMatch: false, - }, - } - for _, test := range tests { - match := matchesRegexp(test.str, MakeRegexpArrayOrDie(test.regexps)) - if test.expectMatch != match { - t.Errorf("expected: %v, found: %v, for %s and %v", test.expectMatch, match, test.str, test.regexps) - } - } -} - -func TestFileServing(t *testing.T) { - const ( - fname = "test.txt" - data = "This is test data" - ) - dir, err := ioutil.TempDir("", "data") - if err != nil { - t.Fatalf("error creating tmp dir: %v", err) - } - if err := ioutil.WriteFile(filepath.Join(dir, fname), []byte(data), 0755); err != nil { - t.Fatalf("error writing tmp file: %v", err) - } - - const prefix = "/foo/" - handler := newFileHandler(prefix, dir) - server := httptest.NewServer(handler) - defer server.Close() - - url := server.URL + prefix + fname - res, err := http.Get(url) - if err != nil { - t.Fatalf("http.Get(%q) error: %v", url, err) - } - defer res.Body.Close() - - if res.StatusCode != http.StatusOK { - t.Errorf("res.StatusCode = %d; want %d", res.StatusCode, http.StatusOK) - } - b, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatalf("error reading resp body: %v", err) - } - if string(b) != data { - t.Errorf("have %q; want %q", string(b), data) - } -} - -func TestAPIRequests(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadAll(r.Body) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - fmt.Fprintf(w, "%s %s %s", r.Method, r.RequestURI, string(b)) - })) - defer ts.Close() - - // httptest.NewServer should always generate a valid URL. - target, _ := url.Parse(ts.URL) - proxy := newProxy(target) - - tests := []struct{ method, body string }{ - {"GET", ""}, - {"DELETE", ""}, - {"POST", "test payload"}, - {"PUT", "test payload"}, - } - - const path = "/api/test?fields=ID%3Dfoo&labels=key%3Dvalue" - for i, tt := range tests { - r, err := http.NewRequest(tt.method, path, strings.NewReader(tt.body)) - if err != nil { - t.Errorf("error creating request: %v", err) - continue - } - w := httptest.NewRecorder() - proxy.ServeHTTP(w, r) - if w.Code != http.StatusOK { - t.Errorf("%d: proxy.ServeHTTP w.Code = %d; want %d", i, w.Code, http.StatusOK) - } - want := strings.Join([]string{tt.method, path, tt.body}, " ") - if w.Body.String() != want { - t.Errorf("%d: response body = %q; want %q", i, w.Body.String(), want) - } - } -} - -func TestPathHandling(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, r.URL.Path) - })) - defer ts.Close() - - table := []struct { - prefix string - reqPath string - expectPath string - }{ - {"/api/", "/metrics", "404 page not found\n"}, - {"/api/", "/api/metrics", "/api/metrics"}, - {"/api/", "/api/v1/pods/", "/api/v1/pods/"}, - {"/", "/metrics", "/metrics"}, - {"/", "/api/v1/pods/", "/api/v1/pods/"}, - {"/custom/", "/metrics", "404 page not found\n"}, - {"/custom/", "/api/metrics", "404 page not found\n"}, - {"/custom/", "/api/v1/pods/", "404 page not found\n"}, - {"/custom/", "/custom/api/metrics", "/api/metrics"}, - {"/custom/", "/custom/api/v1/pods/", "/api/v1/pods/"}, - } - - cc := &restclient.Config{ - Host: ts.URL, - } - - for _, item := range table { - func() { - p, err := NewProxyServer("", item.prefix, "/not/used/for/this/test", nil, cc) - if err != nil { - t.Fatalf("%#v: %v", item, err) - } - pts := httptest.NewServer(p.handler) - defer pts.Close() - - r, err := http.Get(pts.URL + item.reqPath) - if err != nil { - t.Fatalf("%#v: %v", item, err) - } - body, err := ioutil.ReadAll(r.Body) - r.Body.Close() - if err != nil { - t.Fatalf("%#v: %v", item, err) - } - if e, a := item.expectPath, string(body); e != a { - t.Errorf("%#v: Wanted %q, got %q", item, e, a) - } - }() - } -} - -func TestExtractHost(t *testing.T) { - fixtures := map[string]string{ - "localhost:8085": "localhost", - "marmalade": "marmalade", - } - for header, expected := range fixtures { - host := extractHost(header) - if host != expected { - t.Fatalf("%s != %s", host, expected) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/builder_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/builder_test.go deleted file mode 100644 index 15abe6fe8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/builder_test.go +++ /dev/null @@ -1,1243 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "reflect" - "strings" - "testing" - - "github.com/ghodss/yaml" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/streaming" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/pkg/watch/versioned" -) - -func stringBody(body string) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(body))) -} - -func watchBody(events ...watch.Event) string { - buf := &bytes.Buffer{} - codec := testapi.Default.Codec() - enc := versioned.NewEncoder(streaming.NewEncoder(buf, codec), codec) - for _, e := range events { - enc.Encode(&e) - } - return buf.String() -} - -func fakeClient() ClientMapper { - return ClientMapperFunc(func(*meta.RESTMapping) (RESTClient, error) { - return &fake.RESTClient{}, nil - }) -} - -func fakeClientWith(testName string, t *testing.T, data map[string]string) ClientMapper { - return ClientMapperFunc(func(*meta.RESTMapping) (RESTClient, error) { - return &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - p := req.URL.Path - q := req.URL.RawQuery - if len(q) != 0 { - p = p + "?" + q - } - body, ok := data[p] - if !ok { - t.Fatalf("%s: unexpected request: %s (%s)\n%#v", testName, p, req.URL, req) - } - return &http.Response{ - StatusCode: http.StatusOK, - Body: stringBody(body), - }, nil - }), - }, nil - }) -} - -func testData() (*api.PodList, *api.ServiceList) { - pods := &api.PodList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "15", - }, - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - svc := &api.ServiceList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "16", - }, - Items: []api.Service{ - { - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Type: "ClusterIP", - SessionAffinity: "None", - }, - }, - }, - } - return pods, svc -} - -func streamTestData() (io.Reader, *api.PodList, *api.ServiceList) { - pods, svc := testData() - r, w := io.Pipe() - go func() { - defer w.Close() - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), pods))) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), svc))) - }() - return r, pods, svc -} - -func JSONToYAMLOrDie(in []byte) []byte { - data, err := yaml.JSONToYAML(in) - if err != nil { - panic(err) - } - return data -} - -func streamYAMLTestData() (io.Reader, *api.PodList, *api.ServiceList) { - pods, svc := testData() - r, w := io.Pipe() - go func() { - defer w.Close() - w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), pods)))) - w.Write([]byte("\n---\n")) - w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), svc)))) - }() - return r, pods, svc -} - -func streamTestObject(obj runtime.Object) io.Reader { - r, w := io.Pipe() - go func() { - defer w.Close() - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), obj))) - }() - return r -} - -type testVisitor struct { - InjectErr error - Infos []*Info -} - -func (v *testVisitor) Handle(info *Info, err error) error { - if err != nil { - return err - } - v.Infos = append(v.Infos, info) - return v.InjectErr -} - -func (v *testVisitor) Objects() []runtime.Object { - objects := []runtime.Object{} - for i := range v.Infos { - objects = append(objects, v.Infos[i].Object) - } - return objects -} - -var aPod string = ` -{ - "kind": "Pod", - "apiVersion": "` + testapi.Default.GroupVersion().String() + `", - "metadata": { - "name": "busybox{id}", - "labels": { - "name": "busybox{id}" - } - }, - "spec": { - "containers": [ - { - "name": "busybox", - "image": "busybox", - "command": [ - "sleep", - "3600" - ], - "imagePullPolicy": "IfNotPresent" - } - ], - "restartPolicy": "Always" - } -} -` - -var aRC string = ` -{ - "kind": "ReplicationController", - "apiVersion": "` + testapi.Default.GroupVersion().String() + `", - "metadata": { - "name": "busybox{id}", - "labels": { - "app": "busybox" - } - }, - "spec": { - "replicas": 1, - "template": { - "metadata": { - "name": "busybox{id}", - "labels": { - "app": "busybox{id}" - } - }, - "spec": { - "containers": [ - { - "name": "busybox", - "image": "busybox", - "command": [ - "sleep", - "3600" - ], - "imagePullPolicy": "IfNotPresent" - } - ], - "restartPolicy": "Always" - } - } - } -} -` - -func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, false, "../../../docs/user-guide/update-demo/kitten-rc.yaml") - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || !singular || len(test.Infos) != 1 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - - info := test.Infos[0] - if info.Name != "update-demo-kitten" || info.Namespace != "" || info.Object == nil { - t.Errorf("unexpected info: %#v", info) - } - version, ok := info.VersionedObject.(*v1.ReplicationController) - // versioned object does not have defaulting applied - if info.VersionedObject == nil || !ok || version.Spec.Replicas != nil { - t.Errorf("unexpected versioned object: %#v", info.VersionedObject) - } -} - -func TestNodeBuilder(t *testing.T) { - node := &api.Node{ - ObjectMeta: api.ObjectMeta{Name: "node1", Namespace: "should-not-have", ResourceVersion: "10"}, - Spec: api.NodeSpec{}, - Status: api.NodeStatus{ - Capacity: api.ResourceList{ - api.ResourceCPU: resource.MustParse("1000m"), - api.ResourceMemory: resource.MustParse("1Mi"), - }, - }, - } - r, w := io.Pipe() - go func() { - defer w.Close() - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), node))) - }() - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").Stream(r, "STDIN") - - test := &testVisitor{} - - err := b.Do().Visit(test.Handle) - if err != nil || len(test.Infos) != 1 { - t.Fatalf("unexpected response: %v %#v", err, test.Infos) - } - info := test.Infos[0] - if info.Name != "node1" || info.Namespace != "" || info.Object == nil { - t.Errorf("unexpected info: %#v", info) - } -} - -func createTestDir(t *testing.T, path string) { - if err := os.MkdirAll(path, 0750); err != nil { - t.Fatalf("error creating test dir: %v", err) - } -} - -func writeTestFile(t *testing.T, path string, contents string) { - if err := ioutil.WriteFile(path, []byte(contents), 0644); err != nil { - t.Fatalf("error creating test file %#v", err) - } -} - -func TestPathBuilderWithMultiple(t *testing.T) { - // create test dirs - tmpDir, err := utiltesting.MkTmpdir("recursive_test_multiple") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - createTestDir(t, fmt.Sprintf("%s/%s", tmpDir, "recursive/pod/pod_1")) - createTestDir(t, fmt.Sprintf("%s/%s", tmpDir, "recursive/rc/rc_1")) - createTestDir(t, fmt.Sprintf("%s/%s", tmpDir, "inode/hardlink")) - defer os.RemoveAll(tmpDir) - - // create test files - writeTestFile(t, fmt.Sprintf("%s/recursive/pod/busybox.json", tmpDir), strings.Replace(aPod, "{id}", "0", -1)) - writeTestFile(t, fmt.Sprintf("%s/recursive/pod/pod_1/busybox.json", tmpDir), strings.Replace(aPod, "{id}", "1", -1)) - writeTestFile(t, fmt.Sprintf("%s/recursive/rc/busybox.json", tmpDir), strings.Replace(aRC, "{id}", "0", -1)) - writeTestFile(t, fmt.Sprintf("%s/recursive/rc/rc_1/busybox.json", tmpDir), strings.Replace(aRC, "{id}", "1", -1)) - writeTestFile(t, fmt.Sprintf("%s/inode/hardlink/busybox.json", tmpDir), strings.Replace(aPod, "{id}", "0", -1)) - if err := os.Link(fmt.Sprintf("%s/inode/hardlink/busybox.json", tmpDir), fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir)); err != nil { - t.Fatalf("error creating test file: %v", err) - } - - tests := []struct { - name string - object runtime.Object - recursive bool - directory string - expectedNames []string - }{ - {"pod", &api.Pod{}, false, "../../../examples/pod", []string{"nginx"}}, - {"recursive-pod", &api.Pod{}, true, fmt.Sprintf("%s/recursive/pod", tmpDir), []string{"busybox0", "busybox1"}}, - {"rc", &api.ReplicationController{}, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml", []string{"redis-master"}}, - {"recursive-rc", &api.ReplicationController{}, true, fmt.Sprintf("%s/recursive/rc", tmpDir), []string{"busybox0", "busybox1"}}, - {"hardlink", &api.Pod{}, false, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}}, - {"hardlink", &api.Pod{}, true, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}}, - } - - for _, test := range tests { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, test.recursive, test.directory). - NamespaceParam("test").DefaultNamespace() - - testVisitor := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(testVisitor.Handle) - if err != nil { - t.Fatalf("unexpected response: %v %t %#v %s", err, singular, testVisitor.Infos, test.name) - } - - info := testVisitor.Infos - - for i, v := range info { - switch test.object.(type) { - case *api.Pod: - if _, ok := v.Object.(*api.Pod); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" { - t.Errorf("unexpected info: %#v", v) - } - case *api.ReplicationController: - if _, ok := v.Object.(*api.ReplicationController); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" { - t.Errorf("unexpected info: %#v", v) - } - } - } - } -} - -func TestPathBuilderWithMultipleInvalid(t *testing.T) { - // create test dirs - tmpDir, err := utiltesting.MkTmpdir("recursive_test_multiple_invalid") - if err != nil { - t.Fatalf("error creating temp dir: %v", err) - } - createTestDir(t, fmt.Sprintf("%s/%s", tmpDir, "inode/symlink/pod")) - defer os.RemoveAll(tmpDir) - - // create test files - writeTestFile(t, fmt.Sprintf("%s/inode/symlink/pod/busybox.json", tmpDir), strings.Replace(aPod, "{id}", "0", -1)) - if err := os.Symlink(fmt.Sprintf("%s/inode/symlink/pod", tmpDir), fmt.Sprintf("%s/inode/symlink/pod-link", tmpDir)); err != nil { - t.Fatalf("error creating test file: %v", err) - } - if err := os.Symlink(fmt.Sprintf("%s/inode/symlink/loop", tmpDir), fmt.Sprintf("%s/inode/symlink/loop", tmpDir)); err != nil { - t.Fatalf("error creating test file: %v", err) - } - - tests := []struct { - name string - recursive bool - directory string - }{ - {"symlink", false, fmt.Sprintf("%s/inode/symlink/pod-link", tmpDir)}, - {"symlink", true, fmt.Sprintf("%s/inode/symlink/pod-link", tmpDir)}, - {"loop", false, fmt.Sprintf("%s/inode/symlink/loop", tmpDir)}, - {"loop", true, fmt.Sprintf("%s/inode/symlink/loop", tmpDir)}, - } - - for _, test := range tests { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, test.recursive, test.directory). - NamespaceParam("test").DefaultNamespace() - - testVisitor := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(testVisitor.Handle) - if err == nil { - t.Fatalf("unexpected response: %v %t %#v %s", err, singular, testVisitor.Infos, test.name) - } - } -} - -func TestDirectoryBuilder(t *testing.T) { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, false, "../../../examples/guestbook/legacy"). - NamespaceParam("test").DefaultNamespace() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) < 3 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - - found := false - for _, info := range test.Infos { - if info.Name == "redis-master" && info.Namespace == "test" && info.Object != nil { - found = true - } - } - if !found { - t.Errorf("unexpected responses: %#v", test.Infos) - } -} - -func TestNamespaceOverride(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test"}}))) - })) - defer s.Close() - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, false, s.URL). - NamespaceParam("test") - - test := &testVisitor{} - - err := b.Do().Visit(test.Handle) - if err != nil || len(test.Infos) != 1 && test.Infos[0].Namespace != "foo" { - t.Fatalf("unexpected response: %v %#v", err, test.Infos) - } - - b = NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(true, false, s.URL). - NamespaceParam("test") - - test = &testVisitor{} - - err = b.Do().Visit(test.Handle) - if err == nil { - t.Fatalf("expected namespace error. got: %#v", test.Infos) - } -} - -func TestURLBuilder(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test"}}))) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test1"}}))) - })) - defer s.Close() - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, false, s.URL). - NamespaceParam("foo") - - test := &testVisitor{} - - err := b.Do().Visit(test.Handle) - if err != nil || len(test.Infos) != 2 { - t.Fatalf("unexpected response: %v %#v", err, test.Infos) - } - info := test.Infos[0] - if info.Name != "test" || info.Namespace != "foo" || info.Object == nil { - t.Errorf("unexpected info: %#v", info) - } - - info = test.Infos[1] - if info.Name != "test1" || info.Namespace != "foo" || info.Object == nil { - t.Errorf("unexpected info: %#v", info) - } - -} - -func TestURLBuilderRequireNamespace(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Namespace: "foo", Name: "test"}}))) - })) - defer s.Close() - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - FilenameParam(false, false, s.URL). - NamespaceParam("test").RequireNamespace() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err == nil || !singular || len(test.Infos) != 0 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } -} - -func TestResourceByName(t *testing.T) { - pods, _ := testData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - }), testapi.Default.Codec()). - NamespaceParam("test") - - test := &testVisitor{} - singular := false - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } - - b.ResourceTypeOrNameArgs(true, "pods", "foo") - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || !singular || len(test.Infos) != 1 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !reflect.DeepEqual(&pods.Items[0], test.Objects()[0]) { - t.Errorf("unexpected object: %#v", test.Objects()[0]) - } - - mapping, err := b.Do().ResourceMapping() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "pods" { - t.Errorf("unexpected resource mapping: %#v", mapping) - } -} - -func TestMultipleResourceByTheSameName(t *testing.T) { - pods, svcs := testData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - "/namespaces/test/pods/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[1]), - "/namespaces/test/services/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &svcs.Items[0]), - "/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &svcs.Items[0]), - }), testapi.Default.Codec()). - NamespaceParam("test") - - test := &testVisitor{} - singular := false - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } - - b.ResourceTypeOrNameArgs(true, "pods,services", "foo", "baz") - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) != 4 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !api.Semantic.DeepDerivative([]runtime.Object{&pods.Items[0], &pods.Items[1], &svcs.Items[0], &svcs.Items[0]}, test.Objects()) { - t.Errorf("unexpected visited objects: %#v", test.Objects()) - } - - if _, err := b.Do().ResourceMapping(); err == nil { - t.Errorf("unexpected non-error") - } -} - -func TestResourceNames(t *testing.T) { - pods, svc := testData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - "/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &svc.Items[0]), - }), testapi.Default.Codec()). - NamespaceParam("test") - - test := &testVisitor{} - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } - - b.ResourceNames("pods", "foo", "services/baz") - - err := b.Do().Visit(test.Handle) - if err != nil || len(test.Infos) != 2 { - t.Fatalf("unexpected response: %v %#v", err, test.Infos) - } - if !reflect.DeepEqual(&pods.Items[0], test.Objects()[0]) { - t.Errorf("unexpected object: \n%#v, expected: \n%#v", test.Objects()[0], &pods.Items[0]) - } - if !reflect.DeepEqual(&svc.Items[0], test.Objects()[1]) { - t.Errorf("unexpected object: \n%#v, expected: \n%#v", test.Objects()[1], &svc.Items[0]) - } -} - -func TestResourceByNameWithoutRequireObject(t *testing.T) { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{}), testapi.Default.Codec()). - NamespaceParam("test") - - test := &testVisitor{} - singular := false - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } - - b.ResourceTypeOrNameArgs(true, "pods", "foo").RequireObject(false) - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || !singular || len(test.Infos) != 1 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if test.Infos[0].Name != "foo" { - t.Errorf("unexpected name: %#v", test.Infos[0].Name) - } - if test.Infos[0].Object != nil { - t.Errorf("unexpected object: %#v", test.Infos[0].Object) - } - - mapping, err := b.Do().ResourceMapping() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.GroupVersionKind.Kind != "Pod" || mapping.Resource != "pods" { - t.Errorf("unexpected resource mapping: %#v", mapping) - } -} - -func TestResourceByNameAndEmptySelector(t *testing.T) { - pods, _ := testData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - }), testapi.Default.Codec()). - NamespaceParam("test"). - SelectorParam(""). - ResourceTypeOrNameArgs(true, "pods", "foo") - - singular := false - infos, err := b.Do().IntoSingular(&singular).Infos() - if err != nil || !singular || len(infos) != 1 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, infos) - } - if !reflect.DeepEqual(&pods.Items[0], infos[0].Object) { - t.Errorf("unexpected object: %#v", infos[0]) - } - - mapping, err := b.Do().ResourceMapping() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "pods" { - t.Errorf("unexpected resource mapping: %#v", mapping) - } -} - -func TestSelector(t *testing.T) { - pods, svc := testData() - labelKey := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), - "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), svc), - }), testapi.Default.Codec()). - SelectorParam("a=b"). - NamespaceParam("test"). - Flatten() - - test := &testVisitor{} - singular := false - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } - - b.ResourceTypeOrNameArgs(true, "pods,service") - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) != 3 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !api.Semantic.DeepDerivative([]runtime.Object{&pods.Items[0], &pods.Items[1], &svc.Items[0]}, test.Objects()) { - t.Errorf("unexpected visited objects: %#v", test.Objects()) - } - - if _, err := b.Do().ResourceMapping(); err == nil { - t.Errorf("unexpected non-error") - } -} - -func TestSelectorRequiresKnownTypes(t *testing.T) { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - SelectorParam("a=b"). - NamespaceParam("test"). - ResourceTypes("unknown") - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } -} - -func TestSingleResourceType(t *testing.T) { - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - SelectorParam("a=b"). - SingleResourceType(). - ResourceTypeOrNameArgs(true, "pods,services") - - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") - } -} - -func TestResourceTuple(t *testing.T) { - expectNoErr := func(err error) bool { return err == nil } - expectErr := func(err error) bool { return err != nil } - testCases := map[string]struct { - args []string - errFn func(error) bool - }{ - "valid": { - args: []string{"pods/foo"}, - errFn: expectNoErr, - }, - "valid multiple with name indirection": { - args: []string{"pods/foo", "pod/bar"}, - errFn: expectNoErr, - }, - "valid multiple with namespaced and non-namespaced types": { - args: []string{"nodes/foo", "pod/bar"}, - errFn: expectNoErr, - }, - "mixed arg types": { - args: []string{"pods/foo", "bar"}, - errFn: expectErr, - }, - /*"missing resource": { - args: []string{"pods/foo2"}, - errFn: expectNoErr, // not an error because resources are lazily visited - },*/ - "comma in resource": { - args: []string{",pods/foo"}, - errFn: expectErr, - }, - "multiple types in resource": { - args: []string{"pods,services/foo"}, - errFn: expectErr, - }, - "unknown resource type": { - args: []string{"unknown/foo"}, - errFn: expectErr, - }, - "leading slash": { - args: []string{"/bar"}, - errFn: expectErr, - }, - "trailing slash": { - args: []string{"bar/"}, - errFn: expectErr, - }, - } - for k, testCase := range testCases { - for _, requireObject := range []bool{true, false} { - expectedRequests := map[string]string{} - if requireObject { - pods, _ := testData() - expectedRequests = map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - "/namespaces/test/pods/bar": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), - "/nodes/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &api.Node{ObjectMeta: api.ObjectMeta{Name: "foo"}}), - } - } - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith(k, t, expectedRequests), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - ResourceTypeOrNameArgs(true, testCase.args...).RequireObject(requireObject) - - r := b.Do() - - if !testCase.errFn(r.Err()) { - t.Errorf("%s: unexpected error: %v", k, r.Err()) - } - if r.Err() != nil { - continue - } - switch { - case (r.singular && len(testCase.args) != 1), - (!r.singular && len(testCase.args) == 1): - t.Errorf("%s: result had unexpected singular value", k) - } - info, err := r.Infos() - if err != nil { - // test error - continue - } - if len(info) != len(testCase.args) { - t.Errorf("%s: unexpected number of infos returned: %#v", k, info) - } - } - } -} - -func TestStream(t *testing.T) { - r, pods, rc := streamTestData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").Stream(r, "STDIN").Flatten() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) != 3 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !api.Semantic.DeepDerivative([]runtime.Object{&pods.Items[0], &pods.Items[1], &rc.Items[0]}, test.Objects()) { - t.Errorf("unexpected visited objects: %#v", test.Objects()) - } -} - -func TestYAMLStream(t *testing.T) { - r, pods, rc := streamYAMLTestData() - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").Stream(r, "STDIN").Flatten() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) != 3 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !api.Semantic.DeepDerivative([]runtime.Object{&pods.Items[0], &pods.Items[1], &rc.Items[0]}, test.Objects()) { - t.Errorf("unexpected visited objects: %#v", test.Objects()) - } -} - -func TestMultipleObject(t *testing.T) { - r, pods, svc := streamTestData() - obj, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").Stream(r, "STDIN").Flatten(). - Do().Object() - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - expected := &api.List{ - Items: []runtime.Object{ - &pods.Items[0], - &pods.Items[1], - &svc.Items[0], - }, - } - if !api.Semantic.DeepDerivative(expected, obj) { - t.Errorf("unexpected visited objects: %#v", obj) - } -} - -func TestContinueOnErrorVisitor(t *testing.T) { - r, _, _ := streamTestData() - req := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - ContinueOnError(). - NamespaceParam("test").Stream(r, "STDIN").Flatten(). - Do() - count := 0 - testErr := fmt.Errorf("test error") - err := req.Visit(func(_ *Info, _ error) error { - count++ - if count > 1 { - return testErr - } - return nil - }) - if err == nil { - t.Fatalf("unexpected error: %v", err) - } - if count != 3 { - t.Fatalf("did not visit all infos: %d", count) - } - agg, ok := err.(utilerrors.Aggregate) - if !ok { - t.Fatalf("unexpected error: %v", err) - } - if len(agg.Errors()) != 2 || agg.Errors()[0] != testErr || agg.Errors()[1] != testErr { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestSingularObject(t *testing.T) { - obj, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - FilenameParam(false, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml"). - Flatten(). - Do().Object() - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - rc, ok := obj.(*api.ReplicationController) - if !ok { - t.Fatalf("unexpected object: %#v", obj) - } - if rc.Name != "redis-master" || rc.Namespace != "test" { - t.Errorf("unexpected controller: %#v", rc) - } -} - -func TestSingularObjectNoExtension(t *testing.T) { - obj, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - FilenameParam(false, false, "../../../examples/pod"). - Flatten(). - Do().Object() - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - pod, ok := obj.(*api.Pod) - if !ok { - t.Fatalf("unexpected object: %#v", obj) - } - if pod.Name != "nginx" || pod.Namespace != "test" { - t.Errorf("unexpected pod: %#v", pod) - } -} - -func TestSingularRootScopedObject(t *testing.T) { - node := &api.Node{ObjectMeta: api.ObjectMeta{Name: "test"}, Spec: api.NodeSpec{ExternalID: "test"}} - r := streamTestObject(node) - infos, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - Stream(r, "STDIN"). - Flatten(). - Do().Infos() - - if err != nil || len(infos) != 1 { - t.Fatalf("unexpected error: %v", err) - } - - if infos[0].Namespace != "" { - t.Errorf("namespace should be empty: %#v", infos[0]) - } - n, ok := infos[0].Object.(*api.Node) - if !ok { - t.Fatalf("unexpected object: %#v", infos[0].Object) - } - if n.Name != "test" || n.Namespace != "" { - t.Errorf("unexpected object: %#v", n) - } -} - -func TestListObject(t *testing.T) { - pods, _ := testData() - labelKey := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), - }), testapi.Default.Codec()). - SelectorParam("a=b"). - NamespaceParam("test"). - ResourceTypeOrNameArgs(true, "pods"). - Flatten() - - obj, err := b.Do().Object() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - list, ok := obj.(*api.List) - if !ok { - t.Fatalf("unexpected object: %#v", obj) - } - if list.ResourceVersion != pods.ResourceVersion || len(list.Items) != 2 { - t.Errorf("unexpected list: %#v", list) - } - - mapping, err := b.Do().ResourceMapping() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if mapping.Resource != "pods" { - t.Errorf("unexpected resource mapping: %#v", mapping) - } -} - -func TestListObjectWithDifferentVersions(t *testing.T) { - pods, svc := testData() - labelKey := unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String()) - obj, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), - "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), svc), - }), testapi.Default.Codec()). - SelectorParam("a=b"). - NamespaceParam("test"). - ResourceTypeOrNameArgs(true, "pods,services"). - Flatten(). - Do().Object() - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - list, ok := obj.(*api.List) - if !ok { - t.Fatalf("unexpected object: %#v", obj) - } - // resource version differs between type lists, so it's not possible to get a single version. - if list.ResourceVersion != "" || len(list.Items) != 3 { - t.Errorf("unexpected list: %#v", list) - } -} - -func TestWatch(t *testing.T) { - _, svc := testData() - w, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/watch/namespaces/test/services/redis-master?resourceVersion=12": watchBody(watch.Event{ - Type: watch.Added, - Object: &svc.Items[0], - }), - }), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - FilenameParam(false, false, "../../../examples/guestbook/redis-master-service.yaml").Flatten(). - Do().Watch("12") - - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - defer w.Stop() - ch := w.ResultChan() - select { - case obj := <-ch: - if obj.Type != watch.Added { - t.Fatalf("unexpected watch event %#v", obj) - } - service, ok := obj.Object.(*api.Service) - if !ok { - t.Fatalf("unexpected object: %#v", obj) - } - if service.Name != "baz" || service.ResourceVersion != "12" { - t.Errorf("unexpected service: %#v", service) - } - } -} - -func TestWatchMultipleError(t *testing.T) { - _, err := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - NamespaceParam("test").DefaultNamespace(). - FilenameParam(false, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml").Flatten(). - FilenameParam(false, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml").Flatten(). - Do().Watch("") - - if err == nil { - t.Fatalf("unexpected non-error") - } -} - -func TestLatest(t *testing.T) { - r, _, _ := streamTestData() - newPod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "13"}, - } - newPod2 := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "14"}, - } - newSvc := &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "15"}, - } - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClientWith("", t, map[string]string{ - "/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), newPod), - "/namespaces/test/pods/bar": runtime.EncodeOrDie(testapi.Default.Codec(), newPod2), - "/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), newSvc), - }), testapi.Default.Codec()). - NamespaceParam("other").Stream(r, "STDIN").Flatten().Latest() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err != nil || singular || len(test.Infos) != 3 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - if !api.Semantic.DeepDerivative([]runtime.Object{newPod, newPod2, newSvc}, test.Objects()) { - t.Errorf("unexpected visited objects: %#v", test.Objects()) - } -} - -func TestReceiveMultipleErrors(t *testing.T) { - pods, svc := testData() - - r, w := io.Pipe() - go func() { - defer w.Close() - w.Write([]byte(`{}`)) - w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]))) - }() - - r2, w2 := io.Pipe() - go func() { - defer w2.Close() - w2.Write([]byte(`{}`)) - w2.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &svc.Items[0]))) - }() - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()). - Stream(r, "1").Stream(r2, "2"). - ContinueOnError() - - test := &testVisitor{} - singular := false - - err := b.Do().IntoSingular(&singular).Visit(test.Handle) - if err == nil || singular || len(test.Infos) != 2 { - t.Fatalf("unexpected response: %v %t %#v", err, singular, test.Infos) - } - - errs, ok := err.(utilerrors.Aggregate) - if !ok { - t.Fatalf("unexpected error: %v", reflect.TypeOf(err)) - } - if len(errs.Errors()) != 2 { - t.Errorf("unexpected errors %v", errs) - } -} - -func TestReplaceAliases(t *testing.T) { - tests := []struct { - name string - arg string - expected string - }{ - { - name: "no-replacement", - arg: "service", - expected: "service", - }, - { - name: "all-replacement", - arg: "all", - expected: "rc,svc,pods,pvc", - }, - { - name: "alias-in-comma-separated-arg", - arg: "all,secrets", - expected: "rc,svc,pods,pvc,secrets", - }, - } - - b := NewBuilder(testapi.Default.RESTMapper(), api.Scheme, fakeClient(), testapi.Default.Codec()) - - for _, test := range tests { - replaced := b.replaceAliases(test.arg) - if replaced != test.expected { - t.Errorf("%s: unexpected argument: expected %s, got %s", test.name, test.expected, replaced) - } - } -} - -func TestHasNames(t *testing.T) { - tests := []struct { - args []string - expectedHasName bool - expectedError error - }{ - { - args: []string{""}, - expectedHasName: false, - expectedError: nil, - }, - { - args: []string{"rc"}, - expectedHasName: false, - expectedError: nil, - }, - { - args: []string{"rc,pod,svc"}, - expectedHasName: false, - expectedError: nil, - }, - { - args: []string{"rc/foo"}, - expectedHasName: true, - expectedError: nil, - }, - { - args: []string{"rc", "foo"}, - expectedHasName: true, - expectedError: nil, - }, - { - args: []string{"rc,pod,svc", "foo"}, - expectedHasName: true, - expectedError: nil, - }, - { - args: []string{"rc/foo", "rc/bar", "rc/zee"}, - expectedHasName: true, - expectedError: nil, - }, - { - args: []string{"rc/foo", "bar"}, - expectedHasName: false, - expectedError: fmt.Errorf("when passing arguments in resource/name form, all arguments must include the resource"), - }, - } - for _, test := range tests { - hasNames, err := HasNames(test.args) - if !reflect.DeepEqual(test.expectedError, err) { - t.Errorf("expected HasName to error %v, got %s", test.expectedError, err) - } - if hasNames != test.expectedHasName { - t.Errorf("expected HasName to return %v for %s", test.expectedHasName, test.args) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/helper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/helper_test.go deleted file mode 100644 index bfb05f7f7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource/helper_test.go +++ /dev/null @@ -1,498 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" -) - -func objBody(obj runtime.Object) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), obj)))) -} - -// splitPath returns the segments for a URL path. -func splitPath(path string) []string { - path = strings.Trim(path, "/") - if path == "" { - return []string{} - } - return strings.Split(path, "/") -} - -func TestHelperDelete(t *testing.T) { - tests := []struct { - Err bool - Req func(*http.Request) bool - Resp *http.Response - HttpErr error - }{ - { - HttpErr: errors.New("failure"), - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusNotFound, - Body: objBody(&unversioned.Status{Status: unversioned.StatusFailure}), - }, - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusOK, - Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess}), - }, - Req: func(req *http.Request) bool { - if req.Method != "DELETE" { - t.Errorf("unexpected method: %#v", req) - return false - } - parts := splitPath(req.URL.Path) - if len(parts) < 3 { - t.Errorf("expected URL path to have 3 parts: %s", req.URL.Path) - return false - } - if parts[1] != "bar" { - t.Errorf("url doesn't contain namespace: %#v", req) - return false - } - if parts[2] != "foo" { - t.Errorf("url doesn't contain name: %#v", req) - return false - } - return true - }, - }, - } - for _, test := range tests { - client := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Resp: test.Resp, - Err: test.HttpErr, - } - modifier := &Helper{ - RESTClient: client, - NamespaceScoped: true, - } - err := modifier.Delete("bar", "foo") - if (err != nil) != test.Err { - t.Errorf("unexpected error: %t %v", test.Err, err) - } - if err != nil { - continue - } - if test.Req != nil && !test.Req(client.Req) { - t.Errorf("unexpected request: %#v", client.Req) - } - } -} - -func TestHelperCreate(t *testing.T) { - expectPost := func(req *http.Request) bool { - if req.Method != "POST" { - t.Errorf("unexpected method: %#v", req) - return false - } - parts := splitPath(req.URL.Path) - if parts[1] != "bar" { - t.Errorf("url doesn't contain namespace: %#v", req) - return false - } - return true - } - - tests := []struct { - Resp *http.Response - HttpErr error - Modify bool - Object runtime.Object - - ExpectObject runtime.Object - Err bool - Req func(*http.Request) bool - }{ - { - HttpErr: errors.New("failure"), - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusNotFound, - Body: objBody(&unversioned.Status{Status: unversioned.StatusFailure}), - }, - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusOK, - Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess}), - }, - Object: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - ExpectObject: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - Req: expectPost, - }, - { - Modify: false, - Object: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, - ExpectObject: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, - Resp: &http.Response{StatusCode: http.StatusOK, Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess})}, - Req: expectPost, - }, - { - Modify: true, - Object: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - ExpectObject: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - Resp: &http.Response{StatusCode: http.StatusOK, Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess})}, - Req: expectPost, - }, - } - for i, test := range tests { - client := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Resp: test.Resp, - Err: test.HttpErr, - } - modifier := &Helper{ - RESTClient: client, - Versioner: testapi.Default.MetadataAccessor(), - NamespaceScoped: true, - } - _, err := modifier.Create("bar", test.Modify, test.Object) - if (err != nil) != test.Err { - t.Errorf("%d: unexpected error: %t %v", i, test.Err, err) - } - if err != nil { - continue - } - if test.Req != nil && !test.Req(client.Req) { - t.Errorf("%d: unexpected request: %#v", i, client.Req) - } - body, err := ioutil.ReadAll(client.Req.Body) - if err != nil { - t.Fatalf("%d: unexpected error: %#v", i, err) - } - t.Logf("got body: %s", string(body)) - expect := []byte{} - if test.ExpectObject != nil { - expect = []byte(runtime.EncodeOrDie(testapi.Default.Codec(), test.ExpectObject)) - } - if !reflect.DeepEqual(expect, body) { - t.Errorf("%d: unexpected body: %s (expected %s)", i, string(body), string(expect)) - } - - } -} - -func TestHelperGet(t *testing.T) { - tests := []struct { - Err bool - Req func(*http.Request) bool - Resp *http.Response - HttpErr error - }{ - { - HttpErr: errors.New("failure"), - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusNotFound, - Body: objBody(&unversioned.Status{Status: unversioned.StatusFailure}), - }, - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusOK, - Body: objBody(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}), - }, - Req: func(req *http.Request) bool { - if req.Method != "GET" { - t.Errorf("unexpected method: %#v", req) - return false - } - parts := splitPath(req.URL.Path) - if parts[1] != "bar" { - t.Errorf("url doesn't contain namespace: %#v", req) - return false - } - if parts[2] != "foo" { - t.Errorf("url doesn't contain name: %#v", req) - return false - } - return true - }, - }, - } - for _, test := range tests { - client := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Resp: test.Resp, - Err: test.HttpErr, - } - modifier := &Helper{ - RESTClient: client, - NamespaceScoped: true, - } - obj, err := modifier.Get("bar", "foo", false) - if (err != nil) != test.Err { - t.Errorf("unexpected error: %t %v", test.Err, err) - } - if err != nil { - continue - } - if obj.(*api.Pod).Name != "foo" { - t.Errorf("unexpected object: %#v", obj) - } - if test.Req != nil && !test.Req(client.Req) { - t.Errorf("unexpected request: %#v", client.Req) - } - } -} - -func TestHelperList(t *testing.T) { - tests := []struct { - Err bool - Req func(*http.Request) bool - Resp *http.Response - HttpErr error - }{ - { - HttpErr: errors.New("failure"), - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusNotFound, - Body: objBody(&unversioned.Status{Status: unversioned.StatusFailure}), - }, - Err: true, - }, - { - Resp: &http.Response{ - StatusCode: http.StatusOK, - Body: objBody(&api.PodList{ - Items: []api.Pod{{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - }, - }), - }, - Req: func(req *http.Request) bool { - if req.Method != "GET" { - t.Errorf("unexpected method: %#v", req) - return false - } - if req.URL.Path != "/namespaces/bar" { - t.Errorf("url doesn't contain name: %#v", req.URL) - return false - } - if req.URL.Query().Get(unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String())) != labels.SelectorFromSet(labels.Set{"foo": "baz"}).String() { - t.Errorf("url doesn't contain query parameters: %#v", req.URL) - return false - } - return true - }, - }, - } - for _, test := range tests { - client := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Resp: test.Resp, - Err: test.HttpErr, - } - modifier := &Helper{ - RESTClient: client, - NamespaceScoped: true, - } - obj, err := modifier.List("bar", testapi.Default.GroupVersion().String(), labels.SelectorFromSet(labels.Set{"foo": "baz"}), false) - if (err != nil) != test.Err { - t.Errorf("unexpected error: %t %v", test.Err, err) - } - if err != nil { - continue - } - if obj.(*api.PodList).Items[0].Name != "foo" { - t.Errorf("unexpected object: %#v", obj) - } - if test.Req != nil && !test.Req(client.Req) { - t.Errorf("unexpected request: %#v", client.Req) - } - } -} - -func TestHelperReplace(t *testing.T) { - expectPut := func(path string, req *http.Request) bool { - if req.Method != "PUT" { - t.Errorf("unexpected method: %#v", req) - return false - } - if req.URL.Path != path { - t.Errorf("unexpected url: %v", req.URL) - return false - } - return true - } - - tests := []struct { - Resp *http.Response - HTTPClient *http.Client - HttpErr error - Overwrite bool - Object runtime.Object - Namespace string - NamespaceScoped bool - - ExpectPath string - ExpectObject runtime.Object - Err bool - Req func(string, *http.Request) bool - }{ - { - Namespace: "bar", - NamespaceScoped: true, - HttpErr: errors.New("failure"), - Err: true, - }, - { - Namespace: "bar", - NamespaceScoped: true, - Object: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - Resp: &http.Response{ - StatusCode: http.StatusNotFound, - Body: objBody(&unversioned.Status{Status: unversioned.StatusFailure}), - }, - Err: true, - }, - { - Namespace: "bar", - NamespaceScoped: true, - Object: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - ExpectPath: "/namespaces/bar/foo", - ExpectObject: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - Resp: &http.Response{ - StatusCode: http.StatusOK, - Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess}), - }, - Req: expectPut, - }, - // namespace scoped resource - { - Namespace: "bar", - NamespaceScoped: true, - Object: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - ExpectPath: "/namespaces/bar/foo", - ExpectObject: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - Overwrite: true, - HTTPClient: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - if req.Method == "PUT" { - return &http.Response{StatusCode: http.StatusOK, Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess})}, nil - } - return &http.Response{StatusCode: http.StatusOK, Body: objBody(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil - }), - Req: expectPut, - }, - // cluster scoped resource - { - Object: &api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - }, - ExpectObject: &api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}, - }, - Overwrite: true, - ExpectPath: "/foo", - HTTPClient: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - if req.Method == "PUT" { - return &http.Response{StatusCode: http.StatusOK, Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess})}, nil - } - return &http.Response{StatusCode: http.StatusOK, Body: objBody(&api.Node{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil - }), - Req: expectPut, - }, - { - Namespace: "bar", - NamespaceScoped: true, - Object: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, - ExpectPath: "/namespaces/bar/foo", - ExpectObject: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, - Resp: &http.Response{StatusCode: http.StatusOK, Body: objBody(&unversioned.Status{Status: unversioned.StatusSuccess})}, - Req: expectPut, - }, - } - for i, test := range tests { - client := &fake.RESTClient{ - Client: test.HTTPClient, - Codec: testapi.Default.Codec(), - Resp: test.Resp, - Err: test.HttpErr, - } - modifier := &Helper{ - RESTClient: client, - Versioner: testapi.Default.MetadataAccessor(), - NamespaceScoped: test.NamespaceScoped, - } - _, err := modifier.Replace(test.Namespace, "foo", test.Overwrite, test.Object) - if (err != nil) != test.Err { - t.Errorf("%d: unexpected error: %t %v", i, test.Err, err) - } - if err != nil { - continue - } - if test.Req != nil && !test.Req(test.ExpectPath, client.Req) { - t.Errorf("%d: unexpected request: %#v", i, client.Req) - } - body, err := ioutil.ReadAll(client.Req.Body) - if err != nil { - t.Fatalf("%d: unexpected error: %#v", i, err) - } - expect := []byte{} - if test.ExpectObject != nil { - expect = []byte(runtime.EncodeOrDie(testapi.Default.Codec(), test.ExpectObject)) - } - if !reflect.DeepEqual(expect, body) { - t.Errorf("%d: unexpected body: %s", i, string(body)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource_printer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource_printer_test.go deleted file mode 100644 index f0a30edee..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/resource_printer_test.go +++ /dev/null @@ -1,1450 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - kubectltesting "k8s.io/kubernetes/pkg/kubectl/testing" - "k8s.io/kubernetes/pkg/runtime" - yamlserializer "k8s.io/kubernetes/pkg/runtime/serializer/yaml" - "k8s.io/kubernetes/pkg/util/diff" - "k8s.io/kubernetes/pkg/util/intstr" - "k8s.io/kubernetes/pkg/util/sets" - - "github.com/ghodss/yaml" -) - -func init() { - api.Scheme.AddKnownTypes(testapi.Default.InternalGroupVersion(), &kubectltesting.TestStruct{}) - api.Scheme.AddKnownTypes(*testapi.Default.GroupVersion(), &kubectltesting.TestStruct{}) -} - -var testData = kubectltesting.TestStruct{ - Key: "testValue", - Map: map[string]int{"TestSubkey": 1}, - StringList: []string{"a", "b", "c"}, - IntList: []int{1, 2, 3}, -} - -func TestVersionedPrinter(t *testing.T) { - original := &kubectltesting.TestStruct{Key: "value"} - p := NewVersionedPrinter( - ResourcePrinterFunc(func(obj runtime.Object, w io.Writer) error { - if obj == original { - t.Fatalf("object should not be identical: %#v", obj) - } - if obj.(*kubectltesting.TestStruct).Key != "value" { - t.Fatalf("object was not converted: %#v", obj) - } - return nil - }), - api.Scheme, - *testapi.Default.GroupVersion(), - ) - if err := p.PrintObj(original, nil); err != nil { - t.Errorf("unexpected error: %v", err) - } -} - -func TestPrintDefault(t *testing.T) { - printer, found, err := GetPrinter("", "") - if err != nil { - t.Fatalf("unexpected error: %#v", err) - } - if found { - t.Errorf("no printer should have been found: %#v / %v", printer, err) - } -} - -type TestPrintType struct { - Data string -} - -func (obj *TestPrintType) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -type TestUnknownType struct{} - -func (obj *TestUnknownType) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -func TestPrinter(t *testing.T) { - //test inputs - simpleTest := &TestPrintType{"foo"} - podTest := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - podListTest := &api.PodList{ - Items: []api.Pod{ - {ObjectMeta: api.ObjectMeta{Name: "foo"}}, - {ObjectMeta: api.ObjectMeta{Name: "bar"}}, - }, - } - emptyListTest := &api.PodList{} - testapi, err := api.Scheme.ConvertToVersion(podTest, testapi.Default.GroupVersion().String()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - printerTests := []struct { - Name string - Format string - FormatArgument string - Input runtime.Object - Expect string - }{ - {"test json", "json", "", simpleTest, "{\n \"Data\": \"foo\"\n}\n"}, - {"test yaml", "yaml", "", simpleTest, "Data: foo\n"}, - {"test template", "template", "{{if .id}}{{.id}}{{end}}{{if .metadata.name}}{{.metadata.name}}{{end}}", - podTest, "foo"}, - {"test jsonpath", "jsonpath", "{.metadata.name}", podTest, "foo"}, - {"test jsonpath list", "jsonpath", "{.items[*].metadata.name}", podListTest, "foo bar"}, - {"test jsonpath empty list", "jsonpath", "{.items[*].metadata.name}", emptyListTest, ""}, - {"test name", "name", "", podTest, "pod/foo\n"}, - {"emits versioned objects", "template", "{{.kind}}", testapi, "Pod"}, - } - for _, test := range printerTests { - buf := bytes.NewBuffer([]byte{}) - printer, found, err := GetPrinter(test.Format, test.FormatArgument) - if err != nil || !found { - t.Errorf("in %s, unexpected error: %#v", test.Name, err) - } - if err := printer.PrintObj(test.Input, buf); err != nil { - t.Errorf("in %s, unexpected error: %#v", test.Name, err) - } - if buf.String() != test.Expect { - t.Errorf("in %s, expect %q, got %q", test.Name, test.Expect, buf.String()) - } - } - -} - -func TestBadPrinter(t *testing.T) { - badPrinterTests := []struct { - Name string - Format string - FormatArgument string - Error error - }{ - {"empty template", "template", "", fmt.Errorf("template format specified but no template given")}, - {"bad template", "template", "{{ .Name", fmt.Errorf("error parsing template {{ .Name, template: output:1: unclosed action\n")}, - {"bad templatefile", "templatefile", "", fmt.Errorf("templatefile format specified but no template file given")}, - {"bad jsonpath", "jsonpath", "{.Name", fmt.Errorf("error parsing jsonpath {.Name, unclosed action\n")}, - } - for _, test := range badPrinterTests { - _, _, err := GetPrinter(test.Format, test.FormatArgument) - if err == nil || err.Error() != test.Error.Error() { - t.Errorf("in %s, expect %s, got %s", test.Name, test.Error, err) - } - } -} - -func testPrinter(t *testing.T, printer ResourcePrinter, unmarshalFunc func(data []byte, v interface{}) error) { - buf := bytes.NewBuffer([]byte{}) - - err := printer.PrintObj(&testData, buf) - if err != nil { - t.Fatal(err) - } - var poutput kubectltesting.TestStruct - // Verify that given function runs without error. - err = unmarshalFunc(buf.Bytes(), &poutput) - if err != nil { - t.Fatal(err) - } - // Use real decode function to undo the versioning process. - poutput = kubectltesting.TestStruct{} - s := yamlserializer.NewDecodingSerializer(testapi.Default.Codec()) - if err := runtime.DecodeInto(s, buf.Bytes(), &poutput); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(testData, poutput) { - t.Errorf("Test data and unmarshaled data are not equal: %v", diff.ObjectDiff(poutput, testData)) - } - - obj := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - } - buf.Reset() - printer.PrintObj(obj, buf) - var objOut api.Pod - // Verify that given function runs without error. - err = unmarshalFunc(buf.Bytes(), &objOut) - if err != nil { - t.Fatalf("unexpected error: %#v", err) - } - // Use real decode function to undo the versioning process. - objOut = api.Pod{} - if err := runtime.DecodeInto(s, buf.Bytes(), &objOut); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(obj, &objOut) { - t.Errorf("Unexpected inequality:\n%v", diff.ObjectDiff(obj, &objOut)) - } -} - -func TestYAMLPrinter(t *testing.T) { - testPrinter(t, &YAMLPrinter{}, yaml.Unmarshal) -} - -func TestJSONPrinter(t *testing.T) { - testPrinter(t, &JSONPrinter{}, json.Unmarshal) -} - -func PrintCustomType(obj *TestPrintType, w io.Writer, options PrintOptions) error { - _, err := fmt.Fprintf(w, "%s", obj.Data) - return err -} - -func ErrorPrintHandler(obj *TestPrintType, w io.Writer, options PrintOptions) error { - return fmt.Errorf("ErrorPrintHandler error") -} - -func TestCustomTypePrinting(t *testing.T) { - columns := []string{"Data"} - printer := NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - printer.Handler(columns, PrintCustomType) - - obj := TestPrintType{"test object"} - buffer := &bytes.Buffer{} - err := printer.PrintObj(&obj, buffer) - if err != nil { - t.Fatalf("An error occurred printing the custom type: %#v", err) - } - expectedOutput := "Data\ntest object" - if buffer.String() != expectedOutput { - t.Errorf("The data was not printed as expected. Expected:\n%s\nGot:\n%s", expectedOutput, buffer.String()) - } -} - -func TestPrintHandlerError(t *testing.T) { - columns := []string{"Data"} - printer := NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - printer.Handler(columns, ErrorPrintHandler) - obj := TestPrintType{"test object"} - buffer := &bytes.Buffer{} - err := printer.PrintObj(&obj, buffer) - if err == nil || err.Error() != "ErrorPrintHandler error" { - t.Errorf("Did not get the expected error: %#v", err) - } -} - -func TestUnknownTypePrinting(t *testing.T) { - printer := NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - buffer := &bytes.Buffer{} - err := printer.PrintObj(&TestUnknownType{}, buffer) - if err == nil { - t.Errorf("An error was expected from printing unknown type") - } -} - -func TestTemplatePanic(t *testing.T) { - tmpl := `{{and ((index .currentState.info "foo").state.running.startedAt) .currentState.info.net.state.running.startedAt}}` - printer, err := NewTemplatePrinter([]byte(tmpl)) - if err != nil { - t.Fatalf("tmpl fail: %v", err) - } - buffer := &bytes.Buffer{} - err = printer.PrintObj(&api.Pod{}, buffer) - if err == nil { - t.Fatalf("expected that template to crash") - } - if buffer.String() == "" { - t.Errorf("no debugging info was printed") - } -} - -func TestNamePrinter(t *testing.T) { - tests := map[string]struct { - obj runtime.Object - expect string - }{ - "singleObject": { - &api.Pod{ - TypeMeta: unversioned.TypeMeta{ - Kind: "Pod", - }, - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, - "pod/foo\n"}, - "List": { - &v1.List{ - TypeMeta: unversioned.TypeMeta{ - Kind: "List", - }, - Items: []runtime.RawExtension{ - { - Raw: []byte(`{"kind": "Pod", "apiVersion": "v1", "metadata": { "name": "foo"}}`), - }, - { - Raw: []byte(`{"kind": "Pod", "apiVersion": "v1", "metadata": { "name": "bar"}}`), - }, - }, - }, - "pod/foo\npod/bar\n"}, - } - printer, _, _ := GetPrinter("name", "") - for name, item := range tests { - buff := &bytes.Buffer{} - err := printer.PrintObj(item.obj, buff) - if err != nil { - t.Errorf("%v: unexpected err: %v", name, err) - continue - } - got := buff.String() - if item.expect != got { - t.Errorf("%v: expected %v, got %v", name, item.expect, got) - } - } -} - -func TestTemplateStrings(t *testing.T) { - // This unit tests the "exists" function as well as the template from update.sh - table := map[string]struct { - pod api.Pod - expect string - }{ - "nilInfo": {api.Pod{}, "false"}, - "emptyInfo": {api.Pod{Status: api.PodStatus{ContainerStatuses: []api.ContainerStatus{}}}, "false"}, - "fooExists": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ - { - Name: "foo", - }, - }, - }, - }, - "false", - }, - "barExists": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ - { - Name: "bar", - }, - }, - }, - }, - "false", - }, - "bothExist": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ - { - Name: "foo", - }, - { - Name: "bar", - }, - }, - }, - }, - "false", - }, - "barValid": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ - { - Name: "foo", - }, - { - Name: "bar", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ - StartedAt: unversioned.Time{}, - }, - }, - }, - }, - }, - }, - "false", - }, - "bothValid": { - api.Pod{ - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{ - { - Name: "foo", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ - StartedAt: unversioned.Time{}, - }, - }, - }, - { - Name: "bar", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ - StartedAt: unversioned.Time{}, - }, - }, - }, - }, - }, - }, - "true", - }, - } - // The point of this test is to verify that the below template works. - tmpl := `{{if (exists . "status" "containerStatuses")}}{{range .status.containerStatuses}}{{if (and (eq .name "foo") (exists . "state" "running"))}}true{{end}}{{end}}{{end}}` - p, err := NewTemplatePrinter([]byte(tmpl)) - if err != nil { - t.Fatalf("tmpl fail: %v", err) - } - - printer := NewVersionedPrinter(p, api.Scheme, *testapi.Default.GroupVersion()) - - for name, item := range table { - buffer := &bytes.Buffer{} - err = printer.PrintObj(&item.pod, buffer) - if err != nil { - t.Errorf("%v: unexpected err: %v", name, err) - continue - } - actual := buffer.String() - if len(actual) == 0 { - actual = "false" - } - if e := item.expect; e != actual { - t.Errorf("%v: expected %v, got %v", name, e, actual) - } - } -} - -func TestPrinters(t *testing.T) { - om := func(name string) api.ObjectMeta { return api.ObjectMeta{Name: name} } - templatePrinter, err := NewTemplatePrinter([]byte("{{.name}}")) - if err != nil { - t.Fatal(err) - } - templatePrinter2, err := NewTemplatePrinter([]byte("{{len .items}}")) - if err != nil { - t.Fatal(err) - } - jsonpathPrinter, err := NewJSONPathPrinter("{.metadata.name}") - if err != nil { - t.Fatal(err) - } - printers := map[string]ResourcePrinter{ - "humanReadable": NewHumanReadablePrinter(true, false, false, false, false, false, []string{}), - "humanReadableHeaders": NewHumanReadablePrinter(false, false, false, false, false, false, []string{}), - "json": &JSONPrinter{}, - "yaml": &YAMLPrinter{}, - "template": templatePrinter, - "template2": templatePrinter2, - "jsonpath": jsonpathPrinter, - "name": &NamePrinter{ - Typer: runtime.ObjectTyperToTyper(api.Scheme), - Decoder: api.Codecs.UniversalDecoder(), - }, - } - objects := map[string]runtime.Object{ - "pod": &api.Pod{ObjectMeta: om("pod")}, - "emptyPodList": &api.PodList{}, - "nonEmptyPodList": &api.PodList{Items: []api.Pod{{}}}, - "endpoints": &api.Endpoints{ - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "127.0.0.1"}, {IP: "localhost"}}, - Ports: []api.EndpointPort{{Port: 8080}}, - }}}, - } - // map of printer name to set of objects it should fail on. - expectedErrors := map[string]sets.String{ - "template2": sets.NewString("pod", "emptyPodList", "endpoints"), - "jsonpath": sets.NewString("emptyPodList", "nonEmptyPodList", "endpoints"), - } - - for pName, p := range printers { - for oName, obj := range objects { - b := &bytes.Buffer{} - if err := p.PrintObj(obj, b); err != nil { - if set, found := expectedErrors[pName]; found && set.Has(oName) { - // expected error - continue - } - t.Errorf("printer '%v', object '%v'; error: '%v'", pName, oName, err) - } - } - } -} - -func TestPrintEventsResultSorted(t *testing.T) { - // Arrange - printer := NewHumanReadablePrinter(false /* noHeaders */, false, false, false, false, false, []string{}) - - obj := api.EventList{ - Items: []api.Event{ - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 1", - FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "scheduler"}, - Message: "Item 2", - FirstTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 3", - FirstTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - }, - } - buffer := &bytes.Buffer{} - - // Act - err := printer.PrintObj(&obj, buffer) - - // Assert - if err != nil { - t.Fatalf("An error occurred printing the EventList: %#v", err) - } - out := buffer.String() - VerifyDatesInOrder(out, "\n" /* rowDelimiter */, " " /* columnDelimiter */, t) -} - -func TestPrintNodeStatus(t *testing.T) { - printer := NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - table := []struct { - node api.Node - status string - }{ - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo1"}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: api.NodeReady, Status: api.ConditionTrue}}}, - }, - status: "Ready", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo2"}, - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: api.NodeReady, Status: api.ConditionTrue}}}, - }, - status: "Ready,SchedulingDisabled", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo3"}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{ - {Type: api.NodeReady, Status: api.ConditionTrue}, - {Type: api.NodeReady, Status: api.ConditionTrue}}}, - }, - status: "Ready", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo4"}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: api.NodeReady, Status: api.ConditionFalse}}}, - }, - status: "NotReady", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo5"}, - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: api.NodeReady, Status: api.ConditionFalse}}}, - }, - status: "NotReady,SchedulingDisabled", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo6"}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: "InvalidValue", Status: api.ConditionTrue}}}, - }, - status: "Unknown", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo7"}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{}}}, - }, - status: "Unknown", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo8"}, - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: "InvalidValue", Status: api.ConditionTrue}}}, - }, - status: "Unknown,SchedulingDisabled", - }, - { - node: api.Node{ - ObjectMeta: api.ObjectMeta{Name: "foo9"}, - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{Conditions: []api.NodeCondition{{}}}, - }, - status: "Unknown,SchedulingDisabled", - }, - } - - for _, test := range table { - buffer := &bytes.Buffer{} - err := printer.PrintObj(&test.node, buffer) - if err != nil { - t.Fatalf("An error occurred printing Node: %#v", err) - } - if !contains(strings.Fields(buffer.String()), test.status) { - t.Fatalf("Expect printing node %s with status %#v, got: %#v", test.node.Name, test.status, buffer.String()) - } - } -} - -func contains(fields []string, field string) bool { - for _, v := range fields { - if v == field { - return true - } - } - return false -} - -func TestPrintHunmanReadableIngressWithColumnLabels(t *testing.T) { - ingress := extensions.Ingress{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - Labels: map[string]string{ - "app_name": "kubectl_test_ingress", - }, - }, - Spec: extensions.IngressSpec{ - Backend: &extensions.IngressBackend{ - ServiceName: "svc", - ServicePort: intstr.FromInt(93), - }, - }, - Status: extensions.IngressStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - { - IP: "2.3.4.5", - Hostname: "localhost.localdomain", - }, - }, - }, - }, - } - buff := bytes.Buffer{} - printIngress(&ingress, &buff, PrintOptions{false, false, false, false, false, false, []string{"app_name"}}) - output := string(buff.Bytes()) - appName := ingress.ObjectMeta.Labels["app_name"] - if !strings.Contains(output, appName) { - t.Errorf("expected to container app_name label value %s, but doesn't %s", appName, output) - } -} - -func TestPrintHumanReadableService(t *testing.T) { - tests := []api.Service{ - { - Spec: api.ServiceSpec{ - ClusterIP: "1.2.3.4", - Type: "LoadBalancer", - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - }, - }, - Status: api.ServiceStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - { - IP: "2.3.4.5", - }, - { - IP: "3.4.5.6", - }, - }, - }, - }, - }, - { - Spec: api.ServiceSpec{ - ClusterIP: "1.2.3.4", - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - { - Port: 8090, - Protocol: "UDP", - }, - { - Port: 8000, - Protocol: "TCP", - }, - }, - }, - }, - { - Spec: api.ServiceSpec{ - ClusterIP: "1.2.3.4", - Type: "LoadBalancer", - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - { - Port: 8090, - Protocol: "UDP", - }, - { - Port: 8000, - Protocol: "TCP", - }, - }, - }, - Status: api.ServiceStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - { - IP: "2.3.4.5", - }, - }, - }, - }, - }, - { - Spec: api.ServiceSpec{ - ClusterIP: "1.2.3.4", - Type: "LoadBalancer", - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - { - Port: 8090, - Protocol: "UDP", - }, - { - Port: 8000, - Protocol: "TCP", - }, - }, - }, - Status: api.ServiceStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - { - IP: "2.3.4.5", - }, - { - IP: "3.4.5.6", - }, - { - IP: "5.6.7.8", - Hostname: "host5678", - }, - }, - }, - }, - }, - } - - for _, svc := range tests { - buff := bytes.Buffer{} - printService(&svc, &buff, PrintOptions{false, false, false, false, false, false, []string{}}) - output := string(buff.Bytes()) - ip := svc.Spec.ClusterIP - if !strings.Contains(output, ip) { - t.Errorf("expected to contain ClusterIP %s, but doesn't: %s", ip, output) - } - - for _, ingress := range svc.Status.LoadBalancer.Ingress { - ip = ingress.IP - if !strings.Contains(output, ip) { - t.Errorf("expected to contain ingress ip %s, but doesn't: %s", ip, output) - } - } - - for _, port := range svc.Spec.Ports { - portSpec := fmt.Sprintf("%d/%s", port.Port, port.Protocol) - if !strings.Contains(output, portSpec) { - t.Errorf("expected to contain port: %s, but doesn't: %s", portSpec, output) - } - } - // Each service should print on one line - if 1 != strings.Count(output, "\n") { - t.Errorf("expected a single newline, found %d", strings.Count(output, "\n")) - } - } -} - -func TestPrintHumanReadableWithNamespace(t *testing.T) { - namespaceName := "testnamespace" - name := "test" - table := []struct { - obj runtime.Object - isNamespaced bool - }{ - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - }, - isNamespaced: true, - }, - { - obj: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Spec: api.ReplicationControllerSpec{ - Replicas: 2, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "name": "foo", - "type": "production", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Image: "foo/bar", - TerminationMessagePath: api.TerminationMessagePathDefault, - ImagePullPolicy: api.PullIfNotPresent, - }, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSDefault, - NodeSelector: map[string]string{ - "baz": "blah", - }, - }, - }, - }, - }, - isNamespaced: true, - }, - { - obj: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Spec: api.ServiceSpec{ - ClusterIP: "1.2.3.4", - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - }, - }, - Status: api.ServiceStatus{ - LoadBalancer: api.LoadBalancerStatus{ - Ingress: []api.LoadBalancerIngress{ - { - IP: "2.3.4.5", - }, - }, - }, - }, - }, - isNamespaced: true, - }, - { - obj: &api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Subsets: []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: "127.0.0.1"}, {IP: "localhost"}}, - Ports: []api.EndpointPort{{Port: 8080}}, - }, - }}, - isNamespaced: true, - }, - { - obj: &api.Namespace{ - ObjectMeta: api.ObjectMeta{Name: name}, - }, - isNamespaced: false, - }, - { - obj: &api.Secret{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - }, - isNamespaced: true, - }, - { - obj: &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Secrets: []api.ObjectReference{}, - }, - isNamespaced: true, - }, - { - obj: &api.Node{ - ObjectMeta: api.ObjectMeta{Name: name}, - Status: api.NodeStatus{}, - }, - isNamespaced: false, - }, - { - obj: &api.PersistentVolume{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Spec: api.PersistentVolumeSpec{}, - }, - isNamespaced: false, - }, - { - obj: &api.PersistentVolumeClaim{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Spec: api.PersistentVolumeClaimSpec{}, - }, - isNamespaced: true, - }, - { - obj: &api.Event{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 1", - FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - isNamespaced: true, - }, - { - obj: &api.LimitRange{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - }, - isNamespaced: true, - }, - { - obj: &api.ResourceQuota{ - ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespaceName}, - }, - isNamespaced: true, - }, - { - obj: &api.ComponentStatus{ - Conditions: []api.ComponentCondition{ - {Type: api.ComponentHealthy, Status: api.ConditionTrue, Message: "ok", Error: ""}, - }, - }, - isNamespaced: false, - }, - } - - for _, test := range table { - if test.isNamespaced { - // Expect output to include namespace when requested. - printer := NewHumanReadablePrinter(false, true, false, false, false, false, []string{}) - buffer := &bytes.Buffer{} - err := printer.PrintObj(test.obj, buffer) - if err != nil { - t.Fatalf("An error occurred printing object: %#v", err) - } - matched := contains(strings.Fields(buffer.String()), fmt.Sprintf("%s", namespaceName)) - if !matched { - t.Errorf("Expect printing object to contain namespace: %#v", test.obj) - } - } else { - // Expect error when trying to get all namespaces for un-namespaced object. - printer := NewHumanReadablePrinter(false, true, false, false, false, false, []string{}) - buffer := &bytes.Buffer{} - err := printer.PrintObj(test.obj, buffer) - if err == nil { - t.Errorf("Expected error when printing un-namespaced type") - } - } - } -} - -func TestPrintPod(t *testing.T) { - tests := []struct { - pod api.Pod - expect string - }{ - { - // Test name, num of containers, restarts, container ready status - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test1"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test1\t1/2\tpodPhase\t6\t", - }, - { - // Test container error overwrites pod phase - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test2"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {State: api.ContainerState{Waiting: &api.ContainerStateWaiting{Reason: "ContainerWaitingReason"}}, RestartCount: 3}, - }, - }, - }, - "test2\t1/2\tContainerWaitingReason\t6\t", - }, - { - // Test the same as the above but with Terminated state and the first container overwrites the rest - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test3"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {State: api.ContainerState{Waiting: &api.ContainerStateWaiting{Reason: "ContainerWaitingReason"}}, RestartCount: 3}, - {State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "ContainerTerminatedReason"}}, RestartCount: 3}, - }, - }, - }, - "test3\t0/2\tContainerWaitingReason\t6\t", - }, - { - // Test ready is not enough for reporting running - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test4"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {Ready: true, RestartCount: 3}, - }, - }, - }, - "test4\t1/2\tpodPhase\t6\t", - }, - { - // Test ready is not enough for reporting running - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test5"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Reason: "OutOfDisk", - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {Ready: true, RestartCount: 3}, - }, - }, - }, - "test5\t1/2\tOutOfDisk\t6\t", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printPod(&test.pod, buf, PrintOptions{false, false, false, true, false, false, []string{}}) - // We ignore time - if !strings.HasPrefix(buf.String(), test.expect) { - t.Fatalf("Expected: %s, got: %s", test.expect, buf.String()) - } - buf.Reset() - } -} - -func TestPrintNonTerminatedPod(t *testing.T) { - tests := []struct { - pod api.Pod - expect string - }{ - { - // Test pod phase Running should be printed - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test1"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: api.PodRunning, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test1\t1/2\tRunning\t6\t", - }, - { - // Test pod phase Pending should be printed - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test2"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: api.PodPending, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test2\t1/2\tPending\t6\t", - }, - { - // Test pod phase Unknown should be printed - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test3"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: api.PodUnknown, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test3\t1/2\tUnknown\t6\t", - }, - { - // Test pod phase Succeeded shouldn't be printed - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test4"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: api.PodSucceeded, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "", - }, - { - // Test pod phase Failed shouldn't be printed - api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "test5"}, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: api.PodFailed, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {Ready: true, RestartCount: 3}, - }, - }, - }, - "", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printPod(&test.pod, buf, PrintOptions{false, false, false, false, false, false, []string{}}) - // We ignore time - if !strings.HasPrefix(buf.String(), test.expect) { - t.Fatalf("Expected: %s, got: %s", test.expect, buf.String()) - } - buf.Reset() - } -} - -func TestPrintPodWithLabels(t *testing.T) { - tests := []struct { - pod api.Pod - labelColumns []string - startsWith string - endsWith string - }{ - { - // Test name, num of containers, restarts, container ready status - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Labels: map[string]string{"col1": "asd", "COL2": "zxc"}, - }, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - []string{"col1", "COL2"}, - "test1\t1/2\tpodPhase\t6\t", - "\tasd\tzxc\n", - }, - { - // Test name, num of containers, restarts, container ready status - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Labels: map[string]string{"col1": "asd", "COL2": "zxc"}, - }, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - []string{}, - "test1\t1/2\tpodPhase\t6\t", - "\n", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printPod(&test.pod, buf, PrintOptions{false, false, false, false, false, false, test.labelColumns}) - // We ignore time - if !strings.HasPrefix(buf.String(), test.startsWith) || !strings.HasSuffix(buf.String(), test.endsWith) { - t.Fatalf("Expected to start with: %s and end with: %s, but got: %s", test.startsWith, test.endsWith, buf.String()) - } - buf.Reset() - } -} - -type stringTestList []struct { - name, got, exp string -} - -func TestTranslateTimestamp(t *testing.T) { - tl := stringTestList{ - {"a while from now", translateTimestamp(unversioned.Time{Time: time.Now().Add(2.1e9)}), ""}, - {"almost now", translateTimestamp(unversioned.Time{Time: time.Now().Add(1.9e9)}), "0s"}, - {"now", translateTimestamp(unversioned.Time{Time: time.Now()}), "0s"}, - {"unknown", translateTimestamp(unversioned.Time{}), ""}, - {"30 seconds ago", translateTimestamp(unversioned.Time{Time: time.Now().Add(-3e10)}), "30s"}, - {"5 minutes ago", translateTimestamp(unversioned.Time{Time: time.Now().Add(-3e11)}), "5m"}, - {"an hour ago", translateTimestamp(unversioned.Time{Time: time.Now().Add(-6e12)}), "1h"}, - {"2 days ago", translateTimestamp(unversioned.Time{Time: time.Now().UTC().AddDate(0, 0, -2)}), "2d"}, - {"months ago", translateTimestamp(unversioned.Time{Time: time.Now().UTC().AddDate(0, 0, -90)}), "90d"}, - {"10 years ago", translateTimestamp(unversioned.Time{Time: time.Now().UTC().AddDate(-10, 0, 0)}), "10y"}, - } - for _, test := range tl { - if test.got != test.exp { - t.Errorf("On %v, expected '%v', but got '%v'", - test.name, test.exp, test.got) - } - } -} - -func TestPrintDeployment(t *testing.T) { - tests := []struct { - deployment extensions.Deployment - expect string - }{ - { - extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().Add(1.9e9)}, - }, - Spec: extensions.DeploymentSpec{ - Replicas: 5, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - }, - }, - Status: extensions.DeploymentStatus{ - Replicas: 10, - UpdatedReplicas: 2, - AvailableReplicas: 1, - UnavailableReplicas: 4, - }, - }, - "test1\t5\t10\t2\t1\t0s\n", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printDeployment(&test.deployment, buf, PrintOptions{false, false, false, true, false, false, []string{}}) - if buf.String() != test.expect { - t.Fatalf("Expected: %s, got: %s", test.expect, buf.String()) - } - buf.Reset() - } -} - -func TestPrintDaemonSet(t *testing.T) { - tests := []struct { - ds extensions.DaemonSet - startsWith string - }{ - { - extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().Add(1.9e9)}, - }, - Spec: extensions.DaemonSetSpec{ - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - }, - }, - Status: extensions.DaemonSetStatus{ - CurrentNumberScheduled: 2, - DesiredNumberScheduled: 3, - }, - }, - "test1\t3\t2\t\t0s\n", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printDaemonSet(&test.ds, buf, PrintOptions{false, false, false, false, false, false, []string{}}) - if !strings.HasPrefix(buf.String(), test.startsWith) { - t.Fatalf("Expected to start with %s but got %s", test.startsWith, buf.String()) - } - buf.Reset() - } -} - -func TestPrintJob(t *testing.T) { - completions := int32(2) - tests := []struct { - job batch.Job - expect string - }{ - { - batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "job1", - CreationTimestamp: unversioned.Time{Time: time.Now().Add(1.9e9)}, - }, - Spec: batch.JobSpec{ - Completions: &completions, - }, - Status: batch.JobStatus{ - Succeeded: 1, - }, - }, - "job1\t2\t1\t0s\n", - }, - { - batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "job2", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: batch.JobSpec{ - Completions: nil, - }, - Status: batch.JobStatus{ - Succeeded: 0, - }, - }, - "job2\t\t0\t10y\n", - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printJob(&test.job, buf, PrintOptions{false, false, false, true, false, false, []string{}}) - if buf.String() != test.expect { - t.Fatalf("Expected: %s, got: %s", test.expect, buf.String()) - } - buf.Reset() - } -} - -func TestPrintPodShowLabels(t *testing.T) { - tests := []struct { - pod api.Pod - startsWith string - endsWith string - showLabels bool - }{ - { - // Test name, num of containers, restarts, container ready status - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Labels: map[string]string{"col1": "asd", "COL2": "zxc"}, - }, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test1\t1/2\tpodPhase\t6\t", - "\tCOL2=zxc,col1=asd\n", - true, - }, - { - // Test name, num of containers, restarts, container ready status - api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - Labels: map[string]string{"col3": "asd", "COL4": "zxc"}, - }, - Spec: api.PodSpec{Containers: make([]api.Container, 2)}, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - "test1\t1/2\tpodPhase\t6\t", - "\n", - false, - }, - } - - buf := bytes.NewBuffer([]byte{}) - for _, test := range tests { - printPod(&test.pod, buf, PrintOptions{false, false, false, false, test.showLabels, false, []string{}}) - // We ignore time - if !strings.HasPrefix(buf.String(), test.startsWith) || !strings.HasSuffix(buf.String(), test.endsWith) { - t.Fatalf("Expected to start with: %s and end with: %s, but got: %s", test.startsWith, test.endsWith, buf.String()) - } - buf.Reset() - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/rolling_updater_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/rolling_updater_test.go deleted file mode 100644 index c30f08b2c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/rolling_updater_test.go +++ /dev/null @@ -1,1660 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" - "k8s.io/kubernetes/pkg/util/sets" -) - -func oldRc(replicas int, original int) *api.ReplicationController { - return &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo-v1", - UID: "7764ae47-9092-11e4-8393-42010af018ff", - Annotations: map[string]string{ - originalReplicasAnnotation: fmt.Sprintf("%d", original), - }, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: int32(replicas), - Selector: map[string]string{"version": "v1"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Name: "foo-v1", - Labels: map[string]string{"version": "v1"}, - }, - }, - }, - Status: api.ReplicationControllerStatus{ - Replicas: int32(replicas), - }, - } -} - -func newRc(replicas int, desired int) *api.ReplicationController { - rc := oldRc(replicas, replicas) - rc.Spec.Template = &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Name: "foo-v2", - Labels: map[string]string{"version": "v2"}, - }, - } - rc.Spec.Selector = map[string]string{"version": "v2"} - rc.ObjectMeta = api.ObjectMeta{ - Name: "foo-v2", - Annotations: map[string]string{ - desiredReplicasAnnotation: fmt.Sprintf("%d", desired), - sourceIdAnnotation: "foo-v1:7764ae47-9092-11e4-8393-42010af018ff", - }, - } - return rc -} - -// TestUpdate performs complex scenario testing for rolling updates. It -// provides fine grained control over the states for each update interval to -// allow the expression of as many edge cases as possible. -func TestUpdate(t *testing.T) { - // up represents a simulated scale up event and expectation - type up struct { - // to is the expected replica count for a scale-up - to int - } - // down represents a simulated scale down event and expectation - type down struct { - // oldReady is the number of oldRc replicas which will be seen - // as ready during the scale down attempt - oldReady int - // newReady is the number of newRc replicas which will be seen - // as ready during the scale up attempt - newReady int - // to is the expected replica count for the scale down - to int - // noop and to are mutually exclusive; if noop is true, that means for - // this down event, no scaling attempt should be made (for example, if - // by scaling down, the readiness minimum would be crossed.) - noop bool - } - - tests := []struct { - name string - // oldRc is the "from" deployment - oldRc *api.ReplicationController - // newRc is the "to" deployment - newRc *api.ReplicationController - // whether newRc existed (false means it was created) - newRcExists bool - maxUnavail intstr.IntOrString - maxSurge intstr.IntOrString - // expected is the sequence of up/down events that will be simulated and - // verified - expected []interface{} - // output is the expected textual output written - output string - }{ - { - name: "10->10 30/0 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("30%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 10, newReady: 0, to: 7}, - up{3}, - down{oldReady: 7, newReady: 3, to: 4}, - up{6}, - down{oldReady: 4, newReady: 6, to: 1}, - up{9}, - down{oldReady: 1, newReady: 9, to: 0}, - up{10}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 7 pods available, don't exceed 10 pods) -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 9 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 10 -`, - }, - { - name: "10->10 30/0 delayed readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("30%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 10, newReady: 0, to: 7}, - up{3}, - down{oldReady: 7, newReady: 0, noop: true}, - down{oldReady: 7, newReady: 1, to: 6}, - up{4}, - down{oldReady: 6, newReady: 4, to: 3}, - up{7}, - down{oldReady: 3, newReady: 7, to: 0}, - up{10}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 7 pods available, don't exceed 10 pods) -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 6 -Scaling foo-v2 up to 4 -Scaling foo-v1 down to 3 -Scaling foo-v2 up to 7 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 10 -`, - }, { - name: "10->10 30/0 fast readiness, continuation", - oldRc: oldRc(7, 10), - newRc: newRc(3, 10), - newRcExists: false, - maxUnavail: intstr.FromString("30%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 7, newReady: 3, to: 4}, - up{6}, - down{oldReady: 4, newReady: 6, to: 1}, - up{9}, - down{oldReady: 1, newReady: 9, to: 0}, - up{10}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 3 to 10, scaling down foo-v1 from 7 to 0 (keep 7 pods available, don't exceed 10 pods) -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 9 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 10 -`, - }, { - name: "10->10 30/0 fast readiness, continued after restart which prevented first scale-up", - oldRc: oldRc(7, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("30%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 7, newReady: 0, noop: true}, - up{3}, - down{oldReady: 7, newReady: 3, to: 4}, - up{6}, - down{oldReady: 4, newReady: 6, to: 1}, - up{9}, - down{oldReady: 1, newReady: 9, to: 0}, - up{10}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 7 to 0 (keep 7 pods available, don't exceed 10 pods) -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 9 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 10 -`, - }, { - name: "10->10 0/30 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("30%"), - expected: []interface{}{ - up{3}, - down{oldReady: 10, newReady: 3, to: 7}, - up{6}, - down{oldReady: 7, newReady: 6, to: 4}, - up{9}, - down{oldReady: 4, newReady: 9, to: 1}, - up{10}, - down{oldReady: 1, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 10 pods available, don't exceed 13 pods) -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 9 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 0/30 delayed readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("30%"), - expected: []interface{}{ - up{3}, - down{oldReady: 10, newReady: 0, noop: true}, - down{oldReady: 10, newReady: 1, to: 9}, - up{4}, - down{oldReady: 9, newReady: 3, to: 7}, - up{6}, - down{oldReady: 7, newReady: 6, to: 4}, - up{9}, - down{oldReady: 4, newReady: 9, to: 1}, - up{10}, - down{oldReady: 1, newReady: 9, noop: true}, - down{oldReady: 1, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 10 pods available, don't exceed 13 pods) -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 9 -Scaling foo-v2 up to 4 -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 9 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 10/20 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("20%"), - expected: []interface{}{ - up{2}, - down{oldReady: 10, newReady: 2, to: 7}, - up{5}, - down{oldReady: 7, newReady: 5, to: 4}, - up{8}, - down{oldReady: 4, newReady: 8, to: 1}, - up{10}, - down{oldReady: 1, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 9 pods available, don't exceed 12 pods) -Scaling foo-v2 up to 2 -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 5 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 8 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 10/20 delayed readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("20%"), - expected: []interface{}{ - up{2}, - down{oldReady: 10, newReady: 2, to: 7}, - up{5}, - down{oldReady: 7, newReady: 4, to: 5}, - up{7}, - down{oldReady: 5, newReady: 4, noop: true}, - down{oldReady: 5, newReady: 7, to: 2}, - up{10}, - down{oldReady: 2, newReady: 9, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 9 pods available, don't exceed 12 pods) -Scaling foo-v2 up to 2 -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 5 -Scaling foo-v1 down to 5 -Scaling foo-v2 up to 7 -Scaling foo-v1 down to 2 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 10/20 fast readiness continued after restart which prevented first scale-down", - oldRc: oldRc(10, 10), - newRc: newRc(2, 10), - newRcExists: false, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("20%"), - expected: []interface{}{ - down{oldReady: 10, newReady: 2, to: 7}, - up{5}, - down{oldReady: 7, newReady: 5, to: 4}, - up{8}, - down{oldReady: 4, newReady: 8, to: 1}, - up{10}, - down{oldReady: 1, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 2 to 10, scaling down foo-v1 from 10 to 0 (keep 9 pods available, don't exceed 12 pods) -Scaling foo-v1 down to 7 -Scaling foo-v2 up to 5 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 8 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 0/100 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("100%"), - expected: []interface{}{ - up{10}, - down{oldReady: 10, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 10 pods available, don't exceed 20 pods) -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 0/100 delayed readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("100%"), - expected: []interface{}{ - up{10}, - down{oldReady: 10, newReady: 0, noop: true}, - down{oldReady: 10, newReady: 2, to: 8}, - down{oldReady: 8, newReady: 7, to: 3}, - down{oldReady: 3, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 10 pods available, don't exceed 20 pods) -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 8 -Scaling foo-v1 down to 3 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 100/0 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 10), - newRcExists: false, - maxUnavail: intstr.FromString("100%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 10, newReady: 0, to: 0}, - up{10}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 10, scaling down foo-v1 from 10 to 0 (keep 0 pods available, don't exceed 10 pods) -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 10 -`, - }, { - name: "1->1 25/25 maintain minimum availability", - oldRc: oldRc(1, 1), - newRc: newRc(0, 1), - newRcExists: false, - maxUnavail: intstr.FromString("25%"), - maxSurge: intstr.FromString("25%"), - expected: []interface{}{ - up{1}, - down{oldReady: 1, newReady: 0, noop: true}, - down{oldReady: 1, newReady: 1, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 1, scaling down foo-v1 from 1 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -`, - }, { - name: "1->1 0/10 delayed readiness", - oldRc: oldRc(1, 1), - newRc: newRc(0, 1), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("10%"), - expected: []interface{}{ - up{1}, - down{oldReady: 1, newReady: 0, noop: true}, - down{oldReady: 1, newReady: 1, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 1, scaling down foo-v1 from 1 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -`, - }, { - name: "1->1 10/10 delayed readiness", - oldRc: oldRc(1, 1), - newRc: newRc(0, 1), - newRcExists: false, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("10%"), - expected: []interface{}{ - up{1}, - down{oldReady: 1, newReady: 0, noop: true}, - down{oldReady: 1, newReady: 1, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 1, scaling down foo-v1 from 1 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -`, - }, { - name: "3->3 1/1 fast readiness (absolute values)", - oldRc: oldRc(3, 3), - newRc: newRc(0, 3), - newRcExists: false, - maxUnavail: intstr.FromInt(0), - maxSurge: intstr.FromInt(1), - expected: []interface{}{ - up{1}, - down{oldReady: 3, newReady: 1, to: 2}, - up{2}, - down{oldReady: 2, newReady: 2, to: 1}, - up{3}, - down{oldReady: 1, newReady: 3, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 3, scaling down foo-v1 from 3 to 0 (keep 3 pods available, don't exceed 4 pods) -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 2 -Scaling foo-v2 up to 2 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 3 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->10 0/20 fast readiness, continued after restart which resulted in partial first scale-up", - oldRc: oldRc(6, 10), - newRc: newRc(5, 10), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("20%"), - expected: []interface{}{ - up{6}, - down{oldReady: 6, newReady: 6, to: 4}, - up{8}, - down{oldReady: 4, newReady: 8, to: 2}, - up{10}, - down{oldReady: 1, newReady: 10, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 5 to 10, scaling down foo-v1 from 6 to 0 (keep 10 pods available, don't exceed 12 pods) -Scaling foo-v2 up to 6 -Scaling foo-v1 down to 4 -Scaling foo-v2 up to 8 -Scaling foo-v1 down to 2 -Scaling foo-v2 up to 10 -Scaling foo-v1 down to 0 -`, - }, { - name: "10->20 0/300 fast readiness", - oldRc: oldRc(10, 10), - newRc: newRc(0, 20), - newRcExists: false, - maxUnavail: intstr.FromString("0%"), - maxSurge: intstr.FromString("300%"), - expected: []interface{}{ - up{20}, - down{oldReady: 10, newReady: 20, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 20, scaling down foo-v1 from 10 to 0 (keep 20 pods available, don't exceed 80 pods) -Scaling foo-v2 up to 20 -Scaling foo-v1 down to 0 -`, - }, { - name: "1->1 0/1 scale down unavailable rc to a ready rc (rollback)", - oldRc: oldRc(1, 1), - newRc: newRc(1, 1), - newRcExists: true, - maxUnavail: intstr.FromInt(0), - maxSurge: intstr.FromInt(1), - expected: []interface{}{ - up{1}, - down{oldReady: 0, newReady: 1, to: 0}, - }, - output: `Continuing update with existing controller foo-v2. -Scaling up foo-v2 from 1 to 1, scaling down foo-v1 from 1 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v1 down to 0 -`, - }, - { - name: "3->0 1/1 desired 0 (absolute values)", - oldRc: oldRc(3, 3), - newRc: newRc(0, 0), - newRcExists: true, - maxUnavail: intstr.FromInt(1), - maxSurge: intstr.FromInt(1), - expected: []interface{}{ - down{oldReady: 3, newReady: 0, to: 0}, - }, - output: `Continuing update with existing controller foo-v2. -Scaling up foo-v2 from 0 to 0, scaling down foo-v1 from 3 to 0 (keep 0 pods available, don't exceed 1 pods) -Scaling foo-v1 down to 0 -`, - }, - { - name: "3->0 10/10 desired 0 (percentages)", - oldRc: oldRc(3, 3), - newRc: newRc(0, 0), - newRcExists: true, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("10%"), - expected: []interface{}{ - down{oldReady: 3, newReady: 0, to: 0}, - }, - output: `Continuing update with existing controller foo-v2. -Scaling up foo-v2 from 0 to 0, scaling down foo-v1 from 3 to 0 (keep 0 pods available, don't exceed 0 pods) -Scaling foo-v1 down to 0 -`, - }, - { - name: "3->0 10/10 desired 0 (create new RC)", - oldRc: oldRc(3, 3), - newRc: newRc(0, 0), - newRcExists: false, - maxUnavail: intstr.FromString("10%"), - maxSurge: intstr.FromString("10%"), - expected: []interface{}{ - down{oldReady: 3, newReady: 0, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 0, scaling down foo-v1 from 3 to 0 (keep 0 pods available, don't exceed 0 pods) -Scaling foo-v1 down to 0 -`, - }, - { - name: "0->0 1/1 desired 0 (absolute values)", - oldRc: oldRc(0, 0), - newRc: newRc(0, 0), - newRcExists: true, - maxUnavail: intstr.FromInt(1), - maxSurge: intstr.FromInt(1), - expected: []interface{}{ - down{oldReady: 0, newReady: 0, to: 0}, - }, - output: `Continuing update with existing controller foo-v2. -Scaling up foo-v2 from 0 to 0, scaling down foo-v1 from 0 to 0 (keep 0 pods available, don't exceed 1 pods) -`, - }, { - name: "30->2 50%/0", - oldRc: oldRc(30, 30), - newRc: newRc(0, 2), - newRcExists: false, - maxUnavail: intstr.FromString("50%"), - maxSurge: intstr.FromInt(0), - expected: []interface{}{ - down{oldReady: 30, newReady: 0, to: 1}, - up{1}, - down{oldReady: 1, newReady: 2, to: 0}, - up{2}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 2, scaling down foo-v1 from 30 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 2 -`, - }, - { - name: "2->2 1/0 blocked oldRc", - oldRc: oldRc(2, 2), - newRc: newRc(0, 2), - newRcExists: false, - maxUnavail: intstr.FromInt(1), - maxSurge: intstr.FromInt(0), - expected: []interface{}{ - down{oldReady: 1, newReady: 0, to: 1}, - up{1}, - down{oldReady: 1, newReady: 1, to: 0}, - up{2}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 2, scaling down foo-v1 from 2 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 2 -`, - }, - { - name: "1->1 1/0 allow maxUnavailability", - oldRc: oldRc(1, 1), - newRc: newRc(0, 1), - newRcExists: false, - maxUnavail: intstr.FromString("1%"), - maxSurge: intstr.FromInt(0), - expected: []interface{}{ - down{oldReady: 1, newReady: 0, to: 0}, - up{1}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 1, scaling down foo-v1 from 1 to 0 (keep 0 pods available, don't exceed 1 pods) -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 1 -`, - }, - { - name: "1->2 25/25 complex asymetric deployment", - oldRc: oldRc(1, 1), - newRc: newRc(0, 2), - newRcExists: false, - maxUnavail: intstr.FromString("25%"), - maxSurge: intstr.FromString("25%"), - expected: []interface{}{ - up{2}, - down{oldReady: 1, newReady: 2, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 2, scaling down foo-v1 from 1 to 0 (keep 2 pods available, don't exceed 3 pods) -Scaling foo-v2 up to 2 -Scaling foo-v1 down to 0 -`, - }, - { - name: "2->2 25/1 maxSurge trumps maxUnavailable", - oldRc: oldRc(2, 2), - newRc: newRc(0, 2), - newRcExists: false, - maxUnavail: intstr.FromString("25%"), - maxSurge: intstr.FromString("1%"), - expected: []interface{}{ - up{1}, - down{oldReady: 2, newReady: 1, to: 1}, - up{2}, - down{oldReady: 1, newReady: 2, to: 0}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 2, scaling down foo-v1 from 2 to 0 (keep 2 pods available, don't exceed 3 pods) -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 2 -Scaling foo-v1 down to 0 -`, - }, - { - name: "2->2 25/0 maxUnavailable resolves to zero, then one", - oldRc: oldRc(2, 2), - newRc: newRc(0, 2), - newRcExists: false, - maxUnavail: intstr.FromString("25%"), - maxSurge: intstr.FromString("0%"), - expected: []interface{}{ - down{oldReady: 2, newReady: 0, to: 1}, - up{1}, - down{oldReady: 1, newReady: 1, to: 0}, - up{2}, - }, - output: `Created foo-v2 -Scaling up foo-v2 from 0 to 2, scaling down foo-v1 from 2 to 0 (keep 1 pods available, don't exceed 2 pods) -Scaling foo-v1 down to 1 -Scaling foo-v2 up to 1 -Scaling foo-v1 down to 0 -Scaling foo-v2 up to 2 -`, - }, - } - - for i, test := range tests { - // Extract expectations into some makeshift FIFOs so they can be returned - // in the correct order from the right places. This lets scale downs be - // expressed a single event even though the data is used from multiple - // interface calls. - oldReady := []int{} - newReady := []int{} - upTo := []int{} - downTo := []int{} - for _, event := range test.expected { - switch e := event.(type) { - case down: - oldReady = append(oldReady, e.oldReady) - newReady = append(newReady, e.newReady) - if !e.noop { - downTo = append(downTo, e.to) - } - case up: - upTo = append(upTo, e.to) - } - } - - // Make a way to get the next item from our FIFOs. Returns -1 if the array - // is empty. - next := func(s *[]int) int { - slice := *s - v := -1 - if len(slice) > 0 { - v = slice[0] - if len(slice) > 1 { - *s = slice[1:] - } else { - *s = []int{} - } - } - return v - } - t.Logf("running test %d (%s) (up: %v, down: %v, oldReady: %v, newReady: %v)", i, test.name, upTo, downTo, oldReady, newReady) - updater := &RollingUpdater{ - ns: "default", - scaleAndWait: func(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) { - // Return a scale up or scale down expectation depending on the rc, - // and throw errors if there is no expectation expressed for this - // call. - expected := -1 - switch { - case rc == test.newRc: - t.Logf("scaling up %s to %d", rc.Name, rc.Spec.Replicas) - expected = next(&upTo) - case rc == test.oldRc: - t.Logf("scaling down %s to %d", rc.Name, rc.Spec.Replicas) - expected = next(&downTo) - } - if expected == -1 { - t.Fatalf("unexpected scale of %s to %d", rc.Name, rc.Spec.Replicas) - } else if e, a := expected, int(rc.Spec.Replicas); e != a { - t.Fatalf("expected scale of %s to %d, got %d", rc.Name, e, a) - } - // Simulate the scale. - rc.Status.Replicas = rc.Spec.Replicas - return rc, nil - }, - getOrCreateTargetController: func(controller *api.ReplicationController, sourceId string) (*api.ReplicationController, bool, error) { - // Simulate a create vs. update of an existing controller. - return test.newRc, test.newRcExists, nil - }, - cleanup: func(oldRc, newRc *api.ReplicationController, config *RollingUpdaterConfig) error { - return nil - }, - } - // Set up a mock readiness check which handles the test assertions. - updater.getReadyPods = func(oldRc, newRc *api.ReplicationController) (int32, int32, error) { - // Return simulated readiness, and throw an error if this call has no - // expectations defined. - oldReady := next(&oldReady) - newReady := next(&newReady) - if oldReady == -1 || newReady == -1 { - t.Fatalf("unexpected getReadyPods call for:\noldRc: %+v\nnewRc: %+v", oldRc, newRc) - } - return int32(oldReady), int32(newReady), nil - } - var buffer bytes.Buffer - config := &RollingUpdaterConfig{ - Out: &buffer, - OldRc: test.oldRc, - NewRc: test.newRc, - UpdatePeriod: 0, - Interval: time.Millisecond, - Timeout: time.Millisecond, - CleanupPolicy: DeleteRollingUpdateCleanupPolicy, - MaxUnavailable: test.maxUnavail, - MaxSurge: test.maxSurge, - } - err := updater.Update(config) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if buffer.String() != test.output { - t.Errorf("Bad output. expected:\n%s\ngot:\n%s", test.output, buffer.String()) - } - } -} - -// TestUpdate_progressTimeout ensures that an update which isn't making any -// progress will eventually time out with a specified error. -func TestUpdate_progressTimeout(t *testing.T) { - oldRc := oldRc(2, 2) - newRc := newRc(0, 2) - updater := &RollingUpdater{ - ns: "default", - scaleAndWait: func(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) { - // Do nothing. - return rc, nil - }, - getOrCreateTargetController: func(controller *api.ReplicationController, sourceId string) (*api.ReplicationController, bool, error) { - return newRc, false, nil - }, - cleanup: func(oldRc, newRc *api.ReplicationController, config *RollingUpdaterConfig) error { - return nil - }, - } - updater.getReadyPods = func(oldRc, newRc *api.ReplicationController) (int32, int32, error) { - // Coerce a timeout by pods never becoming ready. - return 0, 0, nil - } - var buffer bytes.Buffer - config := &RollingUpdaterConfig{ - Out: &buffer, - OldRc: oldRc, - NewRc: newRc, - UpdatePeriod: 0, - Interval: time.Millisecond, - Timeout: time.Millisecond, - CleanupPolicy: DeleteRollingUpdateCleanupPolicy, - MaxUnavailable: intstr.FromInt(0), - MaxSurge: intstr.FromInt(1), - } - err := updater.Update(config) - if err == nil { - t.Fatalf("expected an error") - } - if e, a := "timed out waiting for any update progress to be made", err.Error(); e != a { - t.Fatalf("expected error message: %s, got: %s", e, a) - } -} - -func TestUpdate_assignOriginalAnnotation(t *testing.T) { - oldRc := oldRc(1, 1) - delete(oldRc.Annotations, originalReplicasAnnotation) - newRc := newRc(1, 1) - var updatedOldRc *api.ReplicationController - fake := &testclient.Fake{} - fake.AddReactor("*", "*", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { - switch a := action.(type) { - case testclient.GetAction: - return true, oldRc, nil - case testclient.UpdateAction: - updatedOldRc = a.GetObject().(*api.ReplicationController) - return true, updatedOldRc, nil - } - return false, nil, nil - }) - updater := &RollingUpdater{ - c: fake, - ns: "default", - scaleAndWait: func(rc *api.ReplicationController, retry *RetryParams, wait *RetryParams) (*api.ReplicationController, error) { - return rc, nil - }, - getOrCreateTargetController: func(controller *api.ReplicationController, sourceId string) (*api.ReplicationController, bool, error) { - return newRc, false, nil - }, - cleanup: func(oldRc, newRc *api.ReplicationController, config *RollingUpdaterConfig) error { - return nil - }, - getReadyPods: func(oldRc, newRc *api.ReplicationController) (int32, int32, error) { - return 1, 1, nil - }, - } - var buffer bytes.Buffer - config := &RollingUpdaterConfig{ - Out: &buffer, - OldRc: oldRc, - NewRc: newRc, - UpdatePeriod: 0, - Interval: time.Millisecond, - Timeout: time.Millisecond, - CleanupPolicy: DeleteRollingUpdateCleanupPolicy, - MaxUnavailable: intstr.FromString("100%"), - } - err := updater.Update(config) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if updatedOldRc == nil { - t.Fatalf("expected rc to be updated") - } - if e, a := "1", updatedOldRc.Annotations[originalReplicasAnnotation]; e != a { - t.Fatalf("expected annotation value %s, got %s", e, a) - } -} - -func TestRollingUpdater_multipleContainersInPod(t *testing.T) { - tests := []struct { - oldRc *api.ReplicationController - newRc *api.ReplicationController - - container string - image string - deploymentKey string - }{ - { - oldRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "old", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "old", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "container1", - Image: "image1", - }, - { - Name: "container2", - Image: "image2", - }, - }, - }, - }, - }, - }, - newRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "old", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "old", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "container1", - Image: "newimage", - }, - { - Name: "container2", - Image: "image2", - }, - }, - }, - }, - }, - }, - container: "container1", - image: "newimage", - deploymentKey: "dk", - }, - { - oldRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "old", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "old", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "container1", - Image: "image1", - }, - }, - }, - }, - }, - }, - newRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "old", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "old", - }, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "container1", - Image: "newimage", - }, - }, - }, - }, - }, - }, - container: "container1", - image: "newimage", - deploymentKey: "dk", - }, - } - - for _, test := range tests { - fake := &testclient.Fake{} - fake.AddReactor("*", "*", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { - switch action.(type) { - case testclient.GetAction: - return true, test.oldRc, nil - } - return false, nil, nil - }) - - codec := testapi.Default.Codec() - - deploymentHash, err := api.HashObject(test.newRc, codec) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - test.newRc.Spec.Selector[test.deploymentKey] = deploymentHash - test.newRc.Spec.Template.Labels[test.deploymentKey] = deploymentHash - test.newRc.Name = fmt.Sprintf("%s-%s", test.newRc.Name, deploymentHash) - - config := &NewControllerConfig{ - OldName: test.oldRc.ObjectMeta.Name, - NewName: test.newRc.ObjectMeta.Name, - Image: test.image, - Container: test.container, - DeploymentKey: test.deploymentKey, - } - updatedRc, err := CreateNewControllerFromCurrentController(fake, codec, config) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(updatedRc, test.newRc) { - t.Errorf("expected:\n%#v\ngot:\n%#v\n", test.newRc, updatedRc) - } - } -} - -// TestRollingUpdater_cleanupWithClients ensures that the cleanup policy is -// correctly implemented. -func TestRollingUpdater_cleanupWithClients(t *testing.T) { - rc := oldRc(2, 2) - rcExisting := newRc(1, 3) - - tests := []struct { - name string - policy RollingUpdaterCleanupPolicy - responses []runtime.Object - expected []string - }{ - { - name: "preserve", - policy: PreserveRollingUpdateCleanupPolicy, - responses: []runtime.Object{rcExisting}, - expected: []string{ - "get", - "update", - "get", - "get", - }, - }, - { - name: "delete", - policy: DeleteRollingUpdateCleanupPolicy, - responses: []runtime.Object{rcExisting}, - expected: []string{ - "get", - "update", - "get", - "get", - "delete", - }, - }, - { - name: "rename", - policy: RenameRollingUpdateCleanupPolicy, - responses: []runtime.Object{rcExisting}, - expected: []string{ - "get", - "update", - "get", - "get", - "delete", - "create", - "delete", - }, - }, - } - - for _, test := range tests { - fake := testclient.NewSimpleFake(test.responses...) - updater := &RollingUpdater{ - ns: "default", - c: fake, - } - config := &RollingUpdaterConfig{ - Out: ioutil.Discard, - OldRc: rc, - NewRc: rcExisting, - UpdatePeriod: 0, - Interval: time.Millisecond, - Timeout: time.Millisecond, - CleanupPolicy: test.policy, - } - err := updater.cleanupWithClients(rc, rcExisting, config) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(fake.Actions()) != len(test.expected) { - t.Fatalf("%s: unexpected actions: %v, expected %v", test.name, fake.Actions(), test.expected) - } - for j, action := range fake.Actions() { - if e, a := test.expected[j], action.GetVerb(); e != a { - t.Errorf("%s: unexpected action: expected %s, got %s", test.name, e, a) - } - } - } -} - -func TestFindSourceController(t *testing.T) { - ctrl1 := api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Annotations: map[string]string{ - sourceIdAnnotation: "bar:1234", - }, - }, - } - ctrl2 := api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Annotations: map[string]string{ - sourceIdAnnotation: "foo:12345", - }, - }, - } - ctrl3 := api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - sourceIdAnnotation: "baz:45667", - }, - }, - } - tests := []struct { - list *api.ReplicationControllerList - expectedController *api.ReplicationController - err error - name string - expectError bool - }{ - { - list: &api.ReplicationControllerList{}, - expectError: true, - }, - { - list: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ctrl1}, - }, - name: "foo", - expectError: true, - }, - { - list: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ctrl1}, - }, - name: "bar", - expectedController: &ctrl1, - }, - { - list: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ctrl1, ctrl2}, - }, - name: "bar", - expectedController: &ctrl1, - }, - { - list: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ctrl1, ctrl2}, - }, - name: "foo", - expectedController: &ctrl2, - }, - { - list: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ctrl1, ctrl2, ctrl3}, - }, - name: "baz", - expectedController: &ctrl3, - }, - } - for _, test := range tests { - fakeClient := testclient.NewSimpleFake(test.list) - ctrl, err := FindSourceController(fakeClient, "default", test.name) - if test.expectError && err == nil { - t.Errorf("unexpected non-error") - } - if !test.expectError && err != nil { - t.Errorf("unexpected error") - } - if !reflect.DeepEqual(ctrl, test.expectedController) { - t.Errorf("expected:\n%v\ngot:\n%v\n", test.expectedController, ctrl) - } - } -} - -func TestUpdateExistingReplicationController(t *testing.T) { - tests := []struct { - rc *api.ReplicationController - name string - deploymentKey string - deploymentValue string - - expectedRc *api.ReplicationController - expectErr bool - }{ - { - rc: &api.ReplicationController{ - Spec: api.ReplicationControllerSpec{ - Template: &api.PodTemplateSpec{}, - }, - }, - name: "foo", - deploymentKey: "dk", - deploymentValue: "some-hash", - - expectedRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - "kubectl.kubernetes.io/next-controller-id": "foo", - }, - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "some-hash", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "some-hash", - }, - }, - }, - }, - }, - }, - { - rc: &api.ReplicationController{ - Spec: api.ReplicationControllerSpec{ - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "some-other-hash", - }, - }, - }, - Selector: map[string]string{ - "dk": "some-other-hash", - }, - }, - }, - name: "foo", - deploymentKey: "dk", - deploymentValue: "some-hash", - - expectedRc: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - "kubectl.kubernetes.io/next-controller-id": "foo", - }, - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "dk": "some-other-hash", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "dk": "some-other-hash", - }, - }, - }, - }, - }, - }, - } - for _, test := range tests { - buffer := &bytes.Buffer{} - fakeClient := testclient.NewSimpleFake(test.expectedRc) - rc, err := UpdateExistingReplicationController(fakeClient, test.rc, "default", test.name, test.deploymentKey, test.deploymentValue, buffer) - if !reflect.DeepEqual(rc, test.expectedRc) { - t.Errorf("expected:\n%#v\ngot:\n%#v\n", test.expectedRc, rc) - } - if test.expectErr && err == nil { - t.Errorf("unexpected non-error") - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - } -} - -func TestUpdateWithRetries(t *testing.T) { - codec := testapi.Default.Codec() - rc := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "rc", - Labels: map[string]string{ - "foo": "bar", - }, - }, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "foo": "bar", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - - // Test end to end updating of the rc with retries. Essentially make sure the update handler - // sees the right updates, failures in update/get are handled properly, and that the updated - // rc with new resource version is returned to the caller. Without any of these rollingupdate - // will fail cryptically. - newRc := *rc - newRc.ResourceVersion = "2" - newRc.Spec.Selector["baz"] = "foobar" - updates := []*http.Response{ - {StatusCode: 500, Body: objBody(codec, &api.ReplicationController{})}, - {StatusCode: 500, Body: objBody(codec, &api.ReplicationController{})}, - {StatusCode: 200, Body: objBody(codec, &newRc)}, - } - gets := []*http.Response{ - {StatusCode: 500, Body: objBody(codec, &api.ReplicationController{})}, - {StatusCode: 200, Body: objBody(codec, rc)}, - } - fakeClient := &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == testapi.Default.ResourcePath("replicationcontrollers", "default", "rc") && m == "PUT": - update := updates[0] - updates = updates[1:] - // We should always get an update with a valid rc even when the get fails. The rc should always - // contain the update. - if c, ok := readOrDie(t, req, codec).(*api.ReplicationController); !ok || !reflect.DeepEqual(rc, c) { - t.Errorf("Unexpected update body, got %+v expected %+v", c, rc) - } else if sel, ok := c.Spec.Selector["baz"]; !ok || sel != "foobar" { - t.Errorf("Expected selector label update, got %+v", c.Spec.Selector) - } else { - delete(c.Spec.Selector, "baz") - } - return update, nil - case p == testapi.Default.ResourcePath("replicationcontrollers", "default", "rc") && m == "GET": - get := gets[0] - gets = gets[1:] - return get, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - clientConfig := &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - client := client.NewOrDie(clientConfig) - client.Client = fakeClient.Client - - if rc, err := updateWithRetries( - client.ReplicationControllers("default"), rc, func(c *api.ReplicationController) { - c.Spec.Selector["baz"] = "foobar" - }); err != nil { - t.Errorf("unexpected error: %v", err) - } else if sel, ok := rc.Spec.Selector["baz"]; !ok || sel != "foobar" || rc.ResourceVersion != "2" { - t.Errorf("Expected updated rc, got %+v", rc) - } - if len(updates) != 0 || len(gets) != 0 { - t.Errorf("Remaining updates %+v gets %+v", updates, gets) - } -} - -func readOrDie(t *testing.T, req *http.Request, codec runtime.Codec) runtime.Object { - data, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Errorf("Error reading: %v", err) - t.FailNow() - } - obj, err := runtime.Decode(codec, data) - if err != nil { - t.Errorf("error decoding: %v", err) - t.FailNow() - } - return obj -} - -func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) -} - -func TestAddDeploymentHash(t *testing.T) { - buf := &bytes.Buffer{} - codec := testapi.Default.Codec() - rc := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{Name: "rc"}, - Spec: api.ReplicationControllerSpec{ - Selector: map[string]string{ - "foo": "bar", - }, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - } - - podList := &api.PodList{ - Items: []api.Pod{ - {ObjectMeta: api.ObjectMeta{Name: "foo"}}, - {ObjectMeta: api.ObjectMeta{Name: "bar"}}, - {ObjectMeta: api.ObjectMeta{Name: "baz"}}, - }, - } - - seen := sets.String{} - updatedRc := false - fakeClient := &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == testapi.Default.ResourcePath("pods", "default", "") && m == "GET": - if req.URL.RawQuery != "labelSelector=foo%3Dbar" { - t.Errorf("Unexpected query string: %s", req.URL.RawQuery) - } - return &http.Response{StatusCode: 200, Body: objBody(codec, podList)}, nil - case p == testapi.Default.ResourcePath("pods", "default", "foo") && m == "PUT": - seen.Insert("foo") - obj := readOrDie(t, req, codec) - podList.Items[0] = *(obj.(*api.Pod)) - return &http.Response{StatusCode: 200, Body: objBody(codec, &podList.Items[0])}, nil - case p == testapi.Default.ResourcePath("pods", "default", "bar") && m == "PUT": - seen.Insert("bar") - obj := readOrDie(t, req, codec) - podList.Items[1] = *(obj.(*api.Pod)) - return &http.Response{StatusCode: 200, Body: objBody(codec, &podList.Items[1])}, nil - case p == testapi.Default.ResourcePath("pods", "default", "baz") && m == "PUT": - seen.Insert("baz") - obj := readOrDie(t, req, codec) - podList.Items[2] = *(obj.(*api.Pod)) - return &http.Response{StatusCode: 200, Body: objBody(codec, &podList.Items[2])}, nil - case p == testapi.Default.ResourcePath("replicationcontrollers", "default", "rc") && m == "PUT": - updatedRc = true - return &http.Response{StatusCode: 200, Body: objBody(codec, rc)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - clientConfig := &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - client := client.NewOrDie(clientConfig) - client.Client = fakeClient.Client - - if _, err := AddDeploymentKeyToReplicationController(rc, client, "dk", "hash", api.NamespaceDefault, buf); err != nil { - t.Errorf("unexpected error: %v", err) - } - for _, pod := range podList.Items { - if !seen.Has(pod.Name) { - t.Errorf("Missing update for pod: %s", pod.Name) - } - } - if !updatedRc { - t.Errorf("Failed to update replication controller with new labels") - } -} - -func TestRollingUpdater_readyPods(t *testing.T) { - mkpod := func(owner *api.ReplicationController, ready bool) *api.Pod { - labels := map[string]string{} - for k, v := range owner.Spec.Selector { - labels[k] = v - } - status := api.ConditionTrue - if !ready { - status = api.ConditionFalse - } - return &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod", - Labels: labels, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - Status: status, - }, - }, - }, - } - } - - tests := []struct { - oldRc *api.ReplicationController - newRc *api.ReplicationController - // expectated old/new ready counts - oldReady int32 - newReady int32 - // pods owned by the rcs; indicate whether they're ready - oldPods []bool - newPods []bool - }{ - { - oldRc: oldRc(4, 4), - newRc: newRc(4, 4), - oldReady: 4, - newReady: 2, - oldPods: []bool{ - true, - true, - true, - true, - }, - newPods: []bool{ - true, - false, - true, - false, - }, - }, - { - oldRc: oldRc(4, 4), - newRc: newRc(4, 4), - oldReady: 0, - newReady: 1, - oldPods: []bool{ - false, - }, - newPods: []bool{ - true, - }, - }, - { - oldRc: oldRc(4, 4), - newRc: newRc(4, 4), - oldReady: 1, - newReady: 0, - oldPods: []bool{ - true, - }, - newPods: []bool{ - false, - }, - }, - } - - for i, test := range tests { - t.Logf("evaluating test %d", i) - // Populate the fake client with pods associated with their owners. - pods := []runtime.Object{} - for _, ready := range test.oldPods { - pods = append(pods, mkpod(test.oldRc, ready)) - } - for _, ready := range test.newPods { - pods = append(pods, mkpod(test.newRc, ready)) - } - client := testclient.NewSimpleFake(pods...) - - updater := &RollingUpdater{ - ns: "default", - c: client, - } - oldReady, newReady, err := updater.readyPods(test.oldRc, test.newRc) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if e, a := test.oldReady, oldReady; e != a { - t.Errorf("expected old ready %d, got %d", e, a) - } - if e, a := test.newReady, newReady; e != a { - t.Errorf("expected new ready %d, got %d", e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/run_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/run_test.go deleted file mode 100644 index b211fc363..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/run_test.go +++ /dev/null @@ -1,885 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" -) - -func TestGenerate(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *api.ReplicationController - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "-1", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - }, - }, - }, - }, - }, - }, - }, - - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "-1", - "env": []string{"a=b", "c=d"}, - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Env: []api.EnvVar{ - { - Name: "a", - Value: "b", - }, - { - Name: "c", - Value: "d", - }, - }, - }, - }, - }, - }, - }, - }, - }, - - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "-1", - "args": []string{"bar", "baz", "blah"}, - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Args: []string{"bar", "baz", "blah"}, - }, - }, - }, - }, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "-1", - "args": []string{"bar", "baz", "blah"}, - "command": "true", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Command: []string{"bar", "baz", "blah"}, - }, - }, - }, - }, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "80", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "port": "80", - "hostport": "80", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"run": "foo"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"run": "foo"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - HostPort: 80, - }, - }, - }, - }, - }, - }, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "hostport": "80", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"foo": "bar", "baz": "blah"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - }, - }, - }, - }, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "hostport": "80", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "requests": "cpu100m,memory=100Mi", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "requests": "cpu=100m&memory=100Mi", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "requests": "cpu=", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "requests": "cpu=100m,memory=100Mi", - "limits": "cpu=400m,memory=200Mi", - }, - expected: &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"foo": "bar", "baz": "blah"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), - }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - generator := BasicReplicationController{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.ReplicationController).Spec.Template, test.expected.Spec.Template) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected.Spec.Template, obj.(*api.ReplicationController).Spec.Template) - } - } -} - -func TestGeneratePod(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *api.Pod - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "port": "-1", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "env": []string{"a", "c"}, - }, - - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "env": []string{"a=b", "c=d"}, - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Env: []api.EnvVar{ - { - Name: "a", - Value: "b", - }, - { - Name: "c", - Value: "d", - }, - }, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "port": "80", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - }, - }, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "port": "80", - "hostport": "80", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - HostPort: 80, - }, - }, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "hostport": "80", - }, - expected: nil, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "stdin": "true", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Stdin: true, - StdinOnce: true, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - { - params: map[string]interface{}{ - "name": "foo", - "image": "someimage", - "replicas": "1", - "labels": "foo=bar,baz=blah", - "stdin": "true", - "leave-stdin-open": "true", - }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - ImagePullPolicy: api.PullIfNotPresent, - Stdin: true, - StdinOnce: false, - }, - }, - DNSPolicy: api.DNSClusterFirst, - RestartPolicy: api.RestartPolicyAlways, - }, - }, - }, - } - generator := BasicPod{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.Pod), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.Pod)) - } - } -} - -func TestGenerateDeployment(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *extensions.Deployment - expectErr bool - }{ - { - params: map[string]interface{}{ - "labels": "foo=bar,baz=blah", - "name": "foo", - "replicas": "3", - "image": "someimage", - "port": "80", - "hostport": "80", - "stdin": "true", - "command": "true", - "args": []string{"bar", "baz", "blah"}, - "env": []string{"a=b", "c=d"}, - "requests": "cpu=100m,memory=100Mi", - "limits": "cpu=400m,memory=200Mi", - }, - expected: &extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: extensions.DeploymentSpec{ - Replicas: 3, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar", "baz": "blah"}}, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Stdin: true, - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - HostPort: 80, - }, - }, - Command: []string{"bar", "baz", "blah"}, - Env: []api.EnvVar{ - { - Name: "a", - Value: "b", - }, - { - Name: "c", - Value: "d", - }, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), - }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - - generator := DeploymentV1Beta1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*extensions.Deployment), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*extensions.Deployment)) - } - } -} - -func TestGenerateJob(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *batch.Job - expectErr bool - }{ - { - params: map[string]interface{}{ - "labels": "foo=bar,baz=blah", - "name": "foo", - "image": "someimage", - "port": "80", - "hostport": "80", - "stdin": "true", - "leave-stdin-open": "true", - "command": "true", - "args": []string{"bar", "baz", "blah"}, - "env": []string{"a=b", "c=d"}, - "requests": "cpu=100m,memory=100Mi", - "limits": "cpu=400m,memory=200Mi", - "restart": "OnFailure", - }, - expected: &batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - ManualSelector: newBool(true), - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - Stdin: true, - StdinOnce: false, - Ports: []api.ContainerPort{ - { - ContainerPort: 80, - HostPort: 80, - }, - }, - Command: []string{"bar", "baz", "blah"}, - Env: []api.EnvVar{ - { - Name: "a", - Value: "b", - }, - { - Name: "c", - Value: "d", - }, - }, - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceCPU: resource.MustParse("100m"), - api.ResourceMemory: resource.MustParse("100Mi"), - }, - Limits: api.ResourceList{ - api.ResourceCPU: resource.MustParse("400m"), - api.ResourceMemory: resource.MustParse("200Mi"), - }, - }, - }, - }, - }, - }, - }, - }, - }, - } - - generator := JobV1Beta1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*batch.Job), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batch.Job)) - } - } -} - -func TestParseEnv(t *testing.T) { - tests := []struct { - envArray []string - expected []api.EnvVar - expectErr bool - test string - }{ - { - envArray: []string{ - "THIS_ENV=isOK", - "HAS_COMMAS=foo,bar", - "HAS_EQUALS=jJnro54iUu75xNy==", - }, - expected: []api.EnvVar{ - { - Name: "THIS_ENV", - Value: "isOK", - }, - { - Name: "HAS_COMMAS", - Value: "foo,bar", - }, - { - Name: "HAS_EQUALS", - Value: "jJnro54iUu75xNy==", - }, - }, - expectErr: false, - test: "test case 1", - }, - { - envArray: []string{ - "WITH_OUT_EQUALS", - }, - expected: []api.EnvVar{}, - expectErr: true, - test: "test case 2", - }, - { - envArray: []string{ - "WITH_OUT_VALUES=", - }, - expected: []api.EnvVar{}, - expectErr: true, - test: "test case 3", - }, - { - envArray: []string{ - "=WITH_OUT_NAME", - }, - expected: []api.EnvVar{}, - expectErr: true, - test: "test case 4", - }, - } - - for _, test := range tests { - envs, err := parseEnvs(test.envArray) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(envs, test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v (%s)", test.expected, envs, test.test) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/scale_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/scale_test.go deleted file mode 100644 index f3ccb3ac9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/scale_test.go +++ /dev/null @@ -1,729 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "errors" - "testing" - - "k8s.io/kubernetes/pkg/api" - kerrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" -) - -type ErrorReplicationControllers struct { - testclient.FakeReplicationControllers - invalid bool -} - -func (c *ErrorReplicationControllers) Update(controller *api.ReplicationController) (*api.ReplicationController, error) { - if c.invalid { - return nil, kerrors.NewInvalid(api.Kind(controller.Kind), controller.Name, nil) - } - return nil, errors.New("Replication controller update failure") -} - -type ErrorReplicationControllerClient struct { - testclient.Fake - invalid bool -} - -func (c *ErrorReplicationControllerClient) ReplicationControllers(namespace string) client.ReplicationControllerInterface { - return &ErrorReplicationControllers{testclient.FakeReplicationControllers{Fake: &c.Fake, Namespace: namespace}, c.invalid} -} - -func TestReplicationControllerScaleRetry(t *testing.T) { - fake := &ErrorReplicationControllerClient{Fake: testclient.Fake{}, invalid: false} - scaler := ReplicationControllerScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - if err != nil { - t.Errorf("Did not expect an error on update failure, got %v", err) - } - preconditions = ScalePrecondition{3, ""} - scaleFunc = ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err = scaleFunc() - if err == nil { - t.Errorf("Expected error on precondition failure") - } -} - -func TestReplicationControllerScaleInvalid(t *testing.T) { - fake := &ErrorReplicationControllerClient{Fake: testclient.Fake{}, invalid: true} - scaler := ReplicationControllerScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - e, ok := err.(ScaleError) - if err == nil || !ok || e.FailureType != ScaleUpdateInvalidFailure { - t.Errorf("Expected error on invalid update failure, got %v", err) - } -} - -func TestReplicationControllerScale(t *testing.T) { - fake := &testclient.Fake{} - scaler := ReplicationControllerScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 2 { - t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) - } - if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetObject().(*api.ReplicationController).Spec.Replicas != int32(count) { - t.Errorf("unexpected action %v, expected update-replicationController with replicas = %d", actions[1], count) - } -} - -func TestReplicationControllerScaleFailsPreconditions(t *testing.T) { - fake := testclient.NewSimpleFake(&api.ReplicationController{ - Spec: api.ReplicationControllerSpec{ - Replicas: 10, - }, - }) - scaler := ReplicationControllerScaler{fake} - preconditions := ScalePrecondition{2, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 1 { - t.Errorf("unexpected actions: %v, expected 1 action (get)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "replicationcontrollers" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) - } -} - -func TestValidateReplicationController(t *testing.T) { - tests := []struct { - preconditions ScalePrecondition - controller api.ReplicationController - expectError bool - test string - }{ - { - preconditions: ScalePrecondition{-1, ""}, - expectError: false, - test: "defaults", - }, - { - preconditions: ScalePrecondition{-1, ""}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 10, - }, - }, - expectError: false, - test: "defaults 2", - }, - { - preconditions: ScalePrecondition{0, ""}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - }, - }, - expectError: false, - test: "size matches", - }, - { - preconditions: ScalePrecondition{-1, "foo"}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 10, - }, - }, - expectError: false, - test: "resource version matches", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 10, - }, - }, - expectError: false, - test: "both match", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 20, - }, - }, - expectError: true, - test: "size different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 10, - }, - }, - expectError: true, - test: "version different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - controller: api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 20, - }, - }, - expectError: true, - test: "both different", - }, - } - for _, test := range tests { - err := test.preconditions.ValidateReplicationController(&test.controller) - if err != nil && !test.expectError { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) - } - } -} - -type ErrorJobs struct { - testclient.FakeJobs - invalid bool -} - -func (c *ErrorJobs) Update(job *batch.Job) (*batch.Job, error) { - if c.invalid { - return nil, kerrors.NewInvalid(batch.Kind(job.Kind), job.Name, nil) - } - return nil, errors.New("Job update failure") -} - -func (c *ErrorJobs) Get(name string) (*batch.Job, error) { - zero := int32(0) - return &batch.Job{ - Spec: batch.JobSpec{ - Parallelism: &zero, - }, - }, nil -} - -type ErrorJobClient struct { - testclient.FakeExperimental - invalid bool -} - -func (c *ErrorJobClient) Jobs(namespace string) client.JobInterface { - return &ErrorJobs{testclient.FakeJobs{Fake: &c.FakeExperimental, Namespace: namespace}, c.invalid} -} - -func TestJobScaleRetry(t *testing.T) { - fake := &ErrorJobClient{FakeExperimental: testclient.FakeExperimental{}, invalid: false} - scaler := JobScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass != false { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - if err != nil { - t.Errorf("Did not expect an error on update failure, got %v", err) - } - preconditions = ScalePrecondition{3, ""} - scaleFunc = ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err = scaleFunc() - if err == nil { - t.Errorf("Expected error on precondition failure") - } -} - -func TestJobScale(t *testing.T) { - fake := &testclient.FakeExperimental{Fake: &testclient.Fake{}} - scaler := JobScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 2 { - t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "jobs" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) - } - if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "jobs" || *action.GetObject().(*batch.Job).Spec.Parallelism != int32(count) { - t.Errorf("unexpected action %v, expected update-job with parallelism = %d", actions[1], count) - } -} - -func TestJobScaleInvalid(t *testing.T) { - fake := &ErrorJobClient{FakeExperimental: testclient.FakeExperimental{}, invalid: true} - scaler := JobScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - e, ok := err.(ScaleError) - if err == nil || !ok || e.FailureType != ScaleUpdateInvalidFailure { - t.Errorf("Expected error on invalid update failure, got %v", err) - } -} - -func TestJobScaleFailsPreconditions(t *testing.T) { - ten := int32(10) - fake := testclient.NewSimpleFake(&batch.Job{ - Spec: batch.JobSpec{ - Parallelism: &ten, - }, - }) - scaler := JobScaler{&testclient.FakeExperimental{Fake: fake}} - preconditions := ScalePrecondition{2, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 1 { - t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "jobs" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-job %s", actions[0], name) - } -} - -func TestValidateJob(t *testing.T) { - zero, ten, twenty := int32(0), int32(10), int32(20) - tests := []struct { - preconditions ScalePrecondition - job batch.Job - expectError bool - test string - }{ - { - preconditions: ScalePrecondition{-1, ""}, - expectError: false, - test: "defaults", - }, - { - preconditions: ScalePrecondition{-1, ""}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: batch.JobSpec{ - Parallelism: &ten, - }, - }, - expectError: false, - test: "defaults 2", - }, - { - preconditions: ScalePrecondition{0, ""}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: batch.JobSpec{ - Parallelism: &zero, - }, - }, - expectError: false, - test: "size matches", - }, - { - preconditions: ScalePrecondition{-1, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: batch.JobSpec{ - Parallelism: &ten, - }, - }, - expectError: false, - test: "resource version matches", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: batch.JobSpec{ - Parallelism: &ten, - }, - }, - expectError: false, - test: "both match", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: batch.JobSpec{ - Parallelism: &twenty, - }, - }, - expectError: true, - test: "size different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - }, - expectError: true, - test: "parallelism nil", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: batch.JobSpec{ - Parallelism: &ten, - }, - }, - expectError: true, - test: "version different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - job: batch.Job{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: batch.JobSpec{ - Parallelism: &twenty, - }, - }, - expectError: true, - test: "both different", - }, - } - for _, test := range tests { - err := test.preconditions.ValidateJob(&test.job) - if err != nil && !test.expectError { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) - } - } -} - -type ErrorDeployments struct { - testclient.FakeDeployments - invalid bool -} - -func (c *ErrorDeployments) Update(deployment *extensions.Deployment) (*extensions.Deployment, error) { - if c.invalid { - return nil, kerrors.NewInvalid(extensions.Kind(deployment.Kind), deployment.Name, nil) - } - return nil, errors.New("deployment update failure") -} - -func (c *ErrorDeployments) Get(name string) (*extensions.Deployment, error) { - return &extensions.Deployment{ - Spec: extensions.DeploymentSpec{ - Replicas: 0, - }, - }, nil -} - -type ErrorDeploymentClient struct { - testclient.FakeExperimental - invalid bool -} - -func (c *ErrorDeploymentClient) Deployments(namespace string) client.DeploymentInterface { - return &ErrorDeployments{testclient.FakeDeployments{Fake: &c.FakeExperimental, Namespace: namespace}, c.invalid} -} - -func TestDeploymentScaleRetry(t *testing.T) { - fake := &ErrorDeploymentClient{FakeExperimental: testclient.FakeExperimental{Fake: &testclient.Fake{}}, invalid: false} - scaler := &DeploymentScaler{fake} - preconditions := &ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(scaler, preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass != false { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - if err != nil { - t.Errorf("Did not expect an error on update failure, got %v", err) - } - preconditions = &ScalePrecondition{3, ""} - scaleFunc = ScaleCondition(scaler, preconditions, namespace, name, count) - pass, err = scaleFunc() - if err == nil { - t.Errorf("Expected error on precondition failure") - } -} - -func TestDeploymentScale(t *testing.T) { - fake := &testclient.FakeExperimental{Fake: &testclient.Fake{}} - scaler := DeploymentScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 2 { - t.Errorf("unexpected actions: %v, expected 2 actions (get, update)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "deployments" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-replicationController %s", actions[0], name) - } - if action, ok := actions[1].(testclient.UpdateAction); !ok || action.GetResource() != "deployments" || action.GetObject().(*extensions.Deployment).Spec.Replicas != int32(count) { - t.Errorf("unexpected action %v, expected update-deployment with replicas = %d", actions[1], count) - } -} - -func TestDeploymentScaleInvalid(t *testing.T) { - fake := &ErrorDeploymentClient{FakeExperimental: testclient.FakeExperimental{Fake: &testclient.Fake{}}, invalid: true} - scaler := DeploymentScaler{fake} - preconditions := ScalePrecondition{-1, ""} - count := uint(3) - name := "foo" - namespace := "default" - - scaleFunc := ScaleCondition(&scaler, &preconditions, namespace, name, count) - pass, err := scaleFunc() - if pass { - t.Errorf("Expected an update failure to return pass = false, got pass = %v", pass) - } - e, ok := err.(ScaleError) - if err == nil || !ok || e.FailureType != ScaleUpdateInvalidFailure { - t.Errorf("Expected error on invalid update failure, got %v", err) - } -} - -func TestDeploymentScaleFailsPreconditions(t *testing.T) { - fake := testclient.NewSimpleFake(&extensions.Deployment{ - Spec: extensions.DeploymentSpec{ - Replicas: 10, - }, - }) - scaler := DeploymentScaler{&testclient.FakeExperimental{Fake: fake}} - preconditions := ScalePrecondition{2, ""} - count := uint(3) - name := "foo" - scaler.Scale("default", name, count, &preconditions, nil, nil) - - actions := fake.Actions() - if len(actions) != 1 { - t.Errorf("unexpected actions: %v, expected 1 actions (get)", actions) - } - if action, ok := actions[0].(testclient.GetAction); !ok || action.GetResource() != "deployments" || action.GetName() != name { - t.Errorf("unexpected action: %v, expected get-deployment %s", actions[0], name) - } -} - -func TestValidateDeployment(t *testing.T) { - zero, ten, twenty := int32(0), int32(10), int32(20) - tests := []struct { - preconditions ScalePrecondition - deployment extensions.Deployment - expectError bool - test string - }{ - { - preconditions: ScalePrecondition{-1, ""}, - expectError: false, - test: "defaults", - }, - { - preconditions: ScalePrecondition{-1, ""}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: extensions.DeploymentSpec{ - Replicas: ten, - }, - }, - expectError: false, - test: "defaults 2", - }, - { - preconditions: ScalePrecondition{0, ""}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: extensions.DeploymentSpec{ - Replicas: zero, - }, - }, - expectError: false, - test: "size matches", - }, - { - preconditions: ScalePrecondition{-1, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: extensions.DeploymentSpec{ - Replicas: ten, - }, - }, - expectError: false, - test: "resource version matches", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: extensions.DeploymentSpec{ - Replicas: ten, - }, - }, - expectError: false, - test: "both match", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - Spec: extensions.DeploymentSpec{ - Replicas: twenty, - }, - }, - expectError: true, - test: "size different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "foo", - }, - }, - expectError: true, - test: "no replicas", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: extensions.DeploymentSpec{ - Replicas: ten, - }, - }, - expectError: true, - test: "version different", - }, - { - preconditions: ScalePrecondition{10, "foo"}, - deployment: extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - ResourceVersion: "bar", - }, - Spec: extensions.DeploymentSpec{ - Replicas: twenty, - }, - }, - expectError: true, - test: "both different", - }, - } - for _, test := range tests { - err := test.preconditions.ValidateDeployment(&test.deployment) - if err != nil && !test.expectError { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - if err == nil && test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_for_docker_registry_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_for_docker_registry_test.go deleted file mode 100644 index 65d8d397d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_for_docker_registry_test.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestSecretForDockerRegistryGenerate(t *testing.T) { - username, password, email, server := "test-user", "test-password", "test-user@example.org", "https://index.docker.io/v1/" - secretData, err := handleDockercfgContent(username, password, email, server) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - tests := map[string]struct { - params map[string]interface{} - expected *api.Secret - expectErr bool - }{ - "test-valid-use": { - params: map[string]interface{}{ - "name": "foo", - "docker-server": server, - "docker-username": username, - "docker-password": password, - "docker-email": email, - }, - expected: &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string][]byte{ - api.DockerConfigKey: secretData, - }, - Type: api.SecretTypeDockercfg, - }, - expectErr: false, - }, - "test-missing-required-param": { - params: map[string]interface{}{ - "name": "foo", - "docker-server": server, - "docker-password": password, - "docker-email": email, - }, - expectErr: true, - }, - } - - generator := SecretForDockerRegistryGeneratorV1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.Secret), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.Secret)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_test.go deleted file mode 100644 index 944c42356..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/secret_test.go +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestSecretGenerate(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *api.Secret - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - }, - expected: &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string][]byte{}, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "type": "my-type", - }, - expected: &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string][]byte{}, - Type: "my-type", - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1=value1", "key2=value2"}, - }, - expected: &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string][]byte{ - "key1": []byte("value1"), - "key2": []byte("value2"), - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1value1"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-file": []string{"key1=/file=2"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-file": []string{"key1==value"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1==value1"}, - }, - expected: &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string][]byte{ - "key1": []byte("=value1"), - }, - }, - expectErr: false, - }, - } - generator := SecretGeneratorV1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.Secret), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.Secret)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/service_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/service_test.go deleted file mode 100644 index 80144239e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/service_test.go +++ /dev/null @@ -1,417 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestGenerateService(t *testing.T) { - tests := []struct { - generator Generator - params map[string]interface{} - expected api.Service - }{ - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "TCP", - "container-port": "1234", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(1234), - }, - }, - }, - }, - }, - { - - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "UDP", - "container-port": "foobar", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "UDP", - TargetPort: intstr.FromString("foobar"), - }, - }, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "labels": "key1=value1,key2=value2", - "name": "test", - "port": "80", - "protocol": "TCP", - "container-port": "1234", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - Labels: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(1234), - }, - }, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "UDP", - "container-port": "foobar", - "external-ip": "1.2.3.4", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "UDP", - TargetPort: intstr.FromString("foobar"), - }, - }, - ExternalIPs: []string{"1.2.3.4"}, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "UDP", - "container-port": "foobar", - "external-ip": "1.2.3.4", - "create-external-load-balancer": "true", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "UDP", - TargetPort: intstr.FromString("foobar"), - }, - }, - Type: api.ServiceTypeLoadBalancer, - ExternalIPs: []string{"1.2.3.4"}, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "UDP", - "container-port": "foobar", - "type": string(api.ServiceTypeNodePort), - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "UDP", - TargetPort: intstr.FromString("foobar"), - }, - }, - Type: api.ServiceTypeNodePort, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "UDP", - "container-port": "foobar", - "create-external-load-balancer": "true", // ignored when type is present - "type": string(api.ServiceTypeNodePort), - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "UDP", - TargetPort: intstr.FromString("foobar"), - }, - }, - Type: api.ServiceTypeNodePort, - }, - }, - }, - { - generator: ServiceGeneratorV1{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "TCP", - "container-port": "1234", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Name: "default", - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(1234), - }, - }, - }, - }, - }, - { - generator: ServiceGeneratorV1{}, - params: map[string]interface{}{ - "selector": "foo=bar,baz=blah", - "name": "test", - "port": "80", - "protocol": "TCP", - "container-port": "1234", - "session-affinity": "ClientIP", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - "baz": "blah", - }, - Ports: []api.ServicePort{ - { - Name: "default", - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(1234), - }, - }, - SessionAffinity: api.ServiceAffinityClientIP, - }, - }, - }, - { - generator: ServiceGeneratorV1{}, - params: map[string]interface{}{ - "selector": "foo=bar", - "name": "test", - "ports": "80,443", - "protocol": "TCP", - "container-port": "foobar", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - }, - Ports: []api.ServicePort{ - { - Name: "port-1", - Port: 80, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromString("foobar"), - }, - { - Name: "port-2", - Port: 443, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromString("foobar"), - }, - }, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar", - "name": "test", - "ports": "80,443", - "protocol": "UDP", - "target-port": "1234", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - }, - Ports: []api.ServicePort{ - { - Name: "port-1", - Port: 80, - Protocol: api.ProtocolUDP, - TargetPort: intstr.FromInt(1234), - }, - { - Name: "port-2", - Port: 443, - Protocol: api.ProtocolUDP, - TargetPort: intstr.FromInt(1234), - }, - }, - }, - }, - }, - { - generator: ServiceGeneratorV2{}, - params: map[string]interface{}{ - "selector": "foo=bar", - "name": "test", - "ports": "80,443", - "protocol": "TCP", - }, - expected: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "test", - }, - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "foo": "bar", - }, - Ports: []api.ServicePort{ - { - Name: "port-1", - Port: 80, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(80), - }, - { - Name: "port-2", - Port: 443, - Protocol: api.ProtocolTCP, - TargetPort: intstr.FromInt(443), - }, - }, - }, - }, - }, - } - for _, test := range tests { - obj, err := test.generator.Generate(test.params) - if !reflect.DeepEqual(obj, &test.expected) { - t.Errorf("expected:\n%#v\ngot\n%#v\n", &test.expected, obj) - } - if err != nil { - t.Errorf("unexpected error: %v", err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/serviceaccount_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/serviceaccount_test.go deleted file mode 100644 index ca000f85f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/serviceaccount_test.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestServiceAccountGenerate(t *testing.T) { - tests := []struct { - name string - expected *api.ServiceAccount - expectErr bool - }{ - { - name: "foo", - expected: &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, - expectErr: false, - }, - { - expectErr: true, - }, - } - for _, test := range tests { - generator := ServiceAccountGeneratorV1{ - Name: test.name, - } - obj, err := generator.StructuredGenerate() - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.ServiceAccount), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.ServiceAccount)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorted_event_list_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorted_event_list_test.go deleted file mode 100644 index 471069ed2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorted_event_list_test.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "sort" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -// VerifyDatesInOrder checks the start of each line for a RFC1123Z date -// and posts error if all subsequent dates are not equal or increasing -func VerifyDatesInOrder( - resultToTest, rowDelimiter, columnDelimiter string, t *testing.T) { - lines := strings.Split(resultToTest, rowDelimiter) - var previousTime time.Time - for _, str := range lines { - columns := strings.Split(str, columnDelimiter) - if len(columns) > 0 { - currentTime, err := time.Parse(time.RFC1123Z, columns[0]) - if err == nil { - if previousTime.After(currentTime) { - t.Errorf( - "Output is not sorted by time. %s should be listed after %s. Complete output: %s", - previousTime.Format(time.RFC1123Z), - currentTime.Format(time.RFC1123Z), - resultToTest) - } - previousTime = currentTime - } - } - } - -} - -func TestSortableEvents(t *testing.T) { - // Arrange - list := SortableEvents([]api.Event{ - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 1", - FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "scheduler"}, - Message: "Item 2", - FirstTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 3", - FirstTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - }) - - // Act - sort.Sort(list) - - // Assert - if list[0].Message != "Item 2" || - list[1].Message != "Item 3" || - list[2].Message != "Item 1" { - t.Fatal("List is not sorted by time. List: ", list) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorting_printer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorting_printer_test.go deleted file mode 100644 index 4839159a3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/sorting_printer_test.go +++ /dev/null @@ -1,236 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - internal "k8s.io/kubernetes/pkg/api" - api "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" -) - -func encodeOrDie(obj runtime.Object) []byte { - data, err := runtime.Encode(internal.Codecs.LegacyCodec(api.SchemeGroupVersion), obj) - if err != nil { - panic(err.Error()) - } - return data -} - -func TestSortingPrinter(t *testing.T) { - intPtr := func(val int32) *int32 { return &val } - - a := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "a", - }, - } - - b := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "b", - }, - } - - c := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "c", - }, - } - - tests := []struct { - obj runtime.Object - sort runtime.Object - field string - name string - }{ - { - name: "in-order-already", - obj: &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "a", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "b", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "c", - }, - }, - }, - }, - sort: &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "a", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "b", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "c", - }, - }, - }, - }, - field: "{.metadata.name}", - }, - { - name: "reverse-order", - obj: &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "b", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "c", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "a", - }, - }, - }, - }, - sort: &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "a", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "b", - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "c", - }, - }, - }, - }, - field: "{.metadata.name}", - }, - { - name: "random-order-numbers", - obj: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(5), - }, - }, - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(1), - }, - }, - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(9), - }, - }, - }, - }, - sort: &api.ReplicationControllerList{ - Items: []api.ReplicationController{ - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(1), - }, - }, - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(5), - }, - }, - { - Spec: api.ReplicationControllerSpec{ - Replicas: intPtr(9), - }, - }, - }, - }, - field: "{.spec.replicas}", - }, - { - name: "v1.List in order", - obj: &api.List{ - Items: []runtime.RawExtension{ - {Raw: encodeOrDie(a)}, - {Raw: encodeOrDie(b)}, - {Raw: encodeOrDie(c)}, - }, - }, - sort: &api.List{ - Items: []runtime.RawExtension{ - {Raw: encodeOrDie(a)}, - {Raw: encodeOrDie(b)}, - {Raw: encodeOrDie(c)}, - }, - }, - field: "{.metadata.name}", - }, - { - name: "v1.List in reverse", - obj: &api.List{ - Items: []runtime.RawExtension{ - {Raw: encodeOrDie(c)}, - {Raw: encodeOrDie(b)}, - {Raw: encodeOrDie(a)}, - }, - }, - sort: &api.List{ - Items: []runtime.RawExtension{ - {Raw: encodeOrDie(a)}, - {Raw: encodeOrDie(b)}, - {Raw: encodeOrDie(c)}, - }, - }, - field: "{.metadata.name}", - }, - } - for _, test := range tests { - sort := &SortingPrinter{SortField: test.field, Decoder: internal.Codecs.UniversalDecoder()} - if err := sort.sortObj(test.obj); err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.name) - continue - } - if !reflect.DeepEqual(test.obj, test.sort) { - t.Errorf("[%s]\nexpected:\n%v\nsaw:\n%v", test.name, test.sort, test.obj) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/stop_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/stop_test.go deleted file mode 100644 index dfc161051..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/stop_test.go +++ /dev/null @@ -1,717 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "fmt" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" - "k8s.io/kubernetes/pkg/runtime" - deploymentutil "k8s.io/kubernetes/pkg/util/deployment" -) - -func TestReplicationControllerStop(t *testing.T) { - name := "foo" - ns := "default" - tests := []struct { - Name string - Objs []runtime.Object - StopError error - ExpectedActions []string - }{ - { - Name: "OnlyOneRC", - Objs: []runtime.Object{ - &api.ReplicationController{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - &api.ReplicationControllerList{ // LIST - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get", "list", "get", "update", "get", "get", "delete"}, - }, - { - Name: "NoOverlapping", - Objs: []runtime.Object{ - &api.ReplicationController{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - &api.ReplicationControllerList{ // LIST - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: "baz", - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k3": "v3"}}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get", "list", "get", "update", "get", "get", "delete"}, - }, - { - Name: "OverlappingError", - Objs: []runtime.Object{ - - &api.ReplicationController{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - &api.ReplicationControllerList{ // LIST - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: "baz", - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1", "k2": "v2"}}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - StopError: fmt.Errorf("Detected overlapping controllers for rc foo: baz, please manage deletion individually with --cascade=false."), - ExpectedActions: []string{"get", "list"}, - }, - - { - Name: "OverlappingButSafeDelete", - Objs: []runtime.Object{ - - &api.ReplicationController{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1", "k2": "v2"}}, - }, - &api.ReplicationControllerList{ // LIST - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: "baz", - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1", "k2": "v2", "k3": "v3"}}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "zaz", - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1", "k2": "v2"}}, - }, - }, - }, - }, - - StopError: fmt.Errorf("Detected overlapping controllers for rc foo: baz,zaz, please manage deletion individually with --cascade=false."), - ExpectedActions: []string{"get", "list"}, - }, - - { - Name: "TwoExactMatchRCs", - Objs: []runtime.Object{ - - &api.ReplicationController{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - &api.ReplicationControllerList{ // LIST - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{ - Name: "zaz", - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 0, - Selector: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - - StopError: nil, - ExpectedActions: []string{"get", "list", "delete"}, - }, - } - - for _, test := range tests { - fake := testclient.NewSimpleFake(test.Objs...) - reaper := ReplicationControllerReaper{fake, time.Millisecond, time.Millisecond} - err := reaper.Stop(ns, name, 0, nil) - if !reflect.DeepEqual(err, test.StopError) { - t.Errorf("%s unexpected error: %v", test.Name, err) - continue - } - - actions := fake.Actions() - if len(actions) != len(test.ExpectedActions) { - t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) - continue - } - for i, verb := range test.ExpectedActions { - if actions[i].GetResource() != "replicationcontrollers" { - t.Errorf("%s unexpected action: %+v, expected %s-replicationController", test.Name, actions[i], verb) - } - if actions[i].GetVerb() != verb { - t.Errorf("%s unexpected action: %+v, expected %s-replicationController", test.Name, actions[i], verb) - } - } - } -} - -func TestReplicaSetStop(t *testing.T) { - name := "foo" - ns := "default" - tests := []struct { - Name string - Objs []runtime.Object - StopError error - ExpectedActions []string - }{ - { - Name: "OnlyOneRS", - Objs: []runtime.Object{ - &extensions.ReplicaSet{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - }, - &extensions.ReplicaSetList{ // LIST - Items: []extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get", "get", "update", "get", "get", "delete"}, - }, - { - Name: "NoOverlapping", - Objs: []runtime.Object{ - &extensions.ReplicaSet{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - }, - &extensions.ReplicaSetList{ // LIST - Items: []extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: "baz", - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k3": "v3"}}, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get", "get", "update", "get", "get", "delete"}, - }, - // TODO: Implement tests for overlapping replica sets, similar to replication controllers, - // when the overlapping checks are implemented for replica sets. - } - - for _, test := range tests { - fake := testclient.NewSimpleFake(test.Objs...) - reaper := ReplicaSetReaper{fake, time.Millisecond, time.Millisecond} - err := reaper.Stop(ns, name, 0, nil) - if !reflect.DeepEqual(err, test.StopError) { - t.Errorf("%s unexpected error: %v", test.Name, err) - continue - } - - actions := fake.Actions() - if len(actions) != len(test.ExpectedActions) { - t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) - continue - } - for i, verb := range test.ExpectedActions { - if actions[i].GetResource() != "replicasets" { - t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb) - } - if actions[i].GetVerb() != verb { - t.Errorf("%s unexpected action: %+v, expected %s-replicaSet", test.Name, actions[i], verb) - } - } - } -} - -func TestJobStop(t *testing.T) { - name := "foo" - ns := "default" - zero := int32(0) - tests := []struct { - Name string - Objs []runtime.Object - StopError error - ExpectedActions []string - }{ - { - Name: "OnlyOneJob", - Objs: []runtime.Object{ - &batch.Job{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: batch.JobSpec{ - Parallelism: &zero, - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"k1": "v1"}, - }, - }, - }, - &batch.JobList{ // LIST - Items: []batch.Job{ - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: batch.JobSpec{ - Parallelism: &zero, - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"k1": "v1"}, - }, - }, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get:jobs", "get:jobs", "update:jobs", - "get:jobs", "get:jobs", "list:pods", "delete:jobs"}, - }, - { - Name: "JobWithDeadPods", - Objs: []runtime.Object{ - &batch.Job{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: batch.JobSpec{ - Parallelism: &zero, - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"k1": "v1"}, - }, - }, - }, - &batch.JobList{ // LIST - Items: []batch.Job{ - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: batch.JobSpec{ - Parallelism: &zero, - Selector: &unversioned.LabelSelector{ - MatchLabels: map[string]string{"k1": "v1"}, - }, - }, - }, - }, - }, - &api.PodList{ // LIST - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "pod1", - Namespace: ns, - Labels: map[string]string{"k1": "v1"}, - }, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get:jobs", "get:jobs", "update:jobs", - "get:jobs", "get:jobs", "list:pods", "delete:pods", "delete:jobs"}, - }, - } - - for _, test := range tests { - fake := testclient.NewSimpleFake(test.Objs...) - reaper := JobReaper{fake, time.Millisecond, time.Millisecond} - err := reaper.Stop(ns, name, 0, nil) - if !reflect.DeepEqual(err, test.StopError) { - t.Errorf("%s unexpected error: %v", test.Name, err) - continue - } - - actions := fake.Actions() - if len(actions) != len(test.ExpectedActions) { - t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) - continue - } - for i, expAction := range test.ExpectedActions { - action := strings.Split(expAction, ":") - if actions[i].GetVerb() != action[0] { - t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction) - } - if actions[i].GetResource() != action[1] { - t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction) - } - } - } -} - -func TestDeploymentStop(t *testing.T) { - name := "foo" - ns := "default" - deployment := extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.DeploymentSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - Status: extensions.DeploymentStatus{ - Replicas: 0, - }, - } - template := deploymentutil.GetNewReplicaSetTemplate(&deployment) - tests := []struct { - Name string - Objs []runtime.Object - StopError error - ExpectedActions []string - }{ - { - Name: "SimpleDeployment", - Objs: []runtime.Object{ - &extensions.Deployment{ // GET - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.DeploymentSpec{ - Replicas: 0, - Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"k1": "v1"}}, - }, - Status: extensions.DeploymentStatus{ - Replicas: 0, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get:deployments", "update:deployments", - "get:deployments", "list:replicasets", "delete:deployments"}, - }, - { - Name: "Deployment with single replicaset", - Objs: []runtime.Object{ - &deployment, // GET - &extensions.ReplicaSetList{ // LIST - Items: []extensions.ReplicaSet{ - { - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: ns, - }, - Spec: extensions.ReplicaSetSpec{ - Template: template, - }, - }, - }, - }, - }, - StopError: nil, - ExpectedActions: []string{"get:deployments", "update:deployments", - "get:deployments", "list:replicasets", "get:replicasets", - "get:replicasets", "update:replicasets", "get:replicasets", - "get:replicasets", "delete:replicasets", "delete:deployments"}, - }, - } - - for _, test := range tests { - fake := testclient.NewSimpleFake(test.Objs...) - reaper := DeploymentReaper{fake, time.Millisecond, time.Millisecond} - err := reaper.Stop(ns, name, 0, nil) - if !reflect.DeepEqual(err, test.StopError) { - t.Errorf("%s unexpected error: %v", test.Name, err) - continue - } - - actions := fake.Actions() - if len(actions) != len(test.ExpectedActions) { - t.Errorf("%s unexpected actions: %v, expected %d actions got %d", test.Name, actions, len(test.ExpectedActions), len(actions)) - continue - } - for i, expAction := range test.ExpectedActions { - action := strings.Split(expAction, ":") - if actions[i].GetVerb() != action[0] { - t.Errorf("%s unexpected verb: %+v, expected %s", test.Name, actions[i], expAction) - } - if actions[i].GetResource() != action[1] { - t.Errorf("%s unexpected resource: %+v, expected %s", test.Name, actions[i], expAction) - } - if len(action) == 3 && actions[i].GetSubresource() != action[2] { - t.Errorf("%s unexpected subresource: %+v, expected %s", test.Name, actions[i], expAction) - } - } - } -} - -type noSuchPod struct { - *testclient.FakePods -} - -func (c *noSuchPod) Get(name string) (*api.Pod, error) { - return nil, fmt.Errorf("%s does not exist", name) -} - -type noDeleteService struct { - *testclient.FakeServices -} - -func (c *noDeleteService) Delete(service string) error { - return fmt.Errorf("I'm afraid I can't do that, Dave") -} - -type reaperFake struct { - *testclient.Fake - noSuchPod, noDeleteService bool -} - -func (c *reaperFake) Pods(namespace string) client.PodInterface { - pods := &testclient.FakePods{Fake: c.Fake, Namespace: namespace} - if c.noSuchPod { - return &noSuchPod{pods} - } - return pods -} - -func (c *reaperFake) Services(namespace string) client.ServiceInterface { - services := &testclient.FakeServices{Fake: c.Fake, Namespace: namespace} - if c.noDeleteService { - return &noDeleteService{services} - } - return services -} - -func TestSimpleStop(t *testing.T) { - tests := []struct { - fake *reaperFake - kind unversioned.GroupKind - actions []testclient.Action - expectError bool - test string - }{ - { - fake: &reaperFake{ - Fake: &testclient.Fake{}, - }, - kind: api.Kind("Pod"), - actions: []testclient.Action{ - testclient.NewGetAction("pods", api.NamespaceDefault, "foo"), - testclient.NewDeleteAction("pods", api.NamespaceDefault, "foo"), - }, - expectError: false, - test: "stop pod succeeds", - }, - { - fake: &reaperFake{ - Fake: &testclient.Fake{}, - }, - kind: api.Kind("Service"), - actions: []testclient.Action{ - testclient.NewGetAction("services", api.NamespaceDefault, "foo"), - testclient.NewDeleteAction("services", api.NamespaceDefault, "foo"), - }, - expectError: false, - test: "stop service succeeds", - }, - { - fake: &reaperFake{ - Fake: &testclient.Fake{}, - noSuchPod: true, - }, - kind: api.Kind("Pod"), - actions: []testclient.Action{}, - expectError: true, - test: "stop pod fails, no pod", - }, - { - fake: &reaperFake{ - Fake: &testclient.Fake{}, - noDeleteService: true, - }, - kind: api.Kind("Service"), - actions: []testclient.Action{ - testclient.NewGetAction("services", api.NamespaceDefault, "foo"), - }, - expectError: true, - test: "stop service fails, can't delete", - }, - } - for _, test := range tests { - fake := test.fake - reaper, err := ReaperFor(test.kind, fake) - if err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - err = reaper.Stop("default", "foo", 0, nil) - if err != nil && !test.expectError { - t.Errorf("unexpected error: %v (%s)", err, test.test) - } - if err == nil { - if test.expectError { - t.Errorf("unexpected non-error: %v (%s)", err, test.test) - } - } - actions := fake.Actions() - if len(test.actions) != len(actions) { - t.Errorf("unexpected actions: %v; expected %v (%s)", actions, test.actions, test.test) - } - for i, action := range actions { - testAction := test.actions[i] - if action != testAction { - t.Errorf("unexpected action: %#v; expected %v (%s)", action, testAction, test.test) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.generated.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.generated.go deleted file mode 100644 index b3dd3628d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.generated.go +++ /dev/null @@ -1,555 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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. -*/ - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED BY codecgen. -// ************************************************************ - -package testing - -import ( - "errors" - "fmt" - codec1978 "github.com/ugorji/go/codec" - pkg2_api "k8s.io/kubernetes/pkg/api" - pkg1_unversioned "k8s.io/kubernetes/pkg/api/unversioned" - pkg3_types "k8s.io/kubernetes/pkg/types" - "reflect" - "runtime" - time "time" -) - -const ( - // ----- content types ---- - codecSelferC_UTF81234 = 1 - codecSelferC_RAW1234 = 0 - // ----- value types used ---- - codecSelferValueTypeArray1234 = 10 - codecSelferValueTypeMap1234 = 9 - // ----- containerStateValues ---- - codecSelfer_containerMapKey1234 = 2 - codecSelfer_containerMapValue1234 = 3 - codecSelfer_containerMapEnd1234 = 4 - codecSelfer_containerArrayElem1234 = 6 - codecSelfer_containerArrayEnd1234 = 7 -) - -var ( - codecSelferBitsize1234 = uint8(reflect.TypeOf(uint(0)).Bits()) - codecSelferOnlyMapOrArrayEncodeToStructErr1234 = errors.New(`only encoded map or array can be decoded into a struct`) -) - -type codecSelfer1234 struct{} - -func init() { - if codec1978.GenVersion != 5 { - _, file, _, _ := runtime.Caller(0) - err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", - 5, codec1978.GenVersion, file) - panic(err) - } - if false { // reference the types, but skip this branch at build/run time - var v0 pkg2_api.ObjectMeta - var v1 pkg1_unversioned.TypeMeta - var v2 pkg3_types.UID - var v3 time.Time - _, _, _, _ = v0, v1, v2, v3 - } -} - -func (x *TestStruct) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - yyq2[0] = true - yyq2[5] = x.Kind != "" - yyq2[6] = x.APIVersion != "" - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) - } else { - yynn2 = 4 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[0] { - yy4 := &x.ObjectMeta - yy4.CodecEncodeSelf(e) - } else { - r.EncodeNil() - } - } else { - if yyq2[0] { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("metadata")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yy6 := &x.ObjectMeta - yy6.CodecEncodeSelf(e) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yym9 := z.EncBinary() - _ = yym9 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Key)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("Key")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Key)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if x.Map == nil { - r.EncodeNil() - } else { - yym12 := z.EncBinary() - _ = yym12 - if false { - } else { - z.F.EncMapStringIntV(x.Map, false, e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("Map")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.Map == nil { - r.EncodeNil() - } else { - yym13 := z.EncBinary() - _ = yym13 - if false { - } else { - z.F.EncMapStringIntV(x.Map, false, e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if x.StringList == nil { - r.EncodeNil() - } else { - yym15 := z.EncBinary() - _ = yym15 - if false { - } else { - z.F.EncSliceStringV(x.StringList, false, e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("StringList")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.StringList == nil { - r.EncodeNil() - } else { - yym16 := z.EncBinary() - _ = yym16 - if false { - } else { - z.F.EncSliceStringV(x.StringList, false, e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if x.IntList == nil { - r.EncodeNil() - } else { - yym18 := z.EncBinary() - _ = yym18 - if false { - } else { - z.F.EncSliceIntV(x.IntList, false, e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("IntList")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.IntList == nil { - r.EncodeNil() - } else { - yym19 := z.EncBinary() - _ = yym19 - if false { - } else { - z.F.EncSliceIntV(x.IntList, false, e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[5] { - yym21 := z.EncBinary() - _ = yym21 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) - } - } else { - r.EncodeString(codecSelferC_UTF81234, "") - } - } else { - if yyq2[5] { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("kind")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym22 := z.EncBinary() - _ = yym22 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[6] { - yym24 := z.EncBinary() - _ = yym24 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) - } - } else { - r.EncodeString(codecSelferC_UTF81234, "") - } - } else { - if yyq2[6] { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym25 := z.EncBinary() - _ = yym25 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd1234) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd1234) - } - } - } -} - -func (x *TestStruct) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap1234 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd1234) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray1234 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) - } - } -} - -func (x *TestStruct) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey1234) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3 := string(yys3Slc) - z.DecSendContainerState(codecSelfer_containerMapValue1234) - switch yys3 { - case "metadata": - if r.TryDecodeAsNil() { - x.ObjectMeta = pkg2_api.ObjectMeta{} - } else { - yyv4 := &x.ObjectMeta - yyv4.CodecDecodeSelf(d) - } - case "Key": - if r.TryDecodeAsNil() { - x.Key = "" - } else { - x.Key = string(r.DecodeString()) - } - case "Map": - if r.TryDecodeAsNil() { - x.Map = nil - } else { - yyv6 := &x.Map - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - z.F.DecMapStringIntX(yyv6, false, d) - } - } - case "StringList": - if r.TryDecodeAsNil() { - x.StringList = nil - } else { - yyv8 := &x.StringList - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - z.F.DecSliceStringX(yyv8, false, d) - } - } - case "IntList": - if r.TryDecodeAsNil() { - x.IntList = nil - } else { - yyv10 := &x.IntList - yym11 := z.DecBinary() - _ = yym11 - if false { - } else { - z.F.DecSliceIntX(yyv10, false, d) - } - } - case "kind": - if r.TryDecodeAsNil() { - x.Kind = "" - } else { - x.Kind = string(r.DecodeString()) - } - case "apiVersion": - if r.TryDecodeAsNil() { - x.APIVersion = "" - } else { - x.APIVersion = string(r.DecodeString()) - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd1234) -} - -func (x *TestStruct) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj14 int - var yyb14 bool - var yyhl14 bool = l >= 0 - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.ObjectMeta = pkg2_api.ObjectMeta{} - } else { - yyv15 := &x.ObjectMeta - yyv15.CodecDecodeSelf(d) - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Key = "" - } else { - x.Key = string(r.DecodeString()) - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Map = nil - } else { - yyv17 := &x.Map - yym18 := z.DecBinary() - _ = yym18 - if false { - } else { - z.F.DecMapStringIntX(yyv17, false, d) - } - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.StringList = nil - } else { - yyv19 := &x.StringList - yym20 := z.DecBinary() - _ = yym20 - if false { - } else { - z.F.DecSliceStringX(yyv19, false, d) - } - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.IntList = nil - } else { - yyv21 := &x.IntList - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - z.F.DecSliceIntX(yyv21, false, d) - } - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Kind = "" - } else { - x.Kind = string(r.DecodeString()) - } - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.APIVersion = "" - } else { - x.APIVersion = string(r.DecodeString()) - } - for { - yyj14++ - if yyhl14 { - yyb14 = yyj14 > l - } else { - yyb14 = r.CheckBreak() - } - if yyb14 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj14-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.go deleted file mode 100644 index 2fbc2ed45..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/testing/types.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -type TestStruct struct { - unversioned.TypeMeta `json:",inline"` - api.ObjectMeta `json:"metadata,omitempty"` - Key string `json:"Key"` - Map map[string]int `json:"Map"` - StringList []string `json:"StringList"` - IntList []int `json:"IntList"` -} - -func (obj *TestStruct) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/memory_policy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/memory_policy_test.go deleted file mode 100644 index 27af3fd11..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/memory_policy_test.go +++ /dev/null @@ -1,187 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 qos - -import ( - "strconv" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" -) - -const ( - standardMemoryAmount = 8000000000 -) - -var ( - zeroRequestMemoryBestEffort = api.Container{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("5m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("0G"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("5m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - } - - edgeMemoryBestEffort = api.Container{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("0G"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("0G"), - }, - }, - } - - noRequestMemoryBestEffort = api.Container{ - Resources: api.ResourceRequirements{ - Limits: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - } - - noLimitMemoryBestEffort = api.Container{} - - memoryGuaranteed = api.Container{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("5m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - } - - memoryBurstable = api.Container{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse(strconv.Itoa(standardMemoryAmount / 2)), - }, - Limits: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), - }, - }, - } - - memoryBurstableNoLimit = api.Container{ - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceMemory): resource.MustParse(strconv.Itoa(standardMemoryAmount - 1)), - }, - }, - } -) - -func TestIsMemoryBestEffort(t *testing.T) { - validCases := []api.Container{zeroRequestMemoryBestEffort, noRequestMemoryBestEffort, noLimitMemoryBestEffort, edgeMemoryBestEffort} - for _, container := range validCases { - if !isMemoryBestEffort(&container) { - t.Errorf("container %+v is memory best-effort", container) - } - } - invalidCases := []api.Container{memoryGuaranteed, memoryBurstable} - for _, container := range invalidCases { - if isMemoryBestEffort(&container) { - t.Errorf("container %+v is not memory best-effort", container) - } - } -} - -func TestIsMemoryGuaranteed(t *testing.T) { - validCases := []api.Container{memoryGuaranteed} - for _, container := range validCases { - if !isMemoryGuaranteed(&container) { - t.Errorf("container %+v is memory guaranteed", container) - } - } - invalidCases := []api.Container{zeroRequestMemoryBestEffort, noRequestMemoryBestEffort, noLimitMemoryBestEffort, edgeMemoryBestEffort, memoryBurstable} - for _, container := range invalidCases { - if isMemoryGuaranteed(&container) { - t.Errorf("container %+v is not memory guaranteed", container) - } - } -} - -type oomTest struct { - container *api.Container - memoryCapacity int64 - lowOOMScoreAdj int // The max oom_score_adj score the container should be assigned. - highOOMScoreAdj int // The min oom_score_adj score the container should be assigned. -} - -func TestGetContainerOOMScoreAdjust(t *testing.T) { - - oomTests := []oomTest{ - { - container: &zeroRequestMemoryBestEffort, - memoryCapacity: 4000000000, - lowOOMScoreAdj: 1000, - highOOMScoreAdj: 1000, - }, - { - container: &edgeMemoryBestEffort, - memoryCapacity: 8000000000, - lowOOMScoreAdj: 1000, - highOOMScoreAdj: 1000, - }, - { - container: &noRequestMemoryBestEffort, - memoryCapacity: 7230457451, - lowOOMScoreAdj: 1000, - highOOMScoreAdj: 1000, - }, - { - container: &noLimitMemoryBestEffort, - memoryCapacity: 4000000000, - lowOOMScoreAdj: 1000, - highOOMScoreAdj: 1000, - }, - { - container: &memoryGuaranteed, - memoryCapacity: 123456789, - lowOOMScoreAdj: -999, - highOOMScoreAdj: -999, - }, - { - container: &memoryBurstable, - memoryCapacity: standardMemoryAmount, - lowOOMScoreAdj: 495, - highOOMScoreAdj: 505, - }, - { - container: &memoryBurstableNoLimit, - memoryCapacity: standardMemoryAmount, - lowOOMScoreAdj: 2, - highOOMScoreAdj: 2, - }, - } - for _, test := range oomTests { - oomScoreAdj := GetContainerOOMScoreAdjust(test.container, test.memoryCapacity) - if oomScoreAdj < test.lowOOMScoreAdj || oomScoreAdj > test.highOOMScoreAdj { - t.Errorf("oom_score_adj should be between %d and %d, but was %d", test.lowOOMScoreAdj, test.highOOMScoreAdj, oomScoreAdj) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/util/qos_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/util/qos_test.go deleted file mode 100644 index c931e204a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubelet/qos/util/qos_test.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" -) - -func getResourceList(cpu, memory string) api.ResourceList { - res := api.ResourceList{} - if cpu != "" { - res[api.ResourceCPU] = resource.MustParse(cpu) - } - if memory != "" { - res[api.ResourceMemory] = resource.MustParse(memory) - } - return res -} - -func getResourceRequirements(requests, limits api.ResourceList) api.ResourceRequirements { - res := api.ResourceRequirements{} - res.Requests = requests - res.Limits = limits - return res -} - -func newContainer(name string, requests api.ResourceList, limits api.ResourceList) api.Container { - return api.Container{ - Name: name, - Resources: getResourceRequirements(requests, limits), - } -} - -func newPod(name string, containers []api.Container) *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: name, - }, - Spec: api.PodSpec{ - Containers: containers, - }, - } -} - -func TestGetPodQos(t *testing.T) { - testCases := []struct { - pod *api.Pod - expected string - }{ - { - pod: newPod("best-effort", []api.Container{ - newContainer("best-effort", getResourceList("", ""), getResourceList("", "")), - }), - expected: BestEffort, - }, - { - pod: newPod("best-effort-guaranteed", []api.Container{ - newContainer("best-effort", getResourceList("", ""), getResourceList("", "")), - newContainer("guaranteed", getResourceList("10m", "100Mi"), getResourceList("10m", "100Mi")), - }), - expected: BestEffort, - }, - { - pod: newPod("best-effort-cpu-guaranteed-memory", []api.Container{ - newContainer("best-effort", getResourceList("", "100Mi"), getResourceList("", "100Mi")), - }), - expected: BestEffort, - }, - { - pod: newPod("burstable", []api.Container{ - newContainer("burstable", getResourceList("10m", "100Mi"), getResourceList("100m", "200Mi")), - }), - expected: Burstable, - }, - { - pod: newPod("guaranteed", []api.Container{ - newContainer("guaranteed", getResourceList("100m", "100Mi"), getResourceList("100m", "100Mi")), - }), - expected: Guaranteed, - }, - } - for _, testCase := range testCases { - if actual := GetPodQos(testCase.pod); testCase.expected != actual { - t.Errorf("invalid qos pod %s, expected: %s, actual: %s", testCase.pod.Name, testCase.expected, actual) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/labels_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/labels_test.go deleted file mode 100644 index 8d3834d51..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/labels_test.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 labels - -import ( - "testing" -) - -func matches(t *testing.T, ls Set, want string) { - if ls.String() != want { - t.Errorf("Expected '%s', but got '%s'", want, ls.String()) - } -} - -func TestSetString(t *testing.T) { - matches(t, Set{"x": "y"}, "x=y") - matches(t, Set{"foo": "bar"}, "foo=bar") - matches(t, Set{"foo": "bar", "baz": "qup"}, "baz=qup,foo=bar") - - // TODO: Make our label representation robust enough to handle labels - // with ",=!" characters in their names. -} - -func TestLabelHas(t *testing.T) { - labelHasTests := []struct { - Ls Labels - Key string - Has bool - }{ - {Set{"x": "y"}, "x", true}, - {Set{"x": ""}, "x", true}, - {Set{"x": "y"}, "foo", false}, - } - for _, lh := range labelHasTests { - if has := lh.Ls.Has(lh.Key); has != lh.Has { - t.Errorf("%#v.Has(%#v) => %v, expected %v", lh.Ls, lh.Key, has, lh.Has) - } - } -} - -func TestLabelGet(t *testing.T) { - ls := Set{"x": "y"} - if ls.Get("x") != "y" { - t.Errorf("Set.Get is broken") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/selector_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/selector_test.go deleted file mode 100644 index 5fbb1fc76..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/labels/selector_test.go +++ /dev/null @@ -1,574 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 labels - -import ( - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/util/sets" -) - -func TestSelectorParse(t *testing.T) { - testGoodStrings := []string{ - "x=a,y=b,z=c", - "", - "x!=a,y=b", - "x=", - "x= ", - "x=,z= ", - "x= ,z= ", - "!x", - "x>1.1", - "x>1.1,z<5.3", - } - testBadStrings := []string{ - "x=a||y=b", - "x==a==b", - "!x=a", - "x1.1", Set{"x": "1.2"}) - expectMatch(t, "x<1.1", Set{"x": "0.8"}) - expectNoMatch(t, "x=z", Set{}) - expectNoMatch(t, "x=y", Set{"x": "z"}) - expectNoMatch(t, "x=y,z=w", Set{"x": "w", "z": "w"}) - expectNoMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "w"}) - expectNoMatch(t, "x", Set{"y": "z"}) - expectNoMatch(t, "!x", Set{"x": "z"}) - expectNoMatch(t, "x>1.1", Set{"x": "0.8"}) - expectNoMatch(t, "x<1.1", Set{"x": "1.1"}) - - labelset := Set{ - "foo": "bar", - "baz": "blah", - } - expectMatch(t, "foo=bar", labelset) - expectMatch(t, "baz=blah", labelset) - expectMatch(t, "foo=bar,baz=blah", labelset) - expectNoMatch(t, "foo=blah", labelset) - expectNoMatch(t, "baz=bar", labelset) - expectNoMatch(t, "foo=bar,foobar=bar,baz=blah", labelset) -} - -func expectMatchDirect(t *testing.T, selector, ls Set) { - if !SelectorFromSet(selector).Matches(ls) { - t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) - } -} - -func expectNoMatchDirect(t *testing.T, selector, ls Set) { - if SelectorFromSet(selector).Matches(ls) { - t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) - } -} - -func TestSetMatches(t *testing.T) { - labelset := Set{ - "foo": "bar", - "baz": "blah", - } - expectMatchDirect(t, Set{}, labelset) - expectMatchDirect(t, Set{"foo": "bar"}, labelset) - expectMatchDirect(t, Set{"baz": "blah"}, labelset) - expectMatchDirect(t, Set{"foo": "bar", "baz": "blah"}, labelset) - - //TODO: bad values not handled for the moment in SelectorFromSet - //expectNoMatchDirect(t, Set{"foo": "=blah"}, labelset) - //expectNoMatchDirect(t, Set{"baz": "=bar"}, labelset) - //expectNoMatchDirect(t, Set{"foo": "=bar", "foobar": "bar", "baz": "blah"}, labelset) -} - -func TestNilMapIsValid(t *testing.T) { - selector := Set(nil).AsSelector() - if selector == nil { - t.Errorf("Selector for nil set should be Everything") - } - if !selector.Empty() { - t.Errorf("Selector for nil set should be Empty") - } -} - -func TestSetIsEmpty(t *testing.T) { - if !(Set{}).AsSelector().Empty() { - t.Errorf("Empty set should be empty") - } - if !(NewSelector()).Empty() { - t.Errorf("Nil Selector should be empty") - } -} - -func TestLexer(t *testing.T) { - testcases := []struct { - s string - t Token - }{ - {"", EndOfStringToken}, - {",", CommaToken}, - {"notin", NotInToken}, - {"in", InToken}, - {"=", EqualsToken}, - {"==", DoubleEqualsToken}, - {">", GreaterThanToken}, - {"<", LessThanToken}, - //Note that Lex returns the longest valid token found - {"!", DoesNotExistToken}, - {"!=", NotEqualsToken}, - {"(", OpenParToken}, - {")", ClosedParToken}, - //Non-"special" characters are considered part of an identifier - {"~", IdentifierToken}, - {"||", IdentifierToken}, - } - for _, v := range testcases { - l := &Lexer{s: v.s, pos: 0} - token, lit := l.Lex() - if token != v.t { - t.Errorf("Got %d it should be %d for '%s'", token, v.t, v.s) - } - if v.t != ErrorToken && lit != v.s { - t.Errorf("Got '%s' it should be '%s'", lit, v.s) - } - } -} - -func min(l, r int) (m int) { - m = r - if l < r { - m = l - } - return m -} - -func TestLexerSequence(t *testing.T) { - testcases := []struct { - s string - t []Token - }{ - {"key in ( value )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, ClosedParToken}}, - {"key notin ( value )", []Token{IdentifierToken, NotInToken, OpenParToken, IdentifierToken, ClosedParToken}}, - {"key in ( value1, value2 )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, CommaToken, IdentifierToken, ClosedParToken}}, - {"key", []Token{IdentifierToken}}, - {"!key", []Token{DoesNotExistToken, IdentifierToken}}, - {"()", []Token{OpenParToken, ClosedParToken}}, - {"x in (),y", []Token{IdentifierToken, InToken, OpenParToken, ClosedParToken, CommaToken, IdentifierToken}}, - {"== != (), = notin", []Token{DoubleEqualsToken, NotEqualsToken, OpenParToken, ClosedParToken, CommaToken, EqualsToken, NotInToken}}, - {"key>1.1", []Token{IdentifierToken, GreaterThanToken, IdentifierToken}}, - {"key<0.8", []Token{IdentifierToken, LessThanToken, IdentifierToken}}, - } - for _, v := range testcases { - var literals []string - var tokens []Token - l := &Lexer{s: v.s, pos: 0} - for { - token, lit := l.Lex() - if token == EndOfStringToken { - break - } - tokens = append(tokens, token) - literals = append(literals, lit) - } - if len(tokens) != len(v.t) { - t.Errorf("Bad number of tokens for '%s %d, %d", v.s, len(tokens), len(v.t)) - } - for i := 0; i < min(len(tokens), len(v.t)); i++ { - if tokens[i] != v.t[i] { - t.Errorf("Test '%s': Mismatching in token type found '%v' it should be '%v'", v.s, tokens[i], v.t[i]) - } - } - } -} -func TestParserLookahead(t *testing.T) { - testcases := []struct { - s string - t []Token - }{ - {"key in ( value )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, - {"key notin ( value )", []Token{IdentifierToken, NotInToken, OpenParToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, - {"key in ( value1, value2 )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, CommaToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, - {"key", []Token{IdentifierToken, EndOfStringToken}}, - {"!key", []Token{DoesNotExistToken, IdentifierToken, EndOfStringToken}}, - {"()", []Token{OpenParToken, ClosedParToken, EndOfStringToken}}, - {"", []Token{EndOfStringToken}}, - {"x in (),y", []Token{IdentifierToken, InToken, OpenParToken, ClosedParToken, CommaToken, IdentifierToken, EndOfStringToken}}, - {"== != (), = notin", []Token{DoubleEqualsToken, NotEqualsToken, OpenParToken, ClosedParToken, CommaToken, EqualsToken, NotInToken, EndOfStringToken}}, - {"key>1.1", []Token{IdentifierToken, GreaterThanToken, IdentifierToken, EndOfStringToken}}, - {"key<0.8", []Token{IdentifierToken, LessThanToken, IdentifierToken, EndOfStringToken}}, - } - for _, v := range testcases { - p := &Parser{l: &Lexer{s: v.s, pos: 0}, position: 0} - p.scan() - if len(p.scannedItems) != len(v.t) { - t.Errorf("Expected %d items found %d", len(v.t), len(p.scannedItems)) - } - for { - token, lit := p.lookahead(KeyAndOperator) - - token2, lit2 := p.consume(KeyAndOperator) - if token == EndOfStringToken { - break - } - if token != token2 || lit != lit2 { - t.Errorf("Bad values") - } - } - } -} - -func TestRequirementConstructor(t *testing.T) { - requirementConstructorTests := []struct { - Key string - Op Operator - Vals sets.String - Success bool - }{ - {"x", InOperator, nil, false}, - {"x", NotInOperator, sets.NewString(), false}, - {"x", InOperator, sets.NewString("foo"), true}, - {"x", NotInOperator, sets.NewString("foo"), true}, - {"x", ExistsOperator, nil, true}, - {"x", DoesNotExistOperator, nil, true}, - {"1foo", InOperator, sets.NewString("bar"), true}, - {"1234", InOperator, sets.NewString("bar"), true}, - {"y", GreaterThanOperator, sets.NewString("1.1"), true}, - {"z", LessThanOperator, sets.NewString("5.3"), true}, - {"foo", GreaterThanOperator, sets.NewString("bar"), false}, - {"barz", LessThanOperator, sets.NewString("blah"), false}, - {strings.Repeat("a", 254), ExistsOperator, nil, false}, //breaks DNS rule that len(key) <= 253 - } - for _, rc := range requirementConstructorTests { - if _, err := NewRequirement(rc.Key, rc.Op, rc.Vals); err == nil && !rc.Success { - t.Errorf("expected error with key:%#v op:%v vals:%v, got no error", rc.Key, rc.Op, rc.Vals) - } else if err != nil && rc.Success { - t.Errorf("expected no error with key:%#v op:%v vals:%v, got:%v", rc.Key, rc.Op, rc.Vals, err) - } - } -} - -func TestToString(t *testing.T) { - var req Requirement - toStringTests := []struct { - In *internalSelector - Out string - Valid bool - }{ - - {&internalSelector{ - getRequirement("x", InOperator, sets.NewString("abc", "def"), t), - getRequirement("y", NotInOperator, sets.NewString("jkl"), t), - getRequirement("z", ExistsOperator, nil, t)}, - "x in (abc,def),y notin (jkl),z", true}, - {&internalSelector{ - getRequirement("x", NotInOperator, sets.NewString("abc", "def"), t), - getRequirement("y", NotEqualsOperator, sets.NewString("jkl"), t), - getRequirement("z", DoesNotExistOperator, nil, t)}, - "x notin (abc,def),y!=jkl,!z", true}, - {&internalSelector{ - getRequirement("x", InOperator, sets.NewString("abc", "def"), t), - req}, // adding empty req for the trailing ',' - "x in (abc,def),", false}, - {&internalSelector{ - getRequirement("x", NotInOperator, sets.NewString("abc"), t), - getRequirement("y", InOperator, sets.NewString("jkl", "mno"), t), - getRequirement("z", NotInOperator, sets.NewString(""), t)}, - "x notin (abc),y in (jkl,mno),z notin ()", true}, - {&internalSelector{ - getRequirement("x", EqualsOperator, sets.NewString("abc"), t), - getRequirement("y", DoubleEqualsOperator, sets.NewString("jkl"), t), - getRequirement("z", NotEqualsOperator, sets.NewString("a"), t), - getRequirement("z", ExistsOperator, nil, t)}, - "x=abc,y==jkl,z!=a,z", true}, - {&internalSelector{ - getRequirement("x", GreaterThanOperator, sets.NewString("2.4"), t), - getRequirement("y", LessThanOperator, sets.NewString("7.1"), t), - getRequirement("z", ExistsOperator, nil, t)}, - "x>2.4,y<7.1,z", true}, - } - for _, ts := range toStringTests { - if out := ts.In.String(); out == "" && ts.Valid { - t.Errorf("%+v.String() => '%v' expected no error", ts.In, out) - } else if out != ts.Out { - t.Errorf("%+v.String() => '%v' want '%v'", ts.In, out, ts.Out) - } - } -} - -func TestRequirementSelectorMatching(t *testing.T) { - var req Requirement - labelSelectorMatchingTests := []struct { - Set Set - Sel Selector - Match bool - }{ - {Set{"x": "foo", "y": "baz"}, &internalSelector{ - req, - }, false}, - {Set{"x": "foo", "y": "baz"}, &internalSelector{ - getRequirement("x", InOperator, sets.NewString("foo"), t), - getRequirement("y", NotInOperator, sets.NewString("alpha"), t), - }, true}, - {Set{"x": "foo", "y": "baz"}, &internalSelector{ - getRequirement("x", InOperator, sets.NewString("foo"), t), - getRequirement("y", InOperator, sets.NewString("alpha"), t), - }, false}, - {Set{"y": ""}, &internalSelector{ - getRequirement("x", NotInOperator, sets.NewString(""), t), - getRequirement("y", ExistsOperator, nil, t), - }, true}, - {Set{"y": ""}, &internalSelector{ - getRequirement("x", DoesNotExistOperator, nil, t), - getRequirement("y", ExistsOperator, nil, t), - }, true}, - {Set{"y": ""}, &internalSelector{ - getRequirement("x", NotInOperator, sets.NewString(""), t), - getRequirement("y", DoesNotExistOperator, nil, t), - }, false}, - {Set{"y": "baz"}, &internalSelector{ - getRequirement("x", InOperator, sets.NewString(""), t), - }, false}, - {Set{"z": "1.2"}, &internalSelector{ - getRequirement("z", GreaterThanOperator, sets.NewString("1.0"), t), - }, true}, - {Set{"z": "v1.2"}, &internalSelector{ - getRequirement("z", GreaterThanOperator, sets.NewString("1.0"), t), - }, false}, - } - for _, lsm := range labelSelectorMatchingTests { - if match := lsm.Sel.Matches(lsm.Set); match != lsm.Match { - t.Errorf("%+v.Matches(%#v) => %v, want %v", lsm.Sel, lsm.Set, match, lsm.Match) - } - } -} - -func TestSetSelectorParser(t *testing.T) { - setSelectorParserTests := []struct { - In string - Out Selector - Match bool - Valid bool - }{ - {"", NewSelector(), true, true}, - {"\rx", internalSelector{ - getRequirement("x", ExistsOperator, nil, t), - }, true, true}, - {"this-is-a-dns.domain.com/key-with-dash", internalSelector{ - getRequirement("this-is-a-dns.domain.com/key-with-dash", ExistsOperator, nil, t), - }, true, true}, - {"this-is-another-dns.domain.com/key-with-dash in (so,what)", internalSelector{ - getRequirement("this-is-another-dns.domain.com/key-with-dash", InOperator, sets.NewString("so", "what"), t), - }, true, true}, - {"0.1.2.domain/99 notin (10.10.100.1, tick.tack.clock)", internalSelector{ - getRequirement("0.1.2.domain/99", NotInOperator, sets.NewString("10.10.100.1", "tick.tack.clock"), t), - }, true, true}, - {"foo in (abc)", internalSelector{ - getRequirement("foo", InOperator, sets.NewString("abc"), t), - }, true, true}, - {"x notin\n (abc)", internalSelector{ - getRequirement("x", NotInOperator, sets.NewString("abc"), t), - }, true, true}, - {"x notin \t (abc,def)", internalSelector{ - getRequirement("x", NotInOperator, sets.NewString("abc", "def"), t), - }, true, true}, - {"x in (abc,def)", internalSelector{ - getRequirement("x", InOperator, sets.NewString("abc", "def"), t), - }, true, true}, - {"x in (abc,)", internalSelector{ - getRequirement("x", InOperator, sets.NewString("abc", ""), t), - }, true, true}, - {"x in ()", internalSelector{ - getRequirement("x", InOperator, sets.NewString(""), t), - }, true, true}, - {"x notin (abc,,def),bar,z in (),w", internalSelector{ - getRequirement("bar", ExistsOperator, nil, t), - getRequirement("w", ExistsOperator, nil, t), - getRequirement("x", NotInOperator, sets.NewString("abc", "", "def"), t), - getRequirement("z", InOperator, sets.NewString(""), t), - }, true, true}, - {"x,y in (a)", internalSelector{ - getRequirement("y", InOperator, sets.NewString("a"), t), - getRequirement("x", ExistsOperator, nil, t), - }, false, true}, - {"x=a", internalSelector{ - getRequirement("x", EqualsOperator, sets.NewString("a"), t), - }, true, true}, - {"x>1.1", internalSelector{ - getRequirement("x", GreaterThanOperator, sets.NewString("1.1"), t), - }, true, true}, - {"x<7.1", internalSelector{ - getRequirement("x", LessThanOperator, sets.NewString("7.1"), t), - }, true, true}, - {"x=a,y!=b", internalSelector{ - getRequirement("x", EqualsOperator, sets.NewString("a"), t), - getRequirement("y", NotEqualsOperator, sets.NewString("b"), t), - }, true, true}, - {"x=a,y!=b,z in (h,i,j)", internalSelector{ - getRequirement("x", EqualsOperator, sets.NewString("a"), t), - getRequirement("y", NotEqualsOperator, sets.NewString("b"), t), - getRequirement("z", InOperator, sets.NewString("h", "i", "j"), t), - }, true, true}, - {"x=a||y=b", internalSelector{}, false, false}, - {"x,,y", nil, true, false}, - {",x,y", nil, true, false}, - {"x nott in (y)", nil, true, false}, - {"x notin ( )", internalSelector{ - getRequirement("x", NotInOperator, sets.NewString(""), t), - }, true, true}, - {"x notin (, a)", internalSelector{ - getRequirement("x", NotInOperator, sets.NewString("", "a"), t), - }, true, true}, - {"a in (xyz),", nil, true, false}, - {"a in (xyz)b notin ()", nil, true, false}, - {"a ", internalSelector{ - getRequirement("a", ExistsOperator, nil, t), - }, true, true}, - {"a in (x,y,notin, z,in)", internalSelector{ - getRequirement("a", InOperator, sets.NewString("in", "notin", "x", "y", "z"), t), - }, true, true}, // operator 'in' inside list of identifiers - {"a in (xyz abc)", nil, false, false}, // no comma - {"a notin(", nil, true, false}, // bad formed - {"a (", nil, false, false}, // cpar - {"(", nil, false, false}, // opar - } - - for _, ssp := range setSelectorParserTests { - if sel, err := Parse(ssp.In); err != nil && ssp.Valid { - t.Errorf("Parse(%s) => %v expected no error", ssp.In, err) - } else if err == nil && !ssp.Valid { - t.Errorf("Parse(%s) => %+v expected error", ssp.In, sel) - } else if ssp.Match && !reflect.DeepEqual(sel, ssp.Out) { - t.Errorf("Parse(%s) => parse output '%#v' doesn't match '%#v' expected match", ssp.In, sel, ssp.Out) - } - } -} - -func getRequirement(key string, op Operator, vals sets.String, t *testing.T) Requirement { - req, err := NewRequirement(key, op, vals) - if err != nil { - t.Errorf("NewRequirement(%v, %v, %v) resulted in error:%v", key, op, vals, err) - return Requirement{} - } - return *req -} - -func TestAdd(t *testing.T) { - testCases := []struct { - name string - sel Selector - key string - operator Operator - values []string - refSelector Selector - }{ - { - "keyInOperator", - internalSelector{}, - "key", - InOperator, - []string{"value"}, - internalSelector{Requirement{"key", InOperator, sets.NewString("value")}}, - }, - { - "keyEqualsOperator", - internalSelector{Requirement{"key", InOperator, sets.NewString("value")}}, - "key2", - EqualsOperator, - []string{"value2"}, - internalSelector{ - Requirement{"key", InOperator, sets.NewString("value")}, - Requirement{"key2", EqualsOperator, sets.NewString("value2")}, - }, - }, - } - for _, ts := range testCases { - req, err := NewRequirement(ts.key, ts.operator, sets.NewString(ts.values...)) - if err != nil { - t.Errorf("%s - Unable to create labels.Requirement", ts.name) - } - ts.sel = ts.sel.Add(*req) - if !reflect.DeepEqual(ts.sel, ts.refSelector) { - t.Errorf("%s - Expected %v found %v", ts.name, ts.refSelector, ts.sel) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/matcher_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/matcher_test.go deleted file mode 100644 index 17c7fb363..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/matcher_test.go +++ /dev/null @@ -1,130 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 generic - -import ( - "errors" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" -) - -type Ignored struct { - ID string -} - -type IgnoredList struct { - Items []Ignored -} - -func (obj *Ignored) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } -func (obj *IgnoredList) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -func TestSelectionPredicate(t *testing.T) { - table := map[string]struct { - labelSelector, fieldSelector string - labels labels.Set - fields fields.Set - err error - shouldMatch bool - matchSingleKey string - }{ - "A": { - labelSelector: "name=foo", - fieldSelector: "uid=12345", - labels: labels.Set{"name": "foo"}, - fields: fields.Set{"uid": "12345"}, - shouldMatch: true, - }, - "B": { - labelSelector: "name=foo", - fieldSelector: "uid=12345", - labels: labels.Set{"name": "foo"}, - fields: fields.Set{}, - shouldMatch: false, - }, - "C": { - labelSelector: "name=foo", - fieldSelector: "uid=12345", - labels: labels.Set{}, - fields: fields.Set{"uid": "12345"}, - shouldMatch: false, - }, - "D": { - fieldSelector: "metadata.name=12345", - labels: labels.Set{}, - fields: fields.Set{"metadata.name": "12345"}, - shouldMatch: true, - matchSingleKey: "12345", - }, - "error": { - labelSelector: "name=foo", - fieldSelector: "uid=12345", - err: errors.New("maybe this is a 'wrong object type' error"), - shouldMatch: false, - }, - } - - for name, item := range table { - parsedLabel, err := labels.Parse(item.labelSelector) - if err != nil { - panic(err) - } - parsedField, err := fields.ParseSelector(item.fieldSelector) - if err != nil { - panic(err) - } - sp := &SelectionPredicate{ - Label: parsedLabel, - Field: parsedField, - GetAttrs: func(runtime.Object) (label labels.Set, field fields.Set, err error) { - return item.labels, item.fields, item.err - }, - } - got, err := sp.Matches(&Ignored{}) - if e, a := item.err, err; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - continue - } - if e, a := item.shouldMatch, got; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - if key := item.matchSingleKey; key != "" { - got, ok := sp.MatchesSingle() - if !ok { - t.Errorf("%v: expected single match", name) - } - if e, a := key, got; e != a { - t.Errorf("%v: expected %v, got %v", name, e, a) - } - } - } -} - -func TestSingleMatch(t *testing.T) { - m := MatchOnKey("pod-name-here", func(obj runtime.Object) (bool, error) { return true, nil }) - got, ok := m.MatchesSingle() - if !ok { - t.Errorf("Expected MatchesSingle to return true") - } - if e, a := "pod-name-here", got; e != a { - t.Errorf("Expected %#v, got %#v", e, a) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/doc.go deleted file mode 100644 index ee972408d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd has a generic implementation of a registry that -// stores things in etcd. -package registry diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/storage_factory.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/storage_factory.go deleted file mode 100644 index f1c265113..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/storage_factory.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 registry - -import ( - "k8s.io/kubernetes/pkg/api/rest" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" -) - -// Creates a cacher on top of the given 'storageInterface'. -func StorageWithCacher( - storageInterface storage.Interface, - capacity int, - objectType runtime.Object, - resourcePrefix string, - scopeStrategy rest.NamespaceScopedStrategy, - newListFunc func() runtime.Object) storage.Interface { - return storage.NewCacher( - storageInterface, capacity, etcdstorage.APIObjectVersioner{}, - objectType, resourcePrefix, scopeStrategy, newListFunc) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store.go deleted file mode 100644 index 337143ce3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store.go +++ /dev/null @@ -1,679 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 registry - -import ( - "fmt" - "reflect" - "sync" - - "k8s.io/kubernetes/pkg/api" - kubeerr "k8s.io/kubernetes/pkg/api/errors" - storeerr "k8s.io/kubernetes/pkg/api/errors/storage" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/rest" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/watch" - - "github.com/golang/glog" -) - -// Store implements generic.Registry. -// It's intended to be embeddable, so that you can implement any -// non-generic functions if needed. -// You must supply a value for every field below before use; these are -// left public as it's meant to be overridable if need be. -// This object is intended to be copyable so that it can be used in -// different ways but share the same underlying behavior. -// -// The intended use of this type is embedding within a Kind specific -// RESTStorage implementation. This type provides CRUD semantics on -// a Kubelike resource, handling details like conflict detection with -// ResourceVersion and semantics. The RESTCreateStrategy and -// RESTUpdateStrategy are generic across all backends, and encapsulate -// logic specific to the API. -// -// TODO: make the default exposed methods exactly match a generic RESTStorage -type Store struct { - // Called to make a new object, should return e.g., &api.Pod{} - NewFunc func() runtime.Object - - // Called to make a new listing object, should return e.g., &api.PodList{} - NewListFunc func() runtime.Object - - // Used for error reporting - QualifiedResource unversioned.GroupResource - - // Used for listing/watching; should not include trailing "/" - KeyRootFunc func(ctx api.Context) string - - // Called for Create/Update/Get/Delete. Note that 'namespace' can be - // gotten from ctx. - KeyFunc func(ctx api.Context, name string) (string, error) - - // Called to get the name of an object - ObjectNameFunc func(obj runtime.Object) (string, error) - - // Return the TTL objects should be persisted with. Update is true if this - // is an operation against an existing object. Existing is the current TTL - // or the default for this operation. - TTLFunc func(obj runtime.Object, existing uint64, update bool) (uint64, error) - - // Returns a matcher corresponding to the provided labels and fields. - PredicateFunc func(label labels.Selector, field fields.Selector) generic.Matcher - - // DeleteCollectionWorkers is the maximum number of workers in a single - // DeleteCollection call. - DeleteCollectionWorkers int - - // Called on all objects returned from the underlying store, after - // the exit hooks are invoked. Decorators are intended for integrations - // that are above storage and should only be used for specific cases where - // storage of the value is not appropriate, since they cannot - // be watched. - Decorator rest.ObjectFunc - // Allows extended behavior during creation, required - CreateStrategy rest.RESTCreateStrategy - // On create of an object, attempt to run a further operation. - AfterCreate rest.ObjectFunc - // Allows extended behavior during updates, required - UpdateStrategy rest.RESTUpdateStrategy - // On update of an object, attempt to run a further operation. - AfterUpdate rest.ObjectFunc - // Allows extended behavior during updates, optional - DeleteStrategy rest.RESTDeleteStrategy - // On deletion of an object, attempt to run a further operation. - AfterDelete rest.ObjectFunc - // If true, return the object that was deleted. Otherwise, return a generic - // success status response. - ReturnDeletedObject bool - // Allows extended behavior during export, optional - ExportStrategy rest.RESTExportStrategy - - // Used for all storage access functions - Storage storage.Interface -} - -// NamespaceKeyRootFunc is the default function for constructing storage paths to resource directories enforcing namespace rules. -func NamespaceKeyRootFunc(ctx api.Context, prefix string) string { - key := prefix - ns, ok := api.NamespaceFrom(ctx) - if ok && len(ns) > 0 { - key = key + "/" + ns - } - return key -} - -// NamespaceKeyFunc is the default function for constructing storage paths to a resource relative to prefix enforcing namespace rules. -// If no namespace is on context, it errors. -func NamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, error) { - key := NamespaceKeyRootFunc(ctx, prefix) - ns, ok := api.NamespaceFrom(ctx) - if !ok || len(ns) == 0 { - return "", kubeerr.NewBadRequest("Namespace parameter required.") - } - if len(name) == 0 { - return "", kubeerr.NewBadRequest("Name parameter required.") - } - if ok, msg := validation.IsValidPathSegmentName(name); !ok { - return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %v.", msg)) - } - key = key + "/" + name - return key, nil -} - -// NoNamespaceKeyFunc is the default function for constructing storage paths to a resource relative to prefix without a namespace -func NoNamespaceKeyFunc(ctx api.Context, prefix string, name string) (string, error) { - if len(name) == 0 { - return "", kubeerr.NewBadRequest("Name parameter required.") - } - if ok, msg := validation.IsValidPathSegmentName(name); !ok { - return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %v.", msg)) - } - key := prefix + "/" + name - return key, nil -} - -// New implements RESTStorage -func (e *Store) New() runtime.Object { - return e.NewFunc() -} - -// NewList implements RESTLister -func (e *Store) NewList() runtime.Object { - return e.NewListFunc() -} - -// List returns a list of items matching labels and field -func (e *Store) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { - label := labels.Everything() - if options != nil && options.LabelSelector != nil { - label = options.LabelSelector - } - field := fields.Everything() - if options != nil && options.FieldSelector != nil { - field = options.FieldSelector - } - return e.ListPredicate(ctx, e.PredicateFunc(label, field), options) -} - -// ListPredicate returns a list of all the items matching m. -func (e *Store) ListPredicate(ctx api.Context, m generic.Matcher, options *api.ListOptions) (runtime.Object, error) { - list := e.NewListFunc() - filterFunc := e.filterAndDecorateFunction(m) - if name, ok := m.MatchesSingle(); ok { - if key, err := e.KeyFunc(ctx, name); err == nil { - err := e.Storage.GetToList(ctx, key, filterFunc, list) - return list, storeerr.InterpretListError(err, e.QualifiedResource) - } - // if we cannot extract a key based on the current context, the optimization is skipped - } - - if options == nil { - options = &api.ListOptions{ResourceVersion: "0"} - } - err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, filterFunc, list) - return list, storeerr.InterpretListError(err, e.QualifiedResource) -} - -// Create inserts a new item according to the unique key from the object. -func (e *Store) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) { - if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil { - return nil, err - } - name, err := e.ObjectNameFunc(obj) - if err != nil { - return nil, err - } - key, err := e.KeyFunc(ctx, name) - if err != nil { - return nil, err - } - ttl, err := e.calculateTTL(obj, 0, false) - if err != nil { - return nil, err - } - out := e.NewFunc() - if err := e.Storage.Create(ctx, key, obj, out, ttl); err != nil { - err = storeerr.InterpretCreateError(err, e.QualifiedResource, name) - err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj) - return nil, err - } - if e.AfterCreate != nil { - if err := e.AfterCreate(out); err != nil { - return nil, err - } - } - if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, err - } - } - return out, nil -} - -// Update performs an atomic update and set of the object. Returns the result of the update -// or an error. If the registry allows create-on-update, the create flow will be executed. -// A bool is returned along with the object and any errors, to indicate object creation. -func (e *Store) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) { - name, err := e.ObjectNameFunc(obj) - if err != nil { - return nil, false, err - } - key, err := e.KeyFunc(ctx, name) - if err != nil { - return nil, false, err - } - // If AllowUnconditionalUpdate() is true and the object specified by the user does not have a resource version, - // then we populate it with the latest version. - // Else, we check that the version specified by the user matches the version of latest storage object. - resourceVersion, err := e.Storage.Versioner().ObjectResourceVersion(obj) - if err != nil { - return nil, false, err - } - doUnconditionalUpdate := resourceVersion == 0 && e.UpdateStrategy.AllowUnconditionalUpdate() - // TODO: expose TTL - creating := false - out := e.NewFunc() - meta, err := api.ObjectMetaFor(obj) - if err != nil { - return nil, false, kubeerr.NewInternalError(err) - } - var preconditions *storage.Preconditions - // If the UID of the new object is specified, we use it as an Update precondition. - if len(meta.UID) != 0 { - UIDCopy := meta.UID - preconditions = &storage.Preconditions{UID: &UIDCopy} - } - err = e.Storage.GuaranteedUpdate(ctx, key, out, true, preconditions, func(existing runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { - // Since we return 'obj' from this function and it can be modified outside this - // function, we are resetting resourceVersion to the initial value here. - // - // TODO: In fact, we should probably return a DeepCopy of obj in all places. - err := e.Storage.Versioner().UpdateObject(obj, resourceVersion) - if err != nil { - return nil, nil, err - } - - version, err := e.Storage.Versioner().ObjectResourceVersion(existing) - if err != nil { - return nil, nil, err - } - if version == 0 { - if !e.UpdateStrategy.AllowCreateOnUpdate() { - return nil, nil, kubeerr.NewNotFound(e.QualifiedResource, name) - } - creating = true - if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil { - return nil, nil, err - } - ttl, err := e.calculateTTL(obj, 0, false) - if err != nil { - return nil, nil, err - } - return obj, &ttl, nil - } - - creating = false - if doUnconditionalUpdate { - // Update the object's resource version to match the latest storage object's resource version. - err = e.Storage.Versioner().UpdateObject(obj, res.ResourceVersion) - if err != nil { - return nil, nil, err - } - } else { - // Check if the object's resource version matches the latest resource version. - newVersion, err := e.Storage.Versioner().ObjectResourceVersion(obj) - if err != nil { - return nil, nil, err - } - if newVersion == 0 { - // TODO: The Invalid error should has a field for Resource. - // After that field is added, we should fill the Resource and - // leave the Kind field empty. See the discussion in #18526. - qualifiedKind := unversioned.GroupKind{Group: e.QualifiedResource.Group, Kind: e.QualifiedResource.Resource} - fieldErrList := field.ErrorList{field.Invalid(field.NewPath("metadata").Child("resourceVersion"), newVersion, "must be specified for an update")} - return nil, nil, kubeerr.NewInvalid(qualifiedKind, name, fieldErrList) - } - if newVersion != version { - return nil, nil, kubeerr.NewConflict(e.QualifiedResource, name, fmt.Errorf("the object has been modified; please apply your changes to the latest version and try again")) - } - } - if err := rest.BeforeUpdate(e.UpdateStrategy, ctx, obj, existing); err != nil { - return nil, nil, err - } - ttl, err := e.calculateTTL(obj, res.TTL, true) - if err != nil { - return nil, nil, err - } - if int64(ttl) != res.TTL { - return obj, &ttl, nil - } - return obj, nil, nil - }) - - if err != nil { - if creating { - err = storeerr.InterpretCreateError(err, e.QualifiedResource, name) - err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj) - } else { - err = storeerr.InterpretUpdateError(err, e.QualifiedResource, name) - } - return nil, false, err - } - if creating { - if e.AfterCreate != nil { - if err := e.AfterCreate(out); err != nil { - return nil, false, err - } - } - } else { - if e.AfterUpdate != nil { - if err := e.AfterUpdate(out); err != nil { - return nil, false, err - } - } - } - if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, false, err - } - } - return out, creating, nil -} - -// Get retrieves the item from storage. -func (e *Store) Get(ctx api.Context, name string) (runtime.Object, error) { - obj := e.NewFunc() - key, err := e.KeyFunc(ctx, name) - if err != nil { - return nil, err - } - if err := e.Storage.Get(ctx, key, obj, false); err != nil { - return nil, storeerr.InterpretGetError(err, e.QualifiedResource, name) - } - if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, err - } - } - return obj, nil -} - -var ( - errAlreadyDeleting = fmt.Errorf("abort delete") - errDeleteNow = fmt.Errorf("delete now") -) - -// Delete removes the item from storage. -func (e *Store) Delete(ctx api.Context, name string, options *api.DeleteOptions) (runtime.Object, error) { - key, err := e.KeyFunc(ctx, name) - if err != nil { - return nil, err - } - - obj := e.NewFunc() - if err := e.Storage.Get(ctx, key, obj, false); err != nil { - return nil, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) - } - - // support older consumers of delete by treating "nil" as delete immediately - if options == nil { - options = api.NewDeleteOptions(0) - } - var preconditions storage.Preconditions - if options.Preconditions != nil { - preconditions.UID = options.Preconditions.UID - } - graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options) - if err != nil { - return nil, err - } - if pendingGraceful { - return e.finalizeDelete(obj, false) - } - var ignoreNotFound bool = false - var lastExisting runtime.Object = nil - if graceful { - out := e.NewFunc() - lastGraceful := int64(0) - err := e.Storage.GuaranteedUpdate( - ctx, key, out, false, &preconditions, - storage.SimpleUpdate(func(existing runtime.Object) (runtime.Object, error) { - graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, existing, options) - if err != nil { - return nil, err - } - if pendingGraceful { - return nil, errAlreadyDeleting - } - if !graceful { - return nil, errDeleteNow - } - lastGraceful = *options.GracePeriodSeconds - lastExisting = existing - return existing, nil - }), - ) - switch err { - case nil: - if lastGraceful > 0 { - return out, nil - } - // If we are here, the registry supports grace period mechanism and - // we are intentionally delete gracelessly. In this case, we may - // enter a race with other k8s components. If other component wins - // the race, the object will not be found, and we should tolerate - // the NotFound error. See - // https://github.com/kubernetes/kubernetes/issues/19403 for - // details. - ignoreNotFound = true - // exit the switch and delete immediately - case errDeleteNow: - // we've updated the object to have a zero grace period, or it's already at 0, so - // we should fall through and truly delete the object. - case errAlreadyDeleting: - return e.finalizeDelete(obj, true) - default: - return nil, storeerr.InterpretUpdateError(err, e.QualifiedResource, name) - } - } - - // delete immediately, or no graceful deletion supported - out := e.NewFunc() - if err := e.Storage.Delete(ctx, key, out, &preconditions); err != nil { - // Please refer to the place where we set ignoreNotFound for the reason - // why we ignore the NotFound error . - if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil { - // The lastExisting object may not be the last state of the object - // before its deletion, but it's the best approximation. - return e.finalizeDelete(lastExisting, true) - } - return nil, storeerr.InterpretDeleteError(err, e.QualifiedResource, name) - } - return e.finalizeDelete(out, true) -} - -// DeleteCollection remove all items returned by List with a given ListOptions from storage. -// -// DeleteCollection is currently NOT atomic. It can happen that only subset of objects -// will be deleted from storage, and then an error will be returned. -// In case of success, the list of deleted objects will be returned. -// -// TODO: Currently, there is no easy way to remove 'directory' entry from storage (if we -// are removing all objects of a given type) with the current API (it's technically -// possibly with storage API, but watch is not delivered correctly then). -// It will be possible to fix it with v3 etcd API. -func (e *Store) DeleteCollection(ctx api.Context, options *api.DeleteOptions, listOptions *api.ListOptions) (runtime.Object, error) { - listObj, err := e.List(ctx, listOptions) - if err != nil { - return nil, err - } - items, err := meta.ExtractList(listObj) - if err != nil { - return nil, err - } - // Spawn a number of goroutines, so that we can issue requests to storage - // in parallel to speed up deletion. - // TODO: Make this proportional to the number of items to delete, up to - // DeleteCollectionWorkers (it doesn't make much sense to spawn 16 - // workers to delete 10 items). - workersNumber := e.DeleteCollectionWorkers - if workersNumber < 1 { - workersNumber = 1 - } - wg := sync.WaitGroup{} - toProcess := make(chan int, 2*workersNumber) - errs := make(chan error, workersNumber+1) - - go func() { - defer utilruntime.HandleCrash(func(panicReason interface{}) { - errs <- fmt.Errorf("DeleteCollection distributor panicked: %v", panicReason) - }) - for i := 0; i < len(items); i++ { - toProcess <- i - } - close(toProcess) - }() - - wg.Add(workersNumber) - for i := 0; i < workersNumber; i++ { - go func() { - // panics don't cross goroutine boundaries - defer utilruntime.HandleCrash(func(panicReason interface{}) { - errs <- fmt.Errorf("DeleteCollection goroutine panicked: %v", panicReason) - }) - defer wg.Done() - - for { - index, ok := <-toProcess - if !ok { - return - } - accessor, err := meta.Accessor(items[index]) - if err != nil { - errs <- err - return - } - if _, err := e.Delete(ctx, accessor.GetName(), options); err != nil && !kubeerr.IsNotFound(err) { - glog.V(4).Infof("Delete %s in DeleteCollection failed: %v", accessor.GetName(), err) - errs <- err - return - } - } - }() - } - wg.Wait() - select { - case err := <-errs: - return nil, err - default: - return listObj, nil - } -} - -func (e *Store) finalizeDelete(obj runtime.Object, runHooks bool) (runtime.Object, error) { - if runHooks && e.AfterDelete != nil { - if err := e.AfterDelete(obj); err != nil { - return nil, err - } - } - if e.ReturnDeletedObject { - if e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - return nil, err - } - } - return obj, nil - } - return &unversioned.Status{Status: unversioned.StatusSuccess}, nil -} - -// Watch makes a matcher for the given label and field, and calls -// WatchPredicate. If possible, you should customize PredicateFunc to produre a -// matcher that matches by key. generic.SelectionPredicate does this for you -// automatically. -func (e *Store) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { - label := labels.Everything() - if options != nil && options.LabelSelector != nil { - label = options.LabelSelector - } - field := fields.Everything() - if options != nil && options.FieldSelector != nil { - field = options.FieldSelector - } - resourceVersion := "" - if options != nil { - resourceVersion = options.ResourceVersion - } - return e.WatchPredicate(ctx, e.PredicateFunc(label, field), resourceVersion) -} - -// WatchPredicate starts a watch for the items that m matches. -func (e *Store) WatchPredicate(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { - filterFunc := e.filterAndDecorateFunction(m) - - if name, ok := m.MatchesSingle(); ok { - if key, err := e.KeyFunc(ctx, name); err == nil { - if err != nil { - return nil, err - } - return e.Storage.Watch(ctx, key, resourceVersion, filterFunc) - } - // if we cannot extract a key based on the current context, the optimization is skipped - } - - return e.Storage.WatchList(ctx, e.KeyRootFunc(ctx), resourceVersion, filterFunc) -} - -func (e *Store) filterAndDecorateFunction(m generic.Matcher) func(runtime.Object) bool { - return func(obj runtime.Object) bool { - matches, err := m.Matches(obj) - if err != nil { - glog.Errorf("unable to match watch: %v", err) - return false - } - if matches && e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - glog.Errorf("unable to decorate watch: %v", err) - return false - } - } - return matches - } -} - -// calculateTTL is a helper for retrieving the updated TTL for an object or returning an error -// if the TTL cannot be calculated. The defaultTTL is changed to 1 if less than zero. Zero means -// no TTL, not expire immediately. -func (e *Store) calculateTTL(obj runtime.Object, defaultTTL int64, update bool) (ttl uint64, err error) { - // TODO: validate this is assertion is still valid. - // etcd may return a negative TTL for a node if the expiration has not occurred due - // to server lag - we will ensure that the value is at least set. - if defaultTTL < 0 { - defaultTTL = 1 - } - ttl = uint64(defaultTTL) - if e.TTLFunc != nil { - ttl, err = e.TTLFunc(obj, ttl, update) - } - return ttl, err -} - -func exportObjectMeta(accessor meta.Object, exact bool) { - accessor.SetUID("") - if !exact { - accessor.SetNamespace("") - } - accessor.SetCreationTimestamp(unversioned.Time{}) - accessor.SetDeletionTimestamp(nil) - accessor.SetResourceVersion("") - accessor.SetSelfLink("") - if len(accessor.GetGenerateName()) > 0 && !exact { - accessor.SetName("") - } -} - -// Implements the rest.Exporter interface -func (e *Store) Export(ctx api.Context, name string, opts unversioned.ExportOptions) (runtime.Object, error) { - obj, err := e.Get(ctx, name) - if err != nil { - return nil, err - } - if accessor, err := meta.Accessor(obj); err == nil { - exportObjectMeta(accessor, opts.Exact) - } else { - glog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err) - } - - if e.ExportStrategy != nil { - if err = e.ExportStrategy.Export(obj, opts.Exact); err != nil { - return nil, err - } - } else { - e.CreateStrategy.PrepareForCreate(obj) - } - return obj, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store_test.go deleted file mode 100644 index a89eca3e6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/registry/store_test.go +++ /dev/null @@ -1,717 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 registry - -import ( - "fmt" - "path" - "reflect" - "strconv" - "testing" - - "sync" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/runtime" - etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" - etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" - storagetesting "k8s.io/kubernetes/pkg/storage/testing" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -type testRESTStrategy struct { - runtime.ObjectTyper - api.NameGenerator - namespaceScoped bool - allowCreateOnUpdate bool - allowUnconditionalUpdate bool -} - -func (t *testRESTStrategy) NamespaceScoped() bool { return t.namespaceScoped } -func (t *testRESTStrategy) AllowCreateOnUpdate() bool { return t.allowCreateOnUpdate } -func (t *testRESTStrategy) AllowUnconditionalUpdate() bool { return t.allowUnconditionalUpdate } - -func (t *testRESTStrategy) PrepareForCreate(obj runtime.Object) { - metaObj, err := meta.Accessor(obj) - if err != nil { - panic(err.Error()) - } - labels := metaObj.GetLabels() - if labels == nil { - labels = map[string]string{} - } - labels["prepare_create"] = "true" - metaObj.SetLabels(labels) -} - -func (t *testRESTStrategy) PrepareForUpdate(obj, old runtime.Object) {} -func (t *testRESTStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { - return nil -} -func (t *testRESTStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { - return nil -} -func (t *testRESTStrategy) Canonicalize(obj runtime.Object) {} - -func hasCreated(t *testing.T, pod *api.Pod) func(runtime.Object) bool { - return func(obj runtime.Object) bool { - actualPod := obj.(*api.Pod) - if !api.Semantic.DeepDerivative(pod.Status, actualPod.Status) { - t.Errorf("not a deep derivative %#v", actualPod) - return false - } - return api.HasObjectMetaSystemFieldValues(&actualPod.ObjectMeta) - } -} - -func NewTestGenericStoreRegistry(t *testing.T) (*etcdtesting.EtcdTestServer, *Store) { - podPrefix := "/pods" - server := etcdtesting.NewEtcdTestClientServer(t) - s := etcdstorage.NewEtcdStorage(server.Client, testapi.Default.StorageCodec(), etcdtest.PathPrefix(), false, etcdtest.DeserializationCacheSize) - strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true} - - return server, &Store{ - NewFunc: func() runtime.Object { return &api.Pod{} }, - NewListFunc: func() runtime.Object { return &api.PodList{} }, - QualifiedResource: api.Resource("pods"), - CreateStrategy: strategy, - UpdateStrategy: strategy, - DeleteStrategy: strategy, - KeyRootFunc: func(ctx api.Context) string { - return podPrefix - }, - KeyFunc: func(ctx api.Context, id string) (string, error) { - if _, ok := api.NamespaceFrom(ctx); !ok { - return "", fmt.Errorf("namespace is required") - } - return path.Join(podPrefix, id), nil - }, - ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Pod).Name, nil }, - PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { - return &generic.SelectionPredicate{ - Label: label, - Field: field, - GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { - pod, ok := obj.(*api.Pod) - if !ok { - return nil, nil, fmt.Errorf("not a pod") - } - return labels.Set(pod.ObjectMeta.Labels), generic.ObjectMetaFieldsSet(pod.ObjectMeta, true), nil - }, - } - }, - Storage: s, - } -} - -// setMatcher is a matcher that matches any pod with id in the set. -// Makes testing simpler. -type setMatcher struct { - sets.String -} - -func (sm setMatcher) Matches(obj runtime.Object) (bool, error) { - pod, ok := obj.(*api.Pod) - if !ok { - return false, fmt.Errorf("wrong object") - } - return sm.Has(pod.Name), nil -} - -func (sm setMatcher) MatchesSingle() (string, bool) { - if sm.Len() == 1 { - // Since pod name is its key, we can optimize this case. - return sm.List()[0], true - } - return "", false -} - -// everythingMatcher matches everything -type everythingMatcher struct{} - -func (everythingMatcher) Matches(obj runtime.Object) (bool, error) { - return true, nil -} - -func (everythingMatcher) MatchesSingle() (string, bool) { - return "", false -} - -func TestStoreList(t *testing.T) { - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "bar"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - podB := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "foo"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - - testContext := api.WithNamespace(api.NewContext(), "test") - noNamespaceContext := api.NewContext() - - table := map[string]struct { - in *api.PodList - m generic.Matcher - out runtime.Object - context api.Context - }{ - "notFound": { - in: nil, - m: everythingMatcher{}, - out: &api.PodList{Items: []api.Pod{}}, - }, - "normal": { - in: &api.PodList{Items: []api.Pod{*podA, *podB}}, - m: everythingMatcher{}, - out: &api.PodList{Items: []api.Pod{*podA, *podB}}, - }, - "normalFiltered": { - in: &api.PodList{Items: []api.Pod{*podA, *podB}}, - m: setMatcher{sets.NewString("foo")}, - out: &api.PodList{Items: []api.Pod{*podB}}, - }, - "normalFilteredNoNamespace": { - in: &api.PodList{Items: []api.Pod{*podA, *podB}}, - m: setMatcher{sets.NewString("foo")}, - out: &api.PodList{Items: []api.Pod{*podB}}, - context: noNamespaceContext, - }, - "normalFilteredMatchMultiple": { - in: &api.PodList{Items: []api.Pod{*podA, *podB}}, - m: setMatcher{sets.NewString("foo", "makeMatchSingleReturnFalse")}, - out: &api.PodList{Items: []api.Pod{*podB}}, - }, - } - - for name, item := range table { - ctx := testContext - if item.context != nil { - ctx = item.context - } - server, registry := NewTestGenericStoreRegistry(t) - - if item.in != nil { - if err := storagetesting.CreateList("/pods", registry.Storage, item.in); err != nil { - t.Errorf("Unexpected error %v", err) - } - } - - list, err := registry.ListPredicate(ctx, item.m, nil) - if err != nil { - t.Errorf("Unexpected error %v", err) - continue - } - - // DeepDerivative e,a is needed here b/c the storage layer sets ResourceVersion - if e, a := item.out, list; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("%v: Expected %#v, got %#v", name, e, a) - } - server.Terminate(t) - } -} - -func TestStoreCreate(t *testing.T) { - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - podB := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"}, - Spec: api.PodSpec{NodeName: "machine2"}, - } - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - // create the object - objA, err := registry.Create(testContext, podA) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // get the object - checkobj, err := registry.Get(testContext, podA.Name) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // verify objects are equal - if e, a := objA, checkobj; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } - - // now try to create the second pod - _, err = registry.Create(testContext, podB) - if !errors.IsAlreadyExists(err) { - t.Errorf("Unexpected error: %v", err) - } -} - -func updateAndVerify(t *testing.T, ctx api.Context, registry *Store, pod *api.Pod) bool { - obj, _, err := registry.Update(ctx, pod) - if err != nil { - t.Errorf("Unexpected error: %v", err) - return false - } - checkObj, err := registry.Get(ctx, pod.Name) - if err != nil { - t.Errorf("Unexpected error: %v", err) - return false - } - if e, a := obj, checkObj; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - return false - } - return true -} - -func TestStoreUpdate(t *testing.T) { - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - podB := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test"}, - Spec: api.PodSpec{NodeName: "machine2"}, - } - podAWithResourceVersion := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "7"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - // Test1 try to update a non-existing node - _, _, err := registry.Update(testContext, podA) - if !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - - // Test2 createIfNotFound and verify - registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true - if !updateAndVerify(t, testContext, registry, podA) { - t.Errorf("Unexpected error updating podA") - } - registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = false - - // Test3 outofDate - _, _, err = registry.Update(testContext, podAWithResourceVersion) - if !errors.IsConflict(err) { - t.Errorf("Unexpected error updating podAWithResourceVersion: %v", err) - } - - // Test4 normal update and verify - if !updateAndVerify(t, testContext, registry, podB) { - t.Errorf("Unexpected error updating podB") - } - - // Test5 unconditional update - // NOTE: The logic for unconditional updates doesn't make sense to me, and imho should be removed. - // doUnconditionalUpdate := resourceVersion == 0 && e.UpdateStrategy.AllowUnconditionalUpdate() - // ^^ That condition can *never be true due to the creation of root objects. - // - // registry.UpdateStrategy.(*testRESTStrategy).allowUnconditionalUpdate = true - // updateAndVerify(t, testContext, registry, podAWithResourceVersion) - -} - -func TestNoOpUpdates(t *testing.T) { - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - newPod := func() *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: api.NamespaceDefault, - Name: "foo", - Labels: map[string]string{"prepare_create": "true"}, - }, - Spec: api.PodSpec{NodeName: "machine"}, - } - } - - var err error - var createResult runtime.Object - if createResult, err = registry.Create(api.NewDefaultContext(), newPod()); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - createdPod, err := registry.Get(api.NewDefaultContext(), "foo") - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - var updateResult runtime.Object - if updateResult, _, err = registry.Update(api.NewDefaultContext(), newPod()); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // Check whether we do not return empty result on no-op update. - if !reflect.DeepEqual(createResult, updateResult) { - t.Errorf("no-op update should return a correct value, got: %#v", updateResult) - } - - updatedPod, err := registry.Get(api.NewDefaultContext(), "foo") - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - createdMeta, err := meta.Accessor(createdPod) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - updatedMeta, err := meta.Accessor(updatedPod) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - if createdMeta.GetResourceVersion() != updatedMeta.GetResourceVersion() { - t.Errorf("no-op update should be ignored and not written to etcd") - } -} - -// TODO: Add a test to check no-op update if we have object with ResourceVersion -// already stored in etcd. Currently there is no easy way to store object with -// ResourceVersion in etcd. - -type testPodExport struct{} - -func (t testPodExport) Export(obj runtime.Object, exact bool) error { - pod := obj.(*api.Pod) - if pod.Labels == nil { - pod.Labels = map[string]string{} - } - pod.Labels["exported"] = "true" - pod.Labels["exact"] = strconv.FormatBool(exact) - - return nil -} - -func TestStoreCustomExport(t *testing.T) { - podA := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: "test", - Name: "foo", - Labels: map[string]string{}, - }, - Spec: api.PodSpec{NodeName: "machine"}, - } - - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - registry.ExportStrategy = testPodExport{} - - testContext := api.WithNamespace(api.NewContext(), "test") - registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true - if !updateAndVerify(t, testContext, registry, &podA) { - t.Errorf("Unexpected error updating podA") - } - - obj, err := registry.Export(testContext, podA.Name, unversioned.ExportOptions{}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - exportedPod := obj.(*api.Pod) - if exportedPod.Labels["exported"] != "true" { - t.Errorf("expected: exported->true, found: %s", exportedPod.Labels["exported"]) - } - if exportedPod.Labels["exact"] != "false" { - t.Errorf("expected: exact->false, found: %s", exportedPod.Labels["exact"]) - } - delete(exportedPod.Labels, "exported") - delete(exportedPod.Labels, "exact") - exportObjectMeta(&podA.ObjectMeta, false) - podA.Spec = exportedPod.Spec - if !reflect.DeepEqual(&podA, exportedPod) { - t.Errorf("expected:\n%v\nsaw:\n%v\n", &podA, exportedPod) - } -} - -func TestStoreBasicExport(t *testing.T) { - podA := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: "test", - Name: "foo", - Labels: map[string]string{}, - }, - Spec: api.PodSpec{NodeName: "machine"}, - Status: api.PodStatus{HostIP: "1.2.3.4"}, - } - - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - testContext := api.WithNamespace(api.NewContext(), "test") - registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true - if !updateAndVerify(t, testContext, registry, &podA) { - t.Errorf("Unexpected error updating podA") - } - - obj, err := registry.Export(testContext, podA.Name, unversioned.ExportOptions{}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - exportedPod := obj.(*api.Pod) - if exportedPod.Labels["prepare_create"] != "true" { - t.Errorf("expected: prepare_create->true, found: %s", exportedPod.Labels["prepare_create"]) - } - exportObjectMeta(&podA.ObjectMeta, false) - podA.Spec = exportedPod.Spec - if !reflect.DeepEqual(&podA, exportedPod) { - t.Errorf("expected:\n%v\nsaw:\n%v\n", &podA, exportedPod) - } -} - -func TestStoreGet(t *testing.T) { - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "test", Name: "foo"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - _, err := registry.Get(testContext, podA.Name) - if !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - - registry.UpdateStrategy.(*testRESTStrategy).allowCreateOnUpdate = true - if !updateAndVerify(t, testContext, registry, podA) { - t.Errorf("Unexpected error updating podA") - } -} - -func TestStoreDelete(t *testing.T) { - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: api.PodSpec{NodeName: "machine"}, - } - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - // test failure condition - _, err := registry.Delete(testContext, podA.Name, nil) - if !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - - // create pod - _, err = registry.Create(testContext, podA) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // delete object - _, err = registry.Delete(testContext, podA.Name, nil) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // try to get a item which should be deleted - _, err = registry.Get(testContext, podA.Name) - if !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } -} - -func TestStoreDeleteCollection(t *testing.T) { - podA := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - podB := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}} - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - if _, err := registry.Create(testContext, podA); err != nil { - t.Errorf("Unexpected error: %v", err) - } - if _, err := registry.Create(testContext, podB); err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // Delete all pods. - deleted, err := registry.DeleteCollection(testContext, nil, &api.ListOptions{}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - deletedPods := deleted.(*api.PodList) - if len(deletedPods.Items) != 2 { - t.Errorf("Unexpected number of pods deleted: %d, expected: 2", len(deletedPods.Items)) - } - - if _, err := registry.Get(testContext, podA.Name); !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - if _, err := registry.Get(testContext, podB.Name); !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } -} - -func TestStoreDeleteCollectionNotFound(t *testing.T) { - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - testContext := api.WithNamespace(api.NewContext(), "test") - - podA := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - podB := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}} - - for i := 0; i < 10; i++ { - // Setup - if _, err := registry.Create(testContext, podA); err != nil { - t.Errorf("Unexpected error: %v", err) - } - if _, err := registry.Create(testContext, podB); err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // Kick off multiple delete collection calls to test notfound behavior - wg := &sync.WaitGroup{} - for j := 0; j < 2; j++ { - wg.Add(1) - go func() { - defer wg.Done() - _, err := registry.DeleteCollection(testContext, nil, &api.ListOptions{}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - }() - } - wg.Wait() - - if _, err := registry.Get(testContext, podA.Name); !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - if _, err := registry.Get(testContext, podB.Name); !errors.IsNotFound(err) { - t.Errorf("Unexpected error: %v", err) - } - } -} - -// Test whether objects deleted with DeleteCollection are correctly delivered -// to watchers. -func TestStoreDeleteCollectionWithWatch(t *testing.T) { - podA := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - - testContext := api.WithNamespace(api.NewContext(), "test") - server, registry := NewTestGenericStoreRegistry(t) - defer server.Terminate(t) - - objCreated, err := registry.Create(testContext, podA) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - podCreated := objCreated.(*api.Pod) - - watcher, err := registry.WatchPredicate(testContext, setMatcher{sets.NewString("foo")}, podCreated.ResourceVersion) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watcher.Stop() - - if _, err := registry.DeleteCollection(testContext, nil, &api.ListOptions{}); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - got, open := <-watcher.ResultChan() - if !open { - t.Errorf("Unexpected channel close") - } else { - if got.Type != "DELETED" { - t.Errorf("Unexpected event type: %s", got.Type) - } - gotObject := got.Object.(*api.Pod) - gotObject.ResourceVersion = podCreated.ResourceVersion - if e, a := podCreated, gotObject; !reflect.DeepEqual(e, a) { - t.Errorf("Expected: %#v, got: %#v", e, a) - } - } -} - -func TestStoreWatch(t *testing.T) { - testContext := api.WithNamespace(api.NewContext(), "test") - noNamespaceContext := api.NewContext() - - table := map[string]struct { - generic.Matcher - context api.Context - }{ - "single": { - Matcher: setMatcher{sets.NewString("foo")}, - }, - "multi": { - Matcher: setMatcher{sets.NewString("foo", "bar")}, - }, - "singleNoNamespace": { - Matcher: setMatcher{sets.NewString("foo")}, - context: noNamespaceContext, - }, - } - - for name, m := range table { - ctx := testContext - if m.context != nil { - ctx = m.context - } - podA := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "test", - }, - Spec: api.PodSpec{NodeName: "machine"}, - } - - server, registry := NewTestGenericStoreRegistry(t) - wi, err := registry.WatchPredicate(ctx, m, "0") - if err != nil { - t.Errorf("%v: unexpected error: %v", name, err) - } else { - obj, err := registry.Create(testContext, podA) - if err != nil { - got, open := <-wi.ResultChan() - if !open { - t.Errorf("%v: unexpected channel close", name) - } else { - if e, a := obj, got.Object; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } - } - } - wi.Stop() - } - - server.Terminate(t) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/doc.go deleted file mode 100644 index fef461387..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest has generic implementations of resources used for -// REST responses -package rest diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy.go deleted file mode 100644 index ca28831c8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy.go +++ /dev/null @@ -1,242 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "io" - "net/http" - "net/http/httputil" - "net/url" - "strings" - "sync" - "time" - - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/net" - "k8s.io/kubernetes/pkg/util/proxy" - - "github.com/golang/glog" - "github.com/mxk/go-flowrate/flowrate" -) - -// UpgradeAwareProxyHandler is a handler for proxy requests that may require an upgrade -type UpgradeAwareProxyHandler struct { - UpgradeRequired bool - Location *url.URL - // Transport provides an optional round tripper to use to proxy. If nil, the default proxy transport is used - Transport http.RoundTripper - // WrapTransport indicates whether the provided Transport should be wrapped with default proxy transport behavior (URL rewriting, X-Forwarded-* header setting) - WrapTransport bool - FlushInterval time.Duration - MaxBytesPerSec int64 - Responder ErrorResponder -} - -const defaultFlushInterval = 200 * time.Millisecond - -// ErrorResponder abstracts error reporting to the proxy handler to remove the need to hardcode a particular -// error format. -type ErrorResponder interface { - Error(err error) -} - -// NewUpgradeAwareProxyHandler creates a new proxy handler with a default flush interval. Responder is required for returning -// errors to the caller. -func NewUpgradeAwareProxyHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder ErrorResponder) *UpgradeAwareProxyHandler { - return &UpgradeAwareProxyHandler{ - Location: location, - Transport: transport, - WrapTransport: wrapTransport, - UpgradeRequired: upgradeRequired, - FlushInterval: defaultFlushInterval, - Responder: responder, - } -} - -// ServeHTTP handles the proxy request -func (h *UpgradeAwareProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - if len(h.Location.Scheme) == 0 { - h.Location.Scheme = "http" - } - if h.tryUpgrade(w, req) { - return - } - if h.UpgradeRequired { - h.Responder.Error(errors.NewBadRequest("Upgrade request required")) - return - } - - loc := *h.Location - loc.RawQuery = req.URL.RawQuery - - // If original request URL ended in '/', append a '/' at the end of the - // of the proxy URL - if !strings.HasSuffix(loc.Path, "/") && strings.HasSuffix(req.URL.Path, "/") { - loc.Path += "/" - } - - // From pkg/apiserver/proxy.go#ServeHTTP: - // Redirect requests with an empty path to a location that ends with a '/' - // This is essentially a hack for http://issue.k8s.io/4958. - // Note: Keep this code after tryUpgrade to not break that flow. - if len(loc.Path) == 0 { - var queryPart string - if len(req.URL.RawQuery) > 0 { - queryPart = "?" + req.URL.RawQuery - } - w.Header().Set("Location", req.URL.Path+"/"+queryPart) - w.WriteHeader(http.StatusMovedPermanently) - return - } - - if h.Transport == nil || h.WrapTransport { - h.Transport = h.defaultProxyTransport(req.URL, h.Transport) - } - - newReq, err := http.NewRequest(req.Method, loc.String(), req.Body) - if err != nil { - h.Responder.Error(err) - return - } - newReq.Header = req.Header - newReq.ContentLength = req.ContentLength - // Copy the TransferEncoding is for future-proofing. Currently Go only supports "chunked" and - // it can determine the TransferEncoding based on ContentLength and the Body. - newReq.TransferEncoding = req.TransferEncoding - - proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: h.Location.Scheme, Host: h.Location.Host}) - proxy.Transport = h.Transport - proxy.FlushInterval = h.FlushInterval - proxy.ServeHTTP(w, newReq) -} - -// tryUpgrade returns true if the request was handled. -func (h *UpgradeAwareProxyHandler) tryUpgrade(w http.ResponseWriter, req *http.Request) bool { - if !httpstream.IsUpgradeRequest(req) { - return false - } - - backendConn, err := proxy.DialURL(h.Location, h.Transport) - if err != nil { - h.Responder.Error(err) - return true - } - defer backendConn.Close() - - requestHijackedConn, _, err := w.(http.Hijacker).Hijack() - if err != nil { - h.Responder.Error(err) - return true - } - defer requestHijackedConn.Close() - - newReq, err := http.NewRequest(req.Method, h.Location.String(), req.Body) - if err != nil { - h.Responder.Error(err) - return true - } - newReq.Header = req.Header - - if err = newReq.Write(backendConn); err != nil { - h.Responder.Error(err) - return true - } - - wg := &sync.WaitGroup{} - wg.Add(2) - - go func() { - var writer io.WriteCloser - if h.MaxBytesPerSec > 0 { - writer = flowrate.NewWriter(backendConn, h.MaxBytesPerSec) - } else { - writer = backendConn - } - _, err := io.Copy(writer, requestHijackedConn) - if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - glog.Errorf("Error proxying data from client to backend: %v", err) - } - wg.Done() - }() - - go func() { - var reader io.ReadCloser - if h.MaxBytesPerSec > 0 { - reader = flowrate.NewReader(backendConn, h.MaxBytesPerSec) - } else { - reader = backendConn - } - _, err := io.Copy(requestHijackedConn, reader) - if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - glog.Errorf("Error proxying data from backend to client: %v", err) - } - wg.Done() - }() - - wg.Wait() - return true -} - -func (h *UpgradeAwareProxyHandler) defaultProxyTransport(url *url.URL, internalTransport http.RoundTripper) http.RoundTripper { - scheme := url.Scheme - host := url.Host - suffix := h.Location.Path - if strings.HasSuffix(url.Path, "/") && !strings.HasSuffix(suffix, "/") { - suffix += "/" - } - pathPrepend := strings.TrimSuffix(url.Path, suffix) - rewritingTransport := &proxy.Transport{ - Scheme: scheme, - Host: host, - PathPrepend: pathPrepend, - RoundTripper: internalTransport, - } - return &corsRemovingTransport{ - RoundTripper: rewritingTransport, - } -} - -// corsRemovingTransport is a wrapper for an internal transport. It removes CORS headers -// from the internal response. -type corsRemovingTransport struct { - http.RoundTripper -} - -func (p *corsRemovingTransport) RoundTrip(req *http.Request) (*http.Response, error) { - resp, err := p.RoundTripper.RoundTrip(req) - if err != nil { - return nil, err - } - removeCORSHeaders(resp) - return resp, nil -} - -var _ = net.RoundTripperWrapper(&corsRemovingTransport{}) - -func (rt *corsRemovingTransport) WrappedRoundTripper() http.RoundTripper { - return rt.RoundTripper -} - -// removeCORSHeaders strip CORS headers sent from the backend -// This should be called on all responses before returning -func removeCORSHeaders(resp *http.Response) { - resp.Header.Del("Access-Control-Allow-Credentials") - resp.Header.Del("Access-Control-Allow-Headers") - resp.Header.Del("Access-Control-Allow-Methods") - resp.Header.Del("Access-Control-Allow-Origin") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy_test.go deleted file mode 100644 index 8b9268402..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/proxy_test.go +++ /dev/null @@ -1,725 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "bytes" - "compress/gzip" - "crypto/tls" - "crypto/x509" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "net/http/httputil" - "net/url" - "reflect" - "strconv" - "strings" - "testing" - - "golang.org/x/net/websocket" - - utilnet "k8s.io/kubernetes/pkg/util/net" - "k8s.io/kubernetes/pkg/util/proxy" -) - -type fakeResponder struct { - called bool - err error -} - -func (r *fakeResponder) Error(err error) { - if r.called { - panic("called twice") - } - r.called = true - r.err = err -} - -type SimpleBackendHandler struct { - requestURL url.URL - requestHeader http.Header - requestBody []byte - requestMethod string - responseBody string - responseHeader map[string]string - t *testing.T -} - -func (s *SimpleBackendHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s.requestURL = *req.URL - s.requestHeader = req.Header - s.requestMethod = req.Method - var err error - s.requestBody, err = ioutil.ReadAll(req.Body) - if err != nil { - s.t.Errorf("Unexpected error: %v", err) - return - } - - if s.responseHeader != nil { - for k, v := range s.responseHeader { - w.Header().Add(k, v) - } - } - w.Write([]byte(s.responseBody)) -} - -func validateParameters(t *testing.T, name string, actual url.Values, expected map[string]string) { - for k, v := range expected { - actualValue, ok := actual[k] - if !ok { - t.Errorf("%s: Expected parameter %s not received", name, k) - continue - } - if actualValue[0] != v { - t.Errorf("%s: Parameter %s values don't match. Actual: %#v, Expected: %s", - name, k, actualValue, v) - } - } -} - -func validateHeaders(t *testing.T, name string, actual http.Header, expected map[string]string, notExpected []string) { - for k, v := range expected { - actualValue, ok := actual[k] - if !ok { - t.Errorf("%s: Expected header %s not received", name, k) - continue - } - if actualValue[0] != v { - t.Errorf("%s: Header %s values don't match. Actual: %s, Expected: %s", - name, k, actualValue, v) - } - } - if notExpected == nil { - return - } - for _, h := range notExpected { - if _, present := actual[h]; present { - t.Errorf("%s: unexpected header: %s", name, h) - } - } -} - -func TestServeHTTP(t *testing.T) { - tests := []struct { - name string - method string - requestPath string - expectedPath string - requestBody string - requestParams map[string]string - requestHeader map[string]string - responseHeader map[string]string - expectedRespHeader map[string]string - notExpectedRespHeader []string - upgradeRequired bool - expectError func(err error) bool - }{ - { - name: "root path, simple get", - method: "GET", - requestPath: "/", - expectedPath: "/", - }, - { - name: "no upgrade header sent", - method: "GET", - requestPath: "/", - upgradeRequired: true, - expectError: func(err error) bool { - return err != nil && strings.Contains(err.Error(), "Upgrade request required") - }, - }, - { - name: "simple path, get", - method: "GET", - requestPath: "/path/to/test", - expectedPath: "/path/to/test", - }, - { - name: "request params", - method: "POST", - requestPath: "/some/path/", - expectedPath: "/some/path/", - requestParams: map[string]string{"param1": "value/1", "param2": "value%2"}, - requestBody: "test request body", - }, - { - name: "request headers", - method: "PUT", - requestPath: "/some/path", - expectedPath: "/some/path", - requestHeader: map[string]string{"Header1": "value1", "Header2": "value2"}, - }, - { - name: "empty path - slash should be added", - method: "GET", - requestPath: "", - expectedPath: "/", - }, - { - name: "remove CORS headers", - method: "GET", - requestPath: "/some/path", - expectedPath: "/some/path", - responseHeader: map[string]string{ - "Header1": "value1", - "Access-Control-Allow-Origin": "some.server", - "Access-Control-Allow-Methods": "GET"}, - expectedRespHeader: map[string]string{ - "Header1": "value1", - }, - notExpectedRespHeader: []string{ - "Access-Control-Allow-Origin", - "Access-Control-Allow-Methods", - }, - }, - } - - for i, test := range tests { - func() { - backendResponse := "Hello" - backendResponseHeader := test.responseHeader - // Test a simple header if not specified in the test - if backendResponseHeader == nil && test.expectedRespHeader == nil { - backendResponseHeader = map[string]string{"Content-Type": "text/html"} - test.expectedRespHeader = map[string]string{"Content-Type": "text/html"} - } - backendHandler := &SimpleBackendHandler{ - responseBody: backendResponse, - responseHeader: backendResponseHeader, - } - backendServer := httptest.NewServer(backendHandler) - defer backendServer.Close() - - responder := &fakeResponder{} - backendURL, _ := url.Parse(backendServer.URL) - backendURL.Path = test.requestPath - proxyHandler := &UpgradeAwareProxyHandler{ - Location: backendURL, - Responder: responder, - UpgradeRequired: test.upgradeRequired, - } - proxyServer := httptest.NewServer(proxyHandler) - defer proxyServer.Close() - proxyURL, _ := url.Parse(proxyServer.URL) - proxyURL.Path = test.requestPath - paramValues := url.Values{} - for k, v := range test.requestParams { - paramValues[k] = []string{v} - } - proxyURL.RawQuery = paramValues.Encode() - var requestBody io.Reader - if test.requestBody != "" { - requestBody = bytes.NewBufferString(test.requestBody) - } - req, err := http.NewRequest(test.method, proxyURL.String(), requestBody) - if test.requestHeader != nil { - header := http.Header{} - for k, v := range test.requestHeader { - header.Add(k, v) - } - req.Header = header - } - if err != nil { - t.Errorf("Error creating client request: %v", err) - } - client := &http.Client{} - res, err := client.Do(req) - if err != nil { - t.Errorf("Error from proxy request: %v", err) - } - - if test.expectError != nil { - if !responder.called { - t.Errorf("%d: responder was not invoked", i) - return - } - if !test.expectError(responder.err) { - t.Errorf("%d: unexpected error: %v", i, responder.err) - } - return - } - - // Validate backend request - // Method - if backendHandler.requestMethod != test.method { - t.Errorf("Unexpected request method: %s. Expected: %s", - backendHandler.requestMethod, test.method) - } - - // Body - if string(backendHandler.requestBody) != test.requestBody { - t.Errorf("Unexpected request body: %s. Expected: %s", - string(backendHandler.requestBody), test.requestBody) - } - - // Path - if backendHandler.requestURL.Path != test.expectedPath { - t.Errorf("Unexpected request path: %s", backendHandler.requestURL.Path) - } - // Parameters - validateParameters(t, test.name, backendHandler.requestURL.Query(), test.requestParams) - - // Headers - validateHeaders(t, test.name+" backend request", backendHandler.requestHeader, - test.requestHeader, nil) - - // Validate proxy response - - // Response Headers - validateHeaders(t, test.name+" backend headers", res.Header, test.expectedRespHeader, test.notExpectedRespHeader) - - // Validate Body - responseBody, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Errorf("Unexpected error reading response body: %v", err) - } - if rb := string(responseBody); rb != backendResponse { - t.Errorf("Did not get expected response body: %s. Expected: %s", rb, backendResponse) - } - - // Error - if responder.called { - t.Errorf("Unexpected proxy handler error: %v", responder.err) - } - }() - } -} - -func TestProxyUpgrade(t *testing.T) { - - localhostPool := x509.NewCertPool() - if !localhostPool.AppendCertsFromPEM(localhostCert) { - t.Errorf("error setting up localhostCert pool") - } - - testcases := map[string]struct { - ServerFunc func(http.Handler) *httptest.Server - ProxyTransport http.RoundTripper - }{ - "http": { - ServerFunc: httptest.NewServer, - ProxyTransport: nil, - }, - "https (invalid hostname + InsecureSkipVerify)": { - ServerFunc: func(h http.Handler) *httptest.Server { - cert, err := tls.X509KeyPair(exampleCert, exampleKey) - if err != nil { - t.Errorf("https (invalid hostname): proxy_test: %v", err) - } - ts := httptest.NewUnstartedServer(h) - ts.TLS = &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - ts.StartTLS() - return ts - }, - ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}), - }, - "https (valid hostname + RootCAs)": { - ServerFunc: func(h http.Handler) *httptest.Server { - cert, err := tls.X509KeyPair(localhostCert, localhostKey) - if err != nil { - t.Errorf("https (valid hostname): proxy_test: %v", err) - } - ts := httptest.NewUnstartedServer(h) - ts.TLS = &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - ts.StartTLS() - return ts - }, - ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), - }, - "https (valid hostname + RootCAs + custom dialer)": { - ServerFunc: func(h http.Handler) *httptest.Server { - cert, err := tls.X509KeyPair(localhostCert, localhostKey) - if err != nil { - t.Errorf("https (valid hostname): proxy_test: %v", err) - } - ts := httptest.NewUnstartedServer(h) - ts.TLS = &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - ts.StartTLS() - return ts - }, - ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{Dial: net.Dial, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), - }, - } - - for k, tc := range testcases { - - backendServer := tc.ServerFunc(websocket.Handler(func(ws *websocket.Conn) { - defer ws.Close() - body := make([]byte, 5) - ws.Read(body) - ws.Write([]byte("hello " + string(body))) - })) - defer backendServer.Close() - - serverURL, _ := url.Parse(backendServer.URL) - proxyHandler := &UpgradeAwareProxyHandler{ - Location: serverURL, - Transport: tc.ProxyTransport, - } - proxy := httptest.NewServer(proxyHandler) - defer proxy.Close() - - ws, err := websocket.Dial("ws://"+proxy.Listener.Addr().String()+"/some/path", "", "http://127.0.0.1/") - if err != nil { - t.Fatalf("%s: websocket dial err: %s", k, err) - } - defer ws.Close() - - if _, err := ws.Write([]byte("world")); err != nil { - t.Fatalf("%s: write err: %s", k, err) - } - - response := make([]byte, 20) - n, err := ws.Read(response) - if err != nil { - t.Fatalf("%s: read err: %s", k, err) - } - if e, a := "hello world", string(response[0:n]); e != a { - t.Fatalf("%s: expected '%#v', got '%#v'", k, e, a) - } - } -} - -func TestDefaultProxyTransport(t *testing.T) { - tests := []struct { - name, - url, - location, - expectedScheme, - expectedHost, - expectedPathPrepend string - }{ - - { - name: "simple path", - url: "http://test.server:8080/a/test/location", - location: "http://localhost/location", - expectedScheme: "http", - expectedHost: "test.server:8080", - expectedPathPrepend: "/a/test", - }, - { - name: "empty path", - url: "http://test.server:8080/a/test/", - location: "http://localhost", - expectedScheme: "http", - expectedHost: "test.server:8080", - expectedPathPrepend: "/a/test", - }, - { - name: "location ending in slash", - url: "http://test.server:8080/a/test/", - location: "http://localhost/", - expectedScheme: "http", - expectedHost: "test.server:8080", - expectedPathPrepend: "/a/test", - }, - } - - for _, test := range tests { - locURL, _ := url.Parse(test.location) - URL, _ := url.Parse(test.url) - h := UpgradeAwareProxyHandler{ - Location: locURL, - } - result := h.defaultProxyTransport(URL, nil) - transport := result.(*corsRemovingTransport).RoundTripper.(*proxy.Transport) - if transport.Scheme != test.expectedScheme { - t.Errorf("%s: unexpected scheme. Actual: %s, Expected: %s", test.name, transport.Scheme, test.expectedScheme) - } - if transport.Host != test.expectedHost { - t.Errorf("%s: unexpected host. Actual: %s, Expected: %s", test.name, transport.Host, test.expectedHost) - } - if transport.PathPrepend != test.expectedPathPrepend { - t.Errorf("%s: unexpected path prepend. Actual: %s, Expected: %s", test.name, transport.PathPrepend, test.expectedPathPrepend) - } - } -} - -func TestProxyRequestContentLengthAndTransferEncoding(t *testing.T) { - chunk := func(data []byte) []byte { - out := &bytes.Buffer{} - chunker := httputil.NewChunkedWriter(out) - for _, b := range data { - if _, err := chunker.Write([]byte{b}); err != nil { - panic(err) - } - } - chunker.Close() - out.Write([]byte("\r\n")) - return out.Bytes() - } - - zip := func(data []byte) []byte { - out := &bytes.Buffer{} - zipper := gzip.NewWriter(out) - if _, err := zipper.Write(data); err != nil { - panic(err) - } - zipper.Close() - return out.Bytes() - } - - sampleData := []byte("abcde") - - table := map[string]struct { - reqHeaders http.Header - reqBody []byte - - expectedHeaders http.Header - expectedBody []byte - }{ - "content-length": { - reqHeaders: http.Header{ - "Content-Length": []string{"5"}, - }, - reqBody: sampleData, - - expectedHeaders: http.Header{ - "Content-Length": []string{"5"}, - "Content-Encoding": nil, // none set - "Transfer-Encoding": nil, // none set - }, - expectedBody: sampleData, - }, - - "content-length + identity transfer-encoding": { - reqHeaders: http.Header{ - "Content-Length": []string{"5"}, - "Transfer-Encoding": []string{"identity"}, - }, - reqBody: sampleData, - - expectedHeaders: http.Header{ - "Content-Length": []string{"5"}, - "Content-Encoding": nil, // none set - "Transfer-Encoding": nil, // gets removed - }, - expectedBody: sampleData, - }, - - "content-length + gzip content-encoding": { - reqHeaders: http.Header{ - "Content-Length": []string{strconv.Itoa(len(zip(sampleData)))}, - "Content-Encoding": []string{"gzip"}, - }, - reqBody: zip(sampleData), - - expectedHeaders: http.Header{ - "Content-Length": []string{strconv.Itoa(len(zip(sampleData)))}, - "Content-Encoding": []string{"gzip"}, - "Transfer-Encoding": nil, // none set - }, - expectedBody: zip(sampleData), - }, - - "chunked transfer-encoding": { - reqHeaders: http.Header{ - "Transfer-Encoding": []string{"chunked"}, - }, - reqBody: chunk(sampleData), - - expectedHeaders: http.Header{ - "Content-Length": nil, // none set - "Content-Encoding": nil, // none set - "Transfer-Encoding": nil, // Transfer-Encoding gets removed - }, - expectedBody: sampleData, // sample data is unchunked - }, - - "chunked transfer-encoding + gzip content-encoding": { - reqHeaders: http.Header{ - "Content-Encoding": []string{"gzip"}, - "Transfer-Encoding": []string{"chunked"}, - }, - reqBody: chunk(zip(sampleData)), - - expectedHeaders: http.Header{ - "Content-Length": nil, // none set - "Content-Encoding": []string{"gzip"}, - "Transfer-Encoding": nil, // gets removed - }, - expectedBody: zip(sampleData), // sample data is unchunked, but content-encoding is preserved - }, - - // "Transfer-Encoding: gzip" is not supported by go - // See http/transfer.go#fixTransferEncoding (https://golang.org/src/net/http/transfer.go#L427) - // Once it is supported, this test case should succeed - // - // "gzip+chunked transfer-encoding": { - // reqHeaders: http.Header{ - // "Transfer-Encoding": []string{"chunked,gzip"}, - // }, - // reqBody: chunk(zip(sampleData)), - // - // expectedHeaders: http.Header{ - // "Content-Length": nil, // no content-length headers - // "Transfer-Encoding": nil, // Transfer-Encoding gets removed - // }, - // expectedBody: sampleData, - // }, - } - - successfulResponse := "backend passed tests" - for k, item := range table { - // Start the downstream server - downstreamServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - // Verify headers - for header, v := range item.expectedHeaders { - if !reflect.DeepEqual(v, req.Header[header]) { - t.Errorf("%s: Expected headers for %s to be %v, got %v", k, header, v, req.Header[header]) - } - } - - // Read body - body, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Errorf("%s: unexpected error %v", k, err) - } - req.Body.Close() - - // Verify length - if req.ContentLength > 0 && req.ContentLength != int64(len(body)) { - t.Errorf("%s: ContentLength was %d, len(data) was %d", k, req.ContentLength, len(body)) - } - - // Verify content - if !bytes.Equal(item.expectedBody, body) { - t.Errorf("%s: Expected %q, got %q", k, string(item.expectedBody), string(body)) - } - - // Write successful response - w.Write([]byte(successfulResponse)) - })) - defer downstreamServer.Close() - - responder := &fakeResponder{} - backendURL, _ := url.Parse(downstreamServer.URL) - proxyHandler := &UpgradeAwareProxyHandler{ - Location: backendURL, - Responder: responder, - UpgradeRequired: false, - } - proxyServer := httptest.NewServer(proxyHandler) - defer proxyServer.Close() - - // Dial the proxy server - conn, err := net.Dial(proxyServer.Listener.Addr().Network(), proxyServer.Listener.Addr().String()) - if err != nil { - t.Errorf("unexpected error %v", err) - continue - } - defer conn.Close() - - // Add standard http 1.1 headers - if item.reqHeaders == nil { - item.reqHeaders = http.Header{} - } - item.reqHeaders.Add("Connection", "close") - item.reqHeaders.Add("Host", proxyServer.Listener.Addr().String()) - - // Write the request headers - if _, err := fmt.Fprint(conn, "POST / HTTP/1.1\r\n"); err != nil { - t.Fatalf("%s unexpected error %v", k, err) - } - for header, values := range item.reqHeaders { - for _, value := range values { - if _, err := fmt.Fprintf(conn, "%s: %s\r\n", header, value); err != nil { - t.Fatalf("%s: unexpected error %v", k, err) - } - } - } - // Header separator - if _, err := fmt.Fprint(conn, "\r\n"); err != nil { - t.Fatalf("%s: unexpected error %v", k, err) - } - // Body - if _, err := conn.Write(item.reqBody); err != nil { - t.Fatalf("%s: unexpected error %v", k, err) - } - - // Read response - response, err := ioutil.ReadAll(conn) - if err != nil { - t.Errorf("%s: unexpected error %v", k, err) - continue - } - if !strings.HasSuffix(string(response), successfulResponse) { - t.Errorf("%s: Did not get successful response: %s", k, string(response)) - continue - } - } -} - -// exampleCert was generated from crypto/tls/generate_cert.go with the following command: -// go run generate_cert.go --rsa-bits 512 --host example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h -var exampleCert = []byte(`-----BEGIN CERTIFICATE----- -MIIBcjCCAR6gAwIBAgIQBOUTYowZaENkZi0faI9DgTALBgkqhkiG9w0BAQswEjEQ -MA4GA1UEChMHQWNtZSBDbzAgFw03MDAxMDEwMDAwMDBaGA8yMDg0MDEyOTE2MDAw -MFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCZ -xfR3sgeHBraGFfF/24tTn4PRVAHOf2UOOxSQRs+aYjNqimFqf/SRIblQgeXdBJDR -gVK5F1Js2zwlehw0bHxRAgMBAAGjUDBOMA4GA1UdDwEB/wQEAwIApDATBgNVHSUE -DDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MBYGA1UdEQQPMA2CC2V4YW1w -bGUuY29tMAsGCSqGSIb3DQEBCwNBAI/mfBB8dm33IpUl+acSyWfL6gX5Wc0FFyVj -dKeesE1XBuPX1My/rzU6Oy/YwX7LOL4FaeNUS6bbL4axSLPKYSs= ------END CERTIFICATE-----`) - -var exampleKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIBOgIBAAJBAJnF9HeyB4cGtoYV8X/bi1Ofg9FUAc5/ZQ47FJBGz5piM2qKYWp/ -9JEhuVCB5d0EkNGBUrkXUmzbPCV6HDRsfFECAwEAAQJBAJLH9yPuButniACTn5L5 -IJQw1mWQt6zBw9eCo41YWkA0866EgjC53aPZaRjXMp0uNJGdIsys2V5rCOOLWN2C -ODECIQDICHsi8QQQ9wpuJy8X5l8MAfxHL+DIqI84wQTeVM91FQIhAMTME8A18/7h -1Ad6drdnxAkuC0tX6Sx0LDozrmen+HFNAiAlcEDrt0RVkIcpOrg7tuhPLQf0oudl -Zvb3Xlj069awSQIgcT15E/43w2+RASifzVNhQ2MCTr1sSA8lL+xzK+REmnUCIBhQ -j4139pf8Re1J50zBxS/JlQfgDQi9sO9pYeiHIxNs ------END RSA PRIVATE KEY-----`) - -// localhostCert was generated from crypto/tls/generate_cert.go with the following command: -// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h -var localhostCert = []byte(`-----BEGIN CERTIFICATE----- -MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD -bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj -bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa -IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA -AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud -EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA -AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk -Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA== ------END CERTIFICATE-----`) - -// localhostKey is the private key for localhostCert. -var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0 -0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV -NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d -AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW -MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD -EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA -1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE= ------END RSA PRIVATE KEY-----`) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker.go deleted file mode 100644 index b0c61075c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -// Check the http error status from a location URL. -// And convert an error into a structured API object. -// Finally ensure we close the body before returning the error -type HttpResponseChecker interface { - Check(resp *http.Response) error -} - -// Max length read from the response body of a location which returns error status -const ( - maxReadLength = 50000 -) - -// A generic http response checker to transform the error. -type GenericHttpResponseChecker struct { - QualifiedResource unversioned.GroupResource - Name string -} - -func (checker GenericHttpResponseChecker) Check(resp *http.Response) error { - if resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusPartialContent { - defer resp.Body.Close() - bodyBytes, err := ioutil.ReadAll(io.LimitReader(resp.Body, maxReadLength)) - if err != nil { - return errors.NewInternalError(err) - } - bodyText := string(bodyBytes) - - switch { - case resp.StatusCode == http.StatusInternalServerError: - return errors.NewInternalError(fmt.Errorf("%s", bodyText)) - case resp.StatusCode == http.StatusBadRequest: - return errors.NewBadRequest(bodyText) - case resp.StatusCode == http.StatusNotFound: - return errors.NewGenericServerResponse(resp.StatusCode, "", checker.QualifiedResource, checker.Name, bodyText, 0, false) - } - return errors.NewGenericServerResponse(resp.StatusCode, "", checker.QualifiedResource, checker.Name, bodyText, 0, false) - } - return nil -} - -func NewGenericHttpResponseChecker(qualifiedResource unversioned.GroupResource, name string) GenericHttpResponseChecker { - return GenericHttpResponseChecker{QualifiedResource: qualifiedResource, Name: name} -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker_test.go deleted file mode 100644 index f1ad62020..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/response_checker_test.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" -) - -func TestGenericHttpResponseChecker(t *testing.T) { - responseChecker := NewGenericHttpResponseChecker(api.Resource("pods"), "foo") - tests := []struct { - resp *http.Response - expectError bool - expected error - name string - }{ - { - resp: &http.Response{ - Body: ioutil.NopCloser(bytes.NewBufferString("Success")), - StatusCode: http.StatusOK, - }, - expectError: false, - name: "ok", - }, - { - resp: &http.Response{ - Body: ioutil.NopCloser(bytes.NewBufferString("Invalid request.")), - StatusCode: http.StatusBadRequest, - }, - expectError: true, - expected: errors.NewBadRequest("Invalid request."), - name: "bad request", - }, - { - resp: &http.Response{ - Body: ioutil.NopCloser(bytes.NewBufferString("Pod does not exist.")), - StatusCode: http.StatusInternalServerError, - }, - expectError: true, - expected: errors.NewInternalError(fmt.Errorf("%s", "Pod does not exist.")), - name: "internal server error", - }, - } - for _, test := range tests { - err := responseChecker.Check(test.resp) - if test.expectError && err == nil { - t.Error("unexpected non-error") - } - if !test.expectError && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectError && !reflect.DeepEqual(err, test.expected) { - t.Errorf("expected: %s, saw: %s", test.expected, err) - } - } -} - -func TestGenericHttpResponseCheckerLimitReader(t *testing.T) { - responseChecker := NewGenericHttpResponseChecker(api.Resource("pods"), "foo") - excessedString := strings.Repeat("a", (maxReadLength + 10000)) - resp := &http.Response{ - Body: ioutil.NopCloser(bytes.NewBufferString(excessedString)), - StatusCode: http.StatusBadRequest, - } - err := responseChecker.Check(resp) - if err == nil { - t.Error("unexpected non-error") - } - if len(err.Error()) != maxReadLength { - t.Errorf("expected lenth of error message: %d, saw: %d", maxReadLength, len(err.Error())) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer.go deleted file mode 100644 index afa9eb5b5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "io" - "net/http" - "net/url" - "strings" - - "k8s.io/kubernetes/pkg/api/rest" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -// LocationStreamer is a resource that streams the contents of a particular -// location URL -type LocationStreamer struct { - Location *url.URL - Transport http.RoundTripper - ContentType string - Flush bool - ResponseChecker HttpResponseChecker -} - -// a LocationStreamer must implement a rest.ResourceStreamer -var _ rest.ResourceStreamer = &LocationStreamer{} - -func (obj *LocationStreamer) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -// InputStream returns a stream with the contents of the URL location. If no location is provided, -// a null stream is returned. -func (s *LocationStreamer) InputStream(apiVersion, acceptHeader string) (stream io.ReadCloser, flush bool, contentType string, err error) { - if s.Location == nil { - // If no location was provided, return a null stream - return nil, false, "", nil - } - transport := s.Transport - if transport == nil { - transport = http.DefaultTransport - } - client := &http.Client{Transport: transport} - resp, err := client.Get(s.Location.String()) - if err != nil { - return nil, false, "", err - } - - if s.ResponseChecker != nil { - if err = s.ResponseChecker.Check(resp); err != nil { - return nil, false, "", err - } - } - - contentType = s.ContentType - if len(contentType) == 0 { - contentType = resp.Header.Get("Content-Type") - if len(contentType) > 0 { - contentType = strings.TrimSpace(strings.SplitN(contentType, ";", 2)[0]) - } - } - flush = s.Flush - stream = resp.Body - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer_test.go deleted file mode 100644 index 956222837..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/generic/rest/streamer_test.go +++ /dev/null @@ -1,148 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 rest - -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" -) - -func TestInputStreamReader(t *testing.T) { - resultString := "Test output" - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - w.Write([]byte(resultString)) - })) - defer s.Close() - u, err := url.Parse(s.URL) - if err != nil { - t.Errorf("Error parsing server URL: %v", err) - return - } - streamer := &LocationStreamer{ - Location: u, - } - readCloser, _, _, err := streamer.InputStream("", "") - if err != nil { - t.Errorf("Unexpected error when getting stream: %v", err) - return - } - defer readCloser.Close() - result, err := ioutil.ReadAll(readCloser) - if string(result) != resultString { - t.Errorf("Stream content does not match. Got: %s. Expected: %s.", string(result), resultString) - } -} - -func TestInputStreamNullLocation(t *testing.T) { - streamer := &LocationStreamer{ - Location: nil, - } - readCloser, _, _, err := streamer.InputStream("", "") - if err != nil { - t.Errorf("Unexpected error when getting stream with null location: %v", err) - } - if readCloser != nil { - t.Errorf("Expected stream to be nil. Got: %#v", readCloser) - } -} - -type testTransport struct { - body string - err error -} - -func (tt *testTransport) RoundTrip(req *http.Request) (*http.Response, error) { - r := bufio.NewReader(bytes.NewBufferString(tt.body)) - return http.ReadResponse(r, req) -} - -func fakeTransport(mime, message string) http.RoundTripper { - content := fmt.Sprintf("HTTP/1.1 200 OK\nContent-Type: %s\n\n%s", mime, message) - return &testTransport{body: content} -} - -func TestInputStreamContentType(t *testing.T) { - location, _ := url.Parse("http://www.example.com") - streamer := &LocationStreamer{ - Location: location, - Transport: fakeTransport("application/json", "hello world"), - } - readCloser, _, contentType, err := streamer.InputStream("", "") - if err != nil { - t.Errorf("Unexpected error when getting stream: %v", err) - return - } - defer readCloser.Close() - if contentType != "application/json" { - t.Errorf("Unexpected content type. Got: %s. Expected: application/json", contentType) - } -} - -func TestInputStreamTransport(t *testing.T) { - message := "hello world" - location, _ := url.Parse("http://www.example.com") - streamer := &LocationStreamer{ - Location: location, - Transport: fakeTransport("text/plain", message), - } - readCloser, _, _, err := streamer.InputStream("", "") - if err != nil { - t.Errorf("Unexpected error when getting stream: %v", err) - return - } - defer readCloser.Close() - result, err := ioutil.ReadAll(readCloser) - if string(result) != message { - t.Errorf("Stream content does not match. Got: %s. Expected: %s.", string(result), message) - } -} - -func fakeInternalServerErrorTransport(mime, message string) http.RoundTripper { - content := fmt.Sprintf("HTTP/1.1 500 \"Internal Server Error\"\nContent-Type: %s\n\n%s", mime, message) - return &testTransport{body: content} -} - -func TestInputStreamInternalServerErrorTransport(t *testing.T) { - message := "Pod is in PodPending" - location, _ := url.Parse("http://www.example.com") - streamer := &LocationStreamer{ - Location: location, - Transport: fakeInternalServerErrorTransport("text/plain", message), - ResponseChecker: NewGenericHttpResponseChecker(api.Resource(""), ""), - } - expectedError := errors.NewInternalError(fmt.Errorf("%s", message)) - - _, _, _, err := streamer.InputStream("", "") - if err == nil { - t.Errorf("unexpected non-error") - return - } - - if !reflect.DeepEqual(err, expectedError) { - t.Errorf("StreamInternalServerError does not match. Got: %s. Expected: %s.", err, expectedError) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/codec_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/codec_test.go deleted file mode 100644 index 942de910c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/codec_test.go +++ /dev/null @@ -1,181 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 thirdpartyresourcedata - -import ( - "encoding/json" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/runtime" -) - -type Foo struct { - unversioned.TypeMeta `json:",inline"` - api.ObjectMeta `json:"metadata,omitempty" description:"standard object metadata"` - - SomeField string `json:"someField"` - OtherField int `json:"otherField"` -} - -type FooList struct { - unversioned.TypeMeta `json:",inline"` - unversioned.ListMeta `json:"metadata,omitempty" description:"standard list metadata; see http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata"` - - Items []Foo `json:"items"` -} - -func TestCodec(t *testing.T) { - tests := []struct { - obj *Foo - expectErr bool - name string - }{ - { - obj: &Foo{ObjectMeta: api.ObjectMeta{Name: "bar"}}, - expectErr: true, - name: "missing kind", - }, - { - obj: &Foo{ObjectMeta: api.ObjectMeta{Name: "bar"}, TypeMeta: unversioned.TypeMeta{Kind: "Foo"}}, - name: "basic", - }, - { - obj: &Foo{ObjectMeta: api.ObjectMeta{Name: "bar", ResourceVersion: "baz"}, TypeMeta: unversioned.TypeMeta{Kind: "Foo"}}, - name: "resource version", - }, - { - obj: &Foo{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - CreationTimestamp: unversioned.Time{Time: time.Unix(100, 0)}, - }, - TypeMeta: unversioned.TypeMeta{Kind: "Foo"}, - }, - name: "creation time", - }, - { - obj: &Foo{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - ResourceVersion: "baz", - Labels: map[string]string{"foo": "bar", "baz": "blah"}, - }, - TypeMeta: unversioned.TypeMeta{Kind: "Foo"}, - }, - name: "labels", - }, - } - for _, test := range tests { - d := &thirdPartyResourceDataDecoder{kind: "Foo", delegate: testapi.Extensions.Codec()} - e := &thirdPartyResourceDataEncoder{kind: "Foo", delegate: testapi.Extensions.Codec()} - data, err := json.Marshal(test.obj) - if err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - obj, err := runtime.Decode(d, data) - if err != nil && !test.expectErr { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - if test.expectErr { - if err == nil { - t.Errorf("[%s] unexpected non-error", test.name) - } - continue - } - rsrcObj, ok := obj.(*extensions.ThirdPartyResourceData) - if !ok { - t.Errorf("[%s] unexpected object: %v", test.name, obj) - continue - } - if !reflect.DeepEqual(rsrcObj.ObjectMeta, test.obj.ObjectMeta) { - t.Errorf("[%s]\nexpected\n%v\nsaw\n%v\n", test.name, rsrcObj.ObjectMeta, test.obj.ObjectMeta) - } - var output Foo - if err := json.Unmarshal(rsrcObj.Data, &output); err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - if !reflect.DeepEqual(&output, test.obj) { - t.Errorf("[%s]\nexpected\n%v\nsaw\n%v\n", test.name, test.obj, &output) - } - - data, err = runtime.Encode(e, rsrcObj) - if err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - } - - var output2 Foo - if err := json.Unmarshal(data, &output2); err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - if !reflect.DeepEqual(&output2, test.obj) { - t.Errorf("[%s]\nexpected\n%v\nsaw\n%v\n", test.name, test.obj, &output2) - } - } -} - -func TestCreater(t *testing.T) { - creater := NewObjectCreator("creater group", "creater version", api.Scheme) - tests := []struct { - name string - kind unversioned.GroupVersionKind - expectedObj runtime.Object - expectErr bool - }{ - { - name: "valid ThirdPartyResourceData creation", - kind: unversioned.GroupVersionKind{Group: "creater group", Version: "creater version", Kind: "ThirdPartyResourceData"}, - expectedObj: &extensions.ThirdPartyResourceData{}, - expectErr: false, - }, - { - name: "invalid ThirdPartyResourceData creation", - kind: unversioned.GroupVersionKind{Version: "invalid version", Kind: "ThirdPartyResourceData"}, - expectedObj: nil, - expectErr: true, - }, - { - name: "valid ListOptions creation", - kind: unversioned.GroupVersionKind{Version: "v1", Kind: "ListOptions"}, - expectedObj: &v1.ListOptions{}, - expectErr: false, - }, - } - for _, test := range tests { - out, err := creater.New(test.kind) - if err != nil && !test.expectErr { - t.Errorf("[%s] unexpected error: %v", test.name, err) - } - if err == nil && test.expectErr { - t.Errorf("[%s] unexpected non-error", test.name) - } - if !reflect.DeepEqual(test.expectedObj, out) { - t.Errorf("[%s] unexpected error: expect: %v, got: %v", test.name, test.expectedObj, out) - } - - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go deleted file mode 100644 index 55eaf09b1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "strings" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/registry/generic/registry" - "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata" - "k8s.io/kubernetes/pkg/runtime" -) - -// REST implements a RESTStorage for ThirdPartyResourceDatas against etcd -type REST struct { - *registry.Store - kind string -} - -// NewREST returns a registry which will store ThirdPartyResourceData in the given helper -func NewREST(opts generic.RESTOptions, group, kind string) *REST { - prefix := "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s" - - // We explicitly do NOT do any decoration here yet. - storageInterface := opts.Storage - - store := ®istry.Store{ - NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} }, - NewListFunc: func() runtime.Object { return &extensions.ThirdPartyResourceDataList{} }, - KeyRootFunc: func(ctx api.Context) string { - return registry.NamespaceKeyRootFunc(ctx, prefix) - }, - KeyFunc: func(ctx api.Context, id string) (string, error) { - return registry.NamespaceKeyFunc(ctx, prefix, id) - }, - ObjectNameFunc: func(obj runtime.Object) (string, error) { - return obj.(*extensions.ThirdPartyResourceData).Name, nil - }, - PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { - return thirdpartyresourcedata.Matcher(label, field) - }, - QualifiedResource: extensions.Resource("thirdpartyresourcedatas"), - DeleteCollectionWorkers: opts.DeleteCollectionWorkers, - CreateStrategy: thirdpartyresourcedata.Strategy, - UpdateStrategy: thirdpartyresourcedata.Strategy, - DeleteStrategy: thirdpartyresourcedata.Strategy, - - Storage: storageInterface, - } - - return &REST{ - Store: store, - kind: kind, - } -} - -// Implements the rest.KindProvider interface -func (r *REST) Kind() string { - return r.kind -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go deleted file mode 100644 index 6b4eabf8a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd_test.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" - // Ensure that extensions/v1beta1 package is initialized. - _ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/registry/registrytest" - "k8s.io/kubernetes/pkg/runtime" - etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" -) - -func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { - etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) - restOptions := generic.RESTOptions{Storage: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1} - return NewREST(restOptions, "foo", "bar"), server -} - -func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceData { - return &extensions.ThirdPartyResourceData{ - ObjectMeta: api.ObjectMeta{ - Name: name, - Namespace: api.NamespaceDefault, - }, - Data: []byte("foobarbaz"), - } -} - -func TestCreate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - rsrc := validNewThirdPartyResourceData("foo") - rsrc.ObjectMeta = api.ObjectMeta{} - test.TestCreate( - // valid - rsrc, - // invalid - &extensions.ThirdPartyResourceData{}, - ) -} - -func TestUpdate(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - test.TestUpdate( - // valid - validNewThirdPartyResourceData("foo"), - // updateFunc - func(obj runtime.Object) runtime.Object { - object := obj.(*extensions.ThirdPartyResourceData) - object.Data = []byte("new description") - return object - }, - ) -} - -func TestDelete(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - test.TestDelete(validNewThirdPartyResourceData("foo")) -} - -func TestGet(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - test.TestGet(validNewThirdPartyResourceData("foo")) -} - -func TestList(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - test.TestList(validNewThirdPartyResourceData("foo")) -} - -func TestWatch(t *testing.T) { - storage, server := newStorage(t) - defer server.Terminate(t) - test := registrytest.New(t, storage.Store) - test.TestWatch( - validNewThirdPartyResourceData("foo"), - // matching labels - []labels.Set{}, - // not matching labels - []labels.Set{ - {"foo": "bar"}, - }, - // matching fields - []fields.Set{}, - // not matching fields - []fields.Set{ - {"metadata.name": "bar"}, - {"name": "foo"}, - }, - ) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy_test.go deleted file mode 100644 index 75e821944..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy_test.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 thirdpartyresourcedata - -import ( - "testing" - - _ "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/apis/extensions" -) - -func TestSelectableFieldLabelConversions(t *testing.T) { - apitesting.TestSelectableFieldLabelConversionsOfKind(t, - testapi.Extensions.GroupVersion().String(), - "ThirdPartyResourceData", - SelectableFields(&extensions.ThirdPartyResourceData{}), - nil, - ) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/util_test.go deleted file mode 100644 index a18722c17..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/util_test.go +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 thirdpartyresourcedata - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" -) - -func TestExtractAPIGroupAndKind(t *testing.T) { - tests := []struct { - input string - expectedKind string - expectedGroup string - expectErr bool - }{ - { - input: "foo.company.com", - expectedKind: "Foo", - expectedGroup: "company.com", - }, - { - input: "cron-tab.company.com", - expectedKind: "CronTab", - expectedGroup: "company.com", - }, - { - input: "foo", - expectErr: true, - }, - } - - for _, test := range tests { - kind, group, err := ExtractApiGroupAndKind(&extensions.ThirdPartyResource{ObjectMeta: api.ObjectMeta{Name: test.input}}) - if err != nil && !test.expectErr { - t.Errorf("unexpected error: %v", err) - continue - } - if err == nil && test.expectErr { - t.Errorf("unexpected non-error") - continue - } - if kind != test.expectedKind { - t.Errorf("expected: %s, saw: %s", test.expectedKind, kind) - } - if group != test.expectedGroup { - t.Errorf("expected: %s, saw: %s", test.expectedGroup, group) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/conversion_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/conversion_test.go deleted file mode 100644 index 6105e5aad..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/conversion_test.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" -) - -type InternalComplex struct { - runtime.TypeMeta - String string - Integer int - Integer64 int64 - Int64 int64 - Bool bool -} - -type ExternalComplex struct { - runtime.TypeMeta `json:",inline"` - String string `json:"string" description:"testing"` - Integer int `json:"int"` - Integer64 int64 `json:",omitempty"` - Int64 int64 - Bool bool `json:"bool"` -} - -func (obj *InternalComplex) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ExternalComplex) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } - -func TestStringMapConversion(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "external"} - - scheme := runtime.NewScheme() - scheme.Log(t) - scheme.AddKnownTypeWithName(internalGV.WithKind("Complex"), &InternalComplex{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("Complex"), &ExternalComplex{}) - - testCases := map[string]struct { - input map[string][]string - errFn func(error) bool - expected runtime.Object - }{ - "ignores omitempty": { - input: map[string][]string{ - "String": {"not_used"}, - "string": {"value"}, - "int": {"1"}, - "Integer64": {"2"}, - }, - expected: &ExternalComplex{String: "value", Integer: 1}, - }, - "returns error on bad int": { - input: map[string][]string{ - "int": {"a"}, - }, - errFn: func(err error) bool { return err != nil }, - expected: &ExternalComplex{}, - }, - "parses int64": { - input: map[string][]string{ - "Int64": {"-1"}, - }, - expected: &ExternalComplex{Int64: -1}, - }, - "returns error on bad int64": { - input: map[string][]string{ - "Int64": {"a"}, - }, - errFn: func(err error) bool { return err != nil }, - expected: &ExternalComplex{}, - }, - "parses boolean true": { - input: map[string][]string{ - "bool": {"true"}, - }, - expected: &ExternalComplex{Bool: true}, - }, - "parses boolean any value": { - input: map[string][]string{ - "bool": {"foo"}, - }, - expected: &ExternalComplex{Bool: true}, - }, - "parses boolean false": { - input: map[string][]string{ - "bool": {"false"}, - }, - expected: &ExternalComplex{Bool: false}, - }, - "parses boolean empty value": { - input: map[string][]string{ - "bool": {""}, - }, - expected: &ExternalComplex{Bool: true}, - }, - "parses boolean no value": { - input: map[string][]string{ - "bool": {}, - }, - expected: &ExternalComplex{Bool: false}, - }, - } - - for k, tc := range testCases { - out := &ExternalComplex{} - if err := scheme.Convert(&tc.input, out); (tc.errFn == nil && err != nil) || (tc.errFn != nil && !tc.errFn(err)) { - t.Errorf("%s: unexpected error: %v", k, err) - continue - } else if err != nil { - continue - } - if !reflect.DeepEqual(out, tc.expected) { - t.Errorf("%s: unexpected output: %#v", k, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/embedded_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/embedded_test.go deleted file mode 100644 index 6a143fb08..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/embedded_test.go +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "encoding/json" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/util/diff" -) - -type EmbeddedTest struct { - runtime.TypeMeta - ID string - Object runtime.Object - EmptyObject runtime.Object -} - -type EmbeddedTestExternal struct { - runtime.TypeMeta `json:",inline"` - ID string `json:"id,omitempty"` - Object runtime.RawExtension `json:"object,omitempty"` - EmptyObject runtime.RawExtension `json:"emptyObject,omitempty"` -} - -type ObjectTest struct { - runtime.TypeMeta - - ID string - Items []runtime.Object -} - -type ObjectTestExternal struct { - runtime.TypeMeta `yaml:",inline" json:",inline"` - - ID string `json:"id,omitempty"` - Items []runtime.RawExtension `json:"items,omitempty"` -} - -func (obj *ObjectTest) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ObjectTestExternal) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *EmbeddedTest) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *EmbeddedTestExternal) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } - -func TestDecodeEmptyRawExtensionAsObject(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "v1test"} - externalGVK := externalGV.WithKind("ObjectTest") - - s := runtime.NewScheme() - s.AddKnownTypes(internalGV, &ObjectTest{}) - s.AddKnownTypeWithName(externalGVK, &ObjectTestExternal{}) - - codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) - - obj, gvk, err := codec.Decode([]byte(`{"kind":"`+externalGVK.Kind+`","apiVersion":"`+externalGV.String()+`","items":[{}]}`), nil, nil) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - test := obj.(*ObjectTest) - if unk, ok := test.Items[0].(*runtime.Unknown); !ok || unk.Kind != "" || unk.APIVersion != "" || string(unk.Raw) != "{}" || unk.ContentType != runtime.ContentTypeJSON { - t.Fatalf("unexpected object: %#v", test.Items[0]) - } - if *gvk != externalGVK { - t.Fatalf("unexpected kind: %#v", gvk) - } - - obj, gvk, err = codec.Decode([]byte(`{"kind":"`+externalGVK.Kind+`","apiVersion":"`+externalGV.String()+`","items":[{"kind":"Other","apiVersion":"v1"}]}`), nil, nil) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - test = obj.(*ObjectTest) - if unk, ok := test.Items[0].(*runtime.Unknown); !ok || unk.Kind != "" || unk.APIVersion != "" || string(unk.Raw) != `{"kind":"Other","apiVersion":"v1"}` || unk.ContentType != runtime.ContentTypeJSON { - t.Fatalf("unexpected object: %#v", test.Items[0]) - } - if *gvk != externalGVK { - t.Fatalf("unexpected kind: %#v", gvk) - } -} - -func TestArrayOfRuntimeObject(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "v1test"} - - s := runtime.NewScheme() - s.AddKnownTypes(internalGV, &EmbeddedTest{}) - s.AddKnownTypeWithName(externalGV.WithKind("EmbeddedTest"), &EmbeddedTestExternal{}) - s.AddKnownTypes(internalGV, &ObjectTest{}) - s.AddKnownTypeWithName(externalGV.WithKind("ObjectTest"), &ObjectTestExternal{}) - - codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) - - innerItems := []runtime.Object{ - &EmbeddedTest{ID: "baz"}, - } - items := []runtime.Object{ - &EmbeddedTest{ID: "foo"}, - &EmbeddedTest{ID: "bar"}, - // TODO: until YAML is removed, this JSON must be in ascending key order to ensure consistent roundtrip serialization - &runtime.Unknown{ - Raw: []byte(`{"apiVersion":"unknown.group/unknown","foo":"bar","kind":"OtherTest"}`), - ContentType: runtime.ContentTypeJSON, - }, - &ObjectTest{ - Items: runtime.NewEncodableList(codec, innerItems), - }, - } - internal := &ObjectTest{ - Items: runtime.NewEncodableList(codec, items), - } - wire, err := runtime.Encode(codec, internal) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - t.Logf("Wire format is:\n%s\n", string(wire)) - - obj := &ObjectTestExternal{} - if err := json.Unmarshal(wire, obj); err != nil { - t.Fatalf("unexpected error: %v", err) - } - t.Logf("exact wire is: %s", string(obj.Items[0].Raw)) - - items[3] = &ObjectTest{Items: innerItems} - internal.Items = items - - decoded, err := runtime.Decode(codec, wire) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - list, err := meta.ExtractList(decoded) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if errs := runtime.DecodeList(list, codec); len(errs) > 0 { - t.Fatalf("unexpected error: %v", errs) - } - - list2, err := meta.ExtractList(list[3]) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if errs := runtime.DecodeList(list2, codec); len(errs) > 0 { - t.Fatalf("unexpected error: %v", errs) - } - if err := meta.SetList(list[3], list2); err != nil { - t.Fatalf("unexpected error: %v", err) - } - - // we want DecodeList to set type meta if possible, even on runtime.Unknown objects - internal.Items[2].(*runtime.Unknown).TypeMeta = runtime.TypeMeta{Kind: "OtherTest", APIVersion: "unknown.group/unknown"} - if e, a := internal.Items, list; !reflect.DeepEqual(e, a) { - t.Errorf("mismatched decoded: %s", diff.ObjectGoPrintSideBySide(e, a)) - } -} - -func TestNestedObject(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "v1test"} - embeddedTestExternalGVK := externalGV.WithKind("EmbeddedTest") - - s := runtime.NewScheme() - s.AddKnownTypes(internalGV, &EmbeddedTest{}) - s.AddKnownTypeWithName(embeddedTestExternalGVK, &EmbeddedTestExternal{}) - - codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) - - inner := &EmbeddedTest{ - ID: "inner", - } - outer := &EmbeddedTest{ - ID: "outer", - Object: runtime.NewEncodable(codec, inner), - } - - wire, err := runtime.Encode(codec, outer) - if err != nil { - t.Fatalf("Unexpected encode error '%v'", err) - } - - t.Logf("Wire format is:\n%v\n", string(wire)) - - decoded, err := runtime.Decode(codec, wire) - if err != nil { - t.Fatalf("Unexpected decode error %v", err) - } - - // for later tests - outer.Object = inner - - if e, a := outer, decoded; reflect.DeepEqual(e, a) { - t.Errorf("Expected unequal %#v %#v", e, a) - } - - obj, err := runtime.Decode(codec, decoded.(*EmbeddedTest).Object.(*runtime.Unknown).Raw) - if err != nil { - t.Fatal(err) - } - decoded.(*EmbeddedTest).Object = obj - if e, a := outer, decoded; !reflect.DeepEqual(e, a) { - t.Errorf("Expected equal %#v %#v", e, a) - } - - // test JSON decoding of the external object, which should preserve - // raw bytes - var externalViaJSON EmbeddedTestExternal - err = json.Unmarshal(wire, &externalViaJSON) - if err != nil { - t.Fatalf("Unexpected decode error %v", err) - } - if externalViaJSON.Kind == "" || externalViaJSON.APIVersion == "" || externalViaJSON.ID != "outer" { - t.Errorf("Expected objects to have type info set, got %#v", externalViaJSON) - } - if !reflect.DeepEqual(externalViaJSON.EmptyObject.Raw, []byte("null")) || len(externalViaJSON.Object.Raw) == 0 { - t.Errorf("Expected deserialization of nested objects into bytes, got %#v", externalViaJSON) - } - - // test JSON decoding, too, since Decode uses yaml unmarshalling. - // Generic Unmarshalling of JSON cannot load the nested objects because there is - // no default schema set. Consumers wishing to get direct JSON decoding must use - // the external representation - var decodedViaJSON EmbeddedTest - err = json.Unmarshal(wire, &decodedViaJSON) - if err == nil || !strings.Contains(err.Error(), "unmarshal object into Go value of type runtime.Object") { - t.Fatalf("Unexpected decode error %v", err) - } - if a := decodedViaJSON; a.Object != nil || a.EmptyObject != nil { - t.Errorf("Expected embedded objects to be nil: %#v", a) - } -} - -// TestDeepCopyOfRuntimeObject checks to make sure that runtime.Objects's can be passed through DeepCopy with fidelity -func TestDeepCopyOfRuntimeObject(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "v1test"} - embeddedTestExternalGVK := externalGV.WithKind("EmbeddedTest") - - s := runtime.NewScheme() - s.AddKnownTypes(internalGV, &EmbeddedTest{}) - s.AddKnownTypeWithName(embeddedTestExternalGVK, &EmbeddedTestExternal{}) - - original := &EmbeddedTest{ - ID: "outer", - Object: &EmbeddedTest{ - ID: "inner", - }, - } - - codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) - - originalData, err := runtime.Encode(codec, original) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - t.Logf("originalRole = %v\n", string(originalData)) - - copyOfOriginal, err := s.DeepCopy(original) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - copiedData, err := runtime.Encode(codec, copyOfOriginal.(runtime.Object)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - t.Logf("copyOfRole = %v\n", string(copiedData)) - - if !reflect.DeepEqual(original, copyOfOriginal) { - t.Errorf("expected \n%v\n, got \n%v", string(originalData), string(copiedData)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/extension_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/extension_test.go deleted file mode 100644 index 3545284e9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/extension_test.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "encoding/json" - "testing" - - "k8s.io/kubernetes/pkg/runtime" -) - -func TestEmbeddedRawExtensionMarshal(t *testing.T) { - type test struct { - Ext runtime.RawExtension - } - - extension := test{Ext: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}} - data, err := json.Marshal(extension) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if string(data) != `{"Ext":{"foo":"bar"}}` { - t.Errorf("unexpected data: %s", string(data)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/helper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/helper_test.go deleted file mode 100644 index e15a0e799..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/helper_test.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestDecodeList(t *testing.T) { - pl := &api.List{ - Items: []runtime.Object{ - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "1"}}, - &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{Kind: "Pod", APIVersion: testapi.Default.GroupVersion().String()}, - Raw: []byte(`{"kind":"Pod","apiVersion":"` + testapi.Default.GroupVersion().String() + `","metadata":{"name":"test"}}`), - ContentType: runtime.ContentTypeJSON, - }, - &runtime.Unstructured{ - Object: map[string]interface{}{ - "kind": "Foo", - "apiVersion": "Bar", - "test": "value", - }, - }, - }, - } - if errs := runtime.DecodeList(pl.Items, testapi.Default.Codec()); len(errs) != 0 { - t.Fatalf("unexpected error %v", errs) - } - if pod, ok := pl.Items[1].(*api.Pod); !ok || pod.Name != "test" { - t.Errorf("object not converted: %#v", pl.Items[1]) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/scheme_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/scheme_test.go deleted file mode 100644 index 52cb796da..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/scheme_test.go +++ /dev/null @@ -1,675 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "reflect" - "testing" - - "github.com/google/gofuzz" - flag "github.com/spf13/pflag" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/util/diff" -) - -var fuzzIters = flag.Int("fuzz-iters", 50, "How many fuzzing iterations to do.") - -type InternalSimple struct { - runtime.TypeMeta `json:",inline"` - TestString string `json:"testString"` -} - -type ExternalSimple struct { - runtime.TypeMeta `json:",inline"` - TestString string `json:"testString"` -} - -func (obj *InternalSimple) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ExternalSimple) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } - -func TestScheme(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "testExternal"} - - scheme := runtime.NewScheme() - scheme.AddKnownTypeWithName(internalGV.WithKind("Simple"), &InternalSimple{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("Simple"), &ExternalSimple{}) - - // If set, would clear TypeMeta during conversion. - //scheme.AddIgnoredConversionType(&TypeMeta{}, &TypeMeta{}) - - // test that scheme is an ObjectTyper - var _ runtime.ObjectTyper = scheme - - internalToExternalCalls := 0 - externalToInternalCalls := 0 - - // Register functions to verify that scope.Meta() gets set correctly. - err := scheme.AddConversionFuncs( - func(in *InternalSimple, out *ExternalSimple, scope conversion.Scope) error { - if e, a := internalGV.String(), scope.Meta().SrcVersion; e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - if e, a := externalGV.String(), scope.Meta().DestVersion; e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) - scope.Convert(&in.TestString, &out.TestString, 0) - internalToExternalCalls++ - return nil - }, - func(in *ExternalSimple, out *InternalSimple, scope conversion.Scope) error { - if e, a := externalGV.String(), scope.Meta().SrcVersion; e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - if e, a := internalGV.String(), scope.Meta().DestVersion; e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) - scope.Convert(&in.TestString, &out.TestString, 0) - externalToInternalCalls++ - return nil - }, - ) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - codecs := serializer.NewCodecFactory(scheme) - codec := codecs.LegacyCodec(externalGV) - jsonserializer, _ := codecs.SerializerForFileExtension("json") - - simple := &InternalSimple{ - TestString: "foo", - } - - // Test Encode, Decode, DecodeInto, and DecodeToVersion - obj := runtime.Object(simple) - data, err := runtime.Encode(codec, obj) - if err != nil { - t.Fatal(err) - } - - obj2, err := runtime.Decode(codec, data) - if err != nil { - t.Fatal(err) - } - if _, ok := obj2.(*InternalSimple); !ok { - t.Fatalf("Got wrong type") - } - if e, a := simple, obj2; !reflect.DeepEqual(e, a) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) - } - - obj3 := &InternalSimple{} - if err := runtime.DecodeInto(codec, data, obj3); err != nil { - t.Fatal(err) - } - // clearing TypeMeta is a function of the scheme, which we do not test here (ConvertToVersion - // does not automatically clear TypeMeta anymore). - simple.TypeMeta = runtime.TypeMeta{Kind: "Simple", APIVersion: externalGV.String()} - if e, a := simple, obj3; !reflect.DeepEqual(e, a) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) - } - - obj4, err := runtime.Decode(jsonserializer, data) - if err != nil { - t.Fatal(err) - } - if _, ok := obj4.(*ExternalSimple); !ok { - t.Fatalf("Got wrong type") - } - - // Test Convert - external := &ExternalSimple{} - err = scheme.Convert(simple, external) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if e, a := simple.TestString, external.TestString; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - - // Encode and Convert should each have caused an increment. - if e, a := 2, internalToExternalCalls; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - // DecodeInto and Decode should each have caused an increment because of a conversion - if e, a := 2, externalToInternalCalls; e != a { - t.Errorf("Expected %v, got %v", e, a) - } -} - -func TestBadJSONRejection(t *testing.T) { - scheme := runtime.NewScheme() - codecs := serializer.NewCodecFactory(scheme) - jsonserializer, _ := codecs.SerializerForFileExtension("json") - - badJSONMissingKind := []byte(`{ }`) - if _, err := runtime.Decode(jsonserializer, badJSONMissingKind); err == nil { - t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind) - } - badJSONUnknownType := []byte(`{"kind": "bar"}`) - if _, err1 := runtime.Decode(jsonserializer, badJSONUnknownType); err1 == nil { - t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType) - } - /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) - if err2 := DecodeInto(badJSONKindMismatch, &Minion{}); err2 == nil { - t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) - }*/ -} - -type ExtensionA struct { - runtime.TypeMeta `json:",inline"` - TestString string `json:"testString"` -} - -type ExtensionB struct { - runtime.TypeMeta `json:",inline"` - TestString string `json:"testString"` -} - -type ExternalExtensionType struct { - runtime.TypeMeta `json:",inline"` - Extension runtime.RawExtension `json:"extension"` -} - -type InternalExtensionType struct { - runtime.TypeMeta `json:",inline"` - Extension runtime.Object `json:"extension"` -} - -type ExternalOptionalExtensionType struct { - runtime.TypeMeta `json:",inline"` - Extension runtime.RawExtension `json:"extension,omitempty"` -} - -type InternalOptionalExtensionType struct { - runtime.TypeMeta `json:",inline"` - Extension runtime.Object `json:"extension,omitempty"` -} - -func (obj *ExtensionA) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ExtensionB) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ExternalExtensionType) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *InternalExtensionType) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *ExternalOptionalExtensionType) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } -func (obj *InternalOptionalExtensionType) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } - -func TestExternalToInternalMapping(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "testExternal"} - - scheme := runtime.NewScheme() - scheme.AddKnownTypeWithName(internalGV.WithKind("OptionalExtensionType"), &InternalOptionalExtensionType{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("OptionalExtensionType"), &ExternalOptionalExtensionType{}) - - codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) - - table := []struct { - obj runtime.Object - encoded string - }{ - { - &InternalOptionalExtensionType{Extension: nil}, - `{"kind":"OptionalExtensionType","apiVersion":"` + externalGV.String() + `"}`, - }, - } - - for i, item := range table { - gotDecoded, err := runtime.Decode(codec, []byte(item.encoded)) - if err != nil { - t.Errorf("unexpected error '%v' (%v)", err, item.encoded) - } else if e, a := item.obj, gotDecoded; !reflect.DeepEqual(e, a) { - t.Errorf("%d: unexpected objects:\n%s", i, diff.ObjectGoPrintSideBySide(e, a)) - } - } -} - -func TestExtensionMapping(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "testExternal"} - - scheme := runtime.NewScheme() - scheme.AddKnownTypeWithName(internalGV.WithKind("ExtensionType"), &InternalExtensionType{}) - scheme.AddKnownTypeWithName(internalGV.WithKind("OptionalExtensionType"), &InternalOptionalExtensionType{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("ExtensionType"), &ExternalExtensionType{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("OptionalExtensionType"), &ExternalOptionalExtensionType{}) - - // register external first when the object is the same in both schemes, so ObjectVersionAndKind reports the - // external version. - scheme.AddKnownTypeWithName(externalGV.WithKind("A"), &ExtensionA{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("B"), &ExtensionB{}) - scheme.AddKnownTypeWithName(internalGV.WithKind("A"), &ExtensionA{}) - scheme.AddKnownTypeWithName(internalGV.WithKind("B"), &ExtensionB{}) - - codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) - - table := []struct { - obj runtime.Object - expected runtime.Object - encoded string - }{ - { - &InternalExtensionType{ - Extension: runtime.NewEncodable(codec, &ExtensionA{TestString: "foo"}), - }, - &InternalExtensionType{ - Extension: &runtime.Unknown{ - Raw: []byte(`{"apiVersion":"test.group/testExternal","kind":"A","testString":"foo"}`), - ContentType: runtime.ContentTypeJSON, - }, - }, - // apiVersion is set in the serialized object for easier consumption by clients - `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":{"apiVersion":"test.group/testExternal","kind":"A","testString":"foo"}} -`, - }, { - &InternalExtensionType{Extension: runtime.NewEncodable(codec, &ExtensionB{TestString: "bar"})}, - &InternalExtensionType{ - Extension: &runtime.Unknown{ - Raw: []byte(`{"apiVersion":"test.group/testExternal","kind":"B","testString":"bar"}`), - ContentType: runtime.ContentTypeJSON, - }, - }, - // apiVersion is set in the serialized object for easier consumption by clients - `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":{"apiVersion":"test.group/testExternal","kind":"B","testString":"bar"}} -`, - }, { - &InternalExtensionType{Extension: nil}, - &InternalExtensionType{ - Extension: nil, - }, - `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":null} -`, - }, - } - - for i, item := range table { - gotEncoded, err := runtime.Encode(codec, item.obj) - if err != nil { - t.Errorf("unexpected error '%v' (%#v)", err, item.obj) - } else if e, a := item.encoded, string(gotEncoded); e != a { - t.Errorf("expected\n%#v\ngot\n%#v\n", e, a) - } - - gotDecoded, err := runtime.Decode(codec, []byte(item.encoded)) - if err != nil { - t.Errorf("unexpected error '%v' (%v)", err, item.encoded) - } else if e, a := item.expected, gotDecoded; !reflect.DeepEqual(e, a) { - t.Errorf("%d: unexpected objects:\n%s", i, diff.ObjectGoPrintSideBySide(e, a)) - } - } -} - -func TestEncode(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "testExternal"} - - scheme := runtime.NewScheme() - scheme.AddKnownTypeWithName(internalGV.WithKind("Simple"), &InternalSimple{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("Simple"), &ExternalSimple{}) - - codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) - - test := &InternalSimple{ - TestString: "I'm the same", - } - obj := runtime.Object(test) - data, err := runtime.Encode(codec, obj) - obj2, gvk, err2 := codec.Decode(data, nil, nil) - if err != nil || err2 != nil { - t.Fatalf("Failure: '%v' '%v'", err, err2) - } - if _, ok := obj2.(*InternalSimple); !ok { - t.Fatalf("Got wrong type") - } - if !reflect.DeepEqual(obj2, test) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", test, obj2) - } - if !reflect.DeepEqual(gvk, &unversioned.GroupVersionKind{Group: "test.group", Version: "testExternal", Kind: "Simple"}) { - t.Errorf("unexpected gvk returned by decode: %#v", gvk) - } -} - -func TestUnversionedTypes(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "testExternal"} - otherGV := unversioned.GroupVersion{Group: "group", Version: "other"} - - scheme := runtime.NewScheme() - scheme.AddUnversionedTypes(externalGV, &InternalSimple{}) - scheme.AddKnownTypeWithName(internalGV.WithKind("Simple"), &InternalSimple{}) - scheme.AddKnownTypeWithName(externalGV.WithKind("Simple"), &ExternalSimple{}) - scheme.AddKnownTypeWithName(otherGV.WithKind("Simple"), &ExternalSimple{}) - - codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) - - if unv, ok := scheme.IsUnversioned(&InternalSimple{}); !unv || !ok { - t.Fatalf("type not unversioned and in scheme: %t %t", unv, ok) - } - - kind, err := scheme.ObjectKind(&InternalSimple{}) - if err != nil { - t.Fatal(err) - } - if kind != externalGV.WithKind("InternalSimple") { - t.Fatalf("unexpected: %#v", kind) - } - - test := &InternalSimple{ - TestString: "I'm the same", - } - obj := runtime.Object(test) - data, err := runtime.Encode(codec, obj) - if err != nil { - t.Fatal(err) - } - obj2, gvk, err := codec.Decode(data, nil, nil) - if err != nil { - t.Fatal(err) - } - if _, ok := obj2.(*InternalSimple); !ok { - t.Fatalf("Got wrong type") - } - if !reflect.DeepEqual(obj2, test) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", test, obj2) - } - // object is serialized as an unversioned object (in the group and version it was defined in) - if !reflect.DeepEqual(gvk, &unversioned.GroupVersionKind{Group: "test.group", Version: "testExternal", Kind: "InternalSimple"}) { - t.Errorf("unexpected gvk returned by decode: %#v", gvk) - } - - // when serialized to a different group, the object is kept in its preferred name - codec = serializer.NewCodecFactory(scheme).LegacyCodec(otherGV) - data, err = runtime.Encode(codec, obj) - if err != nil { - t.Fatal(err) - } - if string(data) != `{"apiVersion":"test.group/testExternal","kind":"InternalSimple","testString":"I'm the same"}`+"\n" { - t.Errorf("unexpected data: %s", data) - } -} - -// Test a weird version/kind embedding format. -type MyWeirdCustomEmbeddedVersionKindField struct { - ID string `json:"ID,omitempty"` - APIVersion string `json:"myVersionKey,omitempty"` - ObjectKind string `json:"myKindKey,omitempty"` - Z string `json:"Z,omitempty"` - Y uint64 `json:"Y,omitempty"` -} - -type TestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]TestType2 `json:"N,omitempty"` - O *TestType2 `json:"O,omitempty"` - P []TestType2 `json:"Q,omitempty"` -} - -type TestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} - -type ExternalTestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} -type ExternalTestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]ExternalTestType2 `json:"N,omitempty"` - O *ExternalTestType2 `json:"O,omitempty"` - P []ExternalTestType2 `json:"Q,omitempty"` -} - -type ExternalInternalSame struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A TestType2 `json:"A,omitempty"` -} - -func (obj *MyWeirdCustomEmbeddedVersionKindField) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *MyWeirdCustomEmbeddedVersionKindField) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.APIVersion, obj.ObjectKind = gvk.ToAPIVersionAndKind() -} -func (obj *MyWeirdCustomEmbeddedVersionKindField) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.ObjectKind) -} - -func (obj *ExternalInternalSame) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *TestType1) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *ExternalTestType1) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *TestType2) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } -func (obj *ExternalTestType2) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -// TestObjectFuzzer can randomly populate all the above objects. -var TestObjectFuzzer = fuzz.New().NilChance(.5).NumElements(1, 100).Funcs( - func(j *MyWeirdCustomEmbeddedVersionKindField, c fuzz.Continue) { - // We have to customize the randomization of MyWeirdCustomEmbeddedVersionKindFields because their - // APIVersion and Kind must remain blank in memory. - j.APIVersion = "" - j.ObjectKind = "" - j.ID = c.RandString() - }, -) - -// Returns a new Scheme set up with the test objects. -func GetTestScheme() *runtime.Scheme { - internalGV := unversioned.GroupVersion{Version: "__internal"} - externalGV := unversioned.GroupVersion{Version: "v1"} - - s := runtime.NewScheme() - // Ordinarily, we wouldn't add TestType2, but because this is a test and - // both types are from the same package, we need to get it into the system - // so that converter will match it with ExternalType2. - s.AddKnownTypes(internalGV, &TestType1{}, &TestType2{}, &ExternalInternalSame{}) - s.AddKnownTypes(externalGV, &ExternalInternalSame{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &ExternalTestType1{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType2"), &ExternalTestType2{}) - s.AddKnownTypeWithName(internalGV.WithKind("TestType3"), &TestType1{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType3"), &ExternalTestType1{}) - return s -} - -func TestKnownTypes(t *testing.T) { - s := GetTestScheme() - if len(s.KnownTypes(unversioned.GroupVersion{Group: "group", Version: "v2"})) != 0 { - t.Errorf("should have no known types for v2") - } - - types := s.KnownTypes(unversioned.GroupVersion{Version: "v1"}) - for _, s := range []string{"TestType1", "TestType2", "TestType3", "ExternalInternalSame"} { - if _, ok := types[s]; !ok { - t.Errorf("missing type %q", s) - } - } -} - -func TestConvertToVersion(t *testing.T) { - s := GetTestScheme() - tt := &TestType1{A: "I'm not a pointer object"} - other, err := s.ConvertToVersion(tt, "v1") - if err != nil { - t.Fatalf("Failure: %v", err) - } - converted, ok := other.(*ExternalTestType1) - if !ok { - t.Fatalf("Got wrong type") - } - if tt.A != converted.A { - t.Fatalf("Failed to convert object correctly: %#v", converted) - } -} - -func TestMetaValues(t *testing.T) { - internalGV := unversioned.GroupVersion{Group: "test.group", Version: "__internal"} - externalGV := unversioned.GroupVersion{Group: "test.group", Version: "externalVersion"} - - s := runtime.NewScheme() - s.AddKnownTypeWithName(internalGV.WithKind("Simple"), &InternalSimple{}) - s.AddKnownTypeWithName(externalGV.WithKind("Simple"), &ExternalSimple{}) - - internalToExternalCalls := 0 - externalToInternalCalls := 0 - - // Register functions to verify that scope.Meta() gets set correctly. - err := s.AddConversionFuncs( - func(in *InternalSimple, out *ExternalSimple, scope conversion.Scope) error { - t.Logf("internal -> external") - if e, a := internalGV.String(), scope.Meta().SrcVersion; e != a { - t.Fatalf("Expected '%v', got '%v'", e, a) - } - if e, a := externalGV.String(), scope.Meta().DestVersion; e != a { - t.Fatalf("Expected '%v', got '%v'", e, a) - } - scope.Convert(&in.TestString, &out.TestString, 0) - internalToExternalCalls++ - return nil - }, - func(in *ExternalSimple, out *InternalSimple, scope conversion.Scope) error { - t.Logf("external -> internal") - if e, a := externalGV.String(), scope.Meta().SrcVersion; e != a { - t.Errorf("Expected '%v', got '%v'", e, a) - } - if e, a := internalGV.String(), scope.Meta().DestVersion; e != a { - t.Fatalf("Expected '%v', got '%v'", e, a) - } - scope.Convert(&in.TestString, &out.TestString, 0) - externalToInternalCalls++ - return nil - }, - ) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - simple := &InternalSimple{ - TestString: "foo", - } - - s.Log(t) - - out, err := s.ConvertToVersion(simple, externalGV.String()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - internal, err := s.ConvertToVersion(out, internalGV.String()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if e, a := simple, internal; !reflect.DeepEqual(e, a) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) - } - - if e, a := 1, internalToExternalCalls; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - if e, a := 1, externalToInternalCalls; e != a { - t.Errorf("Expected %v, got %v", e, a) - } -} - -func TestMetaValuesUnregisteredConvert(t *testing.T) { - type InternalSimple struct { - Version string `json:"apiVersion,omitempty"` - Kind string `json:"kind,omitempty"` - TestString string `json:"testString"` - } - type ExternalSimple struct { - Version string `json:"apiVersion,omitempty"` - Kind string `json:"kind,omitempty"` - TestString string `json:"testString"` - } - s := runtime.NewScheme() - // We deliberately don't register the types. - - internalToExternalCalls := 0 - - // Register functions to verify that scope.Meta() gets set correctly. - err := s.AddConversionFuncs( - func(in *InternalSimple, out *ExternalSimple, scope conversion.Scope) error { - if e, a := "unknown/unknown", scope.Meta().SrcVersion; e != a { - t.Fatalf("Expected '%v', got '%v'", e, a) - } - if e, a := "unknown/unknown", scope.Meta().DestVersion; e != a { - t.Fatalf("Expected '%v', got '%v'", e, a) - } - scope.Convert(&in.TestString, &out.TestString, 0) - internalToExternalCalls++ - return nil - }, - ) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - simple := &InternalSimple{TestString: "foo"} - external := &ExternalSimple{} - err = s.Convert(simple, external) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if e, a := simple.TestString, external.TestString; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - - // Verify that our conversion handler got called. - if e, a := 1, internalToExternalCalls; e != a { - t.Errorf("Expected %v, got %v", e, a) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/codec_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/codec_test.go deleted file mode 100644 index 342a2a599..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/codec_test.go +++ /dev/null @@ -1,400 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serializer - -import ( - "encoding/json" - "fmt" - "log" - "os" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/diff" - - "github.com/ghodss/yaml" - "github.com/google/gofuzz" - flag "github.com/spf13/pflag" -) - -var fuzzIters = flag.Int("fuzz-iters", 50, "How many fuzzing iterations to do.") - -type testMetaFactory struct{} - -func (testMetaFactory) Interpret(data []byte) (*unversioned.GroupVersionKind, error) { - findKind := struct { - APIVersion string `json:"myVersionKey,omitempty"` - ObjectKind string `json:"myKindKey,omitempty"` - }{} - // yaml is a superset of json, so we use it to decode here. That way, - // we understand both. - if err := yaml.Unmarshal(data, &findKind); err != nil { - return nil, fmt.Errorf("couldn't get version/kind: %v", err) - } - gv, err := unversioned.ParseGroupVersion(findKind.APIVersion) - if err != nil { - return nil, err - } - return &unversioned.GroupVersionKind{Group: gv.Group, Version: gv.Version, Kind: findKind.ObjectKind}, nil -} - -// Test a weird version/kind embedding format. -type MyWeirdCustomEmbeddedVersionKindField struct { - ID string `json:"ID,omitempty"` - APIVersion string `json:"myVersionKey,omitempty"` - ObjectKind string `json:"myKindKey,omitempty"` - Z string `json:"Z,omitempty"` - Y uint64 `json:"Y,omitempty"` -} - -type TestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]TestType2 `json:"N,omitempty"` - O *TestType2 `json:"O,omitempty"` - P []TestType2 `json:"Q,omitempty"` -} - -type TestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} - -type ExternalTestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} -type ExternalTestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]ExternalTestType2 `json:"N,omitempty"` - O *ExternalTestType2 `json:"O,omitempty"` - P []ExternalTestType2 `json:"Q,omitempty"` -} - -type ExternalInternalSame struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A TestType2 `json:"A,omitempty"` -} - -// TestObjectFuzzer can randomly populate all the above objects. -var TestObjectFuzzer = fuzz.New().NilChance(.5).NumElements(1, 100).Funcs( - func(j *MyWeirdCustomEmbeddedVersionKindField, c fuzz.Continue) { - c.FuzzNoCustom(j) - j.APIVersion = "" - j.ObjectKind = "" - }, -) - -func (obj *MyWeirdCustomEmbeddedVersionKindField) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *MyWeirdCustomEmbeddedVersionKindField) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.APIVersion, obj.ObjectKind = gvk.ToAPIVersionAndKind() -} -func (obj *MyWeirdCustomEmbeddedVersionKindField) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.ObjectKind) -} - -func (obj *ExternalInternalSame) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *TestType1) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *ExternalTestType1) GetObjectKind() unversioned.ObjectKind { - return &obj.MyWeirdCustomEmbeddedVersionKindField -} - -func (obj *TestType2) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } -func (obj *ExternalTestType2) GetObjectKind() unversioned.ObjectKind { - return unversioned.EmptyObjectKind -} - -// Returns a new Scheme set up with the test objects. -func GetTestScheme() (*runtime.Scheme, runtime.Codec) { - internalGV := unversioned.GroupVersion{Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Version: "v1"} - externalGV2 := unversioned.GroupVersion{Version: "v2"} - - s := runtime.NewScheme() - // Ordinarily, we wouldn't add TestType2, but because this is a test and - // both types are from the same package, we need to get it into the system - // so that converter will match it with ExternalType2. - s.AddKnownTypes(internalGV, &TestType1{}, &TestType2{}, &ExternalInternalSame{}) - s.AddKnownTypes(externalGV, &ExternalInternalSame{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &ExternalTestType1{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType2"), &ExternalTestType2{}) - s.AddKnownTypeWithName(internalGV.WithKind("TestType3"), &TestType1{}) - s.AddKnownTypeWithName(externalGV.WithKind("TestType3"), &ExternalTestType1{}) - s.AddKnownTypeWithName(externalGV2.WithKind("TestType1"), &ExternalTestType1{}) - - s.AddUnversionedTypes(externalGV, &unversioned.Status{}) - - cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})) - codec := cf.LegacyCodec(unversioned.GroupVersion{Version: "v1"}) - return s, codec -} - -func objDiff(a, b interface{}) string { - ab, err := json.Marshal(a) - if err != nil { - panic("a") - } - bb, err := json.Marshal(b) - if err != nil { - panic("b") - } - return diff.StringDiff(string(ab), string(bb)) - - // An alternate diff attempt, in case json isn't showing you - // the difference. (reflect.DeepEqual makes a distinction between - // nil and empty slices, for example.) - //return diff.StringDiff( - // fmt.Sprintf("%#v", a), - // fmt.Sprintf("%#v", b), - //) -} - -var semantic = conversion.EqualitiesOrDie( - func(a, b MyWeirdCustomEmbeddedVersionKindField) bool { - a.APIVersion, a.ObjectKind = "", "" - b.APIVersion, b.ObjectKind = "", "" - return a == b - }, -) - -func runTest(t *testing.T, source interface{}) { - name := reflect.TypeOf(source).Elem().Name() - TestObjectFuzzer.Fuzz(source) - - _, codec := GetTestScheme() - data, err := runtime.Encode(codec, source.(runtime.Object)) - if err != nil { - t.Errorf("%v: %v (%#v)", name, err, source) - return - } - obj2, err := runtime.Decode(codec, data) - if err != nil { - t.Errorf("%v: %v (%v)", name, err, string(data)) - return - } - if !semantic.DeepEqual(source, obj2) { - t.Errorf("1: %v: diff: %v", name, diff.ObjectGoPrintSideBySide(source, obj2)) - return - } - obj3 := reflect.New(reflect.TypeOf(source).Elem()).Interface() - if err := runtime.DecodeInto(codec, data, obj3.(runtime.Object)); err != nil { - t.Errorf("2: %v: %v", name, err) - return - } - if !semantic.DeepEqual(source, obj3) { - t.Errorf("3: %v: diff: %v", name, objDiff(source, obj3)) - return - } -} - -func TestTypes(t *testing.T) { - table := []interface{}{ - &TestType1{}, - &ExternalInternalSame{}, - } - for _, item := range table { - // Try a few times, since runTest uses random values. - for i := 0; i < *fuzzIters; i++ { - runTest(t, item) - } - } -} - -func TestVersionedEncoding(t *testing.T) { - s, codec := GetTestScheme() - out, err := runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v2"}) - if err != nil { - t.Fatal(err) - } - if string(out) != `{"myVersionKey":"v2","myKindKey":"TestType1"}`+"\n" { - t.Fatal(string(out)) - } - _, err = runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v3"}) - if err == nil { - t.Fatal(err) - } - - cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})) - encoder, _ := cf.SerializerForFileExtension("json") - - // codec that is unversioned uses the target version - unversionedCodec := cf.CodecForVersions(encoder, nil, nil, nil) - _, err = runtime.Encode(unversionedCodec, &TestType1{}, unversioned.GroupVersion{Version: "v3"}) - if err == nil || !runtime.IsNotRegisteredError(err) { - t.Fatal(err) - } - - // unversioned encode with no versions is written directly to wire - out, err = runtime.Encode(unversionedCodec, &TestType1{}) - if err != nil { - t.Fatal(err) - } - if string(out) != `{"myVersionKey":"__internal","myKindKey":"TestType1"}`+"\n" { - t.Fatal(string(out)) - } -} - -func TestMultipleNames(t *testing.T) { - _, codec := GetTestScheme() - - obj, _, err := codec.Decode([]byte(`{"myKindKey":"TestType3","myVersionKey":"v1","A":"value"}`), nil, nil) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - internal := obj.(*TestType1) - if internal.A != "value" { - t.Fatalf("unexpected decoded object: %#v", internal) - } - - out, err := runtime.Encode(codec, internal) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(string(out), `"myKindKey":"TestType1"`) { - t.Errorf("unexpected encoded output: %s", string(out)) - } -} - -func TestConvertTypesWhenDefaultNamesMatch(t *testing.T) { - internalGV := unversioned.GroupVersion{Version: runtime.APIVersionInternal} - externalGV := unversioned.GroupVersion{Version: "v1"} - - s := runtime.NewScheme() - // create two names internally, with TestType1 being preferred - s.AddKnownTypeWithName(internalGV.WithKind("TestType1"), &TestType1{}) - s.AddKnownTypeWithName(internalGV.WithKind("OtherType1"), &TestType1{}) - // create two names externally, with TestType1 being preferred - s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &ExternalTestType1{}) - s.AddKnownTypeWithName(externalGV.WithKind("OtherType1"), &ExternalTestType1{}) - - ext := &ExternalTestType1{} - ext.APIVersion = "v1" - ext.ObjectKind = "OtherType1" - ext.A = "test" - data, err := json.Marshal(ext) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - expect := &TestType1{A: "test"} - - codec := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})).LegacyCodec(unversioned.GroupVersion{Version: "v1"}) - - obj, err := runtime.Decode(codec, data) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !semantic.DeepEqual(expect, obj) { - t.Errorf("unexpected object: %#v", obj) - } - - into := &TestType1{} - if err := runtime.DecodeInto(codec, data, into); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !semantic.DeepEqual(expect, into) { - t.Errorf("unexpected object: %#v", obj) - } -} - -func TestEncode_Ptr(t *testing.T) { - _, codec := GetTestScheme() - tt := &TestType1{A: "I am a pointer object"} - data, err := runtime.Encode(codec, tt) - obj2, err2 := runtime.Decode(codec, data) - if err != nil || err2 != nil { - t.Fatalf("Failure: '%v' '%v'\n%s", err, err2, data) - } - if _, ok := obj2.(*TestType1); !ok { - t.Fatalf("Got wrong type") - } - if !semantic.DeepEqual(obj2, tt) { - t.Errorf("Expected:\n %#v,\n Got:\n %#v", tt, obj2) - } -} - -func TestBadJSONRejection(t *testing.T) { - log.SetOutput(os.Stderr) - _, codec := GetTestScheme() - badJSONs := [][]byte{ - []byte(`{"myVersionKey":"v1"}`), // Missing kind - []byte(`{"myVersionKey":"v1","myKindKey":"bar"}`), // Unknown kind - []byte(`{"myVersionKey":"bar","myKindKey":"TestType1"}`), // Unknown version - []byte(`{"myKindKey":"TestType1"}`), // Missing version - } - for _, b := range badJSONs { - if _, err := runtime.Decode(codec, b); err == nil { - t.Errorf("Did not reject bad json: %s", string(b)) - } - } - badJSONKindMismatch := []byte(`{"myVersionKey":"v1","myKindKey":"ExternalInternalSame"}`) - if err := runtime.DecodeInto(codec, badJSONKindMismatch, &TestType1{}); err == nil { - t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) - } - if err := runtime.DecodeInto(codec, []byte(``), &TestType1{}); err != nil { - t.Errorf("Should allow empty decode: %v", err) - } - if _, _, err := codec.Decode([]byte(``), &unversioned.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err == nil { - t.Errorf("Did not give error for empty data with only kind default") - } - if _, _, err := codec.Decode([]byte(`{"myVersionKey":"v1"}`), &unversioned.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err != nil { - t.Errorf("Gave error for version and kind default") - } - if _, _, err := codec.Decode([]byte(`{"myKindKey":"ExternalInternalSame"}`), &unversioned.GroupVersionKind{Version: "v1"}, nil); err != nil { - t.Errorf("Gave error for version and kind default") - } - if _, _, err := codec.Decode([]byte(``), &unversioned.GroupVersionKind{Kind: "ExternalInternalSame", Version: "v1"}, nil); err != nil { - t.Errorf("Gave error for version and kind defaulted: %v", err) - } - if _, err := runtime.Decode(codec, []byte(``)); err == nil { - t.Errorf("Did not give error for empty data") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/json_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/json_test.go deleted file mode 100644 index f9fbf47a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/json_test.go +++ /dev/null @@ -1,271 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 json_test - -import ( - "fmt" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/json" - "k8s.io/kubernetes/pkg/util/diff" -) - -type testDecodable struct { - Other string - Value int `json:"value"` - gvk *unversioned.GroupVersionKind -} - -func (d *testDecodable) GetObjectKind() unversioned.ObjectKind { return d } -func (d *testDecodable) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { d.gvk = gvk } -func (d *testDecodable) GroupVersionKind() *unversioned.GroupVersionKind { return d.gvk } - -func TestDecode(t *testing.T) { - testCases := []struct { - creater runtime.ObjectCreater - typer runtime.Typer - yaml bool - pretty bool - - data []byte - defaultGVK *unversioned.GroupVersionKind - into runtime.Object - - errFn func(error) bool - expectedObject runtime.Object - expectedGVK *unversioned.GroupVersionKind - }{ - { - data: []byte("{}"), - - expectedGVK: &unversioned.GroupVersionKind{}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "Object 'Kind' is missing in") }, - }, - { - data: []byte("{}"), - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - creater: &mockCreater{err: fmt.Errorf("fake error")}, - - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - errFn: func(err error) bool { return err.Error() == "fake error" }, - }, - { - data: []byte("{}"), - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - creater: &mockCreater{err: fmt.Errorf("fake error")}, - - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - errFn: func(err error) bool { return err.Error() == "fake error" }, - }, - { - data: []byte("{}"), - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - creater: &mockCreater{obj: &testDecodable{}}, - expectedObject: &testDecodable{ - gvk: nil, // json serializer does NOT set GVK - }, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - }, - - // version without group is not defaulted - { - data: []byte(`{"apiVersion":"blah"}`), - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - creater: &mockCreater{obj: &testDecodable{}}, - expectedObject: &testDecodable{ - gvk: nil, // json serializer does NOT set GVK - }, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "", Version: "blah"}, - }, - // group without version is defaulted - { - data: []byte(`{"apiVersion":"other/"}`), - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - creater: &mockCreater{obj: &testDecodable{}}, - expectedObject: &testDecodable{ - gvk: nil, // json serializer does NOT set GVK - }, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - }, - - // accept runtime.Unknown as into and bypass creator - { - data: []byte(`{}`), - into: &runtime.Unknown{}, - - expectedGVK: &unversioned.GroupVersionKind{}, - expectedObject: &runtime.Unknown{ - Raw: []byte(`{}`), - ContentType: runtime.ContentTypeJSON, - }, - }, - { - data: []byte(`{"test":"object"}`), - into: &runtime.Unknown{}, - - expectedGVK: &unversioned.GroupVersionKind{}, - expectedObject: &runtime.Unknown{ - Raw: []byte(`{"test":"object"}`), - ContentType: runtime.ContentTypeJSON, - }, - }, - { - data: []byte(`{"test":"object"}`), - into: &runtime.Unknown{}, - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedObject: &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{APIVersion: "other/blah", Kind: "Test"}, - Raw: []byte(`{"test":"object"}`), - ContentType: runtime.ContentTypeJSON, - }, - }, - - // unregistered objects can be decoded into directly - { - data: []byte(`{"kind":"Test","apiVersion":"other/blah","value":1,"Other":"test"}`), - into: &testDecodable{}, - typer: &mockTyper{err: runtime.NewNotRegisteredErr(unversioned.GroupVersionKind{}, nil)}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedObject: &testDecodable{ - Other: "test", - Value: 1, - }, - }, - // registered types get defaulted by the into object kind - { - data: []byte(`{"value":1,"Other":"test"}`), - into: &testDecodable{}, - typer: &mockTyper{gvk: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedObject: &testDecodable{ - Other: "test", - Value: 1, - }, - }, - // registered types get defaulted by the into object kind even without version, but return an error - { - data: []byte(`{"value":1,"Other":"test"}`), - into: &testDecodable{}, - typer: &mockTyper{gvk: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: ""}}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: ""}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "Object 'apiVersion' is missing in") }, - expectedObject: &testDecodable{ - Other: "test", - Value: 1, - }, - }, - - // runtime.VersionedObjects are decoded - { - data: []byte(`{"value":1,"Other":"test"}`), - into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, - creater: &mockCreater{obj: &testDecodable{}}, - typer: &mockTyper{gvk: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, - defaultGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedObject: &runtime.VersionedObjects{ - Objects: []runtime.Object{ - &testDecodable{ - Other: "test", - Value: 1, - }, - }, - }, - }, - // runtime.VersionedObjects with an object are decoded into - { - data: []byte(`{"Other":"test"}`), - into: &runtime.VersionedObjects{Objects: []runtime.Object{&testDecodable{Value: 2}}}, - typer: &mockTyper{gvk: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, - expectedGVK: &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, - expectedObject: &runtime.VersionedObjects{ - Objects: []runtime.Object{ - &testDecodable{ - Other: "test", - Value: 2, - }, - }, - }, - }, - } - - for i, test := range testCases { - var s runtime.Serializer - if test.yaml { - s = json.NewYAMLSerializer(json.DefaultMetaFactory, test.creater, test.typer) - } else { - s = json.NewSerializer(json.DefaultMetaFactory, test.creater, test.typer, test.pretty) - } - obj, gvk, err := s.Decode([]byte(test.data), test.defaultGVK, test.into) - - if !reflect.DeepEqual(test.expectedGVK, gvk) { - t.Errorf("%d: unexpected GVK: %v", i, gvk) - } - - switch { - case err == nil && test.errFn != nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil && test.errFn == nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil: - if !test.errFn(err) { - t.Errorf("%d: failed: %v", i, err) - } - if obj != nil { - t.Errorf("%d: should have returned nil object", i) - } - continue - } - - if test.into != nil && test.into != obj { - t.Errorf("%d: expected into to be returned: %v", i, obj) - continue - } - - if !reflect.DeepEqual(test.expectedObject, obj) { - t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.expectedObject, obj)) - } - } -} - -type mockCreater struct { - apiVersion string - kind string - err error - obj runtime.Object -} - -func (c *mockCreater) New(kind unversioned.GroupVersionKind) (runtime.Object, error) { - c.apiVersion, c.kind = kind.GroupVersion().String(), kind.Kind - return c.obj, c.err -} - -type mockTyper struct { - gvk *unversioned.GroupVersionKind - err error -} - -func (t *mockTyper) ObjectKind(obj runtime.Object) (*unversioned.GroupVersionKind, bool, error) { - return t.gvk, false, t.err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/meta_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/meta_test.go deleted file mode 100644 index 4b6351286..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/json/meta_test.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 json - -import "testing" - -func TestSimpleMetaFactoryInterpret(t *testing.T) { - factory := SimpleMetaFactory{} - gvk, err := factory.Interpret([]byte(`{"apiVersion":"1","kind":"object"}`)) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if gvk.Version != "1" || gvk.Kind != "object" { - t.Errorf("unexpected interpret: %#v", gvk) - } - - // no kind or version - gvk, err = factory.Interpret([]byte(`{}`)) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if gvk.Version != "" || gvk.Kind != "" { - t.Errorf("unexpected interpret: %#v", gvk) - } - - // unparsable - gvk, err = factory.Interpret([]byte(`{`)) - if err == nil { - t.Errorf("unexpected non-error") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/protobuf_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/protobuf_test.go deleted file mode 100644 index 06b3d2e55..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/protobuf/protobuf_test.go +++ /dev/null @@ -1,351 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 protobuf_test - -import ( - "bytes" - "encoding/hex" - "fmt" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - _ "k8s.io/kubernetes/pkg/api/install" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/protobuf" - "k8s.io/kubernetes/pkg/util/diff" -) - -type testObject struct { - gvk *unversioned.GroupVersionKind -} - -func (d *testObject) GetObjectKind() unversioned.ObjectKind { return d } -func (d *testObject) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { d.gvk = gvk } -func (d *testObject) GroupVersionKind() *unversioned.GroupVersionKind { return d.gvk } - -type testMarshalable struct { - testObject - data []byte - err error -} - -func (d *testMarshalable) Marshal() ([]byte, error) { - return d.data, d.err -} - -type testBufferedMarshalable struct { - testObject - data []byte - err error -} - -func (d *testBufferedMarshalable) Marshal() ([]byte, error) { - return nil, fmt.Errorf("not invokable") -} - -func (d *testBufferedMarshalable) MarshalTo(data []byte) (int, error) { - copy(data, d.data) - return len(d.data), d.err -} - -func (d *testBufferedMarshalable) Size() int { - return len(d.data) -} - -func TestRecognize(t *testing.T) { - s := protobuf.NewSerializer(nil, nil, "application/protobuf") - ignores := [][]byte{ - nil, - {}, - []byte("k8s"), - {0x6b, 0x38, 0x73, 0x01}, - } - for i, data := range ignores { - if ok, err := s.RecognizesData(bytes.NewBuffer(data)); err != nil || ok { - t.Errorf("%d: should not recognize data: %v", i, err) - } - } - recognizes := [][]byte{ - {0x6b, 0x38, 0x73, 0x00}, - {0x6b, 0x38, 0x73, 0x00, 0x01}, - } - for i, data := range recognizes { - if ok, err := s.RecognizesData(bytes.NewBuffer(data)); err != nil || !ok { - t.Errorf("%d: should recognize data: %v", i, err) - } - } -} - -func TestEncode(t *testing.T) { - obj1 := &testMarshalable{testObject: testObject{}, data: []byte{}} - wire1 := []byte{ - 0x6b, 0x38, 0x73, 0x00, // prefix - 0x0a, 0x04, - 0x0a, 0x00, // apiversion - 0x12, 0x00, // kind - 0x12, 0x00, // data - 0x1a, 0x00, // content-type - 0x22, 0x00, // content-encoding - } - obj2 := &testMarshalable{ - testObject: testObject{gvk: &unversioned.GroupVersionKind{Kind: "test", Group: "other", Version: "version"}}, - data: []byte{0x01, 0x02, 0x03}, - } - wire2 := []byte{ - 0x6b, 0x38, 0x73, 0x00, // prefix - 0x0a, 0x15, - 0x0a, 0x0d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, // apiversion - 0x12, 0x04, 0x74, 0x65, 0x73, 0x74, // kind - 0x12, 0x03, 0x01, 0x02, 0x03, // data - 0x1a, 0x00, // content-type - 0x22, 0x00, // content-encoding - } - - err1 := fmt.Errorf("a test error") - - testCases := []struct { - obj runtime.Object - data []byte - errFn func(error) bool - }{ - { - obj: &testObject{}, - errFn: protobuf.IsNotMarshalable, - }, - { - obj: obj1, - data: wire1, - }, - { - obj: &testMarshalable{testObject: obj1.testObject, err: err1}, - errFn: func(err error) bool { return err == err1 }, - }, - { - // if this test fails, writing the "fast path" marshal is not the same as the "slow path" - obj: &testBufferedMarshalable{testObject: obj1.testObject, data: obj1.data}, - data: wire1, - }, - { - obj: obj2, - data: wire2, - }, - { - // if this test fails, writing the "fast path" marshal is not the same as the "slow path" - obj: &testBufferedMarshalable{testObject: obj2.testObject, data: obj2.data}, - data: wire2, - }, - { - obj: &testBufferedMarshalable{testObject: obj1.testObject, err: err1}, - errFn: func(err error) bool { return err == err1 }, - }, - } - - for i, test := range testCases { - s := protobuf.NewSerializer(nil, nil, "application/protobuf") - data, err := runtime.Encode(s, test.obj) - - switch { - case err == nil && test.errFn != nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil && test.errFn == nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil: - if !test.errFn(err) { - t.Errorf("%d: failed: %v", i, err) - } - if data != nil { - t.Errorf("%d: should not have returned nil data", i) - } - continue - } - - if test.data != nil && !bytes.Equal(test.data, data) { - t.Errorf("%d: unexpected data:\n%s", i, hex.Dump(data)) - continue - } - - if ok, err := s.RecognizesData(bytes.NewBuffer(data)); !ok || err != nil { - t.Errorf("%d: did not recognize data generated by call: %v", i, err) - } - } -} - -func TestDecode(t *testing.T) { - wire1 := []byte{ - 0x6b, 0x38, 0x73, 0x00, // prefix - 0x0a, 0x04, - 0x0a, 0x00, // apiversion - 0x12, 0x00, // kind - 0x12, 0x00, // data - 0x1a, 0x00, // content-type - 0x22, 0x00, // content-encoding - } - wire2 := []byte{ - 0x6b, 0x38, 0x73, 0x00, // prefix - 0x0a, 0x15, - 0x0a, 0x0d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, // apiversion - 0x12, 0x04, 0x74, 0x65, 0x73, 0x74, // kind - 0x12, 0x03, 0x01, 0x02, 0x03, // data - 0x1a, 0x00, // content-type - 0x22, 0x00, // content-encoding - } - - //err1 := fmt.Errorf("a test error") - - testCases := []struct { - obj runtime.Object - data []byte - errFn func(error) bool - }{ - { - obj: &runtime.Unknown{}, - errFn: func(err error) bool { return err.Error() == "empty data" }, - }, - { - data: []byte{0x6b}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "does not appear to be a protobuf message") }, - }, - { - obj: &runtime.Unknown{ - ContentType: "application/protobuf", - Raw: []byte{}, - }, - data: wire1, - }, - { - obj: &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{ - APIVersion: "other/version", - Kind: "test", - }, - ContentType: "application/protobuf", - Raw: []byte{0x01, 0x02, 0x03}, - }, - data: wire2, - }, - } - - for i, test := range testCases { - s := protobuf.NewSerializer(nil, nil, "application/protobuf") - unk := &runtime.Unknown{} - err := runtime.DecodeInto(s, test.data, unk) - - switch { - case err == nil && test.errFn != nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil && test.errFn == nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil: - if !test.errFn(err) { - t.Errorf("%d: failed: %v", i, err) - } - continue - } - - if !reflect.DeepEqual(unk, test.obj) { - t.Errorf("%d: unexpected object:\n%#v", i, unk) - continue - } - } -} - -func TestDecodeObjects(t *testing.T) { - obj1 := &v1.Pod{ - ObjectMeta: v1.ObjectMeta{ - Name: "cool", - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "test", - }, - }, - }, - } - obj1wire, err := obj1.Marshal() - if err != nil { - t.Fatal(err) - } - - wire1, err := (&runtime.Unknown{ - TypeMeta: runtime.TypeMeta{Kind: "Pod", APIVersion: "v1"}, - Raw: obj1wire, - }).Marshal() - if err != nil { - t.Fatal(err) - } - - unk2 := &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{Kind: "Pod", APIVersion: "v1"}, - } - wire2 := make([]byte, len(wire1)*2) - n, err := unk2.NestedMarshalTo(wire2, obj1, uint64(obj1.Size())) - if err != nil { - t.Fatal(err) - } - if n != len(wire1) || !bytes.Equal(wire1, wire2[:n]) { - t.Fatalf("unexpected wire:\n%s", hex.Dump(wire2[:n])) - } - - wire1 = append([]byte{0x6b, 0x38, 0x73, 0x00}, wire1...) - - testCases := []struct { - obj runtime.Object - data []byte - errFn func(error) bool - }{ - { - obj: obj1, - data: wire1, - }, - } - - for i, test := range testCases { - s := protobuf.NewSerializer(api.Scheme, runtime.ObjectTyperToTyper(api.Scheme), "application/protobuf") - obj, err := runtime.Decode(s, test.data) - - switch { - case err == nil && test.errFn != nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil && test.errFn == nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil: - if !test.errFn(err) { - t.Errorf("%d: failed: %v", i, err) - } - if obj != nil { - t.Errorf("%d: should not have returned an object", i) - } - continue - } - - if !api.Semantic.DeepEqual(obj, test.obj) { - t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintDiff(test.obj, obj)) - continue - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/recognizer/recognizer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/recognizer/recognizer_test.go deleted file mode 100644 index c83b87aa4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/recognizer/recognizer_test.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 recognizer - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/json" -) - -type A struct{} - -func (A) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -func TestRecognizer(t *testing.T) { - s := runtime.NewScheme() - s.AddKnownTypes(unversioned.GroupVersion{Version: "v1"}, &A{}) - d := NewDecoder( - json.NewSerializer(json.DefaultMetaFactory, s, runtime.ObjectTyperToTyper(s), false), - json.NewYAMLSerializer(json.DefaultMetaFactory, s, runtime.ObjectTyperToTyper(s)), - ) - out, _, err := d.Decode([]byte(` -kind: A -apiVersion: v1 -`), nil, nil) - if err != nil { - t.Fatal(err) - } - t.Logf("%#v", out) - - out, _, err = d.Decode([]byte(` -{ - "kind":"A", - "apiVersion":"v1" -} -`), nil, nil) - if err != nil { - t.Fatal(err) - } - t.Logf("%#v", out) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/streaming/streaming_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/streaming/streaming_test.go deleted file mode 100644 index b3d500c98..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/streaming/streaming_test.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 streaming - -import ( - "bytes" - "io" - "io/ioutil" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/framer" -) - -type fakeDecoder struct { - got []byte - obj runtime.Object - err error -} - -func (d *fakeDecoder) Decode(data []byte, gvk *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { - d.got = data - return d.obj, nil, d.err -} - -func TestEmptyDecoder(t *testing.T) { - buf := bytes.NewBuffer([]byte{}) - d := &fakeDecoder{} - _, _, err := NewDecoder(ioutil.NopCloser(buf), d).Decode(nil, nil) - if err != io.EOF { - t.Fatal(err) - } -} - -func TestDecoder(t *testing.T) { - frames := [][]byte{ - make([]byte, 1025), - make([]byte, 1024*5), - make([]byte, 1024*1024*5), - make([]byte, 1025), - } - pr, pw := io.Pipe() - fw := framer.NewLengthDelimitedFrameWriter(pw) - go func() { - for i := range frames { - fw.Write(frames[i]) - } - pw.Close() - }() - - r := framer.NewLengthDelimitedFrameReader(pr) - d := &fakeDecoder{} - dec := NewDecoder(r, d) - if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[0]) { - t.Fatalf("unexpected %v %v", err, len(d.got)) - } - if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[1]) { - t.Fatalf("unexpected %v %v", err, len(d.got)) - } - if _, _, err := dec.Decode(nil, nil); err != ErrObjectTooLarge || !bytes.Equal(d.got, frames[1]) { - t.Fatalf("unexpected %v %v", err, len(d.got)) - } - if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[3]) { - t.Fatalf("unexpected %v %v", err, len(d.got)) - } - if _, _, err := dec.Decode(nil, nil); err != io.EOF { - t.Fatalf("unexpected %v %v", err, len(d.got)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/versioning/versioning_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/versioning/versioning_test.go deleted file mode 100644 index 1b45abfd5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/versioning/versioning_test.go +++ /dev/null @@ -1,300 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 versioning - -import ( - "fmt" - "io" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/diff" -) - -type testDecodable struct { - Other string - Value int `json:"value"` - gvk *unversioned.GroupVersionKind -} - -func (d *testDecodable) GetObjectKind() unversioned.ObjectKind { return d } -func (d *testDecodable) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { d.gvk = gvk } -func (d *testDecodable) GroupVersionKind() *unversioned.GroupVersionKind { return d.gvk } - -func TestDecode(t *testing.T) { - gvk1 := &unversioned.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"} - decodable1 := &testDecodable{} - decodable2 := &testDecodable{} - decodable3 := &testDecodable{} - versionedDecodable1 := &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}} - - testCases := []struct { - serializer runtime.Serializer - convertor runtime.ObjectConvertor - creater runtime.ObjectCreater - copier runtime.ObjectCopier - typer runtime.Typer - yaml bool - pretty bool - - encodes, decodes []unversioned.GroupVersion - - defaultGVK *unversioned.GroupVersionKind - into runtime.Object - - errFn func(error) bool - expectedObject runtime.Object - sameObject runtime.Object - expectedGVK *unversioned.GroupVersionKind - }{ - { - serializer: &mockSerializer{actual: gvk1}, - convertor: &checkConvertor{groupVersion: "other/__internal"}, - expectedGVK: gvk1, - }, - { - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: "other/__internal"}, - expectedGVK: gvk1, - sameObject: decodable2, - }, - // defaultGVK.Group is allowed to force a conversion to the destination group - { - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - defaultGVK: &unversioned.GroupVersionKind{Group: "force"}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: "force/__internal"}, - expectedGVK: gvk1, - sameObject: decodable2, - }, - // uses direct conversion for into when objects differ - { - into: decodable3, - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - convertor: &checkConvertor{in: decodable1, obj: decodable3, directConvert: true}, - expectedGVK: gvk1, - sameObject: decodable3, - }, - { - into: versionedDecodable1, - serializer: &mockSerializer{actual: gvk1, obj: decodable3}, - convertor: &checkConvertor{in: decodable3, obj: decodable1, directConvert: true}, - expectedGVK: gvk1, - sameObject: versionedDecodable1, - }, - // returns directly when serializer returns into - { - into: decodable3, - serializer: &mockSerializer{actual: gvk1, obj: decodable3}, - expectedGVK: gvk1, - sameObject: decodable3, - }, - // returns directly when serializer returns into - { - into: versionedDecodable1, - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - expectedGVK: gvk1, - sameObject: versionedDecodable1, - }, - - // runtime.VersionedObjects are decoded - { - into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - copier: &checkCopy{in: decodable1, obj: decodable1}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: "other/__internal"}, - expectedGVK: gvk1, - expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1, decodable2}}, - }, - { - into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - copier: &checkCopy{in: decodable1, obj: nil, err: fmt.Errorf("error on copy")}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: "other/__internal"}, - expectedGVK: gvk1, - expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1, decodable2}}, - }, - - // decode into the same version as the serialized object - { - decodes: []unversioned.GroupVersion{gvk1.GroupVersion()}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - expectedGVK: gvk1, - expectedObject: decodable1, - }, - { - into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, - decodes: []unversioned.GroupVersion{gvk1.GroupVersion()}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - expectedGVK: gvk1, - expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}}, - }, - - // codec with non matching version skips conversion altogether - { - decodes: []unversioned.GroupVersion{{Group: "something", Version: "else"}}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - expectedGVK: gvk1, - expectedObject: decodable1, - }, - { - into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, - decodes: []unversioned.GroupVersion{{Group: "something", Version: "else"}}, - - serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - expectedGVK: gvk1, - expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}}, - }, - } - - for i, test := range testCases { - t.Logf("%d", i) - s := NewCodec(test.serializer, test.serializer, test.convertor, test.creater, test.copier, test.typer, test.encodes, test.decodes) - obj, gvk, err := s.Decode([]byte(`{}`), test.defaultGVK, test.into) - - if !reflect.DeepEqual(test.expectedGVK, gvk) { - t.Errorf("%d: unexpected GVK: %v", i, gvk) - } - - switch { - case err == nil && test.errFn != nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil && test.errFn == nil: - t.Errorf("%d: failed: %v", i, err) - continue - case err != nil: - if !test.errFn(err) { - t.Errorf("%d: failed: %v", i, err) - } - if obj != nil { - t.Errorf("%d: should have returned nil object", i) - } - continue - } - - if test.into != nil && test.into != obj { - t.Errorf("%d: expected into to be returned: %v", i, obj) - continue - } - - switch { - case test.expectedObject != nil: - if !reflect.DeepEqual(test.expectedObject, obj) { - t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.expectedObject, obj)) - } - case test.sameObject != nil: - if test.sameObject != obj { - t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.sameObject, obj)) - } - case obj != nil: - t.Errorf("%d: unexpected object: %#v", i, obj) - } - } -} - -type checkCopy struct { - in, obj runtime.Object - err error -} - -func (c *checkCopy) Copy(obj runtime.Object) (runtime.Object, error) { - if c.in != nil && c.in != obj { - return nil, fmt.Errorf("unexpected input to copy: %#v", obj) - } - return c.obj, c.err -} - -type checkConvertor struct { - err error - in, obj runtime.Object - groupVersion string - directConvert bool -} - -func (c *checkConvertor) Convert(in, out interface{}) error { - if !c.directConvert { - return fmt.Errorf("unexpected call to Convert") - } - if c.in != nil && c.in != in { - return fmt.Errorf("unexpected in: %s", in) - } - if c.obj != nil && c.obj != out { - return fmt.Errorf("unexpected out: %s", out) - } - return c.err -} -func (c *checkConvertor) ConvertToVersion(in runtime.Object, outVersion string) (out runtime.Object, err error) { - if c.directConvert { - return nil, fmt.Errorf("unexpected call to ConvertToVersion") - } - if c.in != nil && c.in != in { - return nil, fmt.Errorf("unexpected in: %s", in) - } - if c.groupVersion != outVersion { - return nil, fmt.Errorf("unexpected outversion: %s", outVersion) - } - return c.obj, c.err -} -func (c *checkConvertor) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - return "", "", fmt.Errorf("unexpected call to ConvertFieldLabel") -} - -type mockSerializer struct { - err error - obj runtime.Object - versions []unversioned.GroupVersion - - defaults, actual *unversioned.GroupVersionKind - into runtime.Object -} - -func (s *mockSerializer) Decode(data []byte, defaults *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { - s.defaults = defaults - s.into = into - return s.obj, s.actual, s.err -} - -func (s *mockSerializer) EncodeToStream(obj runtime.Object, w io.Writer, versions ...unversioned.GroupVersion) error { - s.obj = obj - s.versions = versions - return s.err -} - -type mockCreater struct { - err error - obj runtime.Object -} - -func (c *mockCreater) New(kind unversioned.GroupVersionKind) (runtime.Object, error) { - return c.obj, c.err -} - -type mockTyper struct { - gvk *unversioned.GroupVersionKind - err error -} - -func (t *mockTyper) ObjectKind(obj runtime.Object) (*unversioned.GroupVersionKind, bool, error) { - return t.gvk, false, t.err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/yaml/yaml.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/yaml/yaml.go deleted file mode 100644 index 637c777be..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/serializer/yaml/yaml.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 yaml - -import ( - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/yaml" -) - -// yamlSerializer converts YAML passed to the Decoder methods to JSON. -type yamlSerializer struct { - // the nested serializer - runtime.Serializer -} - -// yamlSerializer implements Serializer -var _ runtime.Serializer = yamlSerializer{} - -// NewDecodingSerializer adds YAML decoding support to a serializer that supports JSON. -func NewDecodingSerializer(jsonSerializer runtime.Serializer) runtime.Serializer { - return &yamlSerializer{jsonSerializer} -} - -func (c yamlSerializer) Decode(data []byte, gvk *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { - out, err := yaml.ToJSON(data) - if err != nil { - return nil, nil, err - } - data = out - return c.Serializer.Decode(data, gvk, into) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/swagger_doc_generator_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/swagger_doc_generator_test.go deleted file mode 100644 index 095dddff5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/swagger_doc_generator_test.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 runtime - -import ( - "testing" -) - -func TestFmtRawDoc(t *testing.T) { - tests := []struct { - t, expected string - }{ - {"aaa\n --- asd\n TODO: tooooodo\n toooodoooooo\n", "aaa"}, - {"aaa\nasd\n TODO: tooooodo\nbbbb\n --- toooodoooooo\n", "aaa asd bbbb"}, - {" TODO: tooooodo\n", ""}, - {"Par1\n\nPar2\n\n", "Par1\\n\\nPar2"}, - {"", ""}, - {" ", ""}, - {" \n", ""}, - {" \n\n ", ""}, - {"Example:\n\tl1\n\t\tl2\n", "Example:\\n\\tl1\\n\\t\\tl2"}, - } - - for _, test := range tests { - if o := fmtRawDoc(test.t); o != test.expected { - t.Fatalf("Expected: %q, got %q", test.expected, o) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unstructured_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unstructured_test.go deleted file mode 100644 index 155d534ff..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unstructured_test.go +++ /dev/null @@ -1,356 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "fmt" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/types" -) - -func TestDecodeUnstructured(t *testing.T) { - groupVersionString := testapi.Default.GroupVersion().String() - rawJson := fmt.Sprintf(`{"kind":"Pod","apiVersion":"%s","metadata":{"name":"test"}}`, groupVersionString) - pl := &api.List{ - Items: []runtime.Object{ - &api.Pod{ObjectMeta: api.ObjectMeta{Name: "1"}}, - &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{Kind: "Pod", APIVersion: groupVersionString}, - Raw: []byte(rawJson), - ContentType: runtime.ContentTypeJSON, - }, - &runtime.Unknown{ - TypeMeta: runtime.TypeMeta{Kind: "", APIVersion: groupVersionString}, - Raw: []byte(rawJson), - ContentType: runtime.ContentTypeJSON, - }, - &runtime.Unstructured{ - Object: map[string]interface{}{ - "kind": "Foo", - "apiVersion": "Bar", - "test": "value", - }, - }, - }, - } - if errs := runtime.DecodeList(pl.Items, runtime.UnstructuredJSONScheme); len(errs) == 1 { - t.Fatalf("unexpected error %v", errs) - } - if pod, ok := pl.Items[1].(*runtime.Unstructured); !ok || pod.Object["kind"] != "Pod" || pod.Object["metadata"].(map[string]interface{})["name"] != "test" { - t.Errorf("object not converted: %#v", pl.Items[1]) - } - if pod, ok := pl.Items[2].(*runtime.Unstructured); !ok || pod.Object["kind"] != "Pod" || pod.Object["metadata"].(map[string]interface{})["name"] != "test" { - t.Errorf("object not converted: %#v", pl.Items[2]) - } -} - -func TestDecode(t *testing.T) { - tcs := []struct { - json []byte - want runtime.Object - }{ - { - json: []byte(`{"apiVersion": "test", "kind": "test_kind"}`), - want: &runtime.Unstructured{ - Object: map[string]interface{}{"apiVersion": "test", "kind": "test_kind"}, - }, - }, - { - json: []byte(`{"apiVersion": "test", "kind": "test_list", "items": []}`), - want: &runtime.UnstructuredList{ - Object: map[string]interface{}{"apiVersion": "test", "kind": "test_list"}, - }, - }, - { - json: []byte(`{"items": [{"metadata": {"name": "object1"}, "apiVersion": "test", "kind": "test_kind"}, {"metadata": {"name": "object2"}, "apiVersion": "test", "kind": "test_kind"}], "apiVersion": "test", "kind": "test_list"}`), - want: &runtime.UnstructuredList{ - Object: map[string]interface{}{"apiVersion": "test", "kind": "test_list"}, - Items: []*runtime.Unstructured{ - { - Object: map[string]interface{}{ - "metadata": map[string]interface{}{"name": "object1"}, - "apiVersion": "test", - "kind": "test_kind", - }, - }, - { - Object: map[string]interface{}{ - "metadata": map[string]interface{}{"name": "object2"}, - "apiVersion": "test", - "kind": "test_kind", - }, - }, - }, - }, - }, - } - - for _, tc := range tcs { - got, _, err := runtime.UnstructuredJSONScheme.Decode(tc.json, nil, nil) - if err != nil { - t.Errorf("Unexpected error for %q: %v", string(tc.json), err) - continue - } - - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("Decode(%q) want: %v\ngot: %v", string(tc.json), tc.want, got) - } - } -} - -func TestUnstructuredGetters(t *testing.T) { - unstruct := runtime.Unstructured{ - Object: map[string]interface{}{ - "kind": "test_kind", - "apiVersion": "test_version", - "metadata": map[string]interface{}{ - "name": "test_name", - "namespace": "test_namespace", - "generateName": "test_generateName", - "uid": "test_uid", - "resourceVersion": "test_resourceVersion", - "selfLink": "test_selfLink", - "creationTimestamp": "2009-11-10T23:00:00Z", - "deletionTimestamp": "2010-11-10T23:00:00Z", - "labels": map[string]interface{}{ - "test_label": "test_value", - }, - "annotations": map[string]interface{}{ - "test_annotation": "test_value", - }, - }, - }, - } - - if got, want := unstruct.GetAPIVersion(), "test_version"; got != want { - t.Errorf("GetAPIVersions() = %s, want %s", got, want) - } - - if got, want := unstruct.GetKind(), "test_kind"; got != want { - t.Errorf("GetKind() = %s, want %s", got, want) - } - - if got, want := unstruct.GetNamespace(), "test_namespace"; got != want { - t.Errorf("GetNamespace() = %s, want %s", got, want) - } - - if got, want := unstruct.GetName(), "test_name"; got != want { - t.Errorf("GetName() = %s, want %s", got, want) - } - - if got, want := unstruct.GetGenerateName(), "test_generateName"; got != want { - t.Errorf("GetGenerateName() = %s, want %s", got, want) - } - - if got, want := unstruct.GetUID(), types.UID("test_uid"); got != want { - t.Errorf("GetUID() = %s, want %s", got, want) - } - - if got, want := unstruct.GetResourceVersion(), "test_resourceVersion"; got != want { - t.Errorf("GetResourceVersion() = %s, want %s", got, want) - } - - if got, want := unstruct.GetSelfLink(), "test_selfLink"; got != want { - t.Errorf("GetSelfLink() = %s, want %s", got, want) - } - - if got, want := unstruct.GetCreationTimestamp(), unversioned.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC); !got.Equal(want) { - t.Errorf("GetCreationTimestamp() = %s, want %s", got, want) - } - - if got, want := unstruct.GetDeletionTimestamp(), unversioned.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC); got == nil || !got.Equal(want) { - t.Errorf("GetDeletionTimestamp() = %s, want %s", got, want) - } - - if got, want := unstruct.GetLabels(), map[string]string{"test_label": "test_value"}; !reflect.DeepEqual(got, want) { - t.Errorf("GetLabels() = %s, want %s", got, want) - } - - if got, want := unstruct.GetAnnotations(), map[string]string{"test_annotation": "test_value"}; !reflect.DeepEqual(got, want) { - t.Errorf("GetAnnotations() = %s, want %s", got, want) - } -} - -func TestUnstructuredSetters(t *testing.T) { - unstruct := runtime.Unstructured{} - - want := runtime.Unstructured{ - Object: map[string]interface{}{ - "kind": "test_kind", - "apiVersion": "test_version", - "metadata": map[string]interface{}{ - "name": "test_name", - "namespace": "test_namespace", - "generateName": "test_generateName", - "uid": "test_uid", - "resourceVersion": "test_resourceVersion", - "selfLink": "test_selfLink", - "creationTimestamp": "2009-11-10T23:00:00Z", - "deletionTimestamp": "2010-11-10T23:00:00Z", - "labels": map[string]interface{}{ - "test_label": "test_value", - }, - "annotations": map[string]interface{}{ - "test_annotation": "test_value", - }, - }, - }, - } - - unstruct.SetAPIVersion("test_version") - unstruct.SetKind("test_kind") - unstruct.SetNamespace("test_namespace") - unstruct.SetName("test_name") - unstruct.SetGenerateName("test_generateName") - unstruct.SetUID(types.UID("test_uid")) - unstruct.SetResourceVersion("test_resourceVersion") - unstruct.SetSelfLink("test_selfLink") - unstruct.SetCreationTimestamp(unversioned.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)) - date := unversioned.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC) - unstruct.SetDeletionTimestamp(&date) - unstruct.SetLabels(map[string]string{"test_label": "test_value"}) - unstruct.SetAnnotations(map[string]string{"test_annotation": "test_value"}) - - if !reflect.DeepEqual(unstruct, want) { - t.Errorf("Wanted: \n%s\n Got:\n%s", unstruct, want) - } -} - -func TestUnstructuredListGetters(t *testing.T) { - unstruct := runtime.UnstructuredList{ - Object: map[string]interface{}{ - "kind": "test_kind", - "apiVersion": "test_version", - "metadata": map[string]interface{}{ - "resourceVersion": "test_resourceVersion", - "selfLink": "test_selfLink", - }, - }, - } - - if got, want := unstruct.GetAPIVersion(), "test_version"; got != want { - t.Errorf("GetAPIVersions() = %s, want %s", got, want) - } - - if got, want := unstruct.GetKind(), "test_kind"; got != want { - t.Errorf("GetKind() = %s, want %s", got, want) - } - - if got, want := unstruct.GetResourceVersion(), "test_resourceVersion"; got != want { - t.Errorf("GetResourceVersion() = %s, want %s", got, want) - } - - if got, want := unstruct.GetSelfLink(), "test_selfLink"; got != want { - t.Errorf("GetSelfLink() = %s, want %s", got, want) - } -} - -func TestUnstructuredListSetters(t *testing.T) { - unstruct := runtime.UnstructuredList{} - - want := runtime.UnstructuredList{ - Object: map[string]interface{}{ - "kind": "test_kind", - "apiVersion": "test_version", - "metadata": map[string]interface{}{ - "resourceVersion": "test_resourceVersion", - "selfLink": "test_selfLink", - }, - }, - } - - unstruct.SetAPIVersion("test_version") - unstruct.SetKind("test_kind") - unstruct.SetResourceVersion("test_resourceVersion") - unstruct.SetSelfLink("test_selfLink") - - if !reflect.DeepEqual(unstruct, want) { - t.Errorf("Wanted: \n%s\n Got:\n%s", unstruct, want) - } -} - -func TestDecodeNumbers(t *testing.T) { - - // Start with a valid pod - originalJSON := []byte(`{ - "kind":"Pod", - "apiVersion":"v1", - "metadata":{"name":"pod","namespace":"foo"}, - "spec":{ - "containers":[{"name":"container","image":"container"}], - "activeDeadlineSeconds":1000030003 - } - }`) - - pod := &api.Pod{} - - // Decode with structured codec - codec, err := testapi.GetCodecForObject(pod) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = runtime.DecodeInto(codec, originalJSON, pod) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - // ensure pod is valid - if errs := validation.ValidatePod(pod); len(errs) > 0 { - t.Fatalf("pod should be valid: %v", errs) - } - - // Round-trip with unstructured codec - unstructuredObj, err := runtime.Decode(runtime.UnstructuredJSONScheme, originalJSON) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - roundtripJSON, err := runtime.Encode(runtime.UnstructuredJSONScheme, unstructuredObj) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - // Make sure we serialize back out in int form - if !strings.Contains(string(roundtripJSON), `"activeDeadlineSeconds":1000030003`) { - t.Errorf("Expected %s, got %s", `"activeDeadlineSeconds":1000030003`, string(roundtripJSON)) - } - - // Decode with structured codec again - obj2, err := runtime.Decode(codec, roundtripJSON) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - // ensure pod is still valid - pod2, ok := obj2.(*api.Pod) - if !ok { - t.Fatalf("expected an *api.Pod, got %#v", obj2) - } - if errs := validation.ValidatePod(pod2); len(errs) > 0 { - t.Fatalf("pod should be valid: %v", errs) - } - // ensure round-trip preserved large integers - if !reflect.DeepEqual(pod, pod2) { - t.Fatalf("Expected\n\t%#v, got \n\t%#v", pod, pod2) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unversioned_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unversioned_test.go deleted file mode 100644 index 7943581ea..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/runtime/unversioned_test.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 runtime_test - -import ( - "encoding/json" - "reflect" - "testing" - - // TODO: Ideally we should create the necessary package structure in e.g., - // pkg/conversion/test/... instead of importing pkg/api here. - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/runtime" -) - -var status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Code: 200, - Reason: unversioned.StatusReasonUnknown, - Message: "", -} - -func TestV1EncodeDecodeStatus(t *testing.T) { - - v1Codec := testapi.Default.Codec() - - encoded, err := runtime.Encode(v1Codec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := unversioned.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %v", string(encoded)) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"v1\". Got %v", string(encoded)) - } - decoded, err := runtime.Decode(v1Codec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %v, got: %v", status, decoded) - } -} - -func TestExperimentalEncodeDecodeStatus(t *testing.T) { - // TODO: caesarxuchao: use the testapi.Extensions.Codec() once the PR that - // moves experimental from v1 to v1beta1 got merged. - expCodec := api.Codecs.LegacyCodec(extensions.SchemeGroupVersion) - encoded, err := runtime.Encode(expCodec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := unversioned.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %s", encoded) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"\". Got %s", encoded) - } - decoded, err := runtime.Decode(expCodec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %v, got: %v", status, decoded) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/cacher_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/cacher_test.go deleted file mode 100644 index 67d8b4e05..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/cacher_test.go +++ /dev/null @@ -1,396 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 storage_test - -import ( - "fmt" - "reflect" - goruntime "runtime" - "strconv" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" - etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" - - "golang.org/x/net/context" -) - -func newEtcdTestStorage(t *testing.T, codec runtime.Codec, prefix string) (*etcdtesting.EtcdTestServer, storage.Interface) { - server := etcdtesting.NewEtcdTestClientServer(t) - storage := etcdstorage.NewEtcdStorage(server.Client, codec, prefix, false, etcdtest.DeserializationCacheSize) - return server, storage -} - -func newTestCacher(s storage.Interface) *storage.Cacher { - prefix := "pods" - config := storage.CacherConfig{ - CacheCapacity: 10, - Storage: s, - Versioner: etcdstorage.APIObjectVersioner{}, - Type: &api.Pod{}, - ResourcePrefix: prefix, - KeyFunc: func(obj runtime.Object) (string, error) { return storage.NamespaceKeyFunc(prefix, obj) }, - NewListFunc: func() runtime.Object { return &api.PodList{} }, - } - return storage.NewCacherFromConfig(config) -} - -func makeTestPod(name string) *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{Namespace: "ns", Name: name}, - Spec: apitesting.DeepEqualSafePodSpec(), - } -} - -func updatePod(t *testing.T, s storage.Interface, obj, old *api.Pod) *api.Pod { - updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { - newObj, err := api.Scheme.DeepCopy(obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - return nil, nil, err - } - return newObj.(*api.Pod), nil, nil - } - key := etcdtest.AddPrefix("pods/ns/" + obj.Name) - if err := s.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, old == nil, nil, updateFn); err != nil { - t.Errorf("unexpected error: %v", err) - } - obj.ResourceVersion = "" - result := &api.Pod{} - if err := s.Get(context.TODO(), key, result, false); err != nil { - t.Errorf("unexpected error: %v", err) - } - return result -} - -func TestList(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) - defer server.Terminate(t) - cacher := newTestCacher(etcdStorage) - defer cacher.Stop() - - podFoo := makeTestPod("foo") - podBar := makeTestPod("bar") - podBaz := makeTestPod("baz") - - podFooPrime := makeTestPod("foo") - podFooPrime.Spec.NodeName = "fakeNode" - - fooCreated := updatePod(t, etcdStorage, podFoo, nil) - _ = updatePod(t, etcdStorage, podBar, nil) - _ = updatePod(t, etcdStorage, podBaz, nil) - - _ = updatePod(t, etcdStorage, podFooPrime, fooCreated) - - deleted := api.Pod{} - if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/bar"), &deleted, nil); err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // We first List directly from etcd by passing empty resourceVersion, - // to get the current etcd resourceVersion. - rvResult := &api.PodList{} - if err := cacher.List(context.TODO(), "pods/ns", "", storage.Everything, rvResult); err != nil { - t.Errorf("Unexpected error: %v", err) - } - deletedPodRV := rvResult.ListMeta.ResourceVersion - - result := &api.PodList{} - // We pass the current etcd ResourceVersion received from the above List() operation, - // since there is not easy way to get ResourceVersion of barPod deletion operation. - if err := cacher.List(context.TODO(), "pods/ns", deletedPodRV, storage.Everything, result); err != nil { - t.Errorf("Unexpected error: %v", err) - } - if result.ListMeta.ResourceVersion != deletedPodRV { - t.Errorf("Incorrect resource version: %v", result.ListMeta.ResourceVersion) - } - if len(result.Items) != 2 { - t.Errorf("Unexpected list result: %d", len(result.Items)) - } - keys := sets.String{} - for _, item := range result.Items { - keys.Insert(item.Name) - } - if !keys.HasAll("foo", "baz") { - t.Errorf("Unexpected list result: %#v", result) - } - for _, item := range result.Items { - // unset fields that are set by the infrastructure - item.ResourceVersion = "" - item.CreationTimestamp = unversioned.Time{} - - var expected *api.Pod - switch item.Name { - case "foo": - expected = podFooPrime - case "baz": - expected = podBaz - default: - t.Errorf("Unexpected item: %v", item) - } - if e, a := *expected, item; !reflect.DeepEqual(e, a) { - t.Errorf("Expected: %#v, got: %#v", e, a) - } - } -} - -func verifyWatchEvent(t *testing.T, w watch.Interface, eventType watch.EventType, eventObject runtime.Object) { - _, _, line, _ := goruntime.Caller(1) - select { - case event := <-w.ResultChan(): - if e, a := eventType, event.Type; e != a { - t.Logf("(called from line %d)", line) - t.Errorf("Expected: %s, got: %s", eventType, event.Type) - } - if e, a := eventObject, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Logf("(called from line %d)", line) - t.Errorf("Expected (%s): %#v, got: %#v", eventType, e, a) - } - case <-time.After(wait.ForeverTestTimeout): - t.Logf("(called from line %d)", line) - t.Errorf("Timed out waiting for an event") - } -} - -type injectListError struct { - errors int - storage.Interface -} - -func (self *injectListError) List(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc, listObj runtime.Object) error { - if self.errors > 0 { - self.errors-- - return fmt.Errorf("injected error") - } - return self.Interface.List(ctx, key, resourceVersion, filter, listObj) -} - -func TestWatch(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) - // Inject one list error to make sure we test the relist case. - etcdStorage = &injectListError{errors: 1, Interface: etcdStorage} - defer server.Terminate(t) - cacher := newTestCacher(etcdStorage) - defer cacher.Stop() - - podFoo := makeTestPod("foo") - podBar := makeTestPod("bar") - - podFooPrime := makeTestPod("foo") - podFooPrime.Spec.NodeName = "fakeNode" - - podFooBis := makeTestPod("foo") - podFooBis.Spec.NodeName = "anotherFakeNode" - - // initialVersion is used to initate the watcher at the beginning of the world, - // which is not defined precisely in etcd. - initialVersion, err := cacher.LastSyncResourceVersion() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - startVersion := strconv.Itoa(int(initialVersion)) - - // Set up Watch for object "podFoo". - watcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", startVersion, storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watcher.Stop() - - fooCreated := updatePod(t, etcdStorage, podFoo, nil) - _ = updatePod(t, etcdStorage, podBar, nil) - fooUpdated := updatePod(t, etcdStorage, podFooPrime, fooCreated) - - verifyWatchEvent(t, watcher, watch.Added, podFoo) - verifyWatchEvent(t, watcher, watch.Modified, podFooPrime) - - // Check whether we get too-old error. - _, err = cacher.Watch(context.TODO(), "pods/ns/foo", "1", storage.Everything) - if err == nil { - t.Errorf("Expected 'error too old' error") - } - - initialWatcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", fooCreated.ResourceVersion, storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer initialWatcher.Stop() - - verifyWatchEvent(t, initialWatcher, watch.Modified, podFooPrime) - - // Now test watch from "now". - nowWatcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer nowWatcher.Stop() - - verifyWatchEvent(t, nowWatcher, watch.Added, podFooPrime) - - _ = updatePod(t, etcdStorage, podFooBis, fooUpdated) - - verifyWatchEvent(t, nowWatcher, watch.Modified, podFooBis) -} - -func TestWatcherTimeout(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) - defer server.Terminate(t) - cacher := newTestCacher(etcdStorage) - defer cacher.Stop() - - // initialVersion is used to initate the watcher at the beginning of the world, - // which is not defined precisely in etcd. - initialVersion, err := cacher.LastSyncResourceVersion() - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - startVersion := strconv.Itoa(int(initialVersion)) - - // Create a watcher that will not be reading any result. - watcher, err := cacher.WatchList(context.TODO(), "pods/ns", startVersion, storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watcher.Stop() - - // Create a second watcher that will be reading result. - readingWatcher, err := cacher.WatchList(context.TODO(), "pods/ns", startVersion, storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer readingWatcher.Stop() - - for i := 1; i <= 22; i++ { - pod := makeTestPod(strconv.Itoa(i)) - _ = updatePod(t, etcdStorage, pod, nil) - verifyWatchEvent(t, readingWatcher, watch.Added, pod) - } -} - -func TestFiltering(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) - defer server.Terminate(t) - cacher := newTestCacher(etcdStorage) - defer cacher.Stop() - - // Ensure that the cacher is initialized, before creating any pods, - // so that we are sure that all events will be present in cacher. - syncWatcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - syncWatcher.Stop() - - podFoo := makeTestPod("foo") - podFoo.Labels = map[string]string{"filter": "foo"} - podFooFiltered := makeTestPod("foo") - podFooPrime := makeTestPod("foo") - podFooPrime.Labels = map[string]string{"filter": "foo"} - podFooPrime.Spec.NodeName = "fakeNode" - - fooCreated := updatePod(t, etcdStorage, podFoo, nil) - fooFiltered := updatePod(t, etcdStorage, podFooFiltered, fooCreated) - fooUnfiltered := updatePod(t, etcdStorage, podFoo, fooFiltered) - _ = updatePod(t, etcdStorage, podFooPrime, fooUnfiltered) - - deleted := api.Pod{} - if err := etcdStorage.Delete(context.TODO(), etcdtest.AddPrefix("pods/ns/foo"), &deleted, nil); err != nil { - t.Errorf("Unexpected error: %v", err) - } - - // Set up Watch for object "podFoo" with label filter set. - selector := labels.SelectorFromSet(labels.Set{"filter": "foo"}) - filter := func(obj runtime.Object) bool { - metadata, err := meta.Accessor(obj) - if err != nil { - t.Errorf("Unexpected error: %v", err) - return false - } - return selector.Matches(labels.Set(metadata.GetLabels())) - } - watcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", fooCreated.ResourceVersion, filter) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watcher.Stop() - - verifyWatchEvent(t, watcher, watch.Deleted, podFooFiltered) - verifyWatchEvent(t, watcher, watch.Added, podFoo) - verifyWatchEvent(t, watcher, watch.Modified, podFooPrime) - verifyWatchEvent(t, watcher, watch.Deleted, podFooPrime) -} - -func TestStartingResourceVersion(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) - defer server.Terminate(t) - cacher := newTestCacher(etcdStorage) - defer cacher.Stop() - - // add 1 object - podFoo := makeTestPod("foo") - fooCreated := updatePod(t, etcdStorage, podFoo, nil) - - // Set up Watch starting at fooCreated.ResourceVersion + 10 - rv, err := storage.ParseWatchResourceVersion(fooCreated.ResourceVersion) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - rv += 10 - startVersion := strconv.Itoa(int(rv)) - - watcher, err := cacher.Watch(context.TODO(), "pods/ns/foo", startVersion, storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watcher.Stop() - - lastFoo := fooCreated - for i := 0; i < 11; i++ { - podFooForUpdate := makeTestPod("foo") - podFooForUpdate.Labels = map[string]string{"foo": strconv.Itoa(i)} - lastFoo = updatePod(t, etcdStorage, podFooForUpdate, lastFoo) - } - - select { - case e := <-watcher.ResultChan(): - pod := e.Object.(*api.Pod) - podRV, err := storage.ParseWatchResourceVersion(pod.ResourceVersion) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - // event should have at least rv + 1, since we're starting the watch at rv - if podRV <= rv { - t.Errorf("expected event with resourceVersion of at least %d, got %d", rv+1, podRV) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("timed out waiting for event") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner.go deleted file mode 100644 index 94cdd3595..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "strconv" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" -) - -// APIObjectVersioner implements versioning and extracting etcd node information -// for objects that have an embedded ObjectMeta or ListMeta field. -type APIObjectVersioner struct{} - -// UpdateObject implements Versioner -func (a APIObjectVersioner) UpdateObject(obj runtime.Object, resourceVersion uint64) error { - accessor, err := meta.Accessor(obj) - if err != nil { - return err - } - versionString := "" - if resourceVersion != 0 { - versionString = strconv.FormatUint(resourceVersion, 10) - } - accessor.SetResourceVersion(versionString) - return nil -} - -// UpdateList implements Versioner -func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64) error { - listMeta, err := api.ListMetaFor(obj) - if err != nil || listMeta == nil { - return err - } - versionString := "" - if resourceVersion != 0 { - versionString = strconv.FormatUint(resourceVersion, 10) - } - listMeta.ResourceVersion = versionString - return nil -} - -// ObjectResourceVersion implements Versioner -func (a APIObjectVersioner) ObjectResourceVersion(obj runtime.Object) (uint64, error) { - accessor, err := meta.Accessor(obj) - if err != nil { - return 0, err - } - version := accessor.GetResourceVersion() - if len(version) == 0 { - return 0, nil - } - return strconv.ParseUint(version, 10, 64) -} - -// APIObjectVersioner implements Versioner -var _ storage.Versioner = APIObjectVersioner{} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner_test.go deleted file mode 100644 index 3a32fd949..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/api_object_versioner_test.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - storagetesting "k8s.io/kubernetes/pkg/storage/testing" -) - -func TestObjectVersioner(t *testing.T) { - v := APIObjectVersioner{} - if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "5"}}); err != nil || ver != 5 { - t.Errorf("unexpected version: %d %v", ver, err) - } - if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}); err == nil || ver != 0 { - t.Errorf("unexpected version: %d %v", ver, err) - } - obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}} - if err := v.UpdateObject(obj, 5); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if obj.ResourceVersion != "5" || obj.DeletionTimestamp != nil { - t.Errorf("unexpected resource version: %#v", obj) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go deleted file mode 100644 index 42f2bc83c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go +++ /dev/null @@ -1,638 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "errors" - "fmt" - "path" - "reflect" - "strings" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd/metrics" - etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util" - "k8s.io/kubernetes/pkg/util" - utilcache "k8s.io/kubernetes/pkg/util/cache" - "k8s.io/kubernetes/pkg/watch" - - etcd "github.com/coreos/etcd/client" - "github.com/golang/glog" - "golang.org/x/net/context" -) - -// Creates a new storage interface from the client -// TODO: deprecate in favor of storage.Config abstraction over time -func NewEtcdStorage(client etcd.Client, codec runtime.Codec, prefix string, quorum bool, cacheSize int) storage.Interface { - return &etcdHelper{ - etcdMembersAPI: etcd.NewMembersAPI(client), - etcdKeysAPI: etcd.NewKeysAPI(client), - codec: codec, - versioner: APIObjectVersioner{}, - copier: api.Scheme, - pathPrefix: path.Join("/", prefix), - quorum: quorum, - cache: utilcache.NewCache(cacheSize), - } -} - -// etcdHelper is the reference implementation of storage.Interface. -type etcdHelper struct { - etcdMembersAPI etcd.MembersAPI - etcdKeysAPI etcd.KeysAPI - codec runtime.Codec - copier runtime.ObjectCopier - // Note that versioner is required for etcdHelper to work correctly. - // The public constructors (NewStorage & NewEtcdStorage) are setting it - // correctly, so be careful when manipulating with it manually. - // optional, has to be set to perform any atomic operations - versioner storage.Versioner - // prefix for all etcd keys - pathPrefix string - // if true, perform quorum read - quorum bool - - // We cache objects stored in etcd. For keys we use Node.ModifiedIndex which is equivalent - // to resourceVersion. - // This depends on etcd's indexes being globally unique across all objects/types. This will - // have to revisited if we decide to do things like multiple etcd clusters, or etcd will - // support multi-object transaction that will result in many objects with the same index. - // Number of entries stored in the cache is controlled by maxEtcdCacheEntries constant. - // TODO: Measure how much this cache helps after the conversion code is optimized. - cache utilcache.Cache -} - -func init() { - metrics.Register() -} - -// Codec provides access to the underlying codec being used by the implementation. -func (h *etcdHelper) Codec() runtime.Codec { - return h.codec -} - -// Implements storage.Interface. -func (h *etcdHelper) Backends(ctx context.Context) []string { - if ctx == nil { - glog.Errorf("Context is nil") - } - members, err := h.etcdMembersAPI.List(ctx) - if err != nil { - glog.Errorf("Error obtaining etcd members list: %q", err) - return nil - } - mlist := []string{} - for _, member := range members { - mlist = append(mlist, member.ClientURLs...) - } - return mlist -} - -// Implements storage.Interface. -func (h *etcdHelper) Versioner() storage.Versioner { - return h.versioner -} - -// Implements storage.Interface. -func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error { - trace := util.NewTrace("etcdHelper::Create " + getTypeName(obj)) - defer trace.LogIfLong(250 * time.Millisecond) - if ctx == nil { - glog.Errorf("Context is nil") - } - key = h.prefixEtcdKey(key) - data, err := runtime.Encode(h.codec, obj) - trace.Step("Object encoded") - if err != nil { - return err - } - if version, err := h.versioner.ObjectResourceVersion(obj); err == nil && version != 0 { - return errors.New("resourceVersion may not be set on objects to be created") - } - trace.Step("Version checked") - - startTime := time.Now() - opts := etcd.SetOptions{ - TTL: time.Duration(ttl) * time.Second, - PrevExist: etcd.PrevNoExist, - } - response, err := h.etcdKeysAPI.Set(ctx, key, string(data), &opts) - metrics.RecordEtcdRequestLatency("create", getTypeName(obj), startTime) - trace.Step("Object created") - if err != nil { - return toStorageErr(err, key, 0) - } - if out != nil { - if _, err := conversion.EnforcePtr(out); err != nil { - panic("unable to convert output object to pointer") - } - _, _, err = h.extractObj(response, err, out, false, false) - } - return err -} - -func checkPreconditions(preconditions *storage.Preconditions, out runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := api.ObjectMetaFor(out) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.UID { - return etcd.Error{Code: etcd.ErrorCodeTestFailed, Message: fmt.Sprintf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *preconditions.UID, objMeta.UID)} - } - return nil -} - -// Implements storage.Interface. -func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - key = h.prefixEtcdKey(key) - v, err := conversion.EnforcePtr(out) - if err != nil { - panic("unable to convert output object to pointer") - } - - if preconditions == nil { - startTime := time.Now() - response, err := h.etcdKeysAPI.Delete(ctx, key, nil) - metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime) - if !etcdutil.IsEtcdNotFound(err) { - // if the object that existed prior to the delete is returned by etcd, update the out object. - if err != nil || response.PrevNode != nil { - _, _, err = h.extractObj(response, err, out, false, true) - } - } - return toStorageErr(err, key, 0) - } - - // Check the preconditions match. - obj := reflect.New(v.Type()).Interface().(runtime.Object) - for { - _, node, res, err := h.bodyAndExtractObj(ctx, key, obj, false) - if err != nil { - return toStorageErr(err, key, 0) - } - if err := checkPreconditions(preconditions, obj); err != nil { - return toStorageErr(err, key, 0) - } - index := uint64(0) - if node != nil { - index = node.ModifiedIndex - } else if res != nil { - index = res.Index - } - opt := etcd.DeleteOptions{PrevIndex: index} - startTime := time.Now() - response, err := h.etcdKeysAPI.Delete(ctx, key, &opt) - metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime) - if etcdutil.IsEtcdTestFailed(err) { - glog.Infof("deletion of %s failed because of a conflict, going to retry", key) - } else { - if !etcdutil.IsEtcdNotFound(err) { - // if the object that existed prior to the delete is returned by etcd, update the out object. - if err != nil || response.PrevNode != nil { - _, _, err = h.extractObj(response, err, out, false, true) - } - } - return toStorageErr(err, key, 0) - } - } -} - -// Implements storage.Interface. -func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc) (watch.Interface, error) { - if ctx == nil { - glog.Errorf("Context is nil") - } - watchRV, err := storage.ParseWatchResourceVersion(resourceVersion) - if err != nil { - return nil, err - } - key = h.prefixEtcdKey(key) - w := newEtcdWatcher(false, h.quorum, nil, filter, h.codec, h.versioner, nil, h) - go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV) - return w, nil -} - -// Implements storage.Interface. -func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc) (watch.Interface, error) { - if ctx == nil { - glog.Errorf("Context is nil") - } - watchRV, err := storage.ParseWatchResourceVersion(resourceVersion) - if err != nil { - return nil, err - } - key = h.prefixEtcdKey(key) - w := newEtcdWatcher(true, h.quorum, exceptKey(key), filter, h.codec, h.versioner, nil, h) - go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV) - return w, nil -} - -// Implements storage.Interface. -func (h *etcdHelper) Get(ctx context.Context, key string, objPtr runtime.Object, ignoreNotFound bool) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - key = h.prefixEtcdKey(key) - _, _, _, err := h.bodyAndExtractObj(ctx, key, objPtr, ignoreNotFound) - return err -} - -// bodyAndExtractObj performs the normal Get path to etcd, returning the parsed node and response for additional information -// about the response, like the current etcd index and the ttl. -func (h *etcdHelper) bodyAndExtractObj(ctx context.Context, key string, objPtr runtime.Object, ignoreNotFound bool) (body string, node *etcd.Node, res *etcd.Response, err error) { - if ctx == nil { - glog.Errorf("Context is nil") - } - startTime := time.Now() - - opts := &etcd.GetOptions{ - Quorum: h.quorum, - } - - response, err := h.etcdKeysAPI.Get(ctx, key, opts) - metrics.RecordEtcdRequestLatency("get", getTypeName(objPtr), startTime) - if err != nil && !etcdutil.IsEtcdNotFound(err) { - return "", nil, nil, toStorageErr(err, key, 0) - } - body, node, err = h.extractObj(response, err, objPtr, ignoreNotFound, false) - return body, node, response, toStorageErr(err, key, 0) -} - -func (h *etcdHelper) extractObj(response *etcd.Response, inErr error, objPtr runtime.Object, ignoreNotFound, prevNode bool) (body string, node *etcd.Node, err error) { - if response != nil { - if prevNode { - node = response.PrevNode - } else { - node = response.Node - } - } - if inErr != nil || node == nil || len(node.Value) == 0 { - if ignoreNotFound { - v, err := conversion.EnforcePtr(objPtr) - if err != nil { - return "", nil, err - } - v.Set(reflect.Zero(v.Type())) - return "", nil, nil - } else if inErr != nil { - return "", nil, inErr - } - return "", nil, fmt.Errorf("unable to locate a value on the response: %#v", response) - } - body = node.Value - out, gvk, err := h.codec.Decode([]byte(body), nil, objPtr) - if err != nil { - return body, nil, err - } - if out != objPtr { - return body, nil, fmt.Errorf("unable to decode object %s into %v", gvk.String(), reflect.TypeOf(objPtr)) - } - // being unable to set the version does not prevent the object from being extracted - _ = h.versioner.UpdateObject(objPtr, node.ModifiedIndex) - return body, node, err -} - -// Implements storage.Interface. -func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.FilterFunc, listObj runtime.Object) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - trace := util.NewTrace("GetToList " + getTypeName(listObj)) - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - key = h.prefixEtcdKey(key) - startTime := time.Now() - trace.Step("About to read etcd node") - - opts := &etcd.GetOptions{ - Quorum: h.quorum, - } - response, err := h.etcdKeysAPI.Get(ctx, key, opts) - - metrics.RecordEtcdRequestLatency("get", getTypeName(listPtr), startTime) - trace.Step("Etcd node read") - if err != nil { - if etcdutil.IsEtcdNotFound(err) { - return nil - } - return toStorageErr(err, key, 0) - } - - nodes := make([]*etcd.Node, 0) - nodes = append(nodes, response.Node) - - if err := h.decodeNodeList(nodes, filter, listPtr); err != nil { - return err - } - trace.Step("Object decoded") - if err := h.versioner.UpdateList(listObj, response.Index); err != nil { - return err - } - return nil -} - -// decodeNodeList walks the tree of each node in the list and decodes into the specified object -func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, filter storage.FilterFunc, slicePtr interface{}) error { - trace := util.NewTrace("decodeNodeList " + getTypeName(slicePtr)) - defer trace.LogIfLong(500 * time.Millisecond) - v, err := conversion.EnforcePtr(slicePtr) - if err != nil || v.Kind() != reflect.Slice { - // This should not happen at runtime. - panic("need ptr to slice") - } - for _, node := range nodes { - if node.Dir { - trace.Step("Decoding dir " + node.Key + " START") - if err := h.decodeNodeList(node.Nodes, filter, slicePtr); err != nil { - return err - } - trace.Step("Decoding dir " + node.Key + " END") - continue - } - if obj, found := h.getFromCache(node.ModifiedIndex, filter); found { - // obj != nil iff it matches the filter function. - if obj != nil { - v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem())) - } - } else { - obj, _, err := h.codec.Decode([]byte(node.Value), nil, reflect.New(v.Type().Elem()).Interface().(runtime.Object)) - if err != nil { - return err - } - // being unable to set the version does not prevent the object from being extracted - _ = h.versioner.UpdateObject(obj, node.ModifiedIndex) - if filter(obj) { - v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem())) - } - if node.ModifiedIndex != 0 { - h.addToCache(node.ModifiedIndex, obj) - } - } - } - trace.Step(fmt.Sprintf("Decoded %v nodes", len(nodes))) - return nil -} - -// Implements storage.Interface. -func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc, listObj runtime.Object) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - trace := util.NewTrace("List " + getTypeName(listObj)) - defer trace.LogIfLong(time.Second) - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - key = h.prefixEtcdKey(key) - startTime := time.Now() - trace.Step("About to list etcd node") - nodes, index, err := h.listEtcdNode(ctx, key) - metrics.RecordEtcdRequestLatency("list", getTypeName(listPtr), startTime) - trace.Step("Etcd node listed") - if err != nil { - return err - } - if err := h.decodeNodeList(nodes, filter, listPtr); err != nil { - return err - } - trace.Step("Node list decoded") - if err := h.versioner.UpdateList(listObj, index); err != nil { - return err - } - return nil -} - -func (h *etcdHelper) listEtcdNode(ctx context.Context, key string) ([]*etcd.Node, uint64, error) { - if ctx == nil { - glog.Errorf("Context is nil") - } - opts := etcd.GetOptions{ - Recursive: true, - Sort: true, - Quorum: h.quorum, - } - result, err := h.etcdKeysAPI.Get(ctx, key, &opts) - if err != nil { - var index uint64 - if etcdError, ok := err.(etcd.Error); ok { - index = etcdError.Index - } - nodes := make([]*etcd.Node, 0) - if etcdutil.IsEtcdNotFound(err) { - return nodes, index, nil - } else { - return nodes, index, toStorageErr(err, key, 0) - } - } - return result.Node.Nodes, result.Index, nil -} - -// Implements storage.Interface. -func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc) error { - if ctx == nil { - glog.Errorf("Context is nil") - } - v, err := conversion.EnforcePtr(ptrToType) - if err != nil { - // Panic is appropriate, because this is a programming error. - panic("need ptr to type") - } - key = h.prefixEtcdKey(key) - for { - obj := reflect.New(v.Type()).Interface().(runtime.Object) - origBody, node, res, err := h.bodyAndExtractObj(ctx, key, obj, ignoreNotFound) - if err != nil { - return toStorageErr(err, key, 0) - } - if err := checkPreconditions(preconditions, obj); err != nil { - return toStorageErr(err, key, 0) - } - meta := storage.ResponseMeta{} - if node != nil { - meta.TTL = node.TTL - meta.ResourceVersion = node.ModifiedIndex - } - // Get the object to be written by calling tryUpdate. - ret, newTTL, err := tryUpdate(obj, meta) - if err != nil { - return toStorageErr(err, key, 0) - } - - index := uint64(0) - ttl := uint64(0) - if node != nil { - index = node.ModifiedIndex - if node.TTL != 0 { - ttl = uint64(node.TTL) - } - if node.Expiration != nil && ttl == 0 { - ttl = 1 - } - } else if res != nil { - index = res.Index - } - - if newTTL != nil { - if ttl != 0 && *newTTL == 0 { - // TODO: remove this after we have verified this is no longer an issue - glog.V(4).Infof("GuaranteedUpdate is clearing TTL for %q, may not be intentional", key) - } - ttl = *newTTL - } - - // Since update object may have a resourceVersion set, we need to clear it here. - if err := h.versioner.UpdateObject(ret, 0); err != nil { - return errors.New("resourceVersion cannot be set on objects store in etcd") - } - - data, err := runtime.Encode(h.codec, ret) - if err != nil { - return err - } - - // First time this key has been used, try creating new value. - if index == 0 { - startTime := time.Now() - opts := etcd.SetOptions{ - TTL: time.Duration(ttl) * time.Second, - PrevExist: etcd.PrevNoExist, - } - response, err := h.etcdKeysAPI.Set(ctx, key, string(data), &opts) - metrics.RecordEtcdRequestLatency("create", getTypeName(ptrToType), startTime) - if etcdutil.IsEtcdNodeExist(err) { - continue - } - _, _, err = h.extractObj(response, err, ptrToType, false, false) - return toStorageErr(err, key, 0) - } - - if string(data) == origBody { - // If we don't send an update, we simply return the currently existing - // version of the object. - _, _, err := h.extractObj(res, nil, ptrToType, ignoreNotFound, false) - return err - } - - startTime := time.Now() - // Swap origBody with data, if origBody is the latest etcd data. - opts := etcd.SetOptions{ - PrevValue: origBody, - PrevIndex: index, - TTL: time.Duration(ttl) * time.Second, - } - response, err := h.etcdKeysAPI.Set(ctx, key, string(data), &opts) - metrics.RecordEtcdRequestLatency("compareAndSwap", getTypeName(ptrToType), startTime) - if etcdutil.IsEtcdTestFailed(err) { - // Try again. - continue - } - _, _, err = h.extractObj(response, err, ptrToType, false, false) - return toStorageErr(err, key, int64(index)) - } -} - -func (h *etcdHelper) prefixEtcdKey(key string) string { - if strings.HasPrefix(key, h.pathPrefix) { - return key - } - return path.Join(h.pathPrefix, key) -} - -// etcdCache defines interface used for caching objects stored in etcd. Objects are keyed by -// their Node.ModifiedIndex, which is unique across all types. -// All implementations must be thread-safe. -type etcdCache interface { - getFromCache(index uint64, filter storage.FilterFunc) (runtime.Object, bool) - addToCache(index uint64, obj runtime.Object) -} - -func getTypeName(obj interface{}) string { - return reflect.TypeOf(obj).String() -} - -func (h *etcdHelper) getFromCache(index uint64, filter storage.FilterFunc) (runtime.Object, bool) { - startTime := time.Now() - defer func() { - metrics.ObserveGetCache(startTime) - }() - obj, found := h.cache.Get(index) - if found { - if !filter(obj.(runtime.Object)) { - return nil, true - } - // We should not return the object itself to avoid polluting the cache if someone - // modifies returned values. - objCopy, err := h.copier.Copy(obj.(runtime.Object)) - if err != nil { - glog.Errorf("Error during DeepCopy of cached object: %q", err) - // We can't return a copy, thus we report the object as not found. - return nil, false - } - metrics.ObserveCacheHit() - return objCopy.(runtime.Object), true - } - metrics.ObserveCacheMiss() - return nil, false -} - -func (h *etcdHelper) addToCache(index uint64, obj runtime.Object) { - startTime := time.Now() - defer func() { - metrics.ObserveAddCache(startTime) - }() - objCopy, err := h.copier.Copy(obj) - if err != nil { - glog.Errorf("Error during DeepCopy of cached object: %q", err) - return - } - isOverwrite := h.cache.Add(index, objCopy) - if !isOverwrite { - metrics.ObserveNewEntry() - } -} - -func toStorageErr(err error, key string, rv int64) error { - if err == nil { - return nil - } - switch { - case etcdutil.IsEtcdNotFound(err): - return storage.NewKeyNotFoundError(key, rv) - case etcdutil.IsEtcdNodeExist(err): - return storage.NewKeyExistsError(key, rv) - case etcdutil.IsEtcdTestFailed(err): - return storage.NewResourceVersionConflictsError(key, rv) - case etcdutil.IsEtcdUnreachable(err): - return storage.NewUnreachableError(key, rv) - default: - return err - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper_test.go deleted file mode 100644 index a5e7f5753..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper_test.go +++ /dev/null @@ -1,562 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "path" - "reflect" - "sync" - "testing" - "time" - - etcd "github.com/coreos/etcd/client" - "github.com/stretchr/testify/assert" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" - etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" - storagetesting "k8s.io/kubernetes/pkg/storage/testing" -) - -const validEtcdVersion = "etcd 2.0.9" - -func testScheme(t *testing.T) (*runtime.Scheme, runtime.Codec) { - scheme := runtime.NewScheme() - scheme.Log(t) - scheme.AddKnownTypes(*testapi.Default.GroupVersion(), &storagetesting.TestResource{}) - scheme.AddKnownTypes(testapi.Default.InternalGroupVersion(), &storagetesting.TestResource{}) - if err := scheme.AddConversionFuncs( - func(in *storagetesting.TestResource, out *storagetesting.TestResource, s conversion.Scope) error { - *out = *in - return nil - }, - func(in, out *time.Time, s conversion.Scope) error { - *out = *in - return nil - }, - ); err != nil { - panic(err) - } - codec := serializer.NewCodecFactory(scheme).LegacyCodec(*testapi.Default.GroupVersion()) - return scheme, codec -} - -func newEtcdHelper(client etcd.Client, codec runtime.Codec, prefix string) etcdHelper { - return *NewEtcdStorage(client, codec, prefix, false, etcdtest.DeserializationCacheSize).(*etcdHelper) -} - -// Returns an encoded version of api.Pod with the given name. -func getEncodedPod(name string) string { - pod, _ := runtime.Encode(testapi.Default.Codec(), &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: name}, - }) - return string(pod) -} - -func createObj(t *testing.T, helper etcdHelper, name string, obj, out runtime.Object, ttl uint64) error { - err := helper.Create(context.TODO(), name, obj, out, ttl) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - return err -} - -func createPodList(t *testing.T, helper etcdHelper, list *api.PodList) error { - for i := range list.Items { - returnedObj := &api.Pod{} - err := createObj(t, helper, list.Items[i].Name, &list.Items[i], returnedObj, 0) - if err != nil { - return err - } - list.Items[i] = *returnedObj - } - return nil -} - -func TestList(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), key) - - list := api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "baz"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - - createPodList(t, helper, &list) - var got api.PodList - // TODO: a sorted filter function could be applied such implied - // ordering on the returned list doesn't matter. - err := helper.List(context.TODO(), key, "", storage.Everything, &got) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - - if e, a := list.Items, got.Items; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } -} - -func TestListFiltered(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), key) - - list := api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "baz"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - - createPodList(t, helper, &list) - filter := func(obj runtime.Object) bool { - pod := obj.(*api.Pod) - return pod.Name == "bar" - } - - var got api.PodList - err := helper.List(context.TODO(), key, "", filter, &got) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - // Check to make certain that the filter function only returns "bar" - if e, a := list.Items[0], got.Items[0]; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } -} - -// TestListAcrossDirectories ensures that the client excludes directories and flattens tree-response - simulates cross-namespace query -func TestListAcrossDirectories(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - rootkey := etcdtest.AddPrefix("/some/key") - key1 := etcdtest.AddPrefix("/some/key/directory1") - key2 := etcdtest.AddPrefix("/some/key/directory2") - - roothelper := newEtcdHelper(server.Client, testapi.Default.Codec(), rootkey) - helper1 := newEtcdHelper(server.Client, testapi.Default.Codec(), key1) - helper2 := newEtcdHelper(server.Client, testapi.Default.Codec(), key2) - - list := api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "baz"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - - returnedObj := &api.Pod{} - // create the 1st 2 elements in one directory - createObj(t, helper1, list.Items[0].Name, &list.Items[0], returnedObj, 0) - list.Items[0] = *returnedObj - createObj(t, helper1, list.Items[1].Name, &list.Items[1], returnedObj, 0) - list.Items[1] = *returnedObj - // create the last element in the other directory - createObj(t, helper2, list.Items[2].Name, &list.Items[2], returnedObj, 0) - list.Items[2] = *returnedObj - - var got api.PodList - err := roothelper.List(context.TODO(), rootkey, "", storage.Everything, &got) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - if e, a := list.Items, got.Items; !reflect.DeepEqual(e, a) { - t.Errorf("Expected %#v, got %#v", e, a) - } -} - -func TestGet(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), key) - expect := api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Spec: apitesting.DeepEqualSafePodSpec(), - } - var got api.Pod - if err := helper.Create(context.TODO(), key, &expect, &got, 0); err != nil { - t.Errorf("Unexpected error %#v", err) - } - expect = got - if err := helper.Get(context.TODO(), key, &got, false); err != nil { - t.Errorf("Unexpected error %#v", err) - } - if !reflect.DeepEqual(got, expect) { - t.Errorf("Wanted %#v, got %#v", expect, got) - } -} - -func TestGetNotFoundErr(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - boguskey := etcdtest.AddPrefix("/some/boguskey") - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), key) - - var got api.Pod - err := helper.Get(context.TODO(), boguskey, &got, false) - if !storage.IsNotFound(err) { - t.Errorf("Unexpected reponse on key=%v, err=%v", key, err) - } -} - -func TestCreate(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - returnedObj := &api.Pod{} - err := helper.Create(context.TODO(), "/some/key", obj, returnedObj, 5) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - _, err = runtime.Encode(testapi.Default.Codec(), obj) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - err = helper.Get(context.TODO(), "/some/key", returnedObj, false) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - _, err = runtime.Encode(testapi.Default.Codec(), returnedObj) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if obj.Name != returnedObj.Name { - t.Errorf("Wanted %v, got %v", obj.Name, returnedObj.Name) - } -} - -func TestCreateNilOutParam(t *testing.T) { - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), etcdtest.PathPrefix()) - err := helper.Create(context.TODO(), "/some/key", obj, nil, 5) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } -} - -func TestGuaranteedUpdate(t *testing.T) { - _, codec := testScheme(t) - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, codec, key) - - obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - return obj, nil - })) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - - // Update an existing node. - callbackCalled := false - objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2} - err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - callbackCalled = true - - if in.(*storagetesting.TestResource).Value != 1 { - t.Errorf("Callback input was not current set value") - } - - return objUpdate, nil - })) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - objCheck := &storagetesting.TestResource{} - err = helper.Get(context.TODO(), key, objCheck, false) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if objCheck.Value != 2 { - t.Errorf("Value should have been 2 but got %v", objCheck.Value) - } - - if !callbackCalled { - t.Errorf("tryUpdate callback should have been called.") - } -} - -func TestGuaranteedUpdateNoChange(t *testing.T) { - _, codec := testScheme(t) - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, codec, key) - - obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - return obj, nil - })) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - - // Update an existing node with the same data - callbackCalled := false - objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - callbackCalled = true - return objUpdate, nil - })) - if err != nil { - t.Fatalf("Unexpected error %#v", err) - } - if !callbackCalled { - t.Errorf("tryUpdate callback should have been called.") - } -} - -func TestGuaranteedUpdateKeyNotFound(t *testing.T) { - _, codec := testScheme(t) - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, codec, key) - - // Create a new node. - obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - - f := storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - return obj, nil - }) - - ignoreNotFound := false - err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f) - if err == nil { - t.Errorf("Expected error for key not found.") - } - - ignoreNotFound = true - err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f) - if err != nil { - t.Errorf("Unexpected error %v.", err) - } -} - -func TestGuaranteedUpdate_CreateCollision(t *testing.T) { - _, codec := testScheme(t) - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := etcdtest.AddPrefix("/some/key") - helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) - - const concurrency = 10 - var wgDone sync.WaitGroup - var wgForceCollision sync.WaitGroup - wgDone.Add(concurrency) - wgForceCollision.Add(concurrency) - - for i := 0; i < concurrency; i++ { - // Increment storagetesting.TestResource.Value by 1 - go func() { - defer wgDone.Done() - - firstCall := true - err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - defer func() { firstCall = false }() - - if firstCall { - // Force collision by joining all concurrent GuaranteedUpdate operations here. - wgForceCollision.Done() - wgForceCollision.Wait() - } - - currValue := in.(*storagetesting.TestResource).Value - obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: currValue + 1} - return obj, nil - })) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - }() - } - wgDone.Wait() - - stored := &storagetesting.TestResource{} - err := helper.Get(context.TODO(), key, stored, false) - if err != nil { - t.Errorf("Unexpected error %#v", stored) - } - if stored.Value != concurrency { - t.Errorf("Some of the writes were lost. Stored value: %d", stored.Value) - } -} - -func TestGuaranteedUpdateUIDMismatch(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - prefix := path.Join("/", etcdtest.PathPrefix()) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix) - - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}} - podPtr := &api.Pod{} - err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0) - if err != nil { - t.Fatalf("Unexpected error %#v", err) - } - err = helper.GuaranteedUpdate(context.TODO(), "/some/key", podPtr, true, storage.NewUIDPreconditions("B"), storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { - return obj, nil - })) - if !storage.IsTestFailed(err) { - t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err) - } -} - -func TestPrefixEtcdKey(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - prefix := path.Join("/", etcdtest.PathPrefix()) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix) - - baseKey := "/some/key" - - // Verify prefix is added - keyBefore := baseKey - keyAfter := helper.prefixEtcdKey(keyBefore) - - assert.Equal(t, keyAfter, path.Join(prefix, baseKey), "Prefix incorrectly added by EtcdHelper") - - // Verify prefix is not added - keyBefore = path.Join(prefix, baseKey) - keyAfter = helper.prefixEtcdKey(keyBefore) - - assert.Equal(t, keyBefore, keyAfter, "Prefix incorrectly added by EtcdHelper") -} - -func TestDeleteUIDMismatch(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - prefix := path.Join("/", etcdtest.PathPrefix()) - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix) - - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}} - podPtr := &api.Pod{} - err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0) - if err != nil { - t.Fatalf("Unexpected error %#v", err) - } - err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("B")) - if !storage.IsTestFailed(err) { - t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err) - } -} - -type getFunc func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) - -type fakeDeleteKeysAPI struct { - etcd.KeysAPI - fakeGetFunc getFunc - getCount int - // The fakeGetFunc will be called fakeGetCap times before the KeysAPI's Get will be called. - fakeGetCap int -} - -func (f *fakeDeleteKeysAPI) Get(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) { - f.getCount++ - if f.getCount < f.fakeGetCap { - return f.fakeGetFunc(ctx, key, opts) - } - return f.KeysAPI.Get(ctx, key, opts) -} - -// This is to emulate the case where another party updates the object when -// etcdHelper.Delete has verified the preconditions, but hasn't carried out the -// deletion yet. Etcd will fail the deletion and report the conflict. etcdHelper -// should retry until there is no conflict. -func TestDeleteWithRetry(t *testing.T) { - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - prefix := path.Join("/", etcdtest.PathPrefix()) - - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}} - // fakeGet returns a large ModifiedIndex to emulate the case that another - // party has updated the object. - fakeGet := func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) { - data, _ := runtime.Encode(testapi.Default.Codec(), obj) - return &etcd.Response{Node: &etcd.Node{Value: string(data), ModifiedIndex: 99}}, nil - } - expectedRetries := 3 - helper := newEtcdHelper(server.Client, testapi.Default.Codec(), prefix) - fake := &fakeDeleteKeysAPI{KeysAPI: helper.etcdKeysAPI, fakeGetCap: expectedRetries, fakeGetFunc: fakeGet} - helper.etcdKeysAPI = fake - - returnedObj := &api.Pod{} - err := helper.Create(context.TODO(), "/some/key", obj, returnedObj, 0) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - - err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("A")) - if err != nil { - t.Errorf("Unexpected error %#v", err) - } - if fake.getCount != expectedRetries { - t.Errorf("Expect %d retries, got %d", expectedRetries, fake.getCount) - } - err = helper.Get(context.TODO(), "/some/key", obj, false) - if !storage.IsNotFound(err) { - t.Errorf("Expect an NotFound error, got %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go deleted file mode 100644 index 93c1f7a9a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go +++ /dev/null @@ -1,494 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "fmt" - "net/http" - "sync" - "sync/atomic" - "time" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/watch" - - etcd "github.com/coreos/etcd/client" - "github.com/golang/glog" - "golang.org/x/net/context" -) - -// Etcd watch event actions -const ( - EtcdCreate = "create" - EtcdGet = "get" - EtcdSet = "set" - EtcdCAS = "compareAndSwap" - EtcdDelete = "delete" - EtcdCAD = "compareAndDelete" - EtcdExpire = "expire" -) - -// HighWaterMark is a thread-safe object for tracking the maximum value seen -// for some quantity. -type HighWaterMark int64 - -// Update returns true if and only if 'current' is the highest value ever seen. -func (hwm *HighWaterMark) Update(current int64) bool { - for { - old := atomic.LoadInt64((*int64)(hwm)) - if current <= old { - return false - } - if atomic.CompareAndSwapInt64((*int64)(hwm), old, current) { - return true - } - } -} - -// TransformFunc attempts to convert an object to another object for use with a watcher. -type TransformFunc func(runtime.Object) (runtime.Object, error) - -// includeFunc returns true if the given key should be considered part of a watch -type includeFunc func(key string) bool - -// exceptKey is an includeFunc that returns false when the provided key matches the watched key -func exceptKey(except string) includeFunc { - return func(key string) bool { - return key != except - } -} - -// etcdWatcher converts a native etcd watch to a watch.Interface. -type etcdWatcher struct { - encoding runtime.Codec - // Note that versioner is required for etcdWatcher to work correctly. - // There is no public constructor of it, so be careful when manipulating - // with it manually. - versioner storage.Versioner - transform TransformFunc - - list bool // If we're doing a recursive watch, should be true. - quorum bool // If we enable quorum, shoule be true - include includeFunc - filter storage.FilterFunc - - etcdIncoming chan *etcd.Response - etcdError chan error - ctx context.Context - cancel context.CancelFunc - etcdCallEnded chan struct{} - - outgoing chan watch.Event - userStop chan struct{} - stopped bool - stopLock sync.Mutex - // wg is used to avoid calls to etcd after Stop(), and to make sure - // that the translate goroutine is not leaked. - wg sync.WaitGroup - - // Injectable for testing. Send the event down the outgoing channel. - emit func(watch.Event) - - cache etcdCache -} - -// watchWaitDuration is the amount of time to wait for an error from watch. -const watchWaitDuration = 100 * time.Millisecond - -// newEtcdWatcher returns a new etcdWatcher; if list is true, watch sub-nodes. -// The versioner must be able to handle the objects that transform creates. -func newEtcdWatcher( - list bool, quorum bool, include includeFunc, filter storage.FilterFunc, - encoding runtime.Codec, versioner storage.Versioner, transform TransformFunc, - cache etcdCache) *etcdWatcher { - w := &etcdWatcher{ - encoding: encoding, - versioner: versioner, - transform: transform, - list: list, - quorum: quorum, - include: include, - filter: filter, - // Buffer this channel, so that the etcd client is not forced - // to context switch with every object it gets, and so that a - // long time spent decoding an object won't block the *next* - // object. Basically, we see a lot of "401 window exceeded" - // errors from etcd, and that's due to the client not streaming - // results but rather getting them one at a time. So we really - // want to never block the etcd client, if possible. The 100 is - // mostly arbitrary--we know it goes as high as 50, though. - // There's a V(2) log message that prints the length so we can - // monitor how much of this buffer is actually used. - etcdIncoming: make(chan *etcd.Response, 100), - etcdError: make(chan error, 1), - outgoing: make(chan watch.Event), - userStop: make(chan struct{}), - stopped: false, - wg: sync.WaitGroup{}, - cache: cache, - ctx: nil, - cancel: nil, - } - w.emit = func(e watch.Event) { - // Give up on user stop, without this we leak a lot of goroutines in tests. - select { - case w.outgoing <- e: - case <-w.userStop: - } - } - // translate will call done. We need to Add() here because otherwise, - // if Stop() gets called before translate gets started, there'd be a - // problem. - w.wg.Add(1) - go w.translate() - return w -} - -// etcdWatch calls etcd's Watch function, and handles any errors. Meant to be called -// as a goroutine. -func (w *etcdWatcher) etcdWatch(ctx context.Context, client etcd.KeysAPI, key string, resourceVersion uint64) { - defer utilruntime.HandleCrash() - defer close(w.etcdError) - defer close(w.etcdIncoming) - - // All calls to etcd are coming from this function - once it is finished - // no other call to etcd should be generated by this watcher. - done := func() {} - - // We need to be prepared, that Stop() can be called at any time. - // It can potentially also be called, even before this function is called. - // If that is the case, we simply skip all the code here. - // See #18928 for more details. - var watcher etcd.Watcher - returned := func() bool { - w.stopLock.Lock() - defer w.stopLock.Unlock() - if w.stopped { - // Watcher has already been stopped - don't event initiate it here. - return true - } - w.wg.Add(1) - done = w.wg.Done - // Perform initialization of watcher under lock - we want to avoid situation when - // Stop() is called in the meantime (which in tests can cause etcd termination and - // strange behavior here). - if resourceVersion == 0 { - latest, err := etcdGetInitialWatchState(ctx, client, key, w.list, w.quorum, w.etcdIncoming) - if err != nil { - w.etcdError <- err - return true - } - resourceVersion = latest - } - - opts := etcd.WatcherOptions{ - Recursive: w.list, - AfterIndex: resourceVersion, - } - watcher = client.Watcher(key, &opts) - w.ctx, w.cancel = context.WithCancel(ctx) - return false - }() - defer done() - if returned { - return - } - - for { - resp, err := watcher.Next(w.ctx) - if err != nil { - w.etcdError <- err - return - } - w.etcdIncoming <- resp - } -} - -// etcdGetInitialWatchState turns an etcd Get request into a watch equivalent -func etcdGetInitialWatchState(ctx context.Context, client etcd.KeysAPI, key string, recursive bool, quorum bool, incoming chan<- *etcd.Response) (resourceVersion uint64, err error) { - opts := etcd.GetOptions{ - Recursive: recursive, - Sort: false, - Quorum: quorum, - } - resp, err := client.Get(ctx, key, &opts) - if err != nil { - if !etcdutil.IsEtcdNotFound(err) { - utilruntime.HandleError(fmt.Errorf("watch was unable to retrieve the current index for the provided key (%q): %v", key, err)) - return resourceVersion, toStorageErr(err, key, 0) - } - if etcdError, ok := err.(etcd.Error); ok { - resourceVersion = etcdError.Index - } - return resourceVersion, nil - } - resourceVersion = resp.Index - convertRecursiveResponse(resp.Node, resp, incoming) - return -} - -// convertRecursiveResponse turns a recursive get response from etcd into individual response objects -// by copying the original response. This emulates the behavior of a recursive watch. -func convertRecursiveResponse(node *etcd.Node, response *etcd.Response, incoming chan<- *etcd.Response) { - if node.Dir { - for i := range node.Nodes { - convertRecursiveResponse(node.Nodes[i], response, incoming) - } - return - } - copied := *response - copied.Action = "get" - copied.Node = node - incoming <- &copied -} - -var ( - watchChannelHWM HighWaterMark -) - -// translate pulls stuff from etcd, converts, and pushes out the outgoing channel. Meant to be -// called as a goroutine. -func (w *etcdWatcher) translate() { - defer w.wg.Done() - defer close(w.outgoing) - defer utilruntime.HandleCrash() - - for { - select { - case err := <-w.etcdError: - if err != nil { - var status *unversioned.Status - switch { - case etcdutil.IsEtcdWatchExpired(err): - status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Message: err.Error(), - Code: http.StatusGone, // Gone - Reason: unversioned.StatusReasonExpired, - } - // TODO: need to generate errors using api/errors which has a circular dependency on this package - // no other way to inject errors - // case etcdutil.IsEtcdUnreachable(err): - // status = errors.NewServerTimeout(...) - default: - status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Message: err.Error(), - Code: http.StatusInternalServerError, - Reason: unversioned.StatusReasonInternalError, - } - } - w.emit(watch.Event{ - Type: watch.Error, - Object: status, - }) - } - return - case <-w.userStop: - return - case res, ok := <-w.etcdIncoming: - if ok { - if curLen := int64(len(w.etcdIncoming)); watchChannelHWM.Update(curLen) { - // Monitor if this gets backed up, and how much. - glog.V(2).Infof("watch: %v objects queued in channel.", curLen) - } - w.sendResult(res) - } - // If !ok, don't return here-- must wait for etcdError channel - // to give an error or be closed. - } - } -} - -func (w *etcdWatcher) decodeObject(node *etcd.Node) (runtime.Object, error) { - if obj, found := w.cache.getFromCache(node.ModifiedIndex, storage.Everything); found { - return obj, nil - } - - obj, err := runtime.Decode(w.encoding, []byte(node.Value)) - if err != nil { - return nil, err - } - - // ensure resource version is set on the object we load from etcd - if err := w.versioner.UpdateObject(obj, node.ModifiedIndex); err != nil { - utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", node.ModifiedIndex, obj, err)) - } - - // perform any necessary transformation - if w.transform != nil { - obj, err = w.transform(obj) - if err != nil { - utilruntime.HandleError(fmt.Errorf("failure to transform api object %#v: %v", obj, err)) - return nil, err - } - } - - if node.ModifiedIndex != 0 { - w.cache.addToCache(node.ModifiedIndex, obj) - } - return obj, nil -} - -func (w *etcdWatcher) sendAdd(res *etcd.Response) { - if res.Node == nil { - utilruntime.HandleError(fmt.Errorf("unexpected nil node: %#v", res)) - return - } - if w.include != nil && !w.include(res.Node.Key) { - return - } - obj, err := w.decodeObject(res.Node) - if err != nil { - utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\n'%v' from %#v %#v", err, string(res.Node.Value), res, res.Node)) - // TODO: expose an error through watch.Interface? - // Ignore this value. If we stop the watch on a bad value, a client that uses - // the resourceVersion to resume will never be able to get past a bad value. - return - } - if !w.filter(obj) { - return - } - action := watch.Added - if res.Node.ModifiedIndex != res.Node.CreatedIndex { - action = watch.Modified - } - w.emit(watch.Event{ - Type: action, - Object: obj, - }) -} - -func (w *etcdWatcher) sendModify(res *etcd.Response) { - if res.Node == nil { - glog.Errorf("unexpected nil node: %#v", res) - return - } - if w.include != nil && !w.include(res.Node.Key) { - return - } - curObj, err := w.decodeObject(res.Node) - if err != nil { - utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\n'%v' from %#v %#v", err, string(res.Node.Value), res, res.Node)) - // TODO: expose an error through watch.Interface? - // Ignore this value. If we stop the watch on a bad value, a client that uses - // the resourceVersion to resume will never be able to get past a bad value. - return - } - curObjPasses := w.filter(curObj) - oldObjPasses := false - var oldObj runtime.Object - if res.PrevNode != nil && res.PrevNode.Value != "" { - // Ignore problems reading the old object. - if oldObj, err = w.decodeObject(res.PrevNode); err == nil { - oldObjPasses = w.filter(oldObj) - } - } - // Some changes to an object may cause it to start or stop matching a filter. - // We need to report those as adds/deletes. So we have to check both the previous - // and current value of the object. - switch { - case curObjPasses && oldObjPasses: - w.emit(watch.Event{ - Type: watch.Modified, - Object: curObj, - }) - case curObjPasses && !oldObjPasses: - w.emit(watch.Event{ - Type: watch.Added, - Object: curObj, - }) - case !curObjPasses && oldObjPasses: - w.emit(watch.Event{ - Type: watch.Deleted, - Object: oldObj, - }) - } - // Do nothing if neither new nor old object passed the filter. -} - -func (w *etcdWatcher) sendDelete(res *etcd.Response) { - if res.PrevNode == nil { - utilruntime.HandleError(fmt.Errorf("unexpected nil prev node: %#v", res)) - return - } - if w.include != nil && !w.include(res.PrevNode.Key) { - return - } - node := *res.PrevNode - if res.Node != nil { - // Note that this sends the *old* object with the etcd index for the time at - // which it gets deleted. This will allow users to restart the watch at the right - // index. - node.ModifiedIndex = res.Node.ModifiedIndex - } - obj, err := w.decodeObject(&node) - if err != nil { - utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\nfrom %#v %#v", err, res, res.Node)) - // TODO: expose an error through watch.Interface? - // Ignore this value. If we stop the watch on a bad value, a client that uses - // the resourceVersion to resume will never be able to get past a bad value. - return - } - if !w.filter(obj) { - return - } - w.emit(watch.Event{ - Type: watch.Deleted, - Object: obj, - }) -} - -func (w *etcdWatcher) sendResult(res *etcd.Response) { - switch res.Action { - case EtcdCreate, EtcdGet: - w.sendAdd(res) - case EtcdSet, EtcdCAS: - w.sendModify(res) - case EtcdDelete, EtcdExpire, EtcdCAD: - w.sendDelete(res) - default: - utilruntime.HandleError(fmt.Errorf("unknown action: %v", res.Action)) - } -} - -// ResultChan implements watch.Interface. -func (w *etcdWatcher) ResultChan() <-chan watch.Event { - return w.outgoing -} - -// Stop implements watch.Interface. -func (w *etcdWatcher) Stop() { - w.stopLock.Lock() - if w.cancel != nil { - w.cancel() - w.cancel = nil - } - if !w.stopped { - w.stopped = true - close(w.userStop) - } - w.stopLock.Unlock() - - // Wait until all calls to etcd are finished and no other - // will be issued. - w.wg.Wait() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher_test.go deleted file mode 100644 index 386f59b56..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher_test.go +++ /dev/null @@ -1,512 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcd - -import ( - "math/rand" - rt "runtime" - "sync" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" - etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" - "k8s.io/kubernetes/pkg/watch" - - etcd "github.com/coreos/etcd/client" - "golang.org/x/net/context" -) - -var versioner = APIObjectVersioner{} - -// Implements etcdCache interface as empty methods (i.e. does not cache any objects) -type fakeEtcdCache struct{} - -func (f *fakeEtcdCache) getFromCache(index uint64, filter storage.FilterFunc) (runtime.Object, bool) { - return nil, false -} - -func (f *fakeEtcdCache) addToCache(index uint64, obj runtime.Object) { -} - -var _ etcdCache = &fakeEtcdCache{} - -func TestWatchInterpretations(t *testing.T) { - codec := testapi.Default.Codec() - // Declare some pods to make the test cases compact. - podFoo := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - podBar := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}} - podBaz := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "baz"}} - firstLetterIsB := func(obj runtime.Object) bool { - return obj.(*api.Pod).Name[0] == 'b' - } - - // All of these test cases will be run with the firstLetterIsB FilterFunc. - table := map[string]struct { - actions []string // Run this test item for every action here. - prevNodeValue string - nodeValue string - expectEmit bool - expectType watch.EventType - expectObject runtime.Object - }{ - "create": { - actions: []string{"create", "get"}, - nodeValue: runtime.EncodeOrDie(codec, podBar), - expectEmit: true, - expectType: watch.Added, - expectObject: podBar, - }, - "create but filter blocks": { - actions: []string{"create", "get"}, - nodeValue: runtime.EncodeOrDie(codec, podFoo), - expectEmit: false, - }, - "delete": { - actions: []string{"delete"}, - prevNodeValue: runtime.EncodeOrDie(codec, podBar), - expectEmit: true, - expectType: watch.Deleted, - expectObject: podBar, - }, - "delete but filter blocks": { - actions: []string{"delete"}, - nodeValue: runtime.EncodeOrDie(codec, podFoo), - expectEmit: false, - }, - "modify appears to create 1": { - actions: []string{"set", "compareAndSwap"}, - nodeValue: runtime.EncodeOrDie(codec, podBar), - expectEmit: true, - expectType: watch.Added, - expectObject: podBar, - }, - "modify appears to create 2": { - actions: []string{"set", "compareAndSwap"}, - prevNodeValue: runtime.EncodeOrDie(codec, podFoo), - nodeValue: runtime.EncodeOrDie(codec, podBar), - expectEmit: true, - expectType: watch.Added, - expectObject: podBar, - }, - "modify appears to delete": { - actions: []string{"set", "compareAndSwap"}, - prevNodeValue: runtime.EncodeOrDie(codec, podBar), - nodeValue: runtime.EncodeOrDie(codec, podFoo), - expectEmit: true, - expectType: watch.Deleted, - expectObject: podBar, // Should return last state that passed the filter! - }, - "modify modifies": { - actions: []string{"set", "compareAndSwap"}, - prevNodeValue: runtime.EncodeOrDie(codec, podBar), - nodeValue: runtime.EncodeOrDie(codec, podBaz), - expectEmit: true, - expectType: watch.Modified, - expectObject: podBaz, - }, - "modify ignores": { - actions: []string{"set", "compareAndSwap"}, - nodeValue: runtime.EncodeOrDie(codec, podFoo), - expectEmit: false, - }, - } - - for name, item := range table { - for _, action := range item.actions { - w := newEtcdWatcher(true, false, nil, firstLetterIsB, codec, versioner, nil, &fakeEtcdCache{}) - emitCalled := false - w.emit = func(event watch.Event) { - emitCalled = true - if !item.expectEmit { - return - } - if e, a := item.expectType, event.Type; e != a { - t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) - } - if e, a := item.expectObject, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) - } - } - - var n, pn *etcd.Node - if item.nodeValue != "" { - n = &etcd.Node{Value: item.nodeValue} - } - if item.prevNodeValue != "" { - pn = &etcd.Node{Value: item.prevNodeValue} - } - - w.sendResult(&etcd.Response{ - Action: action, - Node: n, - PrevNode: pn, - }) - - if e, a := item.expectEmit, emitCalled; e != a { - t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) - } - w.Stop() - } - } -} - -func TestWatchInterpretation_ResponseNotSet(t *testing.T) { - _, codec := testScheme(t) - w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, &fakeEtcdCache{}) - w.emit = func(e watch.Event) { - t.Errorf("Unexpected emit: %v", e) - } - - w.sendResult(&etcd.Response{ - Action: "update", - }) - w.Stop() -} - -func TestWatchInterpretation_ResponseNoNode(t *testing.T) { - _, codec := testScheme(t) - actions := []string{"create", "set", "compareAndSwap", "delete"} - for _, action := range actions { - w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, &fakeEtcdCache{}) - w.emit = func(e watch.Event) { - t.Errorf("Unexpected emit: %v", e) - } - w.sendResult(&etcd.Response{ - Action: action, - }) - w.Stop() - } -} - -func TestWatchInterpretation_ResponseBadData(t *testing.T) { - _, codec := testScheme(t) - actions := []string{"create", "set", "compareAndSwap", "delete"} - for _, action := range actions { - w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, &fakeEtcdCache{}) - w.emit = func(e watch.Event) { - t.Errorf("Unexpected emit: %v", e) - } - w.sendResult(&etcd.Response{ - Action: action, - Node: &etcd.Node{ - Value: "foobar", - }, - }) - w.sendResult(&etcd.Response{ - Action: action, - PrevNode: &etcd.Node{ - Value: "foobar", - }, - }) - w.Stop() - } -} - -func TestWatch(t *testing.T) { - codec := testapi.Default.Codec() - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := "/some/key" - h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) - - watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - // watching is explicitly closed below. - - // Test normal case - pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - returnObj := &api.Pod{} - err = h.Create(context.TODO(), key, pod, returnObj, 0) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - event := <-watching.ResultChan() - if e, a := watch.Added, event.Type; e != a { - t.Errorf("Expected %v, got %v", e, a) - } - if e, a := pod, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Expected %v, got %v", e, a) - } - - watching.Stop() - - // There is a race in etcdWatcher so that after calling Stop() one of - // two things can happen: - // - ResultChan() may be closed (triggered by closing userStop channel) - // - an Error "context cancelled" may be emitted (triggered by cancelling request - // to etcd and putting that error to etcdError channel) - // We need to be prepared for both here. - event, open := <-watching.ResultChan() - if open && event.Type != watch.Error { - t.Errorf("Unexpected event from stopped watcher: %#v", event) - } -} - -func emptySubsets() []api.EndpointSubset { - return []api.EndpointSubset{} -} - -func makeSubsets(ip string, port int) []api.EndpointSubset { - return []api.EndpointSubset{{ - Addresses: []api.EndpointAddress{{IP: ip}}, - Ports: []api.EndpointPort{{Port: int32(port)}}, - }} -} - -func TestWatchEtcdState(t *testing.T) { - codec := testapi.Default.Codec() - key := etcdtest.AddPrefix("/somekey/foo") - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - - h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) - watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watching.Stop() - - endpoint := &api.Endpoints{ - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Subsets: emptySubsets(), - } - - err = h.Create(context.TODO(), key, endpoint, endpoint, 0) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - event := <-watching.ResultChan() - if event.Type != watch.Added { - t.Errorf("Unexpected event %#v", event) - } - - subset := makeSubsets("127.0.0.1", 9000) - endpoint.Subsets = subset - endpoint.ResourceVersion = "" - - // CAS the previous value - updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { - newObj, err := api.Scheme.DeepCopy(endpoint) - if err != nil { - t.Errorf("unexpected error: %v", err) - return nil, nil, err - } - return newObj.(*api.Endpoints), nil, nil - } - err = h.GuaranteedUpdate(context.TODO(), key, &api.Endpoints{}, false, nil, updateFn) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - event = <-watching.ResultChan() - if event.Type != watch.Modified { - t.Errorf("Unexpected event %#v", event) - } - - if e, a := endpoint, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Unexpected error: expected %#v, got %#v", e, a) - } -} - -func TestWatchFromZeroIndex(t *testing.T) { - codec := testapi.Default.Codec() - pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - - key := etcdtest.AddPrefix("/somekey/foo") - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - - h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) - - // set before the watch and verify events - err := h.Create(context.TODO(), key, pod, pod, 0) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - pod.ResourceVersion = "" - - // check for concatenation on watch event with CAS - updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { - pod := input.(*api.Pod) - pod.Name = "bar" - return pod, nil, nil - } - err = h.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, false, nil, updateFn) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watching.Stop() - - // marked as modified b/c of concatenation - event := <-watching.ResultChan() - if event.Type != watch.Modified { - t.Errorf("Unexpected event %#v", event) - } - - pod.Name = "baz" - updateFn = func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { - pod := input.(*api.Pod) - pod.Name = "baz" - return pod, nil, nil - } - err = h.GuaranteedUpdate(context.TODO(), key, &api.Pod{}, false, nil, updateFn) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - event = <-watching.ResultChan() - if event.Type != watch.Modified { - t.Errorf("Unexpected event %#v", event) - } - - if e, a := pod, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Unexpected error: expected %#v, got %#v", e, a) - } -} - -func TestWatchListFromZeroIndex(t *testing.T) { - codec := testapi.Default.Codec() - key := etcdtest.AddPrefix("/some/key") - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - h := newEtcdHelper(server.Client, codec, key) - - watching, err := h.WatchList(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watching.Stop() - - // creates key/foo which should trigger the WatchList for "key" - pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - err = h.Create(context.TODO(), pod.Name, pod, pod, 0) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - event, _ := <-watching.ResultChan() - if event.Type != watch.Added { - t.Errorf("Unexpected event %#v", event) - } - - if e, a := pod, event.Object; !api.Semantic.DeepDerivative(e, a) { - t.Errorf("Unexpected error: expected %v, got %v", e, a) - } -} - -func TestWatchListIgnoresRootKey(t *testing.T) { - codec := testapi.Default.Codec() - pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - key := etcdtest.AddPrefix("/some/key") - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - h := newEtcdHelper(server.Client, codec, key) - - watching, err := h.WatchList(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer watching.Stop() - - // creates key/foo which should trigger the WatchList for "key" - err = h.Create(context.TODO(), key, pod, pod, 0) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - // force context switch to ensure watches would catch and notify. - rt.Gosched() - - select { - case event, _ := <-watching.ResultChan(): - t.Fatalf("Unexpected event: %#v", event) - default: - // fall through, expected behavior - } -} - -func TestWatchPurposefulShutdown(t *testing.T) { - _, codec := testScheme(t) - server := etcdtesting.NewEtcdTestClientServer(t) - defer server.Terminate(t) - key := "/some/key" - h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) - - // Test purposeful shutdown - watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - watching.Stop() - rt.Gosched() - - // There is a race in etcdWatcher so that after calling Stop() one of - // two things can happen: - // - ResultChan() may be closed (triggered by closing userStop channel) - // - an Error "context cancelled" may be emitted (triggered by cancelling request - // to etcd and putting that error to etcdError channel) - // We need to be prepared for both here. - event, open := <-watching.ResultChan() - if open && event.Type != watch.Error { - t.Errorf("Unexpected event from stopped watcher: %#v", event) - } -} - -func TestHighWaterMark(t *testing.T) { - var h HighWaterMark - - for i := int64(10); i < 20; i++ { - if !h.Update(i) { - t.Errorf("unexpected false for %v", i) - } - if h.Update(i - 1) { - t.Errorf("unexpected true for %v", i-1) - } - } - - m := int64(0) - wg := sync.WaitGroup{} - for i := 0; i < 300; i++ { - wg.Add(1) - v := rand.Int63() - go func(v int64) { - defer wg.Done() - h.Update(v) - }(v) - if v > m { - m = v - } - } - wg.Wait() - if m != int64(h) { - t.Errorf("unexpected value, wanted %v, got %v", m, int64(h)) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/doc.go deleted file mode 100644 index ef9e6ce86..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/doc.go +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcdtest diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/etcdtest.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/etcdtest.go deleted file mode 100644 index d248eedb2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/etcdtest/etcdtest.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 etcdtest - -import ( - "os" - "path" -) - -// Cache size to use for tests. -const DeserializationCacheSize = 150 - -// Returns the prefix set via the ETCD_PREFIX environment variable (if any). -func PathPrefix() string { - pref := os.Getenv("ETCD_PREFIX") - if pref == "" { - pref = "registry" - } - return path.Join("/", pref) -} - -// Adds the ETCD_PREFIX to the provided key -func AddPrefix(in string) string { - return path.Join(PathPrefix(), in) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/metrics/metrics.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/metrics/metrics.go deleted file mode 100644 index 7e88e43c2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/metrics/metrics.go +++ /dev/null @@ -1,113 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 metrics - -import ( - "sync" - "time" - - "github.com/prometheus/client_golang/prometheus" -) - -var ( - cacheHitCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "etcd_helper_cache_hit_count", - Help: "Counter of etcd helper cache hits.", - }, - ) - cacheMissCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "etcd_helper_cache_miss_count", - Help: "Counter of etcd helper cache miss.", - }, - ) - cacheEntryCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Name: "etcd_helper_cache_entry_count", - Help: "Counter of etcd helper cache entries. This can be different from etcd_helper_cache_miss_count " + - "because two concurrent threads can miss the cache and generate the same entry twice.", - }, - ) - cacheGetLatency = prometheus.NewSummary( - prometheus.SummaryOpts{ - Name: "etcd_request_cache_get_latencies_summary", - Help: "Latency in microseconds of getting an object from etcd cache", - }, - ) - cacheAddLatency = prometheus.NewSummary( - prometheus.SummaryOpts{ - Name: "etcd_request_cache_add_latencies_summary", - Help: "Latency in microseconds of adding an object to etcd cache", - }, - ) - etcdRequestLatenciesSummary = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Name: "etcd_request_latencies_summary", - Help: "Etcd request latency summary in microseconds for each operation and object type.", - }, - []string{"operation", "type"}, - ) -) - -var registerMetrics sync.Once - -// Register all metrics. -func Register() { - // Register the metrics. - registerMetrics.Do(func() { - prometheus.MustRegister(cacheHitCounter) - prometheus.MustRegister(cacheMissCounter) - prometheus.MustRegister(cacheEntryCounter) - prometheus.MustRegister(cacheAddLatency) - prometheus.MustRegister(cacheGetLatency) - prometheus.MustRegister(etcdRequestLatenciesSummary) - }) -} - -func RecordEtcdRequestLatency(verb, resource string, startTime time.Time) { - etcdRequestLatenciesSummary.WithLabelValues(verb, resource).Observe(float64(time.Since(startTime) / time.Microsecond)) -} - -func ObserveGetCache(startTime time.Time) { - cacheGetLatency.Observe(float64(time.Since(startTime) / time.Microsecond)) -} - -func ObserveAddCache(startTime time.Time) { - cacheAddLatency.Observe(float64(time.Since(startTime) / time.Microsecond)) -} - -func ObserveCacheHit() { - cacheHitCounter.Inc() -} - -func ObserveCacheMiss() { - cacheMissCounter.Inc() -} - -func ObserveNewEntry() { - cacheEntryCounter.Inc() -} - -func Reset() { - cacheHitCounter.Set(0) - cacheMissCounter.Set(0) - cacheEntryCounter.Set(0) - // TODO: Reset cacheAddLatency. - // TODO: Reset cacheGetLatency. - etcdRequestLatenciesSummary.Reset() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/certificates.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/certificates.go deleted file mode 100644 index c3fea5ffc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/certificates.go +++ /dev/null @@ -1,113 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 testing - -// You can use cfssl tool to generate certificates, please refer -// https://github.com/coreos/etcd/tree/master/hack/tls-setup for more details. -// -// ca-config.json: -// expiry was changed from 1 year to 100 years (876000h) -// ca-csr.json: -// ca expiry was set to 100 years (876000h) ("ca":{"expiry":"876000h"}) -// key was changed from ecdsa,384 to rsa,2048 -// req-csr.json: -// key was changed from ecdsa,384 to rsa,2048 -// hosts were changed to "localhost","127.0.0.1" -const CAFileContent = ` ------BEGIN CERTIFICATE----- -MIIEUDCCAzigAwIBAgIUKfV5+qwlw3JneAPdJS7JCO8xIlYwDQYJKoZIhvcNAQEL -BQAwgawxCzAJBgNVBAYTAlVTMSowKAYDVQQKEyFIb25lc3QgQWNobWVkJ3MgVXNl -ZCBDZXJ0aWZpY2F0ZXMxKTAnBgNVBAsTIEhhc3RpbHktR2VuZXJhdGVkIFZhbHVl -cyBEaXZpc29uMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxp -Zm9ybmlhMRkwFwYDVQQDExBBdXRvZ2VuZXJhdGVkIENBMCAXDTE2MDMxMjIzMTQw -MFoYDzIxMTYwMjE3MjMxNDAwWjCBrDELMAkGA1UEBhMCVVMxKjAoBgNVBAoTIUhv -bmVzdCBBY2htZWQncyBVc2VkIENlcnRpZmljYXRlczEpMCcGA1UECxMgSGFzdGls -eS1HZW5lcmF0ZWQgVmFsdWVzIERpdmlzb24xFjAUBgNVBAcTDVNhbiBGcmFuY2lz -Y28xEzARBgNVBAgTCkNhbGlmb3JuaWExGTAXBgNVBAMTEEF1dG9nZW5lcmF0ZWQg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDP+acpr1USrObZFu+6 -v+Bk6rYw+sWynP373cNUUiHfnZ3D7f9yJsDscV0Mo4R8DddqkxawrA5fK2Fm2Z9G -vvY5par4/JbwRIEkXmeM4e52Mqv0Yuoz62O+0jQvRawnCCJMcKuo+ijHMjmm0AF1 -JdhTpTgvUwEP9WtY9JVTkfMCnDqZiqOU5D+d4YWUtkKqgQNvbZRs6wGubhMCZe8X -m+3bK8YAsWWtoFgr7plxXk4D8MLh+PqJ3oJjfxfW5A9dHbnSEmdZ3vrYwrKgyfNf -bvHE5qQmiSZUbUaCw3mKfaEMCNesPT46nBHxhAWc5aiL1tOXzvV5Uze7A7huPoI9 -a3etAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEC -MB0GA1UdDgQWBBQYc0xXQ6VNjFvIOqWfXorxx9rKRzAfBgNVHSMEGDAWgBQYc0xX -Q6VNjFvIOqWfXorxx9rKRzANBgkqhkiG9w0BAQsFAAOCAQEAaKyHDWYVjEyEKTXJ -qS9r46ehL5FZlWD2ZytBP8aHE307l9AfQ+DFWldCNaqMXLZozsresVaSzSOI6UUD -lCIQLDpPyxbpR320u8mC08+lhhwR/YRkrEqKHk56Wl4OaqoyWmguqYU9p0DiQeTU -sZsxOwG7cyEEvvs+XmZ/vBLBOr59xyjwn4seQqzwZj3VYeiKLw40iQt1yT442rcP -CfdlE9wTEONvWT+kBGMt0JlalXH3jFvlfcGQdDfRmDeTJtA+uIbvJhwJuGCNHHAc -xqC+4mAGBPN/dMPXpjayHD5dOXIKLfrNpqse6jImYlY9zduvwIHRDK/zvqTyPlNZ -uR84Nw== ------END CERTIFICATE----- -` -const CertFileContent = ` ------BEGIN CERTIFICATE----- -MIIELzCCAxegAwIBAgIUcjkJA3cmHeoBQggaKZmfKebFL9cwDQYJKoZIhvcNAQEL -BQAwgawxCzAJBgNVBAYTAlVTMSowKAYDVQQKEyFIb25lc3QgQWNobWVkJ3MgVXNl -ZCBDZXJ0aWZpY2F0ZXMxKTAnBgNVBAsTIEhhc3RpbHktR2VuZXJhdGVkIFZhbHVl -cyBEaXZpc29uMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxp -Zm9ybmlhMRkwFwYDVQQDExBBdXRvZ2VuZXJhdGVkIENBMCAXDTE2MDMxMjIzMTQw -MFoYDzIxMTYwMjE3MjMxNDAwWjBVMRYwFAYDVQQKEw1hdXRvZ2VuZXJhdGVkMRUw -EwYDVQQLEwxldGNkIGNsdXN0ZXIxFTATBgNVBAcTDHRoZSBpbnRlcm5ldDENMAsG -A1UEAxMEZXRjZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOiW5A65 -hWGbnwceoZHM0+OexU4cPF/FpP+7BOK5i7ymSWAqfKfNuio2TB1lAErC1oX7bgTX -ieP10uz3FYWQNrlDn0I4KSA888rFPtx8GwoxH/52fGlE80BUV9PNeOVP+mYza0ih -oFj2+PhXVL/JZbx9P/2RLSNbEnq+OPk8AN82SkNtpFzanwtpb3f+kt73878KNoQu -xYZaCF1sK45Kn7mjKSDu/b3xUbTrNwnyVAGOdLzI7CCWOu+ECoZYAH4ZNHHakbyY -eWQ7U9leocEOPlqxsQAKodaCYjuAaOFIcz8/W81q+3qNw/6GbZ4znjRKQ3OtIPZ4 -JH1iNofCudWDp+0CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw -FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFMJE -43qLCWhyZAE/wxNneSJw7aUVMB8GA1UdIwQYMBaAFBhzTFdDpU2MW8g6pZ9eivHH -2spHMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOC -AQEAuELC8tbmpyKlA4HLSDHOUquypNyiE6ftBIifJtp8bvBd+jiv4Pr8oVGxHoqq -48X7lamvDirLV5gmK0CxO+EXkIUHhULzPyYPynqsR7KZlk1PWghqsF65nwqcjS3b -tykLttD1AUDIozYvujVYBKXGxb6jcGM1rBF1XtslciFZ5qQnj6dTUujo9/xBA2ql -kOKiVXBNU8KFzq4c20RzHFLfWkbc30Q4XG4dTDVBeGupnFQRkZ0y2dSSU82QcLA/ -HgAyQSO7+csN13r84zbmDuRpUgo6eTXzJ+77G19KDkEL7XEtlw2jB2L6/o+3RGtw -JLOpEsgi7hsvOYCuTA3Krw52Mw== ------END CERTIFICATE----- -` -const KeyFileContent = ` ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA6JbkDrmFYZufBx6hkczT457FThw8X8Wk/7sE4rmLvKZJYCp8 -p826KjZMHWUASsLWhftuBNeJ4/XS7PcVhZA2uUOfQjgpIDzzysU+3HwbCjEf/nZ8 -aUTzQFRX08145U/6ZjNrSKGgWPb4+FdUv8llvH0//ZEtI1sSer44+TwA3zZKQ22k -XNqfC2lvd/6S3vfzvwo2hC7FhloIXWwrjkqfuaMpIO79vfFRtOs3CfJUAY50vMjs -IJY674QKhlgAfhk0cdqRvJh5ZDtT2V6hwQ4+WrGxAAqh1oJiO4Bo4UhzPz9bzWr7 -eo3D/oZtnjOeNEpDc60g9ngkfWI2h8K51YOn7QIDAQABAoIBAQCj88Fc08++x0kp -ZqEzunPebsvcTLEOPa8aiUVfYLWszHbKsAhg7Pb+zHmI+upiyMcZeOvLw/eyVlVR -rrZgCRFaNN2texMaY3zigXnXSDBzVb+cyv7V4cGqpgmnBp7i3ia/Jh3I/A2gyK8l -t8HI03nAjXWvE0gDNS5okXBt16sxq6ZWyzHHVbN3UYtCDxnyh2Ibck4b+K8I8Bn1 -mwMsSqPXJS1UQ3U5UqcaMs7WOEGx+xmaPJTWm5Lb//BkakGuBTQj+7wotyXQYG5U -uZdPPcFRk6cqgjzUeKVUtGkdmfgHSTdIwZowkKibB4rdrudsRnSwfeB+83Jp9JwG -JPrGvsbNAoGBAPULIO+vVBZXVpUEAhvNSXtmOi/hAbQhOuix8iwHbJ5EbrWaDn4B -Reb2cw/fZGgGG4jtAOXdiY8R1XGGP8+RPZ5El10ZWnNrKQfpZ27gK/5yeq5dfGBG -4JLUpcrT180FJo00rgiQYJnHCk1fWrnzXNV6K08ZZHGr6yv4S/jbq/7vAoGBAPL9 -NTN/UWXWFlSHVcb2dFHcvIiPwRj9KwhuMu90b/CilBbSJ1av13xtf2ar5zkrEtWH -CB3q3wBaklQP9MfOqEWGZeOUcd9AbYWtxHjHmP5fJA9RjErjlTtqGkusNtZJbchU -UWfT/Tl9pREpCvJ/8iawc1hx7sHHKzYwnDnMaQbjAoGAfJdd9cBltr5NjZLuJ4in -dhCyQSncnePPegUQJwbXWVleGQPtnm+zRQ3Fzyo8eQ+x7Frk+/s6N/5PUlt6EmW8 -uL4TYAjGDq1LvXQVXTCp7cPzULjDxogDI2Tvr0MrFFksEtvYKQ6Pr2CeglybWrS8 -XOazIpK8mXdaKY8jwbKfrw0CgYAFnfrb3OaZzxAnFhXSiqH3vn2RPpl9JWUYRcvh -ozRvQKLhwCvuohP+KV3XlsO6m5dM3lk+r85F6NIXJWNINyvGp6u1ThovygJ+I502 -GY8c2kAwJndyx74MaJCBDVMbMwlZpzFWkBz7dj8ZnXRGVNTZNh0Ef2XAjwUdtJP3 -9hS7dwKBgQDCzq0RIxFyy3F5baGHWLVICxmhNExQ2+Vebh+DvsPKtnz6OrWdRbGX -wgGVLrn53s6eCblnXLtKr/Li+t7fS8IkQkvu5guOvI9VeVUmZhFET3GVmUxu+JTb -iQY4uBgaf8Fgay4dkOfjvlOpFDR4E7UbJpg8/cFKTrpwgOiUVyFVdQ== ------END RSA PRIVATE KEY----- -` diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/utils.go deleted file mode 100644 index d46085e4c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/testing/utils.go +++ /dev/null @@ -1,250 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "os" - "path" - "testing" - "time" - - etcd "github.com/coreos/etcd/client" - "github.com/coreos/etcd/etcdserver" - "github.com/coreos/etcd/etcdserver/api/v2http" - "github.com/coreos/etcd/pkg/testutil" - "github.com/coreos/etcd/pkg/transport" - "github.com/coreos/etcd/pkg/types" - "github.com/golang/glog" - "golang.org/x/net/context" -) - -// EtcdTestServer encapsulates the datastructures needed to start local instance for testing -type EtcdTestServer struct { - etcdserver.ServerConfig - PeerListeners, ClientListeners []net.Listener - Client etcd.Client - - CertificatesDir string - CertFile string - KeyFile string - CAFile string - - raftHandler http.Handler - s *etcdserver.EtcdServer - hss []*httptest.Server -} - -// newLocalListener opens a port localhost using any port -func newLocalListener(t *testing.T) net.Listener { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - return l -} - -// newSecuredLocalListener opens a port localhost using any port -// with SSL enable -func newSecuredLocalListener(t *testing.T, certFile, keyFile, caFile string) net.Listener { - var l net.Listener - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - tlsInfo := transport.TLSInfo{ - CertFile: certFile, - KeyFile: keyFile, - CAFile: caFile, - } - tlscfg, err := tlsInfo.ServerConfig() - if err != nil { - t.Fatalf("unexpected serverConfig error: %v", err) - } - l, err = transport.NewKeepAliveListener(l, "https", tlscfg) - if err != nil { - t.Fatal(err) - } - return l -} - -func newHttpTransport(t *testing.T, certFile, keyFile, caFile string) etcd.CancelableTransport { - tlsInfo := transport.TLSInfo{ - CertFile: certFile, - KeyFile: keyFile, - CAFile: caFile, - } - tr, err := transport.NewTransport(tlsInfo, time.Second) - if err != nil { - t.Fatal(err) - } - return tr -} - -// configureTestCluster will set the params to start an etcd server -func configureTestCluster(t *testing.T, name string) *EtcdTestServer { - var err error - m := &EtcdTestServer{} - - pln := newLocalListener(t) - m.PeerListeners = []net.Listener{pln} - m.PeerURLs, err = types.NewURLs([]string{"http://" + pln.Addr().String()}) - if err != nil { - t.Fatal(err) - } - - m.CertificatesDir, err = ioutil.TempDir(os.TempDir(), "etcd_certificates") - if err != nil { - t.Fatal(err) - } - m.CertFile = path.Join(m.CertificatesDir, "etcdcert.pem") - if err = ioutil.WriteFile(m.CertFile, []byte(CertFileContent), 0644); err != nil { - t.Fatal(err) - } - m.KeyFile = path.Join(m.CertificatesDir, "etcdkey.pem") - if err = ioutil.WriteFile(m.KeyFile, []byte(KeyFileContent), 0644); err != nil { - t.Fatal(err) - } - m.CAFile = path.Join(m.CertificatesDir, "ca.pem") - if err = ioutil.WriteFile(m.CAFile, []byte(CAFileContent), 0644); err != nil { - t.Fatal(err) - } - - cln := newSecuredLocalListener(t, m.CertFile, m.KeyFile, m.CAFile) - m.ClientListeners = []net.Listener{cln} - m.ClientURLs, err = types.NewURLs([]string{"https://" + cln.Addr().String()}) - if err != nil { - t.Fatal(err) - } - - m.Name = name - m.DataDir, err = ioutil.TempDir(os.TempDir(), "etcd") - if err != nil { - t.Fatal(err) - } - - clusterStr := fmt.Sprintf("%s=http://%s", name, pln.Addr().String()) - m.InitialPeerURLsMap, err = types.NewURLsMap(clusterStr) - if err != nil { - t.Fatal(err) - } - m.InitialClusterToken = "TestEtcd" - m.NewCluster = true - m.ForceNewCluster = false - m.ElectionTicks = 10 - m.TickMs = uint(10) - - return m -} - -// launch will attempt to start the etcd server -func (m *EtcdTestServer) launch(t *testing.T) error { - var err error - if m.s, err = etcdserver.NewServer(&m.ServerConfig); err != nil { - return fmt.Errorf("failed to initialize the etcd server: %v", err) - } - m.s.SyncTicker = time.Tick(500 * time.Millisecond) - m.s.Start() - m.raftHandler = &testutil.PauseableHandler{Next: v2http.NewPeerHandler(m.s)} - for _, ln := range m.PeerListeners { - hs := &httptest.Server{ - Listener: ln, - Config: &http.Server{Handler: m.raftHandler}, - } - hs.Start() - m.hss = append(m.hss, hs) - } - for _, ln := range m.ClientListeners { - hs := &httptest.Server{ - Listener: ln, - Config: &http.Server{Handler: v2http.NewClientHandler(m.s, m.ServerConfig.ReqTimeout())}, - } - hs.Start() - m.hss = append(m.hss, hs) - } - return nil -} - -// waitForEtcd wait until etcd is propagated correctly -func (m *EtcdTestServer) waitUntilUp() error { - membersAPI := etcd.NewMembersAPI(m.Client) - for start := time.Now(); time.Since(start) < 5*time.Second; time.Sleep(10 * time.Millisecond) { - members, err := membersAPI.List(context.TODO()) - if err != nil { - glog.Errorf("Error when getting etcd cluster members") - continue - } - if len(members) == 1 && len(members[0].ClientURLs) > 0 { - return nil - } - } - return fmt.Errorf("timeout on waiting for etcd cluster") -} - -// Terminate will shutdown the running etcd server -func (m *EtcdTestServer) Terminate(t *testing.T) { - m.Client = nil - m.s.Stop() - // TODO: This is a pretty ugly hack to workaround races during closing - // in-memory etcd server in unit tests - see #18928 for more details. - // We should get rid of it as soon as we have a proper fix - etcd clients - // have overwritten transport counting opened connections (probably by - // overwriting Dial function) and termination function waiting for all - // connections to be closed and stopping accepting new ones. - time.Sleep(250 * time.Millisecond) - for _, hs := range m.hss { - hs.CloseClientConnections() - hs.Close() - } - if err := os.RemoveAll(m.ServerConfig.DataDir); err != nil { - t.Fatal(err) - } - if err := os.RemoveAll(m.CertificatesDir); err != nil { - t.Fatal(err) - } -} - -// NewEtcdTestClientServer creates a new client and server for testing -func NewEtcdTestClientServer(t *testing.T) *EtcdTestServer { - server := configureTestCluster(t, "foo") - err := server.launch(t) - if err != nil { - t.Fatalf("Failed to start etcd server error=%v", err) - return nil - } - - cfg := etcd.Config{ - Endpoints: server.ClientURLs.StringSlice(), - Transport: newHttpTransport(t, server.CertFile, server.KeyFile, server.CAFile), - } - server.Client, err = etcd.New(cfg) - if err != nil { - t.Errorf("Unexpected error in NewEtcdTestClientServer (%v)", err) - server.Terminate(t) - return nil - } - if err := server.waitUntilUp(); err != nil { - t.Errorf("Unexpected error in waitUntilUp (%v)", err) - server.Terminate(t) - return nil - } - return server -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/doc.go deleted file mode 100644 index aa1039faf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 holds generic etcd-related utility functions that any user of ectd might want to -// use, without pulling in kubernetes-specific code. -package util diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util.go deleted file mode 100644 index b15ec5bd0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - - etcd "github.com/coreos/etcd/client" -) - -// IsEtcdNotFound returns true if and only if err is an etcd not found error. -func IsEtcdNotFound(err error) bool { - return isEtcdErrorNum(err, etcd.ErrorCodeKeyNotFound) -} - -// IsEtcdNodeExist returns true if and only if err is an etcd node already exist error. -func IsEtcdNodeExist(err error) bool { - return isEtcdErrorNum(err, etcd.ErrorCodeNodeExist) -} - -// IsEtcdTestFailed returns true if and only if err is an etcd write conflict. -func IsEtcdTestFailed(err error) bool { - return isEtcdErrorNum(err, etcd.ErrorCodeTestFailed) -} - -// IsEtcdWatchExpired returns true if and only if err indicates the watch has expired. -func IsEtcdWatchExpired(err error) bool { - // NOTE: This seems weird why it wouldn't be etcd.ErrorCodeWatcherCleared - // I'm using the previous matching value - return isEtcdErrorNum(err, etcd.ErrorCodeEventIndexCleared) -} - -// IsEtcdUnreachable returns true if and only if err indicates the server could not be reached. -func IsEtcdUnreachable(err error) bool { - // NOTE: The logic has changed previous error code no longer applies - return err == etcd.ErrClusterUnavailable -} - -// isEtcdErrorNum returns true if and only if err is an etcd error, whose errorCode matches errorCode -func isEtcdErrorNum(err error, errorCode int) bool { - if err != nil { - if etcdError, ok := err.(etcd.Error); ok { - return etcdError.Code == errorCode - } - // NOTE: There are other error types returned - } - return false -} - -// GetEtcdVersion performs a version check against the provided Etcd server, -// returning the string response, and error (if any). -func GetEtcdVersion(host string) (string, error) { - response, err := http.Get(host + "/version") - if err != nil { - return "", err - } - defer response.Body.Close() - if response.StatusCode != http.StatusOK { - return "", fmt.Errorf("unsuccessful response from etcd server %q: %v", host, err) - } - versionBytes, err := ioutil.ReadAll(response.Body) - if err != nil { - return "", err - } - return string(versionBytes), nil -} - -type etcdHealth struct { - // Note this has to be public so the json library can modify it. - Health string `json:"health"` -} - -func EtcdHealthCheck(data []byte) error { - obj := etcdHealth{} - if err := json.Unmarshal(data, &obj); err != nil { - return err - } - if obj.Health != "true" { - return fmt.Errorf("Unhealthy status: %s", obj.Health) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util_test.go deleted file mode 100644 index cc41958ad..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd/util/etcd_util_test.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ( - "fmt" - "math/rand" - "net" - "net/http" - "net/http/httptest" - "strconv" - "testing" - "time" - - etcd "github.com/coreos/etcd/client" - "github.com/stretchr/testify/assert" -) - -const validEtcdVersion = "etcd 2.0.9" - -func TestIsEtcdNotFound(t *testing.T) { - try := func(err error, isNotFound bool) { - if IsEtcdNotFound(err) != isNotFound { - t.Errorf("Expected %#v to return %v, but it did not", err, isNotFound) - } - } - try(&etcd.Error{Code: 101}, false) - try(nil, false) - try(fmt.Errorf("some other kind of error"), false) -} - -func TestGetEtcdVersion_ValidVersion(t *testing.T) { - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, validEtcdVersion) - })) - defer testServer.Close() - - var version string - var err error - if version, err = GetEtcdVersion(testServer.URL); err != nil { - t.Errorf("Unexpected error: %v", err) - } - assert.Equal(t, validEtcdVersion, version, "Unexpected version") - assert.Nil(t, err) -} - -func TestGetEtcdVersion_ErrorStatus(t *testing.T) { - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusServiceUnavailable) - })) - defer testServer.Close() - - _, err := GetEtcdVersion(testServer.URL) - assert.NotNil(t, err) -} - -func TestGetEtcdVersion_NotListening(t *testing.T) { - portIsOpen := func(port int) bool { - conn, err := net.DialTimeout("tcp", "127.0.0.1:"+strconv.Itoa(port), 1*time.Second) - if err == nil { - conn.Close() - return true - } - return false - } - - port := rand.Intn((1 << 16) - 1) - for tried := 0; portIsOpen(port); tried++ { - if tried >= 10 { - t.Fatal("Couldn't find a closed TCP port to continue testing") - } - port++ - } - - _, err := GetEtcdVersion("http://127.0.0.1:" + strconv.Itoa(port)) - assert.NotNil(t, err) -} - -func TestEtcdHealthCheck(t *testing.T) { - tests := []struct { - data string - expectErr bool - }{ - { - data: "{\"health\": \"true\"}", - expectErr: false, - }, - { - data: "{\"health\": \"false\"}", - expectErr: true, - }, - { - data: "invalid json", - expectErr: true, - }, - } - for _, test := range tests { - err := EtcdHealthCheck([]byte(test.data)) - if err != nil && !test.expectErr { - t.Errorf("unexpected error: %v", err) - } - if err == nil && test.expectErr { - t.Error("unexpected non-error") - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact.go deleted file mode 100644 index cfe73c597..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "sync" - "time" - - "github.com/coreos/etcd/clientv3" - "github.com/golang/glog" - "golang.org/x/net/context" -) - -const compactInterval = 10 * time.Minute - -var ( - endpointsMapMu sync.Mutex - endpointsMap map[string]struct{} -) - -func init() { - endpointsMap = make(map[string]struct{}) -} - -// StartCompactor starts a compactor in the background in order to compact keys -// older than fixed time. -// We need to compact keys because we can't let on disk data grow forever. -// We save the most recent 10 minutes data. It should be enough for slow watchers and to tolerate burst. -// TODO: We might keep a longer history (12h) in the future once storage API can take -// advantage of multi-version key. -func StartCompactor(ctx context.Context, client *clientv3.Client) { - endpointsMapMu.Lock() - defer endpointsMapMu.Unlock() - - // We can't have multiple compaction jobs for the same cluster. - // Currently we rely on endpoints to differentiate clusters. - var emptyStruct struct{} - for _, ep := range client.Endpoints() { - if _, ok := endpointsMap[ep]; ok { - glog.V(4).Infof("compactor already exists for endpoints %v") - return - } - } - for _, ep := range client.Endpoints() { - endpointsMap[ep] = emptyStruct - } - - go compactor(ctx, client, compactInterval) -} - -// compactor periodically compacts historical versions of keys in etcd. -// After compaction, old versions of keys set before given interval will be gone. -// Any API call for the old versions of keys will return error. -// interval: the interval between each compaction. The first compaction happens after "interval". -func compactor(ctx context.Context, client *clientv3.Client, interval time.Duration) { - var curRev int64 - var err error - for { - select { - case <-time.After(interval): - case <-ctx.Done(): - return - } - - curRev, err = compact(ctx, client, curRev) - if err != nil { - glog.Error(err) - continue - } - } -} - -// compact compacts etcd store and returns current rev. -// If it couldn't get current revision, the old rev will be returned. -func compact(ctx context.Context, client *clientv3.Client, oldRev int64) (int64, error) { - resp, err := client.Get(ctx, "/") - if err != nil { - return oldRev, err - } - curRev := resp.Header.Revision - if oldRev == 0 { - return curRev, nil - } - err = client.Compact(ctx, oldRev) - if err != nil { - return curRev, err - } - glog.Infof("etcd: Compacted rev %d, endpoints %v", oldRev, client.Endpoints()) - return curRev, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact_test.go deleted file mode 100644 index af5a3ed4d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/compact_test.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "testing" - - "github.com/coreos/etcd/clientv3" - etcdrpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" - "github.com/coreos/etcd/integration" - "golang.org/x/net/context" -) - -func TestCompact(t *testing.T) { - cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer cluster.Terminate(t) - client := cluster.RandClient() - ctx := context.Background() - - putResp, err := client.Put(ctx, "/somekey", "data") - if err != nil { - t.Fatalf("Put failed: %v", err) - } - - _, err = compact(ctx, client, putResp.Header.Revision) - if err != nil { - t.Fatalf("compact failed: %v", err) - } - - _, err = client.Get(ctx, "/somekey", clientv3.WithRev(putResp.Header.Revision)) - if err != etcdrpc.ErrCompacted { - t.Errorf("Expecting ErrCompacted, but get=%v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/event.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/event.go deleted file mode 100644 index 58072bd7b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/event.go +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "github.com/coreos/etcd/clientv3" - "github.com/coreos/etcd/storage/storagepb" -) - -type event struct { - key string - value []byte - rev int64 - isDeleted bool - isCreated bool -} - -func parseKV(kv *storagepb.KeyValue) *event { - return &event{ - key: string(kv.Key), - value: kv.Value, - rev: kv.ModRevision, - isDeleted: false, - isCreated: kv.ModRevision == kv.CreateRevision, - } -} - -func parseEvent(e *clientv3.Event) *event { - return &event{ - key: string(e.Kv.Key), - value: e.Kv.Value, - rev: e.Kv.ModRevision, - isDeleted: e.Type == clientv3.EventTypeDelete, - isCreated: e.IsCreate(), - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store.go deleted file mode 100644 index 4ac455df5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store.go +++ /dev/null @@ -1,474 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "bytes" - "errors" - "fmt" - "path" - "reflect" - "strings" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/conversion" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd" - "k8s.io/kubernetes/pkg/watch" - - "github.com/coreos/etcd/clientv3" - "github.com/golang/glog" - "golang.org/x/net/context" -) - -type store struct { - client *clientv3.Client - codec runtime.Codec - versioner storage.Versioner - pathPrefix string - watcher *watcher -} - -type elemForDecode struct { - data []byte - rev uint64 -} - -type objState struct { - obj runtime.Object - meta *storage.ResponseMeta - rev int64 - data []byte -} - -// New returns an etcd3 implementation of storage.Interface. -func New(c *clientv3.Client, codec runtime.Codec, prefix string) storage.Interface { - return newStore(c, codec, prefix) -} - -func newStore(c *clientv3.Client, codec runtime.Codec, prefix string) *store { - versioner := etcd.APIObjectVersioner{} - return &store{ - client: c, - versioner: versioner, - codec: codec, - pathPrefix: prefix, - watcher: newWatcher(c, codec, versioner), - } -} - -// Backends implements storage.Interface.Backends. -func (s *store) Backends(ctx context.Context) []string { - resp, err := s.client.MemberList(ctx) - if err != nil { - glog.Errorf("Error obtaining etcd members list: %q", err) - return nil - } - var mlist []string - for _, member := range resp.Members { - mlist = append(mlist, member.ClientURLs...) - } - return mlist -} - -// Codec implements storage.Interface.Codec. -func (s *store) Codec() runtime.Codec { - return s.codec -} - -// Versioner implements storage.Interface.Versioner. -func (s *store) Versioner() storage.Versioner { - return s.versioner -} - -// Get implements storage.Interface.Get. -func (s *store) Get(ctx context.Context, key string, out runtime.Object, ignoreNotFound bool) error { - key = keyWithPrefix(s.pathPrefix, key) - getResp, err := s.client.KV.Get(ctx, key) - if err != nil { - return err - } - - if len(getResp.Kvs) == 0 { - if ignoreNotFound { - return runtime.SetZeroValue(out) - } - return storage.NewKeyNotFoundError(key, 0) - } - kv := getResp.Kvs[0] - return decode(s.codec, s.versioner, kv.Value, out, kv.ModRevision) -} - -// Create implements storage.Interface.Create. -func (s *store) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error { - if version, err := s.versioner.ObjectResourceVersion(obj); err == nil && version != 0 { - return errors.New("resourceVersion should not be set on objects to be created") - } - data, err := runtime.Encode(s.codec, obj) - if err != nil { - return err - } - key = keyWithPrefix(s.pathPrefix, key) - - opts, err := s.ttlOpts(ctx, int64(ttl)) - if err != nil { - return err - } - - txnResp, err := s.client.KV.Txn(ctx).If( - notFound(key), - ).Then( - clientv3.OpPut(key, string(data), opts...), - ).Commit() - if err != nil { - return err - } - if !txnResp.Succeeded { - return storage.NewKeyExistsError(key, 0) - } - - if out != nil { - putResp := txnResp.Responses[0].GetResponsePut() - return decode(s.codec, s.versioner, data, out, putResp.Header.Revision) - } - return nil -} - -// Delete implements storage.Interface.Delete. -func (s *store) Delete(ctx context.Context, key string, out runtime.Object, precondtions *storage.Preconditions) error { - v, err := conversion.EnforcePtr(out) - if err != nil { - panic("unable to convert output object to pointer") - } - key = keyWithPrefix(s.pathPrefix, key) - if precondtions == nil { - return s.unconditionalDelete(ctx, key, out) - } - return s.conditionalDelete(ctx, key, out, v, precondtions) -} - -func (s *store) unconditionalDelete(ctx context.Context, key string, out runtime.Object) error { - // We need to do get and delete in single transaction in order to - // know the value and revision before deleting it. - txnResp, err := s.client.KV.Txn(ctx).If().Then( - clientv3.OpGet(key), - clientv3.OpDelete(key), - ).Commit() - if err != nil { - return err - } - getResp := txnResp.Responses[0].GetResponseRange() - if len(getResp.Kvs) == 0 { - return storage.NewKeyNotFoundError(key, 0) - } - - kv := getResp.Kvs[0] - return decode(s.codec, s.versioner, kv.Value, out, kv.ModRevision) -} - -func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.Object, v reflect.Value, precondtions *storage.Preconditions) error { - getResp, err := s.client.KV.Get(ctx, key) - if err != nil { - return err - } - for { - origState, err := s.getState(getResp, key, v, false) - if err != nil { - return err - } - if err := checkPreconditions(key, precondtions, origState.obj); err != nil { - return err - } - txnResp, err := s.client.KV.Txn(ctx).If( - clientv3.Compare(clientv3.ModRevision(key), "=", origState.rev), - ).Then( - clientv3.OpDelete(key), - ).Else( - clientv3.OpGet(key), - ).Commit() - if err != nil { - return err - } - if !txnResp.Succeeded { - getResp = (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange()) - glog.V(4).Infof("deletion of %s failed because of a conflict, going to retry", key) - continue - } - return decode(s.codec, s.versioner, origState.data, out, origState.rev) - } -} - -// GuaranteedUpdate implements storage.Interface.GuaranteedUpdate. -func (s *store) GuaranteedUpdate(ctx context.Context, key string, out runtime.Object, ignoreNotFound bool, precondtions *storage.Preconditions, tryUpdate storage.UpdateFunc) error { - v, err := conversion.EnforcePtr(out) - if err != nil { - panic("unable to convert output object to pointer") - } - key = keyWithPrefix(s.pathPrefix, key) - getResp, err := s.client.KV.Get(ctx, key) - if err != nil { - return err - } - for { - origState, err := s.getState(getResp, key, v, ignoreNotFound) - if err != nil { - return err - } - - if err := checkPreconditions(key, precondtions, origState.obj); err != nil { - return err - } - - ret, ttl, err := s.updateState(origState, tryUpdate) - if err != nil { - return err - } - - data, err := runtime.Encode(s.codec, ret) - if err != nil { - return err - } - if bytes.Equal(data, origState.data) { - return decode(s.codec, s.versioner, origState.data, out, origState.rev) - } - - opts, err := s.ttlOpts(ctx, int64(ttl)) - if err != nil { - return err - } - - txnResp, err := s.client.KV.Txn(ctx).If( - clientv3.Compare(clientv3.ModRevision(key), "=", origState.rev), - ).Then( - clientv3.OpPut(key, string(data), opts...), - ).Else( - clientv3.OpGet(key), - ).Commit() - if err != nil { - return err - } - if !txnResp.Succeeded { - getResp = (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange()) - glog.V(4).Infof("GuaranteedUpdate of %s failed because of a conflict, going to retry", key) - continue - } - putResp := txnResp.Responses[0].GetResponsePut() - return decode(s.codec, s.versioner, data, out, putResp.Header.Revision) - } -} - -// GetToList implements storage.Interface.GetToList. -func (s *store) GetToList(ctx context.Context, key string, filter storage.FilterFunc, listObj runtime.Object) error { - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - key = keyWithPrefix(s.pathPrefix, key) - - getResp, err := s.client.KV.Get(ctx, key) - if err != nil { - return err - } - if len(getResp.Kvs) == 0 { - return nil - } - elems := []*elemForDecode{{ - data: getResp.Kvs[0].Value, - rev: uint64(getResp.Kvs[0].ModRevision), - }} - if err := decodeList(elems, filter, listPtr, s.codec, s.versioner); err != nil { - return err - } - // update version with cluster level revision - return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision)) -} - -// List implements storage.Interface.List. -func (s *store) List(ctx context.Context, key, resourceVersion string, filter storage.FilterFunc, listObj runtime.Object) error { - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - key = keyWithPrefix(s.pathPrefix, key) - // We need to make sure the key ended with "/" so that we only get children "directories". - // e.g. if we have key "/a", "/a/b", "/ab", getting keys with prefix "/a" will return all three, - // while with prefix "/a/" will return only "/a/b" which is the correct answer. - if !strings.HasSuffix(key, "/") { - key += "/" - } - getResp, err := s.client.KV.Get(ctx, key, clientv3.WithPrefix()) - if err != nil { - return err - } - - elems := make([]*elemForDecode, len(getResp.Kvs)) - for i, kv := range getResp.Kvs { - elems[i] = &elemForDecode{ - data: kv.Value, - rev: uint64(kv.ModRevision), - } - } - if err := decodeList(elems, filter, listPtr, s.codec, s.versioner); err != nil { - return err - } - // update version with cluster level revision - return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision)) -} - -// Watch implements storage.Interface.Watch. -func (s *store) Watch(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc) (watch.Interface, error) { - return s.watch(ctx, key, resourceVersion, filter, false) -} - -// WatchList implements storage.Interface.WatchList. -func (s *store) WatchList(ctx context.Context, key string, resourceVersion string, filter storage.FilterFunc) (watch.Interface, error) { - return s.watch(ctx, key, resourceVersion, filter, true) -} - -func (s *store) watch(ctx context.Context, key string, rv string, filter storage.FilterFunc, recursive bool) (watch.Interface, error) { - rev, err := storage.ParseWatchResourceVersion(rv) - if err != nil { - return nil, err - } - key = keyWithPrefix(s.pathPrefix, key) - return s.watcher.Watch(ctx, key, int64(rev), recursive, filter) -} - -func (s *store) getState(getResp *clientv3.GetResponse, key string, v reflect.Value, ignoreNotFound bool) (*objState, error) { - state := &objState{ - obj: reflect.New(v.Type()).Interface().(runtime.Object), - meta: &storage.ResponseMeta{}, - } - if len(getResp.Kvs) == 0 { - if !ignoreNotFound { - return nil, storage.NewKeyNotFoundError(key, 0) - } - if err := runtime.SetZeroValue(state.obj); err != nil { - return nil, err - } - } else { - state.rev = getResp.Kvs[0].ModRevision - state.meta.ResourceVersion = uint64(state.rev) - state.data = getResp.Kvs[0].Value - if err := decode(s.codec, s.versioner, state.data, state.obj, state.rev); err != nil { - return nil, err - } - } - return state, nil -} - -func (s *store) updateState(st *objState, userUpdate storage.UpdateFunc) (runtime.Object, uint64, error) { - ret, ttlPtr, err := userUpdate(st.obj, *st.meta) - if err != nil { - return nil, 0, err - } - - version, err := s.versioner.ObjectResourceVersion(ret) - if err != nil { - return nil, 0, err - } - if version != 0 { - // We cannot store object with resourceVersion in etcd. We need to reset it. - if err := s.versioner.UpdateObject(ret, 0); err != nil { - return nil, 0, fmt.Errorf("UpdateObject failed: %v", err) - } - } - var ttl uint64 - if ttlPtr != nil { - ttl = *ttlPtr - } - return ret, ttl, nil -} - -// ttlOpts returns client options based on given ttl. -// ttl: if ttl is non-zero, it will attach the key to a lease with ttl of roughly the same length -func (s *store) ttlOpts(ctx context.Context, ttl int64) ([]clientv3.OpOption, error) { - if ttl == 0 { - return nil, nil - } - // TODO: one lease per ttl key is expensive. Based on current use case, we can have a long window to - // put keys within into same lease. We shall benchmark this and optimize the performance. - lcr, err := s.client.Lease.Grant(ctx, ttl) - if err != nil { - return nil, err - } - return []clientv3.OpOption{clientv3.WithLease(clientv3.LeaseID(lcr.ID))}, nil -} - -func keyWithPrefix(prefix, key string) string { - if strings.HasPrefix(key, prefix) { - return key - } - return path.Join(prefix, key) -} - -// decode decodes value of bytes into object. It will also set the object resource version to rev. -// On success, objPtr would be set to the object. -func decode(codec runtime.Codec, versioner storage.Versioner, value []byte, objPtr runtime.Object, rev int64) error { - if _, err := conversion.EnforcePtr(objPtr); err != nil { - panic("unable to convert output object to pointer") - } - _, _, err := codec.Decode(value, nil, objPtr) - if err != nil { - return err - } - // being unable to set the version does not prevent the object from being extracted - versioner.UpdateObject(objPtr, uint64(rev)) - return nil -} - -// decodeList decodes a list of values into a list of objects, with resource version set to corresponding rev. -// On success, ListPtr would be set to the list of objects. -func decodeList(elems []*elemForDecode, filter storage.FilterFunc, ListPtr interface{}, codec runtime.Codec, versioner storage.Versioner) error { - v, err := conversion.EnforcePtr(ListPtr) - if err != nil || v.Kind() != reflect.Slice { - panic("need ptr to slice") - } - for _, elem := range elems { - obj, _, err := codec.Decode(elem.data, nil, reflect.New(v.Type().Elem()).Interface().(runtime.Object)) - if err != nil { - return err - } - // being unable to set the version does not prevent the object from being extracted - versioner.UpdateObject(obj, elem.rev) - if filter(obj) { - v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem())) - } - } - return nil -} - -func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := api.ObjectMetaFor(out) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.UID { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.UID) - return storage.NewInvalidObjError(key, errMsg) - } - return nil -} - -func notFound(key string) clientv3.Cmp { - return clientv3.Compare(clientv3.ModRevision(key), "=", 0) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store_test.go deleted file mode 100644 index 4da97f602..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/store_test.go +++ /dev/null @@ -1,554 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "fmt" - "reflect" - "sync" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - - "github.com/coreos/etcd/integration" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/watch" -) - -func TestCreate(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - etcdClient := cluster.RandClient() - - key := "/testkey" - out := &api.Pod{} - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - - // verify that kv pair is empty before set - getResp, err := etcdClient.KV.Get(ctx, key) - if err != nil { - t.Fatalf("etcdClient.KV.Get failed: %v", err) - } - if len(getResp.Kvs) != 0 { - t.Fatalf("expecting empty result on key: %s", key) - } - - err = store.Create(ctx, key, obj, out, 0) - if err != nil { - t.Fatalf("Set failed: %v", err) - } - // basic tests of the output - if obj.ObjectMeta.Name != out.ObjectMeta.Name { - t.Errorf("pod name want=%s, get=%s", obj.ObjectMeta.Name, out.ObjectMeta.Name) - } - if out.ResourceVersion == "" { - t.Errorf("output should have non-empty resource version") - } - - // verify that kv pair is not empty after set - getResp, err = etcdClient.KV.Get(ctx, key) - if err != nil { - t.Fatalf("etcdClient.KV.Get failed: %v", err) - } - if len(getResp.Kvs) == 0 { - t.Fatalf("expecting non empty result on key: %s", key) - } -} - -func TestCreateWithTTL(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - - input := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - key := "/somekey" - - out := &api.Pod{} - if err := store.Create(ctx, key, input, out, 1); err != nil { - t.Fatalf("Create failed: %v", err) - } - - w, err := store.Watch(ctx, key, out.ResourceVersion, storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - testCheckResult(t, 0, watch.Deleted, w, nil) -} - -func TestCreateWithKeyExist(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - key, _ := testPropogateStore(t, store, ctx, obj) - out := &api.Pod{} - err := store.Create(ctx, key, obj, out, 0) - if err == nil || !storage.IsNodeExist(err) { - t.Errorf("expecting key exists error, but get: %s", err) - } -} - -func TestGet(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - - tests := []struct { - key string - ignoreNotFound bool - expectNotFoundErr bool - expectedOut *api.Pod - }{{ // test get on existing item - key: key, - ignoreNotFound: false, - expectNotFoundErr: false, - expectedOut: storedObj, - }, { // test get on non-existing item with ignoreNotFound=false - key: "/non-existing", - ignoreNotFound: false, - expectNotFoundErr: true, - }, { // test get on non-existing item with ignoreNotFound=true - key: "/non-existing", - ignoreNotFound: true, - expectNotFoundErr: false, - expectedOut: &api.Pod{}, - }} - - for i, tt := range tests { - out := &api.Pod{} - err := store.Get(ctx, tt.key, out, tt.ignoreNotFound) - if tt.expectNotFoundErr { - if err == nil || !storage.IsNotFound(err) { - t.Errorf("#%d: expecting not found error, but get: %s", i, err) - } - continue - } - if err != nil { - t.Fatalf("Get failed: %v", err) - } - if !reflect.DeepEqual(tt.expectedOut, out) { - t.Errorf("#%d: pod want=%#v, get=%#v", i, tt.expectedOut, out) - } - } -} - -func TestUnconditionalDelete(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - - tests := []struct { - key string - expectedObj *api.Pod - expectNotFoundErr bool - }{{ // test unconditional delete on existing key - key: key, - expectedObj: storedObj, - expectNotFoundErr: false, - }, { // test unconditional delete on non-existing key - key: "/non-existing", - expectedObj: nil, - expectNotFoundErr: true, - }} - - for i, tt := range tests { - out := &api.Pod{} // reset - err := store.Delete(ctx, tt.key, out, nil) - if tt.expectNotFoundErr { - if err == nil || !storage.IsNotFound(err) { - t.Errorf("#%d: expecting not found error, but get: %s", i, err) - } - continue - } - if err != nil { - t.Fatalf("Delete failed: %v", err) - } - if !reflect.DeepEqual(tt.expectedObj, out) { - t.Errorf("#%d: pod want=%#v, get=%#v", i, tt.expectedObj, out) - } - } -} - -func TestConditionalDelete(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}) - - tests := []struct { - precondition *storage.Preconditions - expectInvalidObjErr bool - }{{ // test conditional delete with UID match - precondition: storage.NewUIDPreconditions("A"), - expectInvalidObjErr: false, - }, { // test conditional delete with UID mismatch - precondition: storage.NewUIDPreconditions("B"), - expectInvalidObjErr: true, - }} - - for i, tt := range tests { - out := &api.Pod{} - err := store.Delete(ctx, key, out, tt.precondition) - if tt.expectInvalidObjErr { - if err == nil || !storage.IsInvalidObj(err) { - t.Errorf("#%d: expecting invalid UID error, but get: %s", i, err) - } - continue - } - if err != nil { - t.Fatalf("Delete failed: %v", err) - } - if !reflect.DeepEqual(storedObj, out) { - t.Errorf("#%d: pod want=%#v, get=%#v", i, storedObj, out) - } - key, storedObj = testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}) - } -} - -func TestGetToList(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - - tests := []struct { - key string - filter storage.FilterFunc - expectedOut []*api.Pod - }{{ // test GetToList on existing key - key: key, - filter: storage.Everything, - expectedOut: []*api.Pod{storedObj}, - }, { // test GetToList on non-existing key - key: "/non-existing", - filter: storage.Everything, - expectedOut: nil, - }, { // test GetToList with filter to reject the pod - key: "/non-existing", - filter: func(obj runtime.Object) bool { - pod, ok := obj.(*api.Pod) - if !ok { - t.Fatal("It should be able to convert obj to *api.Pod") - } - return pod.Name != storedObj.Name - }, - expectedOut: nil, - }} - - for i, tt := range tests { - out := &api.PodList{} - err := store.GetToList(ctx, tt.key, tt.filter, out) - if err != nil { - t.Fatalf("GetToList failed: %v", err) - } - if len(out.Items) != len(tt.expectedOut) { - t.Errorf("#%d: length of list want=%d, get=%d", i, len(tt.expectedOut), len(out.Items)) - continue - } - for j, wantPod := range tt.expectedOut { - getPod := &out.Items[j] - if !reflect.DeepEqual(wantPod, getPod) { - t.Errorf("#%d: pod want=%#v, get=%#v", i, wantPod, getPod) - } - } - } -} - -func TestGuaranteedUpdate(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storeObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", UID: "A"}}) - - tests := []struct { - key string - name string - ignoreNotFound bool - precondition *storage.Preconditions - expectNotFoundErr bool - expectInvalidObjErr bool - expectNoUpdate bool - }{{ // GuaranteedUpdate on non-existing key with ignoreNotFound=false - key: "/non-existing", - ignoreNotFound: false, - precondition: nil, - expectNotFoundErr: true, - expectInvalidObjErr: false, - expectNoUpdate: false, - }, { // GuaranteedUpdate on non-existing key with ignoreNotFound=true - key: "/non-existing", - ignoreNotFound: true, - precondition: nil, - expectNotFoundErr: false, - expectInvalidObjErr: false, - expectNoUpdate: false, - }, { // GuaranteedUpdate on existing key - key: key, - ignoreNotFound: false, - precondition: nil, - expectNotFoundErr: false, - expectInvalidObjErr: false, - expectNoUpdate: false, - }, { // GuaranteedUpdate with same data - key: key, - ignoreNotFound: false, - precondition: nil, - expectNotFoundErr: false, - expectInvalidObjErr: false, - expectNoUpdate: true, - }, { // GuaranteedUpdate with UID match - key: key, - ignoreNotFound: false, - precondition: storage.NewUIDPreconditions("A"), - expectNotFoundErr: false, - expectInvalidObjErr: false, - expectNoUpdate: true, - }, { // GuaranteedUpdate with UID mismatch - key: key, - ignoreNotFound: false, - precondition: storage.NewUIDPreconditions("B"), - expectNotFoundErr: false, - expectInvalidObjErr: true, - expectNoUpdate: true, - }} - - for i, tt := range tests { - out := &api.Pod{} - name := fmt.Sprintf("foo-%d", i) - if tt.expectNoUpdate { - name = storeObj.Name - } - version := storeObj.ResourceVersion - err := store.GuaranteedUpdate(ctx, tt.key, out, tt.ignoreNotFound, tt.precondition, - storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) { - if tt.expectNotFoundErr && tt.ignoreNotFound { - if pod := obj.(*api.Pod); pod.Name != "" { - t.Errorf("#%d: expecting zero value, but get=%#v", i, pod) - } - } - pod := *storeObj - pod.Name = name - return &pod, nil - })) - - if tt.expectNotFoundErr { - if err == nil || !storage.IsNotFound(err) { - t.Errorf("#%d: expecting not found error, but get: %v", i, err) - } - continue - } - if tt.expectInvalidObjErr { - if err == nil || !storage.IsInvalidObj(err) { - t.Errorf("#%d: expecting invalid UID error, but get: %s", i, err) - } - continue - } - if err != nil { - t.Fatalf("GuaranteedUpdate failed: %v", err) - } - if out.ObjectMeta.Name != name { - t.Errorf("#%d: pod name want=%s, get=%s", i, name, out.ObjectMeta.Name) - } - switch tt.expectNoUpdate { - case true: - if version != out.ResourceVersion { - t.Errorf("#%d: expect no version change, before=%s, after=%s", i, version, out.ResourceVersion) - } - case false: - if version == out.ResourceVersion { - t.Errorf("#%d: expect version change, but get the same version=%s", i, version) - } - } - storeObj = out - } -} - -func TestGuaranteedUpdateWithTTL(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - - input := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - key := "/somekey" - - out := &api.Pod{} - err := store.GuaranteedUpdate(ctx, key, out, true, nil, - func(_ runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) { - ttl := uint64(1) - return input, &ttl, nil - }) - if err != nil { - t.Fatalf("Create failed: %v", err) - } - - w, err := store.Watch(ctx, key, out.ResourceVersion, storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - testCheckResult(t, 0, watch.Deleted, w, nil) -} - -func TestGuaranteedUpdateWithConflict(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, _ := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - - errChan := make(chan error, 1) - var firstToFinish sync.WaitGroup - var secondToEnter sync.WaitGroup - firstToFinish.Add(1) - secondToEnter.Add(1) - - go func() { - err := store.GuaranteedUpdate(ctx, key, &api.Pod{}, false, nil, - storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) { - pod := obj.(*api.Pod) - pod.Name = "foo-1" - secondToEnter.Wait() - return pod, nil - })) - firstToFinish.Done() - errChan <- err - }() - - updateCount := 0 - err := store.GuaranteedUpdate(ctx, key, &api.Pod{}, false, nil, - storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) { - if updateCount == 0 { - secondToEnter.Done() - firstToFinish.Wait() - } - updateCount++ - pod := obj.(*api.Pod) - pod.Name = "foo-2" - return pod, nil - })) - if err != nil { - t.Fatalf("Second GuaranteedUpdate error %#v", err) - } - if err := <-errChan; err != nil { - t.Fatalf("First GuaranteedUpdate error %#v", err) - } - - if updateCount != 2 { - t.Errorf("Should have conflict and called update func twice") - } -} - -func TestList(t *testing.T) { - cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer cluster.Terminate(t) - store := newStore(cluster.RandClient(), testapi.Default.Codec(), "") - ctx := context.Background() - - // Setup storage with the following structure: - // / - // - one-level/ - // | - test - // | - // - two-level/ - // - 1/ - // | - test - // | - // - 2/ - // - test - preset := []struct { - key string - obj *api.Pod - storedObj *api.Pod - }{{ - key: "/one-level/test", - obj: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - }, { - key: "/two-level/1/test", - obj: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, - }, { - key: "/two-level/2/test", - obj: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}, - }} - - for i, ps := range preset { - preset[i].storedObj = &api.Pod{} - err := store.Create(ctx, ps.key, ps.obj, preset[i].storedObj, 0) - if err != nil { - t.Fatalf("Set failed: %v", err) - } - } - - tests := []struct { - prefix string - filter storage.FilterFunc - expectedOut []*api.Pod - }{{ // test List on existing key - prefix: "/one-level/", - filter: storage.Everything, - expectedOut: []*api.Pod{preset[0].storedObj}, - }, { // test List on non-existing key - prefix: "/non-existing/", - filter: storage.Everything, - expectedOut: nil, - }, { // test List with filter - prefix: "/one-level/", - filter: func(obj runtime.Object) bool { - pod, ok := obj.(*api.Pod) - if !ok { - t.Fatal("It should be able to convert obj to *api.Pod") - } - return pod.Name != preset[0].storedObj.Name - }, - expectedOut: nil, - }, { // test List with multiple levels of directories and expect flattened result - prefix: "/two-level/", - filter: storage.Everything, - expectedOut: []*api.Pod{preset[1].storedObj, preset[2].storedObj}, - }} - - for i, tt := range tests { - out := &api.PodList{} - err := store.List(ctx, tt.prefix, "0", tt.filter, out) - if err != nil { - t.Fatalf("List failed: %v", err) - } - if len(tt.expectedOut) != len(out.Items) { - t.Errorf("#%d: length of list want=%d, get=%d", i, len(tt.expectedOut), len(out.Items)) - continue - } - for j, wantPod := range tt.expectedOut { - getPod := &out.Items[j] - if !reflect.DeepEqual(wantPod, getPod) { - t.Errorf("#%d: pod want=%#v, get=%#v", i, wantPod, getPod) - } - } - } -} - -func testSetup(t *testing.T) (context.Context, *store, *integration.ClusterV3) { - cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - store := newStore(cluster.RandClient(), testapi.Default.Codec(), "") - ctx := context.Background() - return ctx, store, cluster -} - -// testPropogateStore helps propogates store with objects, automates key generation, and returns -// keys and stored objects. -func testPropogateStore(t *testing.T, store *store, ctx context.Context, obj *api.Pod) (string, *api.Pod) { - // Setup store with a key and grab the output for returning. - key := "/testkey" - setOutput := &api.Pod{} - err := store.Create(ctx, key, obj, setOutput, 0) - if err != nil { - t.Fatalf("Set failed: %v", err) - } - return key, setOutput -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go deleted file mode 100644 index 6d1490c01..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go +++ /dev/null @@ -1,340 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "fmt" - "net/http" - "strings" - "sync" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/watch" - - "github.com/coreos/etcd/clientv3" - etcdrpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" - "github.com/golang/glog" - "golang.org/x/net/context" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" -) - -const ( - // We have set a buffer in order to reduce times of context switches. - incomingBufSize = 100 - outgoingBufSize = 100 -) - -type watcher struct { - client *clientv3.Client - codec runtime.Codec - versioner storage.Versioner -} - -// watchChan implements watch.Interface. -type watchChan struct { - watcher *watcher - key string - initialRev int64 - recursive bool - filter storage.FilterFunc - ctx context.Context - cancel context.CancelFunc - incomingEventChan chan *event - resultChan chan watch.Event - errChan chan error -} - -func newWatcher(client *clientv3.Client, codec runtime.Codec, versioner storage.Versioner) *watcher { - return &watcher{ - client: client, - codec: codec, - versioner: versioner, - } -} - -// Watch watches on a key and returns a watch.Interface that transfers relevant notifications. -// If rev is zero, it will return the existing object(s) and then start watching from -// the maximum revision+1 from returned objects. -// If rev is non-zero, it will watch events happened after given revision. -// If recursive is false, it watches on given key. -// If recursive is true, it watches any children and directories under the key, excluding the root key itself. -// filter must be non-nil. Only if filter returns true will the changes be returned. -func (w *watcher) Watch(ctx context.Context, key string, rev int64, recursive bool, filter storage.FilterFunc) (watch.Interface, error) { - if recursive && !strings.HasSuffix(key, "/") { - key += "/" - } - wc := w.createWatchChan(ctx, key, rev, recursive, filter) - go wc.run() - return wc, nil -} - -func (w *watcher) createWatchChan(ctx context.Context, key string, rev int64, recursive bool, filter storage.FilterFunc) *watchChan { - wc := &watchChan{ - watcher: w, - key: key, - initialRev: rev, - recursive: recursive, - filter: filter, - incomingEventChan: make(chan *event, incomingBufSize), - resultChan: make(chan watch.Event, outgoingBufSize), - errChan: make(chan error, 1), - } - wc.ctx, wc.cancel = context.WithCancel(ctx) - return wc -} - -func (wc *watchChan) run() { - go wc.startWatching() - - var resultChanWG sync.WaitGroup - resultChanWG.Add(1) - go wc.processEvent(&resultChanWG) - - select { - case err := <-wc.errChan: - errResult := parseError(err) - wc.cancel() - // error result is guaranteed to be received by user before closing ResultChan. - if errResult != nil { - wc.resultChan <- *errResult - } - case <-wc.ctx.Done(): - } - // we need to wait until resultChan wouldn't be sent to anymore - resultChanWG.Wait() - close(wc.resultChan) -} - -func (wc *watchChan) Stop() { - wc.cancel() -} - -func (wc *watchChan) ResultChan() <-chan watch.Event { - return wc.resultChan -} - -// sync tries to retrieve existing data and send them to process. -// The revision to watch will be set to the revision in response. -func (wc *watchChan) sync() error { - opts := []clientv3.OpOption{} - if wc.recursive { - opts = append(opts, clientv3.WithPrefix()) - } - getResp, err := wc.watcher.client.Get(wc.ctx, wc.key, opts...) - if err != nil { - return err - } - wc.initialRev = getResp.Header.Revision - - for _, kv := range getResp.Kvs { - wc.sendEvent(parseKV(kv)) - } - return nil -} - -// startWatching does: -// - get current objects if initialRev=0; set initialRev to current rev -// - watch on given key and send events to process. -func (wc *watchChan) startWatching() { - if wc.initialRev == 0 { - if err := wc.sync(); err != nil { - wc.sendError(err) - return - } - } - opts := []clientv3.OpOption{clientv3.WithRev(wc.initialRev + 1)} - if wc.recursive { - opts = append(opts, clientv3.WithPrefix()) - } - wch := wc.watcher.client.Watch(wc.ctx, wc.key, opts...) - for wres := range wch { - if wres.Err() != nil { - // If there is an error on server (e.g. compaction), the channel will return it before closed. - wc.sendError(wres.Err()) - return - } - for _, e := range wres.Events { - wc.sendEvent(parseEvent(e)) - } - } -} - -// processEvent processes events from etcd watcher and sends results to resultChan. -func (wc *watchChan) processEvent(wg *sync.WaitGroup) { - defer wg.Done() - - for { - select { - case e := <-wc.incomingEventChan: - res := wc.transform(e) - if res == nil { - continue - } - // If user couldn't receive results fast enough, we also block incoming events from watcher. - // Because storing events in local will cause more memory usage. - // The worst case would be closing the fast watcher. - select { - case wc.resultChan <- *res: - case <-wc.ctx.Done(): - return - } - case <-wc.ctx.Done(): - return - } - } -} - -// transform transforms an event into a result for user if not filtered. -// TODO (Optimization): -// - Save remote round-trip. -// Currently, DELETE and PUT event don't contain the previous value. -// We need to do another Get() in order to get previous object and have logic upon it. -// We could potentially do some optimizations: -// - For PUT, we can save current and previous objects into the value. -// - For DELETE, See https://github.com/coreos/etcd/issues/4620 -func (wc *watchChan) transform(e *event) (res *watch.Event) { - curObj, oldObj, err := prepareObjs(wc.ctx, e, wc.watcher.client, wc.watcher.codec, wc.watcher.versioner) - if err != nil { - wc.sendError(err) - return nil - } - - switch { - case e.isDeleted: - if !wc.filter(oldObj) { - return nil - } - res = &watch.Event{ - Type: watch.Deleted, - Object: oldObj, - } - case e.isCreated: - if !wc.filter(curObj) { - return nil - } - res = &watch.Event{ - Type: watch.Added, - Object: curObj, - } - default: - curObjPasses := wc.filter(curObj) - oldObjPasses := wc.filter(oldObj) - switch { - case curObjPasses && oldObjPasses: - res = &watch.Event{ - Type: watch.Modified, - Object: curObj, - } - case curObjPasses && !oldObjPasses: - res = &watch.Event{ - Type: watch.Added, - Object: curObj, - } - case !curObjPasses && oldObjPasses: - res = &watch.Event{ - Type: watch.Deleted, - Object: oldObj, - } - } - } - return res -} - -func parseError(err error) *watch.Event { - var status *unversioned.Status - switch { - case err == etcdrpc.ErrCompacted: - status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Message: err.Error(), - Code: http.StatusGone, - Reason: unversioned.StatusReasonExpired, - } - default: - status = &unversioned.Status{ - Status: unversioned.StatusFailure, - Message: err.Error(), - Code: http.StatusInternalServerError, - Reason: unversioned.StatusReasonInternalError, - } - } - - return &watch.Event{ - Type: watch.Error, - Object: status, - } -} - -func (wc *watchChan) sendError(err error) { - // Context.canceled is an expected behavior. - // We should just stop all goroutines in watchChan without returning error. - // TODO: etcd client should return context.Canceled instead of grpc specific error. - if grpc.Code(err) == codes.Canceled || err == context.Canceled { - return - } - select { - case wc.errChan <- err: - case <-wc.ctx.Done(): - } -} - -func (wc *watchChan) sendEvent(e *event) { - if len(wc.incomingEventChan) == incomingBufSize { - glog.V(2).Infof("Fast watcher, slow processing. Number of buffered events: %d."+ - "Probably caused by slow decoding, user not receiving fast, or other processing logic", - incomingBufSize) - } - select { - case wc.incomingEventChan <- e: - case <-wc.ctx.Done(): - } -} - -func prepareObjs(ctx context.Context, e *event, client *clientv3.Client, codec runtime.Codec, versioner storage.Versioner) (curObj runtime.Object, oldObj runtime.Object, err error) { - if !e.isDeleted { - curObj, err = decodeObj(codec, versioner, e.value, e.rev) - if err != nil { - return nil, nil, err - } - } - if e.isDeleted || !e.isCreated { - getResp, err := client.Get(ctx, e.key, clientv3.WithRev(e.rev-1)) - if err != nil { - return nil, nil, err - } - oldObj, err = decodeObj(codec, versioner, getResp.Kvs[0].Value, getResp.Kvs[0].ModRevision) - if err != nil { - return nil, nil, err - } - } - return curObj, oldObj, nil -} - -func decodeObj(codec runtime.Codec, versioner storage.Versioner, data []byte, rev int64) (runtime.Object, error) { - obj, err := runtime.Decode(codec, []byte(data)) - if err != nil { - return nil, err - } - // ensure resource version is set on the object we load from etcd - if err := versioner.UpdateObject(obj, uint64(rev)); err != nil { - return nil, fmt.Errorf("failure to version api object (%d) %#v: %v", rev, obj, err) - } - return obj, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher_test.go deleted file mode 100644 index 66578e56c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/etcd3/watcher_test.go +++ /dev/null @@ -1,235 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 etcd3 - -import ( - "errors" - "reflect" - "testing" - "time" - - "github.com/coreos/etcd/integration" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -func TestWatch(t *testing.T) { - testWatch(t, false) -} - -func TestWatchList(t *testing.T) { - testWatch(t, true) -} - -// It tests that -// - first occurrence of objects should notify Add event -// - -func testWatch(t *testing.T, recursive bool) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - - podFoo := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - podBar := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}} - - tests := []struct { - key string - filter storage.FilterFunc - watchTests []*testWatchStruct - }{{ // create a key - key: "/somekey-1", - watchTests: []*testWatchStruct{{podFoo, true, watch.Added}}, - filter: storage.Everything, - }, { // create a key but obj gets filtered - key: "/somekey-2", - watchTests: []*testWatchStruct{{podFoo, false, ""}}, - filter: func(runtime.Object) bool { return false }, - }, { // create a key but obj gets filtered. Then update it with unfiltered obj - key: "/somekey-3", - watchTests: []*testWatchStruct{{podFoo, false, ""}, {podBar, true, watch.Added}}, - filter: func(obj runtime.Object) bool { - pod := obj.(*api.Pod) - return pod.Name == "bar" - }, - }, { // update - key: "/somekey-4", - watchTests: []*testWatchStruct{{podFoo, true, watch.Added}, {podBar, true, watch.Modified}}, - filter: storage.Everything, - }, { // delete because of being filtered - key: "/somekey-5", - watchTests: []*testWatchStruct{{podFoo, true, watch.Added}, {podBar, true, watch.Deleted}}, - filter: func(obj runtime.Object) bool { - pod := obj.(*api.Pod) - return pod.Name != "bar" - }, - }} - for i, tt := range tests { - w, err := store.watch(ctx, tt.key, "0", tt.filter, recursive) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - for _, watchTest := range tt.watchTests { - out := &api.Pod{} - key := tt.key - if recursive { - key = key + "/item" - } - err := store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( - func(runtime.Object) (runtime.Object, error) { - return watchTest.obj, nil - })) - if err != nil { - t.Fatalf("GuaranteedUpdate failed: %v", err) - } - if watchTest.expectEvent { - testCheckResult(t, i, watchTest.watchType, w, nil) - } - } - w.Stop() - testCheckStop(t, i, w) - } -} - -func TestDeleteTriggerWatch(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - w, err := store.Watch(ctx, key, storedObj.ResourceVersion, storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - if err := store.Delete(ctx, key, &api.Pod{}, nil); err != nil { - t.Fatalf("Delete failed: %v", err) - } - testCheckResult(t, 0, watch.Deleted, w, storedObj) -} - -// TestWatchSync tests that -// - watch from 0 should sync up and grab the object added before -// - watch from non-0 should just watch changes after given version -func TestWatchFromZeroAndNoneZero(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - key, storedObj := testPropogateStore(t, store, ctx, &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - - w, err := store.Watch(ctx, key, "0", storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - testCheckResult(t, 0, watch.Added, w, storedObj) - w.Stop() - testCheckStop(t, 0, w) - - w, err = store.Watch(ctx, key, storedObj.ResourceVersion, storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - out := &api.Pod{} - store.GuaranteedUpdate(ctx, key, out, true, nil, storage.SimpleUpdate( - func(runtime.Object) (runtime.Object, error) { - return &api.Pod{ObjectMeta: api.ObjectMeta{Name: "bar"}}, err - })) - testCheckResult(t, 0, watch.Modified, w, out) -} - -func TestWatchError(t *testing.T) { - cluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) - defer cluster.Terminate(t) - invalidStore := newStore(cluster.RandClient(), &testCodec{testapi.Default.Codec()}, "") - ctx := context.Background() - w, err := invalidStore.Watch(ctx, "/abc", "0", storage.Everything) - if err != nil { - t.Fatalf("Watch failed: %v", err) - } - validStore := newStore(cluster.RandClient(), testapi.Default.Codec(), "") - validStore.GuaranteedUpdate(ctx, "/abc", &api.Pod{}, true, nil, storage.SimpleUpdate( - func(runtime.Object) (runtime.Object, error) { - return &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}, nil - })) - testCheckResult(t, 0, watch.Error, w, nil) -} - -func TestWatchContextCancel(t *testing.T) { - ctx, store, cluster := testSetup(t) - defer cluster.Terminate(t) - canceledCtx, cancel := context.WithCancel(ctx) - cancel() - w := store.watcher.createWatchChan(canceledCtx, "/abc", 0, false, storage.Everything) - // When we do a client.Get with a canceled context, it will return error. - // Nonetheless, when we try to send it over internal errChan, we should detect - // it's context canceled and not send it. - err := w.sync() - w.ctx = ctx - w.sendError(err) - select { - case err := <-w.errChan: - t.Errorf("cancelling context shouldn't return any error. Err: %v", err) - default: - } -} - -type testWatchStruct struct { - obj *api.Pod - expectEvent bool - watchType watch.EventType -} - -type testCodec struct { - runtime.Codec -} - -func (c *testCodec) Decode(data []byte, defaults *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { - return nil, nil, errors.New("Expected decoding failure") -} - -func testCheckResult(t *testing.T, i int, expectEventType watch.EventType, w watch.Interface, expectObj *api.Pod) { - select { - case res := <-w.ResultChan(): - if res.Type != expectEventType { - t.Errorf("#%d: event type want=%v, get=%v", i, expectEventType, res.Type) - return - } - if expectObj != nil && !reflect.DeepEqual(expectObj, res.Object) { - t.Errorf("#%d: obj want=\n%#v\nget=\n%#v", i, expectObj, res.Object) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("#%d: time out after waiting %v on ResultChan", i, wait.ForeverTestTimeout) - } -} - -func testCheckStop(t *testing.T, i int, w watch.Interface) { - select { - case e, ok := <-w.ResultChan(): - if ok { - var obj string - switch e.Object.(type) { - case *api.Pod: - obj = e.Object.(*api.Pod).Name - case *unversioned.Status: - obj = e.Object.(*unversioned.Status).Message - } - t.Errorf("#%d: ResultChan should have been closed. Event: %s. Object: %s", i, e.Type, obj) - } - case <-time.After(wait.ForeverTestTimeout): - t.Errorf("#%d: time out after waiting 1s on ResultChan", i) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/config.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/config.go deleted file mode 100644 index 6d3b127e7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/config.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 storagebackend - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" -) - -const ( - StorageTypeUnset = "" - StorageTypeETCD2 = "etcd2" - StorageTypeETCD3 = "etcd3" -) - -// Config is configuration for creating a storage backend. -type Config struct { - // Type defines the type of storage backend, e.g. "etcd2", etcd3". Default ("") is "etcd2". - Type string - // Codec is used to serialize/deserialize objects. - Codec runtime.Codec - // Prefix is the prefix to all keys passed to storage.Interface methods. - Prefix string - // ServerList is the list of storage servers to connect with. - ServerList []string - // TLS credentials - KeyFile string - CertFile string - CAFile string - // Quorum indicates that whether read operations should be quorum-level consistent. - Quorum bool - // DeserializationCacheSize is the size of cache of deserialized objects. - // Currently this is only supported in etcd2. - // We will drop the cache once using protobuf. - DeserializationCacheSize int -} - -// Create creates a storage backend based on given config. -func Create(c Config) (storage.Interface, error) { - switch c.Type { - case StorageTypeUnset, StorageTypeETCD2: - return newETCD2Storage(c) - case StorageTypeETCD3: - // TODO: We have the following features to implement: - // - Support secure connection by using key, cert, and CA files. - // - Honor "https" scheme to support secure connection in gRPC. - // - Support non-quorum read. - return newETCD3Storage(c) - default: - return nil, fmt.Errorf("unknown storage type: %s", c.Type) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etcd3.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etcd3.go deleted file mode 100644 index 7699eec7b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etcd3.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 storagebackend - -import ( - "strings" - - "github.com/coreos/etcd/clientv3" - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd3" -) - -func newETCD3Storage(c Config) (storage.Interface, error) { - endpoints := c.ServerList - for i, s := range endpoints { - endpoints[i] = strings.TrimLeft(s, "http://") - } - cfg := clientv3.Config{ - Endpoints: endpoints, - } - client, err := clientv3.New(cfg) - if err != nil { - return nil, err - } - etcd3.StartCompactor(context.Background(), client) - return etcd3.New(client, c.Codec, c.Prefix), nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etdc2.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etdc2.go deleted file mode 100644 index b1176042e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/storagebackend/etdc2.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 storagebackend - -import ( - "net" - "net/http" - "time" - - etcd2client "github.com/coreos/etcd/client" - "github.com/coreos/etcd/pkg/transport" - "k8s.io/kubernetes/pkg/storage" - "k8s.io/kubernetes/pkg/storage/etcd" - utilnet "k8s.io/kubernetes/pkg/util/net" -) - -func newETCD2Storage(c Config) (storage.Interface, error) { - tr, err := newTransportForETCD2(c.CertFile, c.KeyFile, c.CAFile) - if err != nil { - return nil, err - } - client, err := newETCD2Client(tr, c.ServerList) - if err != nil { - return nil, err - } - return etcd.NewEtcdStorage(client, c.Codec, c.Prefix, c.Quorum, c.DeserializationCacheSize), nil -} - -func newETCD2Client(tr *http.Transport, serverList []string) (etcd2client.Client, error) { - cli, err := etcd2client.New(etcd2client.Config{ - Endpoints: serverList, - Transport: tr, - }) - if err != nil { - return nil, err - } - - return cli, nil -} - -func newTransportForETCD2(certFile, keyFile, caFile string) (*http.Transport, error) { - info := transport.TLSInfo{ - CertFile: certFile, - KeyFile: keyFile, - CAFile: caFile, - } - cfg, err := info.ClientConfig() - if err != nil { - return nil, err - } - // Copied from etcd.DefaultTransport declaration. - // TODO: Determine if transport needs optimization - tr := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - MaxIdleConnsPerHost: 500, - TLSClientConfig: cfg, - }) - return tr, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.generated.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.generated.go deleted file mode 100644 index 0bdb64f47..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.generated.go +++ /dev/null @@ -1,365 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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. -*/ - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED BY codecgen. -// ************************************************************ - -package testing - -import ( - "errors" - "fmt" - codec1978 "github.com/ugorji/go/codec" - pkg2_api "k8s.io/kubernetes/pkg/api" - pkg1_unversioned "k8s.io/kubernetes/pkg/api/unversioned" - pkg3_types "k8s.io/kubernetes/pkg/types" - "reflect" - "runtime" - time "time" -) - -const ( - // ----- content types ---- - codecSelferC_UTF81234 = 1 - codecSelferC_RAW1234 = 0 - // ----- value types used ---- - codecSelferValueTypeArray1234 = 10 - codecSelferValueTypeMap1234 = 9 - // ----- containerStateValues ---- - codecSelfer_containerMapKey1234 = 2 - codecSelfer_containerMapValue1234 = 3 - codecSelfer_containerMapEnd1234 = 4 - codecSelfer_containerArrayElem1234 = 6 - codecSelfer_containerArrayEnd1234 = 7 -) - -var ( - codecSelferBitsize1234 = uint8(reflect.TypeOf(uint(0)).Bits()) - codecSelferOnlyMapOrArrayEncodeToStructErr1234 = errors.New(`only encoded map or array can be decoded into a struct`) -) - -type codecSelfer1234 struct{} - -func init() { - if codec1978.GenVersion != 5 { - _, file, _, _ := runtime.Caller(0) - err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", - 5, codec1978.GenVersion, file) - panic(err) - } - if false { // reference the types, but skip this branch at build/run time - var v0 pkg2_api.ObjectMeta - var v1 pkg1_unversioned.TypeMeta - var v2 pkg3_types.UID - var v3 time.Time - _, _, _, _ = v0, v1, v2, v3 - } -} - -func (x *TestResource) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [4]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - yyq2[2] = x.Kind != "" - yyq2[3] = x.APIVersion != "" - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(4) - } else { - yynn2 = 2 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yy4 := &x.ObjectMeta - yy4.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("metadata")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yy6 := &x.ObjectMeta - yy6.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yym9 := z.EncBinary() - _ = yym9 - if false { - } else { - r.EncodeInt(int64(x.Value)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("value")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - r.EncodeInt(int64(x.Value)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[2] { - yym12 := z.EncBinary() - _ = yym12 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) - } - } else { - r.EncodeString(codecSelferC_UTF81234, "") - } - } else { - if yyq2[2] { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("kind")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym13 := z.EncBinary() - _ = yym13 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem1234) - if yyq2[3] { - yym15 := z.EncBinary() - _ = yym15 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) - } - } else { - r.EncodeString(codecSelferC_UTF81234, "") - } - } else { - if yyq2[3] { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym16 := z.EncBinary() - _ = yym16 - if false { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd1234) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd1234) - } - } - } -} - -func (x *TestResource) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap1234 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd1234) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray1234 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) - } - } -} - -func (x *TestResource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey1234) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3 := string(yys3Slc) - z.DecSendContainerState(codecSelfer_containerMapValue1234) - switch yys3 { - case "metadata": - if r.TryDecodeAsNil() { - x.ObjectMeta = pkg2_api.ObjectMeta{} - } else { - yyv4 := &x.ObjectMeta - yyv4.CodecDecodeSelf(d) - } - case "value": - if r.TryDecodeAsNil() { - x.Value = 0 - } else { - x.Value = int(r.DecodeInt(codecSelferBitsize1234)) - } - case "kind": - if r.TryDecodeAsNil() { - x.Kind = "" - } else { - x.Kind = string(r.DecodeString()) - } - case "apiVersion": - if r.TryDecodeAsNil() { - x.APIVersion = "" - } else { - x.APIVersion = string(r.DecodeString()) - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd1234) -} - -func (x *TestResource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer1234 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.ObjectMeta = pkg2_api.ObjectMeta{} - } else { - yyv9 := &x.ObjectMeta - yyv9.CodecDecodeSelf(d) - } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Value = 0 - } else { - x.Value = int(r.DecodeInt(codecSelferBitsize1234)) - } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.Kind = "" - } else { - x.Kind = string(r.DecodeString()) - } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.APIVersion = "" - } else { - x.APIVersion = string(r.DecodeString()) - } - for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj8-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.go deleted file mode 100644 index a1377aa04..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/types.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" -) - -type TestResource struct { - unversioned.TypeMeta `json:",inline"` - api.ObjectMeta `json:"metadata"` - Value int `json:"value"` -} - -func (obj *TestResource) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/utils.go deleted file mode 100644 index 8858e3300..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/testing/utils.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import ( - "path" - - "golang.org/x/net/context" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" -) - -// CreateObj will create a single object using the storage interface -func CreateObj(helper storage.Interface, name string, obj, out runtime.Object, ttl uint64) error { - return helper.Create(context.TODO(), name, obj, out, ttl) -} - -//CreateObjList will create a list from the array of objects -func CreateObjList(prefix string, helper storage.Interface, items []runtime.Object) error { - for i := range items { - obj := items[i] - meta, err := meta.Accessor(obj) - if err != nil { - return err - } - err = CreateObj(helper, path.Join(prefix, meta.GetName()), obj, obj, 0) - if err != nil { - return err - } - items[i] = obj - } - return nil -} - -// CreateList will properly create a list using the storage interface -func CreateList(prefix string, helper storage.Interface, list runtime.Object) error { - items, err := meta.ExtractList(list) - if err != nil { - return err - } - err = CreateObjList(prefix, helper, items) - if err != nil { - return err - } - return meta.SetList(list, items) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/util_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/util_test.go deleted file mode 100644 index 7d0675cce..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/util_test.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 storage - -import "testing" - -func TestEtcdParseWatchResourceVersion(t *testing.T) { - testCases := []struct { - Version string - ExpectVersion uint64 - Err bool - }{ - {Version: "", ExpectVersion: 0}, - {Version: "a", Err: true}, - {Version: " ", Err: true}, - {Version: "1", ExpectVersion: 1}, - {Version: "10", ExpectVersion: 10}, - } - for _, testCase := range testCases { - version, err := ParseWatchResourceVersion(testCase.Version) - switch { - case testCase.Err: - if err == nil { - t.Errorf("%s: unexpected non-error", testCase.Version) - continue - } - if !IsInvalidError(err) { - t.Errorf("%s: unexpected error: %v", testCase.Version, err) - continue - } - case !testCase.Err && err != nil: - t.Errorf("%s: unexpected error: %v", testCase.Version, err) - continue - } - if version != testCase.ExpectVersion { - t.Errorf("%s: expected version %d but was %d", testCase.Version, testCase.ExpectVersion, version) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/watch_cache_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/watch_cache_test.go deleted file mode 100644 index 8d9327e3c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/storage/watch_cache_test.go +++ /dev/null @@ -1,334 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 storage - -import ( - "strconv" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/cache" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -func makeTestPod(name string, resourceVersion uint64) *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: "ns", - Name: name, - ResourceVersion: strconv.FormatUint(resourceVersion, 10), - }, - } -} - -// newTestWatchCache just adds a fake clock. -func newTestWatchCache(capacity int) *watchCache { - wc := newWatchCache(capacity) - wc.clock = util.NewFakeClock(time.Now()) - return wc -} - -func TestWatchCacheBasic(t *testing.T) { - store := newTestWatchCache(2) - - // Test Add/Update/Delete. - pod1 := makeTestPod("pod", 1) - if err := store.Add(pod1); err != nil { - t.Errorf("unexpected error: %v", err) - } - if item, ok, _ := store.Get(pod1); !ok { - t.Errorf("didn't find pod") - } else { - if !api.Semantic.DeepEqual(pod1, item) { - t.Errorf("expected %v, got %v", pod1, item) - } - } - pod2 := makeTestPod("pod", 2) - if err := store.Update(pod2); err != nil { - t.Errorf("unexpected error: %v", err) - } - if item, ok, _ := store.Get(pod2); !ok { - t.Errorf("didn't find pod") - } else { - if !api.Semantic.DeepEqual(pod2, item) { - t.Errorf("expected %v, got %v", pod1, item) - } - } - pod3 := makeTestPod("pod", 3) - if err := store.Delete(pod3); err != nil { - t.Errorf("unexpected error: %v", err) - } - if _, ok, _ := store.Get(pod3); ok { - t.Errorf("found pod") - } - - // Test List. - store.Add(makeTestPod("pod1", 4)) - store.Add(makeTestPod("pod2", 5)) - store.Add(makeTestPod("pod3", 6)) - { - podNames := sets.String{} - for _, item := range store.List() { - podNames.Insert(item.(*api.Pod).ObjectMeta.Name) - } - if !podNames.HasAll("pod1", "pod2", "pod3") { - t.Errorf("missing pods, found %v", podNames) - } - if len(podNames) != 3 { - t.Errorf("found missing/extra items") - } - } - - // Test Replace. - store.Replace([]interface{}{ - makeTestPod("pod4", 7), - makeTestPod("pod5", 8), - }, "8") - { - podNames := sets.String{} - for _, item := range store.List() { - podNames.Insert(item.(*api.Pod).ObjectMeta.Name) - } - if !podNames.HasAll("pod4", "pod5") { - t.Errorf("missing pods, found %v", podNames) - } - if len(podNames) != 2 { - t.Errorf("found missing/extra items") - } - } -} - -func TestEvents(t *testing.T) { - store := newTestWatchCache(5) - - store.Add(makeTestPod("pod", 3)) - - // Test for Added event. - { - _, err := store.GetAllEventsSince(1) - if err == nil { - t.Errorf("expected error too old") - } - if _, ok := err.(*errors.StatusError); !ok { - t.Errorf("expected error to be of type StatusError") - } - } - { - result, err := store.GetAllEventsSince(2) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(result) != 1 { - t.Fatalf("unexpected events: %v", result) - } - if result[0].Type != watch.Added { - t.Errorf("unexpected event type: %v", result[0].Type) - } - pod := makeTestPod("pod", uint64(3)) - if !api.Semantic.DeepEqual(pod, result[0].Object) { - t.Errorf("unexpected item: %v, expected: %v", result[0].Object, pod) - } - if result[0].PrevObject != nil { - t.Errorf("unexpected item: %v", result[0].PrevObject) - } - } - - store.Update(makeTestPod("pod", 4)) - store.Update(makeTestPod("pod", 5)) - - // Test with not full cache. - { - _, err := store.GetAllEventsSince(1) - if err == nil { - t.Errorf("expected error too old") - } - } - { - result, err := store.GetAllEventsSince(3) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(result) != 2 { - t.Fatalf("unexpected events: %v", result) - } - for i := 0; i < 2; i++ { - if result[i].Type != watch.Modified { - t.Errorf("unexpected event type: %v", result[i].Type) - } - pod := makeTestPod("pod", uint64(i+4)) - if !api.Semantic.DeepEqual(pod, result[i].Object) { - t.Errorf("unexpected item: %v, expected: %v", result[i].Object, pod) - } - prevPod := makeTestPod("pod", uint64(i+3)) - if !api.Semantic.DeepEqual(prevPod, result[i].PrevObject) { - t.Errorf("unexpected item: %v, expected: %v", result[i].PrevObject, prevPod) - } - } - } - - for i := 6; i < 10; i++ { - store.Update(makeTestPod("pod", uint64(i))) - } - - // Test with full cache - there should be elements from 5 to 9. - { - _, err := store.GetAllEventsSince(3) - if err == nil { - t.Errorf("expected error too old") - } - } - { - result, err := store.GetAllEventsSince(4) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(result) != 5 { - t.Fatalf("unexpected events: %v", result) - } - for i := 0; i < 5; i++ { - pod := makeTestPod("pod", uint64(i+5)) - if !api.Semantic.DeepEqual(pod, result[i].Object) { - t.Errorf("unexpected item: %v, expected: %v", result[i].Object, pod) - } - } - } - - // Test for delete event. - store.Delete(makeTestPod("pod", uint64(10))) - - { - result, err := store.GetAllEventsSince(9) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if len(result) != 1 { - t.Fatalf("unexpected events: %v", result) - } - if result[0].Type != watch.Deleted { - t.Errorf("unexpected event type: %v", result[0].Type) - } - pod := makeTestPod("pod", uint64(10)) - if !api.Semantic.DeepEqual(pod, result[0].Object) { - t.Errorf("unexpected item: %v, expected: %v", result[0].Object, pod) - } - prevPod := makeTestPod("pod", uint64(9)) - if !api.Semantic.DeepEqual(prevPod, result[0].PrevObject) { - t.Errorf("unexpected item: %v, expected: %v", result[0].PrevObject, prevPod) - } - } -} - -func TestWaitUntilFreshAndList(t *testing.T) { - store := newTestWatchCache(3) - - // In background, update the store. - go func() { - store.Add(makeTestPod("foo", 2)) - store.Add(makeTestPod("bar", 5)) - }() - - list, resourceVersion, err := store.WaitUntilFreshAndList(5) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if resourceVersion != 5 { - t.Errorf("unexpected resourceVersion: %v, expected: 5", resourceVersion) - } - if len(list) != 2 { - t.Errorf("unexpected list returned: %#v", list) - } -} - -func TestWaitUntilFreshAndListTimeout(t *testing.T) { - store := newTestWatchCache(3) - fc := store.clock.(*util.FakeClock) - - // In background, step clock after the below call starts the timer. - go func() { - for !fc.HasWaiters() { - time.Sleep(time.Millisecond) - } - fc.Step(MaximumListWait) - - // Add an object to make sure the test would - // eventually fail instead of just waiting - // forever. - time.Sleep(30 * time.Second) - store.Add(makeTestPod("bar", 5)) - }() - - _, _, err := store.WaitUntilFreshAndList(5) - if err == nil { - t.Fatalf("unexpected lack of timeout error") - } -} - -type testLW struct { - ListFunc func(options api.ListOptions) (runtime.Object, error) - WatchFunc func(options api.ListOptions) (watch.Interface, error) -} - -func (t *testLW) List(options api.ListOptions) (runtime.Object, error) { - return t.ListFunc(options) -} -func (t *testLW) Watch(options api.ListOptions) (watch.Interface, error) { - return t.WatchFunc(options) -} - -func TestReflectorForWatchCache(t *testing.T) { - store := newTestWatchCache(5) - - { - _, version, err := store.WaitUntilFreshAndList(0) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != 0 { - t.Errorf("unexpected resource version: %d", version) - } - } - - lw := &testLW{ - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - fw := watch.NewFake() - go fw.Stop() - return fw, nil - }, - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "10"}}, nil - }, - } - r := cache.NewReflector(lw, &api.Pod{}, store, 0) - r.ListAndWatch(wait.NeverStop) - - { - _, version, err := store.WaitUntilFreshAndList(10) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if version != 10 { - t.Errorf("unexpected resource version: %d", version) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value.go deleted file mode 100644 index a9bc8cd81..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 atomic - -import ( - "sync" -) - -// TODO(ArtfulCoder) -// sync/atomic/Value was added in golang 1.4 -// Once support is dropped for go 1.3, this type must be deprecated in favor of sync/atomic/Value. -// The functions are named Load/Store to match sync/atomic/Value function names. -type Value struct { - value interface{} - valueMutex sync.RWMutex -} - -func (at *Value) Store(val interface{}) { - at.valueMutex.Lock() - defer at.valueMutex.Unlock() - at.value = val -} - -func (at *Value) Load() interface{} { - at.valueMutex.RLock() - defer at.valueMutex.RUnlock() - return at.value -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value_test.go deleted file mode 100644 index 052b35082..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/atomic/value_test.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 atomic - -import ( - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/wait" -) - -func ExpectValue(t *testing.T, atomicValue *Value, expectedValue interface{}) { - actualValue := atomicValue.Load() - if actualValue != expectedValue { - t.Errorf("Expected to find %v, found %v", expectedValue, actualValue) - } - ch := make(chan interface{}) - go func() { - ch <- atomicValue.Load() - }() - select { - case actualValue = <-ch: - if actualValue != expectedValue { - t.Errorf("Expected to find %v, found %v", expectedValue, actualValue) - return - } - case <-time.After(wait.ForeverTestTimeout): - t.Error("Value could not be read") - return - } -} - -func TestAtomicValue(t *testing.T) { - atomicValue := &Value{} - ExpectValue(t, atomicValue, nil) - atomicValue.Store(10) - ExpectValue(t, atomicValue, 10) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/doc.go deleted file mode 100644 index 5ae73e8be..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth provides utilities for bandwidth shaping -package bandwidth diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/fake_shaper.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/fake_shaper.go deleted file mode 100644 index 12798bde1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/fake_shaper.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import ( - "errors" - - "k8s.io/kubernetes/pkg/api/resource" -) - -type FakeShaper struct { - CIDRs []string - ResetCIDRs []string -} - -func (f *FakeShaper) Limit(cidr string, egress, ingress *resource.Quantity) error { - return errors.New("unimplemented") -} - -func (f *FakeShaper) Reset(cidr string) error { - f.ResetCIDRs = append(f.ResetCIDRs, cidr) - return nil -} - -func (f *FakeShaper) ReconcileInterface() error { - return errors.New("unimplemented") -} - -func (f *FakeShaper) ReconcileCIDR(cidr string, egress, ingress *resource.Quantity) error { - return errors.New("unimplemented") -} - -func (f *FakeShaper) GetCIDRs() ([]string, error) { - return f.CIDRs, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/interfaces.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/interfaces.go deleted file mode 100644 index 62b20d87d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/interfaces.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import "k8s.io/kubernetes/pkg/api/resource" - -type BandwidthShaper interface { - // Limit the bandwidth for a particular CIDR on a particular interface - // * ingress and egress are in bits/second - // * cidr is expected to be a valid network CIDR (e.g. '1.2.3.4/32' or '10.20.0.1/16') - // 'egress' bandwidth limit applies to all packets on the interface whose source matches 'cidr' - // 'ingress' bandwidth limit applies to all packets on the interface whose destination matches 'cidr' - // Limits are aggregate limits for the CIDR, not per IP address. CIDRs must be unique, but can be overlapping, traffic - // that matches multiple CIDRs counts against all limits. - Limit(cidr string, egress, ingress *resource.Quantity) error - // Remove a bandwidth limit for a particular CIDR on a particular network interface - Reset(cidr string) error - // Reconcile the interface managed by this shaper with the state on the ground. - ReconcileInterface() error - // Reconcile a CIDR managed by this shaper with the state on the ground - ReconcileCIDR(cidr string, egress, ingress *resource.Quantity) error - // GetCIDRs returns the set of CIDRs that are being managed by this shaper - GetCIDRs() ([]string, error) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux.go deleted file mode 100644 index edb480c69..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux.go +++ /dev/null @@ -1,322 +0,0 @@ -// +build linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import ( - "bufio" - "bytes" - "encoding/hex" - "fmt" - "net" - "strings" - - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/util/exec" - "k8s.io/kubernetes/pkg/util/sets" - - "github.com/golang/glog" -) - -// tcShaper provides an implementation of the BandwidthShaper interface on Linux using the 'tc' tool. -// In general, using this requires that the caller posses the NET_CAP_ADMIN capability, though if you -// do this within an container, it only requires the NS_CAPABLE capability for manipulations to that -// container's network namespace. -// Uses the hierarchical token bucket queuing discipline (htb), this requires Linux 2.4.20 or newer -// or a custom kernel with that queuing discipline backported. -type tcShaper struct { - e exec.Interface - iface string -} - -func NewTCShaper(iface string) BandwidthShaper { - shaper := &tcShaper{ - e: exec.New(), - iface: iface, - } - return shaper -} - -func (t *tcShaper) execAndLog(cmdStr string, args ...string) error { - glog.V(6).Infof("Running: %s %s", cmdStr, strings.Join(args, " ")) - cmd := t.e.Command(cmdStr, args...) - out, err := cmd.CombinedOutput() - glog.V(6).Infof("Output from tc: %s", string(out)) - return err -} - -func (t *tcShaper) nextClassID() (int, error) { - data, err := t.e.Command("tc", "class", "show", "dev", t.iface).CombinedOutput() - if err != nil { - return -1, err - } - - scanner := bufio.NewScanner(bytes.NewBuffer(data)) - classes := sets.String{} - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - // skip empty lines - if len(line) == 0 { - continue - } - parts := strings.Split(line, " ") - // expected tc line: - // class htb 1:1 root prio 0 rate 1000Kbit ceil 1000Kbit burst 1600b cburst 1600b - if len(parts) != 14 { - return -1, fmt.Errorf("unexpected output from tc: %s (%v)", scanner.Text(), parts) - } - classes.Insert(parts[2]) - } - - // Make sure it doesn't go forever - for nextClass := 1; nextClass < 10000; nextClass++ { - if !classes.Has(fmt.Sprintf("1:%d", nextClass)) { - return nextClass, nil - } - } - // This should really never happen - return -1, fmt.Errorf("exhausted class space, please try again") -} - -// Convert a CIDR from text to a hex representation -// Strips any masked parts of the IP, so 1.2.3.4/16 becomes hex(1.2.0.0)/ffffffff -func hexCIDR(cidr string) (string, error) { - ip, ipnet, err := net.ParseCIDR(cidr) - if err != nil { - return "", err - } - ip = ip.Mask(ipnet.Mask) - hexIP := hex.EncodeToString([]byte(ip.To4())) - hexMask := ipnet.Mask.String() - return hexIP + "/" + hexMask, nil -} - -// Convert a CIDR from hex representation to text, opposite of the above. -func asciiCIDR(cidr string) (string, error) { - parts := strings.Split(cidr, "/") - if len(parts) != 2 { - return "", fmt.Errorf("unexpected CIDR format: %s", cidr) - } - ipData, err := hex.DecodeString(parts[0]) - if err != nil { - return "", err - } - ip := net.IP(ipData) - - maskData, err := hex.DecodeString(parts[1]) - mask := net.IPMask(maskData) - size, _ := mask.Size() - - return fmt.Sprintf("%s/%d", ip.String(), size), nil -} - -func (t *tcShaper) findCIDRClass(cidr string) (class, handle string, found bool, err error) { - data, err := t.e.Command("tc", "filter", "show", "dev", t.iface).CombinedOutput() - if err != nil { - return "", "", false, err - } - - hex, err := hexCIDR(cidr) - if err != nil { - return "", "", false, err - } - spec := fmt.Sprintf("match %s", hex) - - scanner := bufio.NewScanner(bytes.NewBuffer(data)) - filter := "" - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if len(line) == 0 { - continue - } - if strings.HasPrefix(line, "filter") { - filter = line - continue - } - if strings.Contains(line, spec) { - parts := strings.Split(filter, " ") - // expected tc line: - // filter parent 1: protocol ip pref 1 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 - if len(parts) != 19 { - return "", "", false, fmt.Errorf("unexpected output from tc: %s %d (%v)", filter, len(parts), parts) - } - return parts[18], parts[9], true, nil - } - } - return "", "", false, nil -} - -func makeKBitString(rsrc *resource.Quantity) string { - return fmt.Sprintf("%dkbit", (rsrc.Value() / 1000)) -} - -func (t *tcShaper) makeNewClass(rate string) (int, error) { - class, err := t.nextClassID() - if err != nil { - return -1, err - } - if err := t.execAndLog("tc", "class", "add", - "dev", t.iface, - "parent", "1:", - "classid", fmt.Sprintf("1:%d", class), - "htb", "rate", rate); err != nil { - return -1, err - } - return class, nil -} - -func (t *tcShaper) Limit(cidr string, upload, download *resource.Quantity) (err error) { - var downloadClass, uploadClass int - if download != nil { - if downloadClass, err = t.makeNewClass(makeKBitString(download)); err != nil { - return err - } - if err := t.execAndLog("tc", "filter", "add", - "dev", t.iface, - "protocol", "ip", - "parent", "1:0", - "prio", "1", "u32", - "match", "ip", "dst", cidr, - "flowid", fmt.Sprintf("1:%d", downloadClass)); err != nil { - return err - } - } - if upload != nil { - if uploadClass, err = t.makeNewClass(makeKBitString(upload)); err != nil { - return err - } - if err := t.execAndLog("tc", "filter", "add", - "dev", t.iface, - "protocol", "ip", - "parent", "1:0", - "prio", "1", "u32", - "match", "ip", "src", cidr, - "flowid", fmt.Sprintf("1:%d", uploadClass)); err != nil { - return err - } - } - return nil -} - -// tests to see if an interface exists, if it does, return true and the status line for the interface -// returns false, "", if an error occurs. -func (t *tcShaper) interfaceExists() (bool, string, error) { - data, err := t.e.Command("tc", "qdisc", "show", "dev", t.iface).CombinedOutput() - if err != nil { - return false, "", err - } - value := strings.TrimSpace(string(data)) - if len(value) == 0 { - return false, "", nil - } - // Newer versions of tc and/or the kernel return the following instead of nothing: - // qdisc noqueue 0: root refcnt 2 - fields := strings.Fields(value) - if len(fields) > 1 && fields[1] == "noqueue" { - return false, "", nil - } - return true, value, nil -} - -func (t *tcShaper) ReconcileCIDR(cidr string, upload, download *resource.Quantity) error { - _, _, found, err := t.findCIDRClass(cidr) - if err != nil { - return err - } - if !found { - return t.Limit(cidr, upload, download) - } - // TODO: actually check bandwidth limits here - return nil -} - -func (t *tcShaper) ReconcileInterface() error { - exists, output, err := t.interfaceExists() - if err != nil { - return err - } - if !exists { - glog.V(4).Info("Didn't find bandwidth interface, creating") - return t.initializeInterface() - } - fields := strings.Split(output, " ") - if len(fields) != 12 || fields[1] != "htb" || fields[2] != "1:" { - if err := t.deleteInterface(fields[2]); err != nil { - return err - } - return t.initializeInterface() - } - return nil -} - -func (t *tcShaper) initializeInterface() error { - return t.execAndLog("tc", "qdisc", "add", "dev", t.iface, "root", "handle", "1:", "htb", "default", "30") -} - -func (t *tcShaper) Reset(cidr string) error { - class, handle, found, err := t.findCIDRClass(cidr) - if err != nil { - return err - } - if !found { - return fmt.Errorf("Failed to find cidr: %s on interface: %s", cidr, t.iface) - } - if err := t.execAndLog("tc", "filter", "del", - "dev", t.iface, - "parent", "1:", - "proto", "ip", - "prio", "1", - "handle", handle, "u32"); err != nil { - return err - } - return t.execAndLog("tc", "class", "del", "dev", t.iface, "parent", "1:", "classid", class) -} - -func (t *tcShaper) deleteInterface(class string) error { - return t.execAndLog("tc", "qdisc", "delete", "dev", t.iface, "root", "handle", class) -} - -func (t *tcShaper) GetCIDRs() ([]string, error) { - data, err := t.e.Command("tc", "filter", "show", "dev", t.iface).CombinedOutput() - if err != nil { - return nil, err - } - - result := []string{} - scanner := bufio.NewScanner(bytes.NewBuffer(data)) - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if len(line) == 0 { - continue - } - if strings.Contains(line, "match") { - parts := strings.Split(line, " ") - // expected tc line: - // match at - if len(parts) != 4 { - return nil, fmt.Errorf("unexpected output: %v", parts) - } - cidr, err := asciiCIDR(parts[1]) - if err != nil { - return nil, err - } - result = append(result, cidr) - } - } - return result, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux_test.go deleted file mode 100644 index b6d2b559c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/linux_test.go +++ /dev/null @@ -1,634 +0,0 @@ -// +build linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import ( - "errors" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/util/exec" -) - -var tcClassOutput = `class htb 1:1 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:2 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:3 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:4 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -` - -var tcClassOutput2 = `class htb 1:1 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:2 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:3 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:4 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -class htb 1:5 root prio 0 rate 10000bit ceil 10000bit burst 1600b cburst 1600b -` - -func TestNextClassID(t *testing.T) { - tests := []struct { - output string - expectErr bool - expected int - err error - }{ - { - output: tcClassOutput, - expected: 5, - }, - { - output: "\n", - expected: 1, - }, - { - expected: -1, - expectErr: true, - err: errors.New("test error"), - }, - } - for _, test := range tests { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(test.output), test.err }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { - return exec.InitFakeCmd(&fcmd, cmd, args...) - }, - }, - } - shaper := &tcShaper{e: &fexec} - class, err := shaper.nextClassID() - if test.expectErr { - if err == nil { - t.Errorf("unexpected non-error") - } - } else { - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if class != test.expected { - t.Errorf("expected: %d, found %d", test.expected, class) - } - } - } -} - -func TestHexCIDR(t *testing.T) { - tests := []struct { - input string - output string - expectErr bool - }{ - { - input: "1.2.0.0/16", - output: "01020000/ffff0000", - }, - { - input: "172.17.0.2/32", - output: "ac110002/ffffffff", - }, - { - input: "foo", - expectErr: true, - }, - } - for _, test := range tests { - output, err := hexCIDR(test.input) - if test.expectErr { - if err == nil { - t.Error("unexpected non-error") - } - } else { - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if output != test.output { - t.Errorf("expected: %s, saw: %s", test.output, output) - } - input, err := asciiCIDR(output) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if input != test.input { - t.Errorf("expected: %s, saw: %s", test.input, input) - } - } - } -} - -var tcFilterOutput = `filter parent 1: protocol ip pref 1 u32 -filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1 -filter parent 1: protocol ip pref 1 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 - match ac110002/ffffffff at 16 -filter parent 1: protocol ip pref 1 u32 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:2 - match 01020000/ffff0000 at 16 -` - -func TestFindCIDRClass(t *testing.T) { - tests := []struct { - cidr string - output string - expectErr bool - expectNotFound bool - expectedClass string - expectedHandle string - err error - }{ - { - cidr: "172.17.0.2/32", - output: tcFilterOutput, - expectedClass: "1:1", - expectedHandle: "800::800", - }, - { - cidr: "1.2.3.4/16", - output: tcFilterOutput, - expectedClass: "1:2", - expectedHandle: "800::801", - }, - { - cidr: "2.2.3.4/16", - output: tcFilterOutput, - expectNotFound: true, - }, - { - err: errors.New("test error"), - expectErr: true, - }, - } - for _, test := range tests { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(test.output), test.err }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { - return exec.InitFakeCmd(&fcmd, cmd, args...) - }, - }, - } - shaper := &tcShaper{e: &fexec} - class, handle, found, err := shaper.findCIDRClass(test.cidr) - if test.expectErr { - if err == nil { - t.Errorf("unexpected non-error") - } - } else { - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectNotFound { - if found { - t.Errorf("unexpectedly found an interface: %s %s", class, handle) - } - } else { - if class != test.expectedClass { - t.Errorf("expected: %s, found %s", test.expectedClass, class) - } - if handle != test.expectedHandle { - t.Errorf("expected: %s, found %s", test.expectedHandle, handle) - } - } - } - } -} - -func TestGetCIDRs(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(tcFilterOutput), nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { - return exec.InitFakeCmd(&fcmd, cmd, args...) - }, - }, - } - shaper := &tcShaper{e: &fexec} - cidrs, err := shaper.GetCIDRs() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - expectedCidrs := []string{"172.17.0.2/32", "1.2.0.0/16"} - if !reflect.DeepEqual(cidrs, expectedCidrs) { - t.Errorf("expected: %v, saw: %v", expectedCidrs, cidrs) - } -} - -func TestLimit(t *testing.T) { - tests := []struct { - cidr string - ingress *resource.Quantity - egress *resource.Quantity - expectErr bool - expectedCalls int - err error - }{ - { - cidr: "1.2.3.4/32", - ingress: resource.NewQuantity(10, resource.DecimalSI), - egress: resource.NewQuantity(20, resource.DecimalSI), - expectedCalls: 6, - }, - { - cidr: "1.2.3.4/32", - ingress: resource.NewQuantity(10, resource.DecimalSI), - egress: nil, - expectedCalls: 3, - }, - { - cidr: "1.2.3.4/32", - ingress: nil, - egress: resource.NewQuantity(20, resource.DecimalSI), - expectedCalls: 3, - }, - { - cidr: "1.2.3.4/32", - ingress: nil, - egress: nil, - expectedCalls: 0, - }, - { - err: errors.New("test error"), - ingress: resource.NewQuantity(10, resource.DecimalSI), - egress: resource.NewQuantity(20, resource.DecimalSI), - expectErr: true, - }, - } - - for _, test := range tests { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(tcClassOutput), test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - func() ([]byte, error) { return []byte(tcClassOutput2), test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - }, - } - - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - iface := "cbr0" - shaper := &tcShaper{e: &fexec, iface: iface} - if err := shaper.Limit(test.cidr, test.ingress, test.egress); err != nil && !test.expectErr { - t.Errorf("unexpected error: %v", err) - return - } else if err == nil && test.expectErr { - t.Error("unexpected non-error") - return - } - // No more testing in the error case - if test.expectErr { - if fcmd.CombinedOutputCalls != 1 { - t.Errorf("unexpected number of calls: %d, expected: 1", fcmd.CombinedOutputCalls) - } - return - } - - if fcmd.CombinedOutputCalls != test.expectedCalls { - t.Errorf("unexpected number of calls: %d, expected: %d", fcmd.CombinedOutputCalls, test.expectedCalls) - } - - for ix := range fcmd.CombinedOutputLog { - output := fcmd.CombinedOutputLog[ix] - if output[0] != "tc" { - t.Errorf("unexpected command: %s, expected tc", output[0]) - } - if output[4] != iface { - t.Errorf("unexpected interface: %s, expected %s (%v)", output[4], iface, output) - } - if ix == 1 { - var expectedRate string - if test.ingress != nil { - expectedRate = makeKBitString(test.ingress) - } else { - expectedRate = makeKBitString(test.egress) - } - if output[11] != expectedRate { - t.Errorf("unexpected ingress: %s, expected: %s", output[11], expectedRate) - } - if output[8] != "1:5" { - t.Errorf("unexpected class: %s, expected: %s", output[8], "1:5") - } - } - if ix == 2 { - if output[15] != test.cidr { - t.Errorf("unexpected cidr: %s, expected: %s", output[15], test.cidr) - } - if output[17] != "1:5" { - t.Errorf("unexpected class: %s, expected: %s", output[17], "1:5") - } - } - if ix == 4 { - if output[11] != makeKBitString(test.egress) { - t.Errorf("unexpected egress: %s, expected: %s", output[11], makeKBitString(test.egress)) - } - if output[8] != "1:6" { - t.Errorf("unexpected class: %s, expected: %s", output[8], "1:6") - } - } - if ix == 5 { - if output[15] != test.cidr { - t.Errorf("unexpected cidr: %s, expected: %s", output[15], test.cidr) - } - if output[17] != "1:6" { - t.Errorf("unexpected class: %s, expected: %s", output[17], "1:5") - } - } - } - } -} - -func TestReset(t *testing.T) { - tests := []struct { - cidr string - err error - expectErr bool - expectedHandle string - expectedClass string - }{ - { - cidr: "1.2.3.4/16", - expectedHandle: "800::801", - expectedClass: "1:2", - }, - { - cidr: "172.17.0.2/32", - expectedHandle: "800::800", - expectedClass: "1:1", - }, - { - err: errors.New("test error"), - expectErr: true, - }, - } - for _, test := range tests { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(tcFilterOutput), test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - func() ([]byte, error) { return []byte{}, test.err }, - }, - } - - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - iface := "cbr0" - shaper := &tcShaper{e: &fexec, iface: iface} - - if err := shaper.Reset(test.cidr); err != nil && !test.expectErr { - t.Errorf("unexpected error: %v", err) - return - } else if test.expectErr && err == nil { - t.Error("unexpected non-error") - return - } - - // No more testing in the error case - if test.expectErr { - if fcmd.CombinedOutputCalls != 1 { - t.Errorf("unexpected number of calls: %d, expected: 1", fcmd.CombinedOutputCalls) - } - return - } - - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("unexpected number of calls: %d, expected: 3", fcmd.CombinedOutputCalls) - } - - for ix := range fcmd.CombinedOutputLog { - output := fcmd.CombinedOutputLog[ix] - if output[0] != "tc" { - t.Errorf("unexpected command: %s, expected tc", output[0]) - } - if output[4] != iface { - t.Errorf("unexpected interface: %s, expected %s (%v)", output[4], iface, output) - } - if ix == 1 && output[12] != test.expectedHandle { - t.Errorf("unexpected handle: %s, expected: %s", output[12], test.expectedHandle) - } - if ix == 2 && output[8] != test.expectedClass { - t.Errorf("unexpected class: %s, expected: %s", output[8], test.expectedClass) - } - } - } -} - -var tcQdisc = "qdisc htb 1: root refcnt 2 r2q 10 default 30 direct_packets_stat 0\n" - -func TestReconcileInterfaceExists(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(tcQdisc), nil }, - }, - } - - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - iface := "cbr0" - shaper := &tcShaper{e: &fexec, iface: iface} - err := shaper.ReconcileInterface() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if fcmd.CombinedOutputCalls != 1 { - t.Errorf("unexpected number of calls: %d", fcmd.CombinedOutputCalls) - } - - output := fcmd.CombinedOutputLog[0] - if len(output) != 5 { - t.Errorf("unexpected command: %v", output) - } - if output[0] != "tc" { - t.Errorf("unexpected command: %s", output[0]) - } - if output[4] != iface { - t.Errorf("unexpected interface: %s, expected %s", output[4], iface) - } - if output[2] != "show" { - t.Errorf("unexpected action: %s", output[2]) - } -} - -func testReconcileInterfaceHasNoData(t *testing.T, output string) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(output), nil }, - func() ([]byte, error) { return []byte(output), nil }, - }, - } - - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - iface := "cbr0" - shaper := &tcShaper{e: &fexec, iface: iface} - err := shaper.ReconcileInterface() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("unexpected number of calls: %d", fcmd.CombinedOutputCalls) - } - - for ix, output := range fcmd.CombinedOutputLog { - if output[0] != "tc" { - t.Errorf("unexpected command: %s", output[0]) - } - if output[4] != iface { - t.Errorf("unexpected interface: %s, expected %s", output[4], iface) - } - if ix == 0 { - if len(output) != 5 { - t.Errorf("unexpected command: %v", output) - } - if output[2] != "show" { - t.Errorf("unexpected action: %s", output[2]) - } - } - if ix == 1 { - if len(output) != 11 { - t.Errorf("unexpected command: %v", output) - } - if output[2] != "add" { - t.Errorf("unexpected action: %s", output[2]) - } - if output[7] != "1:" { - t.Errorf("unexpected root class: %s", output[7]) - } - if output[8] != "htb" { - t.Errorf("unexpected qdisc algo: %s", output[8]) - } - } - } -} - -func TestReconcileInterfaceDoesntExist(t *testing.T) { - testReconcileInterfaceHasNoData(t, "\n") -} - -var tcQdiscNoqueue = "qdisc noqueue 0: root refcnt 2 \n" - -func TestReconcileInterfaceExistsWithNoqueue(t *testing.T) { - testReconcileInterfaceHasNoData(t, tcQdiscNoqueue) -} - -var tcQdiscWrong = []string{ - "qdisc htb 2: root refcnt 2 r2q 10 default 30 direct_packets_stat 0\n", - "qdisc foo 1: root refcnt 2 r2q 10 default 30 direct_packets_stat 0\n", -} - -func TestReconcileInterfaceIsWrong(t *testing.T) { - for _, test := range tcQdiscWrong { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(test), nil }, - func() ([]byte, error) { return []byte("\n"), nil }, - func() ([]byte, error) { return []byte("\n"), nil }, - }, - } - - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - iface := "cbr0" - shaper := &tcShaper{e: &fexec, iface: iface} - err := shaper.ReconcileInterface() - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("unexpected number of calls: %d", fcmd.CombinedOutputCalls) - } - - for ix, output := range fcmd.CombinedOutputLog { - if output[0] != "tc" { - t.Errorf("unexpected command: %s", output[0]) - } - if output[4] != iface { - t.Errorf("unexpected interface: %s, expected %s", output[4], iface) - } - if ix == 0 { - if len(output) != 5 { - t.Errorf("unexpected command: %v", output) - } - if output[2] != "show" { - t.Errorf("unexpected action: %s", output[2]) - } - } - if ix == 1 { - if len(output) != 8 { - t.Errorf("unexpected command: %v", output) - } - if output[2] != "delete" { - t.Errorf("unexpected action: %s", output[2]) - } - if output[7] != strings.Split(test, " ")[2] { - t.Errorf("unexpected class: %s, expected: %s", output[7], strings.Split(test, " ")[2]) - } - } - if ix == 2 { - if len(output) != 11 { - t.Errorf("unexpected command: %v", output) - } - if output[7] != "1:" { - t.Errorf("unexpected root class: %s", output[7]) - } - if output[8] != "htb" { - t.Errorf("unexpected qdisc algo: %s", output[8]) - } - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/unsupported.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/unsupported.go deleted file mode 100644 index 7f980a265..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/unsupported.go +++ /dev/null @@ -1,52 +0,0 @@ -// +build !linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import ( - "errors" - - "k8s.io/kubernetes/pkg/api/resource" -) - -type unsupportedShaper struct { -} - -func NewTCShaper(iface string) BandwidthShaper { - return &unsupportedShaper{} -} - -func (f *unsupportedShaper) Limit(cidr string, egress, ingress *resource.Quantity) error { - return errors.New("unimplemented") -} - -func (f *unsupportedShaper) Reset(cidr string) error { - return nil -} - -func (f *unsupportedShaper) ReconcileInterface() error { - return errors.New("unimplemented") -} - -func (f *unsupportedShaper) ReconcileCIDR(cidr string, egress, ingress *resource.Quantity) error { - return errors.New("unimplemented") -} - -func (f *unsupportedShaper) GetCIDRs() ([]string, error) { - return []string{}, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/utils.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/utils.go deleted file mode 100644 index 989096f93..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/bandwidth/utils.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 bandwidth - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/api/resource" -) - -var minRsrc = resource.MustParse("1k") -var maxRsrc = resource.MustParse("1P") - -func validateBandwidthIsReasonable(rsrc *resource.Quantity) error { - if rsrc.Value() < minRsrc.Value() { - return fmt.Errorf("resource is unreasonably small (< 1kbit)") - } - if rsrc.Value() > maxRsrc.Value() { - return fmt.Errorf("resoruce is unreasonably large (> 1Pbit)") - } - return nil -} - -func ExtractPodBandwidthResources(podAnnotations map[string]string) (ingress, egress *resource.Quantity, err error) { - str, found := podAnnotations["kubernetes.io/ingress-bandwidth"] - if found { - if ingress, err = resource.ParseQuantity(str); err != nil { - return nil, nil, err - } - if err := validateBandwidthIsReasonable(ingress); err != nil { - return nil, nil, err - } - } - str, found = podAnnotations["kubernetes.io/egress-bandwidth"] - if found { - if egress, err = resource.ParseQuantity(str); err != nil { - return nil, nil, err - } - if err := validateBandwidthIsReasonable(egress); err != nil { - return nil, nil, err - } - } - return ingress, egress, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache.go deleted file mode 100644 index 1f96c9b9a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "sync" -) - -const ( - shardsCount int = 32 -) - -type Cache []*cacheShard - -func NewCache(maxSize int) Cache { - if maxSize < shardsCount { - maxSize = shardsCount - } - cache := make(Cache, shardsCount) - for i := 0; i < shardsCount; i++ { - cache[i] = &cacheShard{ - items: make(map[uint64]interface{}), - maxSize: maxSize / shardsCount, - } - } - return cache -} - -func (c Cache) getShard(index uint64) *cacheShard { - return c[index%uint64(shardsCount)] -} - -// Returns true if object already existed, false otherwise. -func (c *Cache) Add(index uint64, obj interface{}) bool { - return c.getShard(index).add(index, obj) -} - -func (c *Cache) Get(index uint64) (obj interface{}, found bool) { - return c.getShard(index).get(index) -} - -type cacheShard struct { - items map[uint64]interface{} - sync.RWMutex - maxSize int -} - -// Returns true if object already existed, false otherwise. -func (s *cacheShard) add(index uint64, obj interface{}) bool { - s.Lock() - defer s.Unlock() - _, isOverwrite := s.items[index] - if !isOverwrite && len(s.items) >= s.maxSize { - var randomKey uint64 - for randomKey = range s.items { - break - } - delete(s.items, randomKey) - } - s.items[index] = obj - return isOverwrite -} - -func (s *cacheShard) get(index uint64) (obj interface{}, found bool) { - s.RLock() - defer s.RUnlock() - obj, found = s.items[index] - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache_test.go deleted file mode 100644 index e08c27911..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/cache/cache_test.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cache - -import ( - "testing" -) - -const ( - maxTestCacheSize int = shardsCount * 2 -) - -func ExpectEntry(t *testing.T, cache Cache, index uint64, expectedValue interface{}) bool { - elem, found := cache.Get(index) - if !found { - t.Errorf("Expected to find entry with key %d", index) - return false - } else if elem != expectedValue { - t.Errorf("Expected to find %v, got %v", expectedValue, elem) - return false - } - return true -} - -func TestBasic(t *testing.T) { - cache := NewCache(maxTestCacheSize) - cache.Add(1, "xxx") - ExpectEntry(t, cache, 1, "xxx") -} - -func TestOverflow(t *testing.T) { - cache := NewCache(maxTestCacheSize) - for i := 0; i < maxTestCacheSize+1; i++ { - cache.Add(uint64(i), "xxx") - } - foundIndexes := make([]uint64, 0) - for i := 0; i < maxTestCacheSize+1; i++ { - _, found := cache.Get(uint64(i)) - if found { - foundIndexes = append(foundIndexes, uint64(i)) - } - } - if len(foundIndexes) != maxTestCacheSize { - t.Errorf("Expect to find %d elements, got %d %v", maxTestCacheSize, len(foundIndexes), foundIndexes) - } -} - -func TestOverwrite(t *testing.T) { - cache := NewCache(maxTestCacheSize) - cache.Add(1, "xxx") - ExpectEntry(t, cache, 1, "xxx") - cache.Add(1, "yyy") - ExpectEntry(t, cache, 1, "yyy") -} - -// TestEvict this test will fail sporatically depending on what add() -// selects for the randomKey to be evicted. Ensure that randomKey -// is never the key we most recently added. Since the chance of failure -// on each evict is 50%, if we do it 7 times, it should catch the problem -// if it exists >99% of the time. -func TestEvict(t *testing.T) { - cache := NewCache(shardsCount) - var found bool - for retry := 0; retry < 7; retry++ { - cache.Add(uint64(shardsCount), "xxx") - found = ExpectEntry(t, cache, uint64(shardsCount), "xxx") - if !found { - break - } - cache.Add(0, "xxx") - found = ExpectEntry(t, cache, 0, "xxx") - if !found { - break - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/chmod.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/chmod.go deleted file mode 100644 index 5b646c95b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/chmod.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 chmod - -import ( - "os" -) - -// Interface is something that knows how to run the chmod system call. -// It is non-recursive. -type Interface interface { - // Chmod changes the mode of the given file, implementing the same - // semantics as os.Chmod. - Chmod(path string, filemode os.FileMode) error -} - -func New() Interface { - return &chmodRunner{} -} - -type chmodRunner struct{} - -func (_ *chmodRunner) Chmod(path string, mode os.FileMode) error { - return os.Chmod(path, mode) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/doc.go deleted file mode 100644 index a230e98fd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chmod/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 chown provides an interface and implementations -// for things that run run the chmod system call. -package chmod diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/chown.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/chown.go deleted file mode 100644 index 0d90629de..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/chown.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 chown - -import ( - "os" -) - -// Interface is something that knows how to run the chown system call. -// It is non-recursive. -type Interface interface { - // Chown changes the owning UID and GID of a file, implementing - // the exact same semantics as os.Chown. - Chown(path string, uid, gid int) error -} - -func New() Interface { - return &chownRunner{} -} - -type chownRunner struct{} - -func (_ *chownRunner) Chown(path string, uid, gid int) error { - return os.Chown(path, uid, gid) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/doc.go deleted file mode 100644 index 3c41f5ed3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/chown/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 chown provides utilities to chown a path -package chown diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/clock_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/clock_test.go deleted file mode 100644 index ee60fcb0d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/clock_test.go +++ /dev/null @@ -1,184 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "testing" - "time" -) - -func TestFakeClock(t *testing.T) { - startTime := time.Now() - tc := NewFakeClock(startTime) - tc.Step(time.Second) - now := tc.Now() - if now.Sub(startTime) != time.Second { - t.Errorf("input: %s now=%s gap=%s expected=%s", startTime, now, now.Sub(startTime), time.Second) - } - - tt := tc.Now() - tc.SetTime(tt.Add(time.Hour)) - if tc.Now().Sub(tt) != time.Hour { - t.Errorf("input: %s now=%s gap=%s expected=%s", tt, tc.Now(), tc.Now().Sub(tt), time.Hour) - } -} - -func TestFakeClockSleep(t *testing.T) { - startTime := time.Now() - tc := NewFakeClock(startTime) - tc.Sleep(time.Duration(1) * time.Hour) - now := tc.Now() - if now.Sub(startTime) != time.Hour { - t.Errorf("Fake sleep failed, expected time to advance by one hour, instead, its %v", now.Sub(startTime)) - } -} - -func TestFakeAfter(t *testing.T) { - tc := NewFakeClock(time.Now()) - if tc.HasWaiters() { - t.Errorf("unexpected waiter?") - } - oneSec := tc.After(time.Second) - if !tc.HasWaiters() { - t.Errorf("unexpected lack of waiter?") - } - - oneOhOneSec := tc.After(time.Second + time.Millisecond) - twoSec := tc.After(2 * time.Second) - select { - case <-oneSec: - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - } - - tc.Step(999 * time.Millisecond) - select { - case <-oneSec: - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - } - - tc.Step(time.Millisecond) - select { - case <-oneSec: - // Expected! - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - t.Errorf("unexpected non-channel read") - } - tc.Step(time.Millisecond) - select { - case <-oneSec: - // should not double-trigger! - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - // Expected! - case <-twoSec: - t.Errorf("unexpected channel read") - default: - t.Errorf("unexpected non-channel read") - } -} - -func TestFakeTick(t *testing.T) { - tc := NewFakeClock(time.Now()) - if tc.HasWaiters() { - t.Errorf("unexpected waiter?") - } - oneSec := tc.Tick(time.Second) - if !tc.HasWaiters() { - t.Errorf("unexpected lack of waiter?") - } - - oneOhOneSec := tc.Tick(time.Second + time.Millisecond) - twoSec := tc.Tick(2 * time.Second) - select { - case <-oneSec: - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - } - - tc.Step(999 * time.Millisecond) // t=.999 - select { - case <-oneSec: - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - } - - tc.Step(time.Millisecond) // t=1.000 - select { - case <-oneSec: - // Expected! - case <-oneOhOneSec: - t.Errorf("unexpected channel read") - case <-twoSec: - t.Errorf("unexpected channel read") - default: - t.Errorf("unexpected non-channel read") - } - tc.Step(time.Millisecond) // t=1.001 - select { - case <-oneSec: - // should not double-trigger! - t.Errorf("unexpected channel read") - case <-oneOhOneSec: - // Expected! - case <-twoSec: - t.Errorf("unexpected channel read") - default: - t.Errorf("unexpected non-channel read") - } - - tc.Step(time.Second) // t=2.001 - tc.Step(time.Second) // t=3.001 - tc.Step(time.Second) // t=4.001 - tc.Step(time.Second) // t=5.001 - - // The one second ticker should not accumulate ticks - accumulatedTicks := 0 - drained := false - for !drained { - select { - case <-oneSec: - accumulatedTicks++ - default: - drained = true - } - } - if accumulatedTicks != 1 { - t.Errorf("unexpected number of accumulated ticks: %d", accumulatedTicks) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/codeinspector/codeinspector.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/codeinspector/codeinspector.go deleted file mode 100644 index 6ec21be71..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/codeinspector/codeinspector.go +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 codeinspector - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "strings" - "unicode" -) - -// GetPublicFunctions lists all public functions (not methods) from a golang source file. -func GetPublicFunctions(filePath string) ([]string, error) { - var functionNames []string - - // Create the AST by parsing src. - fset := token.NewFileSet() // positions are relative to fset - f, err := parser.ParseFile(fset, filePath, nil, 0) - if err != nil { - return nil, fmt.Errorf("failed parse file to list functions: %v", err) - } - - // Inspect the AST and print all identifiers and literals. - ast.Inspect(f, func(n ast.Node) bool { - var s string - switch x := n.(type) { - case *ast.FuncDecl: - s = x.Name.Name - // It's a function (not method), and is public, record it. - if x.Recv == nil && isPublic(s) { - functionNames = append(functionNames, s) - } - } - return true - }) - - return functionNames, nil -} - -// isPublic checks if a given string is a public function name. -func isPublic(myString string) bool { - a := []rune(myString) - a[0] = unicode.ToUpper(a[0]) - return myString == string(a) -} - -// GetSourceCodeFiles lists golang source code files from directory, excluding sub-directory and tests files. -func GetSourceCodeFiles(dir string) ([]string, error) { - files, err := ioutil.ReadDir(dir) - if err != nil { - return nil, err - } - - var filenames []string - - for _, file := range files { - if strings.HasSuffix(file.Name(), ".go") && !strings.HasSuffix(file.Name(), "_test.go") { - filenames = append(filenames, file.Name()) - } - } - - return filenames, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config.go deleted file mode 100644 index 37f6f6ab1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "sync" - - "k8s.io/kubernetes/pkg/util/wait" -) - -type Merger interface { - // Invoked when a change from a source is received. May also function as an incremental - // merger if you wish to consume changes incrementally. Must be reentrant when more than - // one source is defined. - Merge(source string, update interface{}) error -} - -// MergeFunc implements the Merger interface -type MergeFunc func(source string, update interface{}) error - -func (f MergeFunc) Merge(source string, update interface{}) error { - return f(source, update) -} - -// Mux is a class for merging configuration from multiple sources. Changes are -// pushed via channels and sent to the merge function. -type Mux struct { - // Invoked when an update is sent to a source. - merger Merger - - // Sources and their lock. - sourceLock sync.RWMutex - // Maps source names to channels - sources map[string]chan interface{} -} - -// NewMux creates a new mux that can merge changes from multiple sources. -func NewMux(merger Merger) *Mux { - mux := &Mux{ - sources: make(map[string]chan interface{}), - merger: merger, - } - return mux -} - -// Channel returns a channel where a configuration source -// can send updates of new configurations. Multiple calls with the same -// source will return the same channel. This allows change and state based sources -// to use the same channel. Different source names however will be treated as a -// union. -func (m *Mux) Channel(source string) chan interface{} { - if len(source) == 0 { - panic("Channel given an empty name") - } - m.sourceLock.Lock() - defer m.sourceLock.Unlock() - channel, exists := m.sources[source] - if exists { - return channel - } - newChannel := make(chan interface{}) - m.sources[source] = newChannel - go wait.Until(func() { m.listen(source, newChannel) }, 0, wait.NeverStop) - return newChannel -} - -func (m *Mux) listen(source string, listenChannel <-chan interface{}) { - for update := range listenChannel { - m.merger.Merge(source, update) - } -} - -// Accessor is an interface for retrieving the current merge state. -type Accessor interface { - // MergedState returns a representation of the current merge state. - // Must be reentrant when more than one source is defined. - MergedState() interface{} -} - -// AccessorFunc implements the Accessor interface. -type AccessorFunc func() interface{} - -func (f AccessorFunc) MergedState() interface{} { - return f() -} - -type Listener interface { - // OnUpdate is invoked when a change is made to an object. - OnUpdate(instance interface{}) -} - -// ListenerFunc receives a representation of the change or object. -type ListenerFunc func(instance interface{}) - -func (f ListenerFunc) OnUpdate(instance interface{}) { - f(instance) -} - -type Broadcaster struct { - // Listeners for changes and their lock. - listenerLock sync.RWMutex - listeners []Listener -} - -// NewBroadcaster registers a set of listeners that support the Listener interface -// and notifies them all on changes. -func NewBroadcaster() *Broadcaster { - return &Broadcaster{} -} - -// Add registers listener to receive updates of changes. -func (b *Broadcaster) Add(listener Listener) { - b.listenerLock.Lock() - defer b.listenerLock.Unlock() - b.listeners = append(b.listeners, listener) -} - -// Notify notifies all listeners. -func (b *Broadcaster) Notify(instance interface{}) { - b.listenerLock.RLock() - listeners := b.listeners - b.listenerLock.RUnlock() - for _, listener := range listeners { - listener.OnUpdate(instance) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config_test.go deleted file mode 100644 index 4ebab7bf9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/config_test.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "reflect" - "testing" -) - -func TestConfigurationChannels(t *testing.T) { - mux := NewMux(nil) - channelOne := mux.Channel("one") - if channelOne != mux.Channel("one") { - t.Error("Didn't get the same muxuration channel back with the same name") - } - channelTwo := mux.Channel("two") - if channelOne == channelTwo { - t.Error("Got back the same muxuration channel for different names") - } -} - -type MergeMock struct { - source string - update interface{} - t *testing.T -} - -func (m MergeMock) Merge(source string, update interface{}) error { - if m.source != source { - m.t.Errorf("Expected %s, Got %s", m.source, source) - } - if !reflect.DeepEqual(m.update, update) { - m.t.Errorf("Expected %s, Got %s", m.update, update) - } - return nil -} - -func TestMergeInvoked(t *testing.T) { - merger := MergeMock{"one", "test", t} - mux := NewMux(&merger) - mux.Channel("one") <- "test" -} - -func TestMergeFuncInvoked(t *testing.T) { - ch := make(chan bool) - mux := NewMux(MergeFunc(func(source string, update interface{}) error { - if source != "one" { - t.Errorf("Expected %s, Got %s", "one", source) - } - if update.(string) != "test" { - t.Errorf("Expected %s, Got %s", "test", update) - } - ch <- true - return nil - })) - mux.Channel("one") <- "test" - <-ch -} - -func TestSimultaneousMerge(t *testing.T) { - ch := make(chan bool, 2) - mux := NewMux(MergeFunc(func(source string, update interface{}) error { - switch source { - case "one": - if update.(string) != "test" { - t.Errorf("Expected %s, Got %s", "test", update) - } - case "two": - if update.(string) != "test2" { - t.Errorf("Expected %s, Got %s", "test2", update) - } - default: - t.Errorf("Unexpected source, Got %s", update) - } - ch <- true - return nil - })) - source := mux.Channel("one") - source2 := mux.Channel("two") - source <- "test" - source2 <- "test2" - <-ch - <-ch -} - -func TestBroadcaster(t *testing.T) { - b := NewBroadcaster() - b.Notify(struct{}{}) - - ch := make(chan bool, 2) - b.Add(ListenerFunc(func(object interface{}) { - if object != "test" { - t.Errorf("Expected %s, Got %s", "test", object) - } - ch <- true - })) - b.Add(ListenerFunc(func(object interface{}) { - if object != "test" { - t.Errorf("Expected %s, Got %s", "test", object) - } - ch <- true - })) - b.Notify("test") - <-ch - <-ch -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/configuration_map.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/configuration_map.go deleted file mode 100644 index e7ad4fadb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/configuration_map.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "fmt" - "sort" - "strings" -) - -type ConfigurationMap map[string]string - -func (m *ConfigurationMap) String() string { - pairs := []string{} - for k, v := range *m { - pairs = append(pairs, fmt.Sprintf("%s=%s", k, v)) - } - sort.Strings(pairs) - return strings.Join(pairs, ",") -} - -func (m *ConfigurationMap) Set(value string) error { - for _, s := range strings.Split(value, ",") { - if len(s) == 0 { - continue - } - arr := strings.SplitN(s, "=", 2) - if len(arr) == 2 { - (*m)[strings.TrimSpace(arr[0])] = strings.TrimSpace(arr[1]) - } else { - (*m)[strings.TrimSpace(arr[0])] = "" - } - } - return nil -} - -func (*ConfigurationMap) Type() string { - return "mapStringString" -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/doc.go deleted file mode 100644 index 697f3ab56..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/config/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config provides utility objects for decoupling sources of configuration and the -// actual configuration state. Consumers must implement the Merger interface to unify -// the sources of change into an object. -package config diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz.go deleted file mode 100644 index e8954a4a8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 configz - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "sync" -) - -var ( - configsGuard sync.RWMutex - configs = map[string]*Config{} -) - -type Config struct { - val interface{} -} - -func InstallHandler(m mux) { - m.Handle("/configz", http.HandlerFunc(handle)) -} - -type mux interface { - Handle(string, http.Handler) -} - -func New(name string) (*Config, error) { - configsGuard.Lock() - defer configsGuard.Unlock() - if _, found := configs[name]; found { - return nil, fmt.Errorf("register config %q twice", name) - } - newConfig := Config{} - configs[name] = &newConfig - return &newConfig, nil -} - -func Delete(name string) { - configsGuard.Lock() - defer configsGuard.Unlock() - delete(configs, name) -} - -func (v *Config) Set(val interface{}) { - configsGuard.Lock() - defer configsGuard.Unlock() - v.val = val -} - -func (v *Config) MarshalJSON() ([]byte, error) { - return json.Marshal(v.val) -} - -func handle(w http.ResponseWriter, r *http.Request) { - if err := write(w); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func write(w io.Writer) error { - configsGuard.Lock() - defer configsGuard.Unlock() - b, err := json.Marshal(configs) - if err != nil { - return fmt.Errorf("error marshaling json: %v", err) - } - _, err = w.Write(b) - return err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz_test.go deleted file mode 100644 index 7e5202050..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/configz/configz_test.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 configz - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" -) - -func TestConfigz(t *testing.T) { - v, err := New("testing") - if err != nil { - t.Fatalf("err: %v", err) - } - - v.Set("blah") - - s := httptest.NewServer(http.HandlerFunc(handle)) - defer s.Close() - - resp, err := http.Get(s.URL + "/configz") - if err != nil { - t.Fatalf("err: %v", err) - } - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("err: %v", err) - } - if string(body) != `{"testing":"blah"}` { - t.Fatalf("unexpected output: %v", err) - } - - v.Set("bing") - resp, err = http.Get(s.URL + "/configz") - if err != nil { - t.Fatalf("err: %v", err) - } - - body, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("err: %v", err) - } - if string(body) != `{"testing":"bing"}` { - t.Fatalf("unexpected output: %v", err) - } - - Delete("testing") - resp, err = http.Get(s.URL + "/configz") - if err != nil { - t.Fatalf("err: %v", err) - } - - body, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("err: %v", err) - } - if string(body) != `{}` { - t.Fatalf("unexpected output: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/crlf/crlf.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/crlf/crlf.go deleted file mode 100644 index e098e8600..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/crlf/crlf.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 crlf - -import ( - "bytes" - "io" -) - -type crlfWriter struct { - io.Writer -} - -// NewCRLFWriter implements a CR/LF line ending writer used for normalizing -// text for Windows platforms. -func NewCRLFWriter(w io.Writer) io.Writer { - return crlfWriter{w} -} - -func (w crlfWriter) Write(b []byte) (n int, err error) { - for i, written := 0, 0; ; { - next := bytes.Index(b[i:], []byte("\n")) - if next == -1 { - n, err := w.Writer.Write(b[i:]) - return written + n, err - } - next = next + i - n, err := w.Writer.Write(b[i:next]) - if err != nil { - return written + n, err - } - written += n - n, err = w.Writer.Write([]byte("\r\n")) - if err != nil { - if n > 1 { - n = 1 - } - return written + n, err - } - written += 1 - i = next + 1 - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus.go deleted file mode 100644 index 13da1469e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 dbus - -import ( - godbus "github.com/godbus/dbus" -) - -// Interface is an interface that presents a subset of the godbus/dbus API. Use this -// when you want to inject fakeable/mockable D-Bus behavior. -type Interface interface { - // SystemBus returns a connection to the system bus, connecting to it - // first if necessary - SystemBus() (Connection, error) - // SessionBus returns a connection to the session bus, connecting to it - // first if necessary - SessionBus() (Connection, error) -} - -// Connection represents a D-Bus connection -type Connection interface { - // Returns an Object representing the bus itself - BusObject() Object - - // Object creates a representation of a remote D-Bus object - Object(name, path string) Object - - // Signal registers or unregisters a channel to receive D-Bus signals - Signal(ch chan<- *godbus.Signal) -} - -// Object represents a remote D-Bus object -type Object interface { - // Call synchronously calls a D-Bus method - Call(method string, flags godbus.Flags, args ...interface{}) Call -} - -// Call represents a pending or completed D-Bus method call -type Call interface { - // Store returns a completed call's return values, or an error - Store(retvalues ...interface{}) error -} - -// Implements Interface in terms of actually talking to D-Bus -type dbusImpl struct { - systemBus *connImpl - sessionBus *connImpl -} - -// Implements Connection as a godbus.Conn -type connImpl struct { - conn *godbus.Conn -} - -// Implements Object as a godbus.Object -type objectImpl struct { - object godbus.BusObject -} - -// Implements Call as a godbus.Call -type callImpl struct { - call *godbus.Call -} - -// New returns a new Interface which will use godbus to talk to D-Bus -func New() Interface { - return &dbusImpl{} -} - -// SystemBus is part of Interface -func (db *dbusImpl) SystemBus() (Connection, error) { - if db.systemBus == nil { - bus, err := godbus.SystemBus() - if err != nil { - return nil, err - } - db.systemBus = &connImpl{bus} - } - - return db.systemBus, nil -} - -// SessionBus is part of Interface -func (db *dbusImpl) SessionBus() (Connection, error) { - if db.sessionBus == nil { - bus, err := godbus.SessionBus() - if err != nil { - return nil, err - } - db.sessionBus = &connImpl{bus} - } - - return db.sessionBus, nil -} - -// BusObject is part of the Connection interface -func (conn *connImpl) BusObject() Object { - return &objectImpl{conn.conn.BusObject()} -} - -// Object is part of the Connection interface -func (conn *connImpl) Object(name, path string) Object { - return &objectImpl{conn.conn.Object(name, godbus.ObjectPath(path))} -} - -// Signal is part of the Connection interface -func (conn *connImpl) Signal(ch chan<- *godbus.Signal) { - conn.conn.Signal(ch) -} - -// Call is part of the Object interface -func (obj *objectImpl) Call(method string, flags godbus.Flags, args ...interface{}) Call { - return &callImpl{obj.object.Call(method, flags, args...)} -} - -// Store is part of the Call interface -func (call *callImpl) Store(retvalues ...interface{}) error { - return call.call.Store(retvalues...) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus_test.go deleted file mode 100644 index 96670373b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/dbus_test.go +++ /dev/null @@ -1,249 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 dbus - -import ( - "fmt" - "os" - "testing" - - godbus "github.com/godbus/dbus" -) - -const ( - DBusNameFlagAllowReplacement uint32 = 1 << (iota + 1) - DBusNameFlagReplaceExisting - DBusNameFlagDoNotQueue -) - -const ( - DBusRequestNameReplyPrimaryOwner uint32 = iota + 1 - DBusRequestNameReplyInQueue - DBusRequestNameReplyExists - DBusRequestNameReplyAlreadyOwner -) - -const ( - DBusReleaseNameReplyReleased uint32 = iota + 1 - DBusReleaseNameReplyNonExistent - DBusReleaseNameReplyNotOwner -) - -func doDBusTest(t *testing.T, dbus Interface, real bool) { - bus, err := dbus.SystemBus() - if err != nil { - if !real { - t.Errorf("dbus.SystemBus() failed with fake Interface") - } - t.Skipf("D-Bus is not running: %v", err) - } - busObj := bus.BusObject() - - id := "" - err = busObj.Call("org.freedesktop.DBus.GetId", 0).Store(&id) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if len(id) == 0 { - t.Errorf("expected non-empty Id, got \"\"") - } - - // Switch to the session bus for the rest, since the system bus is more - // locked down (and thus harder to trick into emitting signals). - - bus, err = dbus.SessionBus() - if err != nil { - if !real { - t.Errorf("dbus.SystemBus() failed with fake Interface") - } - t.Skipf("D-Bus session bus is not available: %v", err) - } - busObj = bus.BusObject() - - name := fmt.Sprintf("io.kubernetes.dbus_test_%d", os.Getpid()) - owner := "" - err = busObj.Call("org.freedesktop.DBus.GetNameOwner", 0, name).Store(&owner) - if err == nil { - t.Errorf("expected '%s' to be un-owned, but found owner %s", name, owner) - } - dbuserr, ok := err.(godbus.Error) - if !ok { - t.Errorf("expected godbus.Error, but got %#v", err) - } - if dbuserr.Name != "org.freedesktop.DBus.Error.NameHasNoOwner" { - t.Errorf("expected NameHasNoOwner error but got %v", err) - } - - sigchan := make(chan *godbus.Signal, 10) - bus.Signal(sigchan) - - rule := fmt.Sprintf("type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',sender='org.freedesktop.DBus',arg0='%s'", name) - err = busObj.Call("org.freedesktop.DBus.AddMatch", 0, rule).Store() - if err != nil { - t.Errorf("expected success, got %v", err) - } - - var ret uint32 - err = busObj.Call("org.freedesktop.DBus.RequestName", 0, name, DBusNameFlagDoNotQueue).Store(&ret) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if ret != DBusRequestNameReplyPrimaryOwner { - t.Errorf("expected %v, got %v", DBusRequestNameReplyPrimaryOwner, ret) - } - - err = busObj.Call("org.freedesktop.DBus.GetNameOwner", 0, name).Store(&owner) - if err != nil { - t.Errorf("expected success, got %v", err) - } - - var changedSignal, acquiredSignal, lostSignal *godbus.Signal - - sig1 := <-sigchan - sig2 := <-sigchan - // We get two signals, but the order isn't guaranteed - if sig1.Name == "org.freedesktop.DBus.NameOwnerChanged" { - changedSignal = sig1 - acquiredSignal = sig2 - } else { - acquiredSignal = sig1 - changedSignal = sig2 - } - - if acquiredSignal.Sender != "org.freedesktop.DBus" || acquiredSignal.Name != "org.freedesktop.DBus.NameAcquired" { - t.Errorf("expected NameAcquired signal, got %v", acquiredSignal) - } - acquiredName := acquiredSignal.Body[0].(string) - if acquiredName != name { - t.Errorf("unexpected NameAcquired arguments: %v", acquiredSignal) - } - - if changedSignal.Sender != "org.freedesktop.DBus" || changedSignal.Name != "org.freedesktop.DBus.NameOwnerChanged" { - t.Errorf("expected NameOwnerChanged signal, got %v", changedSignal) - } - - changedName := changedSignal.Body[0].(string) - oldOwner := changedSignal.Body[1].(string) - newOwner := changedSignal.Body[2].(string) - if changedName != name || oldOwner != "" || newOwner != owner { - t.Errorf("unexpected NameOwnerChanged arguments: %v", changedSignal) - } - - err = busObj.Call("org.freedesktop.DBus.ReleaseName", 0, name).Store(&ret) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if ret != DBusReleaseNameReplyReleased { - t.Errorf("expected %v, got %v", DBusReleaseNameReplyReleased, ret) - } - - sig1 = <-sigchan - sig2 = <-sigchan - if sig1.Name == "org.freedesktop.DBus.NameOwnerChanged" { - changedSignal = sig1 - lostSignal = sig2 - } else { - lostSignal = sig1 - changedSignal = sig2 - } - - if lostSignal.Sender != "org.freedesktop.DBus" || lostSignal.Name != "org.freedesktop.DBus.NameLost" { - t.Errorf("expected NameLost signal, got %v", lostSignal) - } - lostName := lostSignal.Body[0].(string) - if lostName != name { - t.Errorf("unexpected NameLost arguments: %v", lostSignal) - } - - if changedSignal.Sender != "org.freedesktop.DBus" || changedSignal.Name != "org.freedesktop.DBus.NameOwnerChanged" { - t.Errorf("expected NameOwnerChanged signal, got %v", changedSignal) - } - - changedName = changedSignal.Body[0].(string) - oldOwner = changedSignal.Body[1].(string) - newOwner = changedSignal.Body[2].(string) - if changedName != name || oldOwner != owner || newOwner != "" { - t.Errorf("unexpected NameOwnerChanged arguments: %v", changedSignal) - } - - if len(sigchan) != 0 { - t.Errorf("unexpected extra signals (%d)", len(sigchan)) - } - - // Unregister sigchan - bus.Signal(sigchan) -} - -func TestRealDBus(t *testing.T) { - dbus := New() - doDBusTest(t, dbus, true) -} - -func TestFakeDBus(t *testing.T) { - uniqueName := ":1.1" - ownedName := "" - - fakeSystem := NewFakeConnection() - fakeSystem.SetBusObject( - func(method string, args ...interface{}) ([]interface{}, error) { - if method == "org.freedesktop.DBus.GetId" { - return []interface{}{"foo"}, nil - } - return nil, fmt.Errorf("unexpected method call '%s'", method) - }, - ) - - fakeSession := NewFakeConnection() - fakeSession.SetBusObject( - func(method string, args ...interface{}) ([]interface{}, error) { - if method == "org.freedesktop.DBus.GetNameOwner" { - checkName := args[0].(string) - if checkName != ownedName { - return nil, godbus.Error{Name: "org.freedesktop.DBus.Error.NameHasNoOwner", Body: nil} - } else { - return []interface{}{uniqueName}, nil - } - } else if method == "org.freedesktop.DBus.RequestName" { - reqName := args[0].(string) - _ = args[1].(uint32) - if ownedName != "" { - return []interface{}{DBusRequestNameReplyAlreadyOwner}, nil - } - ownedName = reqName - fakeSession.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameAcquired", reqName) - fakeSession.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", reqName, "", uniqueName) - return []interface{}{DBusRequestNameReplyPrimaryOwner}, nil - } else if method == "org.freedesktop.DBus.ReleaseName" { - reqName := args[0].(string) - if reqName != ownedName { - return []interface{}{DBusReleaseNameReplyNotOwner}, nil - } - ownedName = "" - fakeSession.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", reqName, uniqueName, "") - fakeSession.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameLost", reqName) - return []interface{}{DBusReleaseNameReplyReleased}, nil - } else if method == "org.freedesktop.DBus.AddMatch" { - return nil, nil - } else { - return nil, fmt.Errorf("unexpected method call '%s'", method) - } - }, - ) - - dbus := NewFake(fakeSystem, fakeSession) - doDBusTest(t, dbus, false) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/doc.go deleted file mode 100644 index 59bec0e56..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 dbus provides an injectable interface and implementations for D-Bus communication -package dbus diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/fake_dbus.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/fake_dbus.go deleted file mode 100644 index eb97febae..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/dbus/fake_dbus.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 dbus - -import ( - "fmt" - - godbus "github.com/godbus/dbus" -) - -// DBusFake is a simple fake Interface type. -type DBusFake struct { - systemBus *DBusFakeConnection - sessionBus *DBusFakeConnection -} - -// DBusFakeConnection represents a fake D-Bus connection -type DBusFakeConnection struct { - busObject *fakeObject - objects map[string]*fakeObject - signalHandlers []chan<- *godbus.Signal -} - -// DBusFakeHandler is used to handle fake D-Bus method calls -type DBusFakeHandler func(method string, args ...interface{}) ([]interface{}, error) - -type fakeObject struct { - handler DBusFakeHandler -} - -type fakeCall struct { - ret []interface{} - err error -} - -// NewFake returns a new Interface which will fake talking to D-Bus -func NewFake(systemBus *DBusFakeConnection, sessionBus *DBusFakeConnection) *DBusFake { - return &DBusFake{systemBus, sessionBus} -} - -func NewFakeConnection() *DBusFakeConnection { - return &DBusFakeConnection{ - objects: make(map[string]*fakeObject), - } -} - -// SystemBus is part of Interface -func (db *DBusFake) SystemBus() (Connection, error) { - if db.systemBus != nil { - return db.systemBus, nil - } else { - return nil, fmt.Errorf("DBus is not running") - } -} - -// SessionBus is part of Interface -func (db *DBusFake) SessionBus() (Connection, error) { - if db.sessionBus != nil { - return db.sessionBus, nil - } else { - return nil, fmt.Errorf("DBus is not running") - } -} - -// BusObject is part of the Connection interface -func (conn *DBusFakeConnection) BusObject() Object { - return conn.busObject -} - -// Object is part of the Connection interface -func (conn *DBusFakeConnection) Object(name, path string) Object { - return conn.objects[name+path] -} - -// Signal is part of the Connection interface -func (conn *DBusFakeConnection) Signal(ch chan<- *godbus.Signal) { - for i := range conn.signalHandlers { - if conn.signalHandlers[i] == ch { - conn.signalHandlers = append(conn.signalHandlers[:i], conn.signalHandlers[i+1:]...) - return - } - } - conn.signalHandlers = append(conn.signalHandlers, ch) -} - -// SetBusObject sets the handler for the BusObject of conn -func (conn *DBusFakeConnection) SetBusObject(handler DBusFakeHandler) { - conn.busObject = &fakeObject{handler} -} - -// AddObject adds a handler for the Object at name and path -func (conn *DBusFakeConnection) AddObject(name, path string, handler DBusFakeHandler) { - conn.objects[name+path] = &fakeObject{handler} -} - -// EmitSignal emits a signal on conn -func (conn *DBusFakeConnection) EmitSignal(name, path, iface, signal string, args ...interface{}) { - sig := &godbus.Signal{ - Sender: name, - Path: godbus.ObjectPath(path), - Name: iface + "." + signal, - Body: args, - } - for _, ch := range conn.signalHandlers { - ch <- sig - } -} - -// Call is part of the Object interface -func (obj *fakeObject) Call(method string, flags godbus.Flags, args ...interface{}) Call { - ret, err := obj.handler(method, args...) - return &fakeCall{ret, err} -} - -// Store is part of the Call interface -func (call *fakeCall) Store(retvalues ...interface{}) error { - if call.err != nil { - return call.err - } - return godbus.Store(call.ret, retvalues...) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/deployment/deployment_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/deployment/deployment_test.go deleted file mode 100644 index 31d23d2c1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/deployment/deployment_test.go +++ /dev/null @@ -1,409 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 deployment - -import ( - "fmt" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" - "k8s.io/kubernetes/pkg/runtime" -) - -func addListRSReactor(fakeClient *fake.Clientset, obj runtime.Object) *fake.Clientset { - fakeClient.AddReactor("list", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { - return true, obj, nil - }) - return fakeClient -} - -func addListPodsReactor(fakeClient *fake.Clientset, obj runtime.Object) *fake.Clientset { - fakeClient.AddReactor("list", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - return true, obj, nil - }) - return fakeClient -} - -func addGetRSReactor(fakeClient *fake.Clientset, obj runtime.Object) *fake.Clientset { - rsList, ok := obj.(*extensions.ReplicaSetList) - fakeClient.AddReactor("get", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { - name := action.(testclient.GetAction).GetName() - if ok { - for _, rs := range rsList.Items { - if rs.Name == name { - return true, &rs, nil - } - } - } - return false, nil, fmt.Errorf("could not find the requested replica set: %s", name) - - }) - return fakeClient -} - -func addUpdateRSReactor(fakeClient *fake.Clientset) *fake.Clientset { - fakeClient.AddReactor("update", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { - obj := action.(testclient.UpdateAction).GetObject().(*extensions.ReplicaSet) - return true, obj, nil - }) - return fakeClient -} - -func addUpdatePodsReactor(fakeClient *fake.Clientset) *fake.Clientset { - fakeClient.AddReactor("update", "pods", func(action core.Action) (handled bool, ret runtime.Object, err error) { - obj := action.(testclient.UpdateAction).GetObject().(*api.Pod) - return true, obj, nil - }) - return fakeClient -} - -func newPod(now time.Time, ready bool, beforeSec int) api.Pod { - conditionStatus := api.ConditionFalse - if ready { - conditionStatus = api.ConditionTrue - } - return api.Pod{ - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Type: api.PodReady, - LastTransitionTime: unversioned.NewTime(now.Add(-1 * time.Duration(beforeSec) * time.Second)), - Status: conditionStatus, - }, - }, - }, - } -} - -func TestGetReadyPodsCount(t *testing.T) { - now := time.Now() - tests := []struct { - pods []api.Pod - minReadySeconds int - expected int - }{ - { - []api.Pod{ - newPod(now, true, 0), - newPod(now, true, 2), - newPod(now, false, 1), - }, - 1, - 1, - }, - { - []api.Pod{ - newPod(now, true, 2), - newPod(now, true, 11), - newPod(now, true, 5), - }, - 10, - 1, - }, - } - - for _, test := range tests { - if count := getReadyPodsCount(test.pods, int32(test.minReadySeconds)); int(count) != test.expected { - t.Errorf("Pods = %#v, minReadySeconds = %d, expected %d, got %d", test.pods, test.minReadySeconds, test.expected, count) - } - } -} - -// generatePodFromRS creates a pod, with the input ReplicaSet's selector and its template -func generatePodFromRS(rs extensions.ReplicaSet) api.Pod { - return api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: rs.Labels, - }, - Spec: rs.Spec.Template.Spec, - } -} - -func generatePod(labels map[string]string, image string) api.Pod { - return api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: labels, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: image, - Image: image, - ImagePullPolicy: api.PullAlways, - TerminationMessagePath: api.TerminationMessagePathDefault, - }, - }, - }, - } -} - -func generateRSWithLabel(labels map[string]string, image string) extensions.ReplicaSet { - return extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: api.SimpleNameGenerator.GenerateName("replicaset"), - Labels: labels, - }, - Spec: extensions.ReplicaSetSpec{ - Replicas: 1, - Selector: &unversioned.LabelSelector{MatchLabels: labels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: image, - Image: image, - ImagePullPolicy: api.PullAlways, - TerminationMessagePath: api.TerminationMessagePathDefault, - }, - }, - }, - }, - }, - } -} - -// generateRS creates a replica set, with the input deployment's template as its template -func generateRS(deployment extensions.Deployment) extensions.ReplicaSet { - template := GetNewReplicaSetTemplate(&deployment) - return extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: api.SimpleNameGenerator.GenerateName("replicaset"), - Labels: template.Labels, - }, - Spec: extensions.ReplicaSetSpec{ - Template: template, - Selector: &unversioned.LabelSelector{MatchLabels: template.Labels}, - }, - } -} - -// generateDeployment creates a deployment, with the input image as its template -func generateDeployment(image string) extensions.Deployment { - podLabels := map[string]string{"name": image} - terminationSec := int64(30) - return extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: image, - }, - Spec: extensions.DeploymentSpec{ - Replicas: 1, - Selector: &unversioned.LabelSelector{MatchLabels: podLabels}, - Template: api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: podLabels, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: image, - Image: image, - ImagePullPolicy: api.PullAlways, - TerminationMessagePath: api.TerminationMessagePathDefault, - }, - }, - DNSPolicy: api.DNSClusterFirst, - TerminationGracePeriodSeconds: &terminationSec, - RestartPolicy: api.RestartPolicyAlways, - SecurityContext: &api.PodSecurityContext{}, - }, - }, - }, - } -} - -func TestGetNewRC(t *testing.T) { - newDeployment := generateDeployment("nginx") - newRC := generateRS(newDeployment) - - tests := []struct { - test string - objs []runtime.Object - expected *extensions.ReplicaSet - }{ - { - "No new ReplicaSet", - []runtime.Object{ - &api.PodList{}, - &extensions.ReplicaSetList{ - Items: []extensions.ReplicaSet{ - generateRS(generateDeployment("foo")), - generateRS(generateDeployment("bar")), - }, - }, - }, - nil, - }, - { - "Has new ReplicaSet", - []runtime.Object{ - &api.PodList{}, - &extensions.ReplicaSetList{ - Items: []extensions.ReplicaSet{ - generateRS(generateDeployment("foo")), - generateRS(generateDeployment("bar")), - generateRS(generateDeployment("abc")), - newRC, - generateRS(generateDeployment("xyz")), - }, - }, - }, - &newRC, - }, - } - - for _, test := range tests { - fakeClient := &fake.Clientset{} - fakeClient = addListPodsReactor(fakeClient, test.objs[0]) - fakeClient = addListRSReactor(fakeClient, test.objs[1]) - fakeClient = addUpdatePodsReactor(fakeClient) - fakeClient = addUpdateRSReactor(fakeClient) - rs, err := GetNewReplicaSet(&newDeployment, fakeClient) - if err != nil { - t.Errorf("In test case %s, got unexpected error %v", test.test, err) - } - if !api.Semantic.DeepEqual(rs, test.expected) { - t.Errorf("In test case %s, expected %+v, got %+v", test.test, test.expected, rs) - } - } -} - -func TestGetOldRCs(t *testing.T) { - newDeployment := generateDeployment("nginx") - newRS := generateRS(newDeployment) - newRS.Status.FullyLabeledReplicas = newRS.Spec.Replicas - newPod := generatePodFromRS(newRS) - - // create 2 old deployments and related replica sets/pods, with the same labels but different template - oldDeployment := generateDeployment("nginx") - oldDeployment.Spec.Template.Spec.Containers[0].Name = "nginx-old-1" - oldRS := generateRS(oldDeployment) - oldRS.Status.FullyLabeledReplicas = oldRS.Spec.Replicas - oldPod := generatePodFromRS(oldRS) - oldDeployment2 := generateDeployment("nginx") - oldDeployment2.Spec.Template.Spec.Containers[0].Name = "nginx-old-2" - oldRS2 := generateRS(oldDeployment2) - oldRS2.Status.FullyLabeledReplicas = oldRS2.Spec.Replicas - oldPod2 := generatePodFromRS(oldRS2) - - // create 1 ReplicaSet that existed before the deployment, with the same labels as the deployment - existedPod := generatePod(newDeployment.Spec.Template.Labels, "foo") - existedRS := generateRSWithLabel(newDeployment.Spec.Template.Labels, "foo") - existedRS.Status.FullyLabeledReplicas = existedRS.Spec.Replicas - - tests := []struct { - test string - objs []runtime.Object - expected []*extensions.ReplicaSet - }{ - { - "No old ReplicaSets", - []runtime.Object{ - &api.PodList{ - Items: []api.Pod{ - generatePod(newDeployment.Spec.Template.Labels, "foo"), - generatePod(newDeployment.Spec.Template.Labels, "bar"), - newPod, - }, - }, - &extensions.ReplicaSetList{ - Items: []extensions.ReplicaSet{ - generateRS(generateDeployment("foo")), - newRS, - generateRS(generateDeployment("bar")), - }, - }, - }, - []*extensions.ReplicaSet{}, - }, - { - "Has old ReplicaSet", - []runtime.Object{ - &api.PodList{ - Items: []api.Pod{ - oldPod, - oldPod2, - generatePod(map[string]string{"name": "bar"}, "bar"), - generatePod(map[string]string{"name": "xyz"}, "xyz"), - existedPod, - generatePod(newDeployment.Spec.Template.Labels, "abc"), - }, - }, - &extensions.ReplicaSetList{ - Items: []extensions.ReplicaSet{ - oldRS2, - oldRS, - existedRS, - newRS, - generateRSWithLabel(map[string]string{"name": "xyz"}, "xyz"), - generateRSWithLabel(map[string]string{"name": "bar"}, "bar"), - }, - }, - }, - []*extensions.ReplicaSet{&oldRS, &oldRS2, &existedRS}, - }, - } - - for _, test := range tests { - fakeClient := &fake.Clientset{} - fakeClient = addListPodsReactor(fakeClient, test.objs[0]) - fakeClient = addListRSReactor(fakeClient, test.objs[1]) - fakeClient = addGetRSReactor(fakeClient, test.objs[1]) - fakeClient = addUpdatePodsReactor(fakeClient) - fakeClient = addUpdateRSReactor(fakeClient) - rss, _, err := GetOldReplicaSets(&newDeployment, fakeClient) - if err != nil { - t.Errorf("In test case %s, got unexpected error %v", test.test, err) - } - if !equal(rss, test.expected) { - t.Errorf("In test case %q, expected:", test.test) - for _, rs := range test.expected { - t.Errorf("rs = %+v", rs) - } - t.Errorf("In test case %q, got:", test.test) - for _, rs := range rss { - t.Errorf("rs = %+v", rs) - } - } - } -} - -// equal compares the equality of two ReplicaSet slices regardless of their ordering -func equal(rss1, rss2 []*extensions.ReplicaSet) bool { - if reflect.DeepEqual(rss1, rss2) { - return true - } - if rss1 == nil || rss2 == nil || len(rss1) != len(rss2) { - return false - } - count := 0 - for _, rs1 := range rss1 { - for _, rs2 := range rss2 { - if reflect.DeepEqual(rs1, rs2) { - count++ - break - } - } - } - return count == len(rss1) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/diff/diff.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/diff/diff.go deleted file mode 100644 index e907f7f7b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/diff/diff.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 diff - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - "text/tabwriter" - - "github.com/davecgh/go-spew/spew" -) - -// StringDiff diffs a and b and returns a human readable diff. -func StringDiff(a, b string) string { - ba := []byte(a) - bb := []byte(b) - out := []byte{} - i := 0 - for ; i < len(ba) && i < len(bb); i++ { - if ba[i] != bb[i] { - break - } - out = append(out, ba[i]) - } - out = append(out, []byte("\n\nA: ")...) - out = append(out, ba[i:]...) - out = append(out, []byte("\n\nB: ")...) - out = append(out, bb[i:]...) - out = append(out, []byte("\n\n")...) - return string(out) -} - -// ObjectDiff writes the two objects out as JSON and prints out the identical part of -// the objects followed by the remaining part of 'a' and finally the remaining part of 'b'. -// For debugging tests. -func ObjectDiff(a, b interface{}) string { - ab, err := json.Marshal(a) - if err != nil { - panic(fmt.Sprintf("a: %v", err)) - } - bb, err := json.Marshal(b) - if err != nil { - panic(fmt.Sprintf("b: %v", err)) - } - return StringDiff(string(ab), string(bb)) -} - -// ObjectGoPrintDiff is like ObjectDiff, but uses go-spew to print the objects, -// which shows absolutely everything by recursing into every single pointer -// (go's %#v formatters OTOH stop at a certain point). This is needed when you -// can't figure out why reflect.DeepEqual is returning false and nothing is -// showing you differences. This will. -func ObjectGoPrintDiff(a, b interface{}) string { - s := spew.ConfigState{DisableMethods: true} - return StringDiff( - s.Sprintf("%#v", a), - s.Sprintf("%#v", b), - ) -} - -// ObjectGoPrintSideBySide prints a and b as textual dumps side by side, -// enabling easy visual scanning for mismatches. -func ObjectGoPrintSideBySide(a, b interface{}) string { - s := spew.ConfigState{ - Indent: " ", - // Extra deep spew. - DisableMethods: true, - } - sA := s.Sdump(a) - sB := s.Sdump(b) - - linesA := strings.Split(sA, "\n") - linesB := strings.Split(sB, "\n") - width := 0 - for _, s := range linesA { - l := len(s) - if l > width { - width = l - } - } - for _, s := range linesB { - l := len(s) - if l > width { - width = l - } - } - buf := &bytes.Buffer{} - w := tabwriter.NewWriter(buf, width, 0, 1, ' ', 0) - max := len(linesA) - if len(linesB) > max { - max = len(linesB) - } - for i := 0; i < max; i++ { - var a, b string - if i < len(linesA) { - a = linesA[i] - } - if i < len(linesB) { - b = linesB[i] - } - fmt.Fprintf(w, "%s\t%s\n", a, b) - } - w.Flush() - return buf.String() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env.go deleted file mode 100644 index ad4310c25..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 env - -import ( - "os" - "strconv" -) - -func GetEnvAsStringOrFallback(key, defaultValue string) string { - if v := os.Getenv(key); v != "" { - return v - } - return defaultValue -} - -func GetEnvAsIntOrFallback(key string, defaultValue int) (int, error) { - if v := os.Getenv(key); v != "" { - value, err := strconv.Atoi(v) - if err != nil { - return defaultValue, err - } - return value, nil - } - return defaultValue, nil -} - -func GetEnvAsFloat64OrFallback(key string, defaultValue float64) (float64, error) { - if v := os.Getenv(key); v != "" { - value, err := strconv.ParseFloat(v, 64) - if err != nil { - return defaultValue, err - } - return value, nil - } - return defaultValue, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env_test.go deleted file mode 100644 index f7ff0a235..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/env/env_test.go +++ /dev/null @@ -1,68 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 env - -import ( - "os" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetEnvAsStringOrFallback(t *testing.T) { - const expected = "foo" - - assert := assert.New(t) - - key := "FLOCKER_SET_VAR" - os.Setenv(key, expected) - assert.Equal(expected, GetEnvAsStringOrFallback(key, "~"+expected)) - - key = "FLOCKER_UNSET_VAR" - assert.Equal(expected, GetEnvAsStringOrFallback(key, expected)) -} - -func TestGetEnvAsIntOrFallback(t *testing.T) { - const expected = 1 - - assert := assert.New(t) - - key := "FLOCKER_SET_VAR" - os.Setenv(key, strconv.Itoa(expected)) - returnVal, _ := GetEnvAsIntOrFallback(key, 1) - assert.Equal(expected, returnVal) - - key = "FLOCKER_UNSET_VAR" - returnVal, _ = GetEnvAsIntOrFallback(key, expected) - assert.Equal(expected, returnVal) -} - -func TestGetEnvAsFloat64OrFallback(t *testing.T) { - const expected = 1.0 - - assert := assert.New(t) - - key := "FLOCKER_SET_VAR" - os.Setenv(key, "1.0") - returnVal, _ := GetEnvAsFloat64OrFallback(key, 2.0) - assert.Equal(expected, returnVal) - - key = "FLOCKER_UNSET_VAR" - returnVal, _ = GetEnvAsFloat64OrFallback(key, 1.0) - assert.Equal(expected, returnVal) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/errors/errors_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/errors/errors_test.go deleted file mode 100644 index 7ecf919ff..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/errors/errors_test.go +++ /dev/null @@ -1,286 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 errors - -import ( - "fmt" - "reflect" - "testing" -) - -func TestEmptyAggregate(t *testing.T) { - var slice []error - var agg Aggregate - var err error - - agg = NewAggregate(slice) - if agg != nil { - t.Errorf("expected nil, got %#v", agg) - } - err = NewAggregate(slice) - if err != nil { - t.Errorf("expected nil, got %#v", err) - } - - // This is not normally possible, but pedantry demands I test it. - agg = aggregate(slice) // empty aggregate - if s := agg.Error(); s != "" { - t.Errorf("expected empty string, got %q", s) - } - if s := agg.Errors(); len(s) != 0 { - t.Errorf("expected empty slice, got %#v", s) - } - err = agg.(error) - if s := err.Error(); s != "" { - t.Errorf("expected empty string, got %q", s) - } -} - -func TestSingularAggregate(t *testing.T) { - var slice []error = []error{fmt.Errorf("err")} - var agg Aggregate - var err error - - agg = NewAggregate(slice) - if agg == nil { - t.Errorf("expected non-nil") - } - if s := agg.Error(); s != "err" { - t.Errorf("expected 'err', got %q", s) - } - if s := agg.Errors(); len(s) != 1 { - t.Errorf("expected one-element slice, got %#v", s) - } - if s := agg.Errors()[0].Error(); s != "err" { - t.Errorf("expected 'err', got %q", s) - } - - err = agg.(error) - if err == nil { - t.Errorf("expected non-nil") - } - if s := err.Error(); s != "err" { - t.Errorf("expected 'err', got %q", s) - } -} - -func TestPluralAggregate(t *testing.T) { - var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("123")} - var agg Aggregate - var err error - - agg = NewAggregate(slice) - if agg == nil { - t.Errorf("expected non-nil") - } - if s := agg.Error(); s != "[abc, 123]" { - t.Errorf("expected '[abc, 123]', got %q", s) - } - if s := agg.Errors(); len(s) != 2 { - t.Errorf("expected two-elements slice, got %#v", s) - } - if s := agg.Errors()[0].Error(); s != "abc" { - t.Errorf("expected '[abc, 123]', got %q", s) - } - - err = agg.(error) - if err == nil { - t.Errorf("expected non-nil") - } - if s := err.Error(); s != "[abc, 123]" { - t.Errorf("expected '[abc, 123]', got %q", s) - } -} - -func TestFilterOut(t *testing.T) { - testCases := []struct { - err error - filter []Matcher - expected error - }{ - { - nil, - []Matcher{}, - nil, - }, - { - aggregate{}, - []Matcher{}, - nil, - }, - { - aggregate{fmt.Errorf("abc")}, - []Matcher{}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{fmt.Errorf("abc")}, - []Matcher{func(err error) bool { return false }}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{fmt.Errorf("abc")}, - []Matcher{func(err error) bool { return true }}, - nil, - }, - { - aggregate{fmt.Errorf("abc")}, - []Matcher{func(err error) bool { return false }, func(err error) bool { return false }}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{fmt.Errorf("abc")}, - []Matcher{func(err error) bool { return false }, func(err error) bool { return true }}, - nil, - }, - { - aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, - []Matcher{func(err error) bool { return err.Error() == "def" }}, - aggregate{fmt.Errorf("abc"), fmt.Errorf("ghi")}, - }, - { - aggregate{aggregate{fmt.Errorf("abc")}}, - []Matcher{}, - aggregate{aggregate{fmt.Errorf("abc")}}, - }, - { - aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, - []Matcher{}, - aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, - }, - { - aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, - []Matcher{func(err error) bool { return err.Error() == "def" }}, - aggregate{aggregate{fmt.Errorf("abc")}}, - }, - } - for i, testCase := range testCases { - err := FilterOut(testCase.err, testCase.filter...) - if !reflect.DeepEqual(testCase.expected, err) { - t.Errorf("%d: expected %v, got %v", i, testCase.expected, err) - } - } -} - -func TestFlatten(t *testing.T) { - testCases := []struct { - agg Aggregate - expected Aggregate - }{ - { - nil, - nil, - }, - { - aggregate{}, - nil, - }, - { - aggregate{fmt.Errorf("abc")}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, - aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, - }, - { - aggregate{aggregate{fmt.Errorf("abc")}}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{aggregate{aggregate{fmt.Errorf("abc")}}}, - aggregate{fmt.Errorf("abc")}, - }, - { - aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, - aggregate{fmt.Errorf("abc"), fmt.Errorf("def")}, - }, - { - aggregate{aggregate{aggregate{fmt.Errorf("abc")}, fmt.Errorf("def"), aggregate{fmt.Errorf("ghi")}}}, - aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, - }, - } - for i, testCase := range testCases { - agg := Flatten(testCase.agg) - if !reflect.DeepEqual(testCase.expected, agg) { - t.Errorf("%d: expected %v, got %v", i, testCase.expected, agg) - } - } -} - -func TestAggregateGoroutines(t *testing.T) { - testCases := []struct { - errs []error - expected map[string]bool // can't compare directly to Aggregate due to non-deterministic ordering - }{ - { - []error{}, - nil, - }, - { - []error{nil}, - nil, - }, - { - []error{nil, nil}, - nil, - }, - { - []error{fmt.Errorf("1")}, - map[string]bool{"1": true}, - }, - { - []error{fmt.Errorf("1"), nil}, - map[string]bool{"1": true}, - }, - { - []error{fmt.Errorf("1"), fmt.Errorf("267")}, - map[string]bool{"1": true, "267": true}, - }, - { - []error{fmt.Errorf("1"), nil, fmt.Errorf("1234")}, - map[string]bool{"1": true, "1234": true}, - }, - { - []error{nil, fmt.Errorf("1"), nil, fmt.Errorf("1234"), fmt.Errorf("22")}, - map[string]bool{"1": true, "1234": true, "22": true}, - }, - } - for i, testCase := range testCases { - funcs := make([]func() error, len(testCase.errs)) - for i := range testCase.errs { - err := testCase.errs[i] - funcs[i] = func() error { return err } - } - agg := AggregateGoroutines(funcs...) - if agg == nil { - if len(testCase.expected) > 0 { - t.Errorf("%d: expected %v, got nil", i, testCase.expected) - } - continue - } - if len(agg.Errors()) != len(testCase.expected) { - t.Errorf("%d: expected %d errors in aggregate, got %v", i, len(testCase.expected), agg) - continue - } - for _, err := range agg.Errors() { - if !testCase.expected[err.Error()] { - t.Errorf("%d: expected %v, got aggregate containing %v", i, testCase.expected, err) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/doc.go deleted file mode 100644 index 64c1541bf..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 exec provides an injectable interface and implementations for running commands. -package exec diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec.go deleted file mode 100644 index 80444a9d8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec.go +++ /dev/null @@ -1,129 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 exec - -import ( - osexec "os/exec" - "syscall" -) - -// ErrExecutableNotFound is returned if the executable is not found. -var ErrExecutableNotFound = osexec.ErrNotFound - -// Interface is an interface that presents a subset of the os/exec API. Use this -// when you want to inject fakeable/mockable exec behavior. -type Interface interface { - // Command returns a Cmd instance which can be used to run a single command. - // This follows the pattern of package os/exec. - Command(cmd string, args ...string) Cmd - - // LookPath wraps os/exec.LookPath - LookPath(file string) (string, error) -} - -// Cmd is an interface that presents an API that is very similar to Cmd from os/exec. -// As more functionality is needed, this can grow. Since Cmd is a struct, we will have -// to replace fields with get/set method pairs. -type Cmd interface { - // CombinedOutput runs the command and returns its combined standard output - // and standard error. This follows the pattern of package os/exec. - CombinedOutput() ([]byte, error) - // Output runs the command and returns standard output, but not standard err - Output() ([]byte, error) - SetDir(dir string) -} - -// ExitError is an interface that presents an API similar to os.ProcessState, which is -// what ExitError from os/exec is. This is designed to make testing a bit easier and -// probably loses some of the cross-platform properties of the underlying library. -type ExitError interface { - String() string - Error() string - Exited() bool - ExitStatus() int -} - -// Implements Interface in terms of really exec()ing. -type executor struct{} - -// New returns a new Interface which will os/exec to run commands. -func New() Interface { - return &executor{} -} - -// Command is part of the Interface interface. -func (executor *executor) Command(cmd string, args ...string) Cmd { - return (*cmdWrapper)(osexec.Command(cmd, args...)) -} - -// LookPath is part of the Interface interface -func (executor *executor) LookPath(file string) (string, error) { - return osexec.LookPath(file) -} - -// Wraps exec.Cmd so we can capture errors. -type cmdWrapper osexec.Cmd - -func (cmd *cmdWrapper) SetDir(dir string) { - cmd.Dir = dir -} - -// CombinedOutput is part of the Cmd interface. -func (cmd *cmdWrapper) CombinedOutput() ([]byte, error) { - out, err := (*osexec.Cmd)(cmd).CombinedOutput() - if err != nil { - return out, handleError(err) - } - return out, nil -} - -func (cmd *cmdWrapper) Output() ([]byte, error) { - out, err := (*osexec.Cmd)(cmd).Output() - if err != nil { - return out, handleError(err) - } - return out, nil -} - -func handleError(err error) error { - if ee, ok := err.(*osexec.ExitError); ok { - // Force a compile fail if exitErrorWrapper can't convert to ExitError. - var x ExitError = &exitErrorWrapper{ee} - return x - } - if ee, ok := err.(*osexec.Error); ok { - if ee.Err == osexec.ErrNotFound { - return ErrExecutableNotFound - } - } - return err -} - -// exitErrorWrapper is an implementation of ExitError in terms of os/exec ExitError. -// Note: standard exec.ExitError is type *os.ProcessState, which already implements Exited(). -type exitErrorWrapper struct { - *osexec.ExitError -} - -// ExitStatus is part of the ExitError interface. -func (eew exitErrorWrapper) ExitStatus() int { - ws, ok := eew.Sys().(syscall.WaitStatus) - if !ok { - panic("can't call ExitStatus() on a non-WaitStatus exitErrorWrapper") - } - return ws.ExitStatus() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec_test.go deleted file mode 100644 index d24f9cc19..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/exec_test.go +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 exec - -import ( - osexec "os/exec" - "testing" -) - -func TestExecutorNoArgs(t *testing.T) { - ex := New() - - cmd := ex.Command("true") - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %v", err) - } - if len(out) != 0 { - t.Errorf("expected no output, got %q", string(out)) - } - - cmd = ex.Command("false") - out, err = cmd.CombinedOutput() - if err == nil { - t.Errorf("expected failure, got nil error") - } - if len(out) != 0 { - t.Errorf("expected no output, got %q", string(out)) - } - ee, ok := err.(ExitError) - if !ok { - t.Errorf("expected an ExitError, got %+v", err) - } - if ee.Exited() { - if code := ee.ExitStatus(); code != 1 { - t.Errorf("expected exit status 1, got %d", code) - } - } - - cmd = ex.Command("/does/not/exist") - out, err = cmd.CombinedOutput() - if err == nil { - t.Errorf("expected failure, got nil error") - } - if ee, ok := err.(ExitError); ok { - t.Errorf("expected non-ExitError, got %+v", ee) - } -} - -func TestExecutorWithArgs(t *testing.T) { - ex := New() - - cmd := ex.Command("/bin/echo", "stdout") - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %+v", err) - } - if string(out) != "stdout\n" { - t.Errorf("unexpected output: %q", string(out)) - } - - cmd = ex.Command("/bin/sh", "-c", "echo stderr > /dev/stderr") - out, err = cmd.CombinedOutput() - if err != nil { - t.Errorf("expected success, got %+v", err) - } - if string(out) != "stderr\n" { - t.Errorf("unexpected output: %q", string(out)) - } -} - -func TestLookPath(t *testing.T) { - ex := New() - - shExpected, _ := osexec.LookPath("sh") - sh, _ := ex.LookPath("sh") - if sh != shExpected { - t.Errorf("unexpected result for LookPath: got %s, expected %s", sh, shExpected) - } -} - -func TestExecutableNotFound(t *testing.T) { - exec := New() - cmd := exec.Command("fake_executable_name") - _, err := cmd.CombinedOutput() - if err != ErrExecutableNotFound { - t.Errorf("Expected error ErrExecutableNotFound but got %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/fake_exec.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/fake_exec.go deleted file mode 100644 index 40df52921..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/exec/fake_exec.go +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 exec - -import ( - "fmt" -) - -// A simple scripted Interface type. -type FakeExec struct { - CommandScript []FakeCommandAction - CommandCalls int - LookPathFunc func(string) (string, error) -} - -type FakeCommandAction func(cmd string, args ...string) Cmd - -func (fake *FakeExec) Command(cmd string, args ...string) Cmd { - if fake.CommandCalls > len(fake.CommandScript)-1 { - panic(fmt.Sprintf("ran out of Command() actions. Could not handle command [%d]: %s args: %v", fake.CommandCalls, cmd, args)) - } - i := fake.CommandCalls - fake.CommandCalls++ - return fake.CommandScript[i](cmd, args...) -} - -func (fake *FakeExec) LookPath(file string) (string, error) { - return fake.LookPathFunc(file) -} - -// A simple scripted Cmd type. -type FakeCmd struct { - Argv []string - CombinedOutputScript []FakeCombinedOutputAction - CombinedOutputCalls int - CombinedOutputLog [][]string - Dirs []string -} - -func InitFakeCmd(fake *FakeCmd, cmd string, args ...string) Cmd { - fake.Argv = append([]string{cmd}, args...) - return fake -} - -type FakeCombinedOutputAction func() ([]byte, error) - -func (fake *FakeCmd) SetDir(dir string) { - fake.Dirs = append(fake.Dirs, dir) -} - -func (fake *FakeCmd) CombinedOutput() ([]byte, error) { - if fake.CombinedOutputCalls > len(fake.CombinedOutputScript)-1 { - panic("ran out of CombinedOutput() actions") - } - if fake.CombinedOutputLog == nil { - fake.CombinedOutputLog = [][]string{} - } - i := fake.CombinedOutputCalls - fake.CombinedOutputLog = append(fake.CombinedOutputLog, append([]string{}, fake.Argv...)) - fake.CombinedOutputCalls++ - return fake.CombinedOutputScript[i]() -} - -func (fake *FakeCmd) Output() ([]byte, error) { - return nil, fmt.Errorf("unimplemented") -} - -// A simple fake ExitError type. -type FakeExitError struct { - Status int -} - -func (fake *FakeExitError) String() string { - return fmt.Sprintf("exit %d", fake.Status) -} - -func (fake *FakeExitError) Error() string { - return fake.String() -} - -func (fake *FakeExitError) Exited() bool { - return true -} - -func (fake *FakeExitError) ExitStatus() int { - return fake.Status -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_other.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_other.go deleted file mode 100644 index b80981882..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_other.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build !linux,!darwin,!freebsd,!openbsd,!netbsd,!dragonfly - -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 flock - -// Acquire is not implemented on non-unix systems. -func Acquire(path string) error { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_unix.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_unix.go deleted file mode 100644 index 88ca8d700..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flock/flock_unix.go +++ /dev/null @@ -1,51 +0,0 @@ -// +build linux darwin freebsd openbsd netbsd dragonfly - -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 flock - -import ( - "os" - "sync" - - "golang.org/x/sys/unix" -) - -var ( - // lock guards lockfile. Assignment is not atomic. - lock sync.Mutex - // os.File has a runtime.Finalizer so the fd will be closed if the struct - // is garbage collected. Let's hold onto a reference so that doesn't happen. - lockfile *os.File -) - -// Acquire acquires a lock on a file for the duration of the process. This method -// is reentrant. -func Acquire(path string) error { - lock.Lock() - defer lock.Unlock() - var err error - if lockfile, err = os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600); err != nil { - return err - } - - opts := unix.Flock_t{Type: unix.F_WRLCK} - if err := unix.FcntlFlock(lockfile.Fd(), unix.F_SETLKW, &opts); err != nil { - return err - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/backoff_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/backoff_test.go deleted file mode 100644 index 350c5b790..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/backoff_test.go +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 flowcontrol - -import ( - "k8s.io/kubernetes/pkg/util" - "testing" - "time" -) - -func TestSlowBackoff(t *testing.T) { - id := "_idSlow" - tc := util.NewFakeClock(time.Now()) - step := time.Second - maxDuration := 50 * step - - b := NewFakeBackOff(step, maxDuration, tc) - cases := []time.Duration{0, 1, 2, 4, 8, 16, 32, 50, 50, 50} - for ix, c := range cases { - tc.Step(step) - w := b.Get(id) - if w != c*step { - t.Errorf("input: '%d': expected %s, got %s", ix, c*step, w) - } - b.Next(id, tc.Now()) - } - - //Now confirm that the Reset cancels backoff. - b.Next(id, tc.Now()) - b.Reset(id) - if b.Get(id) != 0 { - t.Errorf("Reset didn't clear the backoff.") - } - -} - -func TestBackoffReset(t *testing.T) { - id := "_idReset" - tc := util.NewFakeClock(time.Now()) - step := time.Second - maxDuration := step * 5 - b := NewFakeBackOff(step, maxDuration, tc) - startTime := tc.Now() - - // get to backoff = maxDuration - for i := 0; i <= int(maxDuration/step); i++ { - tc.Step(step) - b.Next(id, tc.Now()) - } - - // backoff should be capped at maxDuration - if !b.IsInBackOffSince(id, tc.Now()) { - t.Errorf("expected to be in Backoff got %s", b.Get(id)) - } - - lastUpdate := tc.Now() - tc.Step(2*maxDuration + step) // time += 11s, 11 > 2*maxDuration - if b.IsInBackOffSince(id, lastUpdate) { - t.Errorf("expected to not be in Backoff after reset (start=%s, now=%s, lastUpdate=%s), got %s", startTime, tc.Now(), lastUpdate, b.Get(id)) - } -} - -func TestBackoffHightWaterMark(t *testing.T) { - id := "_idHiWaterMark" - tc := util.NewFakeClock(time.Now()) - step := time.Second - maxDuration := 5 * step - b := NewFakeBackOff(step, maxDuration, tc) - - // get to backoff = maxDuration - for i := 0; i <= int(maxDuration/step); i++ { - tc.Step(step) - b.Next(id, tc.Now()) - } - - // backoff high watermark expires after 2*maxDuration - tc.Step(maxDuration + step) - b.Next(id, tc.Now()) - - if b.Get(id) != maxDuration { - t.Errorf("expected Backoff to stay at high watermark %s got %s", maxDuration, b.Get(id)) - } -} - -func TestBackoffGC(t *testing.T) { - id := "_idGC" - tc := util.NewFakeClock(time.Now()) - step := time.Second - maxDuration := 5 * step - - b := NewFakeBackOff(step, maxDuration, tc) - - for i := 0; i <= int(maxDuration/step); i++ { - tc.Step(step) - b.Next(id, tc.Now()) - } - lastUpdate := tc.Now() - tc.Step(maxDuration + step) - b.GC() - _, found := b.perItemBackoff[id] - if !found { - t.Errorf("expected GC to skip entry, elapsed time=%s maxDuration=%s", tc.Now().Sub(lastUpdate), maxDuration) - } - - tc.Step(maxDuration + step) - b.GC() - r, found := b.perItemBackoff[id] - if found { - t.Errorf("expected GC of entry after %s got entry %v", tc.Now().Sub(lastUpdate), r) - } -} - -func TestIsInBackOffSinceUpdate(t *testing.T) { - id := "_idIsInBackOffSinceUpdate" - tc := util.NewFakeClock(time.Now()) - step := time.Second - maxDuration := 10 * step - b := NewFakeBackOff(step, maxDuration, tc) - startTime := tc.Now() - - cases := []struct { - tick time.Duration - inBackOff bool - value int - }{ - {tick: 0, inBackOff: false, value: 0}, - {tick: 1, inBackOff: false, value: 1}, - {tick: 2, inBackOff: true, value: 2}, - {tick: 3, inBackOff: false, value: 2}, - {tick: 4, inBackOff: true, value: 4}, - {tick: 5, inBackOff: true, value: 4}, - {tick: 6, inBackOff: true, value: 4}, - {tick: 7, inBackOff: false, value: 4}, - {tick: 8, inBackOff: true, value: 8}, - {tick: 9, inBackOff: true, value: 8}, - {tick: 10, inBackOff: true, value: 8}, - {tick: 11, inBackOff: true, value: 8}, - {tick: 12, inBackOff: true, value: 8}, - {tick: 13, inBackOff: true, value: 8}, - {tick: 14, inBackOff: true, value: 8}, - {tick: 15, inBackOff: false, value: 8}, - {tick: 16, inBackOff: true, value: 10}, - {tick: 17, inBackOff: true, value: 10}, - {tick: 18, inBackOff: true, value: 10}, - {tick: 19, inBackOff: true, value: 10}, - {tick: 20, inBackOff: true, value: 10}, - {tick: 21, inBackOff: true, value: 10}, - {tick: 22, inBackOff: true, value: 10}, - {tick: 23, inBackOff: true, value: 10}, - {tick: 24, inBackOff: true, value: 10}, - {tick: 25, inBackOff: false, value: 10}, - {tick: 26, inBackOff: true, value: 10}, - {tick: 27, inBackOff: true, value: 10}, - {tick: 28, inBackOff: true, value: 10}, - {tick: 29, inBackOff: true, value: 10}, - {tick: 30, inBackOff: true, value: 10}, - {tick: 31, inBackOff: true, value: 10}, - {tick: 32, inBackOff: true, value: 10}, - {tick: 33, inBackOff: true, value: 10}, - {tick: 34, inBackOff: true, value: 10}, - {tick: 35, inBackOff: false, value: 10}, - {tick: 56, inBackOff: false, value: 0}, - {tick: 57, inBackOff: false, value: 1}, - } - - for _, c := range cases { - tc.SetTime(startTime.Add(c.tick * step)) - if c.inBackOff != b.IsInBackOffSinceUpdate(id, tc.Now()) { - t.Errorf("expected IsInBackOffSinceUpdate %v got %v at tick %s", c.inBackOff, b.IsInBackOffSinceUpdate(id, tc.Now()), c.tick*step) - } - - if c.inBackOff && (time.Duration(c.value)*step != b.Get(id)) { - t.Errorf("expected backoff value=%s got %s at tick %s", time.Duration(c.value)*step, b.Get(id), c.tick*step) - } - - if !c.inBackOff { - b.Next(id, tc.Now()) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/throttle_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/throttle_test.go deleted file mode 100644 index 30b792ec0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flowcontrol/throttle_test.go +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 flowcontrol - -import ( - "math" - "sync" - "testing" - "time" -) - -func TestBasicThrottle(t *testing.T) { - r := NewTokenBucketRateLimiter(1, 3) - for i := 0; i < 3; i++ { - if !r.TryAccept() { - t.Error("unexpected false accept") - } - } - if r.TryAccept() { - t.Error("unexpected true accept") - } -} - -func TestIncrementThrottle(t *testing.T) { - r := NewTokenBucketRateLimiter(1, 1) - if !r.TryAccept() { - t.Error("unexpected false accept") - } - if r.TryAccept() { - t.Error("unexpected true accept") - } - - // Allow to refill - time.Sleep(2 * time.Second) - - if !r.TryAccept() { - t.Error("unexpected false accept") - } -} - -func TestThrottle(t *testing.T) { - r := NewTokenBucketRateLimiter(10, 5) - - // Should consume 5 tokens immediately, then - // the remaining 11 should take at least 1 second (0.1s each) - expectedFinish := time.Now().Add(time.Second * 1) - for i := 0; i < 16; i++ { - r.Accept() - } - if time.Now().Before(expectedFinish) { - t.Error("rate limit was not respected, finished too early") - } -} - -func TestRateLimiterSaturation(t *testing.T) { - const e = 0.000001 - tests := []struct { - capacity int - take int - - expectedSaturation float64 - }{ - {1, 1, 1}, - {10, 3, 0.3}, - } - for i, tt := range tests { - rl := NewTokenBucketRateLimiter(1, tt.capacity) - for i := 0; i < tt.take; i++ { - rl.Accept() - } - if math.Abs(rl.Saturation()-tt.expectedSaturation) > e { - t.Fatalf("#%d: Saturation rate difference isn't within tolerable range\n want=%f, get=%f", - i, tt.expectedSaturation, rl.Saturation()) - } - } -} - -func TestAlwaysFake(t *testing.T) { - rl := NewFakeAlwaysRateLimiter() - if !rl.TryAccept() { - t.Error("TryAccept in AlwaysFake should return true.") - } - // If this will block the test will timeout - rl.Accept() -} - -func TestNeverFake(t *testing.T) { - rl := NewFakeNeverRateLimiter() - if rl.TryAccept() { - t.Error("TryAccept in NeverFake should return false.") - } - - finished := false - wg := sync.WaitGroup{} - wg.Add(1) - go func() { - rl.Accept() - finished = true - wg.Done() - }() - - // Wait some time to make sure it never finished. - time.Sleep(time.Second) - if finished { - t.Error("Accept should block forever in NeverFake.") - } - - rl.Stop() - wg.Wait() - if !finished { - t.Error("Stop should make Accept unblock in NeverFake.") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/doc.go deleted file mode 100644 index 485b99926..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 flushwriter implements a wrapper for a writer that flushes on every -// write if that writer implements the io.Flusher interface -package flushwriter diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer.go deleted file mode 100644 index 0a9d88a78..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 flushwriter - -import ( - "io" - "net/http" -) - -// Wrap wraps an io.Writer into a writer that flushes after every write if -// the writer implements the Flusher interface. -func Wrap(w io.Writer) io.Writer { - fw := &flushWriter{ - writer: w, - } - if flusher, ok := w.(http.Flusher); ok { - fw.flusher = flusher - } - return fw -} - -// flushWriter provides wrapper for responseWriter with HTTP streaming capabilities -type flushWriter struct { - flusher http.Flusher - writer io.Writer -} - -// Write is a FlushWriter implementation of the io.Writer that sends any buffered -// data to the client. -func (fw *flushWriter) Write(p []byte) (n int, err error) { - n, err = fw.writer.Write(p) - if err != nil { - return - } - if fw.flusher != nil { - fw.flusher.Flush() - } - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer_test.go deleted file mode 100644 index d40b0bb00..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/flushwriter/writer_test.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 flushwriter - -import ( - "fmt" - "testing" -) - -type writerWithFlush struct { - writeCount, flushCount int - err error -} - -func (w *writerWithFlush) Flush() { - w.flushCount++ -} - -func (w *writerWithFlush) Write(p []byte) (n int, err error) { - w.writeCount++ - return len(p), w.err -} - -type writerWithNoFlush struct { - writeCount int -} - -func (w *writerWithNoFlush) Write(p []byte) (n int, err error) { - w.writeCount++ - return len(p), nil -} - -func TestWriteWithFlush(t *testing.T) { - w := &writerWithFlush{} - fw := Wrap(w) - for i := 0; i < 10; i++ { - _, err := fw.Write([]byte("Test write")) - if err != nil { - t.Errorf("Unexpected error while writing with flush writer: %v", err) - } - } - if w.flushCount != 10 { - t.Errorf("Flush not called the expected number of times. Actual: %d", w.flushCount) - } - if w.writeCount != 10 { - t.Errorf("Write not called the expected number of times. Actual: %d", w.writeCount) - } -} - -func TestWriteWithoutFlush(t *testing.T) { - w := &writerWithNoFlush{} - fw := Wrap(w) - for i := 0; i < 10; i++ { - _, err := fw.Write([]byte("Test write")) - if err != nil { - t.Errorf("Unexpected error while writing with flush writer: %v", err) - } - } - if w.writeCount != 10 { - t.Errorf("Write not called the expected number of times. Actual: %d", w.writeCount) - } -} - -func TestWriteError(t *testing.T) { - e := fmt.Errorf("Error") - w := &writerWithFlush{err: e} - fw := Wrap(w) - _, err := fw.Write([]byte("Test write")) - if err != e { - t.Errorf("Did not get expected error. Got: %#v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/framer/framer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/framer/framer_test.go deleted file mode 100644 index c5e4ba874..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/framer/framer_test.go +++ /dev/null @@ -1,176 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 framer - -import ( - "bytes" - "io" - "io/ioutil" - "testing" -) - -func TestRead(t *testing.T) { - data := []byte{ - 0x00, 0x00, 0x00, 0x04, - 0x01, 0x02, 0x03, 0x04, - 0x00, 0x00, 0x00, 0x03, - 0x05, 0x06, 0x07, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x08, - } - b := bytes.NewBuffer(data) - r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) - buf := make([]byte, 1) - if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x02}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read the remaining frame - buf = make([]byte, 2) - if n, err := r.Read(buf); err != nil && n != 2 && bytes.Equal(buf, []byte{0x03, 0x04}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read with buffer equal to frame - buf = make([]byte, 3) - if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x07}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read empty frame - buf = make([]byte, 3) - if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read with larger buffer than frame - buf = make([]byte, 3) - if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read EOF - if n, err := r.Read(buf); err != io.EOF && n != 0 { - t.Fatalf("unexpected: %v %d", err, n) - } -} - -func TestReadLarge(t *testing.T) { - data := []byte{ - 0x00, 0x00, 0x00, 0x04, - 0x01, 0x02, 0x03, 0x04, - 0x00, 0x00, 0x00, 0x03, - 0x05, 0x06, 0x07, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x08, - } - b := bytes.NewBuffer(data) - r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) - buf := make([]byte, 40) - if n, err := r.Read(buf); err != nil && n != 4 && bytes.Equal(buf, []byte{0x01, 0x02, 0x03, 0x04}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x7}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read EOF - if n, err := r.Read(buf); err != io.EOF && n != 0 { - t.Fatalf("unexpected: %v %d", err, n) - } -} -func TestReadInvalidFrame(t *testing.T) { - data := []byte{ - 0x00, 0x00, 0x00, 0x04, - 0x01, 0x02, - } - b := bytes.NewBuffer(data) - r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) - buf := make([]byte, 1) - if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read the remaining frame - buf = make([]byte, 3) - if n, err := r.Read(buf); err != io.ErrUnexpectedEOF && n != 1 && bytes.Equal(buf, []byte{0x02}) { - t.Fatalf("unexpected: %v %d %v", err, n, buf) - } - // read EOF - if n, err := r.Read(buf); err != io.EOF && n != 0 { - t.Fatalf("unexpected: %v %d", err, n) - } -} - -func TestJSONFrameReader(t *testing.T) { - b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") - r := NewJSONFramedReader(ioutil.NopCloser(b)) - buf := make([]byte, 20) - if n, err := r.Read(buf); err != nil || n != 13 || string(buf[:n]) != `{"test":true}` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != nil || n != 5 || string(buf[:n]) != `["a"]` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != io.EOF || n != 0 { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } -} - -func TestJSONFrameReaderShortBuffer(t *testing.T) { - b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") - r := NewJSONFramedReader(ioutil.NopCloser(b)) - buf := make([]byte, 3) - - if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `{"t` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `est` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `":t` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `rue` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `}` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - - if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - - if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `["a` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - if n, err := r.Read(buf); err != nil || n != 2 || string(buf[:n]) != `"]` { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } - - if n, err := r.Read(buf); err != io.EOF || n != 0 { - t.Fatalf("unexpected: %v %d %q", err, n, buf) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/hash/hash_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/hash/hash_test.go deleted file mode 100644 index 3bba3b074..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/hash/hash_test.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 hash - -import ( - "fmt" - "hash/adler32" - "testing" - - "github.com/davecgh/go-spew/spew" -) - -type A struct { - x int - y string -} - -type B struct { - x []int - y map[string]bool -} - -type C struct { - x int - y string -} - -func (c C) String() string { - return fmt.Sprintf("%d:%s", c.x, c.y) -} - -func TestDeepHashObject(t *testing.T) { - successCases := []func() interface{}{ - func() interface{} { return 8675309 }, - func() interface{} { return "Jenny, I got your number" }, - func() interface{} { return []string{"eight", "six", "seven"} }, - func() interface{} { return [...]int{5, 3, 0, 9} }, - func() interface{} { return map[int]string{8: "8", 6: "6", 7: "7"} }, - func() interface{} { return map[string]int{"5": 5, "3": 3, "0": 0, "9": 9} }, - func() interface{} { return A{867, "5309"} }, - func() interface{} { return &A{867, "5309"} }, - func() interface{} { - return B{[]int{8, 6, 7}, map[string]bool{"5": true, "3": true, "0": true, "9": true}} - }, - func() interface{} { return map[A]bool{A{8675309, "Jenny"}: true, A{9765683, "!Jenny"}: false} }, - func() interface{} { return map[C]bool{C{8675309, "Jenny"}: true, C{9765683, "!Jenny"}: false} }, - func() interface{} { return map[*A]bool{&A{8675309, "Jenny"}: true, &A{9765683, "!Jenny"}: false} }, - func() interface{} { return map[*C]bool{&C{8675309, "Jenny"}: true, &C{9765683, "!Jenny"}: false} }, - } - - for _, tc := range successCases { - hasher1 := adler32.New() - DeepHashObject(hasher1, tc()) - hash1 := hasher1.Sum32() - DeepHashObject(hasher1, tc()) - hash2 := hasher1.Sum32() - if hash1 != hash2 { - t.Fatalf("hash of the same object (%q) produced different results: %d vs %d", toString(tc()), hash1, hash2) - } - for i := 0; i < 100; i++ { - hasher2 := adler32.New() - - DeepHashObject(hasher1, tc()) - hash1a := hasher1.Sum32() - DeepHashObject(hasher2, tc()) - hash2a := hasher2.Sum32() - - if hash1a != hash1 { - t.Errorf("repeated hash of the same object (%q) produced different results: %d vs %d", toString(tc()), hash1, hash1a) - } - if hash2a != hash2 { - t.Errorf("repeated hash of the same object (%q) produced different results: %d vs %d", toString(tc()), hash2, hash2a) - } - if hash1a != hash2a { - t.Errorf("hash of the same object produced (%q) different results: %d vs %d", toString(tc()), hash1a, hash2a) - } - } - } -} - -func toString(obj interface{}) string { - return spew.Sprintf("%#v", obj) -} - -type wheel struct { - radius uint32 -} - -type unicycle struct { - primaryWheel *wheel - licencePlateID string - tags map[string]string -} - -func TestDeepObjectPointer(t *testing.T) { - // Arrange - wheel1 := wheel{radius: 17} - wheel2 := wheel{radius: 22} - wheel3 := wheel{radius: 17} - - myUni1 := unicycle{licencePlateID: "blah", primaryWheel: &wheel1, tags: map[string]string{"color": "blue", "name": "john"}} - myUni2 := unicycle{licencePlateID: "blah", primaryWheel: &wheel2, tags: map[string]string{"color": "blue", "name": "john"}} - myUni3 := unicycle{licencePlateID: "blah", primaryWheel: &wheel3, tags: map[string]string{"color": "blue", "name": "john"}} - - // Run it more than once to verify determinism of hasher. - for i := 0; i < 100; i++ { - hasher1 := adler32.New() - hasher2 := adler32.New() - hasher3 := adler32.New() - // Act - DeepHashObject(hasher1, myUni1) - hash1 := hasher1.Sum32() - DeepHashObject(hasher1, myUni1) - hash1a := hasher1.Sum32() - DeepHashObject(hasher2, myUni2) - hash2 := hasher2.Sum32() - DeepHashObject(hasher3, myUni3) - hash3 := hasher3.Sum32() - - // Assert - if hash1 != hash1a { - t.Errorf("repeated hash of the same object produced different results: %d vs %d", hash1, hash1a) - } - - if hash1 == hash2 { - t.Errorf("hash1 (%d) and hash2(%d) must be different because they have different values for wheel size", hash1, hash2) - } - - if hash1 != hash3 { - t.Errorf("hash1 (%d) and hash3(%d) must be the same because although they point to different objects, they have the same values for wheel size", hash1, hash3) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/doc.go deleted file mode 100644 index b474fc572..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 httpstream adds multiplexed streaming support to HTTP requests and -// responses via connection upgrades. -package httpstream diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream.go deleted file mode 100644 index 3ce3b02a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 httpstream - -import ( - "fmt" - "io" - "net/http" - "strings" - "time" -) - -const ( - HeaderConnection = "Connection" - HeaderUpgrade = "Upgrade" - HeaderProtocolVersion = "X-Stream-Protocol-Version" - HeaderAcceptedProtocolVersions = "X-Accepted-Stream-Protocol-Versions" -) - -// NewStreamHandler defines a function that is called when a new Stream is -// received. If no error is returned, the Stream is accepted; otherwise, -// the stream is rejected. After the reply frame has been sent, replySent is closed. -type NewStreamHandler func(stream Stream, replySent <-chan struct{}) error - -// NoOpNewStreamHandler is a stream handler that accepts a new stream and -// performs no other logic. -func NoOpNewStreamHandler(stream Stream, replySent <-chan struct{}) error { return nil } - -// Dialer knows how to open a streaming connection to a server. -type Dialer interface { - - // Dial opens a streaming connection to a server using one of the protocols - // specified (in order of most preferred to least preferred). - Dial(protocols ...string) (Connection, string, error) -} - -// UpgradeRoundTripper is a type of http.RoundTripper that is able to upgrade -// HTTP requests to support multiplexed bidirectional streams. After RoundTrip() -// is invoked, if the upgrade is successful, clients may retrieve the upgraded -// connection by calling UpgradeRoundTripper.Connection(). -type UpgradeRoundTripper interface { - http.RoundTripper - // NewConnection validates the response and creates a new Connection. - NewConnection(resp *http.Response) (Connection, error) -} - -// ResponseUpgrader knows how to upgrade HTTP requests and responses to -// add streaming support to them. -type ResponseUpgrader interface { - // UpgradeResponse upgrades an HTTP response to one that supports multiplexed - // streams. newStreamHandler will be called asynchronously whenever the - // other end of the upgraded connection creates a new stream. - UpgradeResponse(w http.ResponseWriter, req *http.Request, newStreamHandler NewStreamHandler) Connection -} - -// Connection represents an upgraded HTTP connection. -type Connection interface { - // CreateStream creates a new Stream with the supplied headers. - CreateStream(headers http.Header) (Stream, error) - // Close resets all streams and closes the connection. - Close() error - // CloseChan returns a channel that is closed when the underlying connection is closed. - CloseChan() <-chan bool - // SetIdleTimeout sets the amount of time the connection may remain idle before - // it is automatically closed. - SetIdleTimeout(timeout time.Duration) -} - -// Stream represents a bidirectional communications channel that is part of an -// upgraded connection. -type Stream interface { - io.ReadWriteCloser - // Reset closes both directions of the stream, indicating that neither client - // or server can use it any more. - Reset() error - // Headers returns the headers used to create the stream. - Headers() http.Header - // Identifier returns the stream's ID. - Identifier() uint32 -} - -// IsUpgradeRequest returns true if the given request is a connection upgrade request -func IsUpgradeRequest(req *http.Request) bool { - for _, h := range req.Header[http.CanonicalHeaderKey(HeaderConnection)] { - if strings.Contains(strings.ToLower(h), strings.ToLower(HeaderUpgrade)) { - return true - } - } - return false -} - -func negotiateProtocol(clientProtocols, serverProtocols []string) string { - for i := range clientProtocols { - for j := range serverProtocols { - if clientProtocols[i] == serverProtocols[j] { - return clientProtocols[i] - } - } - } - return "" -} - -// Handshake performs a subprotocol negotiation. If the client did request a -// subprotocol, Handshake will select the first common value found in -// serverProtocols. If a match is found, Handshake adds a response header -// indicating the chosen subprotocol. If no match is found, HTTP forbidden is -// returned, along with a response header containing the list of protocols the -// server can accept. -func Handshake(req *http.Request, w http.ResponseWriter, serverProtocols []string) (string, error) { - clientProtocols := req.Header[http.CanonicalHeaderKey(HeaderProtocolVersion)] - if len(clientProtocols) == 0 { - // Kube 1.0 clients didn't support subprotocol negotiation. - // TODO require clientProtocols once Kube 1.0 is no longer supported - return "", nil - } - - if len(serverProtocols) == 0 { - // Kube 1.0 servers didn't support subprotocol negotiation. This is mainly for testing. - // TODO require serverProtocols once Kube 1.0 is no longer supported - return "", nil - } - - negotiatedProtocol := negotiateProtocol(clientProtocols, serverProtocols) - if len(negotiatedProtocol) == 0 { - w.WriteHeader(http.StatusForbidden) - for i := range serverProtocols { - w.Header().Add(HeaderAcceptedProtocolVersions, serverProtocols[i]) - } - fmt.Fprintf(w, "unable to upgrade: unable to negotiate protocol: client supports %v, server accepts %v", clientProtocols, serverProtocols) - return "", fmt.Errorf("unable to upgrade: unable to negotiate protocol: client supports %v, server supports %v", clientProtocols, serverProtocols) - } - - w.Header().Add(HeaderProtocolVersion, negotiatedProtocol) - return negotiatedProtocol, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream_test.go deleted file mode 100644 index d21e60c0e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/httpstream_test.go +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 httpstream - -import ( - "net/http" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -type responseWriter struct { - header http.Header - statusCode *int -} - -func newResponseWriter() *responseWriter { - return &responseWriter{ - header: make(http.Header), - } -} - -func (r *responseWriter) Header() http.Header { - return r.header -} - -func (r *responseWriter) WriteHeader(code int) { - r.statusCode = &code -} - -func (r *responseWriter) Write([]byte) (int, error) { - return 0, nil -} - -func TestHandshake(t *testing.T) { - tests := map[string]struct { - clientProtocols []string - serverProtocols []string - expectedProtocol string - expectError bool - }{ - "no client protocols": { - clientProtocols: []string{}, - serverProtocols: []string{"a", "b"}, - expectedProtocol: "", - }, - "no common protocol": { - clientProtocols: []string{"c"}, - serverProtocols: []string{"a", "b"}, - expectedProtocol: "", - expectError: true, - }, - "common protocol": { - clientProtocols: []string{"b"}, - serverProtocols: []string{"a", "b"}, - expectedProtocol: "b", - }, - } - - for name, test := range tests { - req, err := http.NewRequest("GET", "http://www.example.com/", nil) - if err != nil { - t.Fatalf("%s: error creating request: %v", name, err) - } - - for _, p := range test.clientProtocols { - req.Header.Add(HeaderProtocolVersion, p) - } - - w := newResponseWriter() - negotiated, err := Handshake(req, w, test.serverProtocols) - - // verify negotiated protocol - if e, a := test.expectedProtocol, negotiated; e != a { - t.Errorf("%s: protocol: expected %q, got %q", name, e, a) - } - - if test.expectError { - if err == nil { - t.Errorf("%s: expected error but did not get one", name) - } - if w.statusCode == nil { - t.Errorf("%s: expected w.statusCode to be set", name) - } else if e, a := http.StatusForbidden, *w.statusCode; e != a { - t.Errorf("%s: w.statusCode: expected %d, got %d", name, e, a) - } - if e, a := test.serverProtocols, w.Header()[HeaderAcceptedProtocolVersions]; !reflect.DeepEqual(e, a) { - t.Errorf("%s: accepted server protocols: expected %v, got %v", name, e, a) - } - continue - } - if !test.expectError && err != nil { - t.Errorf("%s: unexpected error: %v", name, err) - continue - } - if w.statusCode != nil { - t.Errorf("%s: unexpected non-nil w.statusCode: %d", name, w.statusCode) - } - - if len(test.expectedProtocol) == 0 { - if len(w.Header()[HeaderProtocolVersion]) > 0 { - t.Errorf("%s: unexpected protocol version response header: %s", name, w.Header()[HeaderProtocolVersion]) - } - continue - } - - // verify response headers - if e, a := []string{test.expectedProtocol}, w.Header()[HeaderProtocolVersion]; !api.Semantic.DeepEqual(e, a) { - t.Errorf("%s: protocol response header: expected %v, got %v", name, e, a) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection.go deleted file mode 100644 index 0330e2038..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection.go +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "net" - "net/http" - "sync" - "time" - - "github.com/docker/spdystream" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/util/httpstream" -) - -// connection maintains state about a spdystream.Connection and its associated -// streams. -type connection struct { - conn *spdystream.Connection - streams []httpstream.Stream - streamLock sync.Mutex - newStreamHandler httpstream.NewStreamHandler -} - -// NewClientConnection creates a new SPDY client connection. -func NewClientConnection(conn net.Conn) (httpstream.Connection, error) { - spdyConn, err := spdystream.NewConnection(conn, false) - if err != nil { - defer conn.Close() - return nil, err - } - - return newConnection(spdyConn, httpstream.NoOpNewStreamHandler), nil -} - -// NewServerConnection creates a new SPDY server connection. newStreamHandler -// will be invoked when the server receives a newly created stream from the -// client. -func NewServerConnection(conn net.Conn, newStreamHandler httpstream.NewStreamHandler) (httpstream.Connection, error) { - spdyConn, err := spdystream.NewConnection(conn, true) - if err != nil { - defer conn.Close() - return nil, err - } - - return newConnection(spdyConn, newStreamHandler), nil -} - -// newConnection returns a new connection wrapping conn. newStreamHandler -// will be invoked when the server receives a newly created stream from the -// client. -func newConnection(conn *spdystream.Connection, newStreamHandler httpstream.NewStreamHandler) httpstream.Connection { - c := &connection{conn: conn, newStreamHandler: newStreamHandler} - go conn.Serve(c.newSpdyStream) - return c -} - -// createStreamResponseTimeout indicates how long to wait for the other side to -// acknowledge the new stream before timing out. -const createStreamResponseTimeout = 30 * time.Second - -// Close first sends a reset for all of the connection's streams, and then -// closes the underlying spdystream.Connection. -func (c *connection) Close() error { - c.streamLock.Lock() - for _, s := range c.streams { - // calling Reset instead of Close ensures that all streams are fully torn down - s.Reset() - } - c.streams = make([]httpstream.Stream, 0) - c.streamLock.Unlock() - - // now that all streams are fully torn down, it's safe to call close on the underlying connection, - // which should be able to terminate immediately at this point, instead of waiting for any - // remaining graceful stream termination. - return c.conn.Close() -} - -// CreateStream creates a new stream with the specified headers and registers -// it with the connection. -func (c *connection) CreateStream(headers http.Header) (httpstream.Stream, error) { - stream, err := c.conn.CreateStream(headers, nil, false) - if err != nil { - return nil, err - } - if err = stream.WaitTimeout(createStreamResponseTimeout); err != nil { - return nil, err - } - - c.registerStream(stream) - return stream, nil -} - -// registerStream adds the stream s to the connection's list of streams that -// it owns. -func (c *connection) registerStream(s httpstream.Stream) { - c.streamLock.Lock() - c.streams = append(c.streams, s) - c.streamLock.Unlock() -} - -// CloseChan returns a channel that, when closed, indicates that the underlying -// spdystream.Connection has been closed. -func (c *connection) CloseChan() <-chan bool { - return c.conn.CloseChan() -} - -// newSpdyStream is the internal new stream handler used by spdystream.Connection.Serve. -// It calls connection's newStreamHandler, giving it the opportunity to accept or reject -// the stream. If newStreamHandler returns an error, the stream is rejected. If not, the -// stream is accepted and registered with the connection. -func (c *connection) newSpdyStream(stream *spdystream.Stream) { - replySent := make(chan struct{}) - err := c.newStreamHandler(stream, replySent) - rejectStream := (err != nil) - if rejectStream { - glog.Warningf("Stream rejected: %v", err) - stream.Reset() - return - } - - c.registerStream(stream) - stream.SendReply(http.Header{}, rejectStream) - close(replySent) -} - -// SetIdleTimeout sets the amount of time the connection may remain idle before -// it is automatically closed. -func (c *connection) SetIdleTimeout(timeout time.Duration) { - c.conn.SetIdleTimeout(timeout) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection_test.go deleted file mode 100644 index 36b096402..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/connection_test.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "io" - "net" - "net/http" - "sync" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/httpstream" -) - -func runProxy(t *testing.T, backendUrl string, proxyUrl chan<- string, proxyDone chan<- struct{}) { - listener, err := net.Listen("tcp4", "localhost:0") - if err != nil { - t.Fatalf("error listening: %v", err) - } - defer listener.Close() - - proxyUrl <- listener.Addr().String() - - clientConn, err := listener.Accept() - if err != nil { - t.Errorf("proxy: error accepting client connection: %v", err) - return - } - - backendConn, err := net.Dial("tcp4", backendUrl) - if err != nil { - t.Errorf("proxy: error dialing backend: %v", err) - return - } - defer backendConn.Close() - - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - io.Copy(backendConn, clientConn) - }() - - go func() { - defer wg.Done() - io.Copy(clientConn, backendConn) - }() - - wg.Wait() - - proxyDone <- struct{}{} -} - -func runServer(t *testing.T, backendUrl chan<- string, serverDone chan<- struct{}) { - listener, err := net.Listen("tcp4", "localhost:0") - if err != nil { - t.Fatalf("server: error listening: %v", err) - } - defer listener.Close() - - backendUrl <- listener.Addr().String() - - conn, err := listener.Accept() - if err != nil { - t.Errorf("server: error accepting connection: %v", err) - return - } - - streamChan := make(chan httpstream.Stream) - replySentChan := make(chan (<-chan struct{})) - spdyConn, err := NewServerConnection(conn, func(stream httpstream.Stream, replySent <-chan struct{}) error { - streamChan <- stream - replySentChan <- replySent - return nil - }) - if err != nil { - t.Errorf("server: error creating spdy connection: %v", err) - return - } - - stream := <-streamChan - replySent := <-replySentChan - <-replySent - - buf := make([]byte, 1) - _, err = stream.Read(buf) - if err != io.EOF { - t.Errorf("server: unexpected read error: %v", err) - return - } - - <-spdyConn.CloseChan() - raw := spdyConn.(*connection).conn - if err := raw.Wait(15 * time.Second); err != nil { - t.Errorf("server: timed out waiting for connection closure: %v", err) - } - - serverDone <- struct{}{} -} - -func TestConnectionCloseIsImmediateThroughAProxy(t *testing.T) { - serverDone := make(chan struct{}) - backendUrlChan := make(chan string) - go runServer(t, backendUrlChan, serverDone) - backendUrl := <-backendUrlChan - - proxyDone := make(chan struct{}) - proxyUrlChan := make(chan string) - go runProxy(t, backendUrl, proxyUrlChan, proxyDone) - proxyUrl := <-proxyUrlChan - - conn, err := net.Dial("tcp4", proxyUrl) - if err != nil { - t.Fatalf("client: error connecting to proxy: %v", err) - } - - spdyConn, err := NewClientConnection(conn) - if err != nil { - t.Fatalf("client: error creating spdy connection: %v", err) - } - - if _, err := spdyConn.CreateStream(http.Header{}); err != nil { - t.Fatalf("client: error creating stream: %v", err) - } - - spdyConn.Close() - raw := spdyConn.(*connection).conn - if err := raw.Wait(15 * time.Second); err != nil { - t.Fatalf("client: timed out waiting for connection closure: %v", err) - } - - expired := time.NewTimer(15 * time.Second) - i := 0 - for { - select { - case <-expired.C: - t.Fatalf("timed out waiting for proxy and/or server closure") - case <-serverDone: - i++ - case <-proxyDone: - i++ - } - if i == 2 { - break - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper.go deleted file mode 100644 index ca7e9370e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper.go +++ /dev/null @@ -1,258 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "bufio" - "crypto/tls" - "encoding/base64" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/httputil" - "net/url" - "strings" - - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/third_party/golang/netutil" -) - -// SpdyRoundTripper knows how to upgrade an HTTP request to one that supports -// multiplexed streams. After RoundTrip() is invoked, Conn will be set -// and usable. SpdyRoundTripper implements the UpgradeRoundTripper interface. -type SpdyRoundTripper struct { - //tlsConfig holds the TLS configuration settings to use when connecting - //to the remote server. - tlsConfig *tls.Config - - /* TODO according to http://golang.org/pkg/net/http/#RoundTripper, a RoundTripper - must be safe for use by multiple concurrent goroutines. If this is absolutely - necessary, we could keep a map from http.Request to net.Conn. In practice, - a client will create an http.Client, set the transport to a new insteace of - SpdyRoundTripper, and use it a single time, so this hopefully won't be an issue. - */ - // conn is the underlying network connection to the remote server. - conn net.Conn - - // Dialer is the dialer used to connect. Used if non-nil. - Dialer *net.Dialer - - // proxier knows which proxy to use given a request, defaults to http.ProxyFromEnvironment - // Used primarily for mocking the proxy discovery in tests. - proxier func(req *http.Request) (*url.URL, error) -} - -// NewRoundTripper creates a new SpdyRoundTripper that will use -// the specified tlsConfig. -func NewRoundTripper(tlsConfig *tls.Config) httpstream.UpgradeRoundTripper { - return NewSpdyRoundTripper(tlsConfig) -} - -// NewSpdyRoundTripper creates a new SpdyRoundTripper that will use -// the specified tlsConfig. This function is mostly meant for unit tests. -func NewSpdyRoundTripper(tlsConfig *tls.Config) *SpdyRoundTripper { - return &SpdyRoundTripper{tlsConfig: tlsConfig} -} - -// dial dials the host specified by req, using TLS if appropriate, optionally -// using a proxy server if one is configured via environment variables. -func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) { - proxier := s.proxier - if proxier == nil { - proxier = http.ProxyFromEnvironment - } - proxyURL, err := proxier(req) - if err != nil { - return nil, err - } - - if proxyURL == nil { - return s.dialWithoutProxy(req.URL) - } - - // ensure we use a canonical host with proxyReq - targetHost := netutil.CanonicalAddr(req.URL) - - // proxying logic adapted from http://blog.h6t.eu/post/74098062923/golang-websocket-with-http-proxy-support - proxyReq := http.Request{ - Method: "CONNECT", - URL: &url.URL{}, - Host: targetHost, - } - - if pa := s.proxyAuth(proxyURL); pa != "" { - proxyReq.Header = http.Header{} - proxyReq.Header.Set("Proxy-Authorization", pa) - } - - proxyDialConn, err := s.dialWithoutProxy(proxyURL) - if err != nil { - return nil, err - } - - proxyClientConn := httputil.NewProxyClientConn(proxyDialConn, nil) - _, err = proxyClientConn.Do(&proxyReq) - if err != nil && err != httputil.ErrPersistEOF { - return nil, err - } - - rwc, _ := proxyClientConn.Hijack() - - if req.URL.Scheme != "https" { - return rwc, nil - } - - host, _, err := net.SplitHostPort(targetHost) - if err != nil { - return nil, err - } - - if len(s.tlsConfig.ServerName) == 0 { - s.tlsConfig.ServerName = host - } - - tlsConn := tls.Client(rwc, s.tlsConfig) - - // need to manually call Handshake() so we can call VerifyHostname() below - if err := tlsConn.Handshake(); err != nil { - return nil, err - } - - // Return if we were configured to skip validation - if s.tlsConfig != nil && s.tlsConfig.InsecureSkipVerify { - return tlsConn, nil - } - - if err := tlsConn.VerifyHostname(host); err != nil { - return nil, err - } - - return tlsConn, nil -} - -// dialWithoutProxy dials the host specified by url, using TLS if appropriate. -func (s *SpdyRoundTripper) dialWithoutProxy(url *url.URL) (net.Conn, error) { - dialAddr := netutil.CanonicalAddr(url) - - if url.Scheme == "http" { - if s.Dialer == nil { - return net.Dial("tcp", dialAddr) - } else { - return s.Dialer.Dial("tcp", dialAddr) - } - } - - // TODO validate the TLSClientConfig is set up? - var conn *tls.Conn - var err error - if s.Dialer == nil { - conn, err = tls.Dial("tcp", dialAddr, s.tlsConfig) - } else { - conn, err = tls.DialWithDialer(s.Dialer, "tcp", dialAddr, s.tlsConfig) - } - if err != nil { - return nil, err - } - - // Return if we were configured to skip validation - if s.tlsConfig != nil && s.tlsConfig.InsecureSkipVerify { - return conn, nil - } - - host, _, err := net.SplitHostPort(dialAddr) - if err != nil { - return nil, err - } - err = conn.VerifyHostname(host) - if err != nil { - return nil, err - } - - return conn, nil -} - -// proxyAuth returns, for a given proxy URL, the value to be used for the Proxy-Authorization header -func (s *SpdyRoundTripper) proxyAuth(proxyURL *url.URL) string { - if proxyURL == nil || proxyURL.User == nil { - return "" - } - credentials := proxyURL.User.String() - encodedAuth := base64.StdEncoding.EncodeToString([]byte(credentials)) - return fmt.Sprintf("Basic %s", encodedAuth) -} - -// RoundTrip executes the Request and upgrades it. After a successful upgrade, -// clients may call SpdyRoundTripper.Connection() to retrieve the upgraded -// connection. -func (s *SpdyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - // TODO what's the best way to clone the request? - r := *req - req = &r - req.Header.Add(httpstream.HeaderConnection, httpstream.HeaderUpgrade) - req.Header.Add(httpstream.HeaderUpgrade, HeaderSpdy31) - - conn, err := s.dial(req) - if err != nil { - return nil, err - } - - err = req.Write(conn) - if err != nil { - return nil, err - } - - resp, err := http.ReadResponse(bufio.NewReader(conn), req) - if err != nil { - return nil, err - } - - s.conn = conn - - return resp, nil -} - -// NewConnection validates the upgrade response, creating and returning a new -// httpstream.Connection if there were no errors. -func (s *SpdyRoundTripper) NewConnection(resp *http.Response) (httpstream.Connection, error) { - connectionHeader := strings.ToLower(resp.Header.Get(httpstream.HeaderConnection)) - upgradeHeader := strings.ToLower(resp.Header.Get(httpstream.HeaderUpgrade)) - if (resp.StatusCode != http.StatusSwitchingProtocols) || !strings.Contains(connectionHeader, strings.ToLower(httpstream.HeaderUpgrade)) || !strings.Contains(upgradeHeader, strings.ToLower(HeaderSpdy31)) { - defer resp.Body.Close() - responseError := "" - responseErrorBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - responseError = "unable to read error from server response" - } else { - // TODO: I don't belong here, I should be abstracted from this class - if obj, _, err := api.Codecs.UniversalDecoder().Decode(responseErrorBytes, nil, &unversioned.Status{}); err == nil { - if status, ok := obj.(*unversioned.Status); ok { - return nil, &apierrors.StatusError{ErrStatus: *status} - } - } - responseError = string(responseErrorBytes) - responseError = strings.TrimSpace(responseError) - } - - return nil, fmt.Errorf("unable to upgrade connection: %s", responseError) - } - - return NewClientConnection(s.conn) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper_test.go deleted file mode 100644 index c80a24a69..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/roundtripper_test.go +++ /dev/null @@ -1,423 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "crypto/tls" - "crypto/x509" - "encoding/base64" - "io" - "net/http" - "net/http/httptest" - "net/url" - "testing" - - "github.com/elazarl/goproxy" - "k8s.io/kubernetes/pkg/util/httpstream" -) - -func TestRoundTripAndNewConnection(t *testing.T) { - localhostPool := x509.NewCertPool() - if !localhostPool.AppendCertsFromPEM(localhostCert) { - t.Errorf("error setting up localhostCert pool") - } - - httpsServerInvalidHostname := func(h http.Handler) *httptest.Server { - cert, err := tls.X509KeyPair(exampleCert, exampleKey) - if err != nil { - t.Errorf("https (invalid hostname): proxy_test: %v", err) - } - ts := httptest.NewUnstartedServer(h) - ts.TLS = &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - ts.StartTLS() - return ts - } - - httpsServerValidHostname := func(h http.Handler) *httptest.Server { - cert, err := tls.X509KeyPair(localhostCert, localhostKey) - if err != nil { - t.Errorf("https (valid hostname): proxy_test: %v", err) - } - ts := httptest.NewUnstartedServer(h) - ts.TLS = &tls.Config{ - Certificates: []tls.Certificate{cert}, - } - ts.StartTLS() - return ts - } - - testCases := map[string]struct { - serverFunc func(http.Handler) *httptest.Server - proxyServerFunc func(http.Handler) *httptest.Server - proxyAuth *url.Userinfo - clientTLS *tls.Config - serverConnectionHeader string - serverUpgradeHeader string - serverStatusCode int - shouldError bool - }{ - "no headers": { - serverFunc: httptest.NewServer, - serverConnectionHeader: "", - serverUpgradeHeader: "", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, - }, - "no upgrade header": { - serverFunc: httptest.NewServer, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, - }, - "no connection header": { - serverFunc: httptest.NewServer, - serverConnectionHeader: "", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, - }, - "no switching protocol status code": { - serverFunc: httptest.NewServer, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusForbidden, - shouldError: true, - }, - "http": { - serverFunc: httptest.NewServer, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "https (invalid hostname + InsecureSkipVerify)": { - serverFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: true}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "https (invalid hostname + hostname verification)": { - serverFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: false}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, - }, - "https (valid hostname + RootCAs)": { - serverFunc: httpsServerValidHostname, - clientTLS: &tls.Config{RootCAs: localhostPool}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied http->http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httptest.NewServer, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https (invalid hostname + InsecureSkipVerify) -> http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: true}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https with auth (invalid hostname + InsecureSkipVerify) -> http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httpsServerInvalidHostname, - proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), - clientTLS: &tls.Config{InsecureSkipVerify: true}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https (invalid hostname + hostname verification) -> http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: false}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, // fails because the client doesn't trust the proxy - }, - "proxied https (valid hostname + RootCAs) -> http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httpsServerValidHostname, - clientTLS: &tls.Config{RootCAs: localhostPool}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https with auth (valid hostname + RootCAs) -> http": { - serverFunc: httptest.NewServer, - proxyServerFunc: httpsServerValidHostname, - proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), - clientTLS: &tls.Config{RootCAs: localhostPool}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": { - serverFunc: httpsServerInvalidHostname, - proxyServerFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: true}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, // works because the test proxy ignores TLS errors - }, - "proxied https with auth (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": { - serverFunc: httpsServerInvalidHostname, - proxyServerFunc: httpsServerInvalidHostname, - proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), - clientTLS: &tls.Config{InsecureSkipVerify: true}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, // works because the test proxy ignores TLS errors - }, - "proxied https (invalid hostname + hostname verification) -> https (invalid hostname)": { - serverFunc: httpsServerInvalidHostname, - proxyServerFunc: httpsServerInvalidHostname, - clientTLS: &tls.Config{InsecureSkipVerify: false}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: true, // fails because the client doesn't trust the proxy - }, - "proxied https (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": { - serverFunc: httpsServerValidHostname, - proxyServerFunc: httpsServerValidHostname, - clientTLS: &tls.Config{RootCAs: localhostPool}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - "proxied https with auth (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": { - serverFunc: httpsServerValidHostname, - proxyServerFunc: httpsServerValidHostname, - proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), - clientTLS: &tls.Config{RootCAs: localhostPool}, - serverConnectionHeader: "Upgrade", - serverUpgradeHeader: "SPDY/3.1", - serverStatusCode: http.StatusSwitchingProtocols, - shouldError: false, - }, - } - - for k, testCase := range testCases { - server := testCase.serverFunc(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - if testCase.shouldError { - if e, a := httpstream.HeaderUpgrade, req.Header.Get(httpstream.HeaderConnection); e != a { - t.Fatalf("%s: Expected connection=upgrade header, got '%s", k, a) - } - - w.Header().Set(httpstream.HeaderConnection, testCase.serverConnectionHeader) - w.Header().Set(httpstream.HeaderUpgrade, testCase.serverUpgradeHeader) - w.WriteHeader(testCase.serverStatusCode) - - return - } - - streamCh := make(chan httpstream.Stream) - - responseUpgrader := NewResponseUpgrader() - spdyConn := responseUpgrader.UpgradeResponse(w, req, func(s httpstream.Stream, replySent <-chan struct{}) error { - streamCh <- s - return nil - }) - if spdyConn == nil { - t.Fatalf("%s: unexpected nil spdyConn", k) - } - defer spdyConn.Close() - - stream := <-streamCh - io.Copy(stream, stream) - })) - defer server.Close() - - serverURL, err := url.Parse(server.URL) - if err != nil { - t.Fatalf("%s: Error creating request: %s", k, err) - } - req, err := http.NewRequest("GET", server.URL, nil) - if err != nil { - t.Fatalf("%s: Error creating request: %s", k, err) - } - - spdyTransport := NewSpdyRoundTripper(testCase.clientTLS) - - var proxierCalled bool - var proxyCalledWithHost string - var proxyCalledWithAuth bool - var proxyCalledWithAuthHeader string - if testCase.proxyServerFunc != nil { - proxyHandler := goproxy.NewProxyHttpServer() - - proxyHandler.OnRequest().HandleConnectFunc(func(host string, ctx *goproxy.ProxyCtx) (*goproxy.ConnectAction, string) { - proxyCalledWithHost = host - - proxyAuthHeaderName := "Proxy-Authorization" - _, proxyCalledWithAuth = ctx.Req.Header[proxyAuthHeaderName] - proxyCalledWithAuthHeader = ctx.Req.Header.Get(proxyAuthHeaderName) - return goproxy.OkConnect, host - }) - - proxy := testCase.proxyServerFunc(proxyHandler) - - spdyTransport.proxier = func(proxierReq *http.Request) (*url.URL, error) { - proxierCalled = true - proxyURL, err := url.Parse(proxy.URL) - if err != nil { - return nil, err - } - proxyURL.User = testCase.proxyAuth - return proxyURL, nil - } - defer proxy.Close() - } - - client := &http.Client{Transport: spdyTransport} - - resp, err := client.Do(req) - var conn httpstream.Connection - if err == nil { - conn, err = spdyTransport.NewConnection(resp) - } - haveErr := err != nil - if e, a := testCase.shouldError, haveErr; e != a { - t.Fatalf("%s: shouldError=%t, got %t: %v", k, e, a, err) - } - if testCase.shouldError { - continue - } - defer conn.Close() - - if resp.StatusCode != http.StatusSwitchingProtocols { - t.Fatalf("%s: expected http 101 switching protocols, got %d", k, resp.StatusCode) - } - - stream, err := conn.CreateStream(http.Header{}) - if err != nil { - t.Fatalf("%s: error creating client stream: %s", k, err) - } - - n, err := stream.Write([]byte("hello")) - if err != nil { - t.Fatalf("%s: error writing to stream: %s", k, err) - } - if n != 5 { - t.Fatalf("%s: Expected to write 5 bytes, but actually wrote %d", k, n) - } - - b := make([]byte, 5) - n, err = stream.Read(b) - if err != nil { - t.Fatalf("%s: error reading from stream: %s", k, err) - } - if n != 5 { - t.Fatalf("%s: Expected to read 5 bytes, but actually read %d", k, n) - } - if e, a := "hello", string(b[0:n]); e != a { - t.Fatalf("%s: expected '%s', got '%s'", k, e, a) - } - - if testCase.proxyServerFunc != nil { - if !proxierCalled { - t.Fatalf("%s: Expected to use a proxy but proxier in SpdyRoundTripper wasn't called", k) - } - if proxyCalledWithHost != serverURL.Host { - t.Fatalf("%s: Expected to see a call to the proxy for backend %q, got %q", k, serverURL.Host, proxyCalledWithHost) - } - } - - var expectedProxyAuth string - if testCase.proxyAuth != nil { - encodedCredentials := base64.StdEncoding.EncodeToString([]byte(testCase.proxyAuth.String())) - expectedProxyAuth = "Basic " + encodedCredentials - } - if len(expectedProxyAuth) == 0 && proxyCalledWithAuth { - t.Fatalf("%s: Proxy authorization unexpected, got %q", k, proxyCalledWithAuthHeader) - } - if proxyCalledWithAuthHeader != expectedProxyAuth { - t.Fatalf("%s: Expected to see a call to the proxy with credentials %q, got %q", k, testCase.proxyAuth, proxyCalledWithAuthHeader) - } - } -} - -// exampleCert was generated from crypto/tls/generate_cert.go with the following command: -// go run generate_cert.go --rsa-bits 512 --host example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h -var exampleCert = []byte(`-----BEGIN CERTIFICATE----- -MIIBcjCCAR6gAwIBAgIQBOUTYowZaENkZi0faI9DgTALBgkqhkiG9w0BAQswEjEQ -MA4GA1UEChMHQWNtZSBDbzAgFw03MDAxMDEwMDAwMDBaGA8yMDg0MDEyOTE2MDAw -MFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCZ -xfR3sgeHBraGFfF/24tTn4PRVAHOf2UOOxSQRs+aYjNqimFqf/SRIblQgeXdBJDR -gVK5F1Js2zwlehw0bHxRAgMBAAGjUDBOMA4GA1UdDwEB/wQEAwIApDATBgNVHSUE -DDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MBYGA1UdEQQPMA2CC2V4YW1w -bGUuY29tMAsGCSqGSIb3DQEBCwNBAI/mfBB8dm33IpUl+acSyWfL6gX5Wc0FFyVj -dKeesE1XBuPX1My/rzU6Oy/YwX7LOL4FaeNUS6bbL4axSLPKYSs= ------END CERTIFICATE-----`) - -var exampleKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIBOgIBAAJBAJnF9HeyB4cGtoYV8X/bi1Ofg9FUAc5/ZQ47FJBGz5piM2qKYWp/ -9JEhuVCB5d0EkNGBUrkXUmzbPCV6HDRsfFECAwEAAQJBAJLH9yPuButniACTn5L5 -IJQw1mWQt6zBw9eCo41YWkA0866EgjC53aPZaRjXMp0uNJGdIsys2V5rCOOLWN2C -ODECIQDICHsi8QQQ9wpuJy8X5l8MAfxHL+DIqI84wQTeVM91FQIhAMTME8A18/7h -1Ad6drdnxAkuC0tX6Sx0LDozrmen+HFNAiAlcEDrt0RVkIcpOrg7tuhPLQf0oudl -Zvb3Xlj069awSQIgcT15E/43w2+RASifzVNhQ2MCTr1sSA8lL+xzK+REmnUCIBhQ -j4139pf8Re1J50zBxS/JlQfgDQi9sO9pYeiHIxNs ------END RSA PRIVATE KEY-----`) - -// localhostCert was generated from crypto/tls/generate_cert.go with the following command: -// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h -var localhostCert = []byte(`-----BEGIN CERTIFICATE----- -MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD -bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj -bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa -IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA -AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud -EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA -AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk -Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA== ------END CERTIFICATE-----`) - -// localhostKey is the private key for localhostCert. -var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0 -0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV -NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d -AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW -MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD -EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA -1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE= ------END RSA PRIVATE KEY-----`) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade.go deleted file mode 100644 index b7d126a5d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "fmt" - "net/http" - "strings" - - "k8s.io/kubernetes/pkg/util/httpstream" - "k8s.io/kubernetes/pkg/util/runtime" -) - -const HeaderSpdy31 = "SPDY/3.1" - -// responseUpgrader knows how to upgrade HTTP responses. It -// implements the httpstream.ResponseUpgrader interface. -type responseUpgrader struct { -} - -// NewResponseUpgrader returns a new httpstream.ResponseUpgrader that is -// capable of upgrading HTTP responses using SPDY/3.1 via the -// spdystream package. -func NewResponseUpgrader() httpstream.ResponseUpgrader { - return responseUpgrader{} -} - -// UpgradeResponse upgrades an HTTP response to one that supports multiplexed -// streams. newStreamHandler will be called synchronously whenever the -// other end of the upgraded connection creates a new stream. -func (u responseUpgrader) UpgradeResponse(w http.ResponseWriter, req *http.Request, newStreamHandler httpstream.NewStreamHandler) httpstream.Connection { - connectionHeader := strings.ToLower(req.Header.Get(httpstream.HeaderConnection)) - upgradeHeader := strings.ToLower(req.Header.Get(httpstream.HeaderUpgrade)) - if !strings.Contains(connectionHeader, strings.ToLower(httpstream.HeaderUpgrade)) || !strings.Contains(upgradeHeader, strings.ToLower(HeaderSpdy31)) { - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "unable to upgrade: missing upgrade headers in request: %#v", req.Header) - return nil - } - - hijacker, ok := w.(http.Hijacker) - if !ok { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "unable to upgrade: unable to hijack response") - return nil - } - - w.Header().Add(httpstream.HeaderConnection, httpstream.HeaderUpgrade) - w.Header().Add(httpstream.HeaderUpgrade, HeaderSpdy31) - w.WriteHeader(http.StatusSwitchingProtocols) - - conn, _, err := hijacker.Hijack() - if err != nil { - runtime.HandleError(fmt.Errorf("unable to upgrade: error hijacking response: %v", err)) - return nil - } - - spdyConn, err := NewServerConnection(conn, newStreamHandler) - if err != nil { - runtime.HandleError(fmt.Errorf("unable to upgrade: error creating SPDY server connection: %v", err)) - return nil - } - - return spdyConn -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade_test.go deleted file mode 100644 index 4e111407e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/httpstream/spdy/upgrade_test.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 spdy - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -func TestUpgradeResponse(t *testing.T) { - testCases := []struct { - connectionHeader string - upgradeHeader string - shouldError bool - }{ - { - connectionHeader: "", - upgradeHeader: "", - shouldError: true, - }, - { - connectionHeader: "Upgrade", - upgradeHeader: "", - shouldError: true, - }, - { - connectionHeader: "", - upgradeHeader: "SPDY/3.1", - shouldError: true, - }, - { - connectionHeader: "Upgrade", - upgradeHeader: "SPDY/3.1", - shouldError: false, - }, - } - - for i, testCase := range testCases { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - upgrader := NewResponseUpgrader() - conn := upgrader.UpgradeResponse(w, req, nil) - haveErr := conn == nil - if e, a := testCase.shouldError, haveErr; e != a { - t.Fatalf("%d: expected shouldErr=%t, got %t", i, testCase.shouldError, haveErr) - } - if haveErr { - return - } - if conn == nil { - t.Fatalf("%d: unexpected nil conn", i) - } - defer conn.Close() - })) - defer server.Close() - - req, err := http.NewRequest("GET", server.URL, nil) - if err != nil { - t.Fatalf("%d: error creating request: %s", i, err) - } - - req.Header.Set("Connection", testCase.connectionHeader) - req.Header.Set("Upgrade", testCase.upgradeHeader) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - t.Fatalf("%d: unexpected non-nil err from client.Do: %s", i, err) - } - - if testCase.shouldError { - continue - } - - if resp.StatusCode != http.StatusSwitchingProtocols { - t.Fatalf("%d: expected status 101 switching protocols, got %d", i, resp.StatusCode) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/integer/integer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/integer/integer_test.go deleted file mode 100644 index 0f8856738..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/integer/integer_test.go +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 integer - -import "testing" - -func TestIntMax(t *testing.T) { - tests := []struct { - nums []int - expectedMax int - }{ - { - nums: []int{-1, 0}, - expectedMax: 0, - }, - { - nums: []int{-1, -2}, - expectedMax: -1, - }, - { - nums: []int{0, 1}, - expectedMax: 1, - }, - { - nums: []int{1, 2}, - expectedMax: 2, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - if max := IntMax(test.nums[0], test.nums[1]); max != test.expectedMax { - t.Errorf("expected %v, got %v", test.expectedMax, max) - } - } -} - -func TestIntMin(t *testing.T) { - tests := []struct { - nums []int - expectedMin int - }{ - { - nums: []int{-1, 0}, - expectedMin: -1, - }, - { - nums: []int{-1, -2}, - expectedMin: -2, - }, - { - nums: []int{0, 1}, - expectedMin: 0, - }, - { - nums: []int{1, 2}, - expectedMin: 1, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - if min := IntMin(test.nums[0], test.nums[1]); min != test.expectedMin { - t.Errorf("expected %v, got %v", test.expectedMin, min) - } - } -} - -func TestInt64Max(t *testing.T) { - tests := []struct { - nums []int64 - expectedMax int64 - }{ - { - nums: []int64{-1, 0}, - expectedMax: 0, - }, - { - nums: []int64{-1, -2}, - expectedMax: -1, - }, - { - nums: []int64{0, 1}, - expectedMax: 1, - }, - { - nums: []int64{1, 2}, - expectedMax: 2, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - if max := Int64Max(test.nums[0], test.nums[1]); max != test.expectedMax { - t.Errorf("expected %v, got %v", test.expectedMax, max) - } - } -} - -func TestInt64Min(t *testing.T) { - tests := []struct { - nums []int64 - expectedMin int64 - }{ - { - nums: []int64{-1, 0}, - expectedMin: -1, - }, - { - nums: []int64{-1, -2}, - expectedMin: -2, - }, - { - nums: []int64{0, 1}, - expectedMin: 0, - }, - { - nums: []int64{1, 2}, - expectedMin: 1, - }, - } - - for i, test := range tests { - t.Logf("executing scenario %d", i) - if min := Int64Min(test.nums[0], test.nums[1]); min != test.expectedMin { - t.Errorf("expected %v, got %v", test.expectedMin, min) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/interrupt/interrupt.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/interrupt/interrupt.go deleted file mode 100644 index 0f4da7d4c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/interrupt/interrupt.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 interrupt - -import ( - "os" - "os/signal" - "sync" - "syscall" -) - -// terminationSignals are signals that cause the program to exit in the -// supported platforms (linux, darwin, windows). -var terminationSignals = []os.Signal{syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT} - -// Handler guarantees execution of notifications after a critical section (the function passed -// to a Run method), even in the presence of process termination. It guarantees exactly once -// invocation of the provided notify functions. -type Handler struct { - notify []func() - final func(os.Signal) - once sync.Once -} - -// Chain creates a new handler that invokes all notify functions when the critical section exits -// and then invokes the optional handler's notifications. This allows critical sections to be -// nested without losing exactly once invocations. Notify functions can invoke any cleanup needed -// but should not exit (which is the responsibility of the parent handler). -func Chain(handler *Handler, notify ...func()) *Handler { - if handler == nil { - return New(nil, notify...) - } - return New(handler.Signal, append(notify, handler.Close)...) -} - -// New creates a new handler that guarantees all notify functions are run after the critical -// section exits (or is interrupted by the OS), then invokes the final handler. If no final -// handler is specified, the default final is `os.Exit(0)`. A handler can only be used for -// one critical section. -func New(final func(os.Signal), notify ...func()) *Handler { - return &Handler{ - final: final, - notify: notify, - } -} - -// Close executes all the notification handlers if they have not yet been executed. -func (h *Handler) Close() { - h.once.Do(func() { - for _, fn := range h.notify { - fn() - } - }) -} - -// Signal is called when an os.Signal is received, and guarantees that all notifications -// are executed, then the final handler is executed. This function should only be called once -// per Handler instance. -func (h *Handler) Signal(s os.Signal) { - h.once.Do(func() { - for _, fn := range h.notify { - fn() - } - if h.final == nil { - os.Exit(0) - } - h.final(s) - }) -} - -// Run ensures that any notifications are invoked after the provided fn exits (even if the -// process is interrupted by an OS termination signal). Notifications are only invoked once -// per Handler instance, so calling Run more than once will not behave as the user expects. -func (h *Handler) Run(fn func() error) error { - ch := make(chan os.Signal, 1) - signal.Notify(ch, terminationSignals...) - defer func() { - signal.Stop(ch) - close(ch) - }() - go func() { - sig, ok := <-ch - if !ok { - return - } - h.Signal(sig) - }() - defer h.Close() - return fn() -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/intstr/intstr_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/intstr/intstr_test.go deleted file mode 100644 index d4ccb6d28..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/intstr/intstr_test.go +++ /dev/null @@ -1,176 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 intstr - -import ( - "encoding/json" - "reflect" - "testing" - - "github.com/ghodss/yaml" -) - -func TestFromInt(t *testing.T) { - i := FromInt(93) - if i.Type != Int || i.IntVal != 93 { - t.Errorf("Expected IntVal=93, got %+v", i) - } -} - -func TestFromString(t *testing.T) { - i := FromString("76") - if i.Type != String || i.StrVal != "76" { - t.Errorf("Expected StrVal=\"76\", got %+v", i) - } -} - -type IntOrStringHolder struct { - IOrS IntOrString `json:"val"` -} - -func TestIntOrStringUnmarshalJSON(t *testing.T) { - cases := []struct { - input string - result IntOrString - }{ - {"{\"val\": 123}", FromInt(123)}, - {"{\"val\": \"123\"}", FromString("123")}, - } - - for _, c := range cases { - var result IntOrStringHolder - if err := json.Unmarshal([]byte(c.input), &result); err != nil { - t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) - } - if result.IOrS != c.result { - t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) - } - } -} - -func TestIntOrStringMarshalJSON(t *testing.T) { - cases := []struct { - input IntOrString - result string - }{ - {FromInt(123), "{\"val\":123}"}, - {FromString("123"), "{\"val\":\"123\"}"}, - } - - for _, c := range cases { - input := IntOrStringHolder{c.input} - result, err := json.Marshal(&input) - if err != nil { - t.Errorf("Failed to marshal input '%v': %v", input, err) - } - if string(result) != c.result { - t.Errorf("Failed to marshal input '%v': expected: %+v, got %q", input, c.result, string(result)) - } - } -} - -func TestIntOrStringMarshalJSONUnmarshalYAML(t *testing.T) { - cases := []struct { - input IntOrString - }{ - {FromInt(123)}, - {FromString("123")}, - } - - for _, c := range cases { - input := IntOrStringHolder{c.input} - jsonMarshalled, err := json.Marshal(&input) - if err != nil { - t.Errorf("1: Failed to marshal input: '%v': %v", input, err) - } - - var result IntOrStringHolder - err = yaml.Unmarshal(jsonMarshalled, &result) - if err != nil { - t.Errorf("2: Failed to unmarshal '%+v': %v", string(jsonMarshalled), err) - } - - if !reflect.DeepEqual(input, result) { - t.Errorf("3: Failed to marshal input '%+v': got %+v", input, result) - } - } -} - -func TestGetValueFromIntOrPercent(t *testing.T) { - tests := []struct { - input IntOrString - total int - roundUp bool - expectErr bool - expectVal int - }{ - { - input: FromInt(123), - expectErr: false, - expectVal: 123, - }, - { - input: FromString("90%"), - total: 100, - roundUp: true, - expectErr: false, - expectVal: 90, - }, - { - input: FromString("90%"), - total: 95, - roundUp: true, - expectErr: false, - expectVal: 86, - }, - { - input: FromString("90%"), - total: 95, - roundUp: false, - expectErr: false, - expectVal: 85, - }, - { - input: FromString("%"), - expectErr: true, - }, - { - input: FromString("90#"), - expectErr: true, - }, - { - input: FromString("#%"), - expectErr: true, - }, - } - - for i, test := range tests { - t.Logf("test case %d", i) - value, err := GetValueFromIntOrPercent(&test.input, test.total, test.roundUp) - if test.expectErr && err == nil { - t.Errorf("expected error, but got none") - continue - } - if !test.expectErr && err != nil { - t.Errorf("unexpected err: %v", err) - continue - } - if test.expectVal != value { - t.Errorf("expected %v, but got %v", test.expectVal, value) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io.go deleted file mode 100644 index d600c08c1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 io - -import ( - "fmt" - "io/ioutil" - "os" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/runtime" -) - -// LoadPodFromFile will read, decode, and return a Pod from a file. -func LoadPodFromFile(filePath string) (*api.Pod, error) { - if filePath == "" { - return nil, fmt.Errorf("file path not specified") - } - podDef, err := ioutil.ReadFile(filePath) - if err != nil { - return nil, fmt.Errorf("failed to read file path %s: %+v", filePath, err) - } - if len(podDef) == 0 { - return nil, fmt.Errorf("file was empty: %s", filePath) - } - pod := &api.Pod{} - - codec := api.Codecs.LegacyCodec(registered.GroupOrDie(api.GroupName).GroupVersion) - if err := runtime.DecodeInto(codec, podDef, pod); err != nil { - return nil, fmt.Errorf("failed decoding file: %v", err) - } - return pod, nil -} - -// SavePodToFile will encode and save a pod to a given path & permissions -func SavePodToFile(pod *api.Pod, filePath string, perm os.FileMode) error { - if filePath == "" { - return fmt.Errorf("file path not specified") - } - codec := api.Codecs.LegacyCodec(registered.GroupOrDie(api.GroupName).GroupVersion) - data, err := runtime.Encode(codec, pod) - if err != nil { - return fmt.Errorf("failed encoding pod: %v", err) - } - return ioutil.WriteFile(filePath, data, perm) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io_test.go deleted file mode 100644 index 1b9d4c67a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/io_test.go +++ /dev/null @@ -1,56 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 io_test - -import ( - "fmt" - "os" - "testing" - - "github.com/pborman/uuid" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/io" - utiltesting "k8s.io/kubernetes/pkg/util/testing" - "k8s.io/kubernetes/pkg/volume" -) - -func TestSavePodToFile(t *testing.T) { - pod := volume.NewPersistentVolumeRecyclerPodTemplate() - - // sets all default values on a pod for equality comparison after decoding from file - codec := api.Codecs.LegacyCodec(registered.GroupOrDie(api.GroupName).GroupVersion) - encoded, err := runtime.Encode(codec, pod) - runtime.DecodeInto(codec, encoded, pod) - - tmpDir := utiltesting.MkTmpdirOrDie("kube-io-test") - defer os.RemoveAll(tmpDir) - path := fmt.Sprintf("/%s/kube-io-test-%s", tmpDir, uuid.New()) - - if err := io.SavePodToFile(pod, path, 777); err != nil { - t.Fatalf("failed to save pod to file: %v", err) - } - - podFromFile, err := io.LoadPodFromFile(path) - if err != nil { - t.Fatalf("failed to load pod from file: %v", err) - } - if !api.Semantic.DeepEqual(pod, podFromFile) { - t.Errorf("\nexpected %#v\ngot %#v\n", pod, podFromFile) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/writer.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/writer.go deleted file mode 100644 index 3046c4d9b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/io/writer.go +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 io - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - - "github.com/golang/glog" -) - -// Writer is an interface which allows to write data to a file. -type Writer interface { - WriteFile(filename string, data []byte, perm os.FileMode) error -} - -// StdWriter implements Writer interface and uses standard libraries -// for writing data to files. -type StdWriter struct { -} - -func (writer *StdWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { - return ioutil.WriteFile(filename, data, perm) -} - -// Alternative implementation of Writer interface that allows writing data to file -// using nsenter command. -// If a program (e.g. kubelet) runs in a container it may want to write data to -// a mounted device. Since in Docker, mount propagation mode is set to private, -// it will not see the mounted device in its own namespace. To work around this -// limitaion one has to first enter hosts namespace (by using 'nsenter') and only -// then write data. -type NsenterWriter struct { -} - -// TODO: should take a writer, not []byte -func (writer *NsenterWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { - cmd := "nsenter" - base_args := []string{ - "--mount=/rootfs/proc/1/ns/mnt", - "--", - } - - echo_args := append(base_args, "sh", "-c", fmt.Sprintf("cat > %s", filename)) - glog.V(5).Infof("Command to write data to file: %v %v", cmd, echo_args) - command := exec.Command(cmd, echo_args...) - command.Stdin = bytes.NewBuffer(data) - outputBytes, err := command.CombinedOutput() - if err != nil { - glog.Errorf("Output from writing to %q: %v", filename, string(outputBytes)) - return err - } - - chmod_args := append(base_args, "chmod", fmt.Sprintf("%o", perm), filename) - glog.V(5).Infof("Command to change permissions to file: %v %v", cmd, chmod_args) - outputBytes, err = exec.Command(cmd, chmod_args...).CombinedOutput() - if err != nil { - glog.Errorf("Output from chmod command: %v", string(outputBytes)) - return err - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/doc.go deleted file mode 100644 index 5824f3b4e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 iptables provides an interface and implementations for running iptables commands. -package iptables diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables.go deleted file mode 100644 index 801cc8bf7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables.go +++ /dev/null @@ -1,595 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 iptables - -import ( - "fmt" - "io/ioutil" - "os" - "regexp" - "strings" - "sync" - - "github.com/coreos/go-semver/semver" - godbus "github.com/godbus/dbus" - "github.com/golang/glog" - utildbus "k8s.io/kubernetes/pkg/util/dbus" - utilexec "k8s.io/kubernetes/pkg/util/exec" - "k8s.io/kubernetes/pkg/util/sets" -) - -type RulePosition string - -const ( - Prepend RulePosition = "-I" - Append RulePosition = "-A" -) - -// An injectable interface for running iptables commands. Implementations must be goroutine-safe. -type Interface interface { - // GetVersion returns the "X.Y.Z" semver string for iptables. - GetVersion() (string, error) - // EnsureChain checks if the specified chain exists and, if not, creates it. If the chain existed, return true. - EnsureChain(table Table, chain Chain) (bool, error) - // FlushChain clears the specified chain. If the chain did not exist, return error. - FlushChain(table Table, chain Chain) error - // DeleteChain deletes the specified chain. If the chain did not exist, return error. - DeleteChain(table Table, chain Chain) error - // EnsureRule checks if the specified rule is present and, if not, creates it. If the rule existed, return true. - EnsureRule(position RulePosition, table Table, chain Chain, args ...string) (bool, error) - // DeleteRule checks if the specified rule is present and, if so, deletes it. - DeleteRule(table Table, chain Chain, args ...string) error - // IsIpv6 returns true if this is managing ipv6 tables - IsIpv6() bool - // TODO: (BenTheElder) Unit-Test Save/SaveAll, Restore/RestoreAll - // Save calls `iptables-save` for table. - Save(table Table) ([]byte, error) - // SaveAll calls `iptables-save`. - SaveAll() ([]byte, error) - // Restore runs `iptables-restore` passing data through a temporary file. - // table is the Table to restore - // data should be formatted like the output of Save() - // flush sets the presence of the "--noflush" flag. see: FlushFlag - // counters sets the "--counters" flag. see: RestoreCountersFlag - Restore(table Table, data []byte, flush FlushFlag, counters RestoreCountersFlag) error - // RestoreAll is the same as Restore except that no table is specified. - RestoreAll(data []byte, flush FlushFlag, counters RestoreCountersFlag) error - // AddReloadFunc adds a function to call on iptables reload - AddReloadFunc(reloadFunc func()) - // Destroy cleans up resources used by the Interface - Destroy() -} - -type Protocol byte - -const ( - ProtocolIpv4 Protocol = iota + 1 - ProtocolIpv6 -) - -type Table string - -const ( - TableNAT Table = "nat" - TableFilter Table = "filter" -) - -type Chain string - -const ( - ChainPostrouting Chain = "POSTROUTING" - ChainPrerouting Chain = "PREROUTING" - ChainOutput Chain = "OUTPUT" - ChainInput Chain = "INPUT" -) - -const ( - cmdIptablesSave string = "iptables-save" - cmdIptablesRestore string = "iptables-restore" - cmdIptables string = "iptables" - cmdIp6tables string = "ip6tables" -) - -// Option flag for Restore -type RestoreCountersFlag bool - -const RestoreCounters RestoreCountersFlag = true -const NoRestoreCounters RestoreCountersFlag = false - -// Option flag for Flush -type FlushFlag bool - -const FlushTables FlushFlag = true -const NoFlushTables FlushFlag = false - -// Versions of iptables less than this do not support the -C / --check flag -// (test whether a rule exists). -const MinCheckVersion = "1.4.11" - -// Minimum iptables versions supporting the -w and -w2 flags -const MinWaitVersion = "1.4.20" -const MinWait2Version = "1.4.22" - -// runner implements Interface in terms of exec("iptables"). -type runner struct { - mu sync.Mutex - exec utilexec.Interface - dbus utildbus.Interface - protocol Protocol - hasCheck bool - waitFlag []string - - reloadFuncs []func() - signal chan *godbus.Signal -} - -// New returns a new Interface which will exec iptables. -func New(exec utilexec.Interface, dbus utildbus.Interface, protocol Protocol) Interface { - vstring, err := getIptablesVersionString(exec) - if err != nil { - glog.Warningf("Error checking iptables version, assuming version at least %s: %v", MinCheckVersion, err) - vstring = MinCheckVersion - } - runner := &runner{ - exec: exec, - dbus: dbus, - protocol: protocol, - hasCheck: getIptablesHasCheckCommand(vstring), - waitFlag: getIptablesWaitFlag(vstring), - } - runner.connectToFirewallD() - return runner -} - -// Destroy is part of Interface. -func (runner *runner) Destroy() { - if runner.signal != nil { - runner.signal <- nil - } -} - -const ( - firewalldName = "org.fedoraproject.FirewallD1" - firewalldPath = "/org/fedoraproject/FirewallD1" - firewalldInterface = "org.fedoraproject.FirewallD1" -) - -// Connects to D-Bus and listens for FirewallD start/restart. (On non-FirewallD-using -// systems, this is effectively a no-op; we listen for the signals, but they will never be -// emitted, so reload() will never be called.) -func (runner *runner) connectToFirewallD() { - bus, err := runner.dbus.SystemBus() - if err != nil { - glog.V(1).Infof("Could not connect to D-Bus system bus: %s", err) - return - } - - rule := fmt.Sprintf("type='signal',sender='%s',path='%s',interface='%s',member='Reloaded'", firewalldName, firewalldPath, firewalldInterface) - bus.BusObject().Call("org.freedesktop.DBus.AddMatch", 0, rule) - - rule = fmt.Sprintf("type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',sender='org.freedesktop.DBus',arg0='%s'", firewalldName) - bus.BusObject().Call("org.freedesktop.DBus.AddMatch", 0, rule) - - runner.signal = make(chan *godbus.Signal, 10) - bus.Signal(runner.signal) - - go runner.dbusSignalHandler(bus) -} - -// GetVersion returns the version string. -func (runner *runner) GetVersion() (string, error) { - return getIptablesVersionString(runner.exec) -} - -// EnsureChain is part of Interface. -func (runner *runner) EnsureChain(table Table, chain Chain) (bool, error) { - fullArgs := makeFullArgs(table, chain) - - runner.mu.Lock() - defer runner.mu.Unlock() - - out, err := runner.run(opCreateChain, fullArgs) - if err != nil { - if ee, ok := err.(utilexec.ExitError); ok { - if ee.Exited() && ee.ExitStatus() == 1 { - return true, nil - } - } - return false, fmt.Errorf("error creating chain %q: %v: %s", chain, err, out) - } - return false, nil -} - -// FlushChain is part of Interface. -func (runner *runner) FlushChain(table Table, chain Chain) error { - fullArgs := makeFullArgs(table, chain) - - runner.mu.Lock() - defer runner.mu.Unlock() - - out, err := runner.run(opFlushChain, fullArgs) - if err != nil { - return fmt.Errorf("error flushing chain %q: %v: %s", chain, err, out) - } - return nil -} - -// DeleteChain is part of Interface. -func (runner *runner) DeleteChain(table Table, chain Chain) error { - fullArgs := makeFullArgs(table, chain) - - runner.mu.Lock() - defer runner.mu.Unlock() - - // TODO: we could call iptables -S first, ignore the output and check for non-zero return (more like DeleteRule) - out, err := runner.run(opDeleteChain, fullArgs) - if err != nil { - return fmt.Errorf("error deleting chain %q: %v: %s", chain, err, out) - } - return nil -} - -// EnsureRule is part of Interface. -func (runner *runner) EnsureRule(position RulePosition, table Table, chain Chain, args ...string) (bool, error) { - fullArgs := makeFullArgs(table, chain, args...) - - runner.mu.Lock() - defer runner.mu.Unlock() - - exists, err := runner.checkRule(table, chain, args...) - if err != nil { - return false, err - } - if exists { - return true, nil - } - out, err := runner.run(operation(position), fullArgs) - if err != nil { - return false, fmt.Errorf("error appending rule: %v: %s", err, out) - } - return false, nil -} - -// DeleteRule is part of Interface. -func (runner *runner) DeleteRule(table Table, chain Chain, args ...string) error { - fullArgs := makeFullArgs(table, chain, args...) - - runner.mu.Lock() - defer runner.mu.Unlock() - - exists, err := runner.checkRule(table, chain, args...) - if err != nil { - return err - } - if !exists { - return nil - } - out, err := runner.run(opDeleteRule, fullArgs) - if err != nil { - return fmt.Errorf("error deleting rule: %v: %s", err, out) - } - return nil -} - -func (runner *runner) IsIpv6() bool { - return runner.protocol == ProtocolIpv6 -} - -// Save is part of Interface. -func (runner *runner) Save(table Table) ([]byte, error) { - runner.mu.Lock() - defer runner.mu.Unlock() - - // run and return - args := []string{"-t", string(table)} - glog.V(4).Infof("running iptables-save %v", args) - return runner.exec.Command(cmdIptablesSave, args...).CombinedOutput() -} - -// SaveAll is part of Interface. -func (runner *runner) SaveAll() ([]byte, error) { - runner.mu.Lock() - defer runner.mu.Unlock() - - // run and return - glog.V(4).Infof("running iptables-save") - return runner.exec.Command(cmdIptablesSave, []string{}...).CombinedOutput() -} - -// Restore is part of Interface. -func (runner *runner) Restore(table Table, data []byte, flush FlushFlag, counters RestoreCountersFlag) error { - // setup args - args := []string{"-T", string(table)} - return runner.restoreInternal(args, data, flush, counters) -} - -// RestoreAll is part of Interface. -func (runner *runner) RestoreAll(data []byte, flush FlushFlag, counters RestoreCountersFlag) error { - // setup args - args := make([]string, 0) - return runner.restoreInternal(args, data, flush, counters) -} - -// restoreInternal is the shared part of Restore/RestoreAll -func (runner *runner) restoreInternal(args []string, data []byte, flush FlushFlag, counters RestoreCountersFlag) error { - runner.mu.Lock() - defer runner.mu.Unlock() - - if !flush { - args = append(args, "--noflush") - } - if counters { - args = append(args, "--counters") - } - // create temp file through which to pass data - temp, err := ioutil.TempFile("", "kube-temp-iptables-restore-") - if err != nil { - return err - } - // make sure we delete the temp file - defer os.Remove(temp.Name()) - // Put the filename at the end of args. - // NOTE: the filename must be at the end. - // See: https://git.netfilter.org/iptables/commit/iptables-restore.c?id=e6869a8f59d779ff4d5a0984c86d80db70784962 - args = append(args, temp.Name()) - if err != nil { - return err - } - // write data to the file - _, err = temp.Write(data) - temp.Close() - if err != nil { - return err - } - // run the command and return the output or an error including the output and error - glog.V(4).Infof("running iptables-restore %v", args) - b, err := runner.exec.Command(cmdIptablesRestore, args...).CombinedOutput() - if err != nil { - return fmt.Errorf("%v (%s)", err, b) - } - return nil -} - -func (runner *runner) iptablesCommand() string { - if runner.IsIpv6() { - return cmdIp6tables - } else { - return cmdIptables - } -} - -func (runner *runner) run(op operation, args []string) ([]byte, error) { - iptablesCmd := runner.iptablesCommand() - - fullArgs := append(runner.waitFlag, string(op)) - fullArgs = append(fullArgs, args...) - glog.V(4).Infof("running iptables %s %v", string(op), args) - return runner.exec.Command(iptablesCmd, fullArgs...).CombinedOutput() - // Don't log err here - callers might not think it is an error. -} - -// Returns (bool, nil) if it was able to check the existence of the rule, or -// (, error) if the process of checking failed. -func (runner *runner) checkRule(table Table, chain Chain, args ...string) (bool, error) { - if runner.hasCheck { - return runner.checkRuleUsingCheck(makeFullArgs(table, chain, args...)) - } else { - return runner.checkRuleWithoutCheck(table, chain, args...) - } -} - -// Executes the rule check without using the "-C" flag, instead parsing iptables-save. -// Present for compatibility with <1.4.11 versions of iptables. This is full -// of hack and half-measures. We should nix this ASAP. -func (runner *runner) checkRuleWithoutCheck(table Table, chain Chain, args ...string) (bool, error) { - glog.V(1).Infof("running iptables-save -t %s", string(table)) - out, err := runner.exec.Command(cmdIptablesSave, "-t", string(table)).CombinedOutput() - if err != nil { - return false, fmt.Errorf("error checking rule: %v", err) - } - - // Sadly, iptables has inconsistent quoting rules for comments. Just remove all quotes. - // Also, quoted multi-word comments (which are counted as a single arg) - // will be unpacked into multiple args, - // in order to compare against iptables-save output (which will be split at whitespace boundary) - // e.g. a single arg('"this must be before the NodePort rules"') will be unquoted and unpacked into 7 args. - var argsCopy []string - for i := range args { - tmpField := strings.Trim(args[i], "\"") - argsCopy = append(argsCopy, strings.Fields(tmpField)...) - } - argset := sets.NewString(argsCopy...) - - for _, line := range strings.Split(string(out), "\n") { - var fields = strings.Fields(line) - - // Check that this is a rule for the correct chain, and that it has - // the correct number of argument (+2 for "-A ") - if !strings.HasPrefix(line, fmt.Sprintf("-A %s", string(chain))) || len(fields) != len(argsCopy)+2 { - continue - } - - // Sadly, iptables has inconsistent quoting rules for comments. - // Just remove all quotes. - for i := range fields { - fields[i] = strings.Trim(fields[i], "\"") - } - - // TODO: This misses reorderings e.g. "-x foo ! -y bar" will match "! -x foo -y bar" - if sets.NewString(fields...).IsSuperset(argset) { - return true, nil - } - glog.V(5).Infof("DBG: fields is not a superset of args: fields=%v args=%v", fields, args) - } - - return false, nil -} - -// Executes the rule check using the "-C" flag -func (runner *runner) checkRuleUsingCheck(args []string) (bool, error) { - out, err := runner.run(opCheckRule, args) - if err == nil { - return true, nil - } - if ee, ok := err.(utilexec.ExitError); ok { - // iptables uses exit(1) to indicate a failure of the operation, - // as compared to a malformed commandline, for example. - if ee.Exited() && ee.ExitStatus() == 1 { - return false, nil - } - } - return false, fmt.Errorf("error checking rule: %v: %s", err, out) -} - -type operation string - -const ( - opCreateChain operation = "-N" - opFlushChain operation = "-F" - opDeleteChain operation = "-X" - opAppendRule operation = "-A" - opCheckRule operation = "-C" - opDeleteRule operation = "-D" -) - -func makeFullArgs(table Table, chain Chain, args ...string) []string { - return append([]string{string(chain), "-t", string(table)}, args...) -} - -// Checks if iptables has the "-C" flag -func getIptablesHasCheckCommand(vstring string) bool { - minVersion, err := semver.NewVersion(MinCheckVersion) - if err != nil { - glog.Errorf("MinCheckVersion (%s) is not a valid version string: %v", MinCheckVersion, err) - return true - } - version, err := semver.NewVersion(vstring) - if err != nil { - glog.Errorf("vstring (%s) is not a valid version string: %v", vstring, err) - return true - } - if version.LessThan(*minVersion) { - return false - } - return true -} - -// Checks if iptables version has a "wait" flag -func getIptablesWaitFlag(vstring string) []string { - version, err := semver.NewVersion(vstring) - if err != nil { - glog.Errorf("vstring (%s) is not a valid version string: %v", vstring, err) - return nil - } - - minVersion, err := semver.NewVersion(MinWaitVersion) - if err != nil { - glog.Errorf("MinWaitVersion (%s) is not a valid version string: %v", MinWaitVersion, err) - return nil - } - if version.LessThan(*minVersion) { - return nil - } - - minVersion, err = semver.NewVersion(MinWait2Version) - if err != nil { - glog.Errorf("MinWait2Version (%s) is not a valid version string: %v", MinWait2Version, err) - return nil - } - if version.LessThan(*minVersion) { - return []string{"-w"} - } else { - return []string{"-w2"} - } -} - -// getIptablesVersionString runs "iptables --version" to get the version string -// in the form "X.X.X" -func getIptablesVersionString(exec utilexec.Interface) (string, error) { - // this doesn't access mutable state so we don't need to use the interface / runner - bytes, err := exec.Command(cmdIptables, "--version").CombinedOutput() - if err != nil { - return "", err - } - versionMatcher := regexp.MustCompile("v([0-9]+\\.[0-9]+\\.[0-9]+)") - match := versionMatcher.FindStringSubmatch(string(bytes)) - if match == nil { - return "", fmt.Errorf("no iptables version found in string: %s", bytes) - } - return match[1], nil -} - -// goroutine to listen for D-Bus signals -func (runner *runner) dbusSignalHandler(bus utildbus.Connection) { - firewalld := bus.Object(firewalldName, firewalldPath) - - for s := range runner.signal { - if s == nil { - // Unregister - bus.Signal(runner.signal) - return - } - - switch s.Name { - case "org.freedesktop.DBus.NameOwnerChanged": - name := s.Body[0].(string) - new_owner := s.Body[2].(string) - - if name != firewalldName || len(new_owner) == 0 { - continue - } - - // FirewallD startup (specifically the part where it deletes - // all existing iptables rules) may not yet be complete when - // we get this signal, so make a dummy request to it to - // synchronize. - firewalld.Call(firewalldInterface+".getDefaultZone", 0) - - runner.reload() - case firewalldInterface + ".Reloaded": - runner.reload() - } - } -} - -// AddReloadFunc is part of Interface -func (runner *runner) AddReloadFunc(reloadFunc func()) { - runner.reloadFuncs = append(runner.reloadFuncs, reloadFunc) -} - -// runs all reload funcs to re-sync iptables rules -func (runner *runner) reload() { - glog.V(1).Infof("reloading iptables rules") - - for _, f := range runner.reloadFuncs { - f() - } -} - -// IsNotFoundError returns true if the error indicates "not found". It parses -// the error string looking for known values, which is imperfect but works in -// practice. -func IsNotFoundError(err error) bool { - es := err.Error() - if strings.Contains(es, "No such file or directory") { - return true - } - if strings.Contains(es, "No chain/target/match by that name") { - return true - } - return false -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables_test.go deleted file mode 100644 index d5bb34691..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/iptables_test.go +++ /dev/null @@ -1,768 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 iptables - -import ( - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/util/dbus" - "k8s.io/kubernetes/pkg/util/exec" - "k8s.io/kubernetes/pkg/util/sets" -) - -func getIptablesCommand(protocol Protocol) string { - if protocol == ProtocolIpv4 { - return cmdIptables - } - if protocol == ProtocolIpv6 { - return cmdIp6tables - } - panic("Unknown protocol") -} - -func testEnsureChain(t *testing.T, protocol Protocol) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - // Exists. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - // Failure. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), protocol) - defer runner.Destroy() - // Success. - exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if exists { - t.Errorf("expected exists = false") - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - cmd := getIptablesCommand(protocol) - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll(cmd, "-t", "nat", "-N", "FOOBAR") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - // Exists. - exists, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if !exists { - t.Errorf("expected exists = true") - } - // Failure. - _, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) - if err == nil { - t.Errorf("expected failure") - } -} - -func TestEnsureChainIpv4(t *testing.T) { - testEnsureChain(t, ProtocolIpv4) -} - -func TestEnsureChainIpv6(t *testing.T) { - testEnsureChain(t, ProtocolIpv6) -} - -func TestFlushChain(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - // Failure. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - // Success. - err := runner.FlushChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-F", "FOOBAR") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - // Failure. - err = runner.FlushChain(TableNAT, Chain("FOOBAR")) - if err == nil { - t.Errorf("expected failure") - } -} - -func TestDeleteChain(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - // Failure. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - // Success. - err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-X", "FOOBAR") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - // Failure. - err = runner.DeleteChain(TableNAT, Chain("FOOBAR")) - if err == nil { - t.Errorf("expected failure") - } -} - -func TestEnsureRuleAlreadyExists(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Success of that exec means "done". - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if !exists { - t.Errorf("expected exists = true") - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } -} - -func TestEnsureRuleNew(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Status 1 on the first call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - // Success on the second call. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Failure of that means create it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if exists { - t.Errorf("expected exists = false") - } - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) - } -} - -func TestEnsureRuleErrorChecking(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Status 2 on the first call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Failure of that means create it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - _, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") - if err == nil { - t.Errorf("expected failure") - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } -} - -func TestEnsureRuleErrorCreating(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Status 1 on the first call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - // Status 1 on the second call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Failure of that means create it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - _, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") - if err == nil { - t.Errorf("expected failure") - } - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } -} - -func TestDeleteRuleAlreadyExists(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Status 1 on the first call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Failure of that exec means "does not exist". - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } -} - -func TestDeleteRuleNew(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success on the first call. - func() ([]byte, error) { return []byte{}, nil }, - // Success on the second call. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Success of that means delete it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-D", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) - } -} - -func TestDeleteRuleErrorChecking(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Status 2 on the first call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Failure of that means create it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") - if err == nil { - t.Errorf("expected failure") - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } -} - -func TestDeleteRuleErrorCreating(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, - // Success on the first call. - func() ([]byte, error) { return []byte{}, nil }, - // Status 1 on the second call. - func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // iptables version check - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - // The second Command() call is checking the rule. Success of that means delete it. - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") - if err == nil { - t.Errorf("expected failure") - } - if fcmd.CombinedOutputCalls != 3 { - t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } -} - -func TestGetIptablesHasCheckCommand(t *testing.T) { - testCases := []struct { - Version string - Err bool - Expected bool - }{ - {"iptables v1.4.7", false, false}, - {"iptables v1.4.11", false, true}, - {"iptables v1.4.19.1", false, true}, - {"iptables v2.0.0", false, true}, - {"total junk", true, false}, - } - - for _, testCase := range testCases { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(testCase.Version), nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - version, err := getIptablesVersionString(&fexec) - if (err != nil) != testCase.Err { - t.Errorf("Expected error: %v, Got error: %v", testCase.Err, err) - } - if err == nil { - check := getIptablesHasCheckCommand(version) - if testCase.Expected != check { - t.Errorf("Expected result: %v, Got result: %v", testCase.Expected, check) - } - } - } -} - -func TestCheckRuleWithoutCheckPresent(t *testing.T) { - iptables_save_output := `# Generated by iptables-save v1.4.7 on Wed Oct 29 14:56:01 2014 -*nat -:PREROUTING ACCEPT [2136997:197881818] -:POSTROUTING ACCEPT [4284525:258542680] -:OUTPUT ACCEPT [5901660:357267963] --A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -COMMIT -# Completed on Wed Oct 29 14:56:01 2014` - - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // Success. - func() ([]byte, error) { return []byte(iptables_save_output), nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // The first Command() call is checking the rule. Success of that exec means "done". - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := &runner{exec: &fexec} - exists, err := runner.checkRuleWithoutCheck(TableNAT, ChainPrerouting, "-m", "addrtype", "-j", "DOCKER", "--dst-type", "LOCAL") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if !exists { - t.Errorf("expected exists = true") - } - if fcmd.CombinedOutputCalls != 1 { - t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("iptables-save", "-t", "nat") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) - } -} - -func TestCheckRuleWithoutCheckAbsent(t *testing.T) { - iptables_save_output := `# Generated by iptables-save v1.4.7 on Wed Oct 29 14:56:01 2014 -*nat -:PREROUTING ACCEPT [2136997:197881818] -:POSTROUTING ACCEPT [4284525:258542680] -:OUTPUT ACCEPT [5901660:357267963] --A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -COMMIT -# Completed on Wed Oct 29 14:56:01 2014` - - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // Success. - func() ([]byte, error) { return []byte(iptables_save_output), nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - // The first Command() call is checking the rule. Success of that exec means "done". - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := &runner{exec: &fexec} - exists, err := runner.checkRuleWithoutCheck(TableNAT, ChainPrerouting, "-m", "addrtype", "-j", "DOCKER") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if exists { - t.Errorf("expected exists = false") - } - if fcmd.CombinedOutputCalls != 1 { - t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("iptables-save", "-t", "nat") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) - } -} - -func TestIptablesWaitFlag(t *testing.T) { - testCases := []struct { - Version string - Result string - }{ - {"0.55.55", ""}, - {"1.0.55", ""}, - {"1.4.19", ""}, - {"1.4.20", "-w"}, - {"1.4.21", "-w"}, - {"1.4.22", "-w2"}, - {"1.5.0", "-w2"}, - {"2.0.0", "-w2"}, - } - - for _, testCase := range testCases { - result := getIptablesWaitFlag(testCase.Version) - if strings.Join(result, "") != testCase.Result { - t.Errorf("For %s expected %v got %v", testCase.Version, testCase.Result, result) - } - } -} - -func TestWaitFlagUnavailable(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.4.19"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if sets.NewString(fcmd.CombinedOutputLog[1]...).HasAny("-w", "-w2") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } -} - -func TestWaitFlagOld(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.4.20"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-w") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - if sets.NewString(fcmd.CombinedOutputLog[1]...).HasAny("-w2") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } -} - -func TestWaitFlagNew(t *testing.T) { - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.4.22"), nil }, - // Success. - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) - defer runner.Destroy() - err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if fcmd.CombinedOutputCalls != 2 { - t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-w2") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - if sets.NewString(fcmd.CombinedOutputLog[1]...).HasAny("-w") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } -} - -func TestReload(t *testing.T) { - dbusConn := dbus.NewFakeConnection() - dbusConn.SetBusObject(func(method string, args ...interface{}) ([]interface{}, error) { return nil, nil }) - dbusConn.AddObject(firewalldName, firewalldPath, func(method string, args ...interface{}) ([]interface{}, error) { return nil, nil }) - fdbus := dbus.NewFake(dbusConn, nil) - - reloaded := make(chan bool, 2) - - fcmd := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - // iptables version check - func() ([]byte, error) { return []byte("iptables v1.4.22"), nil }, - - // first reload - // EnsureChain - func() ([]byte, error) { return []byte{}, nil }, - // EnsureRule abc check - func() ([]byte, error) { return []byte{}, &exec.FakeExitError{Status: 1} }, - // EnsureRule abc - func() ([]byte, error) { return []byte{}, nil }, - - // second reload - // EnsureChain - func() ([]byte, error) { return []byte{}, nil }, - // EnsureRule abc check - func() ([]byte, error) { return []byte{}, &exec.FakeExitError{Status: 1} }, - // EnsureRule abc - func() ([]byte, error) { return []byte{}, nil }, - }, - } - fexec := exec.FakeExec{ - CommandScript: []exec.FakeCommandAction{ - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, - }, - } - - runner := New(&fexec, fdbus, ProtocolIpv4) - defer runner.Destroy() - - runner.AddReloadFunc(func() { - exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) - if err != nil { - t.Errorf("expected success, got %v", err) - } - if exists { - t.Errorf("expected exists = false") - } - reloaded <- true - }) - - runner.AddReloadFunc(func() { - exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") - if err != nil { - t.Errorf("expected success, got %v", err) - } - if exists { - t.Errorf("expected exists = false") - } - reloaded <- true - }) - - dbusConn.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", firewalldName, "", ":1.1") - <-reloaded - <-reloaded - - if fcmd.CombinedOutputCalls != 4 { - t.Errorf("expected 4 CombinedOutput() calls total, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-N", "FOOBAR") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) - } - if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) - } - if !sets.NewString(fcmd.CombinedOutputLog[3]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[3]) - } - - go func() { time.Sleep(time.Second / 100); reloaded <- true }() - dbusConn.EmitSignal(firewalldName, firewalldPath, firewalldInterface, "DefaultZoneChanged", "public") - dbusConn.EmitSignal("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameOwnerChanged", "io.k8s.Something", "", ":1.1") - <-reloaded - - if fcmd.CombinedOutputCalls != 4 { - t.Errorf("Incorrect signal caused a reload") - } - - dbusConn.EmitSignal(firewalldName, firewalldPath, firewalldInterface, "Reloaded") - <-reloaded - <-reloaded - - if fcmd.CombinedOutputCalls != 7 { - t.Errorf("expected 7 CombinedOutput() calls total, got %d", fcmd.CombinedOutputCalls) - } - if !sets.NewString(fcmd.CombinedOutputLog[4]...).HasAll("iptables", "-t", "nat", "-N", "FOOBAR") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[4]) - } - if !sets.NewString(fcmd.CombinedOutputLog[5]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[5]) - } - if !sets.NewString(fcmd.CombinedOutputLog[6]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { - t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[6]) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/testing/fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/testing/fake.go deleted file mode 100644 index ac9967727..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/iptables/testing/fake.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 testing - -import "k8s.io/kubernetes/pkg/util/iptables" - -// no-op implemenatation of iptables Interface -type fake struct{} - -func NewFake() *fake { - return &fake{} -} - -func (*fake) GetVersion() (string, error) { - return "0.0.0", nil -} - -func (*fake) EnsureChain(table iptables.Table, chain iptables.Chain) (bool, error) { - return true, nil -} - -func (*fake) FlushChain(table iptables.Table, chain iptables.Chain) error { - return nil -} - -func (*fake) DeleteChain(table iptables.Table, chain iptables.Chain) error { - return nil -} - -func (*fake) EnsureRule(position iptables.RulePosition, table iptables.Table, chain iptables.Chain, args ...string) (bool, error) { - return true, nil -} - -func (*fake) DeleteRule(table iptables.Table, chain iptables.Chain, args ...string) error { - return nil -} - -func (*fake) IsIpv6() bool { - return false -} - -func (*fake) Save(table iptables.Table) ([]byte, error) { - return make([]byte, 0), nil -} - -func (*fake) SaveAll() ([]byte, error) { - return make([]byte, 0), nil -} - -func (*fake) Restore(table iptables.Table, data []byte, flush iptables.FlushFlag, counters iptables.RestoreCountersFlag) error { - return nil -} - -func (*fake) RestoreAll(data []byte, flush iptables.FlushFlag, counters iptables.RestoreCountersFlag) error { - return nil -} -func (*fake) AddReloadFunc(reloadFunc func()) {} - -func (*fake) Destroy() {} - -var _ = iptables.Interface(&fake{}) diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/json/json_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/json/json_test.go deleted file mode 100644 index e41f6ce04..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/json/json_test.go +++ /dev/null @@ -1,317 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 json - -import ( - "fmt" - "math" - "reflect" - "strconv" - "strings" - "testing" -) - -func TestEvaluateTypes(t *testing.T) { - testCases := []struct { - In string - Data interface{} - Out string - Err bool - }{ - // Invalid syntaxes - { - In: `x`, - Err: true, - }, - { - In: ``, - Err: true, - }, - - // Null - { - In: `null`, - Data: nil, - Out: `null`, - }, - // Booleans - { - In: `true`, - Data: true, - Out: `true`, - }, - { - In: `false`, - Data: false, - Out: `false`, - }, - - // Integers - { - In: `0`, - Data: int64(0), - Out: `0`, - }, - { - In: `-0`, - Data: int64(-0), - Out: `0`, - }, - { - In: `1`, - Data: int64(1), - Out: `1`, - }, - { - In: `2147483647`, - Data: int64(math.MaxInt32), - Out: `2147483647`, - }, - { - In: `-2147483648`, - Data: int64(math.MinInt32), - Out: `-2147483648`, - }, - { - In: `9223372036854775807`, - Data: int64(math.MaxInt64), - Out: `9223372036854775807`, - }, - { - In: `-9223372036854775808`, - Data: int64(math.MinInt64), - Out: `-9223372036854775808`, - }, - - // Int overflow - { - In: `9223372036854775808`, // MaxInt64 + 1 - Data: float64(9223372036854775808), - Out: strconv.FormatFloat(9223372036854775808, 'g', -1, 64), - }, - { - In: `-9223372036854775809`, // MinInt64 - 1 - Data: float64(math.MinInt64), - Out: strconv.FormatFloat(-9223372036854775809, 'g', -1, 64), - }, - - // Floats - { - In: `0.0`, - Data: float64(0), - Out: `0`, - }, - { - In: `-0.0`, - Data: float64(-0.0), - Out: `-0`, - }, - { - In: `0.5`, - Data: float64(0.5), - Out: `0.5`, - }, - { - In: `1e3`, - Data: float64(1e3), - Out: `1000`, - }, - { - In: `1.5`, - Data: float64(1.5), - Out: `1.5`, - }, - { - In: `-0.3`, - Data: float64(-.3), - Out: `-0.3`, - }, - { - // Largest representable float32 - In: `3.40282346638528859811704183484516925440e+38`, - Data: float64(math.MaxFloat32), - Out: strconv.FormatFloat(math.MaxFloat32, 'g', -1, 64), - }, - { - // Smallest float32 without losing precision - In: `1.175494351e-38`, - Data: float64(1.175494351e-38), - Out: `1.175494351e-38`, - }, - { - // float32 closest to zero - In: `1.401298464324817070923729583289916131280e-45`, - Data: float64(math.SmallestNonzeroFloat32), - Out: strconv.FormatFloat(math.SmallestNonzeroFloat32, 'g', -1, 64), - }, - { - // Largest representable float64 - In: `1.797693134862315708145274237317043567981e+308`, - Data: float64(math.MaxFloat64), - Out: strconv.FormatFloat(math.MaxFloat64, 'g', -1, 64), - }, - { - // Closest to zero without losing precision - In: `2.2250738585072014e-308`, - Data: float64(2.2250738585072014e-308), - Out: `2.2250738585072014e-308`, - }, - - { - // float64 closest to zero - In: `4.940656458412465441765687928682213723651e-324`, - Data: float64(math.SmallestNonzeroFloat64), - Out: strconv.FormatFloat(math.SmallestNonzeroFloat64, 'g', -1, 64), - }, - - { - // math.MaxFloat64 + 2 overflow - In: `1.7976931348623159e+308`, - Err: true, - }, - - // Strings - { - In: `""`, - Data: string(""), - Out: `""`, - }, - { - In: `"0"`, - Data: string("0"), - Out: `"0"`, - }, - { - In: `"A"`, - Data: string("A"), - Out: `"A"`, - }, - { - In: `"Iñtërnâtiônàlizætiøn"`, - Data: string("Iñtërnâtiônàlizætiøn"), - Out: `"Iñtërnâtiônàlizætiøn"`, - }, - - // Arrays - { - In: `[]`, - Data: []interface{}{}, - Out: `[]`, - }, - { - In: `[` + strings.Join([]string{ - `null`, - `true`, - `false`, - `0`, - `9223372036854775807`, - `0.0`, - `0.5`, - `1.0`, - `1.797693134862315708145274237317043567981e+308`, - `"0"`, - `"A"`, - `"Iñtërnâtiônàlizætiøn"`, - `[null,true,1,1.0,1.5]`, - `{"boolkey":true,"floatkey":1.0,"intkey":1,"nullkey":null}`, - }, ",") + `]`, - Data: []interface{}{ - nil, - true, - false, - int64(0), - int64(math.MaxInt64), - float64(0.0), - float64(0.5), - float64(1.0), - float64(math.MaxFloat64), - string("0"), - string("A"), - string("Iñtërnâtiônàlizætiøn"), - []interface{}{nil, true, int64(1), float64(1.0), float64(1.5)}, - map[string]interface{}{"nullkey": nil, "boolkey": true, "intkey": int64(1), "floatkey": float64(1.0)}, - }, - Out: `[` + strings.Join([]string{ - `null`, - `true`, - `false`, - `0`, - `9223372036854775807`, - `0`, - `0.5`, - `1`, - strconv.FormatFloat(math.MaxFloat64, 'g', -1, 64), - `"0"`, - `"A"`, - `"Iñtërnâtiônàlizætiøn"`, - `[null,true,1,1,1.5]`, - `{"boolkey":true,"floatkey":1,"intkey":1,"nullkey":null}`, // gets alphabetized by Marshal - }, ",") + `]`, - }, - - // Maps - { - In: `{}`, - Data: map[string]interface{}{}, - Out: `{}`, - }, - { - In: `{"boolkey":true,"floatkey":1.0,"intkey":1,"nullkey":null}`, - Data: map[string]interface{}{"nullkey": nil, "boolkey": true, "intkey": int64(1), "floatkey": float64(1.0)}, - Out: `{"boolkey":true,"floatkey":1,"intkey":1,"nullkey":null}`, // gets alphabetized by Marshal - }, - } - - for _, tc := range testCases { - inputJSON := fmt.Sprintf(`{"data":%s}`, tc.In) - expectedJSON := fmt.Sprintf(`{"data":%s}`, tc.Out) - m := map[string]interface{}{} - err := Unmarshal([]byte(inputJSON), &m) - if tc.Err && err != nil { - // Expected error - continue - } - if err != nil { - t.Errorf("%s: error decoding: %v", tc.In, err) - continue - } - if tc.Err { - t.Errorf("%s: expected error, got none", tc.In) - continue - } - data, ok := m["data"] - if !ok { - t.Errorf("%s: decoded object missing data key: %#v", tc.In, m) - continue - } - if !reflect.DeepEqual(tc.Data, data) { - t.Errorf("%s: expected\n\t%#v (%v), got\n\t%#v (%v)", tc.In, tc.Data, reflect.TypeOf(tc.Data), data, reflect.TypeOf(data)) - continue - } - - outputJSON, err := Marshal(m) - if err != nil { - t.Errorf("%s: error encoding: %v", tc.In, err) - continue - } - - if expectedJSON != string(outputJSON) { - t.Errorf("%s: expected\n\t%s, got\n\t%s", tc.In, expectedJSON, string(outputJSON)) - continue - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/jsonpath_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/jsonpath_test.go deleted file mode 100644 index e01a9a458..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/jsonpath_test.go +++ /dev/null @@ -1,264 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 jsonpath - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "sort" - "strings" - "testing" -) - -type jsonpathTest struct { - name string - template string - input interface{} - expect string -} - -func testJSONPath(tests []jsonpathTest, t *testing.T) { - for _, test := range tests { - j := New(test.name) - err := j.Parse(test.template) - if err != nil { - t.Errorf("in %s, parse %s error %v", test.name, test.template, err) - } - buf := new(bytes.Buffer) - err = j.Execute(buf, test.input) - if err != nil { - t.Errorf("in %s, execute error %v", test.name, err) - } - out := buf.String() - if out != test.expect { - t.Errorf(`in %s, expect to get "%s", got "%s"`, test.name, test.expect, out) - } - } -} - -// testJSONPathSortOutput test cases related to map, the results may print in random order -func testJSONPathSortOutput(tests []jsonpathTest, t *testing.T) { - for _, test := range tests { - j := New(test.name) - err := j.Parse(test.template) - if err != nil { - t.Errorf("in %s, parse %s error %v", test.name, test.template, err) - } - buf := new(bytes.Buffer) - err = j.Execute(buf, test.input) - if err != nil { - t.Errorf("in %s, execute error %v", test.name, err) - } - out := buf.String() - //since map is visited in random order, we need to sort the results. - sortedOut := strings.Fields(out) - sort.Strings(sortedOut) - sortedExpect := strings.Fields(test.expect) - sort.Strings(sortedExpect) - if !reflect.DeepEqual(sortedOut, sortedExpect) { - t.Errorf(`in %s, expect to get "%s", got "%s"`, test.name, test.expect, out) - } - } -} - -func testFailJSONPath(tests []jsonpathTest, t *testing.T) { - for _, test := range tests { - j := New(test.name) - err := j.Parse(test.template) - if err != nil { - t.Errorf("in %s, parse %s error %v", test.name, test.template, err) - } - buf := new(bytes.Buffer) - err = j.Execute(buf, test.input) - var out string - if err == nil { - out = "nil" - } else { - out = err.Error() - } - if out != test.expect { - t.Errorf("in %s, expect to get error %q, got %q", test.name, test.expect, out) - } - } -} - -type book struct { - Category string - Author string - Title string - Price float32 -} - -func (b book) String() string { - return fmt.Sprintf("{Category: %s, Author: %s, Title: %s, Price: %v}", b.Category, b.Author, b.Title, b.Price) -} - -type bicycle struct { - Color string - Price float32 -} - -type empName string -type job string -type store struct { - Book []book - Bicycle bicycle - Name string - Labels map[string]int - Employees map[empName]job -} - -func TestStructInput(t *testing.T) { - - storeData := store{ - Name: "jsonpath", - Book: []book{ - {"reference", "Nigel Rees", "Sayings of the Centurey", 8.95}, - {"fiction", "Evelyn Waugh", "Sword of Honour", 12.99}, - {"fiction", "Herman Melville", "Moby Dick", 8.99}, - }, - Bicycle: bicycle{"red", 19.95}, - Labels: map[string]int{ - "engieer": 10, - "web/html": 15, - "k8s-app": 20, - }, - Employees: map[empName]job{ - "jason": "manager", - "dan": "clerk", - }, - } - - storeTests := []jsonpathTest{ - {"plain", "hello jsonpath", nil, "hello jsonpath"}, - {"recursive", "{..}", []int{1, 2, 3}, "[1 2 3]"}, - {"filter", "{[?(@<5)]}", []int{2, 6, 3, 7}, "2 3"}, - {"quote", `{"{"}`, nil, "{"}, - {"union", "{[1,3,4]}", []int{0, 1, 2, 3, 4}, "1 3 4"}, - {"array", "{[0:2]}", []string{"Monday", "Tudesday"}, "Monday Tudesday"}, - {"variable", "hello {.Name}", storeData, "hello jsonpath"}, - {"dict/", "{$.Labels.web/html}", storeData, "15"}, - {"dict/", "{$.Employees.jason}", storeData, "manager"}, - {"dict/", "{$.Employees.dan}", storeData, "clerk"}, - {"dict-", "{.Labels.k8s-app}", storeData, "20"}, - {"nest", "{.Bicycle.Color}", storeData, "red"}, - {"allarray", "{.Book[*].Author}", storeData, "Nigel Rees Evelyn Waugh Herman Melville"}, - {"allfileds", "{.Bicycle.*}", storeData, "red 19.95"}, - {"recurfileds", "{..Price}", storeData, "8.95 12.99 8.99 19.95"}, - {"lastarray", "{.Book[-1:]}", storeData, - "{Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}"}, - {"recurarray", "{..Book[2]}", storeData, - "{Category: fiction, Author: Herman Melville, Title: Moby Dick, Price: 8.99}"}, - } - testJSONPath(storeTests, t) - - failStoreTests := []jsonpathTest{ - {"invalid identfier", "{hello}", storeData, "unrecognized identifier hello"}, - {"nonexistent field", "{.hello}", storeData, "hello is not found"}, - {"invalid array", "{.Labels[0]}", storeData, "map[string]int is not array or slice"}, - {"invalid filter operator", "{.Book[?(@.Price<>10)]}", storeData, "unrecognized filter operator <>"}, - {"redundent end", "{range .Labels.*}{@}{end}{end}", storeData, "not in range, nothing to end"}, - } - testFailJSONPath(failStoreTests, t) -} - -func TestJSONInput(t *testing.T) { - var pointsJSON = []byte(`[ - {"id": "i1", "x":4, "y":-5}, - {"id": "i2", "x":-2, "y":-5, "z":1}, - {"id": "i3", "x": 8, "y": 3 }, - {"id": "i4", "x": -6, "y": -1 }, - {"id": "i5", "x": 0, "y": 2, "z": 1 }, - {"id": "i6", "x": 1, "y": 4 } - ]`) - var pointsData interface{} - err := json.Unmarshal(pointsJSON, &pointsData) - if err != nil { - t.Error(err) - } - pointsTests := []jsonpathTest{ - {"exists filter", "{[?(@.z)].id}", pointsData, "i2 i5"}, - {"bracket key", "{[0]['id']}", pointsData, "i1"}, - } - testJSONPath(pointsTests, t) -} - -// TestKubernetes tests some use cases from kubernetes -func TestKubernetes(t *testing.T) { - var input = []byte(`{ - "kind": "List", - "items":[ - { - "kind":"None", - "metadata":{"name":"127.0.0.1"}, - "status":{ - "capacity":{"cpu":"4"}, - "addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}] - } - }, - { - "kind":"None", - "metadata":{"name":"127.0.0.2"}, - "status":{ - "capacity":{"cpu":"8"}, - "addresses":[ - {"type": "LegacyHostIP", "address":"127.0.0.2"}, - {"type": "another", "address":"127.0.0.3"} - ] - } - } - ], - "users":[ - { - "name": "myself", - "user": {} - }, - { - "name": "e2e", - "user": {"username": "admin", "password": "secret"} - } - ] - }`) - var nodesData interface{} - err := json.Unmarshal(input, &nodesData) - if err != nil { - t.Error(err) - } - - nodesTests := []jsonpathTest{ - {"range item", `{range .items[*]}{.metadata.name}, {end}{.kind}`, nodesData, "127.0.0.1, 127.0.0.2, List"}, - {"range item with quote", `{range .items[*]}{.metadata.name}{"\t"}{end}`, nodesData, "127.0.0.1\t127.0.0.2\t"}, - {"range addresss", `{.items[*].status.addresses[*].address}`, nodesData, - "127.0.0.1 127.0.0.2 127.0.0.3"}, - {"double range", `{range .items[*]}{range .status.addresses[*]}{.address}, {end}{end}`, nodesData, - "127.0.0.1, 127.0.0.2, 127.0.0.3, "}, - {"item name", `{.items[*].metadata.name}`, nodesData, "127.0.0.1 127.0.0.2"}, - {"union nodes capacity", `{.items[*]['metadata.name', 'status.capacity']}`, nodesData, - "127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8]"}, - {"range nodes capacity", `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}`, nodesData, - "[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] "}, - {"user password", `{.users[?(@.name=="e2e")].user.password}`, &nodesData, "secret"}, - } - testJSONPath(nodesTests, t) - - randomPrintOrderTests := []jsonpathTest{ - {"recursive name", "{..name}", nodesData, `127.0.0.1 127.0.0.2 myself e2e`}, - } - testJSONPathSortOutput(randomPrintOrderTests, t) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/parser_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/parser_test.go deleted file mode 100644 index a061043b8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/jsonpath/parser_test.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 jsonpath - -import ( - "testing" -) - -type parserTest struct { - name string - text string - nodes []Node - shouldError bool -} - -var parserTests = []parserTest{ - {"plain", `hello jsonpath`, []Node{newText("hello jsonpath")}, false}, - {"variable", `hello {.jsonpath}`, - []Node{newText("hello "), newList(), newField("jsonpath")}, false}, - {"arrayfiled", `hello {['jsonpath']}`, - []Node{newText("hello "), newList(), newField("jsonpath")}, false}, - {"quote", `{"{"}`, []Node{newList(), newText("{")}, false}, - {"array", `{[1:3]}`, []Node{newList(), - newArray([3]ParamsEntry{{1, true}, {3, true}, {0, false}})}, false}, - {"allarray", `{.book[*].author}`, - []Node{newList(), newField("book"), - newArray([3]ParamsEntry{{0, false}, {0, false}, {0, false}}), newField("author")}, false}, - {"wildcard", `{.bicycle.*}`, - []Node{newList(), newField("bicycle"), newWildcard()}, false}, - {"filter", `{[?(@.price<3)]}`, - []Node{newList(), newFilter(newList(), newList(), "<"), - newList(), newField("price"), newList(), newInt(3)}, false}, - {"recursive", `{..}`, []Node{newList(), newRecursive()}, false}, - {"recurField", `{..price}`, - []Node{newList(), newRecursive(), newField("price")}, false}, - {"arraydict", `{['book.price']}`, []Node{newList(), - newField("book"), newField("price"), - }, false}, - {"union", `{['bicycle.price', 3, 'book.price']}`, []Node{newList(), newUnion([]*ListNode{}), - newList(), newField("bicycle"), newField("price"), - newList(), newArray([3]ParamsEntry{{3, true}, {4, true}, {0, false}}), - newList(), newField("book"), newField("price"), - }, false}, - {"range", `{range .items}{.name},{end}`, []Node{ - newList(), newIdentifier("range"), newField("items"), - newList(), newField("name"), newText(","), - newList(), newIdentifier("end"), - }, false}, - {"malformat input", `{\\\}`, []Node{}, true}, -} - -func collectNode(nodes []Node, cur Node) []Node { - nodes = append(nodes, cur) - switch cur.Type() { - case NodeList: - for _, node := range cur.(*ListNode).Nodes { - nodes = collectNode(nodes, node) - } - case NodeFilter: - nodes = collectNode(nodes, cur.(*FilterNode).Left) - nodes = collectNode(nodes, cur.(*FilterNode).Right) - case NodeUnion: - for _, node := range cur.(*UnionNode).Nodes { - nodes = collectNode(nodes, node) - } - } - return nodes -} - -func TestParser(t *testing.T) { - for _, test := range parserTests { - parser, err := Parse(test.name, test.text) - if test.shouldError { - if err == nil { - t.Errorf("unexpected non-error when parsing %s", test.name) - } - continue - } - if err != nil { - t.Errorf("parse %s error %v", test.name, err) - } - result := collectNode([]Node{}, parser.Root)[1:] - if len(result) != len(test.nodes) { - t.Errorf("in %s, expect to get %d nodes, got %d nodes", test.name, len(test.nodes), len(result)) - t.Error(result) - } - for i, expect := range test.nodes { - if result[i].String() != expect.String() { - t.Errorf("in %s, %dth node, expect %v, got %v", test.name, i, expect, result[i]) - } - } - } -} - -type failParserTest struct { - name string - text string - err string -} - -func TestFailParser(t *testing.T) { - failParserTests := []failParserTest{ - {"unclosed action", "{.hello", "unclosed action"}, - {"unrecognized character", "{*}", "unrecognized character in action: U+002A '*'"}, - {"invalid number", "{+12.3.0}", "cannot parse number +12.3.0"}, - {"unterminated array", "{[1}", "unterminated array"}, - {"invalid index", "{[::-1]}", "invalid array index ::-1"}, - {"unterminated filter", "{[?(.price]}", "unterminated filter"}, - } - for _, test := range failParserTests { - _, err := Parse(test.name, test.text) - var out string - if err == nil { - out = "nil" - } else { - out = err.Error() - } - if out != test.err { - t.Errorf("in %s, expect to get error %v, got %v", test.name, test.err, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex.go deleted file mode 100644 index 2bcc95175..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 keymutex - -import ( - "fmt" - "github.com/golang/glog" - "sync" -) - -// KeyMutex is a thread-safe interface for acquiring locks on arbitrary strings. -type KeyMutex interface { - // Acquires a lock associated with the specified ID, creates the lock if one doesn't already exist. - LockKey(id string) - - // Releases the lock associated with the specified ID. - // Returns an error if the specified ID doesn't exist. - UnlockKey(id string) error -} - -// Returns a new instance of a key mutex. -func NewKeyMutex() KeyMutex { - return &keyMutex{ - mutexMap: make(map[string]*sync.Mutex), - } -} - -type keyMutex struct { - sync.RWMutex - mutexMap map[string]*sync.Mutex -} - -// Acquires a lock associated with the specified ID (creates the lock if one doesn't already exist). -func (km *keyMutex) LockKey(id string) { - glog.V(5).Infof("LockKey(...) called for id %q\r\n", id) - mutex := km.getOrCreateLock(id) - mutex.Lock() - glog.V(5).Infof("LockKey(...) for id %q completed.\r\n", id) -} - -// Releases the lock associated with the specified ID. -// Returns an error if the specified ID doesn't exist. -func (km *keyMutex) UnlockKey(id string) error { - glog.V(5).Infof("UnlockKey(...) called for id %q\r\n", id) - km.RLock() - defer km.RUnlock() - mutex, exists := km.mutexMap[id] - if !exists { - return fmt.Errorf("id %q not found", id) - } - glog.V(5).Infof("UnlockKey(...) for id. Mutex found, trying to unlock it. %q\r\n", id) - - mutex.Unlock() - glog.V(5).Infof("UnlockKey(...) for id %q completed.\r\n", id) - return nil -} - -// Returns lock associated with the specified ID, or creates the lock if one doesn't already exist. -func (km *keyMutex) getOrCreateLock(id string) *sync.Mutex { - km.Lock() - defer km.Unlock() - - if _, exists := km.mutexMap[id]; !exists { - km.mutexMap[id] = &sync.Mutex{} - } - - return km.mutexMap[id] -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex_test.go deleted file mode 100644 index faa3be16a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/keymutex/keymutex_test.go +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 keymutex - -import ( - "testing" - "time" -) - -const ( - callbackTimeout = 1 * time.Second -) - -func Test_SingleLock_NoUnlock(t *testing.T) { - // Arrange - km := NewKeyMutex() - key := "fakeid" - callbackCh := make(chan interface{}) - - // Act - go lockAndCallback(km, key, callbackCh) - - // Assert - verifyCallbackHappens(t, callbackCh) -} - -func Test_SingleLock_SingleUnlock(t *testing.T) { - // Arrange - km := NewKeyMutex() - key := "fakeid" - callbackCh := make(chan interface{}) - - // Act & Assert - go lockAndCallback(km, key, callbackCh) - verifyCallbackHappens(t, callbackCh) - km.UnlockKey(key) -} - -func Test_DoubleLock_DoubleUnlock(t *testing.T) { - // Arrange - km := NewKeyMutex() - key := "fakeid" - callbackCh1stLock := make(chan interface{}) - callbackCh2ndLock := make(chan interface{}) - - // Act & Assert - go lockAndCallback(km, key, callbackCh1stLock) - verifyCallbackHappens(t, callbackCh1stLock) - go lockAndCallback(km, key, callbackCh2ndLock) - verifyCallbackDoesntHappens(t, callbackCh2ndLock) - km.UnlockKey(key) - verifyCallbackHappens(t, callbackCh2ndLock) - km.UnlockKey(key) -} - -func lockAndCallback(km KeyMutex, id string, callbackCh chan<- interface{}) { - km.LockKey(id) - callbackCh <- true -} - -func verifyCallbackHappens(t *testing.T, callbackCh <-chan interface{}) bool { - select { - case <-callbackCh: - return true - case <-time.After(callbackTimeout): - t.Fatalf("Timed out waiting for callback.") - return false - } -} - -func verifyCallbackDoesntHappens(t *testing.T, callbackCh <-chan interface{}) bool { - select { - case <-callbackCh: - t.Fatalf("Unexpected callback.") - return false - case <-time.After(callbackTimeout): - return true - } -} - -func verifyNoError(t *testing.T, err error, name string) { - if err != nil { - t.Fatalf("Unexpected response on %q. Expected: Actual: <%v>", name, err) - } -} - -func verifyError(t *testing.T, err error, name string) { - if err == nil { - t.Fatalf("Unexpected response on %q. Expected: Actual: ", name) - } -} - -func verifyMsg(t *testing.T, expected, actual string) { - if actual != expected { - t.Fatalf("Unexpected testMsg value. Expected: <%v> Actual: <%v>", expected, actual) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/labels/labels_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/labels/labels_test.go deleted file mode 100644 index 9adbd4554..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/labels/labels_test.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 labels - -import ( - "reflect" - "testing" -) - -func TestCloneAndAddLabel(t *testing.T) { - labels := map[string]string{ - "foo1": "bar1", - "foo2": "bar2", - "foo3": "bar3", - } - - cases := []struct { - labels map[string]string - labelKey string - labelValue uint32 - want map[string]string - }{ - { - labels: labels, - want: labels, - }, - { - labels: labels, - labelKey: "foo4", - labelValue: uint32(42), - want: map[string]string{ - "foo1": "bar1", - "foo2": "bar2", - "foo3": "bar3", - "foo4": "42", - }, - }, - } - - for _, tc := range cases { - got := CloneAndAddLabel(tc.labels, tc.labelKey, tc.labelValue) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("got %v, want %v", got, tc.want) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/doc.go deleted file mode 100644 index 7daff9c07..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 limitwriter provides a writer that only allows a certain number of bytes to be -// written. -package limitwriter diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/limitwriter.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/limitwriter.go deleted file mode 100644 index 88890a9fa..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/limitwriter/limitwriter.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 limitwriter - -import ( - "errors" - "io" -) - -// New creates a writer that is limited to writing at most n bytes to w. This writer is not -// thread safe. -func New(w io.Writer, n int64) io.Writer { - return &limitWriter{ - w: w, - n: n, - } -} - -// ErrMaximumWrite is returned when all bytes have been written. -var ErrMaximumWrite = errors.New("maximum write") - -type limitWriter struct { - w io.Writer - n int64 -} - -func (w *limitWriter) Write(p []byte) (n int, err error) { - if int64(len(p)) > w.n { - p = p[:w.n] - } - if len(p) > 0 { - n, err = w.w.Write(p) - w.n -= int64(n) - } - if w.n == 0 { - err = ErrMaximumWrite - } - return -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/line_delimiter_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/line_delimiter_test.go deleted file mode 100644 index 728d0abea..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/line_delimiter_test.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "fmt" - "os" -) - -func Example_trailingNewline() { - ld := NewLineDelimiter(os.Stdout, "|") - defer ld.Flush() - fmt.Fprint(ld, " Hello \n World \n") - // Output: - // | Hello | - // | World | - // || -} -func Example_noTrailingNewline() { - ld := NewLineDelimiter(os.Stdout, "|") - defer ld.Flush() - fmt.Fprint(ld, " Hello \n World ") - // Output: - // | Hello | - // | World | -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/metrics/util.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/metrics/util.go deleted file mode 100644 index ab74e35c4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/metrics/util.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 metrics - -import ( - "fmt" - "sync" - "time" - - "k8s.io/kubernetes/pkg/util/flowcontrol" - "k8s.io/kubernetes/pkg/util/wait" - - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" -) - -const ( - updatePeriod = 5 * time.Second -) - -var ( - metricsLock sync.Mutex - rateLimiterMetrics map[string]prometheus.Gauge = make(map[string]prometheus.Gauge) -) - -func registerRateLimiterMetric(ownerName string) error { - metricsLock.Lock() - defer metricsLock.Unlock() - - if _, ok := rateLimiterMetrics[ownerName]; ok { - glog.Errorf("Metric for %v already registered", ownerName) - return fmt.Errorf("Metric for %v already registered", ownerName) - } - metric := prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "rate_limiter_use", - Subsystem: ownerName, - Help: fmt.Sprintf("A metric measuring the saturation of the rate limiter for %v", ownerName), - }) - rateLimiterMetrics[ownerName] = metric - prometheus.MustRegister(metric) - return nil -} - -// RegisterMetricAndTrackRateLimiterUsage registers a metric ownerName_rate_limiter_use in prometheus to track -// how much used rateLimiter is and starts a goroutine that updates this metric every updatePeriod -func RegisterMetricAndTrackRateLimiterUsage(ownerName string, rateLimiter flowcontrol.RateLimiter) error { - err := registerRateLimiterMetric(ownerName) - if err != nil { - return err - } - go wait.Forever(func() { - metricsLock.Lock() - defer metricsLock.Unlock() - rateLimiterMetrics[ownerName].Set(rateLimiter.Saturation()) - }, updatePeriod) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/doc.go deleted file mode 100644 index 839c0a69a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount defines an interface to mounting filesystems. -package mount diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/fake.go deleted file mode 100644 index 115293813..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/fake.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 mount - -import ( - "sync" - - "github.com/golang/glog" -) - -// FakeMounter implements mount.Interface for tests. -type FakeMounter struct { - MountPoints []MountPoint - Log []FakeAction - // Some tests run things in parallel, make sure the mounter does not produce - // any golang's DATA RACE warnings. - mutex sync.Mutex -} - -var _ Interface = &FakeMounter{} - -// Values for FakeAction.Action -const FakeActionMount = "mount" -const FakeActionUnmount = "unmount" - -// FakeAction objects are logged every time a fake mount or unmount is called. -type FakeAction struct { - Action string // "mount" or "unmount" - Target string // applies to both mount and unmount actions - Source string // applies only to "mount" actions - FSType string // applies only to "mount" actions -} - -func (f *FakeMounter) ResetLog() { - f.mutex.Lock() - defer f.mutex.Unlock() - - f.Log = []FakeAction{} -} - -func (f *FakeMounter) Mount(source string, target string, fstype string, options []string) error { - f.mutex.Lock() - defer f.mutex.Unlock() - - // find 'bind' option - for _, option := range options { - if option == "bind" { - // This is a bind-mount. In order to mimic linux behaviour, we must - // use the original device of the bind-mount as the real source. - // E.g. when mounted /dev/sda like this: - // $ mount /dev/sda /mnt/test - // $ mount -o bind /mnt/test /mnt/bound - // then /proc/mount contains: - // /dev/sda /mnt/test - // /dev/sda /mnt/bound - // (and not /mnt/test /mnt/bound) - // I.e. we must use /dev/sda as source instead of /mnt/test in the - // bind mount. - for _, mnt := range f.MountPoints { - if source == mnt.Path { - source = mnt.Device - break - } - } - break - } - } - - f.MountPoints = append(f.MountPoints, MountPoint{Device: source, Path: target, Type: fstype}) - glog.V(5).Infof("Fake mounter: mouted %s to %s", source, target) - f.Log = append(f.Log, FakeAction{Action: FakeActionMount, Target: target, Source: source, FSType: fstype}) - return nil -} - -func (f *FakeMounter) Unmount(target string) error { - f.mutex.Lock() - defer f.mutex.Unlock() - - newMountpoints := []MountPoint{} - for _, mp := range f.MountPoints { - if mp.Path == target { - glog.V(5).Infof("Fake mounter: unmouted %s from %s", mp.Device, target) - // Don't copy it to newMountpoints - continue - } - newMountpoints = append(newMountpoints, MountPoint{Device: mp.Device, Path: mp.Path, Type: mp.Type}) - } - f.MountPoints = newMountpoints - f.Log = append(f.Log, FakeAction{Action: FakeActionUnmount, Target: target}) - return nil -} - -func (f *FakeMounter) List() ([]MountPoint, error) { - f.mutex.Lock() - defer f.mutex.Unlock() - - return f.MountPoints, nil -} - -func (f *FakeMounter) IsLikelyNotMountPoint(file string) (bool, error) { - f.mutex.Lock() - defer f.mutex.Unlock() - - for _, mp := range f.MountPoints { - if mp.Path == file { - glog.V(5).Infof("isLikelyMountPoint for %s: monted %s, false", file, mp.Path) - return false, nil - } - } - glog.V(5).Infof("isLikelyMountPoint for %s: true", file) - return true, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount.go deleted file mode 100644 index 9c1d8d4f2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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. -*/ - -// TODO(thockin): This whole pkg is pretty linux-centric. As soon as we have -// an alternate platform, we will need to abstract further. -package mount - -import ( - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/util/exec" - "path/filepath" -) - -type Interface interface { - // Mount mounts source to target as fstype with given options. - Mount(source string, target string, fstype string, options []string) error - // Unmount unmounts given target. - Unmount(target string) error - // List returns a list of all mounted filesystems. This can be large. - // On some platforms, reading mounts is not guaranteed consistent (i.e. - // it could change between chunked reads). This is guaranteed to be - // consistent. - List() ([]MountPoint, error) - // IsLikelyNotMountPoint determines if a directory is a mountpoint. - // It should return ErrNotExist when the directory does not exist. - IsLikelyNotMountPoint(file string) (bool, error) -} - -// This represents a single line in /proc/mounts or /etc/fstab. -type MountPoint struct { - Device string - Path string - Type string - Opts []string - Freq int - Pass int -} - -// SafeFormatAndMount probes a device to see if it is formatted. -// Namely it checks to see if a file system is present. If so it -// mounts it otherwise the device is formatted first then mounted. -type SafeFormatAndMount struct { - Interface - Runner exec.Interface -} - -// FormatAndMount formats the given disk, if needed, and mounts it. -// That is if the disk is not formatted and it is not being mounted as -// read-only it will format it first then mount it. Otherwise, if the -// disk is already formatted or it is being mounted as read-only, it -// will be mounted without formatting. -func (mounter *SafeFormatAndMount) FormatAndMount(source string, target string, fstype string, options []string) error { - // Don't attempt to format if mounting as readonly. Go straight to mounting. - for _, option := range options { - if option == "ro" { - return mounter.Interface.Mount(source, target, fstype, options) - } - } - return mounter.formatAndMount(source, target, fstype, options) -} - -// New returns a mount.Interface for the current system. -func New() Interface { - return &Mounter{} -} - -// GetMountRefs finds all other references to the device referenced -// by mountPath; returns a list of paths. -func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { - mps, err := mounter.List() - if err != nil { - return nil, err - } - - // Find the device name. - deviceName := "" - // If mountPath is symlink, need get its target path. - slTarget, err := filepath.EvalSymlinks(mountPath) - if err != nil { - slTarget = mountPath - } - for i := range mps { - if mps[i].Path == slTarget { - deviceName = mps[i].Device - break - } - } - - // Find all references to the device. - var refs []string - if deviceName == "" { - glog.Warningf("could not determine device for path: %q", mountPath) - } else { - for i := range mps { - if mps[i].Device == deviceName && mps[i].Path != slTarget { - refs = append(refs, mps[i].Path) - } - } - } - return refs, nil -} - -// GetDeviceNameFromMount: given a mnt point, find the device from /proc/mounts -// returns the device name, reference count, and error code -func GetDeviceNameFromMount(mounter Interface, mountPath string) (string, int, error) { - mps, err := mounter.List() - if err != nil { - return "", 0, err - } - - // Find the device name. - // FIXME if multiple devices mounted on the same mount path, only the first one is returned - device := "" - // If mountPath is symlink, need get its target path. - slTarget, err := filepath.EvalSymlinks(mountPath) - if err != nil { - slTarget = mountPath - } - for i := range mps { - if mps[i].Path == slTarget { - device = mps[i].Device - break - } - } - - // Find all references to the device. - refCount := 0 - for i := range mps { - if mps[i].Device == device { - refCount++ - } - } - return device, refCount, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux.go deleted file mode 100644 index 66959697c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux.go +++ /dev/null @@ -1,311 +0,0 @@ -// +build linux - -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -import ( - "bufio" - "fmt" - "hash/adler32" - "io" - "os" - "os/exec" - "strconv" - "strings" - "syscall" - - "github.com/golang/glog" - utilExec "k8s.io/kubernetes/pkg/util/exec" -) - -const ( - // How many times to retry for a consistent read of /proc/mounts. - maxListTries = 3 - // Number of fields per line in /proc/mounts as per the fstab man page. - expectedNumFieldsPerLine = 6 - // Location of the mount file to use - procMountsPath = "/proc/mounts" -) - -const ( - // 'fsck' found errors and corrected them - fsckErrorsCorrected = 1 - // 'fsck' found errors but exited without correcting them - fsckErrorsUncorrected = 4 -) - -// Mounter provides the default implementation of mount.Interface -// for the linux platform. This implementation assumes that the -// kubelet is running in the host's root mount namespace. -type Mounter struct{} - -var _ = Interface(&Mounter{}) - -// Mount mounts source to target as fstype with given options. 'source' and 'fstype' must -// be an emtpy string in case it's not required, e.g. for remount, or for auto filesystem -// type, where kernel handles fs type for you. The mount 'options' is a list of options, -// currently come from mount(8), e.g. "ro", "remount", "bind", etc. If no more option is -// required, call Mount with an empty string list or nil. -func (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error { - bind, bindRemountOpts := isBind(options) - - if bind { - err := doMount(source, target, fstype, []string{"bind"}) - if err != nil { - return err - } - return doMount(source, target, fstype, bindRemountOpts) - } else { - return doMount(source, target, fstype, options) - } -} - -// isBind detects whether a bind mount is being requested and makes the remount options to -// use in case of bind mount, due to the fact that bind mount doesn't respect mount options. -// The list equals: -// options - 'bind' + 'remount' (no duplicate) -func isBind(options []string) (bool, []string) { - bindRemountOpts := []string{"remount"} - bind := false - - if len(options) != 0 { - for _, option := range options { - switch option { - case "bind": - bind = true - break - case "remount": - break - default: - bindRemountOpts = append(bindRemountOpts, option) - } - } - } - - return bind, bindRemountOpts -} - -// doMount runs the mount command. -func doMount(source string, target string, fstype string, options []string) error { - glog.V(5).Infof("Mounting %s %s %s %v", source, target, fstype, options) - mountArgs := makeMountArgs(source, target, fstype, options) - command := exec.Command("mount", mountArgs...) - output, err := command.CombinedOutput() - if err != nil { - return fmt.Errorf("Mount failed: %v\nMounting arguments: %s %s %s %v\nOutput: %s\n", - err, source, target, fstype, options, string(output)) - } - return err -} - -// makeMountArgs makes the arguments to the mount(8) command. -func makeMountArgs(source, target, fstype string, options []string) []string { - // Build mount command as follows: - // mount [-t $fstype] [-o $options] [$source] $target - mountArgs := []string{} - if len(fstype) > 0 { - mountArgs = append(mountArgs, "-t", fstype) - } - if len(options) > 0 { - mountArgs = append(mountArgs, "-o", strings.Join(options, ",")) - } - if len(source) > 0 { - mountArgs = append(mountArgs, source) - } - mountArgs = append(mountArgs, target) - - return mountArgs -} - -// Unmount unmounts the target. -func (mounter *Mounter) Unmount(target string) error { - glog.V(5).Infof("Unmounting %s", target) - command := exec.Command("umount", target) - output, err := command.CombinedOutput() - if err != nil { - return fmt.Errorf("Unmount failed: %v\nUnmounting arguments: %s\nOutput: %s\n", err, target, string(output)) - } - return nil -} - -// List returns a list of all mounted filesystems. -func (*Mounter) List() ([]MountPoint, error) { - return listProcMounts(procMountsPath) -} - -// IsLikelyNotMountPoint determines if a directory is not a mountpoint. -// It is fast but not necessarily ALWAYS correct. If the path is in fact -// a bind mount from one part of a mount to another it will not be detected. -// mkdir /tmp/a /tmp/b; mount --bin /tmp/a /tmp/b; IsLikelyNotMountPoint("/tmp/b") -// will return true. When in fact /tmp/b is a mount point. If this situation -// if of interest to you, don't use this function... -func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { - stat, err := os.Stat(file) - if err != nil { - return true, err - } - rootStat, err := os.Lstat(file + "/..") - if err != nil { - return true, err - } - // If the directory has a different device as parent, then it is a mountpoint. - if stat.Sys().(*syscall.Stat_t).Dev != rootStat.Sys().(*syscall.Stat_t).Dev { - return false, nil - } - - return true, nil -} - -func listProcMounts(mountFilePath string) ([]MountPoint, error) { - hash1, err := readProcMounts(mountFilePath, nil) - if err != nil { - return nil, err - } - - for i := 0; i < maxListTries; i++ { - mps := []MountPoint{} - hash2, err := readProcMounts(mountFilePath, &mps) - if err != nil { - return nil, err - } - if hash1 == hash2 { - // Success - return mps, nil - } - hash1 = hash2 - } - return nil, fmt.Errorf("failed to get a consistent snapshot of %v after %d tries", mountFilePath, maxListTries) -} - -// readProcMounts reads the given mountFilePath (normally /proc/mounts) and produces a hash -// of the contents. If the out argument is not nil, this fills it with MountPoint structs. -func readProcMounts(mountFilePath string, out *[]MountPoint) (uint32, error) { - file, err := os.Open(mountFilePath) - if err != nil { - return 0, err - } - defer file.Close() - return readProcMountsFrom(file, out) -} - -func readProcMountsFrom(file io.Reader, out *[]MountPoint) (uint32, error) { - hash := adler32.New() - scanner := bufio.NewReader(file) - for { - line, err := scanner.ReadString('\n') - if err == io.EOF { - break - } - fields := strings.Fields(line) - if len(fields) != expectedNumFieldsPerLine { - return 0, fmt.Errorf("wrong number of fields (expected %d, got %d): %s", expectedNumFieldsPerLine, len(fields), line) - } - - fmt.Fprintf(hash, "%s", line) - - if out != nil { - mp := MountPoint{ - Device: fields[0], - Path: fields[1], - Type: fields[2], - Opts: strings.Split(fields[3], ","), - } - - freq, err := strconv.Atoi(fields[4]) - if err != nil { - return 0, err - } - mp.Freq = freq - - pass, err := strconv.Atoi(fields[5]) - if err != nil { - return 0, err - } - mp.Pass = pass - - *out = append(*out, mp) - } - } - return hash.Sum32(), nil -} - -// formatAndMount uses unix utils to format and mount the given disk -func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, fstype string, options []string) error { - options = append(options, "defaults") - - // Run fsck on the disk to fix repairable issues - args := []string{"-a", source} - cmd := mounter.Runner.Command("fsck", args...) - out, err := cmd.CombinedOutput() - if err != nil { - ee, isExitError := err.(utilExec.ExitError) - switch { - case err == utilExec.ErrExecutableNotFound: - glog.Warningf("'fsck' not found on system; continuing mount without running 'fsck'.") - case isExitError && ee.ExitStatus() == fsckErrorsCorrected: - glog.Infof("Device %s has errors which were corrected by fsck.", source) - case isExitError && ee.ExitStatus() == fsckErrorsUncorrected: - return fmt.Errorf("'fsck' found errors on device %s but could not correct them: %s.", source, string(out)) - case isExitError && ee.ExitStatus() > fsckErrorsUncorrected: - glog.Infof("`fsck` error %s", string(out)) - } - } - - // Try to mount the disk - err = mounter.Interface.Mount(source, target, fstype, options) - if err != nil { - // It is possible that this disk is not formatted. Double check using diskLooksUnformatted - notFormatted, err := mounter.diskLooksUnformatted(source) - if err == nil && notFormatted { - args = []string{source} - // Disk is unformatted so format it. - // Use 'ext4' as the default - if len(fstype) == 0 { - fstype = "ext4" - } - if fstype == "ext4" || fstype == "ext3" { - args = []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", source} - } - cmd := mounter.Runner.Command("mkfs."+fstype, args...) - _, err := cmd.CombinedOutput() - if err == nil { - // the disk has been formatted successfully try to mount it again. - return mounter.Interface.Mount(source, target, fstype, options) - } - return err - } - } - return err -} - -// diskLooksUnformatted uses 'lsblk' to see if the given disk is unformated -func (mounter *SafeFormatAndMount) diskLooksUnformatted(disk string) (bool, error) { - args := []string{"-nd", "-o", "FSTYPE", disk} - cmd := mounter.Runner.Command("lsblk", args...) - dataOut, err := cmd.CombinedOutput() - output := strings.TrimSpace(string(dataOut)) - - // TODO (#13212): check if this disk has partitions and return false, and - // an error if so. - - if err != nil { - return false, err - } - - return output == "", nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux_test.go deleted file mode 100644 index cd802d774..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_linux_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// +build linux - -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -import ( - "strings" - "testing" -) - -func TestReadProcMountsFrom(t *testing.T) { - successCase := - `/dev/0 /path/to/0 type0 flags 0 0 - /dev/1 /path/to/1 type1 flags 1 1 - /dev/2 /path/to/2 type2 flags,1,2=3 2 2 - ` - hash, err := readProcMountsFrom(strings.NewReader(successCase), nil) - if err != nil { - t.Errorf("expected success") - } - if hash != 0xa3522051 { - t.Errorf("expected 0xa3522051, got %#x", hash) - } - mounts := []MountPoint{} - hash, err = readProcMountsFrom(strings.NewReader(successCase), &mounts) - if err != nil { - t.Errorf("expected success") - } - if hash != 0xa3522051 { - t.Errorf("expected 0xa3522051, got %#x", hash) - } - if len(mounts) != 3 { - t.Fatalf("expected 3 mounts, got %d", len(mounts)) - } - mp := MountPoint{"/dev/0", "/path/to/0", "type0", []string{"flags"}, 0, 0} - if !mountPointsEqual(&mounts[0], &mp) { - t.Errorf("got unexpected MountPoint[0]: %#v", mounts[0]) - } - mp = MountPoint{"/dev/1", "/path/to/1", "type1", []string{"flags"}, 1, 1} - if !mountPointsEqual(&mounts[1], &mp) { - t.Errorf("got unexpected MountPoint[1]: %#v", mounts[1]) - } - mp = MountPoint{"/dev/2", "/path/to/2", "type2", []string{"flags", "1", "2=3"}, 2, 2} - if !mountPointsEqual(&mounts[2], &mp) { - t.Errorf("got unexpected MountPoint[2]: %#v", mounts[2]) - } - - errorCases := []string{ - "/dev/0 /path/to/mount\n", - "/dev/1 /path/to/mount type flags a 0\n", - "/dev/2 /path/to/mount type flags 0 b\n", - } - for _, ec := range errorCases { - _, err := readProcMountsFrom(strings.NewReader(ec), &mounts) - if err == nil { - t.Errorf("expected error") - } - } -} - -func mountPointsEqual(a, b *MountPoint) bool { - if a.Device != b.Device || a.Path != b.Path || a.Type != b.Type || !slicesEqual(a.Opts, b.Opts) || a.Pass != b.Pass || a.Freq != b.Freq { - return false - } - return true -} - -func slicesEqual(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if a[i] != b[i] { - return false - } - } - return true -} - -func TestGetMountRefs(t *testing.T) { - fm := &FakeMounter{ - MountPoints: []MountPoint{ - {Device: "/dev/sdb", Path: "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd"}, - {Device: "/dev/sdb", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd-in-pod"}, - {Device: "/dev/sdc", Path: "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd2"}, - {Device: "/dev/sdc", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod"}, - {Device: "/dev/sdc", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod2"}, - }, - } - - tests := []struct { - mountPath string - expectedRefs []string - }{ - { - "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd-in-pod", - []string{ - "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd", - }, - }, - { - "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod", - []string{ - "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod2", - "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd2", - }, - }, - } - - for i, test := range tests { - if refs, err := GetMountRefs(fm, test.mountPath); err != nil || !setEquivalent(test.expectedRefs, refs) { - t.Errorf("%d. getMountRefs(%q) = %v, %v; expected %v, nil", i, test.mountPath, refs, err, test.expectedRefs) - } - } -} - -func setEquivalent(set1, set2 []string) bool { - map1 := make(map[string]bool) - map2 := make(map[string]bool) - for _, s := range set1 { - map1[s] = true - } - for _, s := range set2 { - map2[s] = true - } - - for s := range map1 { - if !map2[s] { - return false - } - } - for s := range map2 { - if !map1[s] { - return false - } - } - return true -} - -func TestGetDeviceNameFromMount(t *testing.T) { - fm := &FakeMounter{ - MountPoints: []MountPoint{ - {Device: "/dev/disk/by-path/prefix-lun-1", - Path: "/mnt/111"}, - {Device: "/dev/disk/by-path/prefix-lun-1", - Path: "/mnt/222"}, - }, - } - - tests := []struct { - mountPath string - expectedDevice string - expectedRefs int - }{ - { - "/mnt/222", - "/dev/disk/by-path/prefix-lun-1", - 2, - }, - } - - for i, test := range tests { - if device, refs, err := GetDeviceNameFromMount(fm, test.mountPath); err != nil || test.expectedRefs != refs || test.expectedDevice != device { - t.Errorf("%d. GetDeviceNameFromMount(%s) = (%s, %d), %v; expected (%s,%d), nil", i, test.mountPath, device, refs, err, test.expectedDevice, test.expectedRefs) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go deleted file mode 100644 index 8942c0036..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go +++ /dev/null @@ -1,45 +0,0 @@ -// +build !linux - -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -type Mounter struct{} - -func (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error { - return nil -} - -func (mounter *Mounter) Unmount(target string) error { - return nil -} - -func (mounter *Mounter) List() ([]MountPoint, error) { - return []MountPoint{}, nil -} - -func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { - return true, nil -} - -func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, fstype string, options []string) error { - return nil -} - -func (mounter *SafeFormatAndMount) diskLooksUnformatted(disk string) (bool, error) { - return true, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go deleted file mode 100644 index 9be0e551d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go +++ /dev/null @@ -1,207 +0,0 @@ -// +build linux - -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -import ( - "os" - "path/filepath" - "strings" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/util/exec" -) - -// NsenterMounter is part of experimental support for running the kubelet -// in a container. Currently, all docker containers receive their own mount -// namespaces. NsenterMounter works by executing nsenter to run commands in -// the host's mount namespace. -// -// NsenterMounter requires: -// -// 1. Docker >= 1.6 due to the dependency on the slave propagation mode -// of the bind-mount of the kubelet root directory in the container. -// Docker 1.5 used a private propagation mode for bind-mounts, so mounts -// performed in the host's mount namespace do not propagate out to the -// bind-mount in this docker version. -// 2. The host's root filesystem must be available at /rootfs -// 3. The nsenter binary must be on the Kubelet process' PATH in the container's -// filesystem. -// 4. The Kubelet process must have CAP_SYS_ADMIN (required by nsenter); at -// the present, this effectively means that the kubelet is running in a -// privileged container. -// 5. The volume path used by the Kubelet must be the same inside and outside -// the container and be writable by the container (to initialize volume) -// contents. TODO: remove this requirement. -// 6. The host image must have mount, findmnt, and umount binaries in /bin, -// /usr/sbin, or /usr/bin -// -// For more information about mount propagation modes, see: -// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt -type NsenterMounter struct { - // a map of commands to their paths on the host filesystem - paths map[string]string -} - -func NewNsenterMounter() *NsenterMounter { - m := &NsenterMounter{ - paths: map[string]string{ - "mount": "", - "findmnt": "", - "umount": "", - }, - } - // search for the mount command in other locations besides /usr/bin - for binary := range m.paths { - // default to root - m.paths[binary] = filepath.Join("/", binary) - for _, path := range []string{"/bin", "/usr/sbin", "/usr/bin"} { - binPath := filepath.Join(path, binary) - if _, err := os.Stat(filepath.Join(hostRootFsPath, binPath)); err != nil { - continue - } - m.paths[binary] = binPath - break - } - // TODO: error, so that the kubelet can stop if the mounts don't exist - } - return m -} - -// NsenterMounter implements mount.Interface -var _ = Interface(&NsenterMounter{}) - -const ( - hostRootFsPath = "/rootfs" - hostProcMountsPath = "/rootfs/proc/mounts" - nsenterPath = "nsenter" -) - -// Mount runs mount(8) in the host's root mount namespace. Aside from this -// aspect, Mount has the same semantics as the mounter returned by mount.New() -func (n *NsenterMounter) Mount(source string, target string, fstype string, options []string) error { - bind, bindRemountOpts := isBind(options) - - if bind { - err := n.doNsenterMount(source, target, fstype, []string{"bind"}) - if err != nil { - return err - } - return n.doNsenterMount(source, target, fstype, bindRemountOpts) - } - - return n.doNsenterMount(source, target, fstype, options) -} - -// doNsenterMount nsenters the host's mount namespace and performs the -// requested mount. -func (n *NsenterMounter) doNsenterMount(source, target, fstype string, options []string) error { - glog.V(5).Infof("nsenter Mounting %s %s %s %v", source, target, fstype, options) - args := n.makeNsenterArgs(source, target, fstype, options) - - glog.V(5).Infof("Mount command: %v %v", nsenterPath, args) - exec := exec.New() - outputBytes, err := exec.Command(nsenterPath, args...).CombinedOutput() - if len(outputBytes) != 0 { - glog.V(5).Infof("Output of mounting %s to %s: %v", source, target, string(outputBytes)) - } - - return err -} - -// makeNsenterArgs makes a list of argument to nsenter in order to do the -// requested mount. -func (n *NsenterMounter) makeNsenterArgs(source, target, fstype string, options []string) []string { - nsenterArgs := []string{ - "--mount=/rootfs/proc/1/ns/mnt", - "--", - n.absHostPath("mount"), - } - - args := makeMountArgs(source, target, fstype, options) - - return append(nsenterArgs, args...) -} - -// Unmount runs umount(8) in the host's mount namespace. -func (n *NsenterMounter) Unmount(target string) error { - args := []string{ - "--mount=/rootfs/proc/1/ns/mnt", - "--", - n.absHostPath("umount"), - target, - } - - glog.V(5).Infof("Unmount command: %v %v", nsenterPath, args) - exec := exec.New() - outputBytes, err := exec.Command(nsenterPath, args...).CombinedOutput() - if len(outputBytes) != 0 { - glog.V(5).Infof("Output of unmounting %s: %v", target, string(outputBytes)) - } - - return err -} - -// List returns a list of all mounted filesystems in the host's mount namespace. -func (*NsenterMounter) List() ([]MountPoint, error) { - return listProcMounts(hostProcMountsPath) -} - -// IsLikelyNotMountPoint determines whether a path is a mountpoint by calling findmnt -// in the host's root mount namespace. -func (n *NsenterMounter) IsLikelyNotMountPoint(file string) (bool, error) { - file, err := filepath.Abs(file) - if err != nil { - return true, err - } - - // Check the directory exists - if _, err = os.Stat(file); os.IsNotExist(err) { - glog.V(5).Infof("findmnt: directory %s does not exist", file) - return true, err - } - - args := []string{"--mount=/rootfs/proc/1/ns/mnt", "--", n.absHostPath("findmnt"), "-o", "target", "--noheadings", "--target", file} - glog.V(5).Infof("findmnt command: %v %v", nsenterPath, args) - - exec := exec.New() - out, err := exec.Command(nsenterPath, args...).CombinedOutput() - if err != nil { - glog.V(2).Infof("Failed findmnt command for path %s: %v", file, err) - // Different operating systems behave differently for paths which are not mount points. - // On older versions (e.g. 2.20.1) we'd get error, on newer ones (e.g. 2.26.2) we'd get "/". - // It's safer to assume that it's not a mount point. - return true, nil - } - strOut := strings.TrimSuffix(string(out), "\n") - - glog.V(5).Infof("IsLikelyNotMountPoint findmnt output for path %s: %v", file, strOut) - if strOut == file { - return false, nil - } - - return true, nil -} - -func (n *NsenterMounter) absHostPath(command string) string { - path, ok := n.paths[command] - if !ok { - return command - } - return path -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go deleted file mode 100644 index 210fab851..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build !linux - -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -type NsenterMounter struct{} - -func NewNsenterMounter() *NsenterMounter { - return &NsenterMounter{} -} - -var _ = Interface(&NsenterMounter{}) - -func (*NsenterMounter) Mount(source string, target string, fstype string, options []string) error { - return nil -} - -func (*NsenterMounter) Unmount(target string) error { - return nil -} - -func (*NsenterMounter) List() ([]MountPoint, error) { - return []MountPoint{}, nil -} - -func (*NsenterMounter) IsLikelyNotMountPoint(file string) (bool, error) { - return true, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/safe_format_and_mount_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/safe_format_and_mount_test.go deleted file mode 100644 index 03c0b8442..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/mount/safe_format_and_mount_test.go +++ /dev/null @@ -1,224 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 mount - -import ( - "fmt" - "runtime" - "testing" - - "k8s.io/kubernetes/pkg/util/exec" -) - -type ErrorMounter struct { - *FakeMounter - errIndex int - err []error -} - -func (mounter *ErrorMounter) Mount(source string, target string, fstype string, options []string) error { - i := mounter.errIndex - mounter.errIndex++ - if mounter.err != nil && mounter.err[i] != nil { - return mounter.err[i] - } - return mounter.FakeMounter.Mount(source, target, fstype, options) -} - -type ExecArgs struct { - command string - args []string - output string - err error -} - -func TestSafeFormatAndMount(t *testing.T) { - if runtime.GOOS == "darwin" || runtime.GOOS == "windows" { - t.Skipf("not supported on GOOS=%s", runtime.GOOS) - } - tests := []struct { - description string - fstype string - mountOptions []string - execScripts []ExecArgs - mountErrs []error - expectedError error - }{ - { - description: "Test a read only mount", - fstype: "ext4", - mountOptions: []string{"ro"}, - }, - { - description: "Test a normal mount", - fstype: "ext4", - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - }, - }, - { - description: "Test 'fsck' fails with exit status 4", - fstype: "ext4", - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 4}}, - }, - expectedError: fmt.Errorf("'fsck' found errors on device /dev/foo but could not correct them: ."), - }, - { - description: "Test 'fsck' fails with exit status 1 (errors found and corrected)", - fstype: "ext4", - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 1}}, - }, - }, - { - description: "Test 'fsck' fails with exit status other than 1 and 4 (likely unformatted device)", - fstype: "ext4", - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", &exec.FakeExitError{Status: 8}}, - }, - }, - { - description: "Test that 'lsblk' is called and fails", - fstype: "ext4", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "ext4", nil}, - }, - expectedError: fmt.Errorf("unknown filesystem type '(null)'"), - }, - { - description: "Test that 'lsblk' is called and confirms unformatted disk, format fails", - fstype: "ext4", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, - {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", fmt.Errorf("formatting failed")}, - }, - expectedError: fmt.Errorf("formatting failed"), - }, - { - description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount fails", - fstype: "ext4", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), fmt.Errorf("Still cannot mount")}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, - {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, - }, - expectedError: fmt.Errorf("Still cannot mount"), - }, - { - description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes", - fstype: "ext4", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, - {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, - }, - expectedError: nil, - }, - { - description: "Test that 'lsblk' is called and confirms unformatted disk, format passes, second mount passes with ext3", - fstype: "ext3", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, - {"mkfs.ext3", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, - }, - expectedError: nil, - }, - { - description: "test that none ext4 fs does not get called with ext4 options.", - fstype: "xfs", - mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, - execScripts: []ExecArgs{ - {"fsck", []string{"-a", "/dev/foo"}, "", nil}, - {"lsblk", []string{"-nd", "-o", "FSTYPE", "/dev/foo"}, "", nil}, - {"mkfs.xfs", []string{"/dev/foo"}, "", nil}, - }, - expectedError: nil, - }, - } - - for _, test := range tests { - commandScripts := []exec.FakeCommandAction{} - for _, expected := range test.execScripts { - ecmd := expected.command - eargs := expected.args - output := expected.output - err := expected.err - commandScript := func(cmd string, args ...string) exec.Cmd { - if cmd != ecmd { - t.Errorf("Unexpected command %s. Expecting %s", cmd, ecmd) - } - - for j := range args { - if args[j] != eargs[j] { - t.Errorf("Unexpected args %v. Expecting %v", args, eargs) - } - } - fake := exec.FakeCmd{ - CombinedOutputScript: []exec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(output), err }, - }, - } - return exec.InitFakeCmd(&fake, cmd, args...) - } - commandScripts = append(commandScripts, commandScript) - } - - fake := exec.FakeExec{ - CommandScript: commandScripts, - } - - fakeMounter := ErrorMounter{&FakeMounter{}, 0, test.mountErrs} - mounter := SafeFormatAndMount{ - Interface: &fakeMounter, - Runner: &fake, - } - - device := "/dev/foo" - dest := "/mnt/bar" - err := mounter.FormatAndMount(device, dest, test.fstype, test.mountOptions) - if test.expectedError == nil { - if err != nil { - t.Errorf("test \"%s\" unexpected non-error: %v", test.description, err) - } - - // Check that something was mounted on the directory - isNotMountPoint, err := fakeMounter.IsLikelyNotMountPoint(dest) - if err != nil || isNotMountPoint { - t.Errorf("test \"%s\" the directory was not mounted", test.description) - } - - //check that the correct device was mounted - mountedDevice, _, err := GetDeviceNameFromMount(fakeMounter.FakeMounter, dest) - if err != nil || mountedDevice != device { - t.Errorf("test \"%s\" the correct device was not mounted", test.description) - } - } else { - if err == nil || test.expectedError.Error() != err.Error() { - t.Errorf("test \"%s\" unexpected error: \n [%v]. \nExpecting [%v]", test.description, err, test.expectedError) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/http_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/http_test.go deleted file mode 100644 index 1de67cade..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/http_test.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 net - -import ( - "net" - "net/http" - "net/url" - "os" - "reflect" - "testing" -) - -func TestGetClientIP(t *testing.T) { - ipString := "10.0.0.1" - ip := net.ParseIP(ipString) - invalidIPString := "invalidIPString" - testCases := []struct { - Request http.Request - ExpectedIP net.IP - }{ - { - Request: http.Request{}, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Real-Ip": {ipString}, - }, - }, - ExpectedIP: ip, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Real-Ip": {invalidIPString}, - }, - }, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Forwarded-For": {ipString}, - }, - }, - ExpectedIP: ip, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Forwarded-For": {invalidIPString}, - }, - }, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Forwarded-For": {invalidIPString + "," + ipString}, - }, - }, - ExpectedIP: ip, - }, - { - Request: http.Request{ - RemoteAddr: ipString, - }, - ExpectedIP: ip, - }, - { - Request: http.Request{ - RemoteAddr: invalidIPString, - }, - }, - { - Request: http.Request{ - Header: map[string][]string{ - "X-Forwarded-For": {invalidIPString}, - }, - RemoteAddr: ipString, - }, - ExpectedIP: ip, - }, - } - - for i, test := range testCases { - if a, e := GetClientIP(&test.Request), test.ExpectedIP; reflect.DeepEqual(e, a) != true { - t.Fatalf("test case %d failed. expected: %v, actual: %v", i+1, e, a) - } - } -} - -func TestProxierWithNoProxyCIDR(t *testing.T) { - testCases := []struct { - name string - noProxy string - url string - - expectedDelegated bool - }{ - { - name: "no env", - url: "https://192.168.143.1/api", - expectedDelegated: true, - }, - { - name: "no cidr", - noProxy: "192.168.63.1", - url: "https://192.168.143.1/api", - expectedDelegated: true, - }, - { - name: "hostname", - noProxy: "192.168.63.0/24,192.168.143.0/24", - url: "https://my-hostname/api", - expectedDelegated: true, - }, - { - name: "match second cidr", - noProxy: "192.168.63.0/24,192.168.143.0/24", - url: "https://192.168.143.1/api", - expectedDelegated: false, - }, - { - name: "match second cidr with host:port", - noProxy: "192.168.63.0/24,192.168.143.0/24", - url: "https://192.168.143.1:8443/api", - expectedDelegated: false, - }, - } - - for _, test := range testCases { - os.Setenv("NO_PROXY", test.noProxy) - actualDelegated := false - proxyFunc := NewProxierWithNoProxyCIDR(func(req *http.Request) (*url.URL, error) { - actualDelegated = true - return nil, nil - }) - - req, err := http.NewRequest("GET", test.url, nil) - if err != nil { - t.Errorf("%s: unexpected err: %v", test.name, err) - continue - } - if _, err := proxyFunc(req); err != nil { - t.Errorf("%s: unexpected err: %v", test.name, err) - continue - } - - if test.expectedDelegated != actualDelegated { - t.Errorf("%s: expected %v, got %v", test.name, test.expectedDelegated, actualDelegated) - continue - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/interface_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/interface_test.go deleted file mode 100644 index 9571e5b48..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/interface_test.go +++ /dev/null @@ -1,300 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 net - -import ( - "fmt" - "io" - "net" - "strings" - "testing" -) - -const gatewayfirst = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 -eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` -const gatewaylast = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 -eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 -` -const gatewaymiddle = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` -const noInternetConnection = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` -const nothing = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -` -const gatewayfirstIpv6_1 = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 -eth3 0000FE0AA1 00000000 0001 0 0 0 0080FFFF 0 0 0 -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` -const gatewayfirstIpv6_2 = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth3 00000000 0100FE0AA1 0003 0 0 1024 00000000 0 0 0 -eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` -const route_Invalidhex = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth3 00000000 0100FE0AA 0003 0 0 1024 00000000 0 0 0 -eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 -docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 -virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 -` - -// Based on DigitalOcean COREOS -const gatewayfirstLinkLocal = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT -eth0 00000000 0120372D 0001 0 0 0 00000000 0 0 0 -eth0 00000000 00000000 0001 0 0 2048 00000000 0 0 0 -` - -func TestGetRoutes(t *testing.T) { - testCases := []struct { - tcase string - route string - expected int - }{ - {"gatewayfirst", gatewayfirst, 4}, - {"gatewaymiddle", gatewaymiddle, 4}, - {"gatewaylast", gatewaylast, 4}, - {"nothing", nothing, 0}, - {"gatewayfirstIpv6_1", gatewayfirstIpv6_1, 0}, - {"gatewayfirstIpv6_2", gatewayfirstIpv6_2, 0}, - {"route_Invalidhex", route_Invalidhex, 0}, - } - for _, tc := range testCases { - r := strings.NewReader(tc.route) - routes, err := getRoutes(r) - if len(routes) != tc.expected { - t.Errorf("case[%v]: expected %v, got %v .err : %v", tc.tcase, tc.expected, len(routes), err) - } - } -} - -func TestParseIP(t *testing.T) { - testCases := []struct { - tcase string - ip string - success bool - expected net.IP - }{ - {"empty", "", false, nil}, - {"too short", "AA", false, nil}, - {"too long", "0011223344", false, nil}, - {"invalid", "invalid!", false, nil}, - {"zero", "00000000", true, net.IP{0, 0, 0, 0}}, - {"ffff", "FFFFFFFF", true, net.IP{0xff, 0xff, 0xff, 0xff}}, - {"valid", "12345678", true, net.IP{120, 86, 52, 18}}, - } - for _, tc := range testCases { - ip, err := parseIP(tc.ip) - if !ip.Equal(tc.expected) { - t.Errorf("case[%v]: expected %q, got %q . err : %v", tc.tcase, tc.expected, ip, err) - } - } -} - -func TestIsInterfaceUp(t *testing.T) { - testCases := []struct { - tcase string - intf net.Interface - expected bool - }{ - {"up", net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp}, true}, - {"down", net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: 0}, false}, - {"nothing", net.Interface{}, false}, - } - for _, tc := range testCases { - it := isInterfaceUp(&tc.intf) - if it != tc.expected { - t.Errorf("case[%v]: expected %v, got %v .", tc.tcase, tc.expected, it) - } - } -} - -type addrStruct struct{ val string } - -func (a addrStruct) Network() string { - return a.val -} -func (a addrStruct) String() string { - return a.val -} - -func TestFinalIP(t *testing.T) { - testCases := []struct { - tcase string - addr []net.Addr - expected net.IP - }{ - {"ipv6", []net.Addr{addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}}, nil}, - {"invalidCIDR", []net.Addr{addrStruct{val: "fe80::2f7:67fff:fe6e:2956/64"}}, nil}, - {"loopback", []net.Addr{addrStruct{val: "127.0.0.1/24"}}, nil}, - {"ip4", []net.Addr{addrStruct{val: "10.254.12.132/17"}}, net.ParseIP("10.254.12.132")}, - - {"nothing", []net.Addr{}, nil}, - } - for _, tc := range testCases { - ip, err := getFinalIP(tc.addr) - if !ip.Equal(tc.expected) { - t.Errorf("case[%v]: expected %v, got %v .err : %v", tc.tcase, tc.expected, ip, err) - } - } -} - -func TestAddrs(t *testing.T) { - var nw networkInterfacer = validNetworkInterface{} - intf := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: 0} - addrs, err := nw.Addrs(&intf) - if err != nil { - t.Errorf("expected no error got : %v", err) - } - if len(addrs) != 2 { - t.Errorf("expected addrs: 2 got null") - } -} - -type validNetworkInterface struct { -} - -func (_ validNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { - c := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp} - return &c, nil -} -func (_ validNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { - var ifat []net.Addr - ifat = []net.Addr{ - addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}, addrStruct{val: "10.254.71.145/17"}} - return ifat, nil -} - -type validNetworkInterfaceWithLinkLocal struct { -} - -func (_ validNetworkInterfaceWithLinkLocal) InterfaceByName(intfName string) (*net.Interface, error) { - c := net.Interface{Index: 0, MTU: 0, Name: "eth0", HardwareAddr: nil, Flags: net.FlagUp} - return &c, nil -} -func (_ validNetworkInterfaceWithLinkLocal) Addrs(intf *net.Interface) ([]net.Addr, error) { - var ifat []net.Addr - ifat = []net.Addr{addrStruct{val: "169.254.162.166/16"}, addrStruct{val: "45.55.47.146/19"}} - return ifat, nil -} - -type validNetworkInterfacewithIpv6Only struct { -} - -func (_ validNetworkInterfacewithIpv6Only) InterfaceByName(intfName string) (*net.Interface, error) { - c := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp} - return &c, nil -} -func (_ validNetworkInterfacewithIpv6Only) Addrs(intf *net.Interface) ([]net.Addr, error) { - var ifat []net.Addr - ifat = []net.Addr{addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}} - return ifat, nil -} - -type noNetworkInterface struct { -} - -func (_ noNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { - return nil, fmt.Errorf("unable get Interface") -} -func (_ noNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { - return nil, nil -} - -type networkInterfacewithNoAddrs struct { -} - -func (_ networkInterfacewithNoAddrs) InterfaceByName(intfName string) (*net.Interface, error) { - c := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp} - return &c, nil -} -func (_ networkInterfacewithNoAddrs) Addrs(intf *net.Interface) ([]net.Addr, error) { - return nil, fmt.Errorf("unable get Addrs") -} - -type networkInterfacewithIpv6addrs struct { -} - -func (_ networkInterfacewithIpv6addrs) InterfaceByName(intfName string) (*net.Interface, error) { - c := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp} - return &c, nil -} -func (_ networkInterfacewithIpv6addrs) Addrs(intf *net.Interface) ([]net.Addr, error) { - var ifat []net.Addr - ifat = []net.Addr{addrStruct{val: "fe80::2f7:6ffff:fe6e:2956/64"}} - return ifat, nil -} - -func TestGetIPFromInterface(t *testing.T) { - testCases := []struct { - tcase string - nwname string - nw networkInterfacer - expected net.IP - }{ - {"valid", "eth3", validNetworkInterface{}, net.ParseIP("10.254.71.145")}, - {"ipv6", "eth3", validNetworkInterfacewithIpv6Only{}, nil}, - {"nothing", "eth3", noNetworkInterface{}, nil}, - } - for _, tc := range testCases { - ip, err := getIPFromInterface(tc.nwname, tc.nw) - if !ip.Equal(tc.expected) { - t.Errorf("case[%v]: expected %v, got %+v .err : %v", tc.tcase, tc.expected, ip, err) - } - } -} - -func TestChooseHostInterfaceFromRoute(t *testing.T) { - testCases := []struct { - tcase string - inFile io.Reader - nw networkInterfacer - expected net.IP - }{ - {"valid_routefirst", strings.NewReader(gatewayfirst), validNetworkInterface{}, net.ParseIP("10.254.71.145")}, - {"valid_routelast", strings.NewReader(gatewaylast), validNetworkInterface{}, net.ParseIP("10.254.71.145")}, - {"valid_routemiddle", strings.NewReader(gatewaymiddle), validNetworkInterface{}, net.ParseIP("10.254.71.145")}, - {"valid_routemiddle_ipv6", strings.NewReader(gatewaymiddle), validNetworkInterfacewithIpv6Only{}, nil}, - {"no internet connection", strings.NewReader(noInternetConnection), validNetworkInterface{}, nil}, - {"no non-link-local ip", strings.NewReader(gatewayfirstLinkLocal), validNetworkInterfaceWithLinkLocal{}, net.ParseIP("45.55.47.146")}, - {"no route", strings.NewReader(nothing), validNetworkInterface{}, nil}, - {"no route file", nil, validNetworkInterface{}, nil}, - {"no interfaces", nil, noNetworkInterface{}, nil}, - {"no interface Addrs", strings.NewReader(gatewaymiddle), networkInterfacewithNoAddrs{}, nil}, - {"Invalid Addrs", strings.NewReader(gatewaymiddle), networkInterfacewithIpv6addrs{}, nil}, - } - for _, tc := range testCases { - ip, err := chooseHostInterfaceFromRoute(tc.inFile, tc.nw) - if !ip.Equal(tc.expected) { - t.Errorf("case[%v]: expected %v, got %+v .err : %v", tc.tcase, tc.expected, ip, err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_range_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_range_test.go deleted file mode 100644 index 9eb081aa7..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_range_test.go +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 net - -import ( - "testing" - - flag "github.com/spf13/pflag" -) - -func TestPortRange(t *testing.T) { - testCases := []struct { - input string - success bool - expected string - included int - excluded int - }{ - {"100-200", true, "100-200", 200, 201}, - {" 100-200 ", true, "100-200", 200, 201}, - {"0-0", true, "0-0", 0, 1}, - {"", true, "", -1, 0}, - {"100", false, "", -1, -1}, - {"100 - 200", false, "", -1, -1}, - {"-100", false, "", -1, -1}, - {"100-", false, "", -1, -1}, - } - - for i := range testCases { - tc := &testCases[i] - pr := &PortRange{} - var f flag.Value = pr - err := f.Set(tc.input) - if err != nil && tc.success == true { - t.Errorf("expected success, got %q", err) - continue - } else if err == nil && tc.success == false { - t.Errorf("expected failure") - continue - } else if tc.success { - if f.String() != tc.expected { - t.Errorf("expected %q, got %q", tc.expected, f.String()) - } - if tc.included >= 0 && !pr.Contains(tc.included) { - t.Errorf("expected %q to include %d", f.String(), tc.included) - } - if tc.excluded >= 0 && pr.Contains(tc.excluded) { - t.Errorf("expected %q to exclude %d", f.String(), tc.excluded) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_split_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_split_test.go deleted file mode 100644 index 2e9e135c0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/port_split_test.go +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 net - -import ( - "testing" -) - -func TestSplitSchemeNamePort(t *testing.T) { - table := []struct { - in string - name, port, scheme string - valid bool - normalized bool - }{ - { - in: "aoeu:asdf", - name: "aoeu", - port: "asdf", - valid: true, - }, { - in: "http:aoeu:asdf", - scheme: "http", - name: "aoeu", - port: "asdf", - valid: true, - }, { - in: "https:aoeu:", - scheme: "https", - name: "aoeu", - port: "", - valid: true, - normalized: false, - }, { - in: "https:aoeu:asdf", - scheme: "https", - name: "aoeu", - port: "asdf", - valid: true, - }, { - in: "aoeu:", - name: "aoeu", - valid: true, - normalized: false, - }, { - in: ":asdf", - valid: false, - }, { - in: "aoeu:asdf:htns", - valid: false, - }, { - in: "aoeu", - name: "aoeu", - valid: true, - }, { - in: "", - valid: false, - }, - } - - for _, item := range table { - scheme, name, port, valid := SplitSchemeNamePort(item.in) - if e, a := item.scheme, scheme; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.name, name; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.port, port; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.valid, valid; e != a { - t.Errorf("%q: Wanted %t, got %t", item.in, e, a) - } - - // Make sure valid items round trip through JoinSchemeNamePort - if item.valid { - out := JoinSchemeNamePort(scheme, name, port) - if item.normalized && out != item.in { - t.Errorf("%q: Wanted %s, got %s", item.in, item.in, out) - } - scheme, name, port, valid := SplitSchemeNamePort(out) - if e, a := item.scheme, scheme; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.name, name; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.port, port; e != a { - t.Errorf("%q: Wanted %q, got %q", item.in, e, a) - } - if e, a := item.valid, valid; e != a { - t.Errorf("%q: Wanted %t, got %t", item.in, e, a) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/sets/ipnet_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/sets/ipnet_test.go deleted file mode 100644 index 0223d1651..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/net/sets/ipnet_test.go +++ /dev/null @@ -1,155 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 sets - -import ( - "net" - "reflect" - "sort" - "testing" -) - -func parseIPNet(s string) *net.IPNet { - _, net, err := net.ParseCIDR(s) - if err != nil { - panic(err) - } - return net -} - -func TestIPNets(t *testing.T) { - s := IPNet{} - s2 := IPNet{} - if len(s) != 0 { - t.Errorf("Expected len=0: %d", len(s)) - } - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - d := parseIPNet("4.0.0.0/8") - - s.Insert(a, b) - if len(s) != 2 { - t.Errorf("Expected len=2: %d", len(s)) - } - s.Insert(c) - if s.Has(d) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.Has(a) { - t.Errorf("Missing contents: %#v", s) - } - s.Delete(a) - if s.Has(a) { - t.Errorf("Unexpected contents: %#v", s) - } - s.Insert(a) - if s.HasAll(a, b, d) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.HasAll(a, b) { - t.Errorf("Missing contents: %#v", s) - } - s2.Insert(a, b, d) - if s.IsSuperset(s2) { - t.Errorf("Unexpected contents: %#v", s) - } - s2.Delete(d) - if !s.IsSuperset(s2) { - t.Errorf("Missing contents: %#v", s) - } -} - -func TestIPNetSetDeleteMultiples(t *testing.T) { - s := IPNet{} - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - - s.Insert(a, b, c) - if len(s) != 3 { - t.Errorf("Expected len=3: %d", len(s)) - } - - s.Delete(a, c) - if len(s) != 1 { - t.Errorf("Expected len=1: %d", len(s)) - } - if s.Has(a) { - t.Errorf("Unexpected contents: %#v", s) - } - if s.Has(c) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.Has(b) { - t.Errorf("Missing contents: %#v", s) - } -} - -func TestNewIPSet(t *testing.T) { - s, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - if len(s) != 3 { - t.Errorf("Expected len=3: %d", len(s)) - } - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - - if !s.Has(a) || !s.Has(b) || !s.Has(c) { - t.Errorf("Unexpected contents: %#v", s) - } -} - -func TestIPNetSetDifference(t *testing.T) { - l, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - r, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "4.0.0.0/8", "5.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - c := l.Difference(r) - d := r.Difference(l) - if len(c) != 1 { - t.Errorf("Expected len=1: %d", len(c)) - } - if !c.Has(parseIPNet("3.0.0.0/8")) { - t.Errorf("Unexpected contents: %#v", c) - } - if len(d) != 2 { - t.Errorf("Expected len=2: %d", len(d)) - } - if !d.Has(parseIPNet("4.0.0.0/8")) || !d.Has(parseIPNet("5.0.0.0/8")) { - t.Errorf("Unexpected contents: %#v", d) - } -} - -func TestIPNetSetList(t *testing.T) { - s, err := ParseIPNets("3.0.0.0/8", "1.0.0.0/8", "2.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - l := s.StringSlice() - sort.Strings(l) - if !reflect.DeepEqual(l, []string{"1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8"}) { - t.Errorf("List gave unexpected result: %#v", l) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/node/node.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/node/node.go deleted file mode 100644 index cbc062fc9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/node/node.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 node - -import ( - "fmt" - "net" - "os/exec" - "strings" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" -) - -func GetHostname(hostnameOverride string) string { - hostname := hostnameOverride - if string(hostname) == "" { - nodename, err := exec.Command("uname", "-n").Output() - if err != nil { - glog.Fatalf("Couldn't determine hostname: %v", err) - } - hostname = string(nodename) - } - return strings.ToLower(strings.TrimSpace(hostname)) -} - -// GetNodeHostIP returns the provided node's IP, based on the priority: -// 1. NodeInternalIP -// 2. NodeExternalIP -// 3. NodeLegacyHostIP -func GetNodeHostIP(node *api.Node) (net.IP, error) { - addresses := node.Status.Addresses - addressMap := make(map[api.NodeAddressType][]api.NodeAddress) - for i := range addresses { - addressMap[addresses[i].Type] = append(addressMap[addresses[i].Type], addresses[i]) - } - if addresses, ok := addressMap[api.NodeInternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - if addresses, ok := addressMap[api.NodeExternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - if addresses, ok := addressMap[api.NodeLegacyHostIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - return nil, fmt.Errorf("host IP unknown; known addresses: %v", addresses) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/doc.go deleted file mode 100644 index 539d6c43b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom implements utility functions relating to out of memory management. -package oom diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom.go deleted file mode 100644 index c6d563ab2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom - -// This is a struct instead of an interface to allow injection of process ID listers and -// applying OOM score in tests. -// TODO: make this an interface, and inject a mock ioutil struct for testing. -type OOMAdjuster struct { - pidLister func(cgroupName string) ([]int, error) - ApplyOOMScoreAdj func(pid int, oomScoreAdj int) error - ApplyOOMScoreAdjContainer func(cgroupName string, oomScoreAdj, maxTries int) error -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_fake.go deleted file mode 100644 index bd0bf6f45..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_fake.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom - -type FakeOOMAdjuster struct{} - -func NewFakeOOMAdjuster() *OOMAdjuster { - return &OOMAdjuster{ - pidLister: func(cgroupName string) ([]int, error) { return make([]int, 0), nil }, - ApplyOOMScoreAdj: fakeApplyOOMScoreAdj, - ApplyOOMScoreAdjContainer: fakeApplyOOMScoreAdjContainer, - } -} - -func fakeApplyOOMScoreAdj(pid int, oomScoreAdj int) error { - return nil -} - -func fakeApplyOOMScoreAdjContainer(cgroupName string, oomScoreAdj, maxTries int) error { - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux.go deleted file mode 100644 index c054682bd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux.go +++ /dev/null @@ -1,130 +0,0 @@ -// +build cgo,linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom - -import ( - "fmt" - "os" - "path" - "strconv" - - "github.com/golang/glog" - "github.com/opencontainers/runc/libcontainer/cgroups/fs" - "github.com/opencontainers/runc/libcontainer/configs" -) - -func NewOOMAdjuster() *OOMAdjuster { - oomAdjuster := &OOMAdjuster{ - pidLister: getPids, - ApplyOOMScoreAdj: applyOOMScoreAdj, - } - oomAdjuster.ApplyOOMScoreAdjContainer = oomAdjuster.applyOOMScoreAdjContainer - return oomAdjuster -} - -func getPids(cgroupName string) ([]int, error) { - fsManager := fs.Manager{ - Cgroups: &configs.Cgroup{ - Parent: "/", - Name: cgroupName, - }, - } - return fsManager.GetPids() -} - -// Writes 'value' to /proc//oom_score_adj. PID = 0 means self -// Returns os.ErrNotExist if the `pid` does not exist. -func applyOOMScoreAdj(pid int, oomScoreAdj int) error { - if pid < 0 { - return fmt.Errorf("invalid PID %d specified for oom_score_adj", pid) - } - - var pidStr string - if pid == 0 { - pidStr = "self" - } else { - pidStr = strconv.Itoa(pid) - } - - maxTries := 2 - oomScoreAdjPath := path.Join("/proc", pidStr, "oom_score_adj") - value := strconv.Itoa(oomScoreAdj) - var err error - for i := 0; i < maxTries; i++ { - f, err := os.Open(oomScoreAdjPath) - if err != nil { - if os.IsNotExist(err) { - return os.ErrNotExist - } - err = fmt.Errorf("failed to apply oom-score-adj to pid %d (%v)", pid, err) - continue - } - if _, err := f.Write([]byte(value)); err != nil { - err = fmt.Errorf("failed to apply oom-score-adj to pid %d (%v)", pid, err) - continue - } - return nil - } - return err -} - -// Writes 'value' to /proc//oom_score_adj for all processes in cgroup cgroupName. -// Keeps trying to write until the process list of the cgroup stabilizes, or until maxTries tries. -func (oomAdjuster *OOMAdjuster) applyOOMScoreAdjContainer(cgroupName string, oomScoreAdj, maxTries int) error { - adjustedProcessSet := make(map[int]bool) - for i := 0; i < maxTries; i++ { - continueAdjusting := false - pidList, err := oomAdjuster.pidLister(cgroupName) - if err != nil { - if os.IsNotExist(err) { - // Nothing to do since the container doesn't exist anymore. - return os.ErrNotExist - } - continueAdjusting = true - glog.V(10).Infof("Error getting process list for cgroup %s: %+v", cgroupName, err) - } else if len(pidList) == 0 { - glog.V(10).Infof("Pid list is empty") - continueAdjusting = true - } else { - for _, pid := range pidList { - if !adjustedProcessSet[pid] { - glog.V(10).Infof("pid %d needs to be set", pid) - if err = oomAdjuster.ApplyOOMScoreAdj(pid, oomScoreAdj); err == nil { - adjustedProcessSet[pid] = true - } else if err == os.ErrNotExist { - continue - } else { - glog.V(10).Infof("cannot adjust oom score for pid %d - %v", pid, err) - continueAdjusting = true - } - // Processes can come and go while we try to apply oom score adjust value. So ignore errors here. - } - } - } - if !continueAdjusting { - return nil - } - // There's a slight race. A process might have forked just before we write its OOM score adjust. - // The fork might copy the parent process's old OOM score, then this function might execute and - // update the parent's OOM score, but the forked process id might not be reflected in cgroup.procs - // for a short amount of time. So this function might return without changing the forked process's - // OOM score. Very unlikely race, so ignoring this for now. - } - return fmt.Errorf("exceeded maxTries, some processes might not have desired OOM score") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux_test.go deleted file mode 100644 index 10e9f3d9e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_linux_test.go +++ /dev/null @@ -1,104 +0,0 @@ -// +build cgo,linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -// Converts a sequence of PID lists into a PID lister. -// The PID lister returns pidListSequence[i] on the ith call. If i >= length of pidListSequence -// then return the last element of pidListSequence (the sequence is considered to have) stabilized. -func sequenceToPidLister(pidListSequence [][]int) func(string) ([]int, error) { - var numCalls int - return func(cgroupName string) ([]int, error) { - numCalls++ - if len(pidListSequence) == 0 { - return []int{}, nil - } else if numCalls > len(pidListSequence) { - return pidListSequence[len(pidListSequence)-1], nil - } - return pidListSequence[numCalls-1], nil - } -} - -// Tests that applyOOMScoreAdjContainer correctly applies OOM scores to relevant processes, or -// returns the right error. -func applyOOMScoreAdjContainerTester(pidListSequence [][]int, maxTries int, appliedPids []int, expectedError bool, t *testing.T) { - pidOOMs := make(map[int]bool) - - // Mock ApplyOOMScoreAdj and pidLister. - oomAdjuster := NewOOMAdjuster() - oomAdjuster.ApplyOOMScoreAdj = func(pid int, oomScoreAdj int) error { - pidOOMs[pid] = true - return nil - } - oomAdjuster.pidLister = sequenceToPidLister(pidListSequence) - err := oomAdjuster.ApplyOOMScoreAdjContainer("", 100, maxTries) - - // Check error value. - if expectedError && err == nil { - t.Errorf("Expected error %+v when running ApplyOOMScoreAdjContainer but got no error", expectedError) - return - } else if !expectedError && err != nil { - t.Errorf("Expected no error but got error %+v when running ApplyOOMScoreAdjContainer", err) - return - } else if err != nil { - return - } - // Check that OOM scores were applied to the right processes. - if len(appliedPids) != len(pidOOMs) { - t.Errorf("Applied OOM scores to incorrect number of processes - %+v vs %v", appliedPids, pidOOMs) - return - } - for _, pid := range appliedPids { - if !pidOOMs[pid] { - t.Errorf("Failed to apply OOM scores to process %d", pid) - } - } -} - -func TestOOMScoreAdjContainer(t *testing.T) { - pidListSequenceEmpty := [][]int{} - applyOOMScoreAdjContainerTester(pidListSequenceEmpty, 3, nil, true, t) - - pidListSequence1 := [][]int{ - {1, 2}, - } - applyOOMScoreAdjContainerTester(pidListSequence1, 1, []int{1, 2}, false, t) - - pidListSequenceLag := [][]int{ - {}, - {}, - {}, - {1, 2, 4}, - } - for i := 1; i < 4; i++ { - applyOOMScoreAdjContainerTester(pidListSequenceLag, i, nil, true, t) - } - applyOOMScoreAdjContainerTester(pidListSequenceLag, 4, []int{1, 2, 4}, false, t) -} - -func TestPidListerFailure(t *testing.T) { - _, err := getPids("/does/not/exist") - assert.True(t, os.IsNotExist(err), "expected getPids to return not exists error. Got %v", err) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_unsupported.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_unsupported.go deleted file mode 100644 index 9c4473f7e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/oom/oom_unsupported.go +++ /dev/null @@ -1,40 +0,0 @@ -// +build !cgo !linux - -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 oom - -import ( - "errors" -) - -var unsupportedErr = errors.New("setting OOM scores is unsupported in this build") - -func NewOOMAdjuster() *OOMAdjuster { - return &OOMAdjuster{ - ApplyOOMScoreAdj: unsupportedApplyOOMScoreAdj, - ApplyOOMScoreAdjContainer: unsupportedApplyOOMScoreAdjContainer, - } -} - -func unsupportedApplyOOMScoreAdj(pid int, oomScoreAdj int) error { - return unsupportedErr -} - -func unsupportedApplyOOMScoreAdjContainer(cgroupName string, oomScoreAdj, maxTries int) error { - return unsupportedErr -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/parsers/parsers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/parsers/parsers_test.go deleted file mode 100644 index 371eee758..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/parsers/parsers_test.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 parsers - -import ( - "testing" -) - -// Based on Docker test case removed in: -// https://github.com/docker/docker/commit/4352da7803d182a6013a5238ce20a7c749db979a -func TestParseImageName(t *testing.T) { - testCases := []struct { - Input string - Repo string - Tag string - Digest string - }{ - {Input: "root", Repo: "root", Tag: "latest"}, - {Input: "root:tag", Repo: "root", Tag: "tag"}, - {Input: "root@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", Repo: "root", Digest: "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, - {Input: "user/repo", Repo: "user/repo", Tag: "latest"}, - {Input: "user/repo:tag", Repo: "user/repo", Tag: "tag"}, - {Input: "user/repo@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", Repo: "user/repo", Digest: "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, - {Input: "url:5000/repo", Repo: "url:5000/repo", Tag: "latest"}, - {Input: "url:5000/repo:tag", Repo: "url:5000/repo", Tag: "tag"}, - {Input: "url:5000/repo@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", Repo: "url:5000/repo", Digest: "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, - } - for _, testCase := range testCases { - repo, tag, digest, err := ParseImageName(testCase.Input) - if err != nil { - t.Errorf("ParseImageName(%s) failed: %v", testCase.Input, err) - } else if repo != testCase.Repo || tag != testCase.Tag || digest != testCase.Digest { - t.Errorf("Expected repo: %q, tag: %q and digest: %q, got %q, %q and %q", testCase.Repo, testCase.Tag, testCase.Digest, - repo, tag, digest) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/doc.go deleted file mode 100644 index d94e6687c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 implements utility functions relating to the /proc mount. -package procfs diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/example_proc_cgroup b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/example_proc_cgroup deleted file mode 100644 index 3e42ce927..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/example_proc_cgroup +++ /dev/null @@ -1,10 +0,0 @@ -11:name=systemd:/user/1000.user/c1.session -10:hugetlb:/user/1000.user/c1.session -9:perf_event:/user/1000.user/c1.session -8:blkio:/user/1000.user/c1.session -7:freezer:/user/1000.user/c1.session -6:devices:/user/1000.user/c1.session -5:memory:/user/1000.user/c1.session -4:cpuacct:/user/1000.user/c1.session -3:cpu:/user/1000.user/c1.session -2:cpuset:/ \ No newline at end of file diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs.go deleted file mode 100644 index d0c38bf21..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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" - "io/ioutil" - "os" - "path" - "strconv" - "strings" -) - -type ProcFS struct{} - -func NewProcFS() ProcFSInterface { - return &ProcFS{} -} - -func containerNameFromProcCgroup(content string) (string, error) { - lines := strings.Split(content, "\n") - for _, line := range lines { - entries := strings.SplitN(line, ":", 3) - if len(entries) == 3 && entries[1] == "devices" { - return strings.TrimSpace(entries[2]), nil - } - } - return "", fmt.Errorf("could not find devices cgroup location") -} - -// getFullContainerName gets the container name given the root process id of the container. -// Eg. If the devices cgroup for the container is stored in /sys/fs/cgroup/devices/docker/nginx, -// return docker/nginx. Assumes that the process is part of exactly one cgroup hierarchy. -func (pfs *ProcFS) GetFullContainerName(pid int) (string, error) { - filePath := path.Join("/proc", strconv.Itoa(pid), "cgroup") - content, err := ioutil.ReadFile(filePath) - if err != nil { - if os.IsNotExist(err) { - return "", os.ErrNotExist - } - return "", err - } - return containerNameFromProcCgroup(string(content)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_fake.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_fake.go deleted file mode 100644 index 8d16aa53c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_fake.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 - -type FakeProcFS struct{} - -func NewFakeProcFS() ProcFSInterface { - return &FakeProcFS{} -} - -// GetFullContainerName gets the container name given the root process id of the container. -// Eg. If the devices cgroup for the container is stored in /sys/fs/cgroup/devices/docker/nginx, -// return docker/nginx. Assumes that the process is part of exactly one cgroup hierarchy. -func (fakePfs *FakeProcFS) GetFullContainerName(pid int) (string, error) { - return "", nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_interface.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_interface.go deleted file mode 100644 index d3bf14f0c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_interface.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 - -type ProcFSInterface interface { - // GetFullContainerName gets the container name given the root process id of the container. - GetFullContainerName(pid int) (string, error) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_test.go deleted file mode 100644 index 609543dca..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/procfs/procfs_test.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 ( - "io/ioutil" - "testing" -) - -func verifyContainerName(procCgroupText, expectedName string, expectedErr bool, t *testing.T) { - name, err := containerNameFromProcCgroup(procCgroupText) - if expectedErr && err == nil { - t.Errorf("Expected error but did not get error in verifyContainerName") - return - } else if !expectedErr && err != nil { - t.Errorf("Expected no error, but got error %+v in verifyContainerName", err) - return - } else if expectedErr { - return - } - if name != expectedName { - t.Errorf("Expected container name %s but got name %s", expectedName, name) - } -} - -func TestContainerNameFromProcCgroup(t *testing.T) { - procCgroupValid := "2:devices:docker/kubelet" - verifyContainerName(procCgroupValid, "docker/kubelet", false, t) - - procCgroupEmpty := "" - verifyContainerName(procCgroupEmpty, "", true, t) - - content, err := ioutil.ReadFile("example_proc_cgroup") - if err != nil { - t.Errorf("Could not read example /proc cgroup file") - } - verifyContainerName(string(content), "/user/1000.user/c1.session", false, t) - - procCgroupNoDevice := "2:freezer:docker/kubelet\n5:cpuacct:pkg/kubectl" - verifyContainerName(procCgroupNoDevice, "", true, t) - - procCgroupInvalid := "devices:docker/kubelet\ncpuacct:pkg/kubectl" - verifyContainerName(procCgroupInvalid, "", true, t) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/dial.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/dial.go deleted file mode 100644 index 33cecb7ea..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/dial.go +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 proxy - -import ( - "crypto/tls" - "fmt" - "net" - "net/http" - "net/url" - - "github.com/golang/glog" - - utilnet "k8s.io/kubernetes/pkg/util/net" - "k8s.io/kubernetes/third_party/golang/netutil" -) - -func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { - dialAddr := netutil.CanonicalAddr(url) - - dialer, _ := utilnet.Dialer(transport) - - switch url.Scheme { - case "http": - if dialer != nil { - return dialer("tcp", dialAddr) - } - return net.Dial("tcp", dialAddr) - case "https": - // Get the tls config from the transport if we recognize it - var tlsConfig *tls.Config - var tlsConn *tls.Conn - var err error - tlsConfig, _ = utilnet.TLSClientConfig(transport) - - if dialer != nil { - // We have a dialer; use it to open the connection, then - // create a tls client using the connection. - netConn, err := dialer("tcp", dialAddr) - if err != nil { - return nil, err - } - if tlsConfig == nil { - // tls.Client requires non-nil config - glog.Warningf("using custom dialer with no TLSClientConfig. Defaulting to InsecureSkipVerify") - // tls.Handshake() requires ServerName or InsecureSkipVerify - tlsConfig = &tls.Config{ - InsecureSkipVerify: true, - } - } else if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify { - // tls.Handshake() requires ServerName or InsecureSkipVerify - // infer the ServerName from the hostname we're connecting to. - inferredHost := dialAddr - if host, _, err := net.SplitHostPort(dialAddr); err == nil { - inferredHost = host - } - // Make a copy to avoid polluting the provided config - tlsConfigCopy := *tlsConfig - tlsConfigCopy.ServerName = inferredHost - tlsConfig = &tlsConfigCopy - } - tlsConn = tls.Client(netConn, tlsConfig) - if err := tlsConn.Handshake(); err != nil { - netConn.Close() - return nil, err - } - - } else { - // Dial - tlsConn, err = tls.Dial("tcp", dialAddr, tlsConfig) - if err != nil { - return nil, err - } - } - - // Return if we were configured to skip validation - if tlsConfig != nil && tlsConfig.InsecureSkipVerify { - return tlsConn, nil - } - - // Verify - host, _, _ := net.SplitHostPort(dialAddr) - if err := tlsConn.VerifyHostname(host); err != nil { - tlsConn.Close() - return nil, err - } - - return tlsConn, nil - default: - return nil, fmt.Errorf("Unknown scheme: %s", url.Scheme) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/doc.go deleted file mode 100644 index 0d7519a0c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 proxy provides transport and upgrade support for proxies -package proxy diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport.go deleted file mode 100644 index 079670c0a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport.go +++ /dev/null @@ -1,241 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 proxy - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "path" - "strings" - - "github.com/golang/glog" - "golang.org/x/net/html" - "golang.org/x/net/html/atom" - - "k8s.io/kubernetes/pkg/util/net" - "k8s.io/kubernetes/pkg/util/sets" -) - -// atomsToAttrs states which attributes of which tags require URL substitution. -// Sources: http://www.w3.org/TR/REC-html40/index/attributes.html -// http://www.w3.org/html/wg/drafts/html/master/index.html#attributes-1 -var atomsToAttrs = map[atom.Atom]sets.String{ - atom.A: sets.NewString("href"), - atom.Applet: sets.NewString("codebase"), - atom.Area: sets.NewString("href"), - atom.Audio: sets.NewString("src"), - atom.Base: sets.NewString("href"), - atom.Blockquote: sets.NewString("cite"), - atom.Body: sets.NewString("background"), - atom.Button: sets.NewString("formaction"), - atom.Command: sets.NewString("icon"), - atom.Del: sets.NewString("cite"), - atom.Embed: sets.NewString("src"), - atom.Form: sets.NewString("action"), - atom.Frame: sets.NewString("longdesc", "src"), - atom.Head: sets.NewString("profile"), - atom.Html: sets.NewString("manifest"), - atom.Iframe: sets.NewString("longdesc", "src"), - atom.Img: sets.NewString("longdesc", "src", "usemap"), - atom.Input: sets.NewString("src", "usemap", "formaction"), - atom.Ins: sets.NewString("cite"), - atom.Link: sets.NewString("href"), - atom.Object: sets.NewString("classid", "codebase", "data", "usemap"), - atom.Q: sets.NewString("cite"), - atom.Script: sets.NewString("src"), - atom.Source: sets.NewString("src"), - atom.Video: sets.NewString("poster", "src"), - - // TODO: css URLs hidden in style elements. -} - -// Transport is a transport for text/html content that replaces URLs in html -// content with the prefix of the proxy server -type Transport struct { - Scheme string - Host string - PathPrepend string - - http.RoundTripper -} - -// RoundTrip implements the http.RoundTripper interface -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - // Add reverse proxy headers. - forwardedURI := path.Join(t.PathPrepend, req.URL.Path) - if strings.HasSuffix(req.URL.Path, "/") { - forwardedURI = forwardedURI + "/" - } - req.Header.Set("X-Forwarded-Uri", forwardedURI) - if len(t.Host) > 0 { - req.Header.Set("X-Forwarded-Host", t.Host) - } - if len(t.Scheme) > 0 { - req.Header.Set("X-Forwarded-Proto", t.Scheme) - } - - rt := t.RoundTripper - if rt == nil { - rt = http.DefaultTransport - } - resp, err := rt.RoundTrip(req) - - if err != nil { - message := fmt.Sprintf("Error: '%s'\nTrying to reach: '%v'", err.Error(), req.URL.String()) - resp = &http.Response{ - StatusCode: http.StatusServiceUnavailable, - Body: ioutil.NopCloser(strings.NewReader(message)), - } - return resp, nil - } - - if redirect := resp.Header.Get("Location"); redirect != "" { - resp.Header.Set("Location", t.rewriteURL(redirect, req.URL)) - return resp, nil - } - - cType := resp.Header.Get("Content-Type") - cType = strings.TrimSpace(strings.SplitN(cType, ";", 2)[0]) - if cType != "text/html" { - // Do nothing, simply pass through - return resp, nil - } - - return t.rewriteResponse(req, resp) -} - -var _ = net.RoundTripperWrapper(&Transport{}) - -func (rt *Transport) WrappedRoundTripper() http.RoundTripper { - return rt.RoundTripper -} - -// rewriteURL rewrites a single URL to go through the proxy, if the URL refers -// to the same host as sourceURL, which is the page on which the target URL -// occurred. If any error occurs (e.g. parsing), it returns targetURL. -func (t *Transport) rewriteURL(targetURL string, sourceURL *url.URL) string { - url, err := url.Parse(targetURL) - if err != nil { - return targetURL - } - - isDifferentHost := url.Host != "" && url.Host != sourceURL.Host - isRelative := !strings.HasPrefix(url.Path, "/") - if isDifferentHost || isRelative { - return targetURL - } - - url.Scheme = t.Scheme - url.Host = t.Host - origPath := url.Path - // Do not rewrite URL if the sourceURL already contains the necessary prefix. - if strings.HasPrefix(url.Path, t.PathPrepend) { - return url.String() - } - url.Path = path.Join(t.PathPrepend, url.Path) - if strings.HasSuffix(origPath, "/") { - // Add back the trailing slash, which was stripped by path.Join(). - url.Path += "/" - } - - return url.String() -} - -// rewriteHTML scans the HTML for tags with url-valued attributes, and updates -// those values with the urlRewriter function. The updated HTML is output to the -// writer. -func rewriteHTML(reader io.Reader, writer io.Writer, urlRewriter func(string) string) error { - // Note: This assumes the content is UTF-8. - tokenizer := html.NewTokenizer(reader) - - var err error - for err == nil { - tokenType := tokenizer.Next() - switch tokenType { - case html.ErrorToken: - err = tokenizer.Err() - case html.StartTagToken, html.SelfClosingTagToken: - token := tokenizer.Token() - if urlAttrs, ok := atomsToAttrs[token.DataAtom]; ok { - for i, attr := range token.Attr { - if urlAttrs.Has(attr.Key) { - token.Attr[i].Val = urlRewriter(attr.Val) - } - } - } - _, err = writer.Write([]byte(token.String())) - default: - _, err = writer.Write(tokenizer.Raw()) - } - } - if err != io.EOF { - return err - } - return nil -} - -// rewriteResponse modifies an HTML response by updating absolute links referring -// to the original host to instead refer to the proxy transport. -func (t *Transport) rewriteResponse(req *http.Request, resp *http.Response) (*http.Response, error) { - origBody := resp.Body - defer origBody.Close() - - newContent := &bytes.Buffer{} - var reader io.Reader = origBody - var writer io.Writer = newContent - encoding := resp.Header.Get("Content-Encoding") - switch encoding { - case "gzip": - var err error - reader, err = gzip.NewReader(reader) - if err != nil { - return nil, fmt.Errorf("errorf making gzip reader: %v", err) - } - gzw := gzip.NewWriter(writer) - defer gzw.Close() - writer = gzw - // TODO: support flate, other encodings. - case "": - // This is fine - default: - // Some encoding we don't understand-- don't try to parse this - glog.Errorf("Proxy encountered encoding %v for text/html; can't understand this so not fixing links.", encoding) - return resp, nil - } - - urlRewriter := func(targetUrl string) string { - return t.rewriteURL(targetUrl, req.URL) - } - err := rewriteHTML(reader, writer, urlRewriter) - if err != nil { - glog.Errorf("Failed to rewrite URLs: %v", err) - return resp, err - } - - resp.Body = ioutil.NopCloser(newContent) - // Update header node with new content-length - // TODO: Remove any hash/signature headers here? - resp.Header.Del("Content-Length") - resp.ContentLength = int64(newContent.Len()) - - return resp, err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport_test.go deleted file mode 100644 index fca115526..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/proxy/transport_test.go +++ /dev/null @@ -1,261 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 proxy - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" -) - -func parseURLOrDie(inURL string) *url.URL { - parsed, err := url.Parse(inURL) - if err != nil { - panic(err) - } - return parsed -} - -func TestProxyTransport(t *testing.T) { - testTransport := &Transport{ - Scheme: "http", - Host: "foo.com", - PathPrepend: "/proxy/minion/minion1:10250", - } - testTransport2 := &Transport{ - Scheme: "https", - Host: "foo.com", - PathPrepend: "/proxy/minion/minion1:8080", - } - emptyHostTransport := &Transport{ - Scheme: "https", - PathPrepend: "/proxy/minion/minion1:10250", - } - emptySchemeTransport := &Transport{ - Host: "foo.com", - PathPrepend: "/proxy/minion/minion1:10250", - } - type Item struct { - input string - sourceURL string - transport *Transport - output string - contentType string - forwardedURI string - redirect string - redirectWant string - } - - table := map[string]Item{ - "normal": { - input: `

      2. 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 z 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

    3. FFoM?>Z@`KL&=WS)4Ey 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 k+KQon$pGR60!~;oh;$MWst7Frti7Jz^Tp<-# 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 Hcgy}?ZLp}l diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/doc.go deleted file mode 100644 index 78c20eb96..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 contains code for syncing cloud load balancers -// with the service registry. -package service diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller.go deleted file mode 100644 index 6803d8c89..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller.go +++ /dev/null @@ -1,769 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 - -import ( - "fmt" - "sort" - "sync" - "time" - - "reflect" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - unversioned_core "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" - "k8s.io/kubernetes/pkg/client/record" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/types" - "k8s.io/kubernetes/pkg/util/metrics" - "k8s.io/kubernetes/pkg/util/runtime" -) - -const ( - workerGoroutines = 10 - - // How long to wait before retrying the processing of a service change. - // If this changes, the sleep in hack/jenkins/e2e.sh before downing a cluster - // should be changed appropriately. - minRetryDelay = 5 * time.Second - maxRetryDelay = 300 * time.Second - - clientRetryCount = 5 - clientRetryInterval = 5 * time.Second - - retryable = true - notRetryable = false - - doNotRetry = time.Duration(0) -) - -type cachedService struct { - // The last-known state of the service - lastState *api.Service - // The state as successfully applied to the load balancer - appliedState *api.Service - - // Ensures only one goroutine can operate on this service at any given time. - mu sync.Mutex - - // Controls error back-off - lastRetryDelay time.Duration -} - -type serviceCache struct { - mu sync.Mutex // protects serviceMap - serviceMap map[string]*cachedService -} - -type ServiceController struct { - cloud cloudprovider.Interface - kubeClient clientset.Interface - clusterName string - balancer cloudprovider.LoadBalancer - zone cloudprovider.Zone - cache *serviceCache - eventBroadcaster record.EventBroadcaster - eventRecorder record.EventRecorder - nodeLister cache.StoreToNodeLister -} - -// New returns a new service controller to keep cloud provider service resources -// (like load balancers) in sync with the registry. -func New(cloud cloudprovider.Interface, kubeClient clientset.Interface, clusterName string) *ServiceController { - broadcaster := record.NewBroadcaster() - broadcaster.StartRecordingToSink(&unversioned_core.EventSinkImpl{Interface: kubeClient.Core().Events("")}) - recorder := broadcaster.NewRecorder(api.EventSource{Component: "service-controller"}) - - if kubeClient != nil && kubeClient.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("service_controller", kubeClient.Core().GetRESTClient().GetRateLimiter()) - } - - return &ServiceController{ - cloud: cloud, - kubeClient: kubeClient, - clusterName: clusterName, - cache: &serviceCache{serviceMap: make(map[string]*cachedService)}, - eventBroadcaster: broadcaster, - eventRecorder: recorder, - nodeLister: cache.StoreToNodeLister{ - Store: cache.NewStore(cache.MetaNamespaceKeyFunc), - }, - } -} - -// Run starts a background goroutine that watches for changes to services that -// have (or had) LoadBalancers=true and ensures that they have -// load balancers created and deleted appropriately. -// serviceSyncPeriod controls how often we check the cluster's services to -// ensure that the correct load balancers exist. -// nodeSyncPeriod controls how often we check the cluster's nodes to determine -// if load balancers need to be updated to point to a new set. -// -// It's an error to call Run() more than once for a given ServiceController -// object. -func (s *ServiceController) Run(serviceSyncPeriod, nodeSyncPeriod time.Duration) error { - if err := s.init(); err != nil { - return err - } - - // We have to make this check beecause the ListWatch that we use in - // WatchServices requires Client functions that aren't in the interface - // for some reason. - if _, ok := s.kubeClient.(*clientset.Clientset); !ok { - return fmt.Errorf("ServiceController only works with real Client objects, but was passed something else satisfying the clientset.Interface.") - } - - // Get the currently existing set of services and then all future creates - // and updates of services. - // A delta compressor is needed for the DeltaFIFO queue because we only ever - // care about the most recent state. - serviceQueue := cache.NewDeltaFIFO( - cache.MetaNamespaceKeyFunc, - cache.DeltaCompressorFunc(func(d cache.Deltas) cache.Deltas { - if len(d) == 0 { - return d - } - return cache.Deltas{*d.Newest()} - }), - s.cache, - ) - lw := cache.NewListWatchFromClient(s.kubeClient.(*clientset.Clientset).CoreClient, "services", api.NamespaceAll, fields.Everything()) - cache.NewReflector(lw, &api.Service{}, serviceQueue, serviceSyncPeriod).Run() - for i := 0; i < workerGoroutines; i++ { - go s.watchServices(serviceQueue) - } - - nodeLW := cache.NewListWatchFromClient(s.kubeClient.(*clientset.Clientset).CoreClient, "nodes", api.NamespaceAll, fields.Everything()) - cache.NewReflector(nodeLW, &api.Node{}, s.nodeLister.Store, 0).Run() - go s.nodeSyncLoop(nodeSyncPeriod) - return nil -} - -func (s *ServiceController) init() error { - if s.cloud == nil { - return fmt.Errorf("ServiceController should not be run without a cloudprovider.") - } - - balancer, ok := s.cloud.LoadBalancer() - if !ok { - return fmt.Errorf("the cloud provider does not support external load balancers.") - } - s.balancer = balancer - - zones, ok := s.cloud.Zones() - if !ok { - return fmt.Errorf("the cloud provider does not support zone enumeration, which is required for creating load balancers.") - } - zone, err := zones.GetZone() - if err != nil { - return fmt.Errorf("failed to get zone from cloud provider, will not be able to create load balancers: %v", err) - } - s.zone = zone - return nil -} - -// Loop infinitely, processing all service updates provided by the queue. -func (s *ServiceController) watchServices(serviceQueue *cache.DeltaFIFO) { - for { - newItem := serviceQueue.Pop() - deltas, ok := newItem.(cache.Deltas) - if !ok { - glog.Errorf("Received object from service watcher that wasn't Deltas: %+v", newItem) - } - delta := deltas.Newest() - if delta == nil { - glog.Errorf("Received nil delta from watcher queue.") - continue - } - err, retryDelay := s.processDelta(delta) - if retryDelay != 0 { - // Add the failed service back to the queue so we'll retry it. - glog.Errorf("Failed to process service delta. Retrying in %s: %v", retryDelay, err) - go func(deltas cache.Deltas, delay time.Duration) { - time.Sleep(delay) - if err := serviceQueue.AddIfNotPresent(deltas); err != nil { - glog.Errorf("Error requeuing service delta - will not retry: %v", err) - } - }(deltas, retryDelay) - } else if err != nil { - runtime.HandleError(fmt.Errorf("Failed to process service delta. Not retrying: %v", err)) - } - } -} - -// Returns an error if processing the delta failed, along with a time.Duration -// indicating whether processing should be retried; zero means no-retry; otherwise -// we should retry in that Duration. -func (s *ServiceController) processDelta(delta *cache.Delta) (error, time.Duration) { - deltaService, ok := delta.Object.(*api.Service) - var namespacedName types.NamespacedName - var cachedService *cachedService - if !ok { - // If the DeltaFIFO saw a key in our cache that it didn't know about, it - // can send a deletion with an unknown state. Grab the service from our - // cache for deleting. - key, ok := delta.Object.(cache.DeletedFinalStateUnknown) - if !ok { - return fmt.Errorf("Delta contained object that wasn't a service or a deleted key: %+v", delta), doNotRetry - } - cachedService, ok = s.cache.get(key.Key) - if !ok { - return fmt.Errorf("Service %s not in cache even though the watcher thought it was. Ignoring the deletion.", key), doNotRetry - } - deltaService = cachedService.lastState - delta.Object = deltaService - namespacedName = types.NamespacedName{Namespace: deltaService.Namespace, Name: deltaService.Name} - } else { - namespacedName.Namespace = deltaService.Namespace - namespacedName.Name = deltaService.Name - cachedService = s.cache.getOrCreate(namespacedName.String()) - } - glog.V(2).Infof("Got new %s delta for service: %v", delta.Type, namespacedName) - - // Ensure that no other goroutine will interfere with our processing of the - // service. - cachedService.mu.Lock() - defer cachedService.mu.Unlock() - - // Get the most recent state of the service from the API directly rather than - // trusting the body of the delta. This avoids update re-ordering problems. - // TODO: Handle sync delta types differently rather than doing a get on every - // service every time we sync? - service, err := s.kubeClient.Core().Services(namespacedName.Namespace).Get(namespacedName.Name) - if err != nil && !errors.IsNotFound(err) { - glog.Warningf("Failed to get most recent state of service %v from API (will retry): %v", namespacedName, err) - return err, cachedService.nextRetryDelay() - } else if errors.IsNotFound(err) { - glog.V(2).Infof("Service %v not found, ensuring load balancer is deleted", namespacedName) - s.eventRecorder.Event(deltaService, api.EventTypeNormal, "DeletingLoadBalancer", "Deleting load balancer") - err := s.balancer.EnsureLoadBalancerDeleted(deltaService) - if err != nil { - message := "Error deleting load balancer (will retry): " + err.Error() - s.eventRecorder.Event(deltaService, api.EventTypeWarning, "DeletingLoadBalancerFailed", message) - return err, cachedService.nextRetryDelay() - } - s.eventRecorder.Event(deltaService, api.EventTypeNormal, "DeletedLoadBalancer", "Deleted load balancer") - s.cache.delete(namespacedName.String()) - - cachedService.resetRetryDelay() - return nil, doNotRetry - } - - // Update the cached service (used above for populating synthetic deletes) - cachedService.lastState = service - - err, retry := s.createLoadBalancerIfNeeded(namespacedName, service, cachedService.appliedState) - if err != nil { - message := "Error creating load balancer" - if retry { - message += " (will retry): " - } else { - message += " (will not retry): " - } - message += err.Error() - s.eventRecorder.Event(service, api.EventTypeWarning, "CreatingLoadBalancerFailed", message) - - return err, cachedService.nextRetryDelay() - } - // Always update the cache upon success. - // NOTE: Since we update the cached service if and only if we successfully - // processed it, a cached service being nil implies that it hasn't yet - // been successfully processed. - cachedService.appliedState = service - s.cache.set(namespacedName.String(), cachedService) - - cachedService.resetRetryDelay() - return nil, doNotRetry -} - -// Returns whatever error occurred along with a boolean indicator of whether it -// should be retried. -func (s *ServiceController) createLoadBalancerIfNeeded(namespacedName types.NamespacedName, service, appliedState *api.Service) (error, bool) { - if appliedState != nil && !s.needsUpdate(appliedState, service) { - glog.Infof("LB doesn't need update for service %s", namespacedName) - return nil, notRetryable - } - - // Note: It is safe to just call EnsureLoadBalancer. But, on some clouds that requires a delete & create, - // which may involve service interruption. Also, we would like user-friendly events. - - // Save the state so we can avoid a write if it doesn't change - previousState := api.LoadBalancerStatusDeepCopy(&service.Status.LoadBalancer) - - if !wantsLoadBalancer(service) { - needDelete := true - if appliedState != nil { - if !wantsLoadBalancer(appliedState) { - needDelete = false - } - } else { - // If we don't have any cached memory of the load balancer, we have to ask - // the cloud provider for what it knows about it. - // Technically EnsureLoadBalancerDeleted can cope, but we want to post meaningful events - _, exists, err := s.balancer.GetLoadBalancer(service) - if err != nil { - return fmt.Errorf("Error getting LB for service %s: %v", namespacedName, err), retryable - } - if !exists { - needDelete = false - } - } - - if needDelete { - glog.Infof("Deleting existing load balancer for service %s that no longer needs a load balancer.", namespacedName) - s.eventRecorder.Event(service, api.EventTypeNormal, "DeletingLoadBalancer", "Deleting load balancer") - if err := s.balancer.EnsureLoadBalancerDeleted(service); err != nil { - return err, retryable - } - s.eventRecorder.Event(service, api.EventTypeNormal, "DeletedLoadBalancer", "Deleted load balancer") - } - - service.Status.LoadBalancer = api.LoadBalancerStatus{} - } else { - glog.V(2).Infof("Ensuring LB for service %s", namespacedName) - - // TODO: We could do a dry-run here if wanted to avoid the spurious cloud-calls & events when we restart - - // The load balancer doesn't exist yet, so create it. - s.eventRecorder.Event(service, api.EventTypeNormal, "CreatingLoadBalancer", "Creating load balancer") - err := s.createLoadBalancer(service) - if err != nil { - return fmt.Errorf("Failed to create load balancer for service %s: %v", namespacedName, err), retryable - } - s.eventRecorder.Event(service, api.EventTypeNormal, "CreatedLoadBalancer", "Created load balancer") - } - - // Write the state if changed - // TODO: Be careful here ... what if there were other changes to the service? - if !api.LoadBalancerStatusEqual(previousState, &service.Status.LoadBalancer) { - if err := s.persistUpdate(service); err != nil { - return fmt.Errorf("Failed to persist updated status to apiserver, even after retries. Giving up: %v", err), notRetryable - } - } else { - glog.V(2).Infof("Not persisting unchanged LoadBalancerStatus to registry.") - } - - return nil, notRetryable -} - -func (s *ServiceController) persistUpdate(service *api.Service) error { - var err error - for i := 0; i < clientRetryCount; i++ { - _, err = s.kubeClient.Core().Services(service.Namespace).UpdateStatus(service) - if err == nil { - return nil - } - // If the object no longer exists, we don't want to recreate it. Just bail - // out so that we can process the delete, which we should soon be receiving - // if we haven't already. - if errors.IsNotFound(err) { - glog.Infof("Not persisting update to service '%s/%s' that no longer exists: %v", - service.Namespace, service.Name, err) - return nil - } - // TODO: Try to resolve the conflict if the change was unrelated to load - // balancer status. For now, just rely on the fact that we'll - // also process the update that caused the resource version to change. - if errors.IsConflict(err) { - glog.V(4).Infof("Not persisting update to service '%s/%s' that has been changed since we received it: %v", - service.Namespace, service.Name, err) - return nil - } - glog.Warningf("Failed to persist updated LoadBalancerStatus to service '%s/%s' after creating its load balancer: %v", - service.Namespace, service.Name, err) - time.Sleep(clientRetryInterval) - } - return err -} - -func (s *ServiceController) createLoadBalancer(service *api.Service) error { - nodes, err := s.nodeLister.List() - if err != nil { - return err - } - - // - Only one protocol supported per service - // - Not all cloud providers support all protocols and the next step is expected to return - // an error for unsupported protocols - status, err := s.balancer.EnsureLoadBalancer(service, hostsFromNodeList(&nodes), service.ObjectMeta.Annotations) - if err != nil { - return err - } else { - service.Status.LoadBalancer = *status - } - - return nil -} - -// ListKeys implements the interface required by DeltaFIFO to list the keys we -// already know about. -func (s *serviceCache) ListKeys() []string { - s.mu.Lock() - defer s.mu.Unlock() - keys := make([]string, 0, len(s.serviceMap)) - for k := range s.serviceMap { - keys = append(keys, k) - } - return keys -} - -// GetByKey returns the value stored in the serviceMap under the given key -func (s *serviceCache) GetByKey(key string) (interface{}, bool, error) { - s.mu.Lock() - defer s.mu.Unlock() - if v, ok := s.serviceMap[key]; ok { - return v, true, nil - } - return nil, false, nil -} - -// ListKeys implements the interface required by DeltaFIFO to list the keys we -// already know about. -func (s *serviceCache) allServices() []*cachedService { - s.mu.Lock() - defer s.mu.Unlock() - services := make([]*cachedService, 0, len(s.serviceMap)) - for _, v := range s.serviceMap { - services = append(services, v) - } - return services -} - -func (s *serviceCache) get(serviceName string) (*cachedService, bool) { - s.mu.Lock() - defer s.mu.Unlock() - service, ok := s.serviceMap[serviceName] - return service, ok -} - -func (s *serviceCache) getOrCreate(serviceName string) *cachedService { - s.mu.Lock() - defer s.mu.Unlock() - service, ok := s.serviceMap[serviceName] - if !ok { - service = &cachedService{} - s.serviceMap[serviceName] = service - } - return service -} - -func (s *serviceCache) set(serviceName string, service *cachedService) { - s.mu.Lock() - defer s.mu.Unlock() - s.serviceMap[serviceName] = service -} - -func (s *serviceCache) delete(serviceName string) { - s.mu.Lock() - defer s.mu.Unlock() - delete(s.serviceMap, serviceName) -} - -func (s *ServiceController) needsUpdate(oldService *api.Service, newService *api.Service) bool { - if !wantsLoadBalancer(oldService) && !wantsLoadBalancer(newService) { - return false - } - if wantsLoadBalancer(oldService) != wantsLoadBalancer(newService) { - s.eventRecorder.Eventf(newService, api.EventTypeNormal, "Type", "%v -> %v", - oldService.Spec.Type, newService.Spec.Type) - return true - } - if !portsEqualForLB(oldService, newService) || oldService.Spec.SessionAffinity != newService.Spec.SessionAffinity { - return true - } - if !loadBalancerIPsAreEqual(oldService, newService) { - s.eventRecorder.Eventf(newService, api.EventTypeNormal, "LoadbalancerIP", "%v -> %v", - oldService.Spec.LoadBalancerIP, newService.Spec.LoadBalancerIP) - return true - } - if len(oldService.Spec.ExternalIPs) != len(newService.Spec.ExternalIPs) { - s.eventRecorder.Eventf(newService, api.EventTypeNormal, "ExternalIP", "Count: %v -> %v", - len(oldService.Spec.ExternalIPs), len(newService.Spec.ExternalIPs)) - return true - } - for i := range oldService.Spec.ExternalIPs { - if oldService.Spec.ExternalIPs[i] != newService.Spec.ExternalIPs[i] { - s.eventRecorder.Eventf(newService, api.EventTypeNormal, "ExternalIP", "Added: %v", - newService.Spec.ExternalIPs[i]) - return true - } - } - if !reflect.DeepEqual(oldService.Annotations, newService.Annotations) { - return true - } - if oldService.UID != newService.UID { - s.eventRecorder.Eventf(newService, api.EventTypeNormal, "UID", "%v -> %v", - oldService.UID, newService.UID) - return true - } - - return false -} - -func (s *ServiceController) loadBalancerName(service *api.Service) string { - return cloudprovider.GetLoadBalancerName(service) -} - -func getPortsForLB(service *api.Service) ([]*api.ServicePort, error) { - var protocol api.Protocol - - ports := []*api.ServicePort{} - for i := range service.Spec.Ports { - sp := &service.Spec.Ports[i] - // The check on protocol was removed here. The cloud provider itself is now responsible for all protocol validation - ports = append(ports, sp) - if protocol == "" { - protocol = sp.Protocol - } else if protocol != sp.Protocol && wantsLoadBalancer(service) { - // TODO: Convert error messages to use event recorder - return nil, fmt.Errorf("mixed protocol external load balancers are not supported.") - } - } - return ports, nil -} - -func portsEqualForLB(x, y *api.Service) bool { - xPorts, err := getPortsForLB(x) - if err != nil { - return false - } - yPorts, err := getPortsForLB(y) - if err != nil { - return false - } - return portSlicesEqualForLB(xPorts, yPorts) -} - -func portSlicesEqualForLB(x, y []*api.ServicePort) bool { - if len(x) != len(y) { - return false - } - - for i := range x { - if !portEqualForLB(x[i], y[i]) { - return false - } - } - return true -} - -func portEqualForLB(x, y *api.ServicePort) bool { - // TODO: Should we check name? (In theory, an LB could expose it) - if x.Name != y.Name { - return false - } - - if x.Protocol != y.Protocol { - return false - } - - if x.Port != y.Port { - return false - } - - if x.NodePort != y.NodePort { - return false - } - - // We don't check TargetPort; that is not relevant for load balancing - // TODO: Should we blank it out? Or just check it anyway? - - return true -} - -func intSlicesEqual(x, y []int) bool { - if len(x) != len(y) { - return false - } - if !sort.IntsAreSorted(x) { - sort.Ints(x) - } - if !sort.IntsAreSorted(y) { - sort.Ints(y) - } - for i := range x { - if x[i] != y[i] { - return false - } - } - return true -} - -func stringSlicesEqual(x, y []string) bool { - if len(x) != len(y) { - return false - } - if !sort.StringsAreSorted(x) { - sort.Strings(x) - } - if !sort.StringsAreSorted(y) { - sort.Strings(y) - } - for i := range x { - if x[i] != y[i] { - return false - } - } - return true -} - -func hostsFromNodeList(list *api.NodeList) []string { - result := []string{} - for ix := range list.Items { - if list.Items[ix].Spec.Unschedulable { - continue - } - result = append(result, list.Items[ix].Name) - } - return result -} - -func getNodeConditionPredicate() cache.NodeConditionPredicate { - return func(node api.Node) bool { - // We add the master to the node list, but its unschedulable. So we use this to filter - // the master. - // TODO: Use a node annotation to indicate the master - if node.Spec.Unschedulable { - return false - } - // If we have no info, don't accept - if len(node.Status.Conditions) == 0 { - return false - } - for _, cond := range node.Status.Conditions { - // We consider the node for load balancing only when its NodeReady condition status - // is ConditionTrue - if cond.Type == api.NodeReady && cond.Status != api.ConditionTrue { - glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) - return false - } - } - return true - } -} - -// nodeSyncLoop handles updating the hosts pointed to by all load -// balancers whenever the set of nodes in the cluster changes. -func (s *ServiceController) nodeSyncLoop(period time.Duration) { - var prevHosts []string - var servicesToUpdate []*cachedService - for range time.Tick(period) { - nodes, err := s.nodeLister.NodeCondition(getNodeConditionPredicate()).List() - if err != nil { - glog.Errorf("Failed to retrieve current set of nodes from node lister: %v", err) - continue - } - newHosts := hostsFromNodeList(&nodes) - if stringSlicesEqual(newHosts, prevHosts) { - // The set of nodes in the cluster hasn't changed, but we can retry - // updating any services that we failed to update last time around. - servicesToUpdate = s.updateLoadBalancerHosts(servicesToUpdate, newHosts) - continue - } - glog.Infof("Detected change in list of current cluster nodes. New node set: %v", newHosts) - - // Try updating all services, and save the ones that fail to try again next - // round. - servicesToUpdate = s.cache.allServices() - numServices := len(servicesToUpdate) - servicesToUpdate = s.updateLoadBalancerHosts(servicesToUpdate, newHosts) - glog.Infof("Successfully updated %d out of %d load balancers to direct traffic to the updated set of nodes", - numServices-len(servicesToUpdate), numServices) - - prevHosts = newHosts - } -} - -// updateLoadBalancerHosts updates all existing load balancers so that -// they will match the list of hosts provided. -// Returns the list of services that couldn't be updated. -func (s *ServiceController) updateLoadBalancerHosts(services []*cachedService, hosts []string) (servicesToRetry []*cachedService) { - for _, service := range services { - func() { - service.mu.Lock() - defer service.mu.Unlock() - // If the applied state is nil, that means it hasn't yet been successfully dealt - // with by the load balancer reconciler. We can trust the load balancer - // reconciler to ensure the service's load balancer is created to target - // the correct nodes. - if service.appliedState == nil { - return - } - if err := s.lockedUpdateLoadBalancerHosts(service.appliedState, hosts); err != nil { - glog.Errorf("External error while updating load balancer: %v.", err) - servicesToRetry = append(servicesToRetry, service) - } - }() - } - return servicesToRetry -} - -// Updates the load balancer of a service, assuming we hold the mutex -// associated with the service. -func (s *ServiceController) lockedUpdateLoadBalancerHosts(service *api.Service, hosts []string) error { - if !wantsLoadBalancer(service) { - return nil - } - - // This operation doesn't normally take very long (and happens pretty often), so we only record the final event - err := s.balancer.UpdateLoadBalancer(service, hosts) - if err == nil { - s.eventRecorder.Event(service, api.EventTypeNormal, "UpdatedLoadBalancer", "Updated load balancer with new hosts") - return nil - } - - // It's only an actual error if the load balancer still exists. - if _, exists, err := s.balancer.GetLoadBalancer(service); err != nil { - glog.Errorf("External error while checking if load balancer %q exists: name, %v", cloudprovider.GetLoadBalancerName(service), err) - } else if !exists { - return nil - } - - s.eventRecorder.Eventf(service, api.EventTypeWarning, "LoadBalancerUpdateFailed", "Error updating load balancer with new hosts %v: %v", hosts, err) - return err -} - -func wantsLoadBalancer(service *api.Service) bool { - return service.Spec.Type == api.ServiceTypeLoadBalancer -} - -func loadBalancerIPsAreEqual(oldService, newService *api.Service) bool { - return oldService.Spec.LoadBalancerIP == newService.Spec.LoadBalancerIP -} - -// Computes the next retry, using exponential backoff -// mutex must be held. -func (s *cachedService) nextRetryDelay() time.Duration { - s.lastRetryDelay = s.lastRetryDelay * 2 - if s.lastRetryDelay < minRetryDelay { - s.lastRetryDelay = minRetryDelay - } - if s.lastRetryDelay > maxRetryDelay { - s.lastRetryDelay = maxRetryDelay - } - return s.lastRetryDelay -} - -// Resets the retry exponential backoff. mutex must be held. -func (s *cachedService) resetRetryDelay() { - s.lastRetryDelay = time.Duration(0) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller_test.go deleted file mode 100644 index 8f58de10a..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/service/servicecontroller_test.go +++ /dev/null @@ -1,329 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" - "k8s.io/kubernetes/pkg/types" -) - -const region = "us-central" - -func newService(name string, uid types.UID, serviceType api.ServiceType) *api.Service { - return &api.Service{ObjectMeta: api.ObjectMeta{Name: name, Namespace: "namespace", UID: uid}, Spec: api.ServiceSpec{Type: serviceType}} -} - -func TestCreateExternalLoadBalancer(t *testing.T) { - table := []struct { - service *api.Service - expectErr bool - expectCreateAttempt bool - }{ - { - service: &api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "no-external-balancer", - Namespace: "default", - }, - Spec: api.ServiceSpec{ - Type: api.ServiceTypeClusterIP, - }, - }, - expectErr: false, - expectCreateAttempt: false, - }, - { - service: &api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "udp-service", - Namespace: "default", - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{{ - Port: 80, - Protocol: api.ProtocolUDP, - }}, - Type: api.ServiceTypeLoadBalancer, - }, - }, - expectErr: false, - expectCreateAttempt: true, - }, - { - service: &api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "basic-service1", - Namespace: "default", - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{{ - Port: 80, - Protocol: api.ProtocolTCP, - }}, - Type: api.ServiceTypeLoadBalancer, - }, - }, - expectErr: false, - expectCreateAttempt: true, - }, - } - - for _, item := range table { - cloud := &fakecloud.FakeCloud{} - cloud.Region = region - client := &fake.Clientset{} - controller := New(cloud, client, "test-cluster") - controller.init() - cloud.Calls = nil // ignore any cloud calls made in init() - client.ClearActions() // ignore any client calls made in init() - err, _ := controller.createLoadBalancerIfNeeded(types.NamespacedName{Namespace: "foo", Name: "bar"}, item.service, nil) - if !item.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } else if item.expectErr && err == nil { - t.Errorf("expected error creating %v, got nil", item.service) - } - actions := client.Actions() - if !item.expectCreateAttempt { - if len(cloud.Calls) > 0 { - t.Errorf("unexpected cloud provider calls: %v", cloud.Calls) - } - if len(actions) > 0 { - t.Errorf("unexpected client actions: %v", actions) - } - } else { - var balancer *fakecloud.FakeBalancer - for k := range cloud.Balancers { - if balancer == nil { - b := cloud.Balancers[k] - balancer = &b - } else { - t.Errorf("expected one load balancer to be created, got %v", cloud.Balancers) - break - } - } - if balancer == nil { - t.Errorf("expected one load balancer to be created, got none") - } else if balancer.Name != controller.loadBalancerName(item.service) || - balancer.Region != region || - balancer.Ports[0].Port != item.service.Spec.Ports[0].Port { - t.Errorf("created load balancer has incorrect parameters: %v", balancer) - } - actionFound := false - for _, action := range actions { - if action.GetVerb() == "update" && action.GetResource().Resource == "services" { - actionFound = true - } - } - if !actionFound { - t.Errorf("expected updated service to be sent to client, got these actions instead: %v", actions) - } - } - } -} - -// TODO: Finish converting and update comments -func TestUpdateNodesInExternalLoadBalancer(t *testing.T) { - hosts := []string{"node0", "node1", "node73"} - table := []struct { - services []*api.Service - expectedUpdateCalls []fakecloud.FakeUpdateBalancerCall - }{ - { - // No services present: no calls should be made. - services: []*api.Service{}, - expectedUpdateCalls: nil, - }, - { - // Services do not have external load balancers: no calls should be made. - services: []*api.Service{ - newService("s0", "111", api.ServiceTypeClusterIP), - newService("s1", "222", api.ServiceTypeNodePort), - }, - expectedUpdateCalls: nil, - }, - { - // Services does have an external load balancer: one call should be made. - services: []*api.Service{ - newService("s0", "333", api.ServiceTypeLoadBalancer), - }, - expectedUpdateCalls: []fakecloud.FakeUpdateBalancerCall{ - {newService("s0", "333", api.ServiceTypeLoadBalancer), hosts}, - }, - }, - { - // Three services have an external load balancer: three calls. - services: []*api.Service{ - newService("s0", "444", api.ServiceTypeLoadBalancer), - newService("s1", "555", api.ServiceTypeLoadBalancer), - newService("s2", "666", api.ServiceTypeLoadBalancer), - }, - expectedUpdateCalls: []fakecloud.FakeUpdateBalancerCall{ - {newService("s0", "444", api.ServiceTypeLoadBalancer), hosts}, - {newService("s1", "555", api.ServiceTypeLoadBalancer), hosts}, - {newService("s2", "666", api.ServiceTypeLoadBalancer), hosts}, - }, - }, - { - // Two services have an external load balancer and two don't: two calls. - services: []*api.Service{ - newService("s0", "777", api.ServiceTypeNodePort), - newService("s1", "888", api.ServiceTypeLoadBalancer), - newService("s3", "999", api.ServiceTypeLoadBalancer), - newService("s4", "123", api.ServiceTypeClusterIP), - }, - expectedUpdateCalls: []fakecloud.FakeUpdateBalancerCall{ - {newService("s1", "888", api.ServiceTypeLoadBalancer), hosts}, - {newService("s3", "999", api.ServiceTypeLoadBalancer), hosts}, - }, - }, - { - // One service has an external load balancer and one is nil: one call. - services: []*api.Service{ - newService("s0", "234", api.ServiceTypeLoadBalancer), - nil, - }, - expectedUpdateCalls: []fakecloud.FakeUpdateBalancerCall{ - {newService("s0", "234", api.ServiceTypeLoadBalancer), hosts}, - }, - }, - } - for _, item := range table { - cloud := &fakecloud.FakeCloud{} - - cloud.Region = region - client := &fake.Clientset{} - controller := New(cloud, client, "test-cluster2") - controller.init() - cloud.Calls = nil // ignore any cloud calls made in init() - - var services []*cachedService - for _, service := range item.services { - services = append(services, &cachedService{lastState: service, appliedState: service}) - } - if err := controller.updateLoadBalancerHosts(services, hosts); err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(item.expectedUpdateCalls, cloud.UpdateCalls) { - t.Errorf("expected update calls mismatch, expected %+v, got %+v", item.expectedUpdateCalls, cloud.UpdateCalls) - } - } -} - -func TestHostsFromNodeList(t *testing.T) { - tests := []struct { - nodes *api.NodeList - expectedHosts []string - }{ - { - nodes: &api.NodeList{}, - expectedHosts: []string{}, - }, - { - nodes: &api.NodeList{ - Items: []api.Node{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Status: api.NodeStatus{Phase: api.NodeRunning}, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Status: api.NodeStatus{Phase: api.NodeRunning}, - }, - }, - }, - expectedHosts: []string{"foo", "bar"}, - }, - { - nodes: &api.NodeList{ - Items: []api.Node{ - { - ObjectMeta: api.ObjectMeta{Name: "foo"}, - Status: api.NodeStatus{Phase: api.NodeRunning}, - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar"}, - Status: api.NodeStatus{Phase: api.NodeRunning}, - }, - { - ObjectMeta: api.ObjectMeta{Name: "unschedulable"}, - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{Phase: api.NodeRunning}, - }, - }, - }, - expectedHosts: []string{"foo", "bar"}, - }, - } - - for _, test := range tests { - hosts := hostsFromNodeList(test.nodes) - if !reflect.DeepEqual(hosts, test.expectedHosts) { - t.Errorf("expected: %v, saw: %v", test.expectedHosts, hosts) - } - } -} - -func TestGetNodeConditionPredicate(t *testing.T) { - tests := []struct { - node api.Node - expectAccept bool - name string - }{ - { - node: api.Node{}, - expectAccept: false, - name: "empty", - }, - { - node: api.Node{ - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - {Type: api.NodeReady, Status: api.ConditionTrue}, - }, - }, - }, - expectAccept: true, - name: "basic", - }, - { - node: api.Node{ - Spec: api.NodeSpec{Unschedulable: true}, - Status: api.NodeStatus{ - Conditions: []api.NodeCondition{ - {Type: api.NodeReady, Status: api.ConditionTrue}, - }, - }, - }, - expectAccept: false, - name: "unschedulable", - }, - } - pred := getNodeConditionPredicate() - for _, test := range tests { - accept := pred(test.node) - if accept != test.expectAccept { - t.Errorf("Test failed for %s, expected %v, saw %v", test.name, test.expectAccept, accept) - } - } -} - -// TODO(a-robinson): Add tests for update/sync/delete. diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/doc.go deleted file mode 100644 index b69d1a121..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount provides implementations -// to manage service accounts and service account tokens -package serviceaccount diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller.go deleted file mode 100644 index 084ddae50..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller.go +++ /dev/null @@ -1,259 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount - -import ( - "fmt" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - apierrs "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/metrics" - "k8s.io/kubernetes/pkg/watch" -) - -// nameIndexFunc is an index function that indexes based on an object's name -func nameIndexFunc(obj interface{}) ([]string, error) { - meta, err := meta.Accessor(obj) - if err != nil { - return []string{""}, fmt.Errorf("object has no meta: %v", err) - } - return []string{meta.GetName()}, nil -} - -// ServiceAccountsControllerOptions contains options for running a ServiceAccountsController -type ServiceAccountsControllerOptions struct { - // ServiceAccounts is the list of service accounts to ensure exist in every namespace - ServiceAccounts []api.ServiceAccount - - // ServiceAccountResync is the interval between full resyncs of ServiceAccounts. - // If non-zero, all service accounts will be re-listed this often. - // Otherwise, re-list will be delayed as long as possible (until the watch is closed or times out). - ServiceAccountResync time.Duration - - // NamespaceResync is the interval between full resyncs of Namespaces. - // If non-zero, all namespaces will be re-listed this often. - // Otherwise, re-list will be delayed as long as possible (until the watch is closed or times out). - NamespaceResync time.Duration -} - -func DefaultServiceAccountsControllerOptions() ServiceAccountsControllerOptions { - return ServiceAccountsControllerOptions{ - ServiceAccounts: []api.ServiceAccount{ - {ObjectMeta: api.ObjectMeta{Name: "default"}}, - }, - } -} - -// NewServiceAccountsController returns a new *ServiceAccountsController. -func NewServiceAccountsController(cl clientset.Interface, options ServiceAccountsControllerOptions) *ServiceAccountsController { - e := &ServiceAccountsController{ - client: cl, - serviceAccountsToEnsure: options.ServiceAccounts, - } - if cl != nil && cl.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("serviceaccount_controller", cl.Core().GetRESTClient().GetRateLimiter()) - } - accountSelector := fields.Everything() - if len(options.ServiceAccounts) == 1 { - // If we're maintaining a single account, we can scope the accounts we watch to just that name - accountSelector = fields.SelectorFromSet(map[string]string{api.ObjectNameField: options.ServiceAccounts[0].Name}) - } - e.serviceAccounts, e.serviceAccountController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - options.FieldSelector = accountSelector - return e.client.Core().ServiceAccounts(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - options.FieldSelector = accountSelector - return e.client.Core().ServiceAccounts(api.NamespaceAll).Watch(options) - }, - }, - &api.ServiceAccount{}, - options.ServiceAccountResync, - framework.ResourceEventHandlerFuncs{ - DeleteFunc: e.serviceAccountDeleted, - }, - cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}, - ) - - e.namespaces, e.namespaceController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return e.client.Core().Namespaces().List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return e.client.Core().Namespaces().Watch(options) - }, - }, - &api.Namespace{}, - options.NamespaceResync, - framework.ResourceEventHandlerFuncs{ - AddFunc: e.namespaceAdded, - UpdateFunc: e.namespaceUpdated, - }, - cache.Indexers{"name": nameIndexFunc}, - ) - - return e -} - -// ServiceAccountsController manages ServiceAccount objects inside Namespaces -type ServiceAccountsController struct { - stopChan chan struct{} - - client clientset.Interface - serviceAccountsToEnsure []api.ServiceAccount - - serviceAccounts cache.Indexer - namespaces cache.Indexer - - // Since we join two objects, we'll watch both of them with controllers. - serviceAccountController *framework.Controller - namespaceController *framework.Controller -} - -// Runs controller loops and returns immediately -func (e *ServiceAccountsController) Run() { - if e.stopChan == nil { - e.stopChan = make(chan struct{}) - go e.serviceAccountController.Run(e.stopChan) - go e.namespaceController.Run(e.stopChan) - } -} - -// Stop gracefully shuts down this controller -func (e *ServiceAccountsController) Stop() { - if e.stopChan != nil { - close(e.stopChan) - e.stopChan = nil - } -} - -// serviceAccountDeleted reacts to a ServiceAccount deletion by recreating a default ServiceAccount in the namespace if needed -func (e *ServiceAccountsController) serviceAccountDeleted(obj interface{}) { - serviceAccount, ok := obj.(*api.ServiceAccount) - if !ok { - // Unknown type. If we missed a ServiceAccount deletion, the - // corresponding secrets will be cleaned up during the Secret re-list - return - } - // If the deleted service account is one we're maintaining, recreate it - for _, sa := range e.serviceAccountsToEnsure { - if sa.Name == serviceAccount.Name { - e.createServiceAccountIfNeeded(sa, serviceAccount.Namespace) - } - } -} - -// namespaceAdded reacts to a Namespace creation by creating a default ServiceAccount object -func (e *ServiceAccountsController) namespaceAdded(obj interface{}) { - namespace := obj.(*api.Namespace) - for _, sa := range e.serviceAccountsToEnsure { - e.createServiceAccountIfNeeded(sa, namespace.Name) - } -} - -// namespaceUpdated reacts to a Namespace update (or re-list) by creating a default ServiceAccount in the namespace if needed -func (e *ServiceAccountsController) namespaceUpdated(oldObj interface{}, newObj interface{}) { - newNamespace := newObj.(*api.Namespace) - for _, sa := range e.serviceAccountsToEnsure { - e.createServiceAccountIfNeeded(sa, newNamespace.Name) - } -} - -// createServiceAccountIfNeeded creates a ServiceAccount with the given name in the given namespace if: -// * the named ServiceAccount does not already exist -// * the specified namespace exists -// * the specified namespace is in the ACTIVE phase -func (e *ServiceAccountsController) createServiceAccountIfNeeded(sa api.ServiceAccount, namespace string) { - existingServiceAccount, err := e.getServiceAccount(sa.Name, namespace) - if err != nil { - glog.Error(err) - return - } - if existingServiceAccount != nil { - // If service account already exists, it doesn't need to be created - return - } - - namespaceObj, err := e.getNamespace(namespace) - if err != nil { - glog.Error(err) - return - } - if namespaceObj == nil { - // If namespace does not exist, no service account is needed - return - } - if namespaceObj.Status.Phase != api.NamespaceActive { - // If namespace is not active, we shouldn't try to create anything - return - } - - e.createServiceAccount(sa, namespace) -} - -// createDefaultServiceAccount creates a default ServiceAccount in the specified namespace -func (e *ServiceAccountsController) createServiceAccount(sa api.ServiceAccount, namespace string) { - sa.Namespace = namespace - if _, err := e.client.Core().ServiceAccounts(namespace).Create(&sa); err != nil && !apierrs.IsAlreadyExists(err) { - glog.Error(err) - } -} - -// getServiceAccount returns the ServiceAccount with the given name for the given namespace -func (e *ServiceAccountsController) getServiceAccount(name, namespace string) (*api.ServiceAccount, error) { - key := &api.ServiceAccount{ObjectMeta: api.ObjectMeta{Namespace: namespace}} - accounts, err := e.serviceAccounts.Index("namespace", key) - if err != nil { - return nil, err - } - - for _, obj := range accounts { - serviceAccount := obj.(*api.ServiceAccount) - if name == serviceAccount.Name { - return serviceAccount, nil - } - } - return nil, nil -} - -// getNamespace returns the Namespace with the given name -func (e *ServiceAccountsController) getNamespace(name string) (*api.Namespace, error) { - key := &api.Namespace{ObjectMeta: api.ObjectMeta{Name: name}} - namespaces, err := e.namespaces.Index("name", key) - if err != nil { - return nil, err - } - - if len(namespaces) == 0 { - return nil, nil - } - if len(namespaces) == 1 { - return namespaces[0].(*api.Namespace), nil - } - return nil, fmt.Errorf("%d namespaces with the name %s indexed", len(namespaces), name) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller_test.go deleted file mode 100644 index e55ffeb51..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/serviceaccounts_controller_test.go +++ /dev/null @@ -1,197 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount - -import ( - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/util/sets" -) - -type serverResponse struct { - statusCode int - obj interface{} -} - -func TestServiceAccountCreation(t *testing.T) { - ns := api.NamespaceDefault - - defaultName := "default" - managedName := "managed" - - activeNS := &api.Namespace{ - ObjectMeta: api.ObjectMeta{Name: ns}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceActive, - }, - } - terminatingNS := &api.Namespace{ - ObjectMeta: api.ObjectMeta{Name: ns}, - Status: api.NamespaceStatus{ - Phase: api.NamespaceTerminating, - }, - } - defaultServiceAccount := &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{ - Name: defaultName, - Namespace: ns, - ResourceVersion: "1", - }, - } - managedServiceAccount := &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{ - Name: managedName, - Namespace: ns, - ResourceVersion: "1", - }, - } - unmanagedServiceAccount := &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{ - Name: "other-unmanaged", - Namespace: ns, - ResourceVersion: "1", - }, - } - - testcases := map[string]struct { - ExistingNamespace *api.Namespace - ExistingServiceAccounts []*api.ServiceAccount - - AddedNamespace *api.Namespace - UpdatedNamespace *api.Namespace - DeletedServiceAccount *api.ServiceAccount - - ExpectCreatedServiceAccounts []string - }{ - "new active namespace missing serviceaccounts": { - ExistingServiceAccounts: []*api.ServiceAccount{}, - AddedNamespace: activeNS, - ExpectCreatedServiceAccounts: sets.NewString(defaultName, managedName).List(), - }, - "new active namespace missing serviceaccount": { - ExistingServiceAccounts: []*api.ServiceAccount{managedServiceAccount}, - AddedNamespace: activeNS, - ExpectCreatedServiceAccounts: []string{defaultName}, - }, - "new active namespace with serviceaccounts": { - ExistingServiceAccounts: []*api.ServiceAccount{defaultServiceAccount, managedServiceAccount}, - AddedNamespace: activeNS, - ExpectCreatedServiceAccounts: []string{}, - }, - - "new terminating namespace": { - ExistingServiceAccounts: []*api.ServiceAccount{}, - AddedNamespace: terminatingNS, - ExpectCreatedServiceAccounts: []string{}, - }, - - "updated active namespace missing serviceaccounts": { - ExistingServiceAccounts: []*api.ServiceAccount{}, - UpdatedNamespace: activeNS, - ExpectCreatedServiceAccounts: sets.NewString(defaultName, managedName).List(), - }, - "updated active namespace missing serviceaccount": { - ExistingServiceAccounts: []*api.ServiceAccount{defaultServiceAccount}, - UpdatedNamespace: activeNS, - ExpectCreatedServiceAccounts: []string{managedName}, - }, - "updated active namespace with serviceaccounts": { - ExistingServiceAccounts: []*api.ServiceAccount{defaultServiceAccount, managedServiceAccount}, - UpdatedNamespace: activeNS, - ExpectCreatedServiceAccounts: []string{}, - }, - "updated terminating namespace": { - ExistingServiceAccounts: []*api.ServiceAccount{}, - UpdatedNamespace: terminatingNS, - ExpectCreatedServiceAccounts: []string{}, - }, - - "deleted serviceaccount without namespace": { - DeletedServiceAccount: defaultServiceAccount, - ExpectCreatedServiceAccounts: []string{}, - }, - "deleted serviceaccount with active namespace": { - ExistingNamespace: activeNS, - DeletedServiceAccount: defaultServiceAccount, - ExpectCreatedServiceAccounts: []string{defaultName}, - }, - "deleted serviceaccount with terminating namespace": { - ExistingNamespace: terminatingNS, - DeletedServiceAccount: defaultServiceAccount, - ExpectCreatedServiceAccounts: []string{}, - }, - "deleted unmanaged serviceaccount with active namespace": { - ExistingNamespace: activeNS, - DeletedServiceAccount: unmanagedServiceAccount, - ExpectCreatedServiceAccounts: []string{}, - }, - "deleted unmanaged serviceaccount with terminating namespace": { - ExistingNamespace: terminatingNS, - DeletedServiceAccount: unmanagedServiceAccount, - ExpectCreatedServiceAccounts: []string{}, - }, - } - - for k, tc := range testcases { - client := fake.NewSimpleClientset(defaultServiceAccount, managedServiceAccount) - options := DefaultServiceAccountsControllerOptions() - options.ServiceAccounts = []api.ServiceAccount{ - {ObjectMeta: api.ObjectMeta{Name: defaultName}}, - {ObjectMeta: api.ObjectMeta{Name: managedName}}, - } - controller := NewServiceAccountsController(client, options) - - if tc.ExistingNamespace != nil { - controller.namespaces.Add(tc.ExistingNamespace) - } - for _, s := range tc.ExistingServiceAccounts { - controller.serviceAccounts.Add(s) - } - - if tc.AddedNamespace != nil { - controller.namespaces.Add(tc.AddedNamespace) - controller.namespaceAdded(tc.AddedNamespace) - } - if tc.UpdatedNamespace != nil { - controller.namespaces.Add(tc.UpdatedNamespace) - controller.namespaceUpdated(nil, tc.UpdatedNamespace) - } - if tc.DeletedServiceAccount != nil { - controller.serviceAccountDeleted(tc.DeletedServiceAccount) - } - - actions := client.Actions() - if len(tc.ExpectCreatedServiceAccounts) != len(actions) { - t.Errorf("%s: Expected to create accounts %#v. Actual actions were: %#v", k, tc.ExpectCreatedServiceAccounts, actions) - continue - } - for i, expectedName := range tc.ExpectCreatedServiceAccounts { - action := actions[i] - if !action.Matches("create", "serviceaccounts") { - t.Errorf("%s: Unexpected action %s", k, action) - break - } - createdAccount := action.(core.CreateAction).GetObject().(*api.ServiceAccount) - if createdAccount.Name != expectedName { - t.Errorf("%s: Expected %s to be created, got %s", k, expectedName, createdAccount.Name) - } - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokengetter.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokengetter.go deleted file mode 100644 index bd7fc827b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokengetter.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount - -import ( - "k8s.io/kubernetes/pkg/api" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/registry/secret" - secretetcd "k8s.io/kubernetes/pkg/registry/secret/etcd" - serviceaccountregistry "k8s.io/kubernetes/pkg/registry/serviceaccount" - serviceaccountetcd "k8s.io/kubernetes/pkg/registry/serviceaccount/etcd" - "k8s.io/kubernetes/pkg/serviceaccount" - "k8s.io/kubernetes/pkg/storage" -) - -// clientGetter implements ServiceAccountTokenGetter using a clientset.Interface -type clientGetter struct { - client clientset.Interface -} - -// NewGetterFromClient returns a ServiceAccountTokenGetter that -// uses the specified client to retrieve service accounts and secrets. -// The client should NOT authenticate using a service account token -// the returned getter will be used to retrieve, or recursion will result. -func NewGetterFromClient(c clientset.Interface) serviceaccount.ServiceAccountTokenGetter { - return clientGetter{c} -} -func (c clientGetter) GetServiceAccount(namespace, name string) (*api.ServiceAccount, error) { - return c.client.Core().ServiceAccounts(namespace).Get(name) -} -func (c clientGetter) GetSecret(namespace, name string) (*api.Secret, error) { - return c.client.Core().Secrets(namespace).Get(name) -} - -// registryGetter implements ServiceAccountTokenGetter using a service account and secret registry -type registryGetter struct { - serviceAccounts serviceaccountregistry.Registry - secrets secret.Registry -} - -// NewGetterFromRegistries returns a ServiceAccountTokenGetter that -// uses the specified registries to retrieve service accounts and secrets. -func NewGetterFromRegistries(serviceAccounts serviceaccountregistry.Registry, secrets secret.Registry) serviceaccount.ServiceAccountTokenGetter { - return ®istryGetter{serviceAccounts, secrets} -} -func (r *registryGetter) GetServiceAccount(namespace, name string) (*api.ServiceAccount, error) { - ctx := api.WithNamespace(api.NewContext(), namespace) - return r.serviceAccounts.GetServiceAccount(ctx, name) -} -func (r *registryGetter) GetSecret(namespace, name string) (*api.Secret, error) { - ctx := api.WithNamespace(api.NewContext(), namespace) - return r.secrets.GetSecret(ctx, name) -} - -// NewGetterFromStorageInterface returns a ServiceAccountTokenGetter that -// uses the specified storage to retrieve service accounts and secrets. -func NewGetterFromStorageInterface(s storage.Interface) serviceaccount.ServiceAccountTokenGetter { - return NewGetterFromRegistries( - serviceaccountregistry.NewRegistry(serviceaccountetcd.NewREST(generic.RESTOptions{Storage: s, Decorator: generic.UndecoratedStorage})), - secret.NewRegistry(secretetcd.NewREST(generic.RESTOptions{Storage: s, Decorator: generic.UndecoratedStorage})), - ) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller.go deleted file mode 100644 index b660afc96..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller.go +++ /dev/null @@ -1,525 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount - -import ( - "bytes" - "fmt" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/api" - apierrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/client/cache" - clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/controller/framework" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/registry/secret" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/serviceaccount" - "k8s.io/kubernetes/pkg/util/metrics" - utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/watch" -) - -// RemoveTokenBackoff is the recommended (empirical) retry interval for removing -// a secret reference from a service account when the secret is deleted. It is -// exported for use by custom secret controllers. -var RemoveTokenBackoff = wait.Backoff{ - Steps: 10, - Duration: 100 * time.Millisecond, - Jitter: 1.0, -} - -// TokensControllerOptions contains options for the TokensController -type TokensControllerOptions struct { - // TokenGenerator is the generator to use to create new tokens - TokenGenerator serviceaccount.TokenGenerator - // ServiceAccountResync is the time.Duration at which to fully re-list service accounts. - // If zero, re-list will be delayed as long as possible - ServiceAccountResync time.Duration - // SecretResync is the time.Duration at which to fully re-list secrets. - // If zero, re-list will be delayed as long as possible - SecretResync time.Duration - // This CA will be added in the secretes of service accounts - RootCA []byte -} - -// NewTokensController returns a new *TokensController. -func NewTokensController(cl clientset.Interface, options TokensControllerOptions) *TokensController { - e := &TokensController{ - client: cl, - token: options.TokenGenerator, - rootCA: options.RootCA, - } - if cl != nil && cl.Core().GetRESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("serviceaccount_controller", cl.Core().GetRESTClient().GetRateLimiter()) - } - e.serviceAccounts, e.serviceAccountController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - return e.client.Core().ServiceAccounts(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - return e.client.Core().ServiceAccounts(api.NamespaceAll).Watch(options) - }, - }, - &api.ServiceAccount{}, - options.ServiceAccountResync, - framework.ResourceEventHandlerFuncs{ - AddFunc: e.serviceAccountAdded, - UpdateFunc: e.serviceAccountUpdated, - DeleteFunc: e.serviceAccountDeleted, - }, - cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}, - ) - - tokenSelector := fields.SelectorFromSet(map[string]string{api.SecretTypeField: string(api.SecretTypeServiceAccountToken)}) - e.secrets, e.secretController = framework.NewIndexerInformer( - &cache.ListWatch{ - ListFunc: func(options api.ListOptions) (runtime.Object, error) { - options.FieldSelector = tokenSelector - return e.client.Core().Secrets(api.NamespaceAll).List(options) - }, - WatchFunc: func(options api.ListOptions) (watch.Interface, error) { - options.FieldSelector = tokenSelector - return e.client.Core().Secrets(api.NamespaceAll).Watch(options) - }, - }, - &api.Secret{}, - options.SecretResync, - framework.ResourceEventHandlerFuncs{ - AddFunc: e.secretAdded, - UpdateFunc: e.secretUpdated, - DeleteFunc: e.secretDeleted, - }, - cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}, - ) - - e.serviceAccountsSynced = e.serviceAccountController.HasSynced - e.secretsSynced = e.secretController.HasSynced - - return e -} - -// TokensController manages ServiceAccountToken secrets for ServiceAccount objects -type TokensController struct { - stopChan chan struct{} - - client clientset.Interface - token serviceaccount.TokenGenerator - - rootCA []byte - - serviceAccounts cache.Indexer - secrets cache.Indexer - - // Since we join two objects, we'll watch both of them with controllers. - serviceAccountController *framework.Controller - secretController *framework.Controller - - // These are here so tests can inject a 'return true'. - serviceAccountsSynced func() bool - secretsSynced func() bool -} - -// Runs controller loops and returns immediately -func (e *TokensController) Run() { - if e.stopChan == nil { - e.stopChan = make(chan struct{}) - go e.serviceAccountController.Run(e.stopChan) - go e.secretController.Run(e.stopChan) - } -} - -// Stop gracefully shuts down this controller -func (e *TokensController) Stop() { - if e.stopChan != nil { - close(e.stopChan) - e.stopChan = nil - } -} - -// serviceAccountAdded reacts to a ServiceAccount creation by creating a corresponding ServiceAccountToken Secret -func (e *TokensController) serviceAccountAdded(obj interface{}) { - serviceAccount := obj.(*api.ServiceAccount) - err := e.createSecretIfNeeded(serviceAccount) - if err != nil { - glog.Error(err) - } -} - -// serviceAccountUpdated reacts to a ServiceAccount update (or re-list) by ensuring a corresponding ServiceAccountToken Secret exists -func (e *TokensController) serviceAccountUpdated(oldObj interface{}, newObj interface{}) { - newServiceAccount := newObj.(*api.ServiceAccount) - err := e.createSecretIfNeeded(newServiceAccount) - if err != nil { - glog.Error(err) - } -} - -// serviceAccountDeleted reacts to a ServiceAccount deletion by deleting all corresponding ServiceAccountToken Secrets -func (e *TokensController) serviceAccountDeleted(obj interface{}) { - serviceAccount, ok := obj.(*api.ServiceAccount) - if !ok { - // Unknown type. If we missed a ServiceAccount deletion, the - // corresponding secrets will be cleaned up during the Secret re-list - return - } - secrets, err := e.listTokenSecrets(serviceAccount) - if err != nil { - glog.Error(err) - return - } - for _, secret := range secrets { - glog.V(4).Infof("Deleting secret %s/%s because service account %s was deleted", secret.Namespace, secret.Name, serviceAccount.Name) - if err := e.deleteSecret(secret); err != nil { - glog.Errorf("Error deleting secret %s/%s: %v", secret.Namespace, secret.Name, err) - } - } -} - -// secretAdded reacts to a Secret create by ensuring the referenced ServiceAccount exists, and by adding a token to the secret if needed -func (e *TokensController) secretAdded(obj interface{}) { - secret := obj.(*api.Secret) - serviceAccount, err := e.getServiceAccount(secret, true) - if err != nil { - glog.Error(err) - return - } - if serviceAccount == nil { - glog.V(2).Infof( - "Deleting new secret %s/%s because service account %s (uid=%s) was not found", - secret.Namespace, secret.Name, - secret.Annotations[api.ServiceAccountNameKey], secret.Annotations[api.ServiceAccountUIDKey]) - if err := e.deleteSecret(secret); err != nil { - glog.Errorf("Error deleting secret %s/%s: %v", secret.Namespace, secret.Name, err) - } - } else { - e.generateTokenIfNeeded(serviceAccount, secret) - } -} - -// secretUpdated reacts to a Secret update (or re-list) by deleting the secret (if the referenced ServiceAccount does not exist) -func (e *TokensController) secretUpdated(oldObj interface{}, newObj interface{}) { - newSecret := newObj.(*api.Secret) - newServiceAccount, err := e.getServiceAccount(newSecret, true) - if err != nil { - glog.Error(err) - return - } - if newServiceAccount == nil { - glog.V(2).Infof( - "Deleting updated secret %s/%s because service account %s (uid=%s) was not found", - newSecret.Namespace, newSecret.Name, - newSecret.Annotations[api.ServiceAccountNameKey], newSecret.Annotations[api.ServiceAccountUIDKey]) - if err := e.deleteSecret(newSecret); err != nil { - glog.Errorf("Error deleting secret %s/%s: %v", newSecret.Namespace, newSecret.Name, err) - } - } else { - e.generateTokenIfNeeded(newServiceAccount, newSecret) - } -} - -// secretDeleted reacts to a Secret being deleted by removing a reference from the corresponding ServiceAccount if needed -func (e *TokensController) secretDeleted(obj interface{}) { - secret, ok := obj.(*api.Secret) - if !ok { - // Unknown type. If we missed a Secret deletion, the corresponding ServiceAccount (if it exists) - // will get a secret recreated (if needed) during the ServiceAccount re-list - return - } - - serviceAccount, err := e.getServiceAccount(secret, false) - if err != nil { - glog.Error(err) - return - } - if serviceAccount == nil { - return - } - - if err := client.RetryOnConflict(RemoveTokenBackoff, func() error { - return e.removeSecretReferenceIfNeeded(serviceAccount, secret.Name) - }); err != nil { - utilruntime.HandleError(err) - } -} - -// createSecretIfNeeded makes sure at least one ServiceAccountToken secret exists, and is included in the serviceAccount's Secrets list -func (e *TokensController) createSecretIfNeeded(serviceAccount *api.ServiceAccount) error { - // If the service account references no secrets, short-circuit and create a new one - if len(serviceAccount.Secrets) == 0 { - return e.createSecret(serviceAccount) - } - - // We shouldn't try to validate secret references until the secrets store is synced - if !e.secretsSynced() { - return nil - } - - // If any existing token secrets are referenced by the service account, return - allSecrets, err := e.listTokenSecrets(serviceAccount) - if err != nil { - return err - } - referencedSecrets := getSecretReferences(serviceAccount) - for _, secret := range allSecrets { - if referencedSecrets.Has(secret.Name) { - return nil - } - } - - // Otherwise create a new token secret - return e.createSecret(serviceAccount) -} - -// createSecret creates a secret of type ServiceAccountToken for the given ServiceAccount -func (e *TokensController) createSecret(serviceAccount *api.ServiceAccount) error { - // We don't want to update the cache's copy of the service account - // so add the secret to a freshly retrieved copy of the service account - serviceAccounts := e.client.Core().ServiceAccounts(serviceAccount.Namespace) - liveServiceAccount, err := serviceAccounts.Get(serviceAccount.Name) - if err != nil { - return err - } - if liveServiceAccount.ResourceVersion != serviceAccount.ResourceVersion { - // our view of the service account is not up to date - // we'll get notified of an update event later and get to try again - // this only prevent interactions between successive runs of this controller's event handlers, but that is useful - glog.V(2).Infof("View of ServiceAccount %s/%s is not up to date, skipping token creation", serviceAccount.Namespace, serviceAccount.Name) - return nil - } - - // Build the secret - secret := &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: secret.Strategy.GenerateName(fmt.Sprintf("%s-token-", serviceAccount.Name)), - Namespace: serviceAccount.Namespace, - Annotations: map[string]string{ - api.ServiceAccountNameKey: serviceAccount.Name, - api.ServiceAccountUIDKey: string(serviceAccount.UID), - }, - }, - Type: api.SecretTypeServiceAccountToken, - Data: map[string][]byte{}, - } - - // Generate the token - token, err := e.token.GenerateToken(*serviceAccount, *secret) - if err != nil { - return err - } - secret.Data[api.ServiceAccountTokenKey] = []byte(token) - secret.Data[api.ServiceAccountNamespaceKey] = []byte(serviceAccount.Namespace) - if e.rootCA != nil && len(e.rootCA) > 0 { - secret.Data[api.ServiceAccountRootCAKey] = e.rootCA - } - - // Save the secret - if createdToken, err := e.client.Core().Secrets(serviceAccount.Namespace).Create(secret); err != nil { - return err - } else { - // Manually add the new token to the cache store. - // This prevents the service account update (below) triggering another token creation, if the referenced token couldn't be found in the store - e.secrets.Add(createdToken) - } - - liveServiceAccount.Secrets = append(liveServiceAccount.Secrets, api.ObjectReference{Name: secret.Name}) - - _, err = serviceAccounts.Update(liveServiceAccount) - if err != nil { - // we weren't able to use the token, try to clean it up. - glog.V(2).Infof("Deleting secret %s/%s because reference couldn't be added (%v)", secret.Namespace, secret.Name, err) - if err := e.client.Core().Secrets(secret.Namespace).Delete(secret.Name, nil); err != nil { - glog.Error(err) // if we fail, just log it - } - } - if apierrors.IsConflict(err) { - // nothing to do. We got a conflict, that means that the service account was updated. We simply need to return because we'll get an update notification later - return nil - } - - return err -} - -// generateTokenIfNeeded populates the token data for the given Secret if not already set -func (e *TokensController) generateTokenIfNeeded(serviceAccount *api.ServiceAccount, secret *api.Secret) error { - if secret.Annotations == nil { - secret.Annotations = map[string]string{} - } - if secret.Data == nil { - secret.Data = map[string][]byte{} - } - - caData := secret.Data[api.ServiceAccountRootCAKey] - needsCA := len(e.rootCA) > 0 && bytes.Compare(caData, e.rootCA) != 0 - - needsNamespace := len(secret.Data[api.ServiceAccountNamespaceKey]) == 0 - - tokenData := secret.Data[api.ServiceAccountTokenKey] - needsToken := len(tokenData) == 0 - - if !needsCA && !needsToken && !needsNamespace { - return nil - } - - // Set the CA - if needsCA { - secret.Data[api.ServiceAccountRootCAKey] = e.rootCA - } - // Set the namespace - if needsNamespace { - secret.Data[api.ServiceAccountNamespaceKey] = []byte(secret.Namespace) - } - - // Generate the token - if needsToken { - token, err := e.token.GenerateToken(*serviceAccount, *secret) - if err != nil { - return err - } - secret.Data[api.ServiceAccountTokenKey] = []byte(token) - } - - // Set annotations - secret.Annotations[api.ServiceAccountNameKey] = serviceAccount.Name - secret.Annotations[api.ServiceAccountUIDKey] = string(serviceAccount.UID) - - // Save the secret - if _, err := e.client.Core().Secrets(secret.Namespace).Update(secret); err != nil { - return err - } - return nil -} - -// deleteSecret deletes the given secret -func (e *TokensController) deleteSecret(secret *api.Secret) error { - return e.client.Core().Secrets(secret.Namespace).Delete(secret.Name, nil) -} - -// removeSecretReferenceIfNeeded updates the given ServiceAccount to remove a reference to the given secretName if needed. -// Returns whether an update was performed, and any error that occurred -func (e *TokensController) removeSecretReferenceIfNeeded(serviceAccount *api.ServiceAccount, secretName string) error { - // We don't want to update the cache's copy of the service account - // so remove the secret from a freshly retrieved copy of the service account - serviceAccounts := e.client.Core().ServiceAccounts(serviceAccount.Namespace) - serviceAccount, err := serviceAccounts.Get(serviceAccount.Name) - if err != nil { - return err - } - - // Double-check to see if the account still references the secret - if !getSecretReferences(serviceAccount).Has(secretName) { - return nil - } - - secrets := []api.ObjectReference{} - for _, s := range serviceAccount.Secrets { - if s.Name != secretName { - secrets = append(secrets, s) - } - } - serviceAccount.Secrets = secrets - - _, err = serviceAccounts.Update(serviceAccount) - if err != nil { - return err - } - - return nil -} - -// getServiceAccount returns the ServiceAccount referenced by the given secret. If the secret is not -// of type ServiceAccountToken, or if the referenced ServiceAccount does not exist, nil is returned -func (e *TokensController) getServiceAccount(secret *api.Secret, fetchOnCacheMiss bool) (*api.ServiceAccount, error) { - name, _ := serviceAccountNameAndUID(secret) - if len(name) == 0 { - return nil, nil - } - - key := &api.ServiceAccount{ObjectMeta: api.ObjectMeta{Namespace: secret.Namespace}} - namespaceAccounts, err := e.serviceAccounts.Index("namespace", key) - if err != nil { - return nil, err - } - - for _, obj := range namespaceAccounts { - serviceAccount := obj.(*api.ServiceAccount) - - if serviceaccount.IsServiceAccountToken(secret, serviceAccount) { - return serviceAccount, nil - } - } - - if fetchOnCacheMiss { - serviceAccount, err := e.client.Core().ServiceAccounts(secret.Namespace).Get(name) - if apierrors.IsNotFound(err) { - return nil, nil - } - if err != nil { - return nil, err - } - - if serviceaccount.IsServiceAccountToken(secret, serviceAccount) { - return serviceAccount, nil - } - } - - return nil, nil -} - -// listTokenSecrets returns a list of all of the ServiceAccountToken secrets that -// reference the given service account's name and uid -func (e *TokensController) listTokenSecrets(serviceAccount *api.ServiceAccount) ([]*api.Secret, error) { - key := &api.Secret{ObjectMeta: api.ObjectMeta{Namespace: serviceAccount.Namespace}} - namespaceSecrets, err := e.secrets.Index("namespace", key) - if err != nil { - return nil, err - } - - items := []*api.Secret{} - for _, obj := range namespaceSecrets { - secret := obj.(*api.Secret) - - if serviceaccount.IsServiceAccountToken(secret, serviceAccount) { - items = append(items, secret) - } - } - return items, nil -} - -// serviceAccountNameAndUID is a helper method to get the ServiceAccount Name and UID from the given secret -// Returns "","" if the secret is not a ServiceAccountToken secret -// If the name or uid annotation is missing, "" is returned instead -func serviceAccountNameAndUID(secret *api.Secret) (string, string) { - if secret.Type != api.SecretTypeServiceAccountToken { - return "", "" - } - return secret.Annotations[api.ServiceAccountNameKey], secret.Annotations[api.ServiceAccountUIDKey] -} - -func getSecretReferences(serviceAccount *api.ServiceAccount) sets.String { - references := sets.NewString() - for _, secret := range serviceAccount.Secrets { - references.Insert(secret.Name) - } - return references -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller_test.go deleted file mode 100644 index 4f2ff6fb5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/controller/serviceaccount/tokens_controller_test.go +++ /dev/null @@ -1,562 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 serviceaccount - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/client/testing/core" - "k8s.io/kubernetes/pkg/runtime" - utilrand "k8s.io/kubernetes/pkg/util/rand" -) - -type testGenerator struct { - GeneratedServiceAccounts []api.ServiceAccount - GeneratedSecrets []api.Secret - Token string - Err error -} - -func (t *testGenerator) GenerateToken(serviceAccount api.ServiceAccount, secret api.Secret) (string, error) { - t.GeneratedSecrets = append(t.GeneratedSecrets, secret) - t.GeneratedServiceAccounts = append(t.GeneratedServiceAccounts, serviceAccount) - return t.Token, t.Err -} - -// emptySecretReferences is used by a service account without any secrets -func emptySecretReferences() []api.ObjectReference { - return []api.ObjectReference{} -} - -// missingSecretReferences is used by a service account that references secrets which do no exist -func missingSecretReferences() []api.ObjectReference { - return []api.ObjectReference{{Name: "missing-secret-1"}} -} - -// regularSecretReferences is used by a service account that references secrets which are not ServiceAccountTokens -func regularSecretReferences() []api.ObjectReference { - return []api.ObjectReference{{Name: "regular-secret-1"}} -} - -// tokenSecretReferences is used by a service account that references a ServiceAccountToken secret -func tokenSecretReferences() []api.ObjectReference { - return []api.ObjectReference{{Name: "token-secret-1"}} -} - -// addTokenSecretReference adds a reference to the ServiceAccountToken that will be created -func addTokenSecretReference(refs []api.ObjectReference) []api.ObjectReference { - return append(refs, api.ObjectReference{Name: "default-token-fplln"}) -} - -// serviceAccount returns a service account with the given secret refs -func serviceAccount(secretRefs []api.ObjectReference) *api.ServiceAccount { - return &api.ServiceAccount{ - ObjectMeta: api.ObjectMeta{ - Name: "default", - UID: "12345", - Namespace: "default", - ResourceVersion: "1", - }, - Secrets: secretRefs, - } -} - -// updatedServiceAccount returns a service account with the resource version modified -func updatedServiceAccount(secretRefs []api.ObjectReference) *api.ServiceAccount { - sa := serviceAccount(secretRefs) - sa.ResourceVersion = "2" - return sa -} - -// opaqueSecret returns a persisted non-ServiceAccountToken secret named "regular-secret-1" -func opaqueSecret() *api.Secret { - return &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "regular-secret-1", - Namespace: "default", - UID: "23456", - ResourceVersion: "1", - }, - Type: "Opaque", - Data: map[string][]byte{ - "mykey": []byte("mydata"), - }, - } -} - -// createdTokenSecret returns the ServiceAccountToken secret posted when creating a new token secret. -// Named "default-token-fplln", since that is the first generated name after rand.Seed(1) -func createdTokenSecret() *api.Secret { - return &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "default-token-fplln", - Namespace: "default", - Annotations: map[string]string{ - api.ServiceAccountNameKey: "default", - api.ServiceAccountUIDKey: "12345", - }, - }, - Type: api.SecretTypeServiceAccountToken, - Data: map[string][]byte{ - "token": []byte("ABC"), - "ca.crt": []byte("CA Data"), - "namespace": []byte("default"), - }, - } -} - -// serviceAccountTokenSecret returns an existing ServiceAccountToken secret named "token-secret-1" -func serviceAccountTokenSecret() *api.Secret { - return &api.Secret{ - ObjectMeta: api.ObjectMeta{ - Name: "token-secret-1", - Namespace: "default", - UID: "23456", - ResourceVersion: "1", - Annotations: map[string]string{ - api.ServiceAccountNameKey: "default", - api.ServiceAccountUIDKey: "12345", - }, - }, - Type: api.SecretTypeServiceAccountToken, - Data: map[string][]byte{ - "token": []byte("ABC"), - "ca.crt": []byte("CA Data"), - "namespace": []byte("default"), - }, - } -} - -// serviceAccountTokenSecretWithoutTokenData returns an existing ServiceAccountToken secret that lacks token data -func serviceAccountTokenSecretWithoutTokenData() *api.Secret { - secret := serviceAccountTokenSecret() - delete(secret.Data, api.ServiceAccountTokenKey) - return secret -} - -// serviceAccountTokenSecretWithoutCAData returns an existing ServiceAccountToken secret that lacks ca data -func serviceAccountTokenSecretWithoutCAData() *api.Secret { - secret := serviceAccountTokenSecret() - delete(secret.Data, api.ServiceAccountRootCAKey) - return secret -} - -// serviceAccountTokenSecretWithCAData returns an existing ServiceAccountToken secret with the specified ca data -func serviceAccountTokenSecretWithCAData(data []byte) *api.Secret { - secret := serviceAccountTokenSecret() - secret.Data[api.ServiceAccountRootCAKey] = data - return secret -} - -// serviceAccountTokenSecretWithoutNamespaceData returns an existing ServiceAccountToken secret that lacks namespace data -func serviceAccountTokenSecretWithoutNamespaceData() *api.Secret { - secret := serviceAccountTokenSecret() - delete(secret.Data, api.ServiceAccountNamespaceKey) - return secret -} - -// serviceAccountTokenSecretWithNamespaceData returns an existing ServiceAccountToken secret with the specified namespace data -func serviceAccountTokenSecretWithNamespaceData(data []byte) *api.Secret { - secret := serviceAccountTokenSecret() - secret.Data[api.ServiceAccountNamespaceKey] = data - return secret -} - -func TestTokenCreation(t *testing.T) { - testcases := map[string]struct { - ClientObjects []runtime.Object - - SecretsSyncPending bool - ServiceAccountsSyncPending bool - - ExistingServiceAccount *api.ServiceAccount - ExistingSecrets []*api.Secret - - AddedServiceAccount *api.ServiceAccount - UpdatedServiceAccount *api.ServiceAccount - DeletedServiceAccount *api.ServiceAccount - AddedSecret *api.Secret - UpdatedSecret *api.Secret - DeletedSecret *api.Secret - - ExpectedActions []core.Action - }{ - "new serviceaccount with no secrets": { - ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, - - AddedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), - }, - }, - "new serviceaccount with no secrets with unsynced secret store": { - ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, - - SecretsSyncPending: true, - - AddedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), - }, - }, - "new serviceaccount with missing secrets": { - ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, - - AddedServiceAccount: serviceAccount(missingSecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))), - }, - }, - "new serviceaccount with missing secrets with unsynced secret store": { - ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, - - SecretsSyncPending: true, - - AddedServiceAccount: serviceAccount(missingSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "new serviceaccount with non-token secrets": { - ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), createdTokenSecret(), opaqueSecret()}, - - AddedServiceAccount: serviceAccount(regularSecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))), - }, - }, - "new serviceaccount with token secrets": { - ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences()), serviceAccountTokenSecret()}, - ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, - - AddedServiceAccount: serviceAccount(tokenSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "new serviceaccount with no secrets with resource conflict": { - ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences()), createdTokenSecret()}, - - AddedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - }, - }, - - "updated serviceaccount with no secrets": { - ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, - - UpdatedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), - }, - }, - "updated serviceaccount with no secrets with unsynced secret store": { - ClientObjects: []runtime.Object{serviceAccount(emptySecretReferences()), createdTokenSecret()}, - - SecretsSyncPending: true, - - UpdatedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(emptySecretReferences()))), - }, - }, - "updated serviceaccount with missing secrets": { - ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, - - UpdatedServiceAccount: serviceAccount(missingSecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(missingSecretReferences()))), - }, - }, - "updated serviceaccount with missing secrets with unsynced secret store": { - ClientObjects: []runtime.Object{serviceAccount(missingSecretReferences()), createdTokenSecret()}, - - SecretsSyncPending: true, - - UpdatedServiceAccount: serviceAccount(missingSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "updated serviceaccount with non-token secrets": { - ClientObjects: []runtime.Object{serviceAccount(regularSecretReferences()), createdTokenSecret(), opaqueSecret()}, - - UpdatedServiceAccount: serviceAccount(regularSecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewCreateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, createdTokenSecret()), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(addTokenSecretReference(regularSecretReferences()))), - }, - }, - "updated serviceaccount with token secrets": { - ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, - - UpdatedServiceAccount: serviceAccount(tokenSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "updated serviceaccount with no secrets with resource conflict": { - ClientObjects: []runtime.Object{updatedServiceAccount(emptySecretReferences()), createdTokenSecret()}, - - UpdatedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - }, - }, - - "deleted serviceaccount with no secrets": { - DeletedServiceAccount: serviceAccount(emptySecretReferences()), - ExpectedActions: []core.Action{}, - }, - "deleted serviceaccount with missing secrets": { - DeletedServiceAccount: serviceAccount(missingSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "deleted serviceaccount with non-token secrets": { - ClientObjects: []runtime.Object{opaqueSecret()}, - - DeletedServiceAccount: serviceAccount(regularSecretReferences()), - ExpectedActions: []core.Action{}, - }, - "deleted serviceaccount with token secrets": { - ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, - ExistingSecrets: []*api.Secret{serviceAccountTokenSecret()}, - - DeletedServiceAccount: serviceAccount(tokenSecretReferences()), - ExpectedActions: []core.Action{ - core.NewDeleteAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, "token-secret-1"), - }, - }, - - "added secret without serviceaccount": { - ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, - - AddedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewDeleteAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, "token-secret-1"), - }, - }, - "added secret with serviceaccount": { - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{}, - }, - "added token secret without token data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecretWithoutTokenData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "added token secret without ca data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecretWithoutCAData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "added token secret with mismatched ca data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "added token secret without namespace data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutNamespaceData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecretWithoutNamespaceData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "added token secret with custom namespace data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithNamespaceData([]byte("custom"))}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - AddedSecret: serviceAccountTokenSecretWithNamespaceData([]byte("custom")), - ExpectedActions: []core.Action{ - // no update is performed... the custom namespace is preserved - }, - }, - - "updated secret without serviceaccount": { - ClientObjects: []runtime.Object{serviceAccountTokenSecret()}, - - UpdatedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewDeleteAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, "token-secret-1"), - }, - }, - "updated secret with serviceaccount": { - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{}, - }, - "updated token secret without token data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutTokenData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecretWithoutTokenData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "updated token secret without ca data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutCAData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecretWithoutCAData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "updated token secret with mismatched ca data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithCAData([]byte("mismatched"))}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecretWithCAData([]byte("mismatched")), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "updated token secret without namespace data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithoutNamespaceData()}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecretWithoutNamespaceData(), - ExpectedActions: []core.Action{ - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "secrets"}, api.NamespaceDefault, serviceAccountTokenSecret()), - }, - }, - "updated token secret with custom namespace data": { - ClientObjects: []runtime.Object{serviceAccountTokenSecretWithNamespaceData([]byte("custom"))}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - UpdatedSecret: serviceAccountTokenSecretWithNamespaceData([]byte("custom")), - ExpectedActions: []core.Action{ - // no update is performed... the custom namespace is preserved - }, - }, - - "deleted secret without serviceaccount": { - DeletedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{}, - }, - "deleted secret with serviceaccount with reference": { - ClientObjects: []runtime.Object{serviceAccount(tokenSecretReferences())}, - ExistingServiceAccount: serviceAccount(tokenSecretReferences()), - - DeletedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - core.NewUpdateAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, serviceAccount(emptySecretReferences())), - }, - }, - "deleted secret with serviceaccount without reference": { - ExistingServiceAccount: serviceAccount(emptySecretReferences()), - - DeletedSecret: serviceAccountTokenSecret(), - ExpectedActions: []core.Action{ - core.NewGetAction(unversioned.GroupVersionResource{Resource: "serviceaccounts"}, api.NamespaceDefault, "default"), - }, - }, - } - - for k, tc := range testcases { - - // Re-seed to reset name generation - utilrand.Seed(1) - - generator := &testGenerator{Token: "ABC"} - - client := fake.NewSimpleClientset(tc.ClientObjects...) - - controller := NewTokensController(client, TokensControllerOptions{TokenGenerator: generator, RootCA: []byte("CA Data")}) - - // Tell the token controller whether its stores have been synced - controller.serviceAccountsSynced = func() bool { return !tc.ServiceAccountsSyncPending } - controller.secretsSynced = func() bool { return !tc.SecretsSyncPending } - - if tc.ExistingServiceAccount != nil { - controller.serviceAccounts.Add(tc.ExistingServiceAccount) - } - for _, s := range tc.ExistingSecrets { - controller.secrets.Add(s) - } - - if tc.AddedServiceAccount != nil { - controller.serviceAccountAdded(tc.AddedServiceAccount) - } - if tc.UpdatedServiceAccount != nil { - controller.serviceAccountUpdated(nil, tc.UpdatedServiceAccount) - } - if tc.DeletedServiceAccount != nil { - controller.serviceAccountDeleted(tc.DeletedServiceAccount) - } - if tc.AddedSecret != nil { - controller.secretAdded(tc.AddedSecret) - } - if tc.UpdatedSecret != nil { - controller.secretUpdated(nil, tc.UpdatedSecret) - } - if tc.DeletedSecret != nil { - controller.secretDeleted(tc.DeletedSecret) - } - - actions := client.Actions() - for i, action := range actions { - if len(tc.ExpectedActions) < i+1 { - t.Errorf("%s: %d unexpected actions: %+v", k, len(actions)-len(tc.ExpectedActions), actions[i:]) - break - } - - expectedAction := tc.ExpectedActions[i] - if !reflect.DeepEqual(expectedAction, action) { - t.Errorf("%s: Expected\n\t%#v\ngot\n\t%#v", k, expectedAction, action) - continue - } - } - - if len(tc.ExpectedActions) > len(actions) { - t.Errorf("%s: %d additional expected actions:%+v", k, len(tc.ExpectedActions)-len(actions), tc.ExpectedActions[len(actions):]) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/converter_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/converter_test.go deleted file mode 100644 index 6dde9af96..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/converter_test.go +++ /dev/null @@ -1,847 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 conversion - -import ( - "encoding/json" - "fmt" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/google/gofuzz" - flag "github.com/spf13/pflag" - - "k8s.io/kubernetes/pkg/util/diff" -) - -var fuzzIters = flag.Int("fuzz-iters", 50, "How many fuzzing iterations to do.") - -// Test a weird version/kind embedding format. -type MyWeirdCustomEmbeddedVersionKindField struct { - ID string `json:"ID,omitempty"` - APIVersion string `json:"myVersionKey,omitempty"` - ObjectKind string `json:"myKindKey,omitempty"` - Z string `json:"Z,omitempty"` - Y uint64 `json:"Y,omitempty"` -} - -type TestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]TestType2 `json:"N,omitempty"` - O *TestType2 `json:"O,omitempty"` - P []TestType2 `json:"Q,omitempty"` -} - -type TestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} - -type ExternalTestType2 struct { - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` -} -type ExternalTestType1 struct { - MyWeirdCustomEmbeddedVersionKindField `json:",inline"` - A string `json:"A,omitempty"` - B int `json:"B,omitempty"` - C int8 `json:"C,omitempty"` - D int16 `json:"D,omitempty"` - E int32 `json:"E,omitempty"` - F int64 `json:"F,omitempty"` - G uint `json:"G,omitempty"` - H uint8 `json:"H,omitempty"` - I uint16 `json:"I,omitempty"` - J uint32 `json:"J,omitempty"` - K uint64 `json:"K,omitempty"` - L bool `json:"L,omitempty"` - M map[string]int `json:"M,omitempty"` - N map[string]ExternalTestType2 `json:"N,omitempty"` - O *ExternalTestType2 `json:"O,omitempty"` - P []ExternalTestType2 `json:"Q,omitempty"` -} - -func testLogger(t *testing.T) DebugLogger { - // We don't set logger to eliminate rubbish logs in tests. - // If you want to switch it, simply switch it to: "return t" - return nil -} - -func TestConverter_byteSlice(t *testing.T) { - c := NewConverter(DefaultNameFunc) - src := []byte{1, 2, 3} - dest := []byte{} - err := c.Convert(&src, &dest, 0, nil) - if err != nil { - t.Fatalf("expected no error") - } - if e, a := src, dest; !reflect.DeepEqual(e, a) { - t.Errorf("expected %#v, got %#v", e, a) - } -} - -func TestConverter_MismatchedTypes(t *testing.T) { - c := NewConverter(DefaultNameFunc) - - err := c.RegisterConversionFunc( - func(in *[]string, out *int, s Scope) error { - if str, err := strconv.Atoi((*in)[0]); err != nil { - return err - } else { - *out = str - return nil - } - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - src := []string{"5"} - var dest *int - err = c.Convert(&src, &dest, 0, nil) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if e, a := 5, *dest; e != a { - t.Errorf("expected %#v, got %#v", e, a) - } -} - -func TestConverter_DefaultConvert(t *testing.T) { - type A struct { - Foo string - Baz int - } - type B struct { - Bar string - Baz int - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - c.nameFunc = func(t reflect.Type) string { return "MyType" } - - // Ensure conversion funcs can call DefaultConvert to get default behavior, - // then fixup remaining fields manually - err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { - if err := s.DefaultConvert(in, out, IgnoreMissingFields); err != nil { - return err - } - out.Bar = in.Foo - return nil - }) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - - x := A{"hello, intrepid test reader!", 3} - y := B{} - - err = c.Convert(&x, &y, 0, nil) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - if e, a := x.Foo, y.Bar; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := x.Baz, y.Baz; e != a { - t.Errorf("expected %v, got %v", e, a) - } -} - -func TestConverter_DeepCopy(t *testing.T) { - type A struct { - Foo *string - Bar []string - Baz interface{} - Qux map[string]string - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - - foo, baz := "foo", "baz" - x := A{ - Foo: &foo, - Bar: []string{"bar"}, - Baz: &baz, - Qux: map[string]string{"qux": "qux"}, - } - y := A{} - - if err := c.Convert(&x, &y, 0, nil); err != nil { - t.Fatalf("unexpected error %v", err) - } - *x.Foo = "foo2" - x.Bar[0] = "bar2" - *x.Baz.(*string) = "baz2" - x.Qux["qux"] = "qux2" - if e, a := *x.Foo, *y.Foo; e == a { - t.Errorf("expected difference between %v and %v", e, a) - } - if e, a := x.Bar, y.Bar; reflect.DeepEqual(e, a) { - t.Errorf("expected difference between %v and %v", e, a) - } - if e, a := *x.Baz.(*string), *y.Baz.(*string); e == a { - t.Errorf("expected difference between %v and %v", e, a) - } - if e, a := x.Qux, y.Qux; reflect.DeepEqual(e, a) { - t.Errorf("expected difference between %v and %v", e, a) - } -} - -func TestConverter_CallsRegisteredFunctions(t *testing.T) { - type A struct { - Foo string - Baz int - } - type B struct { - Bar string - Baz int - } - type C struct{} - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { - out.Bar = in.Foo - return s.Convert(&in.Baz, &out.Baz, 0) - }) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - err = c.RegisterConversionFunc(func(in *B, out *A, s Scope) error { - out.Foo = in.Bar - return s.Convert(&in.Baz, &out.Baz, 0) - }) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - - x := A{"hello, intrepid test reader!", 3} - y := B{} - - err = c.Convert(&x, &y, 0, nil) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - if e, a := x.Foo, y.Bar; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := x.Baz, y.Baz; e != a { - t.Errorf("expected %v, got %v", e, a) - } - - z := B{"all your test are belong to us", 42} - w := A{} - - err = c.Convert(&z, &w, 0, nil) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - if e, a := z.Bar, w.Foo; e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := z.Baz, w.Baz; e != a { - t.Errorf("expected %v, got %v", e, a) - } - - err = c.RegisterConversionFunc(func(in *A, out *C, s Scope) error { - return fmt.Errorf("C can't store an A, silly") - }) - if err != nil { - t.Fatalf("unexpected error %v", err) - } - err = c.Convert(&A{}, &C{}, 0, nil) - if err == nil { - t.Errorf("unexpected non-error") - } -} - -func TestConverter_IgnoredConversion(t *testing.T) { - type A struct{} - type B struct{} - - count := 0 - c := NewConverter(DefaultNameFunc) - if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { - count++ - return nil - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - if err := c.RegisterIgnoredConversion(&A{}, &B{}); err != nil { - t.Fatal(err) - } - a := A{} - b := B{} - if err := c.Convert(&a, &b, 0, nil); err != nil { - t.Errorf("%v", err) - } - if count != 0 { - t.Errorf("unexpected number of conversion invocations") - } -} - -func TestConverter_IgnoredConversionNested(t *testing.T) { - type C string - type A struct { - C C - } - type B struct { - C C - } - - c := NewConverter(DefaultNameFunc) - typed := C("") - if err := c.RegisterIgnoredConversion(&typed, &typed); err != nil { - t.Fatal(err) - } - a := A{C: C("test")} - b := B{C: C("other")} - if err := c.Convert(&a, &b, AllowDifferentFieldTypeNames, nil); err != nil { - t.Errorf("%v", err) - } - if b.C != C("other") { - t.Errorf("expected no conversion of field C: %#v", b) - } -} - -func TestConverter_GeneratedConversionOverriden(t *testing.T) { - type A struct{} - type B struct{} - c := NewConverter(DefaultNameFunc) - if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { - return nil - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - if err := c.RegisterGeneratedConversionFunc(func(in *A, out *B, s Scope) error { - return fmt.Errorf("generated function should be overriden") - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - - a := A{} - b := B{} - if err := c.Convert(&a, &b, 0, nil); err != nil { - t.Errorf("%v", err) - } -} - -func TestConverter_WithConversionOverriden(t *testing.T) { - type A struct{} - type B struct{} - c := NewConverter(DefaultNameFunc) - if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { - return fmt.Errorf("conversion function should be overriden") - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - if err := c.RegisterGeneratedConversionFunc(func(in *A, out *B, s Scope) error { - return fmt.Errorf("generated function should be overriden") - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - - ext := NewConversionFuncs() - ext.Add(func(in *A, out *B, s Scope) error { - return nil - }) - newc := c.WithConversions(ext) - - a := A{} - b := B{} - if err := c.Convert(&a, &b, 0, nil); err == nil || err.Error() != "conversion function should be overriden" { - t.Errorf("unexpected error: %v", err) - } - if err := newc.Convert(&a, &b, 0, nil); err != nil { - t.Errorf("%v", err) - } -} - -func TestConverter_MapsStringArrays(t *testing.T) { - type A struct { - Foo string - Baz int - Other string - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - if err := c.RegisterConversionFunc(func(input *[]string, out *string, s Scope) error { - if len(*input) == 0 { - *out = "" - } - *out = (*input)[0] - return nil - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - - x := map[string][]string{ - "Foo": {"bar"}, - "Baz": {"1"}, - "Other": {"", "test"}, - "other": {"wrong"}, - } - y := A{"test", 2, "something"} - - if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames, nil); err == nil { - t.Error("unexpected non-error") - } - - if err := c.RegisterConversionFunc(func(input *[]string, out *int, s Scope) error { - if len(*input) == 0 { - *out = 0 - } - str := (*input)[0] - i, err := strconv.Atoi(str) - if err != nil { - return err - } - *out = i - return nil - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - - if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames, nil); err != nil { - t.Fatalf("unexpected error %v", err) - } - if !reflect.DeepEqual(y, A{"bar", 1, ""}) { - t.Errorf("unexpected result: %#v", y) - } -} - -func TestConverter_MapsStringArraysWithMappingKey(t *testing.T) { - type A struct { - Foo string `json:"test"` - Baz int - Other string - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - if err := c.RegisterConversionFunc(func(input *[]string, out *string, s Scope) error { - if len(*input) == 0 { - *out = "" - } - *out = (*input)[0] - return nil - }); err != nil { - t.Fatalf("unexpected error %v", err) - } - - x := map[string][]string{ - "Foo": {"bar"}, - "test": {"baz"}, - } - y := A{"", 0, ""} - - if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames|IgnoreMissingFields, &Meta{}); err != nil { - t.Fatalf("unexpected error %v", err) - } - if !reflect.DeepEqual(y, A{"bar", 0, ""}) { - t.Errorf("unexpected result: %#v", y) - } - - mapping := func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string) { - if s := destTag.Get("json"); len(s) > 0 { - return strings.SplitN(s, ",", 2)[0], key - } - return key, key - } - - if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames|IgnoreMissingFields, &Meta{KeyNameMapping: mapping}); err != nil { - t.Fatalf("unexpected error %v", err) - } - if !reflect.DeepEqual(y, A{"baz", 0, ""}) { - t.Errorf("unexpected result: %#v", y) - } -} - -func TestConverter_fuzz(t *testing.T) { - // Use the same types from the scheme test. - table := []struct { - from, to, check interface{} - }{ - {&TestType1{}, &ExternalTestType1{}, &TestType1{}}, - {&ExternalTestType1{}, &TestType1{}, &ExternalTestType1{}}, - } - - f := fuzz.New().NilChance(.5).NumElements(0, 100) - c := NewConverter(DefaultNameFunc) - c.nameFunc = func(t reflect.Type) string { - // Hide the fact that we don't have separate packages for these things. - return map[reflect.Type]string{ - reflect.TypeOf(TestType1{}): "TestType1", - reflect.TypeOf(ExternalTestType1{}): "TestType1", - reflect.TypeOf(TestType2{}): "TestType2", - reflect.TypeOf(ExternalTestType2{}): "TestType2", - }[t] - } - c.Debug = testLogger(t) - - for i, item := range table { - for j := 0; j < *fuzzIters; j++ { - f.Fuzz(item.from) - err := c.Convert(item.from, item.to, 0, nil) - if err != nil { - t.Errorf("(%v, %v): unexpected error: %v", i, j, err) - continue - } - err = c.Convert(item.to, item.check, 0, nil) - if err != nil { - t.Errorf("(%v, %v): unexpected error: %v", i, j, err) - continue - } - if e, a := item.from, item.check; !reflect.DeepEqual(e, a) { - t.Errorf("(%v, %v): unexpected diff: %v", i, j, objDiff(e, a)) - } - } - } -} - -func TestConverter_MapElemAddr(t *testing.T) { - type Foo struct { - A map[int]int - } - type Bar struct { - A map[string]string - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - err := c.RegisterConversionFunc( - func(in *int, out *string, s Scope) error { - *out = fmt.Sprintf("%v", *in) - return nil - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - err = c.RegisterConversionFunc( - func(in *string, out *int, s Scope) error { - if str, err := strconv.Atoi(*in); err != nil { - return err - } else { - *out = str - return nil - } - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - f := fuzz.New().NilChance(0).NumElements(3, 3) - first := Foo{} - second := Bar{} - f.Fuzz(&first) - err = c.Convert(&first, &second, AllowDifferentFieldTypeNames, nil) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - third := Foo{} - err = c.Convert(&second, &third, AllowDifferentFieldTypeNames, nil) - if e, a := first, third; !reflect.DeepEqual(e, a) { - t.Errorf("Unexpected diff: %v", objDiff(e, a)) - } -} - -func TestConverter_tags(t *testing.T) { - type Foo struct { - A string `test:"foo"` - } - type Bar struct { - A string `test:"bar"` - } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - err := c.RegisterConversionFunc( - func(in *string, out *string, s Scope) error { - if e, a := "foo", s.SrcTag().Get("test"); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := "bar", s.DestTag().Get("test"); e != a { - t.Errorf("expected %v, got %v", e, a) - } - return nil - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - err = c.Convert(&Foo{}, &Bar{}, AllowDifferentFieldTypeNames, nil) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } -} - -func TestConverter_meta(t *testing.T) { - type Foo struct{ A string } - type Bar struct{ A string } - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - checks := 0 - err := c.RegisterConversionFunc( - func(in *Foo, out *Bar, s Scope) error { - if s.Meta() == nil || s.Meta().SrcVersion != "test" || s.Meta().DestVersion != "passes" { - t.Errorf("Meta did not get passed!") - } - checks++ - s.Convert(&in.A, &out.A, 0) - return nil - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - err = c.RegisterConversionFunc( - func(in *string, out *string, s Scope) error { - if s.Meta() == nil || s.Meta().SrcVersion != "test" || s.Meta().DestVersion != "passes" { - t.Errorf("Meta did not get passed a second time!") - } - checks++ - return nil - }, - ) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - err = c.Convert(&Foo{}, &Bar{}, 0, &Meta{SrcVersion: "test", DestVersion: "passes"}) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if checks != 2 { - t.Errorf("Registered functions did not get called.") - } -} - -func TestConverter_flags(t *testing.T) { - type Foo struct{ A string } - type Bar struct{ A string } - table := []struct { - from, to interface{} - flags FieldMatchingFlags - shouldSucceed bool - }{ - // Check that DestFromSource allows extra fields only in source. - { - from: &struct{ A string }{}, - to: &struct{ A, B string }{}, - flags: DestFromSource, - shouldSucceed: false, - }, { - from: &struct{ A, B string }{}, - to: &struct{ A string }{}, - flags: DestFromSource, - shouldSucceed: true, - }, - - // Check that SourceToDest allows for extra fields only in dest. - { - from: &struct{ A string }{}, - to: &struct{ A, B string }{}, - flags: SourceToDest, - shouldSucceed: true, - }, { - from: &struct{ A, B string }{}, - to: &struct{ A string }{}, - flags: SourceToDest, - shouldSucceed: false, - }, - - // Check that IgnoreMissingFields makes the above failure cases pass. - { - from: &struct{ A string }{}, - to: &struct{ A, B string }{}, - flags: DestFromSource | IgnoreMissingFields, - shouldSucceed: true, - }, { - from: &struct{ A, B string }{}, - to: &struct{ A string }{}, - flags: SourceToDest | IgnoreMissingFields, - shouldSucceed: true, - }, - - // Check that the field type name must match unless - // AllowDifferentFieldTypeNames is specified. - { - from: &struct{ A, B Foo }{}, - to: &struct{ A Bar }{}, - flags: DestFromSource, - shouldSucceed: false, - }, { - from: &struct{ A Foo }{}, - to: &struct{ A, B Bar }{}, - flags: SourceToDest, - shouldSucceed: false, - }, { - from: &struct{ A, B Foo }{}, - to: &struct{ A Bar }{}, - flags: DestFromSource | AllowDifferentFieldTypeNames, - shouldSucceed: true, - }, { - from: &struct{ A Foo }{}, - to: &struct{ A, B Bar }{}, - flags: SourceToDest | AllowDifferentFieldTypeNames, - shouldSucceed: true, - }, - } - f := fuzz.New().NilChance(.5).NumElements(0, 100) - c := NewConverter(DefaultNameFunc) - c.Debug = testLogger(t) - - for i, item := range table { - for j := 0; j < *fuzzIters; j++ { - f.Fuzz(item.from) - err := c.Convert(item.from, item.to, item.flags, nil) - if item.shouldSucceed && err != nil { - t.Errorf("(%v, %v): unexpected error: %v", i, j, err) - continue - } - if !item.shouldSucceed && err == nil { - t.Errorf("(%v, %v): unexpected non-error", i, j) - continue - } - } - } -} - -func TestConverter_FieldRename(t *testing.T) { - type WeirdMeta struct { - Name string - Type string - } - type NameMeta struct { - Name string - } - type TypeMeta struct { - Type string - } - type A struct { - WeirdMeta - } - type B struct { - TypeMeta - NameMeta - } - - c := NewConverter(DefaultNameFunc) - err := c.SetStructFieldCopy(WeirdMeta{}, "WeirdMeta", TypeMeta{}, "TypeMeta") - if err != nil { - t.Fatalf("unexpected error %v", err) - } - err = c.SetStructFieldCopy(WeirdMeta{}, "WeirdMeta", NameMeta{}, "NameMeta") - if err != nil { - t.Fatalf("unexpected error %v", err) - } - err = c.SetStructFieldCopy(TypeMeta{}, "TypeMeta", WeirdMeta{}, "WeirdMeta") - if err != nil { - t.Fatalf("unexpected error %v", err) - } - err = c.SetStructFieldCopy(NameMeta{}, "NameMeta", WeirdMeta{}, "WeirdMeta") - if err != nil { - t.Fatalf("unexpected error %v", err) - } - c.Debug = testLogger(t) - - aVal := &A{ - WeirdMeta: WeirdMeta{ - Name: "Foo", - Type: "Bar", - }, - } - - bVal := &B{ - TypeMeta: TypeMeta{"Bar"}, - NameMeta: NameMeta{"Foo"}, - } - - table := map[string]struct { - from, to, expect interface{} - flags FieldMatchingFlags - }{ - "to": { - aVal, - &B{}, - bVal, - AllowDifferentFieldTypeNames | SourceToDest | IgnoreMissingFields, - }, - "from": { - bVal, - &A{}, - aVal, - AllowDifferentFieldTypeNames | SourceToDest, - }, - "toDestFirst": { - aVal, - &B{}, - bVal, - AllowDifferentFieldTypeNames, - }, - "fromDestFirst": { - bVal, - &A{}, - aVal, - AllowDifferentFieldTypeNames | IgnoreMissingFields, - }, - } - - for name, item := range table { - err := c.Convert(item.from, item.to, item.flags, nil) - if err != nil { - t.Errorf("%v: unexpected error: %v", name, err) - continue - } - if e, a := item.expect, item.to; !reflect.DeepEqual(e, a) { - t.Errorf("%v: unexpected diff: %v", name, objDiff(e, a)) - } - } -} - -func objDiff(a, b interface{}) string { - ab, err := json.Marshal(a) - if err != nil { - panic("a") - } - bb, err := json.Marshal(b) - if err != nil { - panic("b") - } - return diff.StringDiff(string(ab), string(bb)) - - // An alternate diff attempt, in case json isn't showing you - // the difference. (reflect.DeepEqual makes a distinction between - // nil and empty slices, for example.) - //return diff.StringDiff( - // fmt.Sprintf("%#v", a), - // fmt.Sprintf("%#v", b), - //) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/deep_copy_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/deep_copy_test.go deleted file mode 100644 index a1cd65308..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/deep_copy_test.go +++ /dev/null @@ -1,161 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 conversion - -import ( - "math/rand" - "reflect" - "testing" - - "github.com/google/gofuzz" -) - -func TestDeepCopy(t *testing.T) { - semantic := EqualitiesOrDie() - f := fuzz.New().NilChance(.5).NumElements(0, 100) - table := []interface{}{ - map[string]string{}, - int(5), - "hello world", - struct { - A, B, C struct { - D map[string]int - } - X []int - Y []byte - }{}, - } - for _, obj := range table { - obj2, err := NewCloner().DeepCopy(obj) - if err != nil { - t.Errorf("Error: couldn't copy %#v", obj) - continue - } - if e, a := obj, obj2; !semantic.DeepEqual(e, a) { - t.Errorf("expected %#v\ngot %#v", e, a) - } - - obj3 := reflect.New(reflect.TypeOf(obj)).Interface() - f.Fuzz(obj3) - obj4, err := NewCloner().DeepCopy(obj3) - if err != nil { - t.Errorf("Error: couldn't copy %#v", obj) - continue - } - if e, a := obj3, obj4; !semantic.DeepEqual(e, a) { - t.Errorf("expected %#v\ngot %#v", e, a) - } - f.Fuzz(obj3) - } -} - -func copyOrDie(t *testing.T, in interface{}) interface{} { - out, err := NewCloner().DeepCopy(in) - if err != nil { - t.Fatalf("DeepCopy failed: %#q: %v", in, err) - } - return out -} - -func TestDeepCopySliceSeparate(t *testing.T) { - x := []int{5} - y := copyOrDie(t, x).([]int) - x[0] = 3 - if y[0] == 3 { - t.Errorf("deep copy wasn't deep: %#q %#q", x, y) - } -} - -func TestDeepCopyArraySeparate(t *testing.T) { - x := [1]int{5} - y := copyOrDie(t, x).([1]int) - x[0] = 3 - if y[0] == 3 { - t.Errorf("deep copy wasn't deep: %#q %#q", x, y) - } -} - -func TestDeepCopyMapSeparate(t *testing.T) { - x := map[string]int{"foo": 5} - y := copyOrDie(t, x).(map[string]int) - x["foo"] = 3 - if y["foo"] == 3 { - t.Errorf("deep copy wasn't deep: %#q %#q", x, y) - } -} - -func TestDeepCopyPointerSeparate(t *testing.T) { - z := 5 - x := &z - y := copyOrDie(t, x).(*int) - *x = 3 - if *y == 3 { - t.Errorf("deep copy wasn't deep: %#q %#q", x, y) - } -} - -func TestDeepCopyStruct(t *testing.T) { - type Foo struct { - A int - } - type Bar struct { - Foo - F *Foo - } - a := &Bar{Foo{1}, &Foo{2}} - b := copyOrDie(t, a).(*Bar) - a.A = 3 - a.F.A = 4 - - if b.A != 1 || b.F.A != 2 { - t.Errorf("deep copy wasn't deep: %#v, %#v", a, b) - } -} - -var result interface{} - -func BenchmarkDeepCopy(b *testing.B) { - table := []interface{}{ - map[string]string{}, - int(5), - "hello world", - struct { - A, B, C struct { - D map[string]int - } - X []int - Y []byte - }{}, - } - - f := fuzz.New().RandSource(rand.NewSource(1)).NilChance(.5).NumElements(0, 100) - for i := range table { - out := table[i] - obj := reflect.New(reflect.TypeOf(out)).Interface() - f.Fuzz(obj) - table[i] = obj - } - - b.ResetTimer() - var r interface{} - for i := 0; i < b.N; i++ { - for j := range table { - r, _ = NewCloner().DeepCopy(table[j]) - } - } - result = r -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/helper_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/helper_test.go deleted file mode 100644 index 69fef3334..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/helper_test.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 conversion - -import "testing" - -func TestInvalidPtrValueKind(t *testing.T) { - var simple interface{} - switch obj := simple.(type) { - default: - _, err := EnforcePtr(obj) - if err == nil { - t.Errorf("Expected error on invalid kind") - } - } -} - -func TestEnforceNilPtr(t *testing.T) { - var nilPtr *struct{} - _, err := EnforcePtr(nilPtr) - if err == nil { - t.Errorf("Expected error on nil pointer") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/queryparams/convert_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/queryparams/convert_test.go deleted file mode 100644 index cbeeeca73..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/conversion/queryparams/convert_test.go +++ /dev/null @@ -1,211 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 queryparams_test - -import ( - "net/url" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/conversion/queryparams" -) - -type namedString string -type namedBool bool - -type bar struct { - Float1 float32 `json:"float1"` - Float2 float64 `json:"float2"` - Int1 int64 `json:"int1,omitempty"` - Int2 int32 `json:"int2,omitempty"` - Int3 int16 `json:"int3,omitempty"` - Str1 string `json:"str1,omitempty"` - Ignored int - Ignored2 string -} - -func (obj *bar) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -type foo struct { - Str string `json:"str"` - Integer int `json:"integer,omitempty"` - Slice []string `json:"slice,omitempty"` - Boolean bool `json:"boolean,omitempty"` - NamedStr namedString `json:"namedStr,omitempty"` - NamedBool namedBool `json:"namedBool,omitempty"` - Foobar bar `json:"foobar,omitempty"` - Testmap map[string]string `json:"testmap,omitempty"` -} - -func (obj *foo) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -type baz struct { - Ptr *int `json:"ptr"` - Bptr *bool `json:"bptr,omitempty"` -} - -func (obj *baz) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -// childStructs tests some of the types we serialize to query params for log API calls -// notably, the nested time struct -type childStructs struct { - Container string `json:"container,omitempty"` - Follow bool `json:"follow,omitempty"` - Previous bool `json:"previous,omitempty"` - SinceSeconds *int64 `json:"sinceSeconds,omitempty"` - SinceTime *unversioned.Time `json:"sinceTime,omitempty"` - EmptyTime *unversioned.Time `json:"emptyTime"` -} - -func (obj *childStructs) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind } - -func validateResult(t *testing.T, input interface{}, actual, expected url.Values) { - local := url.Values{} - for k, v := range expected { - local[k] = v - } - for k, v := range actual { - if ev, ok := local[k]; !ok || !reflect.DeepEqual(ev, v) { - if !ok { - t.Errorf("%#v: actual value key %s not found in expected map", input, k) - } else { - t.Errorf("%#v: values don't match: actual: %#v, expected: %#v", input, v, ev) - } - } - delete(local, k) - } - if len(local) > 0 { - t.Errorf("%#v: expected map has keys that were not found in actual map: %#v", input, local) - } -} - -func TestConvert(t *testing.T) { - sinceSeconds := int64(123) - sinceTime := unversioned.Date(2000, 1, 1, 12, 34, 56, 0, time.UTC) - - tests := []struct { - input interface{} - expected url.Values - }{ - { - input: &foo{ - Str: "hello", - }, - expected: url.Values{"str": {"hello"}}, - }, - { - input: &foo{ - Str: "test string", - Slice: []string{"one", "two", "three"}, - Integer: 234, - Boolean: true, - }, - expected: url.Values{"str": {"test string"}, "slice": {"one", "two", "three"}, "integer": {"234"}, "boolean": {"true"}}, - }, - { - input: &foo{ - Str: "named types", - NamedStr: "value1", - NamedBool: true, - }, - expected: url.Values{"str": {"named types"}, "namedStr": {"value1"}, "namedBool": {"true"}}, - }, - { - input: &foo{ - Str: "don't ignore embedded struct", - Foobar: bar{ - Float1: 5.0, - }, - }, - expected: url.Values{"str": {"don't ignore embedded struct"}, "float1": {"5"}, "float2": {"0"}}, - }, - { - // Ignore untagged fields - input: &bar{ - Float1: 23.5, - Float2: 100.7, - Int1: 1, - Int2: 2, - Int3: 3, - Ignored: 1, - Ignored2: "ignored", - }, - expected: url.Values{"float1": {"23.5"}, "float2": {"100.7"}, "int1": {"1"}, "int2": {"2"}, "int3": {"3"}}, - }, - { - // include fields that are not tagged omitempty - input: &foo{ - NamedStr: "named str", - }, - expected: url.Values{"str": {""}, "namedStr": {"named str"}}, - }, - { - input: &baz{ - Ptr: intp(5), - Bptr: boolp(true), - }, - expected: url.Values{"ptr": {"5"}, "bptr": {"true"}}, - }, - { - input: &baz{ - Bptr: boolp(true), - }, - expected: url.Values{"ptr": {""}, "bptr": {"true"}}, - }, - { - input: &baz{ - Ptr: intp(5), - }, - expected: url.Values{"ptr": {"5"}}, - }, - { - input: &childStructs{ - Container: "mycontainer", - Follow: true, - Previous: true, - SinceSeconds: &sinceSeconds, - SinceTime: &sinceTime, // test a custom marshaller - EmptyTime: nil, // test a nil custom marshaller without omitempty - }, - expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "sinceTime": {"2000-01-01T12:34:56Z"}, "emptyTime": {""}}, - }, - { - input: &childStructs{ - Container: "mycontainer", - Follow: true, - Previous: true, - SinceSeconds: &sinceSeconds, - SinceTime: nil, // test a nil custom marshaller with omitempty - }, - expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "emptyTime": {""}}, - }, - } - - for _, test := range tests { - result, err := queryparams.Convert(test.input) - if err != nil { - t.Errorf("Unexpected error while converting %#v: %v", test.input, err) - } - validateResult(t, test.input, result, test.expected) - } -} - -func intp(n int) *int { return &n } - -func boolp(b bool) *bool { return &b } diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials.go deleted file mode 100644 index aeb7316b3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws_credentials - -import ( - "encoding/base64" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ecr" - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/credentialprovider" -) - -var registryUrls = []string{"*.dkr.ecr.*.amazonaws.com"} - -// awsHandlerLogger is a handler that logs all AWS SDK requests -// Copied from cloudprovider/aws/log_handler.go -func awsHandlerLogger(req *request.Request) { - service := req.ClientInfo.ServiceName - - name := "?" - if req.Operation != nil { - name = req.Operation.Name - } - - glog.V(4).Infof("AWS request: %s %s", service, name) -} - -// An interface for testing purposes. -type tokenGetter interface { - GetAuthorizationToken(input *ecr.GetAuthorizationTokenInput) (*ecr.GetAuthorizationTokenOutput, error) -} - -// The canonical implementation -type ecrTokenGetter struct { - svc *ecr.ECR -} - -func (p *ecrTokenGetter) GetAuthorizationToken(input *ecr.GetAuthorizationTokenInput) (*ecr.GetAuthorizationTokenOutput, error) { - return p.svc.GetAuthorizationToken(input) -} - -// ecrProvider is a DockerConfigProvider that gets and refreshes 12-hour tokens -// from AWS to access ECR. -type ecrProvider struct { - getter tokenGetter -} - -// Not using the package init() function: this module should be initialized only -// if using the AWS cloud provider. This way, we avoid timeouts waiting for a -// non-existent provider. -func Init() { - credentialprovider.RegisterCredentialProvider("aws-ecr-key", - &credentialprovider.CachingDockerConfigProvider{ - Provider: &ecrProvider{}, - // Refresh credentials a little earlier before they expire - Lifetime: 11*time.Hour + 55*time.Minute, - }) -} - -// Enabled implements DockerConfigProvider.Enabled for the AWS token-based implementation. -// For now, it gets activated only if AWS was chosen as the cloud provider. -// TODO: figure how to enable it manually for deployments that are not on AWS but still -// use ECR somehow? -func (p *ecrProvider) Enabled() bool { - provider, err := cloudprovider.GetCloudProvider("aws", nil) - if err != nil { - glog.Errorf("while initializing AWS cloud provider %v", err) - return false - } - if provider == nil { - return false - } - - zones, ok := provider.Zones() - if !ok { - glog.Errorf("couldn't get Zones() interface") - return false - } - zone, err := zones.GetZone() - if err != nil { - glog.Errorf("while getting zone %v", err) - return false - } - if zone.Region == "" { - glog.Errorf("Region information is empty") - return false - } - - getter := &ecrTokenGetter{svc: ecr.New(session.New(&aws.Config{ - Credentials: nil, - Region: &zone.Region, - }))} - getter.svc.Handlers.Sign.PushFrontNamed(request.NamedHandler{ - Name: "k8s/logger", - Fn: awsHandlerLogger, - }) - p.getter = getter - - return true -} - -// LazyProvide implements DockerConfigProvider.LazyProvide. Should never be called. -func (p *ecrProvider) LazyProvide() *credentialprovider.DockerConfigEntry { - return nil -} - -// Provide implements DockerConfigProvider.Provide, refreshing ECR tokens on demand -func (p *ecrProvider) Provide() credentialprovider.DockerConfig { - cfg := credentialprovider.DockerConfig{} - - // TODO: fill in RegistryIds? - params := &ecr.GetAuthorizationTokenInput{} - output, err := p.getter.GetAuthorizationToken(params) - if err != nil { - glog.Errorf("while requesting ECR authorization token %v", err) - return cfg - } - if output == nil { - glog.Errorf("Got back no ECR token") - return cfg - } - - for _, data := range output.AuthorizationData { - if data.ProxyEndpoint != nil && - data.AuthorizationToken != nil { - decodedToken, err := base64.StdEncoding.DecodeString(aws.StringValue(data.AuthorizationToken)) - if err != nil { - glog.Errorf("while decoding token for endpoint %v %v", data.ProxyEndpoint, err) - return cfg - } - parts := strings.SplitN(string(decodedToken), ":", 2) - user := parts[0] - password := parts[1] - entry := credentialprovider.DockerConfigEntry{ - Username: user, - Password: password, - // ECR doesn't care and Docker is about to obsolete it - Email: "not@val.id", - } - - // Add our entry for each of the supported container registry URLs - for _, k := range registryUrls { - cfg[k] = entry - } - } - } - return cfg -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials_test.go deleted file mode 100644 index a07493993..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/aws/aws_credentials_test.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 aws_credentials - -import ( - "encoding/base64" - "fmt" - "path" - "testing" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ecr" - - "k8s.io/kubernetes/pkg/credentialprovider" -) - -const user = "foo" -const password = "1234567890abcdef" -const email = "not@val.id" - -// Mock implementation -type testTokenGetter struct { - user string - password string - endpoint string -} - -func (p *testTokenGetter) GetAuthorizationToken(input *ecr.GetAuthorizationTokenInput) (*ecr.GetAuthorizationTokenOutput, error) { - - expiration := time.Now().Add(1 * time.Hour) - creds := []byte(fmt.Sprintf("%s:%s", p.user, p.password)) - data := &ecr.AuthorizationData{ - AuthorizationToken: aws.String(base64.StdEncoding.EncodeToString(creds)), - ExpiresAt: &expiration, - ProxyEndpoint: aws.String(p.endpoint), - } - output := &ecr.GetAuthorizationTokenOutput{ - AuthorizationData: []*ecr.AuthorizationData{data}, - } - - return output, nil //p.svc.GetAuthorizationToken(input) -} - -func TestEcrProvide(t *testing.T) { - registry := "123456789012.dkr.ecr.lala-land-1.amazonaws.com" - otherRegistries := []string{"private.registry.com", - "gcr.io", - } - image := "foo/bar" - - provider := &ecrProvider{ - getter: &testTokenGetter{ - user: user, - password: password, - endpoint: registry}, - } - - keyring := &credentialprovider.BasicDockerKeyring{} - keyring.Add(provider.Provide()) - - // Verify that we get the expected username/password combo for - // an ECR image name. - fullImage := path.Join(registry, image) - creds, ok := keyring.Lookup(fullImage) - if !ok { - t.Errorf("Didn't find expected URL: %s", fullImage) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if user != val.Username { - t.Errorf("Unexpected username value, want: _token, got: %s", val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } - - // Verify that we get an error for other images. - for _, otherRegistry := range otherRegistries { - fullImage = path.Join(otherRegistry, image) - creds, ok = keyring.Lookup(fullImage) - if ok { - t.Errorf("Unexpectedly found image: %s", fullImage) - return - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/config_test.go deleted file mode 100644 index 587879fe9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/config_test.go +++ /dev/null @@ -1,225 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 credentialprovider - -import ( - "encoding/json" - "reflect" - "testing" -) - -func TestDockerConfigJsonJSONDecode(t *testing.T) { - input := []byte(`{"auths": {"http://foo.example.com":{"username": "foo", "password": "bar", "email": "foo@example.com"}, "http://bar.example.com":{"username": "bar", "password": "baz", "email": "bar@example.com"}}}`) - - expect := DockerConfigJson{ - Auths: DockerConfig(map[string]DockerConfigEntry{ - "http://foo.example.com": { - Username: "foo", - Password: "bar", - Email: "foo@example.com", - }, - "http://bar.example.com": { - Username: "bar", - Password: "baz", - Email: "bar@example.com", - }, - }), - } - - var output DockerConfigJson - err := json.Unmarshal(input, &output) - if err != nil { - t.Errorf("Received unexpected error: %v", err) - } - - if !reflect.DeepEqual(expect, output) { - t.Errorf("Received unexpected output. Expected %#v, got %#v", expect, output) - } -} - -func TestDockerConfigJSONDecode(t *testing.T) { - input := []byte(`{"http://foo.example.com":{"username": "foo", "password": "bar", "email": "foo@example.com"}, "http://bar.example.com":{"username": "bar", "password": "baz", "email": "bar@example.com"}}`) - - expect := DockerConfig(map[string]DockerConfigEntry{ - "http://foo.example.com": { - Username: "foo", - Password: "bar", - Email: "foo@example.com", - }, - "http://bar.example.com": { - Username: "bar", - Password: "baz", - Email: "bar@example.com", - }, - }) - - var output DockerConfig - err := json.Unmarshal(input, &output) - if err != nil { - t.Errorf("Received unexpected error: %v", err) - } - - if !reflect.DeepEqual(expect, output) { - t.Errorf("Received unexpected output. Expected %#v, got %#v", expect, output) - } -} - -func TestDockerConfigEntryJSONDecode(t *testing.T) { - tests := []struct { - input []byte - expect DockerConfigEntry - fail bool - }{ - // simple case, just decode the fields - { - input: []byte(`{"username": "foo", "password": "bar", "email": "foo@example.com"}`), - expect: DockerConfigEntry{ - Username: "foo", - Password: "bar", - Email: "foo@example.com", - }, - fail: false, - }, - - // auth field decodes to username & password - { - input: []byte(`{"auth": "Zm9vOmJhcg==", "email": "foo@example.com"}`), - expect: DockerConfigEntry{ - Username: "foo", - Password: "bar", - Email: "foo@example.com", - }, - fail: false, - }, - - // auth field overrides username & password - { - input: []byte(`{"username": "foo", "password": "bar", "auth": "cGluZzpwb25n", "email": "foo@example.com"}`), - expect: DockerConfigEntry{ - Username: "ping", - Password: "pong", - Email: "foo@example.com", - }, - fail: false, - }, - - // poorly-formatted auth causes failure - { - input: []byte(`{"auth": "pants", "email": "foo@example.com"}`), - expect: DockerConfigEntry{ - Username: "", - Password: "", - Email: "foo@example.com", - }, - fail: true, - }, - - // invalid JSON causes failure - { - input: []byte(`{"email": false}`), - expect: DockerConfigEntry{ - Username: "", - Password: "", - Email: "", - }, - fail: true, - }, - } - - for i, tt := range tests { - var output DockerConfigEntry - err := json.Unmarshal(tt.input, &output) - if (err != nil) != tt.fail { - t.Errorf("case %d: expected fail=%t, got err=%v", i, tt.fail, err) - } - - if !reflect.DeepEqual(tt.expect, output) { - t.Errorf("case %d: expected output %#v, got %#v", i, tt.expect, output) - } - } -} - -func TestDecodeDockerConfigFieldAuth(t *testing.T) { - tests := []struct { - input string - username string - password string - fail bool - }{ - // auth field decodes to username & password - { - input: "Zm9vOmJhcg==", - username: "foo", - password: "bar", - }, - - // good base64 data, but no colon separating username & password - { - input: "cGFudHM=", - fail: true, - }, - - // bad base64 data - { - input: "pants", - fail: true, - }, - } - - for i, tt := range tests { - username, password, err := decodeDockerConfigFieldAuth(tt.input) - if (err != nil) != tt.fail { - t.Errorf("case %d: expected fail=%t, got err=%v", i, tt.fail, err) - } - - if tt.username != username { - t.Errorf("case %d: expected username %q, got %q", i, tt.username, username) - } - - if tt.password != password { - t.Errorf("case %d: expected password %q, got %q", i, tt.password, password) - } - } -} - -func TestDockerConfigEntryJSONCompatibleEncode(t *testing.T) { - tests := []struct { - input DockerConfigEntry - expect []byte - }{ - // simple case, just decode the fields - { - expect: []byte(`{"username":"foo","password":"bar","email":"foo@example.com","auth":"Zm9vOmJhcg=="}`), - input: DockerConfigEntry{ - Username: "foo", - Password: "bar", - Email: "foo@example.com", - }, - }, - } - - for i, tt := range tests { - actual, err := json.Marshal(tt.input) - if err != nil { - t.Errorf("case %d: unexpected error: %v", i, err) - } - - if string(tt.expect) != string(actual) { - t.Errorf("case %d: expected %v, got %v", i, string(tt.expect), string(actual)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/doc.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/doc.go deleted file mode 100644 index e6f2beba8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gcp_credentials contains implementations of DockerConfigProvider -// for Google Cloud Platform. -package gcp_credentials diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt.go deleted file mode 100644 index e4c16afa8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gcp_credentials - -import ( - "io/ioutil" - "time" - - "github.com/golang/glog" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "k8s.io/kubernetes/pkg/credentialprovider" - - "github.com/spf13/pflag" -) - -const ( - storageReadOnlyScope = "https://www.googleapis.com/auth/devstorage.read_only" -) - -var ( - flagJwtFile = pflag.String("google-json-key", "", - "The Google Cloud Platform Service Account JSON Key to use for authentication.") -) - -// A DockerConfigProvider that reads its configuration from Google -// Compute Engine metadata. -type jwtProvider struct { - path *string - config *jwt.Config - tokenUrl string -} - -// init registers the various means by which credentials may -// be resolved on GCP. -func init() { - credentialprovider.RegisterCredentialProvider("google-jwt-key", - &credentialprovider.CachingDockerConfigProvider{ - Provider: &jwtProvider{ - path: flagJwtFile, - }, - Lifetime: 30 * time.Minute, - }) -} - -// Enabled implements DockerConfigProvider for the JSON Key based implementation. -func (j *jwtProvider) Enabled() bool { - if *j.path == "" { - return false - } - - data, err := ioutil.ReadFile(*j.path) - if err != nil { - glog.Errorf("while reading file %s got %v", *j.path, err) - return false - } - config, err := google.JWTConfigFromJSON(data, storageReadOnlyScope) - if err != nil { - glog.Errorf("while parsing %s data got %v", *j.path, err) - return false - } - - j.config = config - if j.tokenUrl != "" { - j.config.TokenURL = j.tokenUrl - } - return true -} - -// LazyProvide implements DockerConfigProvider. Should never be called. -func (j *jwtProvider) LazyProvide() *credentialprovider.DockerConfigEntry { - return nil -} - -// Provide implements DockerConfigProvider -func (j *jwtProvider) Provide() credentialprovider.DockerConfig { - cfg := credentialprovider.DockerConfig{} - - ts := j.config.TokenSource(oauth2.NoContext) - token, err := ts.Token() - if err != nil { - glog.Errorf("while exchanging json key %s for access token %v", *j.path, err) - return cfg - } - if !token.Valid() { - glog.Errorf("Got back invalid token: %v", token) - return cfg - } - - entry := credentialprovider.DockerConfigEntry{ - Username: "_token", - Password: token.AccessToken, - Email: j.config.Email, - } - - // Add our entry for each of the supported container registry URLs - for _, k := range containerRegistryUrls { - cfg[k] = entry - } - return cfg -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt_test.go deleted file mode 100644 index 4066d02af..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/jwt_test.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gcp_credentials - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/credentialprovider" -) - -const email = "foo@bar.com" - -// From oauth2/jwt_test.go -var ( - dummyPrivateKey = `-----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAx4fm7dngEmOULNmAs1IGZ9Apfzh+BkaQ1dzkmbUgpcoghucE -DZRnAGd2aPyB6skGMXUytWQvNYav0WTR00wFtX1ohWTfv68HGXJ8QXCpyoSKSSFY -fuP9X36wBSkSX9J5DVgiuzD5VBdzUISSmapjKm+DcbRALjz6OUIPEWi1Tjl6p5RK -1w41qdbmt7E5/kGhKLDuT7+M83g4VWhgIvaAXtnhklDAggilPPa8ZJ1IFe31lNlr -k4DRk38nc6sEutdf3RL7QoH7FBusI7uXV03DC6dwN1kP4GE7bjJhcRb/7jYt7CQ9 -/E9Exz3c0yAp0yrTg0Fwh+qxfH9dKwN52S7SBwIDAQABAoIBAQCaCs26K07WY5Jt -3a2Cw3y2gPrIgTCqX6hJs7O5ByEhXZ8nBwsWANBUe4vrGaajQHdLj5OKfsIDrOvn -2NI1MqflqeAbu/kR32q3tq8/Rl+PPiwUsW3E6Pcf1orGMSNCXxeducF2iySySzh3 -nSIhCG5uwJDWI7a4+9KiieFgK1pt/Iv30q1SQS8IEntTfXYwANQrfKUVMmVF9aIK -6/WZE2yd5+q3wVVIJ6jsmTzoDCX6QQkkJICIYwCkglmVy5AeTckOVwcXL0jqw5Kf -5/soZJQwLEyBoQq7Kbpa26QHq+CJONetPP8Ssy8MJJXBT+u/bSseMb3Zsr5cr43e -DJOhwsThAoGBAPY6rPKl2NT/K7XfRCGm1sbWjUQyDShscwuWJ5+kD0yudnT/ZEJ1 -M3+KS/iOOAoHDdEDi9crRvMl0UfNa8MAcDKHflzxg2jg/QI+fTBjPP5GOX0lkZ9g -z6VePoVoQw2gpPFVNPPTxKfk27tEzbaffvOLGBEih0Kb7HTINkW8rIlzAoGBAM9y -1yr+jvfS1cGFtNU+Gotoihw2eMKtIqR03Yn3n0PK1nVCDKqwdUqCypz4+ml6cxRK -J8+Pfdh7D+ZJd4LEG6Y4QRDLuv5OA700tUoSHxMSNn3q9As4+T3MUyYxWKvTeu3U -f2NWP9ePU0lV8ttk7YlpVRaPQmc1qwooBA/z/8AdAoGAW9x0HWqmRICWTBnpjyxx -QGlW9rQ9mHEtUotIaRSJ6K/F3cxSGUEkX1a3FRnp6kPLcckC6NlqdNgNBd6rb2rA -cPl/uSkZP42Als+9YMoFPU/xrrDPbUhu72EDrj3Bllnyb168jKLa4VBOccUvggxr -Dm08I1hgYgdN5huzs7y6GeUCgYEAj+AZJSOJ6o1aXS6rfV3mMRve9bQ9yt8jcKXw -5HhOCEmMtaSKfnOF1Ziih34Sxsb7O2428DiX0mV/YHtBnPsAJidL0SdLWIapBzeg -KHArByIRkwE6IvJvwpGMdaex1PIGhx5i/3VZL9qiq/ElT05PhIb+UXgoWMabCp84 -OgxDK20CgYAeaFo8BdQ7FmVX2+EEejF+8xSge6WVLtkaon8bqcn6P0O8lLypoOhd -mJAYH8WU+UAy9pecUnDZj14LAGNVmYcse8HFX71MoshnvCTFEPVo4rZxIAGwMpeJ -5jgQ3slYLpqrGlcbLgUXBUgzEO684Wk/UV9DFPlHALVqCfXQ9dpJPg== ------END RSA PRIVATE KEY-----` - - jsonKey = fmt.Sprintf(`{"private_key":"%[1]s", "client_email":"%[2]s"}`, - strings.Replace(dummyPrivateKey, "\n", "\\n", -1), email) -) - -func TestJwtProvider(t *testing.T) { - token := "asdhflkjsdfkjhsdf" - - // Modeled after oauth2/jwt_test.go - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(fmt.Sprintf(`{ - "access_token": "%[1]s", - "scope": "user", - "token_type": "bearer", - "expires_in": 3600 - }`, token))) - })) - defer ts.Close() - - file, err := ioutil.TempFile(os.TempDir(), "temp") - if err != nil { - t.Fatalf("Error creating temp file: %v", err) - } - - filename := file.Name() - _, err = file.WriteString(jsonKey) - if err != nil { - t.Fatalf("Error writing temp file: %v", err) - } - - provider := &jwtProvider{ - path: &filename, - tokenUrl: ts.URL, - } - if !provider.Enabled() { - t.Fatalf("Provider is unexpectedly disabled") - } - - keyring := &credentialprovider.BasicDockerKeyring{} - keyring.Add(provider.Provide()) - - // Verify that we get the expected username/password combo for - // a gcr.io image name. - registryUrl := "gcr.io/foo/bar" - creds, ok := keyring.Lookup(registryUrl) - if !ok { - t.Errorf("Didn't find expected URL: %s", registryUrl) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if "_token" != val.Username { - t.Errorf("Unexpected username value, want: _token, got: %s", val.Username) - } - if token != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", token, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go deleted file mode 100644 index fb89b38c0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata.go +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gcp_credentials - -import ( - "encoding/json" - "net/http" - "strings" - "time" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/credentialprovider" -) - -const ( - metadataUrl = "http://metadata.google.internal./computeMetadata/v1/" - metadataAttributes = metadataUrl + "instance/attributes/" - dockerConfigKey = metadataAttributes + "google-dockercfg" - dockerConfigUrlKey = metadataAttributes + "google-dockercfg-url" - metadataScopes = metadataUrl + "instance/service-accounts/default/scopes" - metadataToken = metadataUrl + "instance/service-accounts/default/token" - metadataEmail = metadataUrl + "instance/service-accounts/default/email" - storageScopePrefix = "https://www.googleapis.com/auth/devstorage" - cloudPlatformScopePrefix = "https://www.googleapis.com/auth/cloud-platform" -) - -// For these urls, the parts of the host name can be glob, for example '*.gcr.io" will match -// "foo.gcr.io" and "bar.gcr.io". -var containerRegistryUrls = []string{"container.cloud.google.com", "gcr.io", "*.gcr.io"} - -var metadataHeader = &http.Header{ - "Metadata-Flavor": []string{"Google"}, -} - -// A DockerConfigProvider that reads its configuration from Google -// Compute Engine metadata. -type metadataProvider struct { - Client *http.Client -} - -// A DockerConfigProvider that reads its configuration from a specific -// Google Compute Engine metadata key: 'google-dockercfg'. -type dockerConfigKeyProvider struct { - metadataProvider -} - -// A DockerConfigProvider that reads its configuration from a URL read from -// a specific Google Compute Engine metadata key: 'google-dockercfg-url'. -type dockerConfigUrlKeyProvider struct { - metadataProvider -} - -// A DockerConfigProvider that provides a dockercfg with: -// Username: "_token" -// Password: "{access token from metadata}" -type containerRegistryProvider struct { - metadataProvider -} - -// init registers the various means by which credentials may -// be resolved on GCP. -func init() { - credentialprovider.RegisterCredentialProvider("google-dockercfg", - &credentialprovider.CachingDockerConfigProvider{ - Provider: &dockerConfigKeyProvider{ - metadataProvider{Client: http.DefaultClient}, - }, - Lifetime: 60 * time.Second, - }) - - credentialprovider.RegisterCredentialProvider("google-dockercfg-url", - &credentialprovider.CachingDockerConfigProvider{ - Provider: &dockerConfigUrlKeyProvider{ - metadataProvider{Client: http.DefaultClient}, - }, - Lifetime: 60 * time.Second, - }) - - credentialprovider.RegisterCredentialProvider("google-container-registry", - // Never cache this. The access token is already - // cached by the metadata service. - &containerRegistryProvider{ - metadataProvider{Client: http.DefaultClient}, - }) -} - -// Enabled implements DockerConfigProvider for all of the Google implementations. -func (g *metadataProvider) Enabled() bool { - _, err := credentialprovider.ReadUrl(metadataUrl, g.Client, metadataHeader) - return err == nil -} - -// LazyProvide implements DockerConfigProvider. Should never be called. -func (g *dockerConfigKeyProvider) LazyProvide() *credentialprovider.DockerConfigEntry { - return nil -} - -// Provide implements DockerConfigProvider -func (g *dockerConfigKeyProvider) Provide() credentialprovider.DockerConfig { - // Read the contents of the google-dockercfg metadata key and - // parse them as an alternate .dockercfg - if cfg, err := credentialprovider.ReadDockerConfigFileFromUrl(dockerConfigKey, g.Client, metadataHeader); err != nil { - glog.Errorf("while reading 'google-dockercfg' metadata: %v", err) - } else { - return cfg - } - - return credentialprovider.DockerConfig{} -} - -// LazyProvide implements DockerConfigProvider. Should never be called. -func (g *dockerConfigUrlKeyProvider) LazyProvide() *credentialprovider.DockerConfigEntry { - return nil -} - -// Provide implements DockerConfigProvider -func (g *dockerConfigUrlKeyProvider) Provide() credentialprovider.DockerConfig { - // Read the contents of the google-dockercfg-url key and load a .dockercfg from there - if url, err := credentialprovider.ReadUrl(dockerConfigUrlKey, g.Client, metadataHeader); err != nil { - glog.Errorf("while reading 'google-dockercfg-url' metadata: %v", err) - } else { - if strings.HasPrefix(string(url), "http") { - if cfg, err := credentialprovider.ReadDockerConfigFileFromUrl(string(url), g.Client, nil); err != nil { - glog.Errorf("while reading 'google-dockercfg-url'-specified url: %s, %v", string(url), err) - } else { - return cfg - } - } else { - // TODO(mattmoor): support reading alternate scheme URLs (e.g. gs:// or s3://) - glog.Errorf("Unsupported URL scheme: %s", string(url)) - } - } - - return credentialprovider.DockerConfig{} -} - -// Enabled implements a special metadata-based check, which verifies the -// storage scope is available on the GCE VM. -func (g *containerRegistryProvider) Enabled() bool { - value, err := credentialprovider.ReadUrl(metadataScopes+"?alt=json", g.Client, metadataHeader) - if err != nil { - return false - } - var scopes []string - if err := json.Unmarshal([]byte(value), &scopes); err != nil { - return false - } - - for _, v := range scopes { - // cloudPlatformScope implies storage scope. - if strings.HasPrefix(v, storageScopePrefix) || strings.HasPrefix(v, cloudPlatformScopePrefix) { - return true - } - } - glog.Warningf("Google container registry is disabled, no storage scope is available: %s", value) - return false -} - -// tokenBlob is used to decode the JSON blob containing an access token -// that is returned by GCE metadata. -type tokenBlob struct { - AccessToken string `json:"access_token"` -} - -// LazyProvide implements DockerConfigProvider. Should never be called. -func (g *containerRegistryProvider) LazyProvide() *credentialprovider.DockerConfigEntry { - return nil -} - -// Provide implements DockerConfigProvider -func (g *containerRegistryProvider) Provide() credentialprovider.DockerConfig { - cfg := credentialprovider.DockerConfig{} - - tokenJsonBlob, err := credentialprovider.ReadUrl(metadataToken, g.Client, metadataHeader) - if err != nil { - glog.Errorf("while reading access token endpoint: %v", err) - return cfg - } - - email, err := credentialprovider.ReadUrl(metadataEmail, g.Client, metadataHeader) - if err != nil { - glog.Errorf("while reading email endpoint: %v", err) - return cfg - } - - var parsedBlob tokenBlob - if err := json.Unmarshal([]byte(tokenJsonBlob), &parsedBlob); err != nil { - glog.Errorf("while parsing json blob %s: %v", tokenJsonBlob, err) - return cfg - } - - entry := credentialprovider.DockerConfigEntry{ - Username: "_token", - Password: parsedBlob.AccessToken, - Email: string(email), - } - - // Add our entry for each of the supported container registry URLs - for _, k := range containerRegistryUrls { - cfg[k] = entry - } - return cfg -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata_test.go deleted file mode 100644 index b65b13a01..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/gcp/metadata_test.go +++ /dev/null @@ -1,342 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 gcp_credentials - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/credentialprovider" - utilnet "k8s.io/kubernetes/pkg/util/net" -) - -func TestDockerKeyringFromGoogleDockerConfigMetadata(t *testing.T) { - registryUrl := "hello.kubernetes.io" - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, registryUrl, email, auth) - - const probeEndpoint = "/computeMetadata/v1/" - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Only serve the one metadata key. - if probeEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - } else if strings.HasSuffix(dockerConfigKey, r.URL.Path) { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - fmt.Fprintln(w, sampleDockerConfig) - } else { - w.WriteHeader(http.StatusNotFound) - } - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - keyring := &credentialprovider.BasicDockerKeyring{} - provider := &dockerConfigKeyProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - } - - if !provider.Enabled() { - t.Errorf("Provider is unexpectedly disabled") - } - - keyring.Add(provider.Provide()) - - creds, ok := keyring.Lookup(registryUrl) - if !ok { - t.Errorf("Didn't find expected URL: %s", registryUrl) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestDockerKeyringFromGoogleDockerConfigMetadataUrl(t *testing.T) { - registryUrl := "hello.kubernetes.io" - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, registryUrl, email, auth) - - const probeEndpoint = "/computeMetadata/v1/" - const valueEndpoint = "/my/value" - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Only serve the URL key and the value endpoint - if probeEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - } else if valueEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - fmt.Fprintln(w, sampleDockerConfig) - } else if strings.HasSuffix(dockerConfigUrlKey, r.URL.Path) { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/text") - fmt.Fprint(w, "http://foo.bar.com"+valueEndpoint) - } else { - w.WriteHeader(http.StatusNotFound) - } - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - keyring := &credentialprovider.BasicDockerKeyring{} - provider := &dockerConfigUrlKeyProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - } - - if !provider.Enabled() { - t.Errorf("Provider is unexpectedly disabled") - } - - keyring.Add(provider.Provide()) - - creds, ok := keyring.Lookup(registryUrl) - if !ok { - t.Errorf("Didn't find expected URL: %s", registryUrl) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestContainerRegistryBasics(t *testing.T) { - registryUrl := "container.cloud.google.com" - email := "1234@project.gserviceaccount.com" - token := &tokenBlob{AccessToken: "ya26.lots-of-indiscernible-garbage"} - - const ( - defaultEndpoint = "/computeMetadata/v1/instance/service-accounts/default/" - scopeEndpoint = defaultEndpoint + "scopes" - emailEndpoint = defaultEndpoint + "email" - tokenEndpoint = defaultEndpoint + "token" - ) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Only serve the URL key and the value endpoint - if scopeEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - fmt.Fprintf(w, `["%s.read_write"]`, storageScopePrefix) - } else if emailEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, email) - } else if tokenEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - bytes, err := json.Marshal(token) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - fmt.Fprintln(w, string(bytes)) - } else { - w.WriteHeader(http.StatusNotFound) - } - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - keyring := &credentialprovider.BasicDockerKeyring{} - provider := &containerRegistryProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - } - - if !provider.Enabled() { - t.Errorf("Provider is unexpectedly disabled") - } - - keyring.Add(provider.Provide()) - - creds, ok := keyring.Lookup(registryUrl) - if !ok { - t.Errorf("Didn't find expected URL: %s", registryUrl) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if "_token" != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", "_token", val.Username) - } - if token.AccessToken != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", token.AccessToken, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestContainerRegistryNoStorageScope(t *testing.T) { - const ( - defaultEndpoint = "/computeMetadata/v1/instance/service-accounts/default/" - scopeEndpoint = defaultEndpoint + "scopes" - ) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Only serve the URL key and the value endpoint - if scopeEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - fmt.Fprint(w, `["https://www.googleapis.com/auth/compute.read_write"]`) - } else { - w.WriteHeader(http.StatusNotFound) - } - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - provider := &containerRegistryProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - } - - if provider.Enabled() { - t.Errorf("Provider is unexpectedly enabled") - } -} - -func TestComputePlatformScopeSubstitutesStorageScope(t *testing.T) { - const ( - defaultEndpoint = "/computeMetadata/v1/instance/service-accounts/default/" - scopeEndpoint = defaultEndpoint + "scopes" - ) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Only serve the URL key and the value endpoint - if scopeEndpoint == r.URL.Path { - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - fmt.Fprint(w, `["https://www.googleapis.com/auth/compute.read_write","https://www.googleapis.com/auth/cloud-platform.read-only"]`) - } else { - w.WriteHeader(http.StatusNotFound) - } - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - provider := &containerRegistryProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - } - - if !provider.Enabled() { - t.Errorf("Provider is unexpectedly disabled") - } -} - -func TestAllProvidersNoMetadata(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - })) - defer server.Close() - - // Make a transport that reroutes all traffic to the example server - transport := utilnet.SetTransportDefaults(&http.Transport{ - Proxy: func(req *http.Request) (*url.URL, error) { - return url.Parse(server.URL + req.URL.Path) - }, - }) - - providers := []credentialprovider.DockerConfigProvider{ - &dockerConfigKeyProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - }, - &dockerConfigUrlKeyProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - }, - &containerRegistryProvider{ - metadataProvider{Client: &http.Client{Transport: transport}}, - }, - } - - for _, provider := range providers { - if provider.Enabled() { - t.Errorf("Provider %s is unexpectedly enabled", reflect.TypeOf(provider).String()) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/keyring_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/keyring_test.go deleted file mode 100644 index 376e08017..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/keyring_test.go +++ /dev/null @@ -1,501 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 credentialprovider - -import ( - "encoding/base64" - "fmt" - "testing" -) - -func TestUrlsMatch(t *testing.T) { - tests := []struct { - globUrl string - targetUrl string - matchExpected bool - }{ - // match when there is no path component - { - globUrl: "*.kubernetes.io", - targetUrl: "prefix.kubernetes.io", - matchExpected: true, - }, - { - globUrl: "prefix.*.io", - targetUrl: "prefix.kubernetes.io", - matchExpected: true, - }, - { - globUrl: "prefix.kubernetes.*", - targetUrl: "prefix.kubernetes.io", - matchExpected: true, - }, - { - globUrl: "*-good.kubernetes.io", - targetUrl: "prefix-good.kubernetes.io", - matchExpected: true, - }, - // match with path components - { - globUrl: "*.kubernetes.io/blah", - targetUrl: "prefix.kubernetes.io/blah", - matchExpected: true, - }, - { - globUrl: "prefix.*.io/foo", - targetUrl: "prefix.kubernetes.io/foo/bar", - matchExpected: true, - }, - // match with path components and ports - { - globUrl: "*.kubernetes.io:1111/blah", - targetUrl: "prefix.kubernetes.io:1111/blah", - matchExpected: true, - }, - { - globUrl: "prefix.*.io:1111/foo", - targetUrl: "prefix.kubernetes.io:1111/foo/bar", - matchExpected: true, - }, - // no match when number of parts mismatch - { - globUrl: "*.kubernetes.io", - targetUrl: "kubernetes.io", - matchExpected: false, - }, - { - globUrl: "*.*.kubernetes.io", - targetUrl: "prefix.kubernetes.io", - matchExpected: false, - }, - { - globUrl: "*.*.kubernetes.io", - targetUrl: "kubernetes.io", - matchExpected: false, - }, - // no match when some parts mismatch - { - globUrl: "kubernetes.io", - targetUrl: "kubernetes.com", - matchExpected: false, - }, - { - globUrl: "k*.io", - targetUrl: "quay.io", - matchExpected: false, - }, - // no match when ports mismatch - { - globUrl: "*.kubernetes.io:1234/blah", - targetUrl: "prefix.kubernetes.io:1111/blah", - matchExpected: false, - }, - { - globUrl: "prefix.*.io/foo", - targetUrl: "prefix.kubernetes.io:1111/foo/bar", - matchExpected: false, - }, - } - for _, test := range tests { - matched, _ := urlsMatchStr(test.globUrl, test.targetUrl) - if matched != test.matchExpected { - t.Errorf("Expected match result of %s and %s to be %t, but was %t", - test.globUrl, test.targetUrl, test.matchExpected, matched) - } - } -} - -func TestDockerKeyringForGlob(t *testing.T) { - tests := []struct { - globUrl string - targetUrl string - }{ - { - globUrl: "https://hello.kubernetes.io", - targetUrl: "hello.kubernetes.io", - }, - { - globUrl: "https://*.docker.io", - targetUrl: "prefix.docker.io", - }, - { - globUrl: "https://prefix.*.io", - targetUrl: "prefix.docker.io", - }, - { - globUrl: "https://prefix.docker.*", - targetUrl: "prefix.docker.io", - }, - { - globUrl: "https://*.docker.io/path", - targetUrl: "prefix.docker.io/path", - }, - { - globUrl: "https://prefix.*.io/path", - targetUrl: "prefix.docker.io/path/subpath", - }, - { - globUrl: "https://prefix.docker.*/path", - targetUrl: "prefix.docker.io/path", - }, - { - globUrl: "https://*.docker.io:8888", - targetUrl: "prefix.docker.io:8888", - }, - { - globUrl: "https://prefix.*.io:8888", - targetUrl: "prefix.docker.io:8888", - }, - { - globUrl: "https://prefix.docker.*:8888", - targetUrl: "prefix.docker.io:8888", - }, - { - globUrl: "https://*.docker.io/path:1111", - targetUrl: "prefix.docker.io/path:1111", - }, - { - globUrl: "https://*.docker.io/v1/", - targetUrl: "prefix.docker.io/path:1111", - }, - { - globUrl: "https://*.docker.io/v2/", - targetUrl: "prefix.docker.io/path:1111", - }, - { - globUrl: "https://prefix.docker.*/path:1111", - targetUrl: "prefix.docker.io/path:1111", - }, - { - globUrl: "prefix.docker.io:1111", - targetUrl: "prefix.docker.io:1111/path", - }, - { - globUrl: "*.docker.io:1111", - targetUrl: "prefix.docker.io:1111/path", - }, - } - for i, test := range tests { - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "%s": { - "email": %q, - "auth": %q - } -}`, test.globUrl, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - creds, ok := keyring.Lookup(test.targetUrl + "/foo/bar") - if !ok { - t.Errorf("%d: Didn't find expected URL: %s", i, test.targetUrl) - continue - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } - } -} - -func TestKeyringMiss(t *testing.T) { - tests := []struct { - globUrl string - lookupUrl string - }{ - { - globUrl: "https://hello.kubernetes.io", - lookupUrl: "world.mesos.org/foo/bar", - }, - { - globUrl: "https://*.docker.com", - lookupUrl: "prefix.docker.io", - }, - { - globUrl: "https://suffix.*.io", - lookupUrl: "prefix.docker.io", - }, - { - globUrl: "https://prefix.docker.c*", - lookupUrl: "prefix.docker.io", - }, - { - globUrl: "https://prefix.*.io/path:1111", - lookupUrl: "prefix.docker.io/path/subpath:1111", - }, - { - globUrl: "suffix.*.io", - lookupUrl: "prefix.docker.io", - }, - } - for _, test := range tests { - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "%s": { - "email": %q, - "auth": %q - } -}`, test.globUrl, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - _, ok := keyring.Lookup(test.lookupUrl + "/foo/bar") - if ok { - t.Errorf("Expected not to find URL %s, but found", test.lookupUrl) - } - } - -} - -func TestKeyringMissWithDockerHubCredentials(t *testing.T) { - url := defaultRegistryKey - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, url, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - val, ok := keyring.Lookup("world.mesos.org/foo/bar") - if ok { - t.Errorf("Found unexpected credential: %+v", val) - } -} - -func TestKeyringHitWithUnqualifiedDockerHub(t *testing.T) { - url := defaultRegistryKey - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, url, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - creds, ok := keyring.Lookup("google/docker-registry") - if !ok { - t.Errorf("Didn't find expected URL: %s", url) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestKeyringHitWithUnqualifiedLibraryDockerHub(t *testing.T) { - url := defaultRegistryKey - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, url, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - creds, ok := keyring.Lookup("jenkins") - if !ok { - t.Errorf("Didn't find expected URL: %s", url) - return - } - if len(creds) > 1 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestKeyringHitWithQualifiedDockerHub(t *testing.T) { - url := defaultRegistryKey - email := "foo@bar.baz" - username := "foo" - password := "bar" - auth := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password))) - sampleDockerConfig := fmt.Sprintf(`{ - "https://%s": { - "email": %q, - "auth": %q - } -}`, url, email, auth) - - keyring := &BasicDockerKeyring{} - if cfg, err := readDockerConfigFileFromBytes([]byte(sampleDockerConfig)); err != nil { - t.Errorf("Error processing json blob %q, %v", sampleDockerConfig, err) - } else { - keyring.Add(cfg) - } - - creds, ok := keyring.Lookup(url + "/google/docker-registry") - if !ok { - t.Errorf("Didn't find expected URL: %s", url) - return - } - if len(creds) > 2 { - t.Errorf("Got more hits than expected: %s", creds) - } - val := creds[0] - - if username != val.Username { - t.Errorf("Unexpected username value, want: %s, got: %s", username, val.Username) - } - if password != val.Password { - t.Errorf("Unexpected password value, want: %s, got: %s", password, val.Password) - } - if email != val.Email { - t.Errorf("Unexpected email value, want: %s, got: %s", email, val.Email) - } -} - -func TestIsDefaultRegistryMatch(t *testing.T) { - samples := []map[bool]string{ - {true: "foo/bar"}, - {true: "docker.io/foo/bar"}, - {true: "index.docker.io/foo/bar"}, - {true: "foo"}, - {false: ""}, - {false: "registry.tld/foo/bar"}, - {false: "registry:5000/foo/bar"}, - {false: "myhostdocker.io/foo/bar"}, - } - for _, sample := range samples { - for expected, imageName := range sample { - if got := isDefaultRegistryMatch(imageName); got != expected { - t.Errorf("Expected '%s' to be %t, got %t", imageName, expected, got) - } - } - } -} - -type testProvider struct { - Count int -} - -// Enabled implements dockerConfigProvider -func (d *testProvider) Enabled() bool { - return true -} - -// LazyProvide implements dockerConfigProvider. Should never be called. -func (d *testProvider) LazyProvide() *DockerConfigEntry { - return nil -} - -// Provide implements dockerConfigProvider -func (d *testProvider) Provide() DockerConfig { - d.Count += 1 - return DockerConfig{} -} - -func TestLazyKeyring(t *testing.T) { - provider := &testProvider{ - Count: 0, - } - lazy := &lazyDockerKeyring{ - Providers: []DockerConfigProvider{ - provider, - }, - } - - if provider.Count != 0 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - lazy.Lookup("foo") - if provider.Count != 1 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - lazy.Lookup("foo") - if provider.Count != 2 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - lazy.Lookup("foo") - if provider.Count != 3 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/provider_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/provider_test.go deleted file mode 100644 index 099d839fb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/credentialprovider/provider_test.go +++ /dev/null @@ -1,62 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 credentialprovider - -import ( - "testing" - "time" -) - -func TestCachingProvider(t *testing.T) { - provider := &testProvider{ - Count: 0, - } - - cache := &CachingDockerConfigProvider{ - Provider: provider, - Lifetime: 1 * time.Second, - } - - if provider.Count != 0 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - cache.Provide() - cache.Provide() - cache.Provide() - cache.Provide() - if provider.Count != 1 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - - time.Sleep(cache.Lifetime) - cache.Provide() - cache.Provide() - cache.Provide() - cache.Provide() - if provider.Count != 2 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } - - time.Sleep(cache.Lifetime) - cache.Provide() - cache.Provide() - cache.Provide() - cache.Provide() - if provider.Count != 3 { - t.Errorf("Unexpected number of Provide calls: %v", provider.Count) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fieldpath/fieldpath_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fieldpath/fieldpath_test.go deleted file mode 100644 index d510426ee..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fieldpath/fieldpath_test.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 fieldpath - -import ( - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestExtractFieldPathAsString(t *testing.T) { - cases := []struct { - name string - fieldPath string - obj interface{} - expectedValue string - expectedMessageFragment string - }{ - { - name: "not an API object", - fieldPath: "metadata.name", - obj: "", - expectedMessageFragment: "expected struct", - }, - { - name: "ok - namespace", - fieldPath: "metadata.namespace", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: "object-namespace", - }, - }, - expectedValue: "object-namespace", - }, - { - name: "ok - name", - fieldPath: "metadata.name", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "object-name", - }, - }, - expectedValue: "object-name", - }, - { - name: "ok - labels", - fieldPath: "metadata.labels", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"key": "value"}, - }, - }, - expectedValue: "key=\"value\"\n", - }, - { - name: "ok - labels bslash n", - fieldPath: "metadata.labels", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"key": "value\n"}, - }, - }, - expectedValue: "key=\"value\\n\"\n", - }, - { - name: "ok - annotations", - fieldPath: "metadata.annotations", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"builder": "john-doe"}, - }, - }, - expectedValue: "builder=\"john-doe\"\n", - }, - - { - name: "invalid expression", - fieldPath: "metadata.whoops", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Namespace: "object-namespace", - }, - }, - expectedMessageFragment: "Unsupported fieldPath", - }, - } - - for _, tc := range cases { - actual, err := ExtractFieldPathAsString(tc.obj, tc.fieldPath) - if err != nil { - if tc.expectedMessageFragment != "" { - if !strings.Contains(err.Error(), tc.expectedMessageFragment) { - t.Errorf("%v: Unexpected error message: %q, expected to contain %q", tc.name, err, tc.expectedMessageFragment) - } - } else { - t.Errorf("%v: unexpected error: %v", tc.name, err) - } - } else if e := tc.expectedValue; e != "" && e != actual { - t.Errorf("%v: Unexpected result; got %q, expected %q", tc.name, actual, e) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/fields_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/fields_test.go deleted file mode 100644 index 9f6f3fc35..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/fields_test.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 fields - -import ( - "testing" -) - -func matches(t *testing.T, ls Set, want string) { - if ls.String() != want { - t.Errorf("Expected '%s', but got '%s'", want, ls.String()) - } -} - -func TestSetString(t *testing.T) { - matches(t, Set{"x": "y"}, "x=y") - matches(t, Set{"foo": "bar"}, "foo=bar") - matches(t, Set{"foo": "bar", "baz": "qup"}, "baz=qup,foo=bar") -} - -func TestFieldHas(t *testing.T) { - fieldHasTests := []struct { - Ls Fields - Key string - Has bool - }{ - {Set{"x": "y"}, "x", true}, - {Set{"x": ""}, "x", true}, - {Set{"x": "y"}, "foo", false}, - } - for _, lh := range fieldHasTests { - if has := lh.Ls.Has(lh.Key); has != lh.Has { - t.Errorf("%#v.Has(%#v) => %v, expected %v", lh.Ls, lh.Key, has, lh.Has) - } - } -} - -func TestFieldGet(t *testing.T) { - ls := Set{"x": "y"} - if ls.Get("x") != "y" { - t.Errorf("Set.Get is broken") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/selector_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/selector_test.go deleted file mode 100644 index 7651ae6bb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/fields/selector_test.go +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 fields - -import ( - "testing" -) - -func TestSelectorParse(t *testing.T) { - testGoodStrings := []string{ - "x=a,y=b,z=c", - "", - "x!=a,y=b", - } - testBadStrings := []string{ - "x=a||y=b", - "x==a==b", - } - for _, test := range testGoodStrings { - lq, err := ParseSelector(test) - if err != nil { - t.Errorf("%v: error %v (%#v)\n", test, err, err) - } - if test != lq.String() { - t.Errorf("%v restring gave: %v\n", test, lq.String()) - } - } - for _, test := range testBadStrings { - _, err := ParseSelector(test) - if err == nil { - t.Errorf("%v: did not get expected error\n", test) - } - } -} - -func TestDeterministicParse(t *testing.T) { - s1, err := ParseSelector("x=a,a=x") - s2, err2 := ParseSelector("a=x,x=a") - if err != nil || err2 != nil { - t.Errorf("Unexpected parse error") - } - if s1.String() != s2.String() { - t.Errorf("Non-deterministic parse") - } -} - -func expectMatch(t *testing.T, selector string, ls Set) { - lq, err := ParseSelector(selector) - if err != nil { - t.Errorf("Unable to parse %v as a selector\n", selector) - return - } - if !lq.Matches(ls) { - t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) - } -} - -func expectNoMatch(t *testing.T, selector string, ls Set) { - lq, err := ParseSelector(selector) - if err != nil { - t.Errorf("Unable to parse %v as a selector\n", selector) - return - } - if lq.Matches(ls) { - t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) - } -} - -func TestEverything(t *testing.T) { - if !Everything().Matches(Set{"x": "y"}) { - t.Errorf("Nil selector didn't match") - } - if !Everything().Empty() { - t.Errorf("Everything was not empty") - } -} - -func TestSelectorMatches(t *testing.T) { - expectMatch(t, "", Set{"x": "y"}) - expectMatch(t, "x=y", Set{"x": "y"}) - expectMatch(t, "x=y,z=w", Set{"x": "y", "z": "w"}) - expectMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "a"}) - expectMatch(t, "notin=in", Set{"notin": "in"}) // in and notin in exactMatch - expectNoMatch(t, "x=y", Set{"x": "z"}) - expectNoMatch(t, "x=y,z=w", Set{"x": "w", "z": "w"}) - expectNoMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "w"}) - - labelset := Set{ - "foo": "bar", - "baz": "blah", - } - expectMatch(t, "foo=bar", labelset) - expectMatch(t, "baz=blah", labelset) - expectMatch(t, "foo=bar,baz=blah", labelset) - expectNoMatch(t, "foo=blah", labelset) - expectNoMatch(t, "baz=bar", labelset) - expectNoMatch(t, "foo=bar,foobar=bar,baz=blah", labelset) -} - -func TestOneTermEqualSelector(t *testing.T) { - if !OneTermEqualSelector("x", "y").Matches(Set{"x": "y"}) { - t.Errorf("No match when match expected.") - } - if OneTermEqualSelector("x", "y").Matches(Set{"x": "z"}) { - t.Errorf("Match when none expected.") - } -} - -func expectMatchDirect(t *testing.T, selector, ls Set) { - if !SelectorFromSet(selector).Matches(ls) { - t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) - } -} - -func expectNoMatchDirect(t *testing.T, selector, ls Set) { - if SelectorFromSet(selector).Matches(ls) { - t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) - } -} - -func TestSetMatches(t *testing.T) { - labelset := Set{ - "foo": "bar", - "baz": "blah", - } - expectMatchDirect(t, Set{}, labelset) - expectMatchDirect(t, Set{"foo": "bar"}, labelset) - expectMatchDirect(t, Set{"baz": "blah"}, labelset) - expectMatchDirect(t, Set{"foo": "bar", "baz": "blah"}, labelset) - expectNoMatchDirect(t, Set{"foo": "=blah"}, labelset) - expectNoMatchDirect(t, Set{"baz": "=bar"}, labelset) - expectNoMatchDirect(t, Set{"foo": "=bar", "foobar": "bar", "baz": "blah"}, labelset) -} - -func TestNilMapIsValid(t *testing.T) { - selector := Set(nil).AsSelector() - if selector == nil { - t.Errorf("Selector for nil set should be Everything") - } - if !selector.Empty() { - t.Errorf("Selector for nil set should be Empty") - } -} - -func TestSetIsEmpty(t *testing.T) { - if !(Set{}).AsSelector().Empty() { - t.Errorf("Empty set should be empty") - } - if !(andTerm(nil)).Empty() { - t.Errorf("Nil andTerm should be empty") - } - if (&hasTerm{}).Empty() { - t.Errorf("hasTerm should not be empty") - } - if (¬HasTerm{}).Empty() { - t.Errorf("notHasTerm should not be empty") - } - if !(andTerm{andTerm{}}).Empty() { - t.Errorf("Nested andTerm should be empty") - } - if (andTerm{&hasTerm{"a", "b"}}).Empty() { - t.Errorf("Nested andTerm should not be empty") - } -} - -func TestRequiresExactMatch(t *testing.T) { - testCases := map[string]struct { - S Selector - Label string - Value string - Found bool - }{ - "empty set": {Set{}.AsSelector(), "test", "", false}, - "nil andTerm": {andTerm(nil), "test", "", false}, - "empty hasTerm": {&hasTerm{}, "test", "", false}, - "skipped hasTerm": {&hasTerm{"a", "b"}, "test", "", false}, - "valid hasTerm": {&hasTerm{"test", "b"}, "test", "b", true}, - "valid hasTerm no value": {&hasTerm{"test", ""}, "test", "", true}, - "valid notHasTerm": {¬HasTerm{"test", "b"}, "test", "", false}, - "valid notHasTerm no value": {¬HasTerm{"test", ""}, "test", "", false}, - "nested andTerm": {andTerm{andTerm{}}, "test", "", false}, - "nested andTerm matches": {andTerm{&hasTerm{"test", "b"}}, "test", "b", true}, - "andTerm with non-match": {andTerm{&hasTerm{}, &hasTerm{"test", "b"}}, "test", "b", true}, - } - for k, v := range testCases { - value, found := v.S.RequiresExactMatch(v.Label) - if value != v.Value { - t.Errorf("%s: expected value %s, got %s", k, v.Value, value) - } - if found != v.Found { - t.Errorf("%s: expected found %t, got %t", k, v.Found, found) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/healthz/healthz_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/healthz/healthz_test.go deleted file mode 100644 index bfd833eb8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/healthz/healthz_test.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 healthz - -import ( - "errors" - "fmt" - "net/http" - "net/http/httptest" - "testing" -) - -func TestInstallHandler(t *testing.T) { - mux := http.NewServeMux() - InstallHandler(mux) - req, err := http.NewRequest("GET", "http://example.com/healthz", nil) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - w := httptest.NewRecorder() - mux.ServeHTTP(w, req) - if w.Code != http.StatusOK { - t.Errorf("Expected %v, got %v", http.StatusOK, w.Code) - } - if w.Body.String() != "ok" { - t.Errorf("Expected %v, got %v", "ok", w.Body.String()) - } -} - -func TestMulitipleChecks(t *testing.T) { - tests := []struct { - path string - expectedResponse string - expectedStatus int - addBadCheck bool - }{ - {"/healthz?verbose", "[+]ping ok\nhealthz check passed\n", http.StatusOK, false}, - {"/healthz/ping", "ok", http.StatusOK, false}, - {"/healthz", "ok", http.StatusOK, false}, - {"/healthz?verbose", "[+]ping ok\n[-]bad failed: this will fail\nhealthz check failed\n", http.StatusInternalServerError, true}, - {"/healthz/ping", "ok", http.StatusOK, true}, - {"/healthz/bad", "Internal server error: this will fail\n", http.StatusInternalServerError, true}, - {"/healthz", "[+]ping ok\n[-]bad failed: this will fail\nhealthz check failed\n", http.StatusInternalServerError, true}, - } - - for i, test := range tests { - mux := http.NewServeMux() - checks := []HealthzChecker{PingHealthz} - if test.addBadCheck { - checks = append(checks, NamedCheck("bad", func(_ *http.Request) error { - return errors.New("this will fail") - })) - } - InstallHandler(mux, checks...) - req, err := http.NewRequest("GET", fmt.Sprintf("http://example.com%v", test.path), nil) - if err != nil { - t.Fatalf("case[%d] Unexpected error: %v", i, err) - } - w := httptest.NewRecorder() - mux.ServeHTTP(w, req) - if w.Code != test.expectedStatus { - t.Errorf("case[%d] Expected: %v, got: %v", i, test.expectedStatus, w.Code) - } - if w.Body.String() != test.expectedResponse { - t.Errorf("case[%d] Expected:\n%v\ngot:\n%v\n", i, test.expectedResponse, w.Body.String()) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate.go deleted file mode 100644 index 3a081ad2d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate.go +++ /dev/null @@ -1,378 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "regexp" - "strings" - - "github.com/golang/glog" - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/strategicpatch" -) - -// AnnotateOptions have the data required to perform the annotate operation -type AnnotateOptions struct { - resources []string - newAnnotations map[string]string - removeAnnotations []string - builder *resource.Builder - filenames []string - selector string - - overwrite bool - all bool - resourceVersion string - - changeCause string - recordChangeCause bool - - f *cmdutil.Factory - out io.Writer - cmd *cobra.Command - - recursive bool -} - -const ( - annotate_resources = ` - pod (po), service (svc), replicationcontroller (rc), - node (no), event (ev), componentstatuse (cs), - limitrange (limits), persistentvolume (pv), persistentvolumeclaim (pvc), - horizontalpodautoscaler (hpa), resourcequota (quota), secret -` - - annotate_long = `Update the annotations on one or more resources. - -An annotation is a key/value pair that can hold larger (compared to a label), and possibly not human-readable, data. -It is intended to store non-identifying auxiliary data, especially data manipulated by tools and system extensions. -If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error. -If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used. - -Possible resources include (case insensitive):` + annotate_resources - - annotate_example = `# Update pod 'foo' with the annotation 'description' and the value 'my frontend'. -# If the same annotation is set multiple times, only the last value will be applied -kubectl annotate pods foo description='my frontend' - -# Update a pod identified by type and name in "pod.json" -kubectl annotate -f pod.json description='my frontend' - -# Update pod 'foo' with the annotation 'description' and the value 'my frontend running nginx', overwriting any existing value. -kubectl annotate --overwrite pods foo description='my frontend running nginx' - -# Update all pods in the namespace -kubectl annotate pods --all description='my frontend running nginx' - -# Update pod 'foo' only if the resource is unchanged from version 1. -kubectl annotate pods foo description='my frontend running nginx' --resource-version=1 - -# Update pod 'foo' by removing an annotation named 'description' if it exists. -# Does not require the --overwrite flag. -kubectl annotate pods foo description-` -) - -func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &AnnotateOptions{} - - validArgs, argAliases := []string{}, []string{} - resources := regexp.MustCompile(`\s*,`).Split(annotate_resources, -1) - for _, r := range resources { - validArgs = append(validArgs, strings.Fields(r)[0]) - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]", - Short: "Update the annotations on a resource", - Long: annotate_long, - Example: annotate_example, - Run: func(cmd *cobra.Command, args []string) { - if err := options.Complete(f, out, cmd, args); err != nil { - cmdutil.CheckErr(err) - } - if err := options.Validate(args); err != nil { - cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) - } - if err := options.RunAnnotate(); err != nil { - cmdutil.CheckErr(err) - } - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - cmd.Flags().StringVarP(&options.selector, "selector", "l", "", "Selector (label query) to filter on") - cmd.Flags().BoolVar(&options.overwrite, "overwrite", false, "If true, allow annotations to be overwritten, otherwise reject annotation updates that overwrite existing annotations.") - cmd.Flags().BoolVar(&options.all, "all", false, "select all resources in the namespace of the specified resource types") - cmd.Flags().StringVar(&options.resourceVersion, "resource-version", "", "If non-empty, the annotation update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.") - usage := "Filename, directory, or URL to a file identifying the resource to update the annotation" - kubectl.AddJsonFilenameFlag(cmd, &options.filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.recursive) - cmdutil.AddRecordFlag(cmd) - return cmd -} - -// Complete adapts from the command line args and factory to the data required. -func (o *AnnotateOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) (err error) { - - namespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - // retrieves resource and annotation args from args - // also checks args to verify that all resources are specified before annotations - annotationArgs := []string{} - metAnnotaionArg := false - for _, s := range args { - isAnnotation := strings.Contains(s, "=") || strings.HasSuffix(s, "-") - switch { - case !metAnnotaionArg && isAnnotation: - metAnnotaionArg = true - fallthrough - case metAnnotaionArg && isAnnotation: - annotationArgs = append(annotationArgs, s) - case !metAnnotaionArg && !isAnnotation: - o.resources = append(o.resources, s) - case metAnnotaionArg && !isAnnotation: - return fmt.Errorf("all resources must be specified before annotation changes: %s", s) - } - } - if len(o.resources) < 1 && len(o.filenames) == 0 { - return fmt.Errorf("one or more resources must be specified as or /") - } - if len(annotationArgs) < 1 { - return fmt.Errorf("at least one annotation update is required") - } - - if o.newAnnotations, o.removeAnnotations, err = parseAnnotations(annotationArgs); err != nil { - return err - } - - o.recordChangeCause = cmdutil.GetRecordFlag(cmd) - o.changeCause = f.Command() - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - o.builder = resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(namespace).DefaultNamespace(). - FilenameParam(enforceNamespace, o.recursive, o.filenames...). - SelectorParam(o.selector). - ResourceTypeOrNameArgs(o.all, o.resources...). - Flatten(). - Latest() - - o.f = f - o.out = out - o.cmd = cmd - - return nil -} - -// Validate checks to the AnnotateOptions to see if there is sufficient information run the command. -func (o AnnotateOptions) Validate(args []string) error { - if err := validateAnnotations(o.removeAnnotations, o.newAnnotations); err != nil { - return err - } - - // only apply resource version locking on a single resource - if len(o.resources) > 1 && len(o.resourceVersion) > 0 { - return fmt.Errorf("--resource-version may only be used with a single resource") - } - - return nil -} - -// RunAnnotate does the work -func (o AnnotateOptions) RunAnnotate() error { - r := o.builder.Do() - if err := r.Err(); err != nil { - return err - } - - return r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - obj, err := info.Mapping.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupVersion().String()) - if err != nil { - return err - } - name, namespace := info.Name, info.Namespace - oldData, err := json.Marshal(obj) - if err != nil { - return err - } - // If we should record change-cause, add it to new annotations - if cmdutil.ContainsChangeCause(info) || o.recordChangeCause { - o.newAnnotations[kubectl.ChangeCauseAnnotation] = o.changeCause - } - if err := o.updateAnnotations(obj); err != nil { - return err - } - newData, err := json.Marshal(obj) - if err != nil { - return err - } - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) - createdPatch := err == nil - if err != nil { - glog.V(2).Infof("couldn't compute patch: %v", err) - } - - mapping := info.ResourceMapping() - client, err := o.f.ClientForMapping(mapping) - if err != nil { - return err - } - helper := resource.NewHelper(client, mapping) - - var outputObj runtime.Object - if createdPatch { - outputObj, err = helper.Patch(namespace, name, api.StrategicMergePatchType, patchBytes) - } else { - outputObj, err = helper.Replace(namespace, name, false, obj) - } - if err != nil { - return err - } - - mapper, _ := o.f.Object(cmdutil.GetIncludeThirdPartyAPIs(o.cmd)) - outputFormat := cmdutil.GetFlagString(o.cmd, "output") - if outputFormat != "" { - return o.f.PrintObject(o.cmd, mapper, outputObj, o.out) - } - - cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, "annotated") - return nil - }) -} - -// parseAnnotations retrieves new and remove annotations from annotation args -func parseAnnotations(annotationArgs []string) (map[string]string, []string, error) { - var invalidBuf bytes.Buffer - newAnnotations := map[string]string{} - removeAnnotations := []string{} - for _, annotationArg := range annotationArgs { - if strings.Index(annotationArg, "=") != -1 { - parts := strings.SplitN(annotationArg, "=", 2) - if len(parts) != 2 || len(parts[1]) == 0 { - if invalidBuf.Len() > 0 { - invalidBuf.WriteString(", ") - } - invalidBuf.WriteString(fmt.Sprintf(annotationArg)) - } else { - newAnnotations[parts[0]] = parts[1] - } - } else if strings.HasSuffix(annotationArg, "-") { - removeAnnotations = append(removeAnnotations, annotationArg[:len(annotationArg)-1]) - } else { - if invalidBuf.Len() > 0 { - invalidBuf.WriteString(", ") - } - invalidBuf.WriteString(fmt.Sprintf(annotationArg)) - } - } - if invalidBuf.Len() > 0 { - return newAnnotations, removeAnnotations, fmt.Errorf("invalid annotation format: %s", invalidBuf.String()) - } - - return newAnnotations, removeAnnotations, nil -} - -// validateAnnotations checks the format of annotation args and checks removed annotations aren't in the new annotations map -func validateAnnotations(removeAnnotations []string, newAnnotations map[string]string) error { - var modifyRemoveBuf bytes.Buffer - for _, removeAnnotation := range removeAnnotations { - if _, found := newAnnotations[removeAnnotation]; found { - if modifyRemoveBuf.Len() > 0 { - modifyRemoveBuf.WriteString(", ") - } - modifyRemoveBuf.WriteString(fmt.Sprintf(removeAnnotation)) - } - } - if modifyRemoveBuf.Len() > 0 { - return fmt.Errorf("can not both modify and remove the following annotation(s) in the same command: %s", modifyRemoveBuf.String()) - } - - return nil -} - -// validateNoAnnotationOverwrites validates that when overwrite is false, to-be-updated annotations don't exist in the object annotation map (yet) -func validateNoAnnotationOverwrites(accessor meta.Object, annotations map[string]string) error { - var buf bytes.Buffer - for key := range annotations { - // change-cause annotation can always be overwritten - if key == kubectl.ChangeCauseAnnotation { - continue - } - if value, found := accessor.GetAnnotations()[key]; found { - if buf.Len() > 0 { - buf.WriteString("; ") - } - buf.WriteString(fmt.Sprintf("'%s' already has a value (%s)", key, value)) - } - } - if buf.Len() > 0 { - return fmt.Errorf("--overwrite is false but found the following declared annotation(s): %s", buf.String()) - } - return nil -} - -// updateAnnotations updates annotations of obj -func (o AnnotateOptions) updateAnnotations(obj runtime.Object) error { - accessor, err := meta.Accessor(obj) - if err != nil { - return err - } - if !o.overwrite { - if err := validateNoAnnotationOverwrites(accessor, o.newAnnotations); err != nil { - return err - } - } - - annotations := accessor.GetAnnotations() - if annotations == nil { - annotations = make(map[string]string) - } - - for key, value := range o.newAnnotations { - annotations[key] = value - } - for _, annotation := range o.removeAnnotations { - delete(annotations, annotation) - } - accessor.SetAnnotations(annotations) - - if len(o.resourceVersion) != 0 { - accessor.SetResourceVersion(o.resourceVersion) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate_test.go deleted file mode 100644 index 2cd94445e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/annotate_test.go +++ /dev/null @@ -1,571 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestValidateAnnotationOverwrites(t *testing.T) { - tests := []struct { - meta *api.ObjectMeta - annotations map[string]string - expectErr bool - scenario string - }{ - { - meta: &api.ObjectMeta{ - Annotations: map[string]string{ - "a": "A", - "b": "B", - }, - }, - annotations: map[string]string{ - "a": "a", - "c": "C", - }, - scenario: "share first annotation", - expectErr: true, - }, - { - meta: &api.ObjectMeta{ - Annotations: map[string]string{ - "a": "A", - "c": "C", - }, - }, - annotations: map[string]string{ - "b": "B", - "c": "c", - }, - scenario: "share second annotation", - expectErr: true, - }, - { - meta: &api.ObjectMeta{ - Annotations: map[string]string{ - "a": "A", - "c": "C", - }, - }, - annotations: map[string]string{ - "b": "B", - "d": "D", - }, - scenario: "no overlap", - }, - { - meta: &api.ObjectMeta{}, - annotations: map[string]string{ - "a": "A", - "b": "B", - }, - scenario: "no annotations", - }, - } - for _, test := range tests { - err := validateNoAnnotationOverwrites(test.meta, test.annotations) - if test.expectErr && err == nil { - t.Errorf("%s: unexpected non-error", test.scenario) - } else if !test.expectErr && err != nil { - t.Errorf("%s: unexpected error: %v", test.scenario, err) - } - } -} - -func TestParseAnnotations(t *testing.T) { - testURL := "https://test.com/index.htm?id=123#u=user-name" - testJSON := `'{"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicationController","namespace":"default","name":"my-nginx","uid":"c544ee78-2665-11e5-8051-42010af0c213","apiVersion":"v1","resourceVersion":"61368"}}'` - tests := []struct { - annotations []string - expected map[string]string - expectedRemove []string - scenario string - expectedErr string - expectErr bool - }{ - { - annotations: []string{"a=b", "c=d"}, - expected: map[string]string{"a": "b", "c": "d"}, - expectedRemove: []string{}, - scenario: "add two annotations", - expectErr: false, - }, - { - annotations: []string{"url=" + testURL, "kubernetes.io/created-by=" + testJSON}, - expected: map[string]string{"url": testURL, "kubernetes.io/created-by": testJSON}, - expectedRemove: []string{}, - scenario: "add annotations with special characters", - expectErr: false, - }, - { - annotations: []string{}, - expected: map[string]string{}, - expectedRemove: []string{}, - scenario: "add no annotations", - expectErr: false, - }, - { - annotations: []string{"a=b", "c=d", "e-"}, - expected: map[string]string{"a": "b", "c": "d"}, - expectedRemove: []string{"e"}, - scenario: "add two annotations, remove one", - expectErr: false, - }, - { - annotations: []string{"ab", "c=d"}, - expectedErr: "invalid annotation format: ab", - scenario: "incorrect annotation input (missing =value)", - expectErr: true, - }, - { - annotations: []string{"a="}, - expectedErr: "invalid annotation format: a=", - scenario: "incorrect annotation input (missing value)", - expectErr: true, - }, - { - annotations: []string{"ab", "a="}, - expectedErr: "invalid annotation format: ab, a=", - scenario: "incorrect multiple annotation input (missing value)", - expectErr: true, - }, - } - for _, test := range tests { - annotations, remove, err := parseAnnotations(test.annotations) - switch { - case test.expectErr && err == nil: - t.Errorf("%s: unexpected non-error, should return %v", test.scenario, test.expectedErr) - case test.expectErr && err.Error() != test.expectedErr: - t.Errorf("%s: unexpected error %v, expected %v", test.scenario, err, test.expectedErr) - case !test.expectErr && err != nil: - t.Errorf("%s: unexpected error %v", test.scenario, err) - case !test.expectErr && !reflect.DeepEqual(annotations, test.expected): - t.Errorf("%s: expected %v, got %v", test.scenario, test.expected, annotations) - case !test.expectErr && !reflect.DeepEqual(remove, test.expectedRemove): - t.Errorf("%s: expected %v, got %v", test.scenario, test.expectedRemove, remove) - } - } -} - -func TestValidateAnnotations(t *testing.T) { - tests := []struct { - removeAnnotations []string - newAnnotations map[string]string - expectedErr string - scenario string - }{ - { - expectedErr: "can not both modify and remove the following annotation(s) in the same command: a", - removeAnnotations: []string{"a"}, - newAnnotations: map[string]string{"a": "b", "c": "d"}, - scenario: "remove an added annotation", - }, - { - expectedErr: "can not both modify and remove the following annotation(s) in the same command: a, c", - removeAnnotations: []string{"a", "c"}, - newAnnotations: map[string]string{"a": "b", "c": "d"}, - scenario: "remove added annotations", - }, - } - for _, test := range tests { - if err := validateAnnotations(test.removeAnnotations, test.newAnnotations); err == nil { - t.Errorf("%s: unexpected non-error", test.scenario) - } else if err.Error() != test.expectedErr { - t.Errorf("%s: expected error %s, got %s", test.scenario, test.expectedErr, err.Error()) - } - } -} - -func TestUpdateAnnotations(t *testing.T) { - tests := []struct { - obj runtime.Object - overwrite bool - version string - annotations map[string]string - remove []string - expected runtime.Object - expectErr bool - }{ - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - annotations: map[string]string{"a": "b"}, - expectErr: true, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - annotations: map[string]string{"a": "c"}, - overwrite: true, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "c"}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - annotations: map[string]string{"c": "d"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b", "c": "d"}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - annotations: map[string]string{"c": "d"}, - version: "2", - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b", "c": "d"}, - ResourceVersion: "2", - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - annotations: map[string]string{}, - remove: []string{"a"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b", "c": "d"}, - }, - }, - annotations: map[string]string{"e": "f"}, - remove: []string{"a"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - "c": "d", - "e": "f", - }, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b", "c": "d"}, - }, - }, - annotations: map[string]string{"e": "f"}, - remove: []string{"g"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - "a": "b", - "c": "d", - "e": "f", - }, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b", "c": "d"}, - }, - }, - remove: []string{"e"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{ - "a": "b", - "c": "d", - }, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{}, - }, - annotations: map[string]string{"a": "b"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Annotations: map[string]string{"a": "b"}, - }, - }, - }, - } - for _, test := range tests { - options := &AnnotateOptions{ - overwrite: test.overwrite, - newAnnotations: test.annotations, - removeAnnotations: test.remove, - resourceVersion: test.version, - } - err := options.updateAnnotations(test.obj) - if test.expectErr { - if err == nil { - t.Errorf("unexpected non-error: %v", test) - } - continue - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v %v", err, test) - } - if !reflect.DeepEqual(test.obj, test.expected) { - t.Errorf("expected: %v, got %v", test.expected, test.obj) - } - } -} - -func TestAnnotateErrors(t *testing.T) { - testCases := map[string]struct { - args []string - flags map[string]string - errFn func(error) bool - }{ - "no args": { - args: []string{}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - "not enough annotations": { - args: []string{"pods"}, - errFn: func(err error) bool { - return strings.Contains(err.Error(), "at least one annotation update is required") - }, - }, - "no resources remove annotations": { - args: []string{"pods-"}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - "no resources add annotations": { - args: []string{"pods=bar"}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - } - - for k, testCase := range testCases { - f, tf, _ := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdAnnotate(f, buf) - cmd.SetOutput(buf) - - for k, v := range testCase.flags { - cmd.Flags().Set(k, v) - } - options := &AnnotateOptions{} - err := options.Complete(f, buf, cmd, testCase.args) - if !testCase.errFn(err) { - t.Errorf("%s: unexpected error: %v", k, err) - continue - } - if tf.Printer.(*testPrinter).Objects != nil { - t.Errorf("unexpected print to default printer") - } - if buf.Len() > 0 { - t.Errorf("buffer should be empty: %s", string(buf.Bytes())) - } - } -} - -func TestAnnotateObject(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.Method { - case "GET": - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - case "PATCH": - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - default: - t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdAnnotate(f, buf) - cmd.SetOutput(buf) - options := &AnnotateOptions{} - args := []string{"pods/foo", "a=b", "c-"} - if err := options.Complete(f, buf, cmd, args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.Validate(args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.RunAnnotate(); err != nil { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestAnnotateObjectFromFile(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.Method { - case "GET": - switch req.URL.Path { - case "/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - case "PATCH": - switch req.URL.Path { - case "/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - default: - t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdAnnotate(f, buf) - cmd.SetOutput(buf) - options := &AnnotateOptions{} - options.filenames = []string{"../../../examples/cassandra/cassandra-controller.yaml"} - args := []string{"a=b", "c-"} - if err := options.Complete(f, buf, cmd, args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.Validate(args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.RunAnnotate(); err != nil { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestAnnotateMultipleObjects(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.Method { - case "GET": - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - case "PATCH": - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - case "/namespaces/test/pods/bar": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[1])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - default: - t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdAnnotate(f, buf) - cmd.SetOutput(buf) - options := &AnnotateOptions{} - options.all = true - args := []string{"pods", "a=b", "c-"} - if err := options.Complete(f, buf, cmd, args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.Validate(args); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err := options.RunAnnotate(); err != nil { - t.Fatalf("unexpected error: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apiversions.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apiversions.go deleted file mode 100644 index 3c53a5fd1..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apiversions.go +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "os" - "sort" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api/unversioned" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -func NewCmdApiVersions(f *cmdutil.Factory, out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "api-versions", - // apiversions is deprecated. - Aliases: []string{"apiversions"}, - Short: "Print the supported API versions on the server, in the form of \"group/version\".", - Run: func(cmd *cobra.Command, args []string) { - err := RunApiVersions(f, out) - cmdutil.CheckErr(err) - }, - } - return cmd -} - -func RunApiVersions(f *cmdutil.Factory, w io.Writer) error { - if len(os.Args) > 1 && os.Args[1] == "apiversions" { - printDeprecationWarning("api-versions", "apiversions") - } - - client, err := f.Client() - if err != nil { - return err - } - - groupList, err := client.Discovery().ServerGroups() - if err != nil { - return fmt.Errorf("Couldn't get available api versions from server: %v\n", err) - } - apiVersions := unversioned.ExtractGroupVersions(groupList) - sort.Strings(apiVersions) - for _, v := range apiVersions { - fmt.Fprintln(w, v) - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go deleted file mode 100644 index d63b79200..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply.go +++ /dev/null @@ -1,217 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/strategicpatch" -) - -// ApplyOptions stores cmd.Flag values for apply. As new fields are added, -// add them here instead of referencing the cmd.Flags() -type ApplyOptions struct { - Filenames []string - Recursive bool -} - -const ( - apply_long = `Apply a configuration to a resource by filename or stdin. -The resource will be created if it doesn't exist yet. -To use 'apply', always create the resource initially with either 'apply' or 'create --save-config'. - -JSON and YAML formats are accepted.` - apply_example = `# Apply the configuration in pod.json to a pod. -kubectl apply -f ./pod.json - -# Apply the JSON passed into stdin to a pod. -cat pod.json | kubectl apply -f -` -) - -func NewCmdApply(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &ApplyOptions{} - - cmd := &cobra.Command{ - Use: "apply -f FILENAME", - Short: "Apply a configuration to a resource by filename or stdin", - Long: apply_long, - Example: apply_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(validateArgs(cmd, args)) - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - cmdutil.CheckErr(RunApply(f, cmd, out, options)) - }, - } - - usage := "Filename, directory, or URL to file that contains the configuration to apply" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmd.MarkFlagRequired("filename") - cmdutil.AddValidateFlags(cmd) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func validateArgs(cmd *cobra.Command, args []string) error { - if len(args) != 0 { - return cmdutil.UsageError(cmd, "Unexpected args: %v", args) - } - - return nil -} - -func RunApply(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *ApplyOptions) error { - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - Schema(schema). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - encoder := f.JSONEncoder() - decoder := f.Decoder(false) - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - // In this method, info.Object contains the object retrieved from the server - // and info.VersionedObject contains the object decoded from the input source. - if err != nil { - return err - } - - // Get the modified configuration of the object. Embed the result - // as an annotation in the modified configuration, so that it will appear - // in the patch sent to the server. - modified, err := kubectl.GetModifiedConfiguration(info, true, encoder) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("retrieving modified configuration from:\n%v\nfor:", info), info.Source, err) - } - - if err := info.Get(); err != nil { - if !errors.IsNotFound(err) { - return cmdutil.AddSourceToErr(fmt.Sprintf("retrieving current configuration of:\n%v\nfrom server for:", info), info.Source, err) - } - // Create the resource if it doesn't exist - // First, update the annotation used by kubectl apply - if err := kubectl.CreateApplyAnnotation(info, encoder); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(info.Object, f.Command()); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - } - - // Then create the resource and skip the three-way merge - if err := createAndRefresh(info); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - count++ - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "created") - return nil - } - - // Serialize the current configuration of the object from the server. - current, err := runtime.Encode(encoder, info.Object) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("serializing current configuration from:\n%v\nfor:", info), info.Source, err) - } - - // Retrieve the original configuration of the object from the annotation. - original, err := kubectl.GetOriginalConfiguration(info) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("retrieving original configuration from:\n%v\nfor:", info), info.Source, err) - } - - // Create the versioned struct from the original from the server for - // strategic patch. - // TODO: Move all structs in apply to use raw data. Can be done once - // builder has a RawResult method which delivers raw data instead of - // internal objects. - versionedObject, _, err := decoder.Decode(current, nil, nil) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("converting encoded server-side object back to versioned struct:\n%v\nfor:", info), info.Source, err) - } - - // Compute a three way strategic merge patch to send to server. - patch, err := strategicpatch.CreateThreeWayMergePatch(original, modified, current, versionedObject, true) - if err != nil { - format := "creating patch with:\noriginal:\n%s\nmodified:\n%s\ncurrent:\n%s\nfrom:\n%v\nfor:" - return cmdutil.AddSourceToErr(fmt.Sprintf(format, original, modified, current, info), info.Source, err) - } - - helper := resource.NewHelper(info.Client, info.Mapping) - _, err = helper.Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patch) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("applying patch:\n%s\nto:\n%v\nfor:", patch, info), info.Source, err) - } - - if cmdutil.ShouldRecord(cmd, info) { - patch, err = cmdutil.ChangeResourcePatch(info, f.Command()) - if err != nil { - return err - } - _, err = helper.Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patch) - if err != nil { - return cmdutil.AddSourceToErr(fmt.Sprintf("applying patch:\n%s\nto:\n%v\nfor:", patch, info), info.Source, err) - } - } - - count++ - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "configured") - return nil - }) - - if err != nil { - return err - } - - if count == 0 { - return fmt.Errorf("no objects passed to apply") - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply_test.go deleted file mode 100644 index a46e0699d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/apply_test.go +++ /dev/null @@ -1,317 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - "os" - "testing" - - "github.com/ghodss/yaml" - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestApplyExtraArgsFail(t *testing.T) { - buf := bytes.NewBuffer([]byte{}) - - f, _, _ := NewAPIFactory() - c := NewCmdApply(f, buf) - if validateApplyArgs(c, []string{"rc"}) == nil { - t.Fatalf("unexpected non-error") - } -} - -func validateApplyArgs(cmd *cobra.Command, args []string) error { - if len(args) != 0 { - return cmdutil.UsageError(cmd, "Unexpected args: %v", args) - } - return nil -} - -const ( - filenameRC = "../../../test/fixtures/pkg/kubectl/cmd/apply/rc.yaml" - filenameSVC = "../../../test/fixtures/pkg/kubectl/cmd/apply/service.yaml" - filenameRCSVC = "../../../test/fixtures/pkg/kubectl/cmd/apply/rc-service.yaml" -) - -func readBytesFromFile(t *testing.T, filename string) []byte { - file, err := os.Open(filename) - if err != nil { - t.Fatal(err) - } - - data, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - - return data -} - -func readReplicationControllerFromFile(t *testing.T, filename string) *api.ReplicationController { - data := readBytesFromFile(t, filename) - rc := api.ReplicationController{} - // TODO(jackgr): Replace with a call to testapi.Codec().Decode(). - if err := yaml.Unmarshal(data, &rc); err != nil { - t.Fatal(err) - } - - return &rc -} - -func readServiceFromFile(t *testing.T, filename string) *api.Service { - data := readBytesFromFile(t, filename) - svc := api.Service{} - // TODO(jackgr): Replace with a call to testapi.Codec().Decode(). - if err := yaml.Unmarshal(data, &svc); err != nil { - t.Fatal(err) - } - - return &svc -} - -func annotateRuntimeObject(t *testing.T, originalObj, currentObj runtime.Object, kind string) (string, []byte) { - originalAccessor, err := meta.Accessor(originalObj) - if err != nil { - t.Fatal(err) - } - - originalLabels := originalAccessor.GetLabels() - originalLabels["DELETE_ME"] = "DELETE_ME" - originalAccessor.SetLabels(originalLabels) - original, err := json.Marshal(originalObj) - if err != nil { - t.Fatal(err) - } - - currentAccessor, err := meta.Accessor(currentObj) - if err != nil { - t.Fatal(err) - } - - currentAnnotations := currentAccessor.GetAnnotations() - if currentAnnotations == nil { - currentAnnotations = make(map[string]string) - } - currentAnnotations[kubectl.LastAppliedConfigAnnotation] = string(original) - currentAccessor.SetAnnotations(currentAnnotations) - current, err := json.Marshal(currentObj) - if err != nil { - t.Fatal(err) - } - - return currentAccessor.GetName(), current -} - -func readAndAnnotateReplicationController(t *testing.T, filename string) (string, []byte) { - rc1 := readReplicationControllerFromFile(t, filename) - rc2 := readReplicationControllerFromFile(t, filename) - return annotateRuntimeObject(t, rc1, rc2, "ReplicationController") -} - -func readAndAnnotateService(t *testing.T, filename string) (string, []byte) { - svc1 := readServiceFromFile(t, filename) - svc2 := readServiceFromFile(t, filename) - return annotateRuntimeObject(t, svc1, svc2, "Service") -} - -func validatePatchApplication(t *testing.T, req *http.Request) { - patch, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Fatal(err) - } - - patchMap := map[string]interface{}{} - if err := json.Unmarshal(patch, &patchMap); err != nil { - t.Fatal(err) - } - - annotationsMap := walkMapPath(t, patchMap, []string{"metadata", "annotations"}) - if _, ok := annotationsMap[kubectl.LastAppliedConfigAnnotation]; !ok { - t.Fatalf("patch does not contain annotation:\n%s\n", patch) - } - - labelMap := walkMapPath(t, patchMap, []string{"metadata", "labels"}) - if deleteMe, ok := labelMap["DELETE_ME"]; !ok || deleteMe != nil { - t.Fatalf("patch does not remove deleted key: DELETE_ME:\n%s\n", patch) - } -} - -func walkMapPath(t *testing.T, start map[string]interface{}, path []string) map[string]interface{} { - finish := start - for i := 0; i < len(path); i++ { - var ok bool - finish, ok = finish[path[i]].(map[string]interface{}) - if !ok { - t.Fatalf("key:%s of path:%v not found in map:%v", path[i], path, start) - } - } - - return finish -} - -func TestApplyObject(t *testing.T) { - initTestErrorHandler(t) - nameRC, currentRC := readAndAnnotateReplicationController(t, filenameRC) - pathRC := "/namespaces/test/replicationcontrollers/" + nameRC - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == pathRC && m == "GET": - bodyRC := ioutil.NopCloser(bytes.NewReader(currentRC)) - return &http.Response{StatusCode: 200, Body: bodyRC}, nil - case p == pathRC && m == "PATCH": - validatePatchApplication(t, req) - bodyRC := ioutil.NopCloser(bytes.NewReader(currentRC)) - return &http.Response{StatusCode: 200, Body: bodyRC}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdApply(f, buf) - cmd.Flags().Set("filename", filenameRC) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - expectRC := "replicationcontroller/" + nameRC + "\n" - if buf.String() != expectRC { - t.Fatalf("unexpected output: %s\nexpected: %s", buf.String(), expectRC) - } -} - -func TestApplyNonExistObject(t *testing.T) { - nameRC, currentRC := readAndAnnotateReplicationController(t, filenameRC) - pathRC := "/namespaces/test/replicationcontrollers" - pathNameRC := pathRC + "/" + nameRC - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == pathNameRC && m == "GET": - return &http.Response{StatusCode: 404, Body: ioutil.NopCloser(bytes.NewReader(nil))}, nil - case p == pathRC && m == "POST": - bodyRC := ioutil.NopCloser(bytes.NewReader(currentRC)) - return &http.Response{StatusCode: 201, Body: bodyRC}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdApply(f, buf) - cmd.Flags().Set("filename", filenameRC) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - expectRC := "replicationcontroller/" + nameRC + "\n" - if buf.String() != expectRC { - t.Errorf("unexpected output: %s\nexpected: %s", buf.String(), expectRC) - } -} - -func TestApplyMultipleObjectsAsList(t *testing.T) { - testApplyMultipleObjects(t, true) -} - -func TestApplyMultipleObjectsAsFiles(t *testing.T) { - testApplyMultipleObjects(t, false) -} - -func testApplyMultipleObjects(t *testing.T, asList bool) { - nameRC, currentRC := readAndAnnotateReplicationController(t, filenameRC) - pathRC := "/namespaces/test/replicationcontrollers/" + nameRC - - nameSVC, currentSVC := readAndAnnotateService(t, filenameSVC) - pathSVC := "/namespaces/test/services/" + nameSVC - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == pathRC && m == "GET": - bodyRC := ioutil.NopCloser(bytes.NewReader(currentRC)) - return &http.Response{StatusCode: 200, Body: bodyRC}, nil - case p == pathRC && m == "PATCH": - validatePatchApplication(t, req) - bodyRC := ioutil.NopCloser(bytes.NewReader(currentRC)) - return &http.Response{StatusCode: 200, Body: bodyRC}, nil - case p == pathSVC && m == "GET": - bodySVC := ioutil.NopCloser(bytes.NewReader(currentSVC)) - return &http.Response{StatusCode: 200, Body: bodySVC}, nil - case p == pathSVC && m == "PATCH": - validatePatchApplication(t, req) - bodySVC := ioutil.NopCloser(bytes.NewReader(currentSVC)) - return &http.Response{StatusCode: 200, Body: bodySVC}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdApply(f, buf) - if asList { - cmd.Flags().Set("filename", filenameRCSVC) - } else { - cmd.Flags().Set("filename", filenameRC) - cmd.Flags().Set("filename", filenameSVC) - } - cmd.Flags().Set("output", "name") - - cmd.Run(cmd, []string{}) - - // Names should come from the REST response, NOT the files - expectRC := "replicationcontroller/" + nameRC + "\n" - expectSVC := "service/" + nameSVC + "\n" - // Test both possible orders since output is non-deterministic. - expectOne := expectRC + expectSVC - expectTwo := expectSVC + expectRC - if buf.String() != expectOne && buf.String() != expectTwo { - t.Fatalf("unexpected output: %s\nexpected: %s OR %s", buf.String(), expectOne, expectTwo) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach.go deleted file mode 100644 index 3150bccae..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach.go +++ /dev/null @@ -1,245 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "net/url" - - "github.com/golang/glog" - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - "k8s.io/kubernetes/pkg/util/interrupt" - "k8s.io/kubernetes/pkg/util/term" -) - -const ( - attach_example = `# Get output from running pod 123456-7890, using the first container by default -kubectl attach 123456-7890 - -# Get output from ruby-container from pod 123456-7890 -kubectl attach 123456-7890 -c ruby-container - -# Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod 123456-7890 -# and sends stdout/stderr from 'bash' back to the client -kubectl attach 123456-7890 -c ruby-container -i -t` -) - -func NewCmdAttach(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { - options := &AttachOptions{ - In: cmdIn, - Out: cmdOut, - Err: cmdErr, - - CommandName: "kubectl attach", - - Attach: &DefaultRemoteAttach{}, - } - cmd := &cobra.Command{ - Use: "attach POD -c CONTAINER", - Short: "Attach to a running container.", - Long: "Attach to a process that is already running inside an existing container.", - Example: attach_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(options.Complete(f, cmd, args)) - cmdutil.CheckErr(options.Validate()) - cmdutil.CheckErr(options.Run()) - }, - } - // TODO support UID - cmd.Flags().StringVarP(&options.ContainerName, "container", "c", "", "Container name. If omitted, the first container in the pod will be chosen") - cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", false, "Pass stdin to the container") - cmd.Flags().BoolVarP(&options.TTY, "tty", "t", false, "Stdin is a TTY") - return cmd -} - -// RemoteAttach defines the interface accepted by the Attach command - provided for test stubbing -type RemoteAttach interface { - Attach(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error -} - -// DefaultRemoteAttach is the standard implementation of attaching -type DefaultRemoteAttach struct{} - -func (*DefaultRemoteAttach) Attach(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error { - exec, err := remotecommand.NewExecutor(config, method, url) - if err != nil { - return err - } - return exec.Stream(remotecommandserver.SupportedStreamingProtocols, stdin, stdout, stderr, tty) -} - -// AttachOptions declare the arguments accepted by the Exec command -type AttachOptions struct { - Namespace string - PodName string - ContainerName string - Stdin bool - TTY bool - CommandName string - - // InterruptParent, if set, is used to handle interrupts while attached - InterruptParent *interrupt.Handler - - In io.Reader - Out io.Writer - Err io.Writer - - Pod *api.Pod - - Attach RemoteAttach - Client *client.Client - Config *restclient.Config -} - -// Complete verifies command line arguments and loads data from the command environment -func (p *AttachOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, argsIn []string) error { - if len(argsIn) == 0 { - return cmdutil.UsageError(cmd, "POD is required for attach") - } - if len(argsIn) > 1 { - return cmdutil.UsageError(cmd, fmt.Sprintf("expected a single argument: POD, saw %d: %s", len(argsIn), argsIn)) - } - p.PodName = argsIn[0] - - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - p.Namespace = namespace - - config, err := f.ClientConfig() - if err != nil { - return err - } - p.Config = config - - client, err := f.Client() - if err != nil { - return err - } - p.Client = client - - return nil -} - -// Validate checks that the provided attach options are specified. -func (p *AttachOptions) Validate() error { - allErrs := []error{} - if len(p.PodName) == 0 { - allErrs = append(allErrs, fmt.Errorf("pod name must be specified")) - } - if p.Out == nil || p.Err == nil { - allErrs = append(allErrs, fmt.Errorf("both output and error output must be provided")) - } - if p.Attach == nil || p.Client == nil || p.Config == nil { - allErrs = append(allErrs, fmt.Errorf("client, client config, and attach must be provided")) - } - return utilerrors.NewAggregate(allErrs) -} - -// Run executes a validated remote execution against a pod. -func (p *AttachOptions) Run() error { - if p.Pod == nil { - pod, err := p.Client.Pods(p.Namespace).Get(p.PodName) - if err != nil { - return err - } - if pod.Status.Phase != api.PodRunning { - return fmt.Errorf("pod %s is not running and cannot be attached to; current phase is %s", p.PodName, pod.Status.Phase) - } - p.Pod = pod - // TODO: convert this to a clean "wait" behavior - } - pod := p.Pod - - // ensure we can recover the terminal while attached - t := term.TTY{Parent: p.InterruptParent} - - // check for TTY - tty := p.TTY - containerToAttach := p.GetContainer(pod) - if tty && !containerToAttach.TTY { - tty = false - fmt.Fprintf(p.Err, "Unable to use a TTY - container %s did not allocate one\n", containerToAttach.Name) - } - if p.Stdin { - t.In = p.In - if tty && !t.IsTerminal() { - tty = false - fmt.Fprintln(p.Err, "Unable to use a TTY - input is not a terminal or the right kind of file") - } - } - t.Raw = tty - - fn := func() error { - if tty { - fmt.Fprintln(p.Out, "\nHit enter for command prompt") - } - // TODO: consider abstracting into a client invocation or client helper - req := p.Client.RESTClient.Post(). - Resource("pods"). - Name(pod.Name). - Namespace(pod.Namespace). - SubResource("attach") - req.VersionedParams(&api.PodAttachOptions{ - Container: containerToAttach.Name, - Stdin: p.In != nil, - Stdout: p.Out != nil, - Stderr: p.Err != nil, - TTY: tty, - }, api.ParameterCodec) - - return p.Attach.Attach("POST", req.URL(), p.Config, p.In, p.Out, p.Err, tty) - } - - if err := t.Safe(fn); err != nil { - return err - } - - if p.Stdin && tty && pod.Spec.RestartPolicy == api.RestartPolicyAlways { - fmt.Fprintf(p.Out, "Session ended, resume using '%s %s -c %s -i -t' command when the pod is running\n", p.CommandName, pod.Name, containerToAttach.Name) - } - return nil -} - -// GetContainer returns the container to attach to, with a fallback. -func (p *AttachOptions) GetContainer(pod *api.Pod) api.Container { - if len(p.ContainerName) > 0 { - for _, container := range pod.Spec.Containers { - if container.Name == p.ContainerName { - return container - } - } - } - - glog.V(4).Infof("defaulting container name to %s", pod.Spec.Containers[0].Name) - return pod.Spec.Containers[0] -} - -// GetContainerName returns the name of the container to attach to, with a fallback. -func (p *AttachOptions) GetContainerName(pod *api.Pod) string { - return p.GetContainer(pod).Name -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach_test.go deleted file mode 100644 index fcefb74fb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/attach_test.go +++ /dev/null @@ -1,279 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "testing" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -type fakeRemoteAttach struct { - method string - url *url.URL - attachErr error -} - -func (f *fakeRemoteAttach) Attach(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error { - f.method = method - f.url = url - return f.attachErr -} - -func TestPodAndContainerAttach(t *testing.T) { - tests := []struct { - args []string - p *AttachOptions - name string - expectError bool - expectedPod string - expectedContainer string - }{ - { - p: &AttachOptions{}, - expectError: true, - name: "empty", - }, - { - p: &AttachOptions{}, - args: []string{"foo", "bar"}, - expectError: true, - name: "too many args", - }, - { - p: &AttachOptions{}, - args: []string{"foo"}, - expectedPod: "foo", - name: "no container, no flags", - }, - { - p: &AttachOptions{ContainerName: "bar"}, - args: []string{"foo"}, - expectedPod: "foo", - expectedContainer: "bar", - name: "container in flag", - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{} - - cmd := &cobra.Command{} - options := test.p - err := options.Complete(f, cmd, test.args) - if test.expectError && err == nil { - t.Errorf("unexpected non-error (%s)", test.name) - } - if !test.expectError && err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.name) - } - if err != nil { - continue - } - if options.PodName != test.expectedPod { - t.Errorf("expected: %s, got: %s (%s)", test.expectedPod, options.PodName, test.name) - } - if options.ContainerName != test.expectedContainer { - t.Errorf("expected: %s, got: %s (%s)", test.expectedContainer, options.ContainerName, test.name) - } - } -} - -func TestAttach(t *testing.T) { - version := testapi.Default.GroupVersion().Version - tests := []struct { - name, version, podPath, attachPath, container string - pod *api.Pod - attachErr bool - }{ - { - name: "pod attach", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - attachPath: "/api/" + version + "/namespaces/test/pods/foo/attach", - pod: attachPod(), - }, - { - name: "pod attach error", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - attachPath: "/api/" + version + "/namespaces/test/pods/foo/attach", - pod: attachPod(), - attachErr: true, - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %s %#v\n%#v", test.name, req.Method, req.URL, req) - return nil, fmt.Errorf("unexpected request") - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - bufOut := bytes.NewBuffer([]byte{}) - bufErr := bytes.NewBuffer([]byte{}) - bufIn := bytes.NewBuffer([]byte{}) - ex := &fakeRemoteAttach{} - if test.attachErr { - ex.attachErr = fmt.Errorf("attach error") - } - params := &AttachOptions{ - ContainerName: "bar", - In: bufIn, - Out: bufOut, - Err: bufErr, - Attach: ex, - } - cmd := &cobra.Command{} - if err := params.Complete(f, cmd, []string{"foo"}); err != nil { - t.Fatal(err) - } - err := params.Run() - if test.attachErr && err != ex.attachErr { - t.Errorf("%s: Unexpected exec error: %v", test.name, err) - continue - } - if !test.attachErr && err != nil { - t.Errorf("%s: Unexpected error: %v", test.name, err) - continue - } - if test.attachErr { - continue - } - if ex.url.Path != test.attachPath { - t.Errorf("%s: Did not get expected path for exec request", test.name) - continue - } - if ex.method != "POST" { - t.Errorf("%s: Did not get method for attach request: %s", test.name, ex.method) - } - if ex.url.Query().Get("container") != "bar" { - t.Errorf("%s: Did not have query parameters: %s", test.name, ex.url.Query()) - } - } -} - -func TestAttachWarnings(t *testing.T) { - version := testapi.Default.GroupVersion().Version - tests := []struct { - name, container, version, podPath, expectedErr, expectedOut string - pod *api.Pod - stdin, tty bool - }{ - { - name: "fallback tty if not supported", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - pod: attachPod(), - stdin: true, - tty: true, - expectedErr: "Unable to use a TTY - container bar did not allocate one", - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - t.Errorf("%s: unexpected request: %s %#v\n%#v", test.name, req.Method, req.URL, req) - return nil, fmt.Errorf("unexpected request") - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - bufOut := bytes.NewBuffer([]byte{}) - bufErr := bytes.NewBuffer([]byte{}) - bufIn := bytes.NewBuffer([]byte{}) - ex := &fakeRemoteAttach{} - params := &AttachOptions{ - ContainerName: test.container, - In: bufIn, - Out: bufOut, - Err: bufErr, - Stdin: test.stdin, - TTY: test.tty, - Attach: ex, - } - cmd := &cobra.Command{} - if err := params.Complete(f, cmd, []string{"foo"}); err != nil { - t.Fatal(err) - } - if err := params.Run(); err != nil { - t.Fatal(err) - } - - if test.stdin && test.tty { - if !test.pod.Spec.Containers[0].TTY { - if !strings.Contains(bufErr.String(), test.expectedErr) { - t.Errorf("%s: Expected TTY fallback warning for attach request: %s", test.name, bufErr.String()) - continue - } - } - } - } -} - -func attachPod() *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{ - { - Name: "bar", - }, - }, - }, - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/autoscale.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/autoscale.go deleted file mode 100644 index cb40c6def..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/autoscale.go +++ /dev/null @@ -1,204 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - - "github.com/spf13/cobra" -) - -// AutoscaleOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type AutoscaleOptions struct { - Filenames []string - Recursive bool -} - -const ( - autoscaleLong = `Creates an autoscaler that automatically chooses and sets the number of pods that run in a kubernetes cluster. - -Looks up a Deployment, ReplicaSet, or ReplicationController by name and creates an autoscaler that uses the given resource as a reference. -An autoscaler can automatically increase or decrease number of pods deployed within the system as needed.` - - autoscaleExample = `# Auto scale a deployment "foo", with the number of pods between 2 to 10, target CPU utilization at a default value that server applies: -kubectl autoscale deployment foo --min=2 --max=10 - -# Auto scale a replication controller "foo", with the number of pods between 1 to 5, target CPU utilization at 80%: -kubectl autoscale rc foo --max=5 --cpu-percent=80` -) - -func NewCmdAutoscale(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &AutoscaleOptions{} - - cmd := &cobra.Command{ - Use: "autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]", - Short: "Auto-scale a Deployment, ReplicaSet, or ReplicationController", - Long: autoscaleLong, - Example: autoscaleExample, - Run: func(cmd *cobra.Command, args []string) { - err := RunAutoscale(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().String("generator", "horizontalpodautoscaler/v1beta1", "The name of the API generator to use. Currently there is only 1 generator.") - cmd.Flags().Int("min", -1, "The lower limit for the number of pods that can be set by the autoscaler. If it's not specified or negative, the server will apply a default value.") - cmd.Flags().Int("max", -1, "The upper limit for the number of pods that can be set by the autoscaler. Required.") - cmd.MarkFlagRequired("max") - cmd.Flags().Int("cpu-percent", -1, fmt.Sprintf("The target average CPU utilization (represented as a percent of requested CPU) over all the pods. If it's not specified or negative, the server will apply a default value.")) - cmd.Flags().String("name", "", "The name for the newly created object. If not specified, the name of the input resource will be used.") - cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without creating it.") - usage := "Filename, directory, or URL to a file identifying the resource to autoscale." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunAutoscale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *AutoscaleOptions) error { - namespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - // validate flags - if err := validateFlags(cmd); err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(namespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(false, args...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - // Get the generator, setup and validate all required parameters - generatorName := cmdutil.GetFlagString(cmd, "generator") - generators := f.Generators("autoscale") - generator, found := generators[generatorName] - if !found { - return cmdutil.UsageError(cmd, fmt.Sprintf("generator %q not found.", generatorName)) - } - names := generator.ParamNames() - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - mapping := info.ResourceMapping() - if err := f.CanBeAutoscaled(mapping.GroupVersionKind.GroupKind()); err != nil { - return err - } - - name := info.Name - params := kubectl.MakeParams(cmd, names) - params["default-name"] = name - - params["scaleRef-kind"] = mapping.GroupVersionKind.Kind - params["scaleRef-name"] = name - params["scaleRef-apiVersion"] = mapping.GroupVersionKind.GroupVersion().String() - - if err = kubectl.ValidateParams(names, params); err != nil { - return err - } - // Check for invalid flags used against the present generator. - if err := kubectl.EnsureFlagsValid(cmd, generators, generatorName); err != nil { - return err - } - - // Generate new object - object, err := generator.Generate(params) - if err != nil { - return err - } - - resourceMapper := &resource.Mapper{ - ObjectTyper: typer, - RESTMapper: mapper, - ClientMapper: resource.ClientMapperFunc(f.ClientForMapping), - Decoder: f.Decoder(true), - } - hpa, err := resourceMapper.InfoForObject(object, nil) - if err != nil { - return err - } - if cmdutil.ShouldRecord(cmd, hpa) { - if err := cmdutil.RecordChangeCause(hpa.Object, f.Command()); err != nil { - return err - } - object = hpa.Object - } - // TODO: extract this flag to a central location, when such a location exists. - if cmdutil.GetFlagBool(cmd, "dry-run") { - return f.PrintObject(cmd, mapper, object, out) - } - - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), hpa, f.JSONEncoder()); err != nil { - return err - } - - object, err = resource.NewHelper(hpa.Client, hpa.Mapping).Create(namespace, false, object) - if err != nil { - return err - } - - count++ - if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, mapper, object, out) - } - - cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, "autoscaled") - return nil - }) - if err != nil { - return err - } - if count == 0 { - return fmt.Errorf("no objects passed to autoscale") - } - return nil -} - -func validateFlags(cmd *cobra.Command) error { - errs := []error{} - max, min, cpu := cmdutil.GetFlagInt(cmd, "max"), cmdutil.GetFlagInt(cmd, "min"), cmdutil.GetFlagInt(cmd, "cpu-percent") - if max < 1 || max < min { - errs = append(errs, fmt.Errorf("--max=MAXPODS is required, and must be at least 1 and --min=MINPODS")) - } - if cpu > 100 { - errs = append(errs, fmt.Errorf("CPU utilization (%%) cannot exceed 100")) - } - return utilerrors.NewAggregate(errs) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/clusterinfo.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/clusterinfo.go deleted file mode 100644 index 9fc303586..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/clusterinfo.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "os" - "strconv" - - "k8s.io/kubernetes/pkg/api" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - - "github.com/daviddengcn/go-colortext" - "github.com/spf13/cobra" -) - -func NewCmdClusterInfo(f *cmdutil.Factory, out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "cluster-info", - // clusterinfo is deprecated. - Aliases: []string{"clusterinfo"}, - Short: "Display cluster info", - Long: "Display addresses of the master and services with label kubernetes.io/cluster-service=true", - Run: func(cmd *cobra.Command, args []string) { - err := RunClusterInfo(f, out, cmd) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunClusterInfo(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { - if len(os.Args) > 1 && os.Args[1] == "clusterinfo" { - printDeprecationWarning("cluster-info", "clusterinfo") - } - - client, err := f.ClientConfig() - if err != nil { - return err - } - printService(out, "Kubernetes master", client.Host) - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - cmdNamespace := cmdutil.GetFlagString(cmd, "namespace") - if cmdNamespace == "" { - cmdNamespace = api.NamespaceSystem - } - - // TODO use generalized labels once they are implemented (#341) - b := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - SelectorParam("kubernetes.io/cluster-service=true"). - ResourceTypeOrNameArgs(false, []string{"services"}...). - Latest() - b.Do().Visit(func(r *resource.Info, err error) error { - if err != nil { - return err - } - services := r.Object.(*api.ServiceList).Items - for _, service := range services { - var link string - if len(service.Status.LoadBalancer.Ingress) > 0 { - ingress := service.Status.LoadBalancer.Ingress[0] - ip := ingress.IP - if ip == "" { - ip = ingress.Hostname - } - for _, port := range service.Spec.Ports { - link += "http://" + ip + ":" + strconv.Itoa(int(port.Port)) + " " - } - } else { - if len(client.GroupVersion.Group) == 0 { - link = client.Host + "/api/" + client.GroupVersion.Version + "/proxy/namespaces/" + service.ObjectMeta.Namespace + "/services/" + service.ObjectMeta.Name - } else { - link = client.Host + "/api/" + client.GroupVersion.Group + "/" + client.GroupVersion.Version + "/proxy/namespaces/" + service.ObjectMeta.Namespace + "/services/" + service.ObjectMeta.Name - - } - } - name := service.ObjectMeta.Labels["kubernetes.io/name"] - if len(name) == 0 { - name = service.ObjectMeta.Name - } - printService(out, name, link) - } - return nil - }) - return nil - - // TODO consider printing more information about cluster -} - -func printService(out io.Writer, name, link string) { - ct.ChangeColor(ct.Green, false, ct.None, false) - fmt.Fprint(out, name) - ct.ResetColor() - fmt.Fprintf(out, " is running at ") - ct.ChangeColor(ct.Yellow, false, ct.None, false) - fmt.Fprint(out, link) - ct.ResetColor() - fmt.Fprintln(out, "") -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd.go deleted file mode 100644 index 6225a4573..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd.go +++ /dev/null @@ -1,253 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "io" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - cmdconfig "k8s.io/kubernetes/pkg/kubectl/cmd/config" - "k8s.io/kubernetes/pkg/kubectl/cmd/rollout" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/util/flag" - - "github.com/spf13/cobra" -) - -const ( - bash_completion_func = `# call kubectl get $1, -__kubectl_namespace_flag() -{ - local ret two_word_ns - ret="" - two_word_ns=false - for w in "${words[@]}"; do - if [ "$two_word_ns" = true ]; then - ret="--namespace=${w}" - two_word_ns=false - continue - fi - case "${w}" in - --namespace=*) - ret=${w} - ;; - --namespace) - two_word_ns=true - ;; - --all-namespaces) - ret=${w} - ;; - esac - done - echo $ret -} - -__kubectl_get_namespaces() -{ - local template kubectl_out - template="{{ range .items }}{{ .metadata.name }} {{ end }}" - if kubectl_out=$(kubectl get -o template --template="${template}" namespace 2>/dev/null); then - COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) ) - fi -} - -__kubectl_parse_get() -{ - local template - template="{{ range .items }}{{ .metadata.name }} {{ end }}" - local kubectl_out - if kubectl_out=$(kubectl get $(__kubectl_namespace_flag) -o template --template="${template}" "$1" 2>/dev/null); then - COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) ) - fi -} - -__kubectl_get_resource() -{ - if [[ ${#nouns[@]} -eq 0 ]]; then - return 1 - fi - __kubectl_parse_get "${nouns[${#nouns[@]} -1]}" -} - -__kubectl_get_resource_pod() -{ - __kubectl_parse_get "pod" -} - -__kubectl_get_resource_rc() -{ - __kubectl_parse_get "rc" -} - -# $1 is the name of the pod we want to get the list of containers inside -__kubectl_get_containers() -{ - local template - template="{{ range .spec.containers }}{{ .name }} {{ end }}" - __debug "${FUNCNAME} nouns are ${nouns[*]}" - - local len="${#nouns[@]}" - if [[ ${len} -ne 1 ]]; then - return - fi - local last=${nouns[${len} -1]} - local kubectl_out - if kubectl_out=$(kubectl get $(__kubectl_namespace_flag) -o template --template="${template}" pods "${last}" 2>/dev/null); then - COMPREPLY=( $( compgen -W "${kubectl_out[*]}" -- "$cur" ) ) - fi -} - -# Require both a pod and a container to be specified -__kubectl_require_pod_and_container() -{ - if [[ ${#nouns[@]} -eq 0 ]]; then - __kubectl_parse_get pods - return 0 - fi; - __kubectl_get_containers - return 0 -} - -__custom_func() { - case ${last_command} in - kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop | kubectl_edit | kubectl_patch |\ - kubectl_annotate | kubectl_expose) - __kubectl_get_resource - return - ;; - kubectl_logs) - __kubectl_require_pod_and_container - return - ;; - kubectl_exec) - __kubectl_get_resource_pod - return - ;; - kubectl_rolling-update) - __kubectl_get_resource_rc - return - ;; - *) - ;; - esac -} -` - - // If you add a resource to this list, please also take a look at pkg/kubectl/kubectl.go - // and add a short forms entry in expandResourceShortcut() when appropriate. - valid_resources = `Valid resource types include: - * componentstatuses (aka 'cs') - * configmaps - * daemonsets (aka 'ds') - * deployments - * events (aka 'ev') - * endpoints (aka 'ep') - * horizontalpodautoscalers (aka 'hpa') - * ingress (aka 'ing') - * jobs - * limitranges (aka 'limits') - * nodes (aka 'no') - * namespaces (aka 'ns') - * pods (aka 'po') - * persistentvolumes (aka 'pv') - * persistentvolumeclaims (aka 'pvc') - * quota - * resourcequotas (aka 'quota') - * replicasets (aka 'rs') - * replicationcontrollers (aka 'rc') - * secrets - * serviceaccounts (aka 'sa') - * services (aka 'svc') -` -) - -// NewKubectlCommand creates the `kubectl` command and its nested children. -func NewKubectlCommand(f *cmdutil.Factory, in io.Reader, out, err io.Writer) *cobra.Command { - // Parent command to which all subcommands are added. - cmds := &cobra.Command{ - Use: "kubectl", - Short: "kubectl controls the Kubernetes cluster manager", - Long: `kubectl controls the Kubernetes cluster manager. - -Find more information at https://github.com/kubernetes/kubernetes.`, - Run: runHelp, - BashCompletionFunction: bash_completion_func, - } - - f.BindFlags(cmds.PersistentFlags()) - f.BindExternalFlags(cmds.PersistentFlags()) - - // From this point and forward we get warnings on flags that contain "_" separators - cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) - - cmds.AddCommand(NewCmdGet(f, out)) - cmds.AddCommand(NewCmdDescribe(f, out)) - cmds.AddCommand(NewCmdCreate(f, out)) - cmds.AddCommand(NewCmdReplace(f, out)) - cmds.AddCommand(NewCmdPatch(f, out)) - cmds.AddCommand(NewCmdDelete(f, out)) - cmds.AddCommand(NewCmdEdit(f, out, err)) - cmds.AddCommand(NewCmdApply(f, out)) - - cmds.AddCommand(NewCmdNamespace(out)) - cmds.AddCommand(NewCmdLogs(f, out)) - cmds.AddCommand(NewCmdRollingUpdate(f, out)) - cmds.AddCommand(NewCmdScale(f, out)) - cmds.AddCommand(NewCmdCordon(f, out)) - cmds.AddCommand(NewCmdDrain(f, out)) - cmds.AddCommand(NewCmdUncordon(f, out)) - - cmds.AddCommand(NewCmdAttach(f, in, out, err)) - cmds.AddCommand(NewCmdExec(f, in, out, err)) - cmds.AddCommand(NewCmdPortForward(f, out, err)) - cmds.AddCommand(NewCmdProxy(f, out)) - - cmds.AddCommand(NewCmdRun(f, in, out, err)) - cmds.AddCommand(NewCmdStop(f, out)) - cmds.AddCommand(NewCmdExposeService(f, out)) - cmds.AddCommand(NewCmdAutoscale(f, out)) - cmds.AddCommand(rollout.NewCmdRollout(f, out)) - - cmds.AddCommand(NewCmdLabel(f, out)) - cmds.AddCommand(NewCmdAnnotate(f, out)) - - cmds.AddCommand(cmdconfig.NewCmdConfig(clientcmd.NewDefaultPathOptions(), out)) - cmds.AddCommand(NewCmdClusterInfo(f, out)) - cmds.AddCommand(NewCmdApiVersions(f, out)) - cmds.AddCommand(NewCmdVersion(f, out)) - cmds.AddCommand(NewCmdExplain(f, out)) - cmds.AddCommand(NewCmdConvert(f, out)) - - if cmds.Flag("namespace").Annotations == nil { - cmds.Flag("namespace").Annotations = map[string][]string{} - } - cmds.Flag("namespace").Annotations[cobra.BashCompCustom] = append( - cmds.Flag("namespace").Annotations[cobra.BashCompCustom], - "__kubectl_get_namespaces", - ) - - return cmds -} - -func runHelp(cmd *cobra.Command, args []string) { - cmd.Help() -} - -func printDeprecationWarning(command, alias string) { - glog.Warningf("%s is DEPRECATED and will be removed in a future version. Use %s instead.", alias, command) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd_test.go deleted file mode 100644 index 500b7a7d2..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/cmd_test.go +++ /dev/null @@ -1,799 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "reflect" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/util" -) - -func initTestErrorHandler(t *testing.T) { - cmdutil.BehaviorOnFatal(func(str string) { - t.Errorf("Error running command: %s", str) - }) -} - -type internalType struct { - Kind string - APIVersion string - - Name string -} - -type externalType struct { - Kind string `json:"kind"` - APIVersion string `json:"apiVersion"` - - Name string `json:"name"` -} - -type ExternalType2 struct { - Kind string `json:"kind"` - APIVersion string `json:"apiVersion"` - - Name string `json:"name"` -} - -func (obj *internalType) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *internalType) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind() -} -func (obj *internalType) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.Kind) -} -func (obj *externalType) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *externalType) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind() -} -func (obj *externalType) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.Kind) -} -func (obj *ExternalType2) GetObjectKind() unversioned.ObjectKind { return obj } -func (obj *ExternalType2) SetGroupVersionKind(gvk *unversioned.GroupVersionKind) { - obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind() -} -func (obj *ExternalType2) GroupVersionKind() *unversioned.GroupVersionKind { - return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.Kind) -} - -var versionErr = errors.New("not a version") - -func versionErrIfFalse(b bool) error { - if b { - return nil - } - return versionErr -} - -var validVersion = testapi.Default.GroupVersion().Version -var internalGV = unversioned.GroupVersion{Group: "apitest", Version: runtime.APIVersionInternal} -var unlikelyGV = unversioned.GroupVersion{Group: "apitest", Version: "unlikelyversion"} -var validVersionGV = unversioned.GroupVersion{Group: "apitest", Version: validVersion} - -func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) { - scheme := runtime.NewScheme() - scheme.AddKnownTypeWithName(internalGV.WithKind("Type"), &internalType{}) - scheme.AddKnownTypeWithName(unlikelyGV.WithKind("Type"), &externalType{}) - //This tests that kubectl will not confuse the external scheme with the internal scheme, even when they accidentally have versions of the same name. - scheme.AddKnownTypeWithName(validVersionGV.WithKind("Type"), &ExternalType2{}) - - codecs := serializer.NewCodecFactory(scheme) - codec := codecs.LegacyCodec(unlikelyGV) - mapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{unlikelyGV, validVersionGV}, func(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { - return &meta.VersionInterfaces{ - ObjectConvertor: scheme, - MetadataAccessor: meta.NewAccessor(), - }, versionErrIfFalse(version == validVersionGV || version == unlikelyGV) - }) - for _, gv := range []unversioned.GroupVersion{unlikelyGV, validVersionGV} { - for kind := range scheme.KnownTypes(gv) { - gvk := gv.WithKind(kind) - - scope := meta.RESTScopeNamespace - mapper.Add(gvk, scope) - } - } - - return scheme, mapper, codec -} - -type testPrinter struct { - Objects []runtime.Object - Err error -} - -func (t *testPrinter) PrintObj(obj runtime.Object, out io.Writer) error { - t.Objects = append(t.Objects, obj) - fmt.Fprintf(out, "%#v", obj) - return t.Err -} - -// TODO: implement HandledResources() -func (t *testPrinter) HandledResources() []string { - return []string{} -} - -type testDescriber struct { - Name, Namespace string - Settings kubectl.DescriberSettings - Output string - Err error -} - -func (t *testDescriber) Describe(namespace, name string, describerSettings kubectl.DescriberSettings) (output string, err error) { - t.Namespace, t.Name = namespace, name - t.Settings = describerSettings - return t.Output, t.Err -} - -type testFactory struct { - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - Client kubectl.RESTClient - Describer kubectl.Describer - Printer kubectl.ResourcePrinter - Validator validation.Schema - Namespace string - ClientConfig *restclient.Config - Err error -} - -func NewTestFactory() (*cmdutil.Factory, *testFactory, runtime.Codec) { - scheme, mapper, codec := newExternalScheme() - t := &testFactory{ - Validator: validation.NullSchema{}, - Mapper: mapper, - Typer: scheme, - } - return &cmdutil.Factory{ - Object: func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { - priorityRESTMapper := meta.PriorityRESTMapper{ - Delegate: t.Mapper, - ResourcePriority: []unversioned.GroupVersionResource{ - {Group: meta.AnyGroup, Version: "v1", Resource: meta.AnyResource}, - }, - KindPriority: []unversioned.GroupVersionKind{ - {Group: meta.AnyGroup, Version: "v1", Kind: meta.AnyKind}, - }, - } - return priorityRESTMapper, t.Typer - }, - ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) { - return t.Client, t.Err - }, - Decoder: func(bool) runtime.Decoder { - return codec - }, - JSONEncoder: func() runtime.Encoder { - return codec - }, - Describer: func(*meta.RESTMapping) (kubectl.Describer, error) { - return t.Describer, t.Err - }, - Printer: func(mapping *meta.RESTMapping, noHeaders, withNamespace bool, wide bool, showAll bool, showLabels bool, absoluteTimestamps bool, columnLabels []string) (kubectl.ResourcePrinter, error) { - return t.Printer, t.Err - }, - Validator: func(validate bool, cacheDir string) (validation.Schema, error) { - return t.Validator, t.Err - }, - DefaultNamespace: func() (string, bool, error) { - return t.Namespace, false, t.Err - }, - ClientConfig: func() (*restclient.Config, error) { - return t.ClientConfig, t.Err - }, - }, t, codec -} - -func NewMixedFactory(apiClient resource.RESTClient) (*cmdutil.Factory, *testFactory, runtime.Codec) { - f, t, c := NewTestFactory() - var multiRESTMapper meta.MultiRESTMapper - multiRESTMapper = append(multiRESTMapper, t.Mapper) - multiRESTMapper = append(multiRESTMapper, testapi.Default.RESTMapper()) - f.Object = func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { - priorityRESTMapper := meta.PriorityRESTMapper{ - Delegate: multiRESTMapper, - ResourcePriority: []unversioned.GroupVersionResource{ - {Group: meta.AnyGroup, Version: "v1", Resource: meta.AnyResource}, - }, - KindPriority: []unversioned.GroupVersionKind{ - {Group: meta.AnyGroup, Version: "v1", Kind: meta.AnyKind}, - }, - } - return priorityRESTMapper, runtime.MultiObjectTyper{t.Typer, api.Scheme} - } - f.ClientForMapping = func(m *meta.RESTMapping) (resource.RESTClient, error) { - if m.ObjectConvertor == api.Scheme { - return apiClient, t.Err - } - return t.Client, t.Err - } - return f, t, c -} - -func NewAPIFactory() (*cmdutil.Factory, *testFactory, runtime.Codec) { - t := &testFactory{ - Validator: validation.NullSchema{}, - } - - f := &cmdutil.Factory{ - Object: func(discovery bool) (meta.RESTMapper, runtime.ObjectTyper) { - return testapi.Default.RESTMapper(), api.Scheme - }, - Client: func() (*client.Client, error) { - // Swap out the HTTP client out of the client with the fake's version. - fakeClient := t.Client.(*fake.RESTClient) - c := client.NewOrDie(t.ClientConfig) - c.Client = fakeClient.Client - c.ExtensionsClient.Client = fakeClient.Client - return c, t.Err - }, - ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) { - return t.Client, t.Err - }, - Decoder: func(bool) runtime.Decoder { - return testapi.Default.Codec() - }, - JSONEncoder: func() runtime.Encoder { - return testapi.Default.Codec() - }, - Describer: func(*meta.RESTMapping) (kubectl.Describer, error) { - return t.Describer, t.Err - }, - Printer: func(mapping *meta.RESTMapping, noHeaders, withNamespace bool, wide bool, showAll bool, showLabels bool, absoluteTimestamps bool, columnLabels []string) (kubectl.ResourcePrinter, error) { - return t.Printer, t.Err - }, - Validator: func(validate bool, cacheDir string) (validation.Schema, error) { - return t.Validator, t.Err - }, - DefaultNamespace: func() (string, bool, error) { - return t.Namespace, false, t.Err - }, - ClientConfig: func() (*restclient.Config, error) { - return t.ClientConfig, t.Err - }, - Generators: func(cmdName string) map[string]kubectl.Generator { - return cmdutil.DefaultGenerators(cmdName) - }, - LogsForObject: func(object, options runtime.Object) (*restclient.Request, error) { - fakeClient := t.Client.(*fake.RESTClient) - c := client.NewOrDie(t.ClientConfig) - c.Client = fakeClient.Client - - switch t := object.(type) { - case *api.Pod: - opts, ok := options.(*api.PodLogOptions) - if !ok { - return nil, errors.New("provided options object is not a PodLogOptions") - } - return c.Pods(t.Namespace).GetLogs(t.Name, opts), nil - default: - fqKind, err := api.Scheme.ObjectKind(object) - if err != nil { - return nil, err - } - return nil, fmt.Errorf("cannot get the logs from %v", fqKind) - } - }, - } - rf := cmdutil.NewFactory(nil) - f.MapBasedSelectorForObject = rf.MapBasedSelectorForObject - f.PortsForObject = rf.PortsForObject - f.LabelsForObject = rf.LabelsForObject - f.CanBeExposed = rf.CanBeExposed - return f, t, testapi.Default.Codec() -} - -func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) -} - -func stringBody(body string) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(body))) -} - -// TODO(jlowdermilk): refactor the Factory so we can test client versions properly, -// with different client/server version skew scenarios. -// Verify that resource.RESTClients constructed from a factory respect mapping.APIVersion -//func TestClientVersions(t *testing.T) { -// f := cmdutil.NewFactory(nil) -// -// version := testapi.Default.Version() -// mapping := &meta.RESTMapping{ -// APIVersion: version, -// } -// c, err := f.ClientForMapping(mapping) -// if err != nil { -// t.Errorf("unexpected error: %v", err) -// } -// client := c.(*client.RESTClient) -// if client.APIVersion() != version { -// t.Errorf("unexpected Client APIVersion: %s %v", client.APIVersion, client) -// } -//} - -func Example_printReplicationControllerWithNamespace() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, true, false, false, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - ctrl := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "beep", - Labels: map[string]string{"foo": "bar"}, - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"foo": "bar"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - }, - }, - }, - }, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 1, - }, - } - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAMESPACE NAME DESIRED CURRENT AGE - // beep foo 1 1 10y -} - -func Example_printMultiContainersReplicationControllerWithWide() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, true, false, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - ctrl := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar"}, - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"foo": "bar"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - }, - { - Name: "foo2", - Image: "someimage2", - }, - }, - }, - }, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 1, - }, - } - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME DESIRED CURRENT AGE CONTAINER(S) IMAGE(S) SELECTOR - // foo 1 1 10y foo,foo2 someimage,someimage2 foo=bar -} - -func Example_printReplicationController() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - ctrl := &api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"foo": "bar"}, - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - Selector: map[string]string{"foo": "bar"}, - Template: &api.PodTemplateSpec{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Name: "foo", - Image: "someimage", - }, - { - Name: "foo2", - Image: "someimage", - }, - }, - }, - }, - }, - Status: api.ReplicationControllerStatus{ - Replicas: 1, - }, - } - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME DESIRED CURRENT AGE - // foo 1 1 10y -} - -func Example_printPodWithWideFormat() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, true, false, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - nodeName := "kubernetes-minion-abcd" - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - } - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, pod, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME READY STATUS RESTARTS AGE NODE - // test1 1/2 podPhase 6 10y kubernetes-minion-abcd -} - -func Example_printPodWithShowLabels() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, false, false, true, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - nodeName := "kubernetes-minion-abcd" - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - Labels: map[string]string{ - "l1": "key", - "l2": "value", - }, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: "podPhase", - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - } - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, pod, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME READY STATUS RESTARTS AGE LABELS - // test1 1/2 podPhase 6 10y l1=key,l2=value -} - -func newAllPhasePodList() *api.PodList { - nodeName := "kubernetes-minion-abcd" - return &api.PodList{ - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "test1", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: api.PodPending, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "test2", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: api.PodRunning, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "test3", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: api.PodSucceeded, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "test4", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: api.PodFailed, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "test5", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - }, - Spec: api.PodSpec{ - Containers: make([]api.Container, 2), - NodeName: nodeName, - }, - Status: api.PodStatus{ - Phase: api.PodUnknown, - ContainerStatuses: []api.ContainerStatus{ - {Ready: true, RestartCount: 3, State: api.ContainerState{Running: &api.ContainerStateRunning{}}}, - {RestartCount: 3}, - }, - }, - }}, - } -} - -func Example_printPodHideTerminated() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, false, false, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - podList := newAllPhasePodList() - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, podList, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME READY STATUS RESTARTS AGE - // test1 1/2 Pending 6 10y - // test2 1/2 Running 6 10y - // test5 1/2 Unknown 6 10y -} - -func Example_printPodShowAll() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, false, false, true, false, false, []string{}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - podList := newAllPhasePodList() - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, podList, os.Stdout) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // NAME READY STATUS RESTARTS AGE - // test1 1/2 Pending 6 10y - // test2 1/2 Running 6 10y - // test3 1/2 Succeeded 6 10y - // test4 1/2 Failed 6 10y - // test5 1/2 Unknown 6 10y -} - -func Example_printServiceWithNamespacesAndLabels() { - f, tf, codec := NewAPIFactory() - tf.Printer = kubectl.NewHumanReadablePrinter(false, true, false, false, false, false, []string{"l1"}) - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: nil, - } - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - svc := &api.ServiceList{ - Items: []api.Service{ - { - ObjectMeta: api.ObjectMeta{ - Name: "svc1", - Namespace: "ns1", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - Labels: map[string]string{ - "l1": "value", - }, - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - {Protocol: "UDP", Port: 53}, - {Protocol: "TCP", Port: 53}, - }, - Selector: map[string]string{ - "s": "magic", - }, - ClusterIP: "10.1.1.1", - }, - Status: api.ServiceStatus{}, - }, - { - ObjectMeta: api.ObjectMeta{ - Name: "svc2", - Namespace: "ns2", - CreationTimestamp: unversioned.Time{Time: time.Now().AddDate(-10, 0, 0)}, - Labels: map[string]string{ - "l1": "dolla-bill-yall", - }, - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - {Protocol: "TCP", Port: 80}, - {Protocol: "TCP", Port: 8080}, - }, - Selector: map[string]string{ - "s": "kazam", - }, - ClusterIP: "10.1.1.2", - }, - Status: api.ServiceStatus{}, - }}, - } - ld := util.NewLineDelimiter(os.Stdout, "|") - defer ld.Flush() - - mapper, _ := f.Object(false) - err := f.PrintObject(cmd, mapper, svc, ld) - if err != nil { - fmt.Printf("Unexpected error: %v", err) - } - // Output: - // |NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE L1| - // |ns1 svc1 10.1.1.1 53/UDP,53/TCP 10y value| - // |ns2 svc2 10.1.1.2 80/TCP,8080/TCP 10y dolla-bill-yall| - // || -} - -func TestNormalizationFuncGlobalExistence(t *testing.T) { - // This test can be safely deleted when we will not support multiple flag formats - root := NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, os.Stdout, os.Stderr) - - if root.Parent() != nil { - t.Fatal("We expect the root command to be returned") - } - if root.GlobalNormalizationFunc() == nil { - t.Fatal("We expect that root command has a global normalization function") - } - - if reflect.ValueOf(root.GlobalNormalizationFunc()).Pointer() != reflect.ValueOf(root.Flags().GetNormalizeFunc()).Pointer() { - t.Fatal("root command seems to have a wrong normalization function") - } - - sub := root - for sub.HasSubCommands() { - sub = sub.Commands()[0] - } - - // In case of failure of this test check this PR: spf13/cobra#110 - if reflect.ValueOf(sub.Flags().GetNormalizeFunc()).Pointer() != reflect.ValueOf(root.Flags().GetNormalizeFunc()).Pointer() { - t.Fatal("child and root commands should have the same normalization functions") - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config.go deleted file mode 100644 index a28563468..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "io" - "path" - "strconv" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" -) - -func NewCmdConfig(pathOptions *clientcmd.PathOptions, out io.Writer) *cobra.Command { - if len(pathOptions.ExplicitFileFlag) == 0 { - pathOptions.ExplicitFileFlag = clientcmd.RecommendedConfigPathFlag - } - - cmd := &cobra.Command{ - Use: "config SUBCOMMAND", - Short: "config modifies kubeconfig files", - Long: `config modifies kubeconfig files using subcommands like "kubectl config set current-context my-context" - -The loading order follows these rules: -1. If the --` + pathOptions.ExplicitFileFlag + ` flag is set, then only that file is loaded. The flag may only be set once and no merging takes place. -2. If $` + pathOptions.EnvVar + ` environment variable is set, then it is used a list of paths (normal path delimitting rules for your system). These paths are merged together. When a value is modified, it is modified in the file that defines the stanza. When a value is created, it is created in the first file that exists. If no files in the chain exist, then it creates the last file in the list. -3. Otherwise, ` + path.Join("${HOME}", pathOptions.GlobalFileSubpath) + ` is used and no merging takes place. -`, - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - - // file paths are common to all sub commands - cmd.PersistentFlags().StringVar(&pathOptions.LoadingRules.ExplicitPath, pathOptions.ExplicitFileFlag, pathOptions.LoadingRules.ExplicitPath, "use a particular kubeconfig file") - - cmd.AddCommand(NewCmdConfigView(out, pathOptions)) - cmd.AddCommand(NewCmdConfigSetCluster(out, pathOptions)) - cmd.AddCommand(NewCmdConfigSetAuthInfo(out, pathOptions)) - cmd.AddCommand(NewCmdConfigSetContext(out, pathOptions)) - cmd.AddCommand(NewCmdConfigSet(out, pathOptions)) - cmd.AddCommand(NewCmdConfigUnset(out, pathOptions)) - cmd.AddCommand(NewCmdConfigCurrentContext(out, pathOptions)) - cmd.AddCommand(NewCmdConfigUseContext(out, pathOptions)) - - return cmd -} - -func toBool(propertyValue string) (bool, error) { - boolValue := false - if len(propertyValue) != 0 { - var err error - boolValue, err = strconv.ParseBool(propertyValue) - if err != nil { - return false, err - } - } - - return boolValue, nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config_test.go deleted file mode 100644 index 33ba5f475..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/config_test.go +++ /dev/null @@ -1,851 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util/diff" -) - -func newRedFederalCowHammerConfig() clientcmdapi.Config { - return clientcmdapi.Config{ - AuthInfos: map[string]*clientcmdapi.AuthInfo{ - "red-user": {Token: "red-token"}}, - Clusters: map[string]*clientcmdapi.Cluster{ - "cow-cluster": {Server: "http://cow.org:8080"}}, - Contexts: map[string]*clientcmdapi.Context{ - "federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}}, - CurrentContext: "federal-context", - } -} - -func Example_view() { - expectedConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"view"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - output := test.run(nil) - fmt.Printf("%v", output) - // Output: - // apiVersion: v1 - // clusters: - // - cluster: - // server: http://cow.org:8080 - // name: cow-cluster - // contexts: - // - context: - // cluster: cow-cluster - // user: red-user - // name: federal-context - // current-context: federal-context - // kind: Config - // preferences: {} - // users: - // - name: red-user - // user: - // token: red-token -} - -func TestCurrentContext(t *testing.T) { - startingConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"current-context"}, - startingConfig: startingConfig, - expectedConfig: startingConfig, - expectedOutputs: []string{startingConfig.CurrentContext}, - } - test.run(t) -} - -func TestSetCurrentContext(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - startingConfig := newRedFederalCowHammerConfig() - - newContextName := "the-new-context" - - startingConfig.Contexts[newContextName] = clientcmdapi.NewContext() - expectedConfig.Contexts[newContextName] = clientcmdapi.NewContext() - - expectedConfig.CurrentContext = newContextName - - test := configCommandTest{ - args: []string{"use-context", "the-new-context"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetNonExistentContext(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"use-context", "non-existent-config"}, - startingConfig: expectedConfig, - expectedConfig: expectedConfig, - expectedOutputs: []string{`no context exists with the name: "non-existent-config"`}, - } - test.run(t) -} - -func TestSetIntoExistingStruct(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["red-user"].Password = "new-path-value" - test := configCommandTest{ - args: []string{"set", "users.red-user.password", "new-path-value"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetWithPathPrefixIntoExistingStruct(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["cow-cluster"].Server = "http://cow.org:8080/foo/baz" - test := configCommandTest{ - args: []string{"set", "clusters.cow-cluster.server", "http://cow.org:8080/foo/baz"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) - - dc := clientcmd.NewDefaultClientConfig(expectedConfig, &clientcmd.ConfigOverrides{}) - dcc, err := dc.ClientConfig() - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - expectedHost := "http://cow.org:8080/foo/baz" - if expectedHost != dcc.Host { - t.Fatalf("expected client.Config.Host = %q instead of %q", expectedHost, dcc.Host) - } -} - -func TestUnsetStruct(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - delete(expectedConfig.AuthInfos, "red-user") - test := configCommandTest{ - args: []string{"unset", "users.red-user"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestUnsetField(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["red-user"] = clientcmdapi.NewAuthInfo() - test := configCommandTest{ - args: []string{"unset", "users.red-user.token"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetIntoNewStruct(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - cluster := clientcmdapi.NewCluster() - cluster.Server = "new-server-value" - expectedConfig.Clusters["big-cluster"] = cluster - test := configCommandTest{ - args: []string{"set", "clusters.big-cluster.server", "new-server-value"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetBoolean(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - cluster := clientcmdapi.NewCluster() - cluster.InsecureSkipTLSVerify = true - expectedConfig.Clusters["big-cluster"] = cluster - test := configCommandTest{ - args: []string{"set", "clusters.big-cluster.insecure-skip-tls-verify", "true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetIntoNewConfig(t *testing.T) { - expectedConfig := *clientcmdapi.NewConfig() - context := clientcmdapi.NewContext() - context.AuthInfo = "fake-user" - expectedConfig.Contexts["new-context"] = context - test := configCommandTest{ - args: []string{"set", "contexts.new-context.user", "fake-user"}, - startingConfig: *clientcmdapi.NewConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestNewEmptyAuth(t *testing.T) { - expectedConfig := *clientcmdapi.NewConfig() - expectedConfig.AuthInfos["the-user-name"] = clientcmdapi.NewAuthInfo() - test := configCommandTest{ - args: []string{"set-credentials", "the-user-name"}, - startingConfig: *clientcmdapi.NewConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestAdditionalAuth(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - authInfo := clientcmdapi.NewAuthInfo() - authInfo.Token = "token" - expectedConfig.AuthInfos["another-user"] = authInfo - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagBearerToken + "=token"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestEmbedClientCert(t *testing.T) { - fakeCertFile, _ := ioutil.TempFile("", "") - defer os.Remove(fakeCertFile.Name()) - fakeData := []byte("fake-data") - ioutil.WriteFile(fakeCertFile.Name(), fakeData, 0600) - expectedConfig := newRedFederalCowHammerConfig() - authInfo := clientcmdapi.NewAuthInfo() - authInfo.ClientCertificateData = fakeData - expectedConfig.AuthInfos["another-user"] = authInfo - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagCertFile + "=" + fakeCertFile.Name(), "--" + clientcmd.FlagEmbedCerts + "=true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestEmbedClientKey(t *testing.T) { - fakeKeyFile, _ := ioutil.TempFile("", "") - defer os.Remove(fakeKeyFile.Name()) - fakeData := []byte("fake-data") - ioutil.WriteFile(fakeKeyFile.Name(), fakeData, 0600) - expectedConfig := newRedFederalCowHammerConfig() - authInfo := clientcmdapi.NewAuthInfo() - authInfo.ClientKeyData = fakeData - expectedConfig.AuthInfos["another-user"] = authInfo - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagKeyFile + "=" + fakeKeyFile.Name(), "--" + clientcmd.FlagEmbedCerts + "=true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestEmbedNoKeyOrCertDisallowed(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagEmbedCerts + "=true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - expectedOutputs: []string{"--client-certificate", "--client-key", "embed"}, - } - - test.run(t) -} - -func TestEmptyTokenAndCertAllowed(t *testing.T) { - fakeCertFile, _ := ioutil.TempFile("", "cert-file") - - expectedConfig := newRedFederalCowHammerConfig() - authInfo := clientcmdapi.NewAuthInfo() - authInfo.ClientCertificate = path.Base(fakeCertFile.Name()) - expectedConfig.AuthInfos["another-user"] = authInfo - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagCertFile + "=" + fakeCertFile.Name(), "--" + clientcmd.FlagBearerToken + "="}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestTokenAndCertAllowed(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - authInfo := clientcmdapi.NewAuthInfo() - authInfo.Token = "token" - authInfo.ClientCertificate = "/cert-file" - expectedConfig.AuthInfos["another-user"] = authInfo - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagCertFile + "=/cert-file", "--" + clientcmd.FlagBearerToken + "=token"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestTokenAndBasicDisallowed(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagUsername + "=myuser", "--" + clientcmd.FlagBearerToken + "=token"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - expectedOutputs: []string{"--token", "--username"}, - } - - test.run(t) -} - -func TestBasicClearsToken(t *testing.T) { - authInfoWithToken := clientcmdapi.NewAuthInfo() - authInfoWithToken.Token = "token" - - authInfoWithBasic := clientcmdapi.NewAuthInfo() - authInfoWithBasic.Username = "myuser" - authInfoWithBasic.Password = "mypass" - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.AuthInfos["another-user"] = authInfoWithToken - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["another-user"] = authInfoWithBasic - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagUsername + "=myuser", "--" + clientcmd.FlagPassword + "=mypass"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestTokenClearsBasic(t *testing.T) { - authInfoWithBasic := clientcmdapi.NewAuthInfo() - authInfoWithBasic.Username = "myuser" - authInfoWithBasic.Password = "mypass" - - authInfoWithToken := clientcmdapi.NewAuthInfo() - authInfoWithToken.Token = "token" - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.AuthInfos["another-user"] = authInfoWithBasic - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["another-user"] = authInfoWithToken - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagBearerToken + "=token"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestTokenLeavesCert(t *testing.T) { - authInfoWithCerts := clientcmdapi.NewAuthInfo() - authInfoWithCerts.ClientCertificate = "cert" - authInfoWithCerts.ClientCertificateData = []byte("certdata") - authInfoWithCerts.ClientKey = "key" - authInfoWithCerts.ClientKeyData = []byte("keydata") - - authInfoWithTokenAndCerts := clientcmdapi.NewAuthInfo() - authInfoWithTokenAndCerts.Token = "token" - authInfoWithTokenAndCerts.ClientCertificate = "cert" - authInfoWithTokenAndCerts.ClientCertificateData = []byte("certdata") - authInfoWithTokenAndCerts.ClientKey = "key" - authInfoWithTokenAndCerts.ClientKeyData = []byte("keydata") - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.AuthInfos["another-user"] = authInfoWithCerts - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["another-user"] = authInfoWithTokenAndCerts - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagBearerToken + "=token"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestCertLeavesToken(t *testing.T) { - authInfoWithToken := clientcmdapi.NewAuthInfo() - authInfoWithToken.Token = "token" - - authInfoWithTokenAndCerts := clientcmdapi.NewAuthInfo() - authInfoWithTokenAndCerts.Token = "token" - authInfoWithTokenAndCerts.ClientCertificate = "/cert" - authInfoWithTokenAndCerts.ClientKey = "/key" - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.AuthInfos["another-user"] = authInfoWithToken - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.AuthInfos["another-user"] = authInfoWithTokenAndCerts - - test := configCommandTest{ - args: []string{"set-credentials", "another-user", "--" + clientcmd.FlagCertFile + "=/cert", "--" + clientcmd.FlagKeyFile + "=/key"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetBytesBad(t *testing.T) { - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clientcmdapi.NewCluster() - - test := configCommandTest{ - args: []string{"set", "clusters.another-cluster.certificate-authority-data", "cadata"}, - startingConfig: startingConfig, - expectedConfig: startingConfig, - } - - test.run(t) -} - -func TestSetBytes(t *testing.T) { - clusterInfoWithCAData := clientcmdapi.NewCluster() - clusterInfoWithCAData.CertificateAuthorityData = []byte("cadata") - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clientcmdapi.NewCluster() - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithCAData - - test := configCommandTest{ - args: []string{"set", "clusters.another-cluster.certificate-authority-data", "cadata", "--set-raw-bytes"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestSetBase64Bytes(t *testing.T) { - clusterInfoWithCAData := clientcmdapi.NewCluster() - clusterInfoWithCAData.CertificateAuthorityData = []byte("cadata") - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clientcmdapi.NewCluster() - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithCAData - - test := configCommandTest{ - args: []string{"set", "clusters.another-cluster.certificate-authority-data", "Y2FkYXRh"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestUnsetBytes(t *testing.T) { - clusterInfoWithCAData := clientcmdapi.NewCluster() - clusterInfoWithCAData.CertificateAuthorityData = []byte("cadata") - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clusterInfoWithCAData - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clientcmdapi.NewCluster() - - test := configCommandTest{ - args: []string{"unset", "clusters.another-cluster.certificate-authority-data"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestCAClearsInsecure(t *testing.T) { - fakeCAFile, _ := ioutil.TempFile("", "ca-file") - - clusterInfoWithInsecure := clientcmdapi.NewCluster() - clusterInfoWithInsecure.InsecureSkipTLSVerify = true - - clusterInfoWithCA := clientcmdapi.NewCluster() - clusterInfoWithCA.CertificateAuthority = path.Base(fakeCAFile.Name()) - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clusterInfoWithInsecure - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithCA - - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagCAFile + "=" + fakeCAFile.Name()}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestCAClearsCAData(t *testing.T) { - clusterInfoWithCAData := clientcmdapi.NewCluster() - clusterInfoWithCAData.CertificateAuthorityData = []byte("cadata") - - clusterInfoWithCA := clientcmdapi.NewCluster() - clusterInfoWithCA.CertificateAuthority = "/cafile" - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clusterInfoWithCAData - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithCA - - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagCAFile + "=/cafile", "--" + clientcmd.FlagInsecure + "=false"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestInsecureClearsCA(t *testing.T) { - clusterInfoWithInsecure := clientcmdapi.NewCluster() - clusterInfoWithInsecure.InsecureSkipTLSVerify = true - - clusterInfoWithCA := clientcmdapi.NewCluster() - clusterInfoWithCA.CertificateAuthority = "cafile" - clusterInfoWithCA.CertificateAuthorityData = []byte("cadata") - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clusterInfoWithCA - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithInsecure - - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagInsecure + "=true"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestCADataClearsCA(t *testing.T) { - fakeCAFile, _ := ioutil.TempFile("", "") - defer os.Remove(fakeCAFile.Name()) - fakeData := []byte("cadata") - ioutil.WriteFile(fakeCAFile.Name(), fakeData, 0600) - - clusterInfoWithCAData := clientcmdapi.NewCluster() - clusterInfoWithCAData.CertificateAuthorityData = fakeData - - clusterInfoWithCA := clientcmdapi.NewCluster() - clusterInfoWithCA.CertificateAuthority = "cafile" - - startingConfig := newRedFederalCowHammerConfig() - startingConfig.Clusters["another-cluster"] = clusterInfoWithCA - - expectedConfig := newRedFederalCowHammerConfig() - expectedConfig.Clusters["another-cluster"] = clusterInfoWithCAData - - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagCAFile + "=" + fakeCAFile.Name(), "--" + clientcmd.FlagEmbedCerts + "=true"}, - startingConfig: startingConfig, - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestEmbedNoCADisallowed(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagEmbedCerts + "=true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - expectedOutputs: []string{"--certificate-authority", "embed"}, - } - - test.run(t) -} - -func TestCAAndInsecureDisallowed(t *testing.T) { - test := configCommandTest{ - args: []string{"set-cluster", "another-cluster", "--" + clientcmd.FlagCAFile + "=cafile", "--" + clientcmd.FlagInsecure + "=true"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: newRedFederalCowHammerConfig(), - expectedOutputs: []string{"certificate", "insecure"}, - } - - test.run(t) -} - -func TestMergeExistingAuth(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - authInfo := expectedConfig.AuthInfos["red-user"] - authInfo.ClientKey = "/key" - expectedConfig.AuthInfos["red-user"] = authInfo - test := configCommandTest{ - args: []string{"set-credentials", "red-user", "--" + clientcmd.FlagKeyFile + "=/key"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestNewEmptyCluster(t *testing.T) { - expectedConfig := *clientcmdapi.NewConfig() - expectedConfig.Clusters["new-cluster"] = clientcmdapi.NewCluster() - test := configCommandTest{ - args: []string{"set-cluster", "new-cluster"}, - startingConfig: *clientcmdapi.NewConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestAdditionalCluster(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - cluster := clientcmdapi.NewCluster() - cluster.CertificateAuthority = "/ca-location" - cluster.InsecureSkipTLSVerify = false - cluster.Server = "serverlocation" - expectedConfig.Clusters["different-cluster"] = cluster - test := configCommandTest{ - args: []string{"set-cluster", "different-cluster", "--" + clientcmd.FlagAPIServer + "=serverlocation", "--" + clientcmd.FlagInsecure + "=false", "--" + clientcmd.FlagCAFile + "=/ca-location"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestOverwriteExistingCluster(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - cluster := clientcmdapi.NewCluster() - cluster.Server = "serverlocation" - expectedConfig.Clusters["cow-cluster"] = cluster - - test := configCommandTest{ - args: []string{"set-cluster", "cow-cluster", "--" + clientcmd.FlagAPIServer + "=serverlocation"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestNewEmptyContext(t *testing.T) { - expectedConfig := *clientcmdapi.NewConfig() - expectedConfig.Contexts["new-context"] = clientcmdapi.NewContext() - test := configCommandTest{ - args: []string{"set-context", "new-context"}, - startingConfig: *clientcmdapi.NewConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestAdditionalContext(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - context := clientcmdapi.NewContext() - context.Cluster = "some-cluster" - context.AuthInfo = "some-user" - context.Namespace = "different-namespace" - expectedConfig.Contexts["different-context"] = context - test := configCommandTest{ - args: []string{"set-context", "different-context", "--" + clientcmd.FlagClusterName + "=some-cluster", "--" + clientcmd.FlagAuthInfoName + "=some-user", "--" + clientcmd.FlagNamespace + "=different-namespace"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestMergeExistingContext(t *testing.T) { - expectedConfig := newRedFederalCowHammerConfig() - context := expectedConfig.Contexts["federal-context"] - context.Namespace = "hammer" - expectedConfig.Contexts["federal-context"] = context - - test := configCommandTest{ - args: []string{"set-context", "federal-context", "--" + clientcmd.FlagNamespace + "=hammer"}, - startingConfig: newRedFederalCowHammerConfig(), - expectedConfig: expectedConfig, - } - - test.run(t) -} - -func TestToBool(t *testing.T) { - type test struct { - in string - out bool - err string - } - - tests := []test{ - {"", false, ""}, - {"true", true, ""}, - {"on", false, `strconv.ParseBool: parsing "on": invalid syntax`}, - } - - for _, curr := range tests { - b, err := toBool(curr.in) - if (len(curr.err) != 0) && err == nil { - t.Errorf("Expected error: %v, but got nil", curr.err) - } - if (len(curr.err) == 0) && err != nil { - t.Errorf("Unexpected error: %v", err) - } - if (err != nil) && (err.Error() != curr.err) { - t.Errorf("Expected %v, got %v", curr.err, err) - - } - if b != curr.out { - t.Errorf("Expected %v, got %v", curr.out, b) - } - } - -} - -func testConfigCommand(args []string, startingConfig clientcmdapi.Config, t *testing.T) (string, clientcmdapi.Config) { - fakeKubeFile, _ := ioutil.TempFile("", "") - defer os.Remove(fakeKubeFile.Name()) - err := clientcmd.WriteToFile(startingConfig, fakeKubeFile.Name()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - argsToUse := make([]string, 0, 2+len(args)) - argsToUse = append(argsToUse, "--kubeconfig="+fakeKubeFile.Name()) - argsToUse = append(argsToUse, args...) - - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdConfig(clientcmd.NewDefaultPathOptions(), buf) - cmd.SetArgs(argsToUse) - cmd.Execute() - - // outBytes, _ := ioutil.ReadFile(fakeKubeFile.Name()) - config := clientcmd.GetConfigFromFileOrDie(fakeKubeFile.Name()) - - return buf.String(), *config -} - -type configCommandTest struct { - args []string - startingConfig clientcmdapi.Config - expectedConfig clientcmdapi.Config - expectedOutputs []string -} - -func (test configCommandTest) run(t *testing.T) string { - out, actualConfig := testConfigCommand(test.args, test.startingConfig, t) - - testSetNilMapsToEmpties(reflect.ValueOf(&test.expectedConfig)) - testSetNilMapsToEmpties(reflect.ValueOf(&actualConfig)) - testClearLocationOfOrigin(&actualConfig) - - if !api.Semantic.DeepEqual(test.expectedConfig, actualConfig) { - t.Errorf("diff: %v", diff.ObjectDiff(test.expectedConfig, actualConfig)) - t.Errorf("expected: %#v\n actual: %#v", test.expectedConfig, actualConfig) - } - - for _, expectedOutput := range test.expectedOutputs { - if !strings.Contains(out, expectedOutput) { - t.Errorf("expected '%s' in output, got '%s'", expectedOutput, out) - } - } - - return out -} -func testClearLocationOfOrigin(config *clientcmdapi.Config) { - for key, obj := range config.AuthInfos { - obj.LocationOfOrigin = "" - config.AuthInfos[key] = obj - } - for key, obj := range config.Clusters { - obj.LocationOfOrigin = "" - config.Clusters[key] = obj - } - for key, obj := range config.Contexts { - obj.LocationOfOrigin = "" - config.Contexts[key] = obj - } -} -func testSetNilMapsToEmpties(curr reflect.Value) { - actualCurrValue := curr - if curr.Kind() == reflect.Ptr { - actualCurrValue = curr.Elem() - } - - switch actualCurrValue.Kind() { - case reflect.Map: - for _, mapKey := range actualCurrValue.MapKeys() { - currMapValue := actualCurrValue.MapIndex(mapKey) - testSetNilMapsToEmpties(currMapValue) - } - - case reflect.Struct: - for fieldIndex := 0; fieldIndex < actualCurrValue.NumField(); fieldIndex++ { - currFieldValue := actualCurrValue.Field(fieldIndex) - - if currFieldValue.Kind() == reflect.Map && currFieldValue.IsNil() { - newValue := reflect.MakeMap(currFieldValue.Type()) - currFieldValue.Set(newValue) - } else { - testSetNilMapsToEmpties(currFieldValue.Addr()) - } - } - - } - -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_authinfo.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_authinfo.go deleted file mode 100644 index 2fd8cf2cb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_authinfo.go +++ /dev/null @@ -1,237 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/flag" -) - -type createAuthInfoOptions struct { - configAccess clientcmd.ConfigAccess - name string - authPath util.StringFlag - clientCertificate util.StringFlag - clientKey util.StringFlag - token util.StringFlag - username util.StringFlag - password util.StringFlag - embedCertData flag.Tristate -} - -var create_authinfo_long = fmt.Sprintf(`Sets a user entry in kubeconfig -Specifying a name that already exists will merge new fields on top of existing values. - - Client-certificate flags: - --%v=certfile --%v=keyfile - - Bearer token flags: - --%v=bearer_token - - Basic auth flags: - --%v=basic_user --%v=basic_password - - Bearer token and basic auth are mutually exclusive. -`, clientcmd.FlagCertFile, clientcmd.FlagKeyFile, clientcmd.FlagBearerToken, clientcmd.FlagUsername, clientcmd.FlagPassword) - -const create_authinfo_example = `# Set only the "client-key" field on the "cluster-admin" -# entry, without touching other values: -kubectl config set-credentials cluster-admin --client-key=~/.kube/admin.key - -# Set basic auth for the "cluster-admin" entry -kubectl config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif - -# Embed client certificate data in the "cluster-admin" entry -kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true` - -func NewCmdConfigSetAuthInfo(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &createAuthInfoOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: fmt.Sprintf("set-credentials NAME [--%v=path/to/certfile] [--%v=path/to/keyfile] [--%v=bearer_token] [--%v=basic_user] [--%v=basic_password]", clientcmd.FlagCertFile, clientcmd.FlagKeyFile, clientcmd.FlagBearerToken, clientcmd.FlagUsername, clientcmd.FlagPassword), - Short: "Sets a user entry in kubeconfig", - Long: create_authinfo_long, - Example: create_authinfo_example, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "user %q set.\n", options.name) - } - }, - } - - cmd.Flags().Var(&options.clientCertificate, clientcmd.FlagCertFile, "path to "+clientcmd.FlagCertFile+" file for the user entry in kubeconfig") - cmd.MarkFlagFilename(clientcmd.FlagCertFile) - cmd.Flags().Var(&options.clientKey, clientcmd.FlagKeyFile, "path to "+clientcmd.FlagKeyFile+" file for the user entry in kubeconfig") - cmd.MarkFlagFilename(clientcmd.FlagKeyFile) - cmd.Flags().Var(&options.token, clientcmd.FlagBearerToken, clientcmd.FlagBearerToken+" for the user entry in kubeconfig") - cmd.Flags().Var(&options.username, clientcmd.FlagUsername, clientcmd.FlagUsername+" for the user entry in kubeconfig") - cmd.Flags().Var(&options.password, clientcmd.FlagPassword, clientcmd.FlagPassword+" for the user entry in kubeconfig") - f := cmd.Flags().VarPF(&options.embedCertData, clientcmd.FlagEmbedCerts, "", "embed client cert/key for the user entry in kubeconfig") - f.NoOptDefVal = "true" - - return cmd -} - -func (o createAuthInfoOptions) run() error { - err := o.validate() - if err != nil { - return err - } - - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - - startingStanza, exists := config.AuthInfos[o.name] - if !exists { - startingStanza = clientcmdapi.NewAuthInfo() - } - authInfo := o.modifyAuthInfo(*startingStanza) - config.AuthInfos[o.name] = &authInfo - - if err := clientcmd.ModifyConfig(o.configAccess, *config, true); err != nil { - return err - } - - return nil -} - -// authInfo builds an AuthInfo object from the options -func (o *createAuthInfoOptions) modifyAuthInfo(existingAuthInfo clientcmdapi.AuthInfo) clientcmdapi.AuthInfo { - modifiedAuthInfo := existingAuthInfo - - var setToken, setBasic bool - - if o.clientCertificate.Provided() { - certPath := o.clientCertificate.Value() - if o.embedCertData.Value() { - modifiedAuthInfo.ClientCertificateData, _ = ioutil.ReadFile(certPath) - modifiedAuthInfo.ClientCertificate = "" - } else { - certPath, _ = filepath.Abs(certPath) - modifiedAuthInfo.ClientCertificate = certPath - if len(modifiedAuthInfo.ClientCertificate) > 0 { - modifiedAuthInfo.ClientCertificateData = nil - } - } - } - if o.clientKey.Provided() { - keyPath := o.clientKey.Value() - if o.embedCertData.Value() { - modifiedAuthInfo.ClientKeyData, _ = ioutil.ReadFile(keyPath) - modifiedAuthInfo.ClientKey = "" - } else { - keyPath, _ = filepath.Abs(keyPath) - modifiedAuthInfo.ClientKey = keyPath - if len(modifiedAuthInfo.ClientKey) > 0 { - modifiedAuthInfo.ClientKeyData = nil - } - } - } - - if o.token.Provided() { - modifiedAuthInfo.Token = o.token.Value() - setToken = len(modifiedAuthInfo.Token) > 0 - } - - if o.username.Provided() { - modifiedAuthInfo.Username = o.username.Value() - setBasic = setBasic || len(modifiedAuthInfo.Username) > 0 - } - if o.password.Provided() { - modifiedAuthInfo.Password = o.password.Value() - setBasic = setBasic || len(modifiedAuthInfo.Password) > 0 - } - - // If any auth info was set, make sure any other existing auth types are cleared - if setToken || setBasic { - if !setToken { - modifiedAuthInfo.Token = "" - } - if !setBasic { - modifiedAuthInfo.Username = "" - modifiedAuthInfo.Password = "" - } - } - - return modifiedAuthInfo -} - -func (o *createAuthInfoOptions) complete(cmd *cobra.Command) bool { - args := cmd.Flags().Args() - if len(args) != 1 { - cmd.Help() - return false - } - - o.name = args[0] - return true -} - -func (o createAuthInfoOptions) validate() error { - if len(o.name) == 0 { - return errors.New("you must specify a non-empty user name") - } - methods := []string{} - if len(o.token.Value()) > 0 { - methods = append(methods, fmt.Sprintf("--%v", clientcmd.FlagBearerToken)) - } - if len(o.username.Value()) > 0 || len(o.password.Value()) > 0 { - methods = append(methods, fmt.Sprintf("--%v/--%v", clientcmd.FlagUsername, clientcmd.FlagPassword)) - } - if len(methods) > 1 { - return fmt.Errorf("you cannot specify more than one authentication method at the same time: %v", strings.Join(methods, ", ")) - } - if o.embedCertData.Value() { - certPath := o.clientCertificate.Value() - keyPath := o.clientKey.Value() - if certPath == "" && keyPath == "" { - return fmt.Errorf("you must specify a --%s or --%s to embed", clientcmd.FlagCertFile, clientcmd.FlagKeyFile) - } - if certPath != "" { - if _, err := ioutil.ReadFile(certPath); err != nil { - return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagCertFile, certPath, err) - } - } - if keyPath != "" { - if _, err := ioutil.ReadFile(keyPath); err != nil { - return fmt.Errorf("error reading %s data from %s: %v", clientcmd.FlagKeyFile, keyPath, err) - } - } - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_cluster.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_cluster.go deleted file mode 100644 index dc9de40a0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_cluster.go +++ /dev/null @@ -1,182 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "path/filepath" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util" - "k8s.io/kubernetes/pkg/util/flag" -) - -type createClusterOptions struct { - configAccess clientcmd.ConfigAccess - name string - server util.StringFlag - apiVersion util.StringFlag - insecureSkipTLSVerify flag.Tristate - certificateAuthority util.StringFlag - embedCAData flag.Tristate -} - -const ( - create_cluster_long = `Sets a cluster entry in kubeconfig. -Specifying a name that already exists will merge new fields on top of existing values for those fields.` - create_cluster_example = `# Set only the server field on the e2e cluster entry without touching other values. -kubectl config set-cluster e2e --server=https://1.2.3.4 - -# Embed certificate authority data for the e2e cluster entry -kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/kubernetes.ca.crt - -# Disable cert checking for the dev cluster entry -kubectl config set-cluster e2e --insecure-skip-tls-verify=true` -) - -func NewCmdConfigSetCluster(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &createClusterOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: fmt.Sprintf("set-cluster NAME [--%v=server] [--%v=path/to/certficate/authority] [--%v=true]", clientcmd.FlagAPIServer, clientcmd.FlagCAFile, clientcmd.FlagInsecure), - Short: "Sets a cluster entry in kubeconfig", - Long: create_cluster_long, - Example: create_cluster_example, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "cluster %q set.\n", options.name) - } - }, - } - - options.insecureSkipTLSVerify.Default(false) - - cmd.Flags().Var(&options.server, clientcmd.FlagAPIServer, clientcmd.FlagAPIServer+" for the cluster entry in kubeconfig") - cmd.Flags().Var(&options.apiVersion, clientcmd.FlagAPIVersion, clientcmd.FlagAPIVersion+" for the cluster entry in kubeconfig") - f := cmd.Flags().VarPF(&options.insecureSkipTLSVerify, clientcmd.FlagInsecure, "", clientcmd.FlagInsecure+" for the cluster entry in kubeconfig") - f.NoOptDefVal = "true" - cmd.Flags().Var(&options.certificateAuthority, clientcmd.FlagCAFile, "path to "+clientcmd.FlagCAFile+" file for the cluster entry in kubeconfig") - cmd.MarkFlagFilename(clientcmd.FlagCAFile) - f = cmd.Flags().VarPF(&options.embedCAData, clientcmd.FlagEmbedCerts, "", clientcmd.FlagEmbedCerts+" for the cluster entry in kubeconfig") - f.NoOptDefVal = "true" - - return cmd -} - -func (o createClusterOptions) run() error { - err := o.validate() - if err != nil { - return err - } - - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - - startingStanza, exists := config.Clusters[o.name] - if !exists { - startingStanza = clientcmdapi.NewCluster() - } - cluster := o.modifyCluster(*startingStanza) - config.Clusters[o.name] = &cluster - - if err := clientcmd.ModifyConfig(o.configAccess, *config, true); err != nil { - return err - } - - return nil -} - -// cluster builds a Cluster object from the options -func (o *createClusterOptions) modifyCluster(existingCluster clientcmdapi.Cluster) clientcmdapi.Cluster { - modifiedCluster := existingCluster - - if o.server.Provided() { - modifiedCluster.Server = o.server.Value() - } - if o.insecureSkipTLSVerify.Provided() { - modifiedCluster.InsecureSkipTLSVerify = o.insecureSkipTLSVerify.Value() - // Specifying insecure mode clears any certificate authority - if modifiedCluster.InsecureSkipTLSVerify { - modifiedCluster.CertificateAuthority = "" - modifiedCluster.CertificateAuthorityData = nil - } - } - if o.certificateAuthority.Provided() { - caPath := o.certificateAuthority.Value() - if o.embedCAData.Value() { - modifiedCluster.CertificateAuthorityData, _ = ioutil.ReadFile(caPath) - modifiedCluster.InsecureSkipTLSVerify = false - modifiedCluster.CertificateAuthority = "" - } else { - caPath, _ = filepath.Abs(caPath) - modifiedCluster.CertificateAuthority = caPath - // Specifying a certificate authority file clears certificate authority data and insecure mode - if caPath != "" { - modifiedCluster.InsecureSkipTLSVerify = false - modifiedCluster.CertificateAuthorityData = nil - } - } - } - - return modifiedCluster -} - -func (o *createClusterOptions) complete(cmd *cobra.Command) bool { - args := cmd.Flags().Args() - if len(args) != 1 { - cmd.Help() - return false - } - - o.name = args[0] - return true -} - -func (o createClusterOptions) validate() error { - if len(o.name) == 0 { - return errors.New("you must specify a non-empty cluster name") - } - if o.insecureSkipTLSVerify.Value() && o.certificateAuthority.Value() != "" { - return errors.New("you cannot specify a certificate authority and insecure mode at the same time") - } - if o.embedCAData.Value() { - caPath := o.certificateAuthority.Value() - if caPath == "" { - return fmt.Errorf("you must specify a --%s to embed", clientcmd.FlagCAFile) - } - if _, err := ioutil.ReadFile(caPath); err != nil { - return fmt.Errorf("could not read %s data from %s: %v", clientcmd.FlagCAFile, caPath, err) - } - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_context.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_context.go deleted file mode 100644 index 7f0ca2170..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/create_context.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util" -) - -type createContextOptions struct { - configAccess clientcmd.ConfigAccess - name string - cluster util.StringFlag - authInfo util.StringFlag - namespace util.StringFlag -} - -const ( - create_context_long = `Sets a context entry in kubeconfig -Specifying a name that already exists will merge new fields on top of existing values for those fields.` - create_context_example = `# Set the user field on the gce context entry without touching other values -kubectl config set-context gce --user=cluster-admin` -) - -func NewCmdConfigSetContext(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &createContextOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: fmt.Sprintf("set-context NAME [--%v=cluster_nickname] [--%v=user_nickname] [--%v=namespace]", clientcmd.FlagClusterName, clientcmd.FlagAuthInfoName, clientcmd.FlagNamespace), - Short: "Sets a context entry in kubeconfig", - Long: create_context_long, - Example: create_context_example, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "context %q set.\n", options.name) - } - }, - } - - cmd.Flags().Var(&options.cluster, clientcmd.FlagClusterName, clientcmd.FlagClusterName+" for the context entry in kubeconfig") - cmd.Flags().Var(&options.authInfo, clientcmd.FlagAuthInfoName, clientcmd.FlagAuthInfoName+" for the context entry in kubeconfig") - cmd.Flags().Var(&options.namespace, clientcmd.FlagNamespace, clientcmd.FlagNamespace+" for the context entry in kubeconfig") - - return cmd -} - -func (o createContextOptions) run() error { - err := o.validate() - if err != nil { - return err - } - - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - - startingStanza, exists := config.Contexts[o.name] - if !exists { - startingStanza = clientcmdapi.NewContext() - } - context := o.modifyContext(*startingStanza) - config.Contexts[o.name] = &context - - if err := clientcmd.ModifyConfig(o.configAccess, *config, true); err != nil { - return err - } - - return nil -} - -func (o *createContextOptions) modifyContext(existingContext clientcmdapi.Context) clientcmdapi.Context { - modifiedContext := existingContext - - if o.cluster.Provided() { - modifiedContext.Cluster = o.cluster.Value() - } - if o.authInfo.Provided() { - modifiedContext.AuthInfo = o.authInfo.Value() - } - if o.namespace.Provided() { - modifiedContext.Namespace = o.namespace.Value() - } - - return modifiedContext -} - -func (o *createContextOptions) complete(cmd *cobra.Command) bool { - args := cmd.Flags().Args() - if len(args) != 1 { - cmd.Help() - return false - } - - o.name = args[0] - return true -} - -func (o createContextOptions) validate() error { - if len(o.name) == 0 { - return errors.New("you must specify a non-empty context name") - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context.go deleted file mode 100644 index f2941c6db..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -type CurrentContextOptions struct { - ConfigAccess clientcmd.ConfigAccess -} - -const ( - current_context_long = `Displays the current-context` - current_context_example = `# Display the current-context -kubectl config current-context` -) - -func NewCmdConfigCurrentContext(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &CurrentContextOptions{ConfigAccess: configAccess} - - cmd := &cobra.Command{ - Use: "current-context", - Short: "Displays the current-context", - Long: current_context_long, - Example: current_context_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunCurrentContext(out, args, options) - cmdutil.CheckErr(err) - }, - } - - return cmd -} - -func RunCurrentContext(out io.Writer, args []string, options *CurrentContextOptions) error { - config, err := options.ConfigAccess.GetStartingConfig() - if err != nil { - return err - } - - if config.CurrentContext == "" { - err = fmt.Errorf("current-context is not set\n") - return err - } - - fmt.Fprintf(out, "%s\n", config.CurrentContext) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context_test.go deleted file mode 100644 index 7a68415f6..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/current_context_test.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "bytes" - "io/ioutil" - "os" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" -) - -type currentContextTest struct { - startingConfig clientcmdapi.Config - expectedError string -} - -func newFederalContextConfig() clientcmdapi.Config { - return clientcmdapi.Config{ - CurrentContext: "federal-context", - } -} - -func TestCurrentContextWithSetContext(t *testing.T) { - test := currentContextTest{ - startingConfig: newFederalContextConfig(), - expectedError: "", - } - - test.run(t) -} - -func TestCurrentContextWithUnsetContext(t *testing.T) { - test := currentContextTest{ - startingConfig: *clientcmdapi.NewConfig(), - expectedError: "current-context is not set", - } - - test.run(t) -} - -func (test currentContextTest) run(t *testing.T) { - fakeKubeFile, _ := ioutil.TempFile("", "") - defer os.Remove(fakeKubeFile.Name()) - err := clientcmd.WriteToFile(test.startingConfig, fakeKubeFile.Name()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - pathOptions := clientcmd.NewDefaultPathOptions() - pathOptions.GlobalFile = fakeKubeFile.Name() - pathOptions.EnvVar = "" - options := CurrentContextOptions{ - ConfigAccess: pathOptions, - } - - buf := bytes.NewBuffer([]byte{}) - err = RunCurrentContext(buf, []string{}, &options) - if len(test.expectedError) != 0 { - if err == nil { - t.Errorf("Did not get %v", test.expectedError) - } else { - if !strings.Contains(err.Error(), test.expectedError) { - t.Errorf("Expected %v, but got %v", test.expectedError, err) - } - } - return - } - - if err != nil { - t.Errorf("Unexpected error: %v", err) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser.go deleted file mode 100644 index 0be5f241e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser.go +++ /dev/null @@ -1,152 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "fmt" - "reflect" - "strings" - - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util/sets" -) - -type navigationSteps struct { - steps []navigationStep - currentStepIndex int -} - -type navigationStep struct { - stepValue string - stepType reflect.Type -} - -func newNavigationSteps(path string) (*navigationSteps, error) { - steps := []navigationStep{} - individualParts := strings.Split(path, ".") - - currType := reflect.TypeOf(clientcmdapi.Config{}) - currPartIndex := 0 - for currPartIndex < len(individualParts) { - switch currType.Kind() { - case reflect.Map: - // if we're in a map, we need to locate a name. That name may contain dots, so we need to know what tokens are legal for the map's value type - // for example, we could have a set request like: `set clusters.10.10.12.56.insecure-skip-tls-verify true`. We enter this case with - // steps representing 10, 10, 12, 56, insecure-skip-tls-verify. The name is "10.10.12.56", so we want to collect all those parts together and - // store them as a single step. In order to do that, we need to determine what set of tokens is a legal step AFTER the name of the map key - // This set of reflective code pulls the type of the map values, uses that type to look up the set of legal tags. Those legal tags are used to - // walk the list of remaining parts until we find a match to a legal tag or the end of the string. That name is used to burn all the used parts. - mapValueType := currType.Elem().Elem() - mapValueOptions, err := getPotentialTypeValues(mapValueType) - if err != nil { - return nil, err - } - nextPart := findNameStep(individualParts[currPartIndex:], sets.StringKeySet(mapValueOptions)) - - steps = append(steps, navigationStep{nextPart, mapValueType}) - currPartIndex += len(strings.Split(nextPart, ".")) - currType = mapValueType - - case reflect.Struct: - nextPart := individualParts[currPartIndex] - - options, err := getPotentialTypeValues(currType) - if err != nil { - return nil, err - } - fieldType, exists := options[nextPart] - if !exists { - return nil, fmt.Errorf("unable to parse %v after %v at %v", path, steps, currType) - } - - steps = append(steps, navigationStep{nextPart, fieldType}) - currPartIndex += len(strings.Split(nextPart, ".")) - currType = fieldType - } - } - - return &navigationSteps{steps, 0}, nil -} - -func (s *navigationSteps) pop() navigationStep { - if s.moreStepsRemaining() { - s.currentStepIndex++ - return s.steps[s.currentStepIndex-1] - } - return navigationStep{} -} - -func (s *navigationSteps) peek() navigationStep { - if s.moreStepsRemaining() { - return s.steps[s.currentStepIndex] - } - return navigationStep{} -} - -func (s *navigationSteps) moreStepsRemaining() bool { - return len(s.steps) > s.currentStepIndex -} - -// findNameStep takes the list of parts and a set of valid tags that can be used after the name. It then walks the list of parts -// until it find a valid "next" tag or until it reaches the end of the parts and then builds the name back up out of the individual parts -func findNameStep(parts []string, typeOptions sets.String) string { - if len(parts) == 0 { - return "" - } - - numberOfPartsInStep := findKnownValue(parts[1:], typeOptions) + 1 - // if we didn't find a known value, then the entire thing must be a name - if numberOfPartsInStep == 0 { - numberOfPartsInStep = len(parts) - } - nextParts := parts[0:numberOfPartsInStep] - - return strings.Join(nextParts, ".") -} - -// getPotentialTypeValues takes a type and looks up the tags used to represent its fields when serialized. -func getPotentialTypeValues(typeValue reflect.Type) (map[string]reflect.Type, error) { - if typeValue.Kind() == reflect.Ptr { - typeValue = typeValue.Elem() - } - - if typeValue.Kind() != reflect.Struct { - return nil, fmt.Errorf("%v is not of type struct", typeValue) - } - - ret := make(map[string]reflect.Type) - - for fieldIndex := 0; fieldIndex < typeValue.NumField(); fieldIndex++ { - fieldType := typeValue.Field(fieldIndex) - yamlTag := fieldType.Tag.Get("json") - yamlTagName := strings.Split(yamlTag, ",")[0] - - ret[yamlTagName] = fieldType.Type - } - - return ret, nil -} - -func findKnownValue(parts []string, valueOptions sets.String) int { - for i := range parts { - if valueOptions.Has(parts[i]) { - return i - } - } - - return -1 -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser_test.go deleted file mode 100644 index 2bca8d089..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/navigation_step_parser_test.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "reflect" - "strings" - "testing" - - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/util/diff" -) - -type stepParserTest struct { - path string - expectedNavigationSteps navigationSteps - expectedError string -} - -func TestParseWithDots(t *testing.T) { - test := stepParserTest{ - path: "clusters.my.dot.delimited.name.server", - expectedNavigationSteps: navigationSteps{ - steps: []navigationStep{ - {"clusters", reflect.TypeOf(make(map[string]*clientcmdapi.Cluster))}, - {"my.dot.delimited.name", reflect.TypeOf(clientcmdapi.Cluster{})}, - {"server", reflect.TypeOf("")}, - }, - }, - } - - test.run(t) -} - -func TestParseWithDotsEndingWithName(t *testing.T) { - test := stepParserTest{ - path: "contexts.10.12.12.12", - expectedNavigationSteps: navigationSteps{ - steps: []navigationStep{ - {"contexts", reflect.TypeOf(make(map[string]*clientcmdapi.Context))}, - {"10.12.12.12", reflect.TypeOf(clientcmdapi.Context{})}, - }, - }, - } - - test.run(t) -} - -func TestParseWithBadValue(t *testing.T) { - test := stepParserTest{ - path: "user.bad", - expectedNavigationSteps: navigationSteps{ - steps: []navigationStep{}, - }, - expectedError: "unable to parse user.bad after [] at api.Config", - } - - test.run(t) -} - -func (test stepParserTest) run(t *testing.T) { - actualSteps, err := newNavigationSteps(test.path) - if len(test.expectedError) != 0 { - if err == nil { - t.Errorf("Did not get %v", test.expectedError) - } else { - if !strings.Contains(err.Error(), test.expectedError) { - t.Errorf("Expected %v, but got %v", test.expectedError, err) - } - } - return - } - - if err != nil { - t.Errorf("Unexpected error: %v", err) - } - - if !reflect.DeepEqual(test.expectedNavigationSteps, *actualSteps) { - t.Errorf("diff: %v", diff.ObjectDiff(test.expectedNavigationSteps, *actualSteps)) - t.Errorf("expected: %#v\n actual: %#v", test.expectedNavigationSteps, *actualSteps) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/set.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/set.go deleted file mode 100644 index c1c078bcb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/set.go +++ /dev/null @@ -1,246 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "encoding/base64" - "errors" - "fmt" - "io" - "reflect" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - "k8s.io/kubernetes/pkg/util/flag" -) - -const ( - cannotHaveStepsAfterError = "Cannot have steps after %v. %v are remaining" - additionStepRequiredUnlessUnsettingError = "Must have additional steps after %v unless you are unsetting it" -) - -type setOptions struct { - configAccess clientcmd.ConfigAccess - propertyName string - propertyValue string - setRawBytes flag.Tristate -} - -const set_long = `Sets an individual value in a kubeconfig file -PROPERTY_NAME is a dot delimited name where each token represents either a attribute name or a map key. Map keys may not contain dots. -PROPERTY_VALUE is the new value you wish to set. Binary fields such as 'certificate-authority-data' expect a base64 encoded string unless the --set-raw-bytes flag is used.` - -func NewCmdConfigSet(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &setOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: "set PROPERTY_NAME PROPERTY_VALUE", - Short: "Sets an individual value in a kubeconfig file", - Long: set_long, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "property %q set.\n", options.propertyName) - } - }, - } - - f := cmd.Flags().VarPF(&options.setRawBytes, "set-raw-bytes", "", "When writing a []byte PROPERTY_VALUE, write the given string directly without base64 decoding.") - f.NoOptDefVal = "true" - return cmd -} - -func (o setOptions) run() error { - err := o.validate() - if err != nil { - return err - } - - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - steps, err := newNavigationSteps(o.propertyName) - if err != nil { - return err - } - - setRawBytes := false - if o.setRawBytes.Provided() { - setRawBytes = o.setRawBytes.Value() - } - - err = modifyConfig(reflect.ValueOf(config), steps, o.propertyValue, false, setRawBytes) - if err != nil { - return err - } - - if err := clientcmd.ModifyConfig(o.configAccess, *config, false); err != nil { - return err - } - - return nil -} - -func (o *setOptions) complete(cmd *cobra.Command) bool { - endingArgs := cmd.Flags().Args() - if len(endingArgs) != 2 { - cmd.Help() - return false - } - - o.propertyValue = endingArgs[1] - o.propertyName = endingArgs[0] - return true -} - -func (o setOptions) validate() error { - if len(o.propertyValue) == 0 { - return errors.New("you cannot use set to unset a property") - } - - if len(o.propertyName) == 0 { - return errors.New("you must specify a property") - } - - return nil -} - -func modifyConfig(curr reflect.Value, steps *navigationSteps, propertyValue string, unset bool, setRawBytes bool) error { - currStep := steps.pop() - - actualCurrValue := curr - if curr.Kind() == reflect.Ptr { - actualCurrValue = curr.Elem() - } - - switch actualCurrValue.Kind() { - case reflect.Map: - if !steps.moreStepsRemaining() && !unset { - return fmt.Errorf("can't set a map to a value: %v", actualCurrValue) - } - - mapKey := reflect.ValueOf(currStep.stepValue) - mapValueType := curr.Type().Elem().Elem() - - if !steps.moreStepsRemaining() && unset { - actualCurrValue.SetMapIndex(mapKey, reflect.Value{}) - return nil - } - - currMapValue := actualCurrValue.MapIndex(mapKey) - - needToSetNewMapValue := currMapValue.Kind() == reflect.Invalid - if needToSetNewMapValue { - currMapValue = reflect.New(mapValueType.Elem()).Elem().Addr() - actualCurrValue.SetMapIndex(mapKey, currMapValue) - } - - err := modifyConfig(currMapValue, steps, propertyValue, unset, setRawBytes) - if err != nil { - return err - } - - return nil - - case reflect.String: - if steps.moreStepsRemaining() { - return fmt.Errorf("can't have more steps after a string. %v", steps) - } - actualCurrValue.SetString(propertyValue) - return nil - - case reflect.Slice: - if steps.moreStepsRemaining() { - return fmt.Errorf("can't have more steps after bytes. %v", steps) - } - innerKind := actualCurrValue.Type().Elem().Kind() - if innerKind != reflect.Uint8 { - return fmt.Errorf("unrecognized slice type. %v", innerKind) - } - - if unset { - actualCurrValue.Set(reflect.Zero(actualCurrValue.Type())) - return nil - } - - if setRawBytes { - actualCurrValue.SetBytes([]byte(propertyValue)) - } else { - val, err := base64.StdEncoding.DecodeString(propertyValue) - if err != nil { - return fmt.Errorf("error decoding input value: %v", err) - } - actualCurrValue.SetBytes(val) - } - return nil - - case reflect.Bool: - if steps.moreStepsRemaining() { - return fmt.Errorf("can't have more steps after a bool. %v", steps) - } - boolValue, err := toBool(propertyValue) - if err != nil { - return err - } - actualCurrValue.SetBool(boolValue) - return nil - - case reflect.Struct: - for fieldIndex := 0; fieldIndex < actualCurrValue.NumField(); fieldIndex++ { - currFieldValue := actualCurrValue.Field(fieldIndex) - currFieldType := actualCurrValue.Type().Field(fieldIndex) - currYamlTag := currFieldType.Tag.Get("json") - currFieldTypeYamlName := strings.Split(currYamlTag, ",")[0] - - if currFieldTypeYamlName == currStep.stepValue { - thisMapHasNoValue := (currFieldValue.Kind() == reflect.Map && currFieldValue.IsNil()) - - if thisMapHasNoValue { - newValue := reflect.MakeMap(currFieldValue.Type()) - currFieldValue.Set(newValue) - - if !steps.moreStepsRemaining() && unset { - return nil - } - } - - if !steps.moreStepsRemaining() && unset { - // if we're supposed to unset the value or if the value is a map that doesn't exist, create a new value and overwrite - newValue := reflect.New(currFieldValue.Type()).Elem() - currFieldValue.Set(newValue) - return nil - } - - return modifyConfig(currFieldValue.Addr(), steps, propertyValue, unset, setRawBytes) - } - } - - return fmt.Errorf("unable to locate path %#v under %v", currStep, actualCurrValue) - - } - - panic(fmt.Errorf("unrecognized type: %v", actualCurrValue)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/unset.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/unset.go deleted file mode 100644 index f9446df51..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/unset.go +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - "reflect" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" -) - -type unsetOptions struct { - configAccess clientcmd.ConfigAccess - propertyName string -} - -const unset_long = `Unsets an individual value in a kubeconfig file -PROPERTY_NAME is a dot delimited name where each token represents either a attribute name or a map key. Map keys may not contain dots.` - -func NewCmdConfigUnset(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &unsetOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: "unset PROPERTY_NAME", - Short: "Unsets an individual value in a kubeconfig file", - Long: unset_long, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "property %q unset.\n", options.propertyName) - } - }, - } - - return cmd -} - -func (o unsetOptions) run() error { - err := o.validate() - if err != nil { - return err - } - - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - - steps, err := newNavigationSteps(o.propertyName) - if err != nil { - return err - } - err = modifyConfig(reflect.ValueOf(config), steps, "", true, true) - if err != nil { - return err - } - - if err := clientcmd.ModifyConfig(o.configAccess, *config, false); err != nil { - return err - } - - return nil -} - -func (o *unsetOptions) complete(cmd *cobra.Command) bool { - endingArgs := cmd.Flags().Args() - if len(endingArgs) != 1 { - cmd.Help() - return false - } - - o.propertyName = endingArgs[0] - return true -} - -func (o unsetOptions) validate() error { - if len(o.propertyName) == 0 { - return errors.New("you must specify a property") - } - - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/use_context.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/use_context.go deleted file mode 100644 index abfe8bbf9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/use_context.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" -) - -type useContextOptions struct { - configAccess clientcmd.ConfigAccess - contextName string -} - -func NewCmdConfigUseContext(out io.Writer, configAccess clientcmd.ConfigAccess) *cobra.Command { - options := &useContextOptions{configAccess: configAccess} - - cmd := &cobra.Command{ - Use: "use-context CONTEXT_NAME", - Short: "Sets the current-context in a kubeconfig file", - Long: `Sets the current-context in a kubeconfig file`, - Run: func(cmd *cobra.Command, args []string) { - if !options.complete(cmd) { - return - } - - err := options.run() - if err != nil { - fmt.Fprintf(out, "%v\n", err) - } else { - fmt.Fprintf(out, "switched to context %q.\n", options.contextName) - } - }, - } - - return cmd -} - -func (o useContextOptions) run() error { - config, err := o.configAccess.GetStartingConfig() - if err != nil { - return err - } - - err = o.validate(config) - if err != nil { - return err - } - - config.CurrentContext = o.contextName - - if err := clientcmd.ModifyConfig(o.configAccess, *config, true); err != nil { - return err - } - - return nil -} - -func (o *useContextOptions) complete(cmd *cobra.Command) bool { - endingArgs := cmd.Flags().Args() - if len(endingArgs) != 1 { - cmd.Help() - return false - } - - o.contextName = endingArgs[0] - return true -} - -func (o useContextOptions) validate(config *clientcmdapi.Config) error { - if len(o.contextName) == 0 { - return errors.New("you must specify a current-context") - } - - for name := range config.Contexts { - if name == o.contextName { - return nil - } - } - - return fmt.Errorf("no context exists with the name: %q.", o.contextName) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/view.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/view.go deleted file mode 100644 index 1c1ae5df3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/config/view.go +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 config - -import ( - "errors" - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/util/flag" -) - -type ViewOptions struct { - ConfigAccess clientcmd.ConfigAccess - Merge flag.Tristate - Flatten bool - Minify bool - RawByteData bool -} - -const ( - view_long = `Displays merged kubeconfig settings or a specified kubeconfig file. - -You can use --output jsonpath={...} to extract specific values using a jsonpath expression.` - view_example = `# Show Merged kubeconfig settings. -kubectl config view - -# Get the password for the e2e user -kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'` -) - -func NewCmdConfigView(out io.Writer, ConfigAccess clientcmd.ConfigAccess) *cobra.Command { - options := &ViewOptions{ConfigAccess: ConfigAccess} - // Default to yaml - defaultOutputFormat := "yaml" - - cmd := &cobra.Command{ - Use: "view", - Short: "Displays merged kubeconfig settings or a specified kubeconfig file.", - Long: view_long, - Example: view_example, - Run: func(cmd *cobra.Command, args []string) { - options.Complete() - outputFormat := cmdutil.GetFlagString(cmd, "output") - if outputFormat == "wide" { - fmt.Printf("--output wide is not available in kubectl config view; reset to default output format (%s)\n\n", defaultOutputFormat) - cmd.Flags().Set("output", defaultOutputFormat) - } - if outputFormat == "" { - fmt.Printf("reset to default output format (%s) as --output is empty", defaultOutputFormat) - cmd.Flags().Set("output", defaultOutputFormat) - } - - printer, _, err := cmdutil.PrinterForCommand(cmd) - cmdutil.CheckErr(err) - version, err := cmdutil.OutputVersion(cmd, &latest.ExternalVersion) - cmdutil.CheckErr(err) - printer = kubectl.NewVersionedPrinter(printer, clientcmdapi.Scheme, version) - - cmdutil.CheckErr(options.Run(out, printer)) - }, - } - - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().Set("output", defaultOutputFormat) - - options.Merge.Default(true) - f := cmd.Flags().VarPF(&options.Merge, "merge", "", "merge together the full hierarchy of kubeconfig files") - f.NoOptDefVal = "true" - cmd.Flags().BoolVar(&options.RawByteData, "raw", false, "display raw byte data") - cmd.Flags().BoolVar(&options.Flatten, "flatten", false, "flatten the resulting kubeconfig file into self contained output (useful for creating portable kubeconfig files)") - cmd.Flags().BoolVar(&options.Minify, "minify", false, "remove all information not used by current-context from the output") - return cmd -} - -func (o ViewOptions) Run(out io.Writer, printer kubectl.ResourcePrinter) error { - config, err := o.loadConfig() - if err != nil { - return err - } - - if o.Minify { - if err := clientcmdapi.MinifyConfig(config); err != nil { - return err - } - } - - if o.Flatten { - if err := clientcmdapi.FlattenConfig(config); err != nil { - return err - } - } else if !o.RawByteData { - clientcmdapi.ShortenConfig(config) - } - - err = printer.PrintObj(config, out) - if err != nil { - return err - } - - return nil -} - -func (o *ViewOptions) Complete() bool { - if o.ConfigAccess.IsExplicitFile() { - if !o.Merge.Provided() { - o.Merge.Set("false") - } - } - - return true -} - -func (o ViewOptions) loadConfig() (*clientcmdapi.Config, error) { - err := o.Validate() - if err != nil { - return nil, err - } - - config, err := o.getStartingConfig() - return config, err -} - -func (o ViewOptions) Validate() error { - if !o.Merge.Value() && !o.ConfigAccess.IsExplicitFile() { - return errors.New("if merge==false a precise file must to specified") - } - - return nil -} - -// getStartingConfig returns the Config object built from the sources specified by the options, the filename read (only if it was a single file), and an error if something goes wrong -func (o *ViewOptions) getStartingConfig() (*clientcmdapi.Config, error) { - switch { - case !o.Merge.Value(): - return clientcmd.LoadFromFile(o.ConfigAccess.GetExplicitFile()) - - default: - return o.ConfigAccess.GetStartingConfig() - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/convert.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/convert.go deleted file mode 100644 index 103bb9648..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/convert.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - - "github.com/spf13/cobra" -) - -const ( - convert_long = `Convert config files between different API versions. Both YAML -and JSON formats are accepted. - -The command takes filename, directory, or URL as input, and convert it into format -of version specified by --output-version flag. If target version is not specified or -not supported, convert to latest version. - -The default output will be printed to stdout in YAML format. One can use -o option -to change to output destination. -` - convert_example = `# Convert 'pod.yaml' to latest version and print to stdout. -kubectl convert -f pod.yaml - -# Convert the live state of the resource specified by 'pod.yaml' to the latest version -# and print to stdout in json format. -kubectl convert -f pod.yaml --local -o json - -# Convert all files under current directory to latest version and create them all. -kubectl convert -f . | kubectl create -f - -` -) - -// NewCmdConvert creates a command object for the generic "convert" action, which -// translates the config file into a given version. -func NewCmdConvert(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &ConvertOptions{} - - cmd := &cobra.Command{ - Use: "convert -f FILENAME", - Short: "Convert config files between different API versions", - Long: convert_long, - Example: convert_example, - Run: func(cmd *cobra.Command, args []string) { - err := options.Complete(f, out, cmd, args) - cmdutil.CheckErr(err) - err = options.RunConvert() - cmdutil.CheckErr(err) - }, - } - - usage := "Filename, directory, or URL to file to need to get converted." - kubectl.AddJsonFilenameFlag(cmd, &options.filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.recursive) - cmd.MarkFlagRequired("filename") - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().BoolVar(&options.local, "local", true, "If true, convert will NOT try to contact api-server but run locally.") - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -// ConvertOptions have the data required to perform the convert operation -type ConvertOptions struct { - builder *resource.Builder - filenames []string - local bool - - encoder runtime.Encoder - out io.Writer - printer kubectl.ResourcePrinter - - outputVersion unversioned.GroupVersion - - recursive bool -} - -// Complete collects information required to run Convert command from command line. -func (o *ConvertOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) (err error) { - o.outputVersion, err = cmdutil.OutputVersion(cmd, ®istered.EnabledVersionsForGroup(api.GroupName)[0]) - if err != nil { - return err - } - if !registered.IsEnabledVersion(o.outputVersion) { - cmdutil.UsageError(cmd, "'%s' is not a registered version.", o.outputVersion) - } - - // build the builder - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - clientMapper := resource.ClientMapperFunc(f.ClientForMapping) - - if o.local { - fmt.Fprintln(out, "running in local mode...") - o.builder = resource.NewBuilder(mapper, typer, resource.DisabledClientForMapping{ClientMapper: clientMapper}, f.Decoder(true)) - } else { - o.builder = resource.NewBuilder(mapper, typer, clientMapper, f.Decoder(true)) - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - o.builder = o.builder.Schema(schema) - } - cmdNamespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - o.builder = o.builder.NamespaceParam(cmdNamespace). - ContinueOnError(). - FilenameParam(false, o.recursive, o.filenames...). - Flatten() - - // build the printer - o.out = out - outputFormat := cmdutil.GetFlagString(cmd, "output") - templateFile := cmdutil.GetFlagString(cmd, "template") - if len(outputFormat) == 0 { - if len(templateFile) == 0 { - outputFormat = "yaml" - } else { - outputFormat = "template" - } - } - o.encoder = f.JSONEncoder() - o.printer, _, err = kubectl.GetPrinter(outputFormat, templateFile) - if err != nil { - return err - } - - return nil -} - -// RunConvert implements the generic Convert command -func (o *ConvertOptions) RunConvert() error { - r := o.builder.Do() - err := r.Err() - if err != nil { - return err - } - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - infos := []*resource.Info{info} - objects, err := resource.AsVersionedObject(infos, false, o.outputVersion.String(), o.encoder) - if err != nil { - return err - } - - count++ - return o.printer.PrintObj(objects, o.out) - }) - if err != nil { - return err - } - if count == 0 { - return fmt.Errorf("no objects passed to convert") - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create.go deleted file mode 100644 index 05cc2e3de..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create.go +++ /dev/null @@ -1,262 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" -) - -// CreateOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type CreateOptions struct { - Filenames []string - Recursive bool -} - -const ( - create_long = `Create a resource by filename or stdin. - -JSON and YAML formats are accepted.` - create_example = `# Create a pod using the data in pod.json. -kubectl create -f ./pod.json - -# Create a pod based on the JSON passed into stdin. -cat pod.json | kubectl create -f -` -) - -func NewCmdCreate(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &CreateOptions{} - - cmd := &cobra.Command{ - Use: "create -f FILENAME", - Short: "Create a resource by filename or stdin", - Long: create_long, - Example: create_example, - Run: func(cmd *cobra.Command, args []string) { - if len(options.Filenames) == 0 { - cmd.Help() - return - } - cmdutil.CheckErr(ValidateArgs(cmd, args)) - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - cmdutil.CheckErr(RunCreate(f, cmd, out, options)) - }, - } - - usage := "Filename, directory, or URL to file to use to create the resource" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmd.MarkFlagRequired("filename") - cmdutil.AddValidateFlags(cmd) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - // create subcommands - cmd.AddCommand(NewCmdCreateNamespace(f, out)) - cmd.AddCommand(NewCmdCreateSecret(f, out)) - cmd.AddCommand(NewCmdCreateConfigMap(f, out)) - cmd.AddCommand(NewCmdCreateServiceAccount(f, out)) - return cmd -} - -func ValidateArgs(cmd *cobra.Command, args []string) error { - if len(args) != 0 { - return cmdutil.UsageError(cmd, "Unexpected args: %v", args) - } - return nil -} - -func RunCreate(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *CreateOptions) error { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - Schema(schema). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(info.Object, f.Command()); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - } - - if err := createAndRefresh(info); err != nil { - return cmdutil.AddSourceToErr("creating", info.Source, err) - } - - count++ - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - if !shortOutput { - printObjectSpecificMessage(info.Object, out) - } - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "created") - return nil - }) - if err != nil { - return err - } - if count == 0 { - return fmt.Errorf("no objects passed to create") - } - return nil -} - -func printObjectSpecificMessage(obj runtime.Object, out io.Writer) { - switch obj := obj.(type) { - case *api.Service: - if obj.Spec.Type == api.ServiceTypeNodePort { - msg := fmt.Sprintf( - `You have exposed your service on an external port on all nodes in your -cluster. If you want to expose this service to the external internet, you may -need to set up firewall rules for the service port(s) (%s) to serve traffic. - -See http://releases.k8s.io/HEAD/docs/user-guide/services-firewalls.md for more details. -`, - makePortsString(obj.Spec.Ports, true)) - out.Write([]byte(msg)) - } - } -} - -func makePortsString(ports []api.ServicePort, useNodePort bool) string { - pieces := make([]string, len(ports)) - for ix := range ports { - var port int32 - if useNodePort { - port = ports[ix].NodePort - } else { - port = ports[ix].Port - } - pieces[ix] = fmt.Sprintf("%s:%d", strings.ToLower(string(ports[ix].Protocol)), port) - } - return strings.Join(pieces, ",") -} - -// createAndRefresh creates an object from input info and refreshes info with that object -func createAndRefresh(info *resource.Info) error { - obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) - if err != nil { - return err - } - info.Refresh(obj, true) - return nil -} - -// NameFromCommandArgs is a utility function for commands that assume the first argument is a resource name -func NameFromCommandArgs(cmd *cobra.Command, args []string) (string, error) { - if len(args) == 0 { - return "", cmdutil.UsageError(cmd, "NAME is required") - } - return args[0], nil -} - -// CreateSubcommandOptions is an options struct to support create subcommands -type CreateSubcommandOptions struct { - // Name of resource being created - Name string - // StructuredGenerator is the resource generator for the object being created - StructuredGenerator kubectl.StructuredGenerator - // DryRun is true if the command should be simulated but not run against the server - DryRun bool - // OutputFormat - OutputFormat string -} - -// RunCreateSubcommand executes a create subcommand using the specified options -func RunCreateSubcommand(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *CreateSubcommandOptions) error { - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - obj, err := options.StructuredGenerator.StructuredGenerate() - if err != nil { - return err - } - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - gvk, err := typer.ObjectKind(obj) - mapping, err := mapper.RESTMapping(unversioned.GroupKind{Group: gvk.Group, Kind: gvk.Kind}, gvk.Version) - if err != nil { - return err - } - client, err := f.ClientForMapping(mapping) - if err != nil { - return err - } - resourceMapper := &resource.Mapper{ - ObjectTyper: typer, - RESTMapper: mapper, - ClientMapper: resource.ClientMapperFunc(f.ClientForMapping), - } - info, err := resourceMapper.InfoForObject(obj, nil) - if err != nil { - return err - } - if err := kubectl.UpdateApplyAnnotation(info, f.JSONEncoder()); err != nil { - return err - } - if !options.DryRun { - obj, err = resource.NewHelper(client, mapping).Create(namespace, false, info.Object) - if err != nil { - return err - } - } - - if useShortOutput := options.OutputFormat == "name"; useShortOutput || len(options.OutputFormat) == 0 { - cmdutil.PrintSuccess(mapper, useShortOutput, out, mapping.Resource, options.Name, "created") - return nil - } - - return f.PrintObject(cmd, mapper, obj, out) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap.go deleted file mode 100644 index 6af079205..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - configMapLong = `Create a configmap based on a file, directory, or specified literal value. - -A single configmap may package one or more key/value pairs. - -When creating a configmap based on a file, the key will default to the basename of the file, and the value will -default to the file content. If the basename is an invalid key, you may specify an alternate key. - -When creating a configmap based on a directory, each file whose basename is a valid key in the directory will be -packaged into the configmap. Any directory entries except regular files are ignored (e.g. subdirectories, -symlinks, devices, pipes, etc). -` - - configMapExample = ` # Create a new configmap named my-config with keys for each file in folder bar - kubectl create configmap my-config --from-file=path/to/bar - - # Create a new configmap named my-config with specified keys instead of names on disk - kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt - - # Create a new configMap named my-config with key1=config1 and key2=config2 - kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2` -) - -// ConfigMap is a command to ease creating ConfigMaps. -func NewCmdCreateConfigMap(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run]", - Short: "Create a configMap from a local file, directory or literal value.", - Long: configMapLong, - Example: configMapExample, - Run: func(cmd *cobra.Command, args []string) { - err := CreateConfigMap(f, cmdOut, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ConfigMapV1GeneratorName) - cmd.Flags().StringSlice("from-file", []string{}, "Key files can be specified using their file path, in which case a default name will be given to them, or optionally with a name and file path, in which case the given name will be used. Specifying a directory will iterate each named file in the directory that is a valid configmap key.") - cmd.Flags().StringSlice("from-literal", []string{}, "Specify a key and literal value to insert in configmap (i.e. mykey=somevalue)") - return cmd -} - -// CreateConfigMap is the implementation of the create configmap command. -func CreateConfigMap(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error { - name, err := NameFromCommandArgs(cmd, args) - if err != nil { - return err - } - var generator kubectl.StructuredGenerator - switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ConfigMapV1GeneratorName: - generator = &kubectl.ConfigMapGeneratorV1{ - Name: name, - FileSources: cmdutil.GetFlagStringSlice(cmd, "from-file"), - LiteralSources: cmdutil.GetFlagStringSlice(cmd, "from-literal"), - } - default: - return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) - } - return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{ - Name: name, - StructuredGenerator: generator, - DryRun: cmdutil.GetFlagBool(cmd, "dry-run"), - OutputFormat: cmdutil.GetFlagString(cmd, "output"), - }) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap_test.go deleted file mode 100644 index 9c3971e36..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_configmap_test.go +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestCreateConfigMap(t *testing.T) { - configMap := &api.ConfigMap{} - configMap.Name = "my-configmap" - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/configmaps" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, configMap)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdCreateConfigMap(f, buf) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{configMap.Name}) - expectedOutput := "configmap/" + configMap.Name + "\n" - if buf.String() != expectedOutput { - t.Errorf("expected output: %s, but got: %s", buf.String(), expectedOutput) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace.go deleted file mode 100644 index 299c5e940..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - namespaceLong = ` -Create a namespace with the specified name.` - - namespaceExample = ` # Create a new namespace named my-namespace - kubectl create namespace my-namespace` -) - -// NewCmdCreateNamespace is a macro command to create a new namespace -func NewCmdCreateNamespace(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "namespace NAME [--dry-run]", - Aliases: []string{"ns"}, - Short: "Create a namespace with the specified name.", - Long: namespaceLong, - Example: namespaceExample, - Run: func(cmd *cobra.Command, args []string) { - err := CreateNamespace(f, cmdOut, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.NamespaceV1GeneratorName) - - return cmd -} - -// CreateNamespace implements the behavior to run the create namespace command -func CreateNamespace(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error { - name, err := NameFromCommandArgs(cmd, args) - if err != nil { - return err - } - var generator kubectl.StructuredGenerator - switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.NamespaceV1GeneratorName: - generator = &kubectl.NamespaceGeneratorV1{Name: name} - default: - return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) - } - return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{ - Name: name, - StructuredGenerator: generator, - DryRun: cmdutil.GetFlagBool(cmd, "dry-run"), - OutputFormat: cmdutil.GetFlagString(cmd, "output"), - }) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace_test.go deleted file mode 100644 index dd74eec4b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_namespace_test.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestCreateNamespace(t *testing.T) { - namespaceObject := &api.Namespace{} - namespaceObject.Name = "my-namespace" - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, namespaceObject)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdCreateNamespace(f, buf) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{namespaceObject.Name}) - expectedOutput := "namespace/" + namespaceObject.Name + "\n" - if buf.String() != expectedOutput { - t.Errorf("expected output: %s, but got: %s", buf.String(), expectedOutput) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret.go deleted file mode 100644 index 48cb8f99b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret.go +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -// NewCmdCreateSecret groups subcommands to create various types of secrets -func NewCmdCreateSecret(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "secret", - Short: "Create a secret using specified subcommand.", - Long: "Create a secret using specified subcommand.", - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - cmd.AddCommand(NewCmdCreateSecretDockerRegistry(f, cmdOut)) - cmd.AddCommand(NewCmdCreateSecretGeneric(f, cmdOut)) - - return cmd -} - -const ( - secretLong = ` -Create a secret based on a file, directory, or specified literal value. - -A single secret may package one or more key/value pairs. - -When creating a secret based on a file, the key will default to the basename of the file, and the value will -default to the file content. If the basename is an invalid key, you may specify an alternate key. - -When creating a secret based on a directory, each file whose basename is a valid key in the directory will be -packaged into the secret. Any directory entries except regular files are ignored (e.g. subdirectories, -symlinks, devices, pipes, etc). -` - - secretExample = ` # Create a new secret named my-secret with keys for each file in folder bar - kubectl create secret generic my-secret --from-file=path/to/bar - - # Create a new secret named my-secret with specified keys instead of names on disk - kubectl create secret generic my-secret --from-file=ssh-privatekey=~/.ssh/id_rsa --from-file=ssh-publickey=~/.ssh/id_rsa.pub - - # Create a new secret named my-secret with key1=supersecret and key2=topsecret - kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret` -) - -// NewCmdCreateSecretGeneric is a command to create generic secrets from files, directories, or literal values -func NewCmdCreateSecretGeneric(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run]", - Short: "Create a secret from a local file, directory or literal value.", - Long: secretLong, - Example: secretExample, - Run: func(cmd *cobra.Command, args []string) { - err := CreateSecretGeneric(f, cmdOut, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.SecretV1GeneratorName) - cmd.Flags().StringSlice("from-file", []string{}, "Key files can be specified using their file path, in which case a default name will be given to them, or optionally with a name and file path, in which case the given name will be used. Specifying a directory will iterate each named file in the directory that is a valid secret key.") - cmd.Flags().StringSlice("from-literal", []string{}, "Specify a key and literal value to insert in secret (i.e. mykey=somevalue)") - cmd.Flags().String("type", "", "The type of secret to create") - return cmd -} - -// CreateSecretGeneric is the implementation of the create secret generic command -func CreateSecretGeneric(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error { - name, err := NameFromCommandArgs(cmd, args) - if err != nil { - return err - } - var generator kubectl.StructuredGenerator - switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.SecretV1GeneratorName: - generator = &kubectl.SecretGeneratorV1{ - Name: name, - Type: cmdutil.GetFlagString(cmd, "type"), - FileSources: cmdutil.GetFlagStringSlice(cmd, "from-file"), - LiteralSources: cmdutil.GetFlagStringSlice(cmd, "from-literal"), - } - default: - return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) - } - return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{ - Name: name, - StructuredGenerator: generator, - DryRun: cmdutil.GetFlagBool(cmd, "dry-run"), - OutputFormat: cmdutil.GetFlagString(cmd, "output"), - }) -} - -const ( - secretForDockerRegistryLong = ` -Create a new secret for use with Docker registries. - -Dockercfg secrets are used to authenticate against Docker registries. - -When using the Docker command line to push images, you can authenticate to a given registry by running - 'docker login DOCKER_REGISTRY_SERVER --username=DOCKER_USER --password=DOCKER_PASSWORD --email=DOCKER_EMAIL'. -That produces a ~/.dockercfg file that is used by subsequent 'docker push' and 'docker pull' commands to -authenticate to the registry. - -When creating applications, you may have a Docker registry that requires authentication. In order for the -nodes to pull images on your behalf, they have to have the credentials. You can provide this information -by creating a dockercfg secret and attaching it to your service account.` - - secretForDockerRegistryExample = ` # If you don't already have a .dockercfg file, you can create a dockercfg secret directly by using: - $ kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL` -) - -// NewCmdCreateSecretDockerRegistry is a macro command for creating secrets to work with Docker registries -func NewCmdCreateSecretDockerRegistry(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-literal=key1=value1] [--dry-run]", - Short: "Create a secret for use with a Docker registry.", - Long: secretForDockerRegistryLong, - Example: secretForDockerRegistryExample, - Run: func(cmd *cobra.Command, args []string) { - err := CreateSecretDockerRegistry(f, cmdOut, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.SecretForDockerRegistryV1GeneratorName) - cmd.Flags().String("docker-username", "", "Username for Docker registry authentication") - cmd.MarkFlagRequired("docker-username") - cmd.Flags().String("docker-password", "", "Password for Docker registry authentication") - cmd.MarkFlagRequired("docker-password") - cmd.Flags().String("docker-email", "", "Email for Docker registry") - cmd.MarkFlagRequired("docker-email") - cmd.Flags().String("docker-server", "https://index.docker.io/v1/", "Server location for Docker registry") - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -// CreateSecretDockerRegistry is the implementation of the create secret docker-registry command -func CreateSecretDockerRegistry(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error { - name, err := NameFromCommandArgs(cmd, args) - if err != nil { - return err - } - requiredFlags := []string{"docker-username", "docker-password", "docker-email", "docker-server"} - for _, requiredFlag := range requiredFlags { - if value := cmdutil.GetFlagString(cmd, requiredFlag); len(value) == 0 { - return cmdutil.UsageError(cmd, "flag %s is required", requiredFlag) - } - } - var generator kubectl.StructuredGenerator - switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.SecretForDockerRegistryV1GeneratorName: - generator = &kubectl.SecretForDockerRegistryGeneratorV1{ - Name: name, - Username: cmdutil.GetFlagString(cmd, "docker-username"), - Email: cmdutil.GetFlagString(cmd, "docker-email"), - Password: cmdutil.GetFlagString(cmd, "docker-password"), - Server: cmdutil.GetFlagString(cmd, "docker-server"), - } - default: - return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) - } - return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{ - Name: name, - StructuredGenerator: generator, - DryRun: cmdutil.GetFlagBool(cmd, "dry-run"), - OutputFormat: cmdutil.GetFlagString(cmd, "output"), - }) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret_test.go deleted file mode 100644 index 8365513eb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_secret_test.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestCreateSecretGeneric(t *testing.T) { - secretObject := &api.Secret{} - secretObject.Name = "my-secret" - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/secrets" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, secretObject)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdCreateSecretGeneric(f, buf) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{secretObject.Name}) - expectedOutput := "secret/" + secretObject.Name + "\n" - if buf.String() != expectedOutput { - t.Errorf("expected output: %s, but got: %s", buf.String(), expectedOutput) - } -} - -func TestCreateSecretDockerRegistry(t *testing.T) { - secretObject := &api.Secret{} - secretObject.Name = "my-secret" - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/secrets" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, secretObject)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdCreateSecretDockerRegistry(f, buf) - cmd.Flags().Set("docker-username", "test-user") - cmd.Flags().Set("docker-password", "test-pass") - cmd.Flags().Set("docker-email", "test-email") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{secretObject.Name}) - expectedOutput := "secret/" + secretObject.Name + "\n" - if buf.String() != expectedOutput { - t.Errorf("expected output: %s, but got: %s", buf.String(), expectedOutput) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount.go deleted file mode 100644 index 61d2d3cc5..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount.go +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - serviceAccountLong = ` -Create a service account with the specified name.` - - serviceAccountExample = ` # Create a new service account named my-service-account - $ kubectl create serviceaccount my-service-account` -) - -// NewCmdCreateServiceAccount is a macro command to create a new service account -func NewCmdCreateServiceAccount(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "serviceaccount NAME [--dry-run]", - Aliases: []string{"sa"}, - Short: "Create a service account with the specified name.", - Long: serviceAccountLong, - Example: serviceAccountExample, - Run: func(cmd *cobra.Command, args []string) { - err := CreateServiceAccount(f, cmdOut, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceAccountV1GeneratorName) - return cmd -} - -// CreateServiceAccount implements the behavior to run the create service account command -func CreateServiceAccount(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Command, args []string) error { - name, err := NameFromCommandArgs(cmd, args) - if err != nil { - return err - } - var generator kubectl.StructuredGenerator - switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { - case cmdutil.ServiceAccountV1GeneratorName: - generator = &kubectl.ServiceAccountGeneratorV1{Name: name} - default: - return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) - } - return RunCreateSubcommand(f, cmd, cmdOut, &CreateSubcommandOptions{ - Name: name, - StructuredGenerator: generator, - DryRun: cmdutil.GetFlagBool(cmd, "dry-run"), - OutputFormat: cmdutil.GetFlagString(cmd, "output"), - }) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount_test.go deleted file mode 100644 index 6573e6d02..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_serviceaccount_test.go +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestCreateServiceAccount(t *testing.T) { - serviceAccountObject := &api.ServiceAccount{} - serviceAccountObject.Name = "my-service-account" - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/serviceaccounts" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, serviceAccountObject)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdCreateServiceAccount(f, buf) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{serviceAccountObject.Name}) - expectedOutput := "serviceaccount/" + serviceAccountObject.Name + "\n" - if buf.String() != expectedOutput { - t.Errorf("expected output: %s, but got: %s", expectedOutput, buf.String()) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_test.go deleted file mode 100644 index 005b5faee..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/create_test.go +++ /dev/null @@ -1,230 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestExtraArgsFail(t *testing.T) { - initTestErrorHandler(t) - buf := bytes.NewBuffer([]byte{}) - - f, _, _ := NewAPIFactory() - c := NewCmdCreate(f, buf) - if ValidateArgs(c, []string{"rc"}) == nil { - t.Errorf("unexpected non-error") - } -} - -func TestCreateObject(t *testing.T) { - initTestErrorHandler(t) - _, _, rc := testData() - rc.Items[0].Name = "redis-master-controller" - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdCreate(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - if buf.String() != "replicationcontroller/redis-master-controller\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestCreateMultipleObject(t *testing.T) { - initTestErrorHandler(t) - _, svc, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/services" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &svc.Items[0])}, nil - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdCreate(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("filename", "../../../examples/guestbook/frontend-service.yaml") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // Names should come from the REST response, NOT the files - if buf.String() != "replicationcontroller/rc1\nservice/baz\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestCreateDirectory(t *testing.T) { - initTestErrorHandler(t) - _, _, rc := testData() - rc.Items[0].Name = "name" - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdCreate(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/name\nreplicationcontroller/name\nreplicationcontroller/name\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestPrintObjectSpecificMessage(t *testing.T) { - initTestErrorHandler(t) - tests := []struct { - obj runtime.Object - expectOutput bool - }{ - { - obj: &api.Service{}, - expectOutput: false, - }, - { - obj: &api.Pod{}, - expectOutput: false, - }, - { - obj: &api.Service{Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer}}, - expectOutput: false, - }, - { - obj: &api.Service{Spec: api.ServiceSpec{Type: api.ServiceTypeNodePort}}, - expectOutput: true, - }, - } - for _, test := range tests { - buff := &bytes.Buffer{} - printObjectSpecificMessage(test.obj, buff) - if test.expectOutput && buff.Len() == 0 { - t.Errorf("Expected output, saw none for %v", test.obj) - } - if !test.expectOutput && buff.Len() > 0 { - t.Errorf("Expected no output, saw %s for %v", buff.String(), test.obj) - } - } -} - -func TestMakePortsString(t *testing.T) { - initTestErrorHandler(t) - tests := []struct { - ports []api.ServicePort - useNodePort bool - expectedOutput string - }{ - {ports: nil, expectedOutput: ""}, - {ports: []api.ServicePort{}, expectedOutput: ""}, - {ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - }, - expectedOutput: "tcp:80", - }, - {ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - }, - { - Port: 8080, - Protocol: "UDP", - }, - { - Port: 9000, - Protocol: "TCP", - }, - }, - expectedOutput: "tcp:80,udp:8080,tcp:9000", - }, - {ports: []api.ServicePort{ - { - Port: 80, - NodePort: 9090, - Protocol: "TCP", - }, - { - Port: 8080, - NodePort: 80, - Protocol: "UDP", - }, - }, - useNodePort: true, - expectedOutput: "tcp:9090,udp:80", - }, - } - for _, test := range tests { - output := makePortsString(test.ports, test.useNodePort) - if output != test.expectedOutput { - t.Errorf("expected: %s, saw: %s.", test.expectedOutput, output) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go deleted file mode 100644 index 2982dee1e..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go +++ /dev/null @@ -1,227 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "time" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" -) - -// DeleteOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type DeleteOptions struct { - Filenames []string - Recursive bool -} - -const ( - delete_long = `Delete resources by filenames, stdin, resources and names, or by resources and label selector. - -JSON and YAML formats are accepted. - -Only one type of the arguments may be specified: filenames, resources and names, or resources and label selector - -Note that the delete command does NOT do resource version checks, so if someone -submits an update to a resource right when you submit a delete, their update -will be lost along with the rest of the resource.` - delete_example = `# Delete a pod using the type and name specified in pod.json. -kubectl delete -f ./pod.json - -# Delete a pod based on the type and name in the JSON passed into stdin. -cat pod.json | kubectl delete -f - - -# Delete pods and services with same names "baz" and "foo" -kubectl delete pod,service baz foo - -# Delete pods and services with label name=myLabel. -kubectl delete pods,services -l name=myLabel - -# Delete a pod immediately (no graceful shutdown) -kubectl delete pod foo --now - -# Delete a pod with UID 1234-56-7890-234234-456456. -kubectl delete pod 1234-56-7890-234234-456456 - -# Delete all pods -kubectl delete pods --all` -) - -func NewCmdDelete(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &DeleteOptions{} - - // retrieve a list of handled resources from printer as valid args - validArgs, argAliases := []string{}, []string{} - p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) - cmdutil.CheckErr(err) - if p != nil { - validArgs = p.HandledResources() - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])", - Short: "Delete resources by filenames, stdin, resources and names, or by resources and label selector.", - Long: delete_long, - Example: delete_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - err := RunDelete(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - usage := "Filename, directory, or URL to a file containing the resource to delete." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on.") - cmd.Flags().Bool("all", false, "[-all] to select all the specified resources.") - cmd.Flags().Bool("ignore-not-found", false, "Treat \"resource not found\" as a successful delete. Defaults to \"true\" when --all is specified.") - cmd.Flags().Bool("cascade", true, "If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController). Default true.") - cmd.Flags().Int("grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") - cmd.Flags().Bool("now", false, "If true, resources are force terminated without graceful deletion (same as --grace-period=0).") - cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunDelete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *DeleteOptions) error { - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - deleteAll := cmdutil.GetFlagBool(cmd, "all") - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(cmdutil.GetFlagString(cmd, "selector")). - SelectAllParam(deleteAll). - ResourceTypeOrNameArgs(false, args...).RequireObject(false). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - ignoreNotFound := cmdutil.GetFlagBool(cmd, "ignore-not-found") - if deleteAll { - f := cmd.Flags().Lookup("ignore-not-found") - // The flag should never be missing - if f == nil { - return fmt.Errorf("missing --ignore-not-found flag") - } - // If the user didn't explicitly set the option, default to ignoring NotFound errors when used with --all - if !f.Changed { - ignoreNotFound = true - } - } - - gracePeriod := cmdutil.GetFlagInt(cmd, "grace-period") - if cmdutil.GetFlagBool(cmd, "now") { - if gracePeriod != -1 { - return fmt.Errorf("--now and --grace-period cannot be specified together") - } - gracePeriod = 0 - } - - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - // By default use a reaper to delete all related resources. - if cmdutil.GetFlagBool(cmd, "cascade") { - return ReapResult(r, f, out, cmdutil.GetFlagBool(cmd, "cascade"), ignoreNotFound, cmdutil.GetFlagDuration(cmd, "timeout"), gracePeriod, shortOutput, mapper) - } - return DeleteResult(r, out, ignoreNotFound, shortOutput, mapper) -} - -func ReapResult(r *resource.Result, f *cmdutil.Factory, out io.Writer, isDefaultDelete, ignoreNotFound bool, timeout time.Duration, gracePeriod int, shortOutput bool, mapper meta.RESTMapper) error { - found := 0 - if ignoreNotFound { - r = r.IgnoreErrors(errors.IsNotFound) - } - err := r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - found++ - reaper, err := f.Reaper(info.Mapping) - if err != nil { - // If there is no reaper for this resources and the user didn't explicitly ask for stop. - if kubectl.IsNoSuchReaperError(err) && isDefaultDelete { - return deleteResource(info, out, shortOutput, mapper) - } - return cmdutil.AddSourceToErr("reaping", info.Source, err) - } - var options *api.DeleteOptions - if gracePeriod >= 0 { - options = api.NewDeleteOptions(int64(gracePeriod)) - } - if err := reaper.Stop(info.Namespace, info.Name, timeout, options); err != nil { - return cmdutil.AddSourceToErr("stopping", info.Source, err) - } - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "deleted") - return nil - }) - if err != nil { - return err - } - if found == 0 { - fmt.Fprintf(out, "No resources found\n") - } - return nil -} - -func DeleteResult(r *resource.Result, out io.Writer, ignoreNotFound bool, shortOutput bool, mapper meta.RESTMapper) error { - found := 0 - if ignoreNotFound { - r = r.IgnoreErrors(errors.IsNotFound) - } - err := r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - found++ - return deleteResource(info, out, shortOutput, mapper) - }) - if err != nil { - return err - } - if found == 0 { - fmt.Fprintf(out, "No resources found\n") - } - return nil -} - -func deleteResource(info *resource.Info, out io.Writer, shortOutput bool, mapper meta.RESTMapper) error { - if err := resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name); err != nil { - return cmdutil.AddSourceToErr("deleting", info.Source, err) - } - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "deleted") - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete_test.go deleted file mode 100644 index 5e3cf3c99..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/delete_test.go +++ /dev/null @@ -1,449 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestDeleteObjectByTuple(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master-controller" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - default: - // Ensures no GET is performed when deleting by name - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"replicationcontrollers/redis-master-controller"}) - - if buf.String() != "replicationcontroller/redis-master-controller\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteNamedObject(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master-controller" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - default: - // Ensures no GET is performed when deleting by name - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"replicationcontrollers", "redis-master-controller"}) - - if buf.String() != "replicationcontroller/redis-master-controller\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteObject(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - if buf.String() != "replicationcontroller/redis-master\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteObjectNotFound(t *testing.T) { - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: stringBody("")}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - options := &DeleteOptions{ - Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}, - } - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - err := RunDelete(f, buf, cmd, []string{}, options) - if err == nil || !errors.IsNotFound(err) { - t.Errorf("unexpected error: expected NotFound, got %v", err) - } -} - -func TestDeleteObjectIgnoreNotFound(t *testing.T) { - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: stringBody("")}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("ignore-not-found", "true") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteAllNotFound(t *testing.T) { - _, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - - // Add an item to the list which will result in a 404 on delete - svc.Items = append(svc.Items, api.Service{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - notFoundError := &errors.NewNotFound(api.Resource("services"), "foo").(*errors.StatusError).ErrStatus - - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/services" && m == "GET": - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - case p == "/namespaces/test/services/foo" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: objBody(codec, notFoundError)}, nil - case p == "/namespaces/test/services/baz" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("all", "true") - cmd.Flags().Set("cascade", "false") - // Make sure we can explicitly choose to fail on NotFound errors, even with --all - cmd.Flags().Set("ignore-not-found", "false") - cmd.Flags().Set("output", "name") - - err := RunDelete(f, buf, cmd, []string{"services"}, &DeleteOptions{}) - if err == nil || !errors.IsNotFound(err) { - t.Errorf("unexpected error: expected NotFound, got %v", err) - } -} - -func TestDeleteAllIgnoreNotFound(t *testing.T) { - _, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - - // Add an item to the list which will result in a 404 on delete - svc.Items = append(svc.Items, api.Service{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - notFoundError := &errors.NewNotFound(api.Resource("services"), "foo").(*errors.StatusError).ErrStatus - - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/services" && m == "GET": - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - case p == "/namespaces/test/services/foo" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: objBody(codec, notFoundError)}, nil - case p == "/namespaces/test/services/baz" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("all", "true") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"services"}) - - if buf.String() != "service/baz\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteMultipleObject(t *testing.T) { - _, svc, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/services/frontend" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("filename", "../../../examples/guestbook/frontend-service.yaml") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/redis-master\nservice/frontend\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteMultipleObjectContinueOnMissing(t *testing.T) { - _, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: stringBody("")}, nil - case p == "/namespaces/test/services/frontend" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - options := &DeleteOptions{ - Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml", "../../../examples/guestbook/frontend-service.yaml"}, - } - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - err := RunDelete(f, buf, cmd, []string{}, options) - if err == nil || !errors.IsNotFound(err) { - t.Errorf("unexpected error: expected NotFound, got %v", err) - } - - if buf.String() != "service/frontend\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteMultipleResourcesWithTheSameName(t *testing.T) { - _, svc, rc := testData() - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/baz" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/replicationcontrollers/foo" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/services/baz" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - case p == "/namespaces/test/services/foo" && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - // Ensures no GET is performed when deleting by name - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"replicationcontrollers,services", "baz", "foo"}) - if buf.String() != "replicationcontroller/baz\nreplicationcontroller/foo\nservice/baz\nservice/foo\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteDirectory(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case strings.HasPrefix(p, "/namespaces/test/replicationcontrollers/") && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/frontend\nreplicationcontroller/redis-master\nreplicationcontroller/redis-slave\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDeleteMultipleSelector(t *testing.T) { - pods, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/pods" && m == "GET": - if req.URL.Query().Get(unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String())) != "a=b" { - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - } - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - case p == "/namespaces/test/services" && m == "GET": - if req.URL.Query().Get(unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String())) != "a=b" { - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - } - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - case strings.HasPrefix(p, "/namespaces/test/pods/") && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - case strings.HasPrefix(p, "/namespaces/test/services/") && m == "DELETE": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDelete(f, buf) - cmd.Flags().Set("selector", "a=b") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"pods,services"}) - - if buf.String() != "pod/foo\npod/bar\nservice/baz\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe.go deleted file mode 100644 index e16c5756d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe.go +++ /dev/null @@ -1,189 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "strings" - - "github.com/spf13/cobra" - - apierrors "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - utilerrors "k8s.io/kubernetes/pkg/util/errors" -) - -// DescribeOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type DescribeOptions struct { - Filenames []string - Recursive bool -} - -const ( - describe_long = `Show details of a specific resource or group of resources. - -This command joins many API calls together to form a detailed description of a -given resource or group of resources. - -$ kubectl describe TYPE NAME_PREFIX - -will first check for an exact match on TYPE and NAME_PREFIX. If no such resource -exists, it will output details for every resource that has a name prefixed with NAME_PREFIX - -` + kubectl.PossibleResourceTypes - describe_example = `# Describe a node -kubectl describe nodes kubernetes-minion-emt8.c.myproject.internal - -# Describe a pod -kubectl describe pods/nginx - -# Describe a pod identified by type and name in "pod.json" -kubectl describe -f pod.json - -# Describe all pods -kubectl describe pods - -# Describe pods by label name=myLabel -kubectl describe po -l name=myLabel - -# Describe all pods managed by the 'frontend' replication controller (rc-created pods -# get the name of the rc as a prefix in the pod the name). -kubectl describe pods frontend` -) - -func NewCmdDescribe(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &DescribeOptions{} - describerSettings := &kubectl.DescriberSettings{} - - validArgs := kubectl.DescribableResources() - argAliases := kubectl.ResourceAliases(validArgs) - - cmd := &cobra.Command{ - Use: "describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)", - Short: "Show details of a specific resource or group of resources", - Long: describe_long, - Example: describe_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunDescribe(f, out, cmd, args, options, describerSettings) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - usage := "Filename, directory, or URL to a file containing the resource to describe" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") - cmd.Flags().BoolVar(&describerSettings.ShowEvents, "show-events", true, "If true, display events related to the described object.") - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunDescribe(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *DescribeOptions, describerSettings *kubectl.DescriberSettings) error { - selector := cmdutil.GetFlagString(cmd, "selector") - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - if len(args) == 0 && len(options.Filenames) == 0 { - fmt.Fprint(out, "You must specify the type of resource to describe. ", valid_resources) - return cmdutil.UsageError(cmd, "Required resource not specified.") - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(selector). - ResourceTypeOrNameArgs(true, args...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - allErrs := []error{} - infos, err := r.Infos() - if err != nil { - if apierrors.IsNotFound(err) && len(args) == 2 { - return DescribeMatchingResources(mapper, typer, f, cmdNamespace, args[0], args[1], describerSettings, out, err) - } - allErrs = append(allErrs, err) - } - - for _, info := range infos { - mapping := info.ResourceMapping() - describer, err := f.Describer(mapping) - if err != nil { - allErrs = append(allErrs, err) - continue - } - s, err := describer.Describe(info.Namespace, info.Name, *describerSettings) - if err != nil { - allErrs = append(allErrs, err) - continue - } - fmt.Fprintf(out, "%s\n\n", s) - } - - return utilerrors.NewAggregate(allErrs) -} - -func DescribeMatchingResources(mapper meta.RESTMapper, typer runtime.ObjectTyper, f *cmdutil.Factory, namespace, rsrc, prefix string, describerSettings *kubectl.DescriberSettings, out io.Writer, originalError error) error { - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(namespace).DefaultNamespace(). - ResourceTypeOrNameArgs(true, rsrc). - SingleResourceType(). - Flatten(). - Do() - mapping, err := r.ResourceMapping() - if err != nil { - return err - } - describer, err := f.Describer(mapping) - if err != nil { - return err - } - infos, err := r.Infos() - if err != nil { - return err - } - isFound := false - for ix := range infos { - info := infos[ix] - if strings.HasPrefix(info.Name, prefix) { - isFound = true - s, err := describer.Describe(info.Namespace, info.Name, *describerSettings) - if err != nil { - return err - } - fmt.Fprintf(out, "%s\n", s) - } - } - if !isFound { - return originalError - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe_test.go deleted file mode 100644 index c8b9905ec..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/describe_test.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "fmt" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -// Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. -func TestDescribeUnknownSchemaObject(t *testing.T) { - d := &testDescriber{Output: "test output"} - f, tf, codec := NewTestFactory() - tf.Describer = d - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &internalType{Name: "foo"})}, - } - tf.Namespace = "non-default" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDescribe(f, buf) - cmd.Run(cmd, []string{"type", "foo"}) - - if d.Name != "foo" || d.Namespace != "non-default" { - t.Errorf("unexpected describer: %#v", d) - } - - if buf.String() != fmt.Sprintf("%s\n\n", d.Output) { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDescribeObject(t *testing.T) { - _, _, rc := testData() - f, tf, codec := NewAPIFactory() - d := &testDescriber{Output: "test output"} - tf.Describer = d - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "GET": - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdDescribe(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Run(cmd, []string{}) - - if d.Name != "redis-master" || d.Namespace != "test" { - t.Errorf("unexpected describer: %#v", d) - } - - if buf.String() != fmt.Sprintf("%s\n\n", d.Output) { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDescribeListObjects(t *testing.T) { - pods, _, _ := testData() - f, tf, codec := NewAPIFactory() - d := &testDescriber{Output: "test output"} - tf.Describer = d - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdDescribe(f, buf) - cmd.Run(cmd, []string{"pods"}) - if buf.String() != fmt.Sprintf("%s\n\n%s\n\n", d.Output, d.Output) { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestDescribeObjectShowEvents(t *testing.T) { - pods, _, _ := testData() - f, tf, codec := NewAPIFactory() - d := &testDescriber{Output: "test output"} - tf.Describer = d - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdDescribe(f, buf) - cmd.Flags().Set("show-events", "true") - cmd.Run(cmd, []string{"pods"}) - if d.Settings.ShowEvents != true { - t.Errorf("ShowEvents = true expected, got ShowEvents = %v", d.Settings.ShowEvents) - } -} - -func TestDescribeObjectSkipEvents(t *testing.T) { - pods, _, _ := testData() - f, tf, codec := NewAPIFactory() - d := &testDescriber{Output: "test output"} - tf.Describer = d - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdDescribe(f, buf) - cmd.Flags().Set("show-events", "false") - cmd.Run(cmd, []string{"pods"}) - if d.Settings.ShowEvents != false { - t.Errorf("ShowEvents = false expected, got ShowEvents = %v", d.Settings.ShowEvents) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain.go deleted file mode 100644 index 6be2cc4b9..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain.go +++ /dev/null @@ -1,385 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "errors" - "fmt" - "io" - "reflect" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/controller" - // "k8s.io/kubernetes/pkg/api/unversioned" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/fields" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/runtime" -) - -type DrainOptions struct { - client *client.Client - factory *cmdutil.Factory - Force bool - GracePeriodSeconds int - IgnoreDaemonsets bool - mapper meta.RESTMapper - nodeInfo *resource.Info - out io.Writer - typer runtime.ObjectTyper -} - -const ( - cordon_long = `Mark node as unschedulable. -` - cordon_example = `# Mark node "foo" as unschedulable. -kubectl cordon foo -` -) - -func NewCmdCordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &DrainOptions{factory: f, out: out} - - cmd := &cobra.Command{ - Use: "cordon NODE", - Short: "Mark node as unschedulable", - Long: cordon_long, - Example: cordon_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(options.SetupDrain(cmd, args)) - cmdutil.CheckErr(options.RunCordonOrUncordon(true)) - }, - } - return cmd -} - -const ( - uncordon_long = `Mark node as schedulable. -` - uncordon_example = `# Mark node "foo" as schedulable. -$ kubectl uncordon foo -` -) - -func NewCmdUncordon(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &DrainOptions{factory: f, out: out} - - cmd := &cobra.Command{ - Use: "uncordon NODE", - Short: "Mark node as schedulable", - Long: uncordon_long, - Example: uncordon_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(options.SetupDrain(cmd, args)) - cmdutil.CheckErr(options.RunCordonOrUncordon(false)) - }, - } - return cmd -} - -const ( - drain_long = `Drain node in preparation for maintenance. - -The given node will be marked unschedulable to prevent new pods from arriving. -Then drain deletes all pods except mirror pods (which cannot be deleted through -the API server). If there are DaemonSet-managed pods, drain will not proceed -without --ignore-daemonsets, and regardless it will not delete any -DaemonSet-managed pods, because those pods would be immediately replaced by the -DaemonSet controller, which ignores unschedulable markings. If there are any -pods that are neither mirror pods nor managed--by ReplicationController, -ReplicaSet, DaemonSet or Job--, then drain will not delete any pods unless you -use --force. - -When you are ready to put the node back into service, use kubectl uncordon, which -will make the node schedulable again. -` - drain_example = `# Drain node "foo", even if there are pods not managed by a ReplicationController, ReplicaSet, Job, or DaemonSet on it. -$ kubectl drain foo --force - -# As above, but abort if there are pods not managed by a ReplicationController, ReplicaSet, Job, or DaemonSet, and use a grace period of 15 minutes. -$ kubectl drain foo --grace-period=900 -` -) - -func NewCmdDrain(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &DrainOptions{factory: f, out: out} - - cmd := &cobra.Command{ - Use: "drain NODE", - Short: "Drain node in preparation for maintenance", - Long: drain_long, - Example: drain_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(options.SetupDrain(cmd, args)) - cmdutil.CheckErr(options.RunDrain()) - }, - } - cmd.Flags().BoolVar(&options.Force, "force", false, "Continue even if there are pods not managed by a ReplicationController, ReplicaSet, Job, or DaemonSet.") - cmd.Flags().BoolVar(&options.IgnoreDaemonsets, "ignore-daemonsets", false, "Ignore DaemonSet-managed pods.") - cmd.Flags().IntVar(&options.GracePeriodSeconds, "grace-period", -1, "Period of time in seconds given to each pod to terminate gracefully. If negative, the default value specified in the pod will be used.") - return cmd -} - -// SetupDrain populates some fields from the factory, grabs command line -// arguments and looks up the node using Builder -func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { - var err error - if len(args) != 1 { - return cmdutil.UsageError(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use)) - } - - if o.client, err = o.factory.Client(); err != nil { - return err - } - - o.mapper, o.typer = o.factory.Object(false) - - cmdNamespace, _, err := o.factory.DefaultNamespace() - if err != nil { - return err - } - - r := o.factory.NewBuilder(cmdutil.GetIncludeThirdPartyAPIs(cmd)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - ResourceNames("node", args[0]). - Do() - - if err = r.Err(); err != nil { - return err - } - - return r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - o.nodeInfo = info - return nil - }) -} - -// RunDrain runs the 'drain' command -func (o *DrainOptions) RunDrain() error { - if err := o.RunCordonOrUncordon(true); err != nil { - return err - } - - pods, err := o.GetPodsForDeletion() - if err != nil { - return err - } - - if err = o.deletePods(pods); err != nil { - return err - } - cmdutil.PrintSuccess(o.mapper, false, o.out, "node", o.nodeInfo.Name, "drained") - return nil -} - -// GetPodsForDeletion returns all the pods we're going to delete. If there are -// any unmanaged pods and the user didn't pass --force, we return that list in -// an error. -func (o *DrainOptions) GetPodsForDeletion() ([]api.Pod, error) { - pods := []api.Pod{} - podList, err := o.client.Pods(api.NamespaceAll).List(api.ListOptions{FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": o.nodeInfo.Name})}) - if err != nil { - return pods, err - } - unreplicatedPodNames := []string{} - daemonSetPodNames := []string{} - - for _, pod := range podList.Items { - _, found := pod.ObjectMeta.Annotations[types.ConfigMirrorAnnotationKey] - if found { - // Skip mirror pod - continue - } - replicated := false - daemonset_pod := false - - creatorRef, found := pod.ObjectMeta.Annotations[controller.CreatedByAnnotation] - if found { - // Now verify that the specified creator actually exists. - var sr api.SerializedReference - if err := runtime.DecodeInto(o.factory.Decoder(true), []byte(creatorRef), &sr); err != nil { - return pods, err - } - if sr.Reference.Kind == "ReplicationController" { - rc, err := o.client.ReplicationControllers(sr.Reference.Namespace).Get(sr.Reference.Name) - // Assume the only reason for an error is because the RC is - // gone/missing, not for any other cause. TODO(mml): something more - // sophisticated than this - if err == nil && rc != nil { - replicated = true - } - } else if sr.Reference.Kind == "DaemonSet" { - ds, err := o.client.DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name) - - // Assume the only reason for an error is because the DaemonSet is - // gone/missing, not for any other cause. TODO(mml): something more - // sophisticated than this - if err == nil && ds != nil { - // Otherwise, treat daemonset-managed pods as unmanaged since - // DaemonSet Controller currently ignores the unschedulable bit. - // FIXME(mml): Add link to the issue concerning a proper way to drain - // daemonset pods, probably using taints. - daemonset_pod = true - } - } else if sr.Reference.Kind == "Job" { - job, err := o.client.ExtensionsClient.Jobs(sr.Reference.Namespace).Get(sr.Reference.Name) - - // Assume the only reason for an error is because the Job is - // gone/missing, not for any other cause. TODO(mml): something more - // sophisticated than this - if err == nil && job != nil { - replicated = true - } - } else if sr.Reference.Kind == "ReplicaSet" { - rs, err := o.client.ExtensionsClient.ReplicaSets(sr.Reference.Namespace).Get(sr.Reference.Name) - - // Assume the only reason for an error is because the RS is - // gone/missing, not for any other cause. TODO(mml): something more - // sophisticated than this - if err == nil && rs != nil { - replicated = true - } - } - } - - switch { - case daemonset_pod: - daemonSetPodNames = append(daemonSetPodNames, pod.Name) - case !replicated: - unreplicatedPodNames = append(unreplicatedPodNames, pod.Name) - if o.Force { - pods = append(pods, pod) - } - default: - pods = append(pods, pod) - } - } - - daemonSetErrors := !o.IgnoreDaemonsets && len(daemonSetPodNames) > 0 - unreplicatedErrors := !o.Force && len(unreplicatedPodNames) > 0 - - switch { - case daemonSetErrors && unreplicatedErrors: - return []api.Pod{}, errors.New(unmanagedMsg(unreplicatedPodNames, daemonSetPodNames, true)) - case daemonSetErrors && !unreplicatedErrors: - return []api.Pod{}, errors.New(unmanagedMsg([]string{}, daemonSetPodNames, true)) - case unreplicatedErrors && !daemonSetErrors: - return []api.Pod{}, errors.New(unmanagedMsg(unreplicatedPodNames, []string{}, true)) - } - - if len(unreplicatedPodNames) > 0 { - fmt.Fprintf(o.out, "WARNING: About to delete these %s\n", unmanagedMsg(unreplicatedPodNames, []string{}, false)) - } - if len(daemonSetPodNames) > 0 { - fmt.Fprintf(o.out, "WARNING: Skipping %s\n", unmanagedMsg([]string{}, daemonSetPodNames, false)) - } - - return pods, nil -} - -// Helper for generating errors or warnings about unmanaged pods. -func unmanagedMsg(unreplicatedNames []string, daemonSetNames []string, include_guidance bool) string { - msgs := []string{} - if len(unreplicatedNames) > 0 { - msg := fmt.Sprintf("pods not managed by ReplicationController, ReplicaSet, Job, or DaemonSet: %s", strings.Join(unreplicatedNames, ",")) - if include_guidance { - msg += " (use --force to override)" - } - msgs = append(msgs, msg) - } - if len(daemonSetNames) > 0 { - msg := fmt.Sprintf("DaemonSet-managed pods: %s", strings.Join(daemonSetNames, ",")) - if include_guidance { - msg += " (use --ignore-daemonsets to ignore)" - } - msgs = append(msgs, msg) - } - - return strings.Join(msgs, " and ") -} - -// deletePods deletes the pods on the api server -func (o *DrainOptions) deletePods(pods []api.Pod) error { - deleteOptions := api.DeleteOptions{} - if o.GracePeriodSeconds >= 0 { - gracePeriodSeconds := int64(o.GracePeriodSeconds) - deleteOptions.GracePeriodSeconds = &gracePeriodSeconds - } - - for _, pod := range pods { - err := o.client.Pods(pod.Namespace).Delete(pod.Name, &deleteOptions) - if err != nil { - return err - } - cmdutil.PrintSuccess(o.mapper, false, o.out, "pod", pod.Name, "deleted") - } - - return nil -} - -// RunCordonOrUncordon runs either Cordon or Uncordon. The desired value for -// "Unschedulable" is passed as the first arg. -func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { - cmdNamespace, _, err := o.factory.DefaultNamespace() - if err != nil { - return err - } - - if o.nodeInfo.Mapping.GroupVersionKind.Kind == "Node" { - unsched := reflect.ValueOf(o.nodeInfo.Object).Elem().FieldByName("Spec").FieldByName("Unschedulable") - if unsched.Bool() == desired { - cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, already(desired)) - } else { - helper := resource.NewHelper(o.client, o.nodeInfo.Mapping) - unsched.SetBool(desired) - _, err := helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object) - if err != nil { - return err - } - cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, changed(desired)) - } - } else { - cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, "skipped") - } - - return nil -} - -// already() and changed() return suitable strings for {un,}cordoning - -func already(desired bool) string { - if desired { - return "already cordoned" - } - return "already uncordoned" -} - -func changed(desired bool) string { - if desired { - return "cordoned" - } - return "uncordoned" -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain_test.go deleted file mode 100644 index e1f421bcd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/drain_test.go +++ /dev/null @@ -1,537 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "reflect" - "strings" - "testing" - "time" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/conversion" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/runtime" -) - -var node *api.Node -var cordoned_node *api.Node - -func TestMain(m *testing.M) { - // Create a node. - node = &api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "node", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - }, - Spec: api.NodeSpec{ - ExternalID: "node", - }, - Status: api.NodeStatus{}, - } - clone, _ := conversion.NewCloner().DeepCopy(node) - - // A copy of the same node, but cordoned. - cordoned_node = clone.(*api.Node) - cordoned_node.Spec.Unschedulable = true - os.Exit(m.Run()) -} - -func TestCordon(t *testing.T) { - tests := []struct { - description string - node *api.Node - expected *api.Node - cmd func(*cmdutil.Factory, io.Writer) *cobra.Command - arg string - expectFatal bool - }{ - { - description: "node/node syntax", - node: cordoned_node, - expected: node, - cmd: NewCmdUncordon, - arg: "node/node", - expectFatal: false, - }, - { - description: "uncordon for real", - node: cordoned_node, - expected: node, - cmd: NewCmdUncordon, - arg: "node", - expectFatal: false, - }, - { - description: "uncordon does nothing", - node: node, - expected: node, - cmd: NewCmdUncordon, - arg: "node", - expectFatal: false, - }, - { - description: "cordon does nothing", - node: cordoned_node, - expected: cordoned_node, - cmd: NewCmdCordon, - arg: "node", - expectFatal: false, - }, - { - description: "cordon for real", - node: node, - expected: cordoned_node, - cmd: NewCmdCordon, - arg: "node", - expectFatal: false, - }, - { - description: "cordon missing node", - node: node, - expected: node, - cmd: NewCmdCordon, - arg: "bar", - expectFatal: true, - }, - { - description: "uncordon missing node", - node: node, - expected: node, - cmd: NewCmdUncordon, - arg: "bar", - expectFatal: true, - }, - } - - for _, test := range tests { - f, tf, codec := NewAPIFactory() - new_node := &api.Node{} - updated := false - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - m := &MyReq{req} - switch { - case m.isFor("GET", "/nodes/node"): - return &http.Response{StatusCode: 200, Body: objBody(codec, test.node)}, nil - case m.isFor("GET", "/nodes/bar"): - return &http.Response{StatusCode: 404, Body: stringBody("nope")}, nil - case m.isFor("PUT", "/nodes/node"): - data, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Fatalf("%s: unexpected error: %v", test.description, err) - } - defer req.Body.Close() - if err := runtime.DecodeInto(codec, data, new_node); err != nil { - t.Fatalf("%s: unexpected error: %v", test.description, err) - } - if !reflect.DeepEqual(test.expected.Spec, new_node.Spec) { - t.Fatalf("%s: expected:\n%v\nsaw:\n%v\n", test.description, test.expected.Spec, new_node.Spec) - } - updated = true - return &http.Response{StatusCode: 200, Body: objBody(codec, new_node)}, nil - default: - t.Fatalf("%s: unexpected request: %v %#v\n%#v", test.description, req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := test.cmd(f, buf) - - saw_fatal := false - func() { - defer func() { - // Recover from the panic below. - _ = recover() - // Restore cmdutil behavior - cmdutil.DefaultBehaviorOnFatal() - }() - cmdutil.BehaviorOnFatal(func(e string) { saw_fatal = true; panic(e) }) - cmd.SetArgs([]string{test.arg}) - cmd.Execute() - }() - - if test.expectFatal { - if !saw_fatal { - t.Fatalf("%s: unexpected non-error", test.description) - } - if updated { - t.Fatalf("%s: unexpcted update", test.description) - } - } - - if !test.expectFatal && saw_fatal { - t.Fatalf("%s: unexpected error", test.description) - } - if !reflect.DeepEqual(test.expected.Spec, test.node.Spec) && !updated { - t.Fatalf("%s: node never updated", test.description) - } - } -} - -func TestDrain(t *testing.T) { - labels := make(map[string]string) - labels["my_key"] = "my_value" - - rc := api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "rc", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - SelfLink: testapi.Default.SelfLink("replicationcontrollers", "rc"), - }, - Spec: api.ReplicationControllerSpec{ - Selector: labels, - }, - } - - rc_anno := make(map[string]string) - rc_anno[controller.CreatedByAnnotation] = refJson(t, &rc) - - rc_pod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - Annotations: rc_anno, - }, - Spec: api.PodSpec{ - NodeName: "node", - }, - } - - ds := extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "ds", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - SelfLink: "/apis/extensions/v1beta1/namespaces/default/daemonsets/ds", - }, - Spec: extensions.DaemonSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: labels}, - }, - } - - ds_anno := make(map[string]string) - ds_anno[controller.CreatedByAnnotation] = refJson(t, &ds) - - ds_pod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - Annotations: ds_anno, - }, - Spec: api.PodSpec{ - NodeName: "node", - }, - } - - job := batch.Job{ - ObjectMeta: api.ObjectMeta{ - Name: "job", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - SelfLink: "/apis/extensions/v1beta1/namespaces/default/jobs/job", - }, - Spec: batch.JobSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: labels}, - }, - } - - job_pod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - Annotations: map[string]string{controller.CreatedByAnnotation: refJson(t, &job)}, - }, - } - - rs := extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "rs", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - SelfLink: testapi.Default.SelfLink("replicasets", "rs"), - }, - Spec: extensions.ReplicaSetSpec{ - Selector: &unversioned.LabelSelector{MatchLabels: labels}, - }, - } - - rs_anno := make(map[string]string) - rs_anno[controller.CreatedByAnnotation] = refJson(t, &rs) - - rs_pod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - Annotations: rs_anno, - }, - Spec: api.PodSpec{ - NodeName: "node", - }, - } - - naked_pod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "default", - CreationTimestamp: unversioned.Time{Time: time.Now()}, - Labels: labels, - }, - Spec: api.PodSpec{ - NodeName: "node", - }, - } - - tests := []struct { - description string - node *api.Node - expected *api.Node - pods []api.Pod - rcs []api.ReplicationController - replicaSets []extensions.ReplicaSet - args []string - expectFatal bool - expectDelete bool - }{ - { - description: "RC-managed pod", - node: node, - expected: cordoned_node, - pods: []api.Pod{rc_pod}, - rcs: []api.ReplicationController{rc}, - args: []string{"node"}, - expectFatal: false, - expectDelete: true, - }, - { - description: "DS-managed pod", - node: node, - expected: cordoned_node, - pods: []api.Pod{ds_pod}, - rcs: []api.ReplicationController{rc}, - args: []string{"node"}, - expectFatal: true, - expectDelete: false, - }, - { - description: "DS-managed pod with --ignore-daemonsets", - node: node, - expected: cordoned_node, - pods: []api.Pod{ds_pod}, - rcs: []api.ReplicationController{rc}, - args: []string{"node", "--ignore-daemonsets"}, - expectFatal: false, - expectDelete: false, - }, - { - description: "Job-managed pod", - node: node, - expected: cordoned_node, - pods: []api.Pod{job_pod}, - rcs: []api.ReplicationController{rc}, - args: []string{"node"}, - expectFatal: false, - expectDelete: true, - }, - { - description: "RS-managed pod", - node: node, - expected: cordoned_node, - pods: []api.Pod{rs_pod}, - replicaSets: []extensions.ReplicaSet{rs}, - args: []string{"node"}, - expectFatal: false, - expectDelete: true, - }, - { - description: "naked pod", - node: node, - expected: cordoned_node, - pods: []api.Pod{naked_pod}, - rcs: []api.ReplicationController{}, - args: []string{"node"}, - expectFatal: true, - expectDelete: false, - }, - { - description: "naked pod with --force", - node: node, - expected: cordoned_node, - pods: []api.Pod{naked_pod}, - rcs: []api.ReplicationController{}, - args: []string{"node", "--force"}, - expectFatal: false, - expectDelete: true, - }, - { - description: "empty node", - node: node, - expected: cordoned_node, - pods: []api.Pod{}, - rcs: []api.ReplicationController{rc}, - args: []string{"node"}, - expectFatal: false, - expectDelete: false, - }, - } - - for _, test := range tests { - new_node := &api.Node{} - deleted := false - f, tf, codec := NewAPIFactory() - - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - m := &MyReq{req} - switch { - case m.isFor("GET", "/nodes/node"): - return &http.Response{StatusCode: 200, Body: objBody(codec, test.node)}, nil - case m.isFor("GET", "/namespaces/default/replicationcontrollers/rc"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &test.rcs[0])}, nil - case m.isFor("GET", "/namespaces/default/daemonsets/ds"): - return &http.Response{StatusCode: 200, Body: objBody(testapi.Extensions.Codec(), &ds)}, nil - case m.isFor("GET", "/namespaces/default/jobs/job"): - return &http.Response{StatusCode: 200, Body: objBody(testapi.Extensions.Codec(), &job)}, nil - case m.isFor("GET", "/namespaces/default/replicasets/rs"): - return &http.Response{StatusCode: 200, Body: objBody(testapi.Extensions.Codec(), &test.replicaSets[0])}, nil - case m.isFor("GET", "/pods"): - values, err := url.ParseQuery(req.URL.RawQuery) - if err != nil { - t.Fatalf("%s: unexpected error: %v", test.description, err) - } - get_params := make(url.Values) - get_params["fieldSelector"] = []string{"spec.nodeName=node"} - if !reflect.DeepEqual(get_params, values) { - t.Fatalf("%s: expected:\n%v\nsaw:\n%v\n", test.description, get_params, values) - } - return &http.Response{StatusCode: 200, Body: objBody(codec, &api.PodList{Items: test.pods})}, nil - case m.isFor("GET", "/replicationcontrollers"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &api.ReplicationControllerList{Items: test.rcs})}, nil - case m.isFor("PUT", "/nodes/node"): - data, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Fatalf("%s: unexpected error: %v", test.description, err) - } - defer req.Body.Close() - if err := runtime.DecodeInto(codec, data, new_node); err != nil { - t.Fatalf("%s: unexpected error: %v", test.description, err) - } - if !reflect.DeepEqual(test.expected.Spec, new_node.Spec) { - t.Fatalf("%s: expected:\n%v\nsaw:\n%v\n", test.description, test.expected.Spec, new_node.Spec) - } - return &http.Response{StatusCode: 200, Body: objBody(codec, new_node)}, nil - case m.isFor("DELETE", "/namespaces/default/pods/bar"): - deleted = true - return &http.Response{StatusCode: 204, Body: objBody(codec, &test.pods[0])}, nil - default: - t.Fatalf("%s: unexpected request: %v %#v\n%#v", test.description, req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdDrain(f, buf) - - saw_fatal := false - func() { - defer func() { - // Recover from the panic below. - _ = recover() - // Restore cmdutil behavior - cmdutil.DefaultBehaviorOnFatal() - }() - cmdutil.BehaviorOnFatal(func(e string) { saw_fatal = true; panic(e) }) - cmd.SetArgs(test.args) - cmd.Execute() - }() - - if test.expectFatal { - if !saw_fatal { - t.Fatalf("%s: unexpected non-error", test.description) - } - } - - if test.expectDelete { - if !deleted { - t.Fatalf("%s: pod never deleted", test.description) - } - } - if !test.expectDelete { - if deleted { - t.Fatalf("%s: unexpected delete", test.description) - } - } - } -} - -type MyReq struct { - Request *http.Request -} - -func (m *MyReq) isFor(method string, path string) bool { - req := m.Request - - return method == req.Method && (req.URL.Path == path || req.URL.Path == strings.Join([]string{"/api/v1", path}, "") || req.URL.Path == strings.Join([]string{"/apis/extensions/v1beta1", path}, "")) -} - -func refJson(t *testing.T, o runtime.Object) string { - ref, err := api.GetReference(o) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - _, _, codec := NewAPIFactory() - json, err := runtime.Encode(codec, &api.SerializedReference{Reference: *ref}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - return string(json) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/edit.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/edit.go deleted file mode 100644 index 78f613a86..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/edit.go +++ /dev/null @@ -1,496 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bufio" - "bytes" - "fmt" - "io" - "os" - "path/filepath" - gruntime "runtime" - "strings" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" - "k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/crlf" - "k8s.io/kubernetes/pkg/util/strategicpatch" - "k8s.io/kubernetes/pkg/util/yaml" - - "github.com/golang/glog" - "github.com/spf13/cobra" -) - -const ( - editLong = `Edit a resource from the default editor. - -The edit command allows you to directly edit any API resource you can retrieve via the -command line tools. It will open the editor defined by your KUBE_EDITOR, or EDITOR -environment variables, or fall back to 'vi' for Linux or 'notepad' for Windows. -You can edit multiple objects, although changes are applied one at a time. The command -accepts filenames as well as command line arguments, although the files you point to must -be previously saved versions of resources. - -The files to edit will be output in the default API version, or a version specified -by --output-version. The default format is YAML - if you would like to edit in JSON -pass -o json. The flag --windows-line-endings can be used to force Windows line endings, -otherwise the default for your operating system will be used. - -In the event an error occurs while updating, a temporary file will be created on disk -that contains your unapplied changes. The most common error when updating a resource -is another editor changing the resource on the server. When this occurs, you will have -to apply your changes to the newer version of the resource, or update your temporary -saved copy to include the latest resource version.` - - editExample = ` # Edit the service named 'docker-registry': - kubectl edit svc/docker-registry - - # Use an alternative editor - KUBE_EDITOR="nano" kubectl edit svc/docker-registry - - # Edit the service 'docker-registry' in JSON using the v1 API format: - kubectl edit svc/docker-registry --output-version=v1 -o json` -) - -// EditOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type EditOptions struct { - Filenames []string - Recursive bool -} - -var errExit = fmt.Errorf("exit directly") - -func NewCmdEdit(f *cmdutil.Factory, out, errOut io.Writer) *cobra.Command { - options := &EditOptions{} - - // retrieve a list of handled resources from printer as valid args - validArgs, argAliases := []string{}, []string{} - p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) - cmdutil.CheckErr(err) - if p != nil { - validArgs = p.HandledResources() - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "edit (RESOURCE/NAME | -f FILENAME)", - Short: "Edit a resource on the server", - Long: editLong, - Example: fmt.Sprintf(editExample), - Run: func(cmd *cobra.Command, args []string) { - err := RunEdit(f, out, errOut, cmd, args, options) - if err == errExit { - os.Exit(1) - } - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - usage := "Filename, directory, or URL to file to use to edit the resource" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmd.Flags().StringP("output", "o", "yaml", "Output format. One of: yaml|json.") - cmd.Flags().String("output-version", "", "Output the formatted object with the given group version (for ex: 'extensions/v1beta1').") - cmd.Flags().Bool("windows-line-endings", gruntime.GOOS == "windows", "Use Windows line-endings (default Unix line-endings)") - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunEdit(f *cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args []string, options *EditOptions) error { - var printer kubectl.ResourcePrinter - var ext string - switch format := cmdutil.GetFlagString(cmd, "output"); format { - case "json": - printer = &kubectl.JSONPrinter{} - ext = ".json" - case "yaml": - printer = &kubectl.YAMLPrinter{} - ext = ".yaml" - default: - return cmdutil.UsageError(cmd, "The flag 'output' must be one of yaml|json") - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - resourceMapper := &resource.Mapper{ - ObjectTyper: typer, - RESTMapper: mapper, - ClientMapper: resource.ClientMapperFunc(f.ClientForMapping), - - // NB: we use `f.Decoder(false)` to get a plain deserializer for - // the resourceMapper, since it's used to read in edits and - // we don't want to convert into the internal version when - // reading in edits (this would cause us to potentially try to - // compare two different GroupVersions). - Decoder: f.Decoder(false), - } - - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(true, args...). - Latest(). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - infos, err := r.Infos() - if err != nil { - return err - } - - clientConfig, err := f.ClientConfig() - if err != nil { - return err - } - - encoder := f.JSONEncoder() - defaultVersion, err := cmdutil.OutputVersion(cmd, clientConfig.GroupVersion) - if err != nil { - return err - } - objs, err := resource.AsVersionedObjects(infos, defaultVersion.String(), encoder) - if err != nil { - return err - } - - var ( - windowsLineEndings = cmdutil.GetFlagBool(cmd, "windows-line-endings") - edit = editor.NewDefaultEditor(f.EditorEnvs()) - results = editResults{} - original = []byte{} - edited = []byte{} - file string - ) - -outter: - for i := range objs { - obj := objs[i] - // some bookkeeping - results.header.flush() - containsError := false - - for { - // generate the file to edit - buf := &bytes.Buffer{} - var w io.Writer = buf - if windowsLineEndings { - w = crlf.NewCRLFWriter(w) - } - if err := results.header.writeTo(w); err != nil { - return preservedFile(err, results.file, errOut) - } - if !containsError { - if err := printer.PrintObj(obj, w); err != nil { - return preservedFile(err, results.file, errOut) - } - original = buf.Bytes() - } else { - // In case of an error, preserve the edited file. - // Remove the comments (header) from it since we already - // have included the latest header in the buffer above. - buf.Write(manualStrip(edited)) - } - - // launch the editor - editedDiff := edited - edited, file, err = edit.LaunchTempFile(fmt.Sprintf("%s-edit-", filepath.Base(os.Args[0])), ext, buf) - if err != nil { - return preservedFile(err, results.file, errOut) - } - if bytes.Equal(stripComments(editedDiff), stripComments(edited)) { - // Ugly hack right here. We will hit this either (1) when we try to - // save the same changes we tried to save in the previous iteration - // which means our changes are invalid or (2) when we exit the second - // time. The second case is more usual so we can probably live with it. - // TODO: A less hacky fix would be welcome :) - fmt.Fprintln(errOut, "Edit cancelled, no valid changes were saved.") - continue outter - } - - // cleanup any file from the previous pass - if len(results.file) > 0 { - os.Remove(results.file) - } - glog.V(4).Infof("User edited:\n%s", string(edited)) - - // Compare content without comments - if bytes.Equal(stripComments(original), stripComments(edited)) { - os.Remove(file) - fmt.Fprintln(errOut, "Edit cancelled, no changes made.") - continue outter - } - lines, err := hasLines(bytes.NewBuffer(edited)) - if err != nil { - return preservedFile(err, file, errOut) - } - if !lines { - os.Remove(file) - fmt.Fprintln(errOut, "Edit cancelled, saved file was empty.") - continue outter - } - - results = editResults{ - file: file, - } - - // parse the edited file - updates, err := resourceMapper.InfoForData(edited, "edited-file") - if err != nil { - // syntax error - containsError = true - results.header.reasons = append(results.header.reasons, editReason{head: fmt.Sprintf("The edited file had a syntax error: %v", err)}) - continue - } - // not a syntax error as it turns out... - containsError = false - - // put configuration annotation in "updates" - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), updates, encoder); err != nil { - return preservedFile(err, file, errOut) - } - if cmdutil.ShouldRecord(cmd, updates) { - err = cmdutil.RecordChangeCause(updates.Object, f.Command()) - if err != nil { - return err - } - } - editedCopy := edited - if editedCopy, err = runtime.Encode(encoder, updates.Object); err != nil { - return preservedFile(err, file, errOut) - } - - visitor := resource.NewFlattenListVisitor(updates, resourceMapper) - - // need to make sure the original namespace wasn't changed while editing - if err = visitor.Visit(resource.RequireNamespace(cmdNamespace)); err != nil { - return preservedFile(err, file, errOut) - } - - // use strategic merge to create a patch - originalJS, err := yaml.ToJSON(original) - if err != nil { - return preservedFile(err, file, errOut) - } - editedJS, err := yaml.ToJSON(editedCopy) - if err != nil { - return preservedFile(err, file, errOut) - } - patch, err := strategicpatch.CreateStrategicMergePatch(originalJS, editedJS, obj) - // TODO: change all jsonmerge to strategicpatch - // for checking preconditions - preconditions := []jsonmerge.PreconditionFunc{} - if err != nil { - glog.V(4).Infof("Unable to calculate diff, no merge is possible: %v", err) - return preservedFile(err, file, errOut) - } else { - preconditions = append(preconditions, jsonmerge.RequireKeyUnchanged("apiVersion")) - preconditions = append(preconditions, jsonmerge.RequireKeyUnchanged("kind")) - preconditions = append(preconditions, jsonmerge.RequireMetadataKeyUnchanged("name")) - results.version = defaultVersion - } - - if hold, msg := jsonmerge.TestPreconditionsHold(patch, preconditions); !hold { - fmt.Fprintf(errOut, "error: %s\n", msg) - return preservedFile(nil, file, errOut) - } - - errorMsg := "" - err = visitor.Visit(func(info *resource.Info, err error) error { - patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patch) - if err != nil { - errorMsg = results.addError(err, info) - return err - } - info.Refresh(patched, true) - cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, "edited") - return nil - }) - if err == nil { - os.Remove(file) - continue outter - } - // Handle all possible errors - // - // 1. retryable: propose kubectl replace -f - // 2. notfound: indicate the location of the saved configuration of the deleted resource - // 3. invalid: retry those on the spot by looping ie. reloading the editor - if results.retryable > 0 { - fmt.Fprintln(errOut, errorMsg) - fmt.Fprintf(errOut, "You can run `%s replace -f %s` to try this update again.\n", filepath.Base(os.Args[0]), file) - continue outter - } - if results.notfound > 0 { - fmt.Fprintln(errOut, errorMsg) - fmt.Fprintf(errOut, "The edits you made on deleted resources have been saved to %q\n", file) - continue outter - } - // validation error - containsError = true - } - } - return nil -} - -// editReason preserves a message about the reason this file must be edited again -type editReason struct { - head string - other []string -} - -// editHeader includes a list of reasons the edit must be retried -type editHeader struct { - reasons []editReason -} - -// writeTo outputs the current header information into a stream -func (h *editHeader) writeTo(w io.Writer) error { - fmt.Fprint(w, `# Please edit the object below. Lines beginning with a '#' will be ignored, -# and an empty file will abort the edit. If an error occurs while saving this file will be -# reopened with the relevant failures. -# -`) - for _, r := range h.reasons { - if len(r.other) > 0 { - fmt.Fprintf(w, "# %s:\n", r.head) - } else { - fmt.Fprintf(w, "# %s\n", r.head) - } - for _, o := range r.other { - fmt.Fprintf(w, "# * %s\n", o) - } - fmt.Fprintln(w, "#") - } - return nil -} - -func (h *editHeader) flush() { - h.reasons = []editReason{} -} - -// editResults capture the result of an update -type editResults struct { - header editHeader - retryable int - notfound int - edit []*resource.Info - file string - - version unversioned.GroupVersion -} - -func (r *editResults) addError(err error, info *resource.Info) string { - switch { - case errors.IsInvalid(err): - r.edit = append(r.edit, info) - reason := editReason{ - head: fmt.Sprintf("%s %q was not valid", info.Mapping.Resource, info.Name), - } - if err, ok := err.(errors.APIStatus); ok { - if details := err.Status().Details; details != nil { - for _, cause := range details.Causes { - reason.other = append(reason.other, fmt.Sprintf("%s: %s", cause.Field, cause.Message)) - } - } - } - r.header.reasons = append(r.header.reasons, reason) - return fmt.Sprintf("error: %s %q is invalid", info.Mapping.Resource, info.Name) - case errors.IsNotFound(err): - r.notfound++ - return fmt.Sprintf("error: %s %q could not be found on the server", info.Mapping.Resource, info.Name) - default: - r.retryable++ - return fmt.Sprintf("error: %s %q could not be patched: %v", info.Mapping.Resource, info.Name, err) - } -} - -// preservedFile writes out a message about the provided file if it exists to the -// provided output stream when an error happens. Used to notify the user where -// their updates were preserved. -func preservedFile(err error, path string, out io.Writer) error { - if len(path) > 0 { - if _, err := os.Stat(path); !os.IsNotExist(err) { - fmt.Fprintf(out, "A copy of your changes has been stored to %q\n", path) - } - } - return err -} - -// hasLines returns true if any line in the provided stream is non empty - has non-whitespace -// characters, or the first non-whitespace character is a '#' indicating a comment. Returns -// any errors encountered reading the stream. -func hasLines(r io.Reader) (bool, error) { - // TODO: if any files we read have > 64KB lines, we'll need to switch to bytes.ReadLine - // TODO: probably going to be secrets - s := bufio.NewScanner(r) - for s.Scan() { - if line := strings.TrimSpace(s.Text()); len(line) > 0 && line[0] != '#' { - return true, nil - } - } - if err := s.Err(); err != nil && err != io.EOF { - return false, err - } - return false, nil -} - -// stripComments will transform a YAML file into JSON, thus dropping any comments -// in it. Note that if the given file has a syntax error, the transformation will -// fail and we will manually drop all comments from the file. -func stripComments(file []byte) []byte { - stripped := file - stripped, err := yaml.ToJSON(stripped) - if err != nil { - stripped = manualStrip(file) - } - return stripped -} - -// manualStrip is used for dropping comments from a YAML file -func manualStrip(file []byte) []byte { - stripped := []byte{} - lines := bytes.Split(file, []byte("\n")) - for i, line := range lines { - if bytes.HasPrefix(bytes.TrimSpace(line), []byte("#")) { - continue - } - stripped = append(stripped, line...) - if i < len(lines)-1 { - stripped = append(stripped, '\n') - } - } - return stripped -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec.go deleted file mode 100644 index e59925873..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec.go +++ /dev/null @@ -1,241 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "net/url" - "os" - "os/signal" - "syscall" - - "github.com/docker/docker/pkg/term" - "github.com/golang/glog" - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" -) - -const ( - exec_example = `# Get output from running 'date' from pod 123456-7890, using the first container by default -kubectl exec 123456-7890 date - -# Get output from running 'date' in ruby-container from pod 123456-7890 -kubectl exec 123456-7890 -c ruby-container date - -# Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod 123456-7890 -# and sends stdout/stderr from 'bash' back to the client -kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il` -) - -func NewCmdExec(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { - options := &ExecOptions{ - In: cmdIn, - Out: cmdOut, - Err: cmdErr, - - Executor: &DefaultRemoteExecutor{}, - } - cmd := &cobra.Command{ - Use: "exec POD [-c CONTAINER] -- COMMAND [args...]", - Short: "Execute a command in a container.", - Long: "Execute a command in a container.", - Example: exec_example, - Run: func(cmd *cobra.Command, args []string) { - argsLenAtDash := cmd.ArgsLenAtDash() - cmdutil.CheckErr(options.Complete(f, cmd, args, argsLenAtDash)) - cmdutil.CheckErr(options.Validate()) - cmdutil.CheckErr(options.Run()) - }, - } - cmd.Flags().StringVarP(&options.PodName, "pod", "p", "", "Pod name") - // TODO support UID - cmd.Flags().StringVarP(&options.ContainerName, "container", "c", "", "Container name. If omitted, the first container in the pod will be chosen") - cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", false, "Pass stdin to the container") - cmd.Flags().BoolVarP(&options.TTY, "tty", "t", false, "Stdin is a TTY") - return cmd -} - -// RemoteExecutor defines the interface accepted by the Exec command - provided for test stubbing -type RemoteExecutor interface { - Execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error -} - -// DefaultRemoteExecutor is the standard implementation of remote command execution -type DefaultRemoteExecutor struct{} - -func (*DefaultRemoteExecutor) Execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error { - exec, err := remotecommand.NewExecutor(config, method, url) - if err != nil { - return err - } - return exec.Stream(remotecommandserver.SupportedStreamingProtocols, stdin, stdout, stderr, tty) -} - -// ExecOptions declare the arguments accepted by the Exec command -type ExecOptions struct { - Namespace string - PodName string - ContainerName string - Stdin bool - TTY bool - Command []string - - In io.Reader - Out io.Writer - Err io.Writer - - Executor RemoteExecutor - Client *client.Client - Config *restclient.Config -} - -// Complete verifies command line arguments and loads data from the command environment -func (p *ExecOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, argsIn []string, argsLenAtDash int) error { - // Let kubectl exec follow rules for `--`, see #13004 issue - if len(p.PodName) == 0 && (len(argsIn) == 0 || argsLenAtDash == 0) { - return cmdutil.UsageError(cmd, "POD is required for exec") - } - if len(p.PodName) != 0 { - printDeprecationWarning("exec POD", "-p POD") - if len(argsIn) < 1 { - return cmdutil.UsageError(cmd, "COMMAND is required for exec") - } - p.Command = argsIn - } else { - p.PodName = argsIn[0] - p.Command = argsIn[1:] - if len(p.Command) < 1 { - return cmdutil.UsageError(cmd, "COMMAND is required for exec") - } - } - - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - p.Namespace = namespace - - config, err := f.ClientConfig() - if err != nil { - return err - } - p.Config = config - - client, err := f.Client() - if err != nil { - return err - } - p.Client = client - - return nil -} - -// Validate checks that the provided exec options are specified. -func (p *ExecOptions) Validate() error { - if len(p.PodName) == 0 { - return fmt.Errorf("pod name must be specified") - } - if len(p.Command) == 0 { - return fmt.Errorf("you must specify at least one command for the container") - } - if p.Out == nil || p.Err == nil { - return fmt.Errorf("both output and error output must be provided") - } - if p.Executor == nil || p.Client == nil || p.Config == nil { - return fmt.Errorf("client, client config, and executor must be provided") - } - return nil -} - -// Run executes a validated remote execution against a pod. -func (p *ExecOptions) Run() error { - pod, err := p.Client.Pods(p.Namespace).Get(p.PodName) - if err != nil { - return err - } - - if pod.Status.Phase != api.PodRunning { - return fmt.Errorf("pod %s is not running and cannot execute commands; current phase is %s", p.PodName, pod.Status.Phase) - } - - containerName := p.ContainerName - if len(containerName) == 0 { - glog.V(4).Infof("defaulting container name to %s", pod.Spec.Containers[0].Name) - containerName = pod.Spec.Containers[0].Name - } - - // TODO: refactor with terminal helpers from the edit utility once that is merged - var stdin io.Reader - tty := p.TTY - if p.Stdin { - stdin = p.In - if tty { - if file, ok := stdin.(*os.File); ok { - inFd := file.Fd() - if term.IsTerminal(inFd) { - oldState, err := term.SetRawTerminal(inFd) - if err != nil { - glog.Fatal(err) - } - // this handles a clean exit, where the command finished - defer term.RestoreTerminal(inFd, oldState) - - // SIGINT is handled by term.SetRawTerminal (it runs a goroutine that listens - // for SIGINT and restores the terminal before exiting) - - // this handles SIGTERM - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGTERM) - go func() { - <-sigChan - term.RestoreTerminal(inFd, oldState) - os.Exit(0) - }() - } else { - fmt.Fprintln(p.Err, "STDIN is not a terminal") - } - } else { - tty = false - fmt.Fprintln(p.Err, "Unable to use a TTY - input is not the right kind of file") - } - } - } - - // TODO: consider abstracting into a client invocation or client helper - req := p.Client.RESTClient.Post(). - Resource("pods"). - Name(pod.Name). - Namespace(pod.Namespace). - SubResource("exec"). - Param("container", containerName) - req.VersionedParams(&api.PodExecOptions{ - Container: containerName, - Command: p.Command, - Stdin: stdin != nil, - Stdout: p.Out != nil, - Stderr: p.Err != nil, - TTY: tty, - }, api.ParameterCodec) - - return p.Executor.Execute("POST", req.URL(), p.Config, stdin, p.Out, p.Err, tty) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec_test.go deleted file mode 100644 index 001f59a47..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/exec_test.go +++ /dev/null @@ -1,258 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/url" - "reflect" - "testing" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -type fakeRemoteExecutor struct { - method string - url *url.URL - execErr error -} - -func (f *fakeRemoteExecutor) Execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error { - f.method = method - f.url = url - return f.execErr -} - -func TestPodAndContainer(t *testing.T) { - tests := []struct { - args []string - argsLenAtDash int - p *ExecOptions - name string - expectError bool - expectedPod string - expectedContainer string - expectedArgs []string - }{ - { - p: &ExecOptions{}, - argsLenAtDash: -1, - expectError: true, - name: "empty", - }, - { - p: &ExecOptions{PodName: "foo"}, - argsLenAtDash: -1, - expectError: true, - name: "no cmd", - }, - { - p: &ExecOptions{PodName: "foo", ContainerName: "bar"}, - argsLenAtDash: -1, - expectError: true, - name: "no cmd, w/ container", - }, - { - p: &ExecOptions{PodName: "foo"}, - args: []string{"cmd"}, - argsLenAtDash: -1, - expectedPod: "foo", - expectedArgs: []string{"cmd"}, - name: "pod in flags", - }, - { - p: &ExecOptions{}, - args: []string{"foo", "cmd"}, - argsLenAtDash: 0, - expectError: true, - name: "no pod, pod name is behind dash", - }, - { - p: &ExecOptions{}, - args: []string{"foo"}, - argsLenAtDash: -1, - expectError: true, - name: "no cmd, w/o flags", - }, - { - p: &ExecOptions{}, - args: []string{"foo", "cmd"}, - argsLenAtDash: -1, - expectedPod: "foo", - expectedArgs: []string{"cmd"}, - name: "cmd, w/o flags", - }, - { - p: &ExecOptions{}, - args: []string{"foo", "cmd"}, - argsLenAtDash: 1, - expectedPod: "foo", - expectedArgs: []string{"cmd"}, - name: "cmd, cmd is behind dash", - }, - { - p: &ExecOptions{ContainerName: "bar"}, - args: []string{"foo", "cmd"}, - argsLenAtDash: -1, - expectedPod: "foo", - expectedContainer: "bar", - expectedArgs: []string{"cmd"}, - name: "cmd, container in flag", - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{} - - cmd := &cobra.Command{} - options := test.p - err := options.Complete(f, cmd, test.args, test.argsLenAtDash) - if test.expectError && err == nil { - t.Errorf("unexpected non-error (%s)", test.name) - } - if !test.expectError && err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.name) - } - if err != nil { - continue - } - if options.PodName != test.expectedPod { - t.Errorf("expected: %s, got: %s (%s)", test.expectedPod, options.PodName, test.name) - } - if options.ContainerName != test.expectedContainer { - t.Errorf("expected: %s, got: %s (%s)", test.expectedContainer, options.ContainerName, test.name) - } - if !reflect.DeepEqual(test.expectedArgs, options.Command) { - t.Errorf("expected: %v, got %v (%s)", test.expectedArgs, options.Command, test.name) - } - } -} - -func TestExec(t *testing.T) { - version := testapi.Default.GroupVersion().Version - tests := []struct { - name, version, podPath, execPath, container string - pod *api.Pod - execErr bool - }{ - { - name: "pod exec", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", - pod: execPod(), - }, - { - name: "pod exec error", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", - pod: execPod(), - execErr: true, - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %s %#v\n%#v", test.name, req.Method, req.URL, req) - return nil, fmt.Errorf("unexpected request") - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - bufOut := bytes.NewBuffer([]byte{}) - bufErr := bytes.NewBuffer([]byte{}) - bufIn := bytes.NewBuffer([]byte{}) - ex := &fakeRemoteExecutor{} - if test.execErr { - ex.execErr = fmt.Errorf("exec error") - } - params := &ExecOptions{ - PodName: "foo", - ContainerName: "bar", - In: bufIn, - Out: bufOut, - Err: bufErr, - Executor: ex, - } - cmd := &cobra.Command{} - args := []string{"test", "command"} - if err := params.Complete(f, cmd, args, -1); err != nil { - t.Fatal(err) - } - err := params.Run() - if test.execErr && err != ex.execErr { - t.Errorf("%s: Unexpected exec error: %v", test.name, err) - continue - } - if !test.execErr && err != nil { - t.Errorf("%s: Unexpected error: %v", test.name, err) - continue - } - if test.execErr { - continue - } - if ex.url.Path != test.execPath { - t.Errorf("%s: Did not get expected path for exec request", test.name) - continue - } - if ex.method != "POST" { - t.Errorf("%s: Did not get method for exec request: %s", test.name, ex.method) - } - } -} - -func execPod() *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{ - { - Name: "bar", - }, - }, - }, - Status: api.PodStatus{ - Phase: api.PodRunning, - }, - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/explain.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/explain.go deleted file mode 100644 index ce959e394..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/explain.go +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apimachinery/registered" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - explainExamples = `# Get the documentation of the resource and its fields -kubectl explain pods - -# Get the documentation of a specific field of a resource -kubectl explain pods.spec.containers` - - explainLong = `Documentation of resources. - -` + kubectl.PossibleResourceTypes -) - -// NewCmdExplain returns a cobra command for swagger docs -func NewCmdExplain(f *cmdutil.Factory, out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "explain RESOURCE", - Short: "Documentation of resources.", - Long: explainLong, - Example: explainExamples, - Run: func(cmd *cobra.Command, args []string) { - err := RunExplain(f, out, cmd, args) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().Bool("recursive", false, "Print the fields of fields (Currently only 1 level deep)") - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -// RunExplain executes the appropriate steps to print a model's documentation -func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return cmdutil.UsageError(cmd, "We accept only this format: explain RESOURCE") - } - - recursive := cmdutil.GetFlagBool(cmd, "recursive") - apiVersionString := cmdutil.GetFlagString(cmd, "api-version") - apiVersion := unversioned.GroupVersion{} - - mapper, _ := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - // TODO: After we figured out the new syntax to separate group and resource, allow - // the users to use it in explain (kubectl explain ). - // Refer to issue #16039 for why we do this. Refer to PR #15808 that used "/" syntax. - inModel, fieldsPath, err := kubectl.SplitAndParseResourceRequest(args[0], mapper) - if err != nil { - return err - } - - // TODO: We should deduce the group for a resource by discovering the supported resources at server. - fullySpecifiedGVR, groupResource := unversioned.ParseResourceArg(inModel) - gvk := unversioned.GroupVersionKind{} - if fullySpecifiedGVR != nil { - gvk, _ = mapper.KindFor(*fullySpecifiedGVR) - } - if gvk.IsEmpty() { - gvk, err = mapper.KindFor(groupResource.WithVersion("")) - if err != nil { - return err - } - } - - if len(apiVersionString) == 0 { - groupMeta, err := registered.Group(gvk.Group) - if err != nil { - return err - } - apiVersion = groupMeta.GroupVersion - - } else { - apiVersion, err = unversioned.ParseGroupVersion(apiVersionString) - if err != nil { - return nil - } - } - - schema, err := f.SwaggerSchema(apiVersion.WithKind(gvk.Kind)) - if err != nil { - return err - } - - return kubectl.PrintModelDescription(inModel, fieldsPath, out, schema, recursive) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose.go deleted file mode 100644 index 068a624fc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose.go +++ /dev/null @@ -1,271 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "regexp" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/validation" -) - -// ExposeOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type ExposeOptions struct { - Filenames []string - Recursive bool -} - -const ( - expose_resources = ` - pod (po), service (svc), replicationcontroller (rc), - deployment, replicaset (rs) -` - - expose_long = `Expose a resource as a new Kubernetes service. - -Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector -for that resource as the selector for a new service on the specified port. A deployment or replica set -will be exposed as a service only if its selector is convertible to a selector that service supports, -i.e. when the selector contains only the matchLabels component. Note that if no port is specified via ---port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no -labels are specified, the new service will re-use the labels from the resource it exposes. - -Possible resources include (case insensitive):` + expose_resources - - expose_example = `# Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000. -kubectl expose rc nginx --port=80 --target-port=8000 - -# Create a service for a replication controller identified by type and name specified in "nginx-controller.yaml", which serves on port 80 and connects to the containers on port 8000. -kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000 - -# Create a service for a pod valid-pod, which serves on port 444 with the name "frontend" -kubectl expose pod valid-pod --port=444 --name=frontend - -# Create a second service based on the above service, exposing the container port 8443 as port 443 with the name "nginx-https" -kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https - -# Create a service for a replicated streaming application on port 4100 balancing UDP traffic and named 'video-stream'. -kubectl expose rc streamer --port=4100 --protocol=udp --name=video-stream - -# Create a service for a replicated nginx using replica set, which serves on port 80 and connects to the containers on port 8000. -kubectl expose rs nginx --port=80 --target-port=8000 - -# Create a service for an nginx deployment, which serves on port 80 and connects to the containers on port 8000. -kubectl expose deployment nginx --port=80 --target-port=8000` -) - -func NewCmdExposeService(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &ExposeOptions{} - - validArgs, argAliases := []string{}, []string{} - resources := regexp.MustCompile(`\s*,`).Split(expose_resources, -1) - for _, r := range resources { - validArgs = append(validArgs, strings.Fields(r)[0]) - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]", - Short: "Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service", - Long: expose_long, - Example: expose_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunExpose(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().String("generator", "service/v2", "The name of the API generator to use. There are 2 generators: 'service/v1' and 'service/v2'. The only difference between them is that service port in v1 is named 'default', while it is left unnamed in v2. Default is 'service/v2'.") - cmd.Flags().String("protocol", "TCP", "The network protocol for the service to be created. Default is 'tcp'.") - cmd.Flags().String("port", "", "The port that the service should serve on. Copied from the resource being exposed, if unspecified") - cmd.Flags().String("type", "", "Type for this service: ClusterIP, NodePort, or LoadBalancer. Default is 'ClusterIP'.") - // TODO: remove create-external-load-balancer in code on or after Aug 25, 2016. - cmd.Flags().Bool("create-external-load-balancer", false, "If true, create an external load balancer for this service (trumped by --type). Implementation is cloud provider dependent. Default is 'false'.") - cmd.Flags().MarkDeprecated("create-external-load-balancer", "use --type=\"LoadBalancer\" instead") - cmd.Flags().String("load-balancer-ip", "", "IP to assign to to the Load Balancer. If empty, an ephemeral IP will be created and used (cloud-provider specific).") - cmd.Flags().String("selector", "", "A label selector to use for this service. Only equality-based selector requirements are supported. If empty (the default) infer the selector from the replication controller or replica set.") - cmd.Flags().StringP("labels", "l", "", "Labels to apply to the service created by this call.") - cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without creating it.") - cmd.Flags().String("container-port", "", "Synonym for --target-port") - cmd.Flags().MarkDeprecated("container-port", "--container-port will be removed in the future, please use --target-port instead") - cmd.Flags().String("target-port", "", "Name or number for the port on the container that the service should direct traffic to. Optional.") - cmd.Flags().String("external-ip", "", "Additional external IP address (not managed by Kubernetes) to accept for the service. If this IP is routed to a node, the service can be accessed by this IP in addition to its generated service IP.") - cmd.Flags().String("overrides", "", "An inline JSON override for the generated object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field.") - cmd.Flags().String("name", "", "The name for the newly created object.") - cmd.Flags().String("session-affinity", "", "If non-empty, set the session affinity for the service to this; legal values: 'None', 'ClientIP'") - - usage := "Filename, directory, or URL to a file identifying the resource to expose a service" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - return cmd -} - -func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *ExposeOptions) error { - namespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(false) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(namespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(false, args...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - // Get the generator, setup and validate all required parameters - generatorName := cmdutil.GetFlagString(cmd, "generator") - generators := f.Generators("expose") - generator, found := generators[generatorName] - if !found { - return cmdutil.UsageError(cmd, fmt.Sprintf("generator %q not found.", generatorName)) - } - names := generator.ParamNames() - - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - mapping := info.ResourceMapping() - if err := f.CanBeExposed(mapping.GroupVersionKind.GroupKind()); err != nil { - return err - } - - params := kubectl.MakeParams(cmd, names) - name := info.Name - if len(name) > validation.DNS952LabelMaxLength { - name = name[:validation.DNS952LabelMaxLength] - } - params["default-name"] = name - - // For objects that need a pod selector, derive it from the exposed object in case a user - // didn't explicitly specify one via --selector - if s, found := params["selector"]; found && kubectl.IsZero(s) { - s, err := f.MapBasedSelectorForObject(info.Object) - if err != nil { - return cmdutil.UsageError(cmd, fmt.Sprintf("couldn't retrieve selectors via --selector flag or introspection: %s", err)) - } - params["selector"] = s - } - - // For objects that need a port, derive it from the exposed object in case a user - // didn't explicitly specify one via --port - if port, found := params["port"]; found && kubectl.IsZero(port) { - ports, err := f.PortsForObject(info.Object) - if err != nil { - return cmdutil.UsageError(cmd, fmt.Sprintf("couldn't find port via --port flag or introspection: %s", err)) - } - switch len(ports) { - case 0: - return cmdutil.UsageError(cmd, "couldn't find port via --port flag or introspection") - case 1: - params["port"] = ports[0] - default: - params["ports"] = strings.Join(ports, ",") - } - } - if kubectl.IsZero(params["labels"]) { - labels, err := f.LabelsForObject(info.Object) - if err != nil { - return err - } - params["labels"] = kubectl.MakeLabels(labels) - } - if err = kubectl.ValidateParams(names, params); err != nil { - return err - } - // Check for invalid flags used against the present generator. - if err := kubectl.EnsureFlagsValid(cmd, generators, generatorName); err != nil { - return err - } - - // Generate new object - object, err := generator.Generate(params) - if err != nil { - return err - } - - if inline := cmdutil.GetFlagString(cmd, "overrides"); len(inline) > 0 { - codec := runtime.NewCodec(f.JSONEncoder(), f.Decoder(true)) - object, err = cmdutil.Merge(codec, object, inline, mapping.GroupVersionKind.Kind) - if err != nil { - return err - } - } - - resourceMapper := &resource.Mapper{ - ObjectTyper: typer, - RESTMapper: mapper, - ClientMapper: resource.ClientMapperFunc(f.ClientForMapping), - Decoder: f.Decoder(true), - } - info, err = resourceMapper.InfoForObject(object, nil) - if err != nil { - return err - } - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(object, f.Command()); err != nil { - return err - } - } - info.Refresh(object, true) - // TODO: extract this flag to a central location, when such a location exists. - if cmdutil.GetFlagBool(cmd, "dry-run") { - return f.PrintObject(cmd, mapper, object, out) - } - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { - return err - } - - // Serialize the object with the annotation applied. - object, err = resource.NewHelper(info.Client, info.Mapping).Create(namespace, false, object) - if err != nil { - return err - } - - if len(cmdutil.GetFlagString(cmd, "output")) > 0 { - return f.PrintObject(cmd, mapper, object, out) - } - - cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, "exposed") - return nil - }) - if err != nil { - return err - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose_test.go deleted file mode 100644 index 6bad24357..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/expose_test.go +++ /dev/null @@ -1,351 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/kubectl" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestRunExposeService(t *testing.T) { - tests := []struct { - name string - args []string - ns string - calls map[string]string - input runtime.Object - flags map[string]string - output runtime.Object - expected string - status int - }{ - { - name: "expose-service-from-service-no-selector-defined", - args: []string{"service", "baz"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/baz", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"app": "go"}, - }, - }, - flags: map[string]string{"protocol": "UDP", "port": "14", "name": "foo", "labels": "svc=test"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "", Labels: map[string]string{"svc": "test"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolUDP, - Port: 14, - TargetPort: intstr.FromInt(14), - }, - }, - Selector: map[string]string{"app": "go"}, - }, - }, - expected: "service \"foo\" exposed", - status: 200, - }, - { - name: "expose-service-from-service", - args: []string{"service", "baz"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/baz", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"app": "go"}, - }, - }, - flags: map[string]string{"selector": "func=stream", "protocol": "UDP", "port": "14", "name": "foo", "labels": "svc=test"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "", Labels: map[string]string{"svc": "test"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolUDP, - Port: 14, - TargetPort: intstr.FromInt(14), - }, - }, - Selector: map[string]string{"func": "stream"}, - }, - }, - expected: "service \"foo\" exposed", - status: 200, - }, - { - name: "no-name-passed-from-the-cli", - args: []string{"service", "mayor"}, - ns: "default", - calls: map[string]string{ - "GET": "/namespaces/default/services/mayor", - "POST": "/namespaces/default/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "mayor", Namespace: "default", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"run": "this"}, - }, - }, - // No --name flag specified below. Service will use the rc's name passed via the 'default-name' parameter - flags: map[string]string{"selector": "run=this", "port": "80", "labels": "runas=amayor"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "mayor", Namespace: "", Labels: map[string]string{"runas": "amayor"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolTCP, - Port: 80, - TargetPort: intstr.FromInt(80), - }, - }, - Selector: map[string]string{"run": "this"}, - }, - }, - expected: "service \"mayor\" exposed", - status: 200, - }, - { - name: "expose-service", - args: []string{"service", "baz"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/baz", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"app": "go"}, - }, - }, - flags: map[string]string{"selector": "func=stream", "protocol": "UDP", "port": "14", "name": "foo", "labels": "svc=test", "type": "LoadBalancer", "dry-run": "true"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "", Labels: map[string]string{"svc": "test"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolUDP, - Port: 14, - TargetPort: intstr.FromInt(14), - }, - }, - Selector: map[string]string{"func": "stream"}, - Type: api.ServiceTypeLoadBalancer, - }, - }, - status: 200, - }, - { - name: "expose-affinity-service", - args: []string{"service", "baz"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/baz", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"app": "go"}, - }, - }, - flags: map[string]string{"selector": "func=stream", "protocol": "UDP", "port": "14", "name": "foo", "labels": "svc=test", "type": "LoadBalancer", "session-affinity": "ClientIP", "dry-run": "true"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "", Labels: map[string]string{"svc": "test"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolUDP, - Port: 14, - TargetPort: intstr.FromInt(14), - }, - }, - Selector: map[string]string{"func": "stream"}, - Type: api.ServiceTypeLoadBalancer, - SessionAffinity: api.ServiceAffinityClientIP, - }, - }, - status: 200, - }, - { - name: "expose-from-file", - args: []string{}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/redis-master", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "redis-master", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - Selector: map[string]string{"app": "go"}, - }, - }, - flags: map[string]string{"filename": "../../../examples/guestbook/redis-master-service.yaml", "selector": "func=stream", "protocol": "UDP", "port": "14", "name": "foo", "labels": "svc=test", "dry-run": "true"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Labels: map[string]string{"svc": "test"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolUDP, - Port: 14, - TargetPort: intstr.FromInt(14), - }, - }, - Selector: map[string]string{"func": "stream"}, - }, - }, - status: 200, - }, - { - name: "truncate-name", - args: []string{"pod", "a-name-that-is-toooo-big-for-a-service"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/pods/a-name-that-is-toooo-big-for-a-service", - "POST": "/namespaces/test/services", - }, - input: &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - }, - flags: map[string]string{"selector": "svc=frompod", "port": "90", "labels": "svc=frompod", "generator": "service/v2"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "a-name-that-is-toooo-big", Namespace: "", Labels: map[string]string{"svc": "frompod"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolTCP, - Port: 90, - TargetPort: intstr.FromInt(90), - }, - }, - Selector: map[string]string{"svc": "frompod"}, - }, - }, - expected: "service \"a-name-that-is-toooo-big\" exposed", - status: 200, - }, - { - name: "expose-multiport-object", - args: []string{"service", "foo"}, - ns: "test", - calls: map[string]string{ - "GET": "/namespaces/test/services/foo", - "POST": "/namespaces/test/services", - }, - input: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "", Labels: map[string]string{"svc": "multiport"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolTCP, - Port: 80, - TargetPort: intstr.FromInt(80), - }, - { - Protocol: api.ProtocolTCP, - Port: 443, - TargetPort: intstr.FromInt(443), - }, - }, - }, - }, - flags: map[string]string{"selector": "svc=fromfoo", "generator": "service/v2", "name": "fromfoo", "dry-run": "true"}, - output: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "fromfoo", Namespace: "", Labels: map[string]string{"svc": "multiport"}}, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Name: "port-1", - Protocol: api.ProtocolTCP, - Port: 80, - TargetPort: intstr.FromInt(80), - }, - { - Name: "port-2", - Protocol: api.ProtocolTCP, - Port: 443, - TargetPort: intstr.FromInt(443), - }, - }, - Selector: map[string]string{"svc": "fromfoo"}, - }, - }, - status: 200, - }, - } - - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Printer = &kubectl.JSONPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.calls[m] && m == "GET": - return &http.Response{StatusCode: test.status, Body: objBody(codec, test.input)}, nil - case p == test.calls[m] && m == "POST": - return &http.Response{StatusCode: test.status, Body: objBody(codec, test.output)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = test.ns - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdExposeService(f, buf) - cmd.SetOutput(buf) - for flag, value := range test.flags { - cmd.Flags().Set(flag, value) - } - cmd.Run(cmd, test.args) - - out := buf.String() - if _, ok := test.flags["dry-run"]; ok { - buf.Reset() - if err := tf.Printer.PrintObj(test.output, buf); err != nil { - t.Errorf("%s: Unexpected error: %v", test.name, err) - continue - } - - test.expected = buf.String() - } - - if !strings.Contains(out, test.expected) { - t.Errorf("%s: Unexpected output! Expected\n%s\ngot\n%s", test.name, test.expected, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get.go deleted file mode 100644 index 286cdf277..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get.go +++ /dev/null @@ -1,325 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - "k8s.io/kubernetes/pkg/watch" -) - -// GetOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type GetOptions struct { - Filenames []string - Recursive bool -} - -const ( - get_long = `Display one or many resources. - -` + kubectl.PossibleResourceTypes + ` - -By specifying the output as 'template' and providing a Go template as the value -of the --template flag, you can filter the attributes of the fetched resource(s).` - get_example = `# List all pods in ps output format. -kubectl get pods - -# List all pods in ps output format with more information (such as node name). -kubectl get pods -o wide - -# List a single replication controller with specified NAME in ps output format. -kubectl get replicationcontroller web - -# List a single pod in JSON output format. -kubectl get -o json pod web-pod-13je7 - -# List a pod identified by type and name specified in "pod.yaml" in JSON output format. -kubectl get -f pod.yaml -o json - -# Return only the phase value of the specified pod. -kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}} - -# List all replication controllers and services together in ps output format. -kubectl get rc,services - -# List one or more resources by their type and names. -kubectl get rc/web service/frontend pods/web-pod-13je7` -) - -// NewCmdGet creates a command object for the generic "get" action, which -// retrieves one or more resources from a server. -func NewCmdGet(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &GetOptions{} - - // retrieve a list of handled resources from printer as valid args - validArgs, argAliases := []string{}, []string{} - p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) - cmdutil.CheckErr(err) - if p != nil { - validArgs = p.HandledResources() - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags]", - Short: "Display one or many resources", - Long: get_long, - Example: get_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunGet(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") - cmd.Flags().BoolP("watch", "w", false, "After listing/getting the requested object, watch for changes.") - cmd.Flags().Bool("watch-only", false, "Watch for changes to the requested object(s), without listing/getting first.") - cmd.Flags().Bool("all-namespaces", false, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.") - cmd.Flags().StringSliceP("label-columns", "L", []string{}, "Accepts a comma separated list of labels that are going to be presented as columns. Names are case-sensitive. You can also use multiple flag statements like -L label1 -L label2...") - cmd.Flags().Bool("export", false, "If true, use 'export' for the resources. Exported resources are stripped of cluster-specific information.") - usage := "Filename, directory, or URL to a file identifying the resource to get from a server." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -// RunGet implements the generic Get command -// TODO: convert all direct flag accessors to a struct and pass that instead of cmd -func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *GetOptions) error { - selector := cmdutil.GetFlagString(cmd, "selector") - allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces") - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - if allNamespaces { - enforceNamespace = false - } - - if len(args) == 0 && len(options.Filenames) == 0 { - fmt.Fprint(out, "You must specify the type of resource to get. ", valid_resources) - return cmdutil.UsageError(cmd, "Required resource not specified.") - } - - // always show resources when getting by name or filename - argsHasNames, err := resource.HasNames(args) - if err != nil { - return err - } - if len(options.Filenames) > 0 || argsHasNames { - cmd.Flag("show-all").Value.Set("true") - } - export := cmdutil.GetFlagBool(cmd, "export") - - // handle watch separately since we cannot watch multiple resource types - isWatch, isWatchOnly := cmdutil.GetFlagBool(cmd, "watch"), cmdutil.GetFlagBool(cmd, "watch-only") - if isWatch || isWatchOnly { - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(selector). - ExportParam(export). - ResourceTypeOrNameArgs(true, args...). - SingleResourceType(). - Latest(). - Do() - err := r.Err() - if err != nil { - return err - } - infos, err := r.Infos() - if err != nil { - return err - } - if len(infos) != 1 { - return fmt.Errorf("watch is only supported on individual resources and resource collections - %d resources were found", len(infos)) - } - info := infos[0] - mapping := info.ResourceMapping() - printer, err := f.PrinterForMapping(cmd, mapping, allNamespaces) - if err != nil { - return err - } - - obj, err := r.Object() - if err != nil { - return err - } - rv, err := mapping.MetadataAccessor.ResourceVersion(obj) - if err != nil { - return err - } - - // print the current object - if !isWatchOnly { - if err := printer.PrintObj(obj, out); err != nil { - return fmt.Errorf("unable to output the provided object: %v", err) - } - } - - // print watched changes - w, err := r.Watch(rv) - if err != nil { - return err - } - - kubectl.WatchLoop(w, func(e watch.Event) error { - return printer.PrintObj(e.Object, out) - }) - return nil - } - - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(selector). - ExportParam(export). - ResourceTypeOrNameArgs(true, args...). - ContinueOnError(). - Latest(). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - printer, generic, err := cmdutil.PrinterForCommand(cmd) - if err != nil { - return err - } - - infos := []*resource.Info{} - allErrs := []error{} - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - infos = append(infos, info) - return nil - }) - if err != nil { - allErrs = append(allErrs, err) - } - - if generic { - clientConfig, err := f.ClientConfig() - if err != nil { - return err - } - - singular := false - r.IntoSingular(&singular) - - // the outermost object will be converted to the output-version, but inner - // objects can use their mappings - version, err := cmdutil.OutputVersion(cmd, clientConfig.GroupVersion) - if err != nil { - return err - } - obj, err := resource.AsVersionedObject(infos, !singular, version.String(), f.JSONEncoder()) - if err != nil { - return err - } - - return printer.PrintObj(obj, out) - } - - objs := make([]runtime.Object, len(infos)) - for ix := range infos { - objs[ix] = infos[ix].Object - } - - sorting, err := cmd.Flags().GetString("sort-by") - var sorter *kubectl.RuntimeSort - if err == nil && len(sorting) > 0 && len(objs) > 1 { - clientConfig, err := f.ClientConfig() - if err != nil { - return err - } - - version, err := cmdutil.OutputVersion(cmd, clientConfig.GroupVersion) - if err != nil { - return err - } - - for ix := range infos { - objs[ix], err = infos[ix].Mapping.ConvertToVersion(infos[ix].Object, version.String()) - if err != nil { - allErrs = append(allErrs, err) - continue - } - } - - // TODO: questionable - if sorter, err = kubectl.SortObjects(f.Decoder(true), objs, sorting); err != nil { - return err - } - } - - // use the default printer for each object - printer = nil - var lastMapping *meta.RESTMapping - w := kubectl.GetNewTabWriter(out) - defer w.Flush() - - for ix := range objs { - var mapping *meta.RESTMapping - var original runtime.Object - if sorter != nil { - mapping = infos[sorter.OriginalPosition(ix)].Mapping - original = infos[sorter.OriginalPosition(ix)].Object - } else { - mapping = infos[ix].Mapping - original = infos[ix].Object - } - if printer == nil || lastMapping == nil || mapping == nil || mapping.Resource != lastMapping.Resource { - printer, err = f.PrinterForMapping(cmd, mapping, allNamespaces) - if err != nil { - allErrs = append(allErrs, err) - continue - } - lastMapping = mapping - } - if _, found := printer.(*kubectl.HumanReadablePrinter); found { - if err := printer.PrintObj(original, w); err != nil { - allErrs = append(allErrs, err) - } - continue - } - if err := printer.PrintObj(original, w); err != nil { - allErrs = append(allErrs, err) - continue - } - } - return utilerrors.NewAggregate(allErrs) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get_test.go deleted file mode 100644 index 8b0981233..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/get_test.go +++ /dev/null @@ -1,869 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - encjson "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/runtime/serializer/json" - "k8s.io/kubernetes/pkg/runtime/serializer/streaming" - "k8s.io/kubernetes/pkg/util/diff" - "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/pkg/watch/versioned" -) - -func testData() (*api.PodList, *api.ServiceList, *api.ReplicationControllerList) { - pods := &api.PodList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "15", - }, - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - svc := &api.ServiceList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "16", - }, - Items: []api.Service{ - { - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.ServiceSpec{ - SessionAffinity: "None", - Type: api.ServiceTypeClusterIP, - }, - }, - }, - } - rc := &api.ReplicationControllerList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "17", - }, - Items: []api.ReplicationController{ - { - ObjectMeta: api.ObjectMeta{Name: "rc1", Namespace: "test", ResourceVersion: "18"}, - Spec: api.ReplicationControllerSpec{ - Replicas: 1, - }, - }, - }, - } - return pods, svc, rc -} - -func testComponentStatusData() *api.ComponentStatusList { - good := api.ComponentStatus{ - Conditions: []api.ComponentCondition{ - {Type: api.ComponentHealthy, Status: api.ConditionTrue, Message: "ok"}, - }, - ObjectMeta: api.ObjectMeta{Name: "servergood"}, - } - - bad := api.ComponentStatus{ - Conditions: []api.ComponentCondition{ - {Type: api.ComponentHealthy, Status: api.ConditionFalse, Message: "", Error: "bad status: 500"}, - }, - ObjectMeta: api.ObjectMeta{Name: "serverbad"}, - } - - unknown := api.ComponentStatus{ - Conditions: []api.ComponentCondition{ - {Type: api.ComponentHealthy, Status: api.ConditionUnknown, Message: "", Error: "fizzbuzz error"}, - }, - ObjectMeta: api.ObjectMeta{Name: "serverunknown"}, - } - - return &api.ComponentStatusList{ - Items: []api.ComponentStatus{good, bad, unknown}, - } -} - -// Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. -func TestGetUnknownSchemaObject(t *testing.T) { - f, tf, codec := NewTestFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &internalType{Name: "foo"})}, - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"type", "foo"}) - - expected := &internalType{Name: "foo"} - actual := tf.Printer.(*testPrinter).Objects[0] - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if buf.String() != fmt.Sprintf("%#v", expected) { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -// Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. -// Because api.List is part of the Kube API, resource.Builder has to perform a conversion on -// api.Scheme, which may not have access to all objects, and not all objects are at the same -// internal versioning scheme. This test verifies that two isolated schemes (Test, and api.Scheme) -// can be conjoined into a single output object. -// -// The expected behavior of the `kubectl get` command is: -// 1. objects using unrecognized schemes will always be returned using that scheme/version, "unlikelyversion" in this test; -// 2. if the specified output-version is a recognized, valid Scheme, then the list should use that scheme, and otherwise it will default to the client version, testapi.Default.GroupVersion().String() in this test; -// 3a. if the specified output-version is a recognized, valid Scheme, in which the requested object (replicationcontroller) can be represented, then the object should be returned using that version; -// 3b. otherwise if the specified output-version is unrecognized, but the requested object (replicationcontroller) is recognized by the client's codec, then it will be converted to the client version, testapi.Default.GroupVersion().String() in this test. -func TestGetUnknownSchemaObjectListGeneric(t *testing.T) { - testCases := map[string]struct { - outputVersion string - listVersion string - testtypeVersion string - rcVersion string - }{ - "handles specific version": { - outputVersion: testapi.Default.GroupVersion().String(), - listVersion: testapi.Default.GroupVersion().String(), - testtypeVersion: unlikelyGV.String(), - rcVersion: testapi.Default.GroupVersion().String(), - }, - "handles second specific version": { - outputVersion: "unlikely.group/unlikelyversion", - listVersion: testapi.Default.GroupVersion().String(), - testtypeVersion: unlikelyGV.String(), - rcVersion: testapi.Default.GroupVersion().String(), // see expected behavior 3b - }, - "handles common version": { - outputVersion: testapi.Default.GroupVersion().String(), - listVersion: testapi.Default.GroupVersion().String(), - testtypeVersion: unlikelyGV.String(), - rcVersion: testapi.Default.GroupVersion().String(), - }, - } - for k, test := range testCases { - apiCodec := testapi.Default.Codec() - regularClient := &fake.RESTClient{ - Codec: apiCodec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - return &http.Response{StatusCode: 200, Body: objBody(apiCodec, &api.ReplicationController{ObjectMeta: api.ObjectMeta{Name: "foo"}})}, nil - }), - } - - f, tf, codec := NewMixedFactory(regularClient) - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - return &http.Response{StatusCode: 200, Body: objBody(codec, &internalType{Name: "foo"})}, nil - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Flags().Set("output", "json") - - cmd.Flags().Set("output-version", test.outputVersion) - err := RunGet(f, buf, cmd, []string{"type/foo", "replicationcontrollers/foo"}, &GetOptions{}) - if err != nil { - t.Errorf("%s: unexpected error: %v", k, err) - continue - } - out := make(map[string]interface{}) - if err := encjson.Unmarshal(buf.Bytes(), &out); err != nil { - t.Errorf("%s: unexpected error: %v\n%s", k, err, buf.String()) - continue - } - if out["apiVersion"] != test.listVersion { - t.Errorf("%s: unexpected list: %#v", k, out) - } - arr := out["items"].([]interface{}) - if arr[0].(map[string]interface{})["apiVersion"] != test.testtypeVersion { - t.Errorf("%s: unexpected list: %#v", k, out) - } - if arr[1].(map[string]interface{})["apiVersion"] != test.rcVersion { - t.Errorf("%s: unexpected list: %#v", k, out) - } - } -} - -// Verifies that schemas that are not in the master tree of Kubernetes can be retrieved via Get. -func TestGetSchemaObject(t *testing.T) { - f, tf, _ := NewTestFactory() - tf.Mapper = testapi.Default.RESTMapper() - tf.Typer = api.Scheme - codec := testapi.Default.Codec() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &api.ReplicationController{ObjectMeta: api.ObjectMeta{Name: "foo"}})}, - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.Run(cmd, []string{"replicationcontrollers", "foo"}) - - if !strings.Contains(buf.String(), "\"foo\"") { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestGetObjects(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"pods", "foo"}) - - expected := []runtime.Object{&pods.Items[0]} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetSortedObjects(t *testing.T) { - pods := &api.PodList{ - ListMeta: unversioned.ListMeta{ - ResourceVersion: "15", - }, - Items: []api.Pod{ - { - ObjectMeta: api.ObjectMeta{Name: "c", Namespace: "test", ResourceVersion: "10"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "b", Namespace: "test", ResourceVersion: "11"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - { - ObjectMeta: api.ObjectMeta{Name: "a", Namespace: "test", ResourceVersion: "9"}, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: "v1"}}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - // sorting with metedata.name - cmd.Flags().Set("sort-by", ".metadata.name") - cmd.Run(cmd, []string{"pods"}) - - // expect sorted: a,b,c - expected := []runtime.Object{&pods.Items[2], &pods.Items[1], &pods.Items[0]} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } - -} - -func TestGetObjectsIdentifiedByFile(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Flags().Set("filename", "../../../examples/cassandra/cassandra-controller.yaml") - cmd.Run(cmd, []string{}) - - expected := []runtime.Object{&pods.Items[0]} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetListObjects(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"pods"}) - - expected, err := extractResourceList([]runtime.Object{pods}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: expected %#v, got %#v", expected, actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func extractResourceList(objs []runtime.Object) ([]runtime.Object, error) { - finalObjs := []runtime.Object{} - for _, obj := range objs { - items, err := meta.ExtractList(obj) - if err != nil { - return nil, err - } - for _, item := range items { - finalObjs = append(finalObjs, item) - } - } - return finalObjs, nil -} - -func TestGetAllListObjects(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Flags().Set("show-all", "true") - cmd.Run(cmd, []string{"pods"}) - - expected, err := extractResourceList([]runtime.Object{pods}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v %#v", expected, actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetListComponentStatus(t *testing.T) { - statuses := testComponentStatusData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, statuses)}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"componentstatuses"}) - - expected, err := extractResourceList([]runtime.Object{statuses}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: expected %#v, got %#v", expected, actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetMultipleTypeObjects(t *testing.T) { - pods, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - case "/namespaces/test/services": - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"pods,services"}) - - expected, err := extractResourceList([]runtime.Object{pods, svc}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetMultipleTypeObjectsAsList(t *testing.T) { - pods, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - case "/namespaces/test/services": - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("output", "json") - cmd.Run(cmd, []string{"pods,services"}) - - if tf.Printer.(*testPrinter).Objects != nil { - t.Errorf("unexpected print to default printer") - } - - out, err := runtime.Decode(codec, buf.Bytes()) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - list, err := meta.ExtractList(out) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if errs := runtime.DecodeList(list, codec); len(errs) > 0 { - t.Fatalf("unexpected error: %v", errs) - } - if err := meta.SetList(out, list); err != nil { - t.Fatalf("unexpected error: %v", err) - } - - expected := &api.List{ - Items: []runtime.Object{ - &pods.Items[0], - &pods.Items[1], - &svc.Items[0], - }, - } - if !reflect.DeepEqual(expected, out) { - t.Errorf("unexpected output: %#v", out) - } -} - -func TestGetMultipleTypeObjectsWithSelector(t *testing.T) { - pods, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - if req.URL.Query().Get(unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String())) != "a=b" { - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - } - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - case "/namespaces/test/services": - return &http.Response{StatusCode: 200, Body: objBody(codec, svc)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("selector", "a=b") - cmd.Run(cmd, []string{"pods,services"}) - - expected, err := extractResourceList([]runtime.Object{pods, svc}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetMultipleTypeObjectsWithDirectReference(t *testing.T) { - _, svc, _ := testData() - node := &api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.NodeSpec{ - ExternalID: "ext", - }, - } - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/nodes/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, node)}, nil - case "/namespaces/test/services/bar": - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Run(cmd, []string{"services/bar", "node/foo"}) - - expected := []runtime.Object{&svc.Items[0], node} - actual := tf.Printer.(*testPrinter).Objects - if !api.Semantic.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %s", diff.ObjectDiff(expected, actual)) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestGetByNameForcesFlag(t *testing.T) { - pods, _, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Resp: &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - cmd.Run(cmd, []string{"pods", "foo"}) - - showAllFlag, _ := cmd.Flags().GetBool("show-all") - if !showAllFlag { - t.Errorf("expected showAll to be true when getting resource by name") - } -} - -func watchTestData() ([]api.Pod, []watch.Event) { - pods := []api.Pod{ - { - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "test", - ResourceVersion: "10", - }, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - } - events := []watch.Event{ - { - Type: watch.Modified, - Object: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "test", - ResourceVersion: "11", - }, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - { - Type: watch.Deleted, - Object: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Namespace: "test", - ResourceVersion: "12", - }, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - } - return pods, events -} - -func TestWatchSelector(t *testing.T) { - pods, events := watchTestData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - if req.URL.Query().Get(unversioned.LabelSelectorQueryParam(testapi.Default.GroupVersion().String())) != "a=b" { - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - } - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, &api.PodList{Items: pods})}, nil - case "/watch/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: watchBody(codec, events)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("watch", "true") - cmd.Flags().Set("selector", "a=b") - cmd.Run(cmd, []string{"pods"}) - - expected := []runtime.Object{&api.PodList{Items: pods}, events[0].Object, events[1].Object} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object:\nExpected: %#v\n\nGot: %#v\n\n", expected[0], actual[0]) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestWatchResource(t *testing.T) { - pods, events := watchTestData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods[0])}, nil - case "/watch/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: watchBody(codec, events)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("watch", "true") - cmd.Run(cmd, []string{"pods", "foo"}) - - expected := []runtime.Object{&pods[0], events[0].Object, events[1].Object} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object:\nExpected: %#v\n\nGot: %#v\n\n", expected, actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestWatchResourceIdentifiedByFile(t *testing.T) { - pods, events := watchTestData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods[0])}, nil - case "/watch/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: watchBody(codec, events)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("watch", "true") - cmd.Flags().Set("filename", "../../../examples/cassandra/cassandra-controller.yaml") - cmd.Run(cmd, []string{}) - - expected := []runtime.Object{&pods[0], events[0].Object, events[1].Object} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("expected object: %#v unexpected object: %#v", expected, actual) - } - - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func TestWatchOnlyResource(t *testing.T) { - pods, events := watchTestData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods[0])}, nil - case "/watch/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: watchBody(codec, events)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdGet(f, buf) - cmd.SetOutput(buf) - - cmd.Flags().Set("watch-only", "true") - cmd.Run(cmd, []string{"pods", "foo"}) - - expected := []runtime.Object{events[0].Object, events[1].Object} - actual := tf.Printer.(*testPrinter).Objects - if !reflect.DeepEqual(expected, actual) { - t.Errorf("unexpected object: %#v", actual) - } - if len(buf.String()) == 0 { - t.Errorf("unexpected empty output") - } -} - -func watchBody(codec runtime.Codec, events []watch.Event) io.ReadCloser { - buf := bytes.NewBuffer([]byte{}) - enc := versioned.NewEncoder(streaming.NewEncoder(buf, codec), codec) - for i := range events { - enc.Encode(&events[i]) - } - return json.Framer.NewFrameReader(ioutil.NopCloser(buf)) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label.go deleted file mode 100644 index b6a28d088..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label.go +++ /dev/null @@ -1,312 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "encoding/json" - "fmt" - "io" - "reflect" - "strings" - - "github.com/golang/glog" - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - utilerrors "k8s.io/kubernetes/pkg/util/errors" - "k8s.io/kubernetes/pkg/util/strategicpatch" - "k8s.io/kubernetes/pkg/util/validation" -) - -// LabelOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type LabelOptions struct { - Filenames []string - Recursive bool -} - -const ( - label_long = `Update the labels on a resource. - -A label must begin with a letter or number, and may contain letters, numbers, hyphens, dots, and underscores, up to %[1]d characters. -If --overwrite is true, then existing labels can be overwritten, otherwise attempting to overwrite a label will result in an error. -If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used.` - label_example = `# Update pod 'foo' with the label 'unhealthy' and the value 'true'. -kubectl label pods foo unhealthy=true - -# Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value. -kubectl label --overwrite pods foo status=unhealthy - -# Update all pods in the namespace -kubectl label pods --all status=unhealthy - -# Update a pod identified by the type and name in "pod.json" -kubectl label -f pod.json status=unhealthy - -# Update pod 'foo' only if the resource is unchanged from version 1. -kubectl label pods foo status=unhealthy --resource-version=1 - -# Update pod 'foo' by removing a label named 'bar' if it exists. -# Does not require the --overwrite flag. -kubectl label pods foo bar-` -) - -func NewCmdLabel(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &LabelOptions{} - - // retrieve a list of handled resources from printer as valid args - validArgs, argAliases := []string{}, []string{} - p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) - cmdutil.CheckErr(err) - if p != nil { - validArgs = p.HandledResources() - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]", - Short: "Update the labels on a resource", - Long: fmt.Sprintf(label_long, validation.LabelValueMaxLength), - Example: label_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunLabel(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - cmdutil.AddPrinterFlags(cmd) - cmd.Flags().Bool("overwrite", false, "If true, allow labels to be overwritten, otherwise reject label updates that overwrite existing labels.") - cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on") - cmd.Flags().Bool("all", false, "select all resources in the namespace of the specified resource types") - cmd.Flags().String("resource-version", "", "If non-empty, the labels update will only succeed if this is the current resource-version for the object. Only valid when specifying a single resource.") - usage := "Filename, directory, or URL to a file identifying the resource to update the labels" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without sending it.") - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - return cmd -} - -func validateNoOverwrites(accessor meta.Object, labels map[string]string) error { - allErrs := []error{} - for key := range labels { - if value, found := accessor.GetLabels()[key]; found { - allErrs = append(allErrs, fmt.Errorf("'%s' already has a value (%s), and --overwrite is false", key, value)) - } - } - return utilerrors.NewAggregate(allErrs) -} - -func parseLabels(spec []string) (map[string]string, []string, error) { - labels := map[string]string{} - var remove []string - for _, labelSpec := range spec { - if strings.Index(labelSpec, "=") != -1 { - parts := strings.Split(labelSpec, "=") - if len(parts) != 2 || len(parts[1]) == 0 || !validation.IsValidLabelValue(parts[1]) { - return nil, nil, fmt.Errorf("invalid label spec: %v", labelSpec) - } - labels[parts[0]] = parts[1] - } else if strings.HasSuffix(labelSpec, "-") { - remove = append(remove, labelSpec[:len(labelSpec)-1]) - } else { - return nil, nil, fmt.Errorf("unknown label spec: %v", labelSpec) - } - } - for _, removeLabel := range remove { - if _, found := labels[removeLabel]; found { - return nil, nil, fmt.Errorf("can not both modify and remove a label in the same command") - } - } - return labels, remove, nil -} - -func labelFunc(obj runtime.Object, overwrite bool, resourceVersion string, labels map[string]string, remove []string) error { - accessor, err := meta.Accessor(obj) - if err != nil { - return err - } - if !overwrite { - if err := validateNoOverwrites(accessor, labels); err != nil { - return err - } - } - - objLabels := accessor.GetLabels() - if objLabels == nil { - objLabels = make(map[string]string) - } - - for key, value := range labels { - objLabels[key] = value - } - for _, label := range remove { - delete(objLabels, label) - } - accessor.SetLabels(objLabels) - - if len(resourceVersion) != 0 { - accessor.SetResourceVersion(resourceVersion) - } - return nil -} - -func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *LabelOptions) error { - resources, labelArgs := []string{}, []string{} - first := true - for _, s := range args { - isLabel := strings.Contains(s, "=") || strings.HasSuffix(s, "-") - switch { - case first && isLabel: - first = false - fallthrough - case !first && isLabel: - labelArgs = append(labelArgs, s) - case first && !isLabel: - resources = append(resources, s) - case !first && !isLabel: - return cmdutil.UsageError(cmd, "all resources must be specified before label changes: %s", s) - } - } - if len(resources) < 1 && len(options.Filenames) == 0 { - return cmdutil.UsageError(cmd, "one or more resources must be specified as or /") - } - if len(labelArgs) < 1 { - return cmdutil.UsageError(cmd, "at least one label update is required") - } - - selector := cmdutil.GetFlagString(cmd, "selector") - all := cmdutil.GetFlagBool(cmd, "all") - overwrite := cmdutil.GetFlagBool(cmd, "overwrite") - resourceVersion := cmdutil.GetFlagString(cmd, "resource-version") - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - lbls, remove, err := parseLabels(labelArgs) - if err != nil { - return cmdutil.UsageError(cmd, err.Error()) - } - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - b := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(selector). - ResourceTypeOrNameArgs(all, resources...). - Flatten(). - Latest() - - one := false - r := b.Do().IntoSingular(&one) - if err := r.Err(); err != nil { - return err - } - - // only apply resource version locking on a single resource - if !one && len(resourceVersion) > 0 { - return cmdutil.UsageError(cmd, "--resource-version may only be used with a single resource") - } - - // TODO: support bulk generic output a la Get - return r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - var outputObj runtime.Object - dataChangeMsg := "not labeled" - if cmdutil.GetFlagBool(cmd, "dry-run") { - err = labelFunc(info.Object, overwrite, resourceVersion, lbls, remove) - if err != nil { - return err - } - outputObj = info.Object - } else { - obj, err := info.Mapping.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupVersion().String()) - if err != nil { - return err - } - name, namespace := info.Name, info.Namespace - oldData, err := json.Marshal(obj) - if err != nil { - return err - } - accessor, err := meta.Accessor(obj) - if err != nil { - return err - } - for _, label := range remove { - if _, ok := accessor.GetLabels()[label]; !ok { - fmt.Fprintf(out, "label %q not found.\n", label) - } - } - - if err := labelFunc(obj, overwrite, resourceVersion, lbls, remove); err != nil { - return err - } - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(obj, f.Command()); err != nil { - return err - } - } - newData, err := json.Marshal(obj) - if err != nil { - return err - } - if !reflect.DeepEqual(oldData, newData) { - dataChangeMsg = "labeled" - } - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) - createdPatch := err == nil - if err != nil { - glog.V(2).Infof("couldn't compute patch: %v", err) - } - - mapping := info.ResourceMapping() - client, err := f.ClientForMapping(mapping) - if err != nil { - return err - } - helper := resource.NewHelper(client, mapping) - - if createdPatch { - outputObj, err = helper.Patch(namespace, name, api.StrategicMergePatchType, patchBytes) - } else { - outputObj, err = helper.Replace(namespace, name, false, obj) - } - if err != nil { - return err - } - } - outputFormat := cmdutil.GetFlagString(cmd, "output") - if outputFormat != "" { - return f.PrintObject(cmd, mapper, outputObj, out) - } - cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, dataChangeMsg) - return nil - }) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label_test.go deleted file mode 100644 index 5c5f4d24f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/label_test.go +++ /dev/null @@ -1,418 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "reflect" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestValidateLabels(t *testing.T) { - tests := []struct { - meta *api.ObjectMeta - labels map[string]string - expectErr bool - test string - }{ - { - meta: &api.ObjectMeta{ - Labels: map[string]string{ - "a": "b", - "c": "d", - }, - }, - labels: map[string]string{ - "a": "c", - "d": "b", - }, - test: "one shared", - expectErr: true, - }, - { - meta: &api.ObjectMeta{ - Labels: map[string]string{ - "a": "b", - "c": "d", - }, - }, - labels: map[string]string{ - "b": "d", - "c": "a", - }, - test: "second shared", - expectErr: true, - }, - { - meta: &api.ObjectMeta{ - Labels: map[string]string{ - "a": "b", - "c": "d", - }, - }, - labels: map[string]string{ - "b": "a", - "d": "c", - }, - test: "no overlap", - }, - { - meta: &api.ObjectMeta{}, - labels: map[string]string{ - "b": "a", - "d": "c", - }, - test: "no labels", - }, - } - for _, test := range tests { - err := validateNoOverwrites(test.meta, test.labels) - if test.expectErr && err == nil { - t.Errorf("%s: unexpected non-error", test.test) - } - if !test.expectErr && err != nil { - t.Errorf("%s: unexpected error: %v", test.test, err) - } - } -} - -func TestParseLabels(t *testing.T) { - tests := []struct { - labels []string - expected map[string]string - expectedRemove []string - expectErr bool - }{ - { - labels: []string{"a=b", "c=d"}, - expected: map[string]string{"a": "b", "c": "d"}, - }, - { - labels: []string{}, - expected: map[string]string{}, - }, - { - labels: []string{"a=b", "c=d", "e-"}, - expected: map[string]string{"a": "b", "c": "d"}, - expectedRemove: []string{"e"}, - }, - { - labels: []string{"ab", "c=d"}, - expectErr: true, - }, - { - labels: []string{"a=b", "c=d", "a-"}, - expectErr: true, - }, - { - labels: []string{"a="}, - expectErr: true, - }, - { - labels: []string{"a=%^$"}, - expectErr: true, - }, - } - for _, test := range tests { - labels, remove, err := parseLabels(test.labels) - if test.expectErr && err == nil { - t.Errorf("unexpected non-error: %v", test) - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v %v", err, test) - } - if !reflect.DeepEqual(labels, test.expected) { - t.Errorf("expected: %v, got %v", test.expected, labels) - } - if !reflect.DeepEqual(remove, test.expectedRemove) { - t.Errorf("expected: %v, got %v", test.expectedRemove, remove) - } - } -} - -func TestLabelFunc(t *testing.T) { - tests := []struct { - obj runtime.Object - overwrite bool - version string - labels map[string]string - remove []string - expected runtime.Object - expectErr bool - }{ - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - labels: map[string]string{"a": "b"}, - expectErr: true, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - labels: map[string]string{"a": "c"}, - overwrite: true, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "c"}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - labels: map[string]string{"c": "d"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b", "c": "d"}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - labels: map[string]string{"c": "d"}, - version: "2", - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b", "c": "d"}, - ResourceVersion: "2", - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - labels: map[string]string{}, - remove: []string{"a"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{}, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b", "c": "d"}, - }, - }, - labels: map[string]string{"e": "f"}, - remove: []string{"a"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{ - "c": "d", - "e": "f", - }, - }, - }, - }, - { - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{}, - }, - labels: map[string]string{"a": "b"}, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Labels: map[string]string{"a": "b"}, - }, - }, - }, - } - for _, test := range tests { - err := labelFunc(test.obj, test.overwrite, test.version, test.labels, test.remove) - if test.expectErr { - if err == nil { - t.Errorf("unexpected non-error: %v", test) - } - continue - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v %v", err, test) - } - if !reflect.DeepEqual(test.obj, test.expected) { - t.Errorf("expected: %v, got %v", test.expected, test.obj) - } - } -} - -func TestLabelErrors(t *testing.T) { - testCases := map[string]struct { - args []string - flags map[string]string - errFn func(error) bool - }{ - "no args": { - args: []string{}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - "not enough labels": { - args: []string{"pods"}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "at least one label update is required") }, - }, - "no resources": { - args: []string{"pods-"}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - "no resources 2": { - args: []string{"pods=bar"}, - errFn: func(err error) bool { return strings.Contains(err.Error(), "one or more resources must be specified") }, - }, - } - - for k, testCase := range testCases { - f, tf, _ := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdLabel(f, buf) - cmd.SetOutput(buf) - - for k, v := range testCase.flags { - cmd.Flags().Set(k, v) - } - err := RunLabel(f, buf, cmd, testCase.args, &LabelOptions{}) - if !testCase.errFn(err) { - t.Errorf("%s: unexpected error: %v", k, err) - continue - } - if tf.Printer.(*testPrinter).Objects != nil { - t.Errorf("unexpected print to default printer") - } - if buf.Len() > 0 { - t.Errorf("buffer should be empty: %s", string(buf.Bytes())) - } - } -} - -func TestLabelForResourceFromFile(t *testing.T) { - pods, _, _ := testData() - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.Method { - case "GET": - switch req.URL.Path { - case "/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - case "PATCH": - switch req.URL.Path { - case "/namespaces/test/replicationcontrollers/cassandra": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - default: - t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdLabel(f, buf) - options := &LabelOptions{ - Filenames: []string{"../../../examples/cassandra/cassandra-controller.yaml"}, - } - - err := RunLabel(f, buf, cmd, []string{"a=b"}, options) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(buf.String(), "labeled") { - t.Errorf("did not set labels: %s", buf.String()) - } -} - -func TestLabelMultipleObjects(t *testing.T) { - pods, _, _ := testData() - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch req.Method { - case "GET": - switch req.URL.Path { - case "/namespaces/test/pods": - return &http.Response{StatusCode: 200, Body: objBody(codec, pods)}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - case "PATCH": - switch req.URL.Path { - case "/namespaces/test/pods/foo": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[0])}, nil - case "/namespaces/test/pods/bar": - return &http.Response{StatusCode: 200, Body: objBody(codec, &pods.Items[1])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - default: - t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - - buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdLabel(f, buf) - cmd.Flags().Set("all", "true") - - if err := RunLabel(f, buf, cmd, []string{"pods", "a=b"}, &LabelOptions{}); err != nil { - t.Fatalf("unexpected error: %v", err) - } - if strings.Count(buf.String(), "labeled") != len(pods.Items) { - t.Errorf("not all labels are set: %s", buf.String()) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs.go deleted file mode 100644 index b79d8c07d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs.go +++ /dev/null @@ -1,208 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "errors" - "io" - "math" - "os" - "time" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/client/restclient" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" -) - -const ( - logs_example = `# Return snapshot logs from pod nginx with only one container -kubectl logs nginx - -# Return snapshot of previous terminated ruby container logs from pod web-1 -kubectl logs -p -c ruby web-1 - -# Begin streaming the logs of the ruby container in pod web-1 -kubectl logs -f -c ruby web-1 - -# Display only the most recent 20 lines of output in pod nginx -kubectl logs --tail=20 nginx - -# Show all logs from pod nginx written in the last hour -kubectl logs --since=1h nginx` -) - -type LogsOptions struct { - Namespace string - ResourceArg string - Options runtime.Object - - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - ClientMapper resource.ClientMapper - Decoder runtime.Decoder - - Object runtime.Object - LogsForObject func(object, options runtime.Object) (*restclient.Request, error) - - Out io.Writer -} - -// NewCmdLog creates a new pod logs command -func NewCmdLogs(f *cmdutil.Factory, out io.Writer) *cobra.Command { - o := &LogsOptions{} - cmd := &cobra.Command{ - Use: "logs [-f] [-p] POD [-c CONTAINER]", - Short: "Print the logs for a container in a pod.", - Long: "Print the logs for a container in a pod. If the pod has only one container, the container name is optional.", - Example: logs_example, - PreRun: func(cmd *cobra.Command, args []string) { - if len(os.Args) > 1 && os.Args[1] == "log" { - printDeprecationWarning("logs", "log") - } - }, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(o.Complete(f, out, cmd, args)) - if err := o.Validate(); err != nil { - cmdutil.CheckErr(cmdutil.UsageError(cmd, err.Error())) - } - _, err := o.RunLogs() - cmdutil.CheckErr(err) - }, - Aliases: []string{"log"}, - } - cmd.Flags().BoolP("follow", "f", false, "Specify if the logs should be streamed.") - cmd.Flags().Bool("timestamps", false, "Include timestamps on each line in the log output") - cmd.Flags().Int64("limit-bytes", 0, "Maximum bytes of logs to return. Defaults to no limit.") - cmd.Flags().BoolP("previous", "p", false, "If true, print the logs for the previous instance of the container in a pod if it exists.") - cmd.Flags().Int64("tail", -1, "Lines of recent log file to display. Defaults to -1, showing all log lines.") - cmd.Flags().String("since-time", "", "Only return logs after a specific date (RFC3339). Defaults to all logs. Only one of since-time / since may be used.") - cmd.Flags().Duration("since", 0, "Only return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs. Only one of since-time / since may be used.") - cmd.Flags().StringP("container", "c", "", "Print the logs of this container") - - cmd.Flags().Bool("interactive", false, "If true, prompt the user for input when required.") - cmd.Flags().MarkDeprecated("interactive", "This flag is no longer respected and there is no replacement.") - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func (o *LogsOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error { - containerName := cmdutil.GetFlagString(cmd, "container") - switch len(args) { - case 0: - return cmdutil.UsageError(cmd, "POD is required for logs") - case 1: - o.ResourceArg = args[0] - case 2: - if cmd.Flag("container").Changed { - return cmdutil.UsageError(cmd, "only one of -c, [CONTAINER] arg is allowed") - } - o.ResourceArg = args[0] - containerName = args[1] - default: - return cmdutil.UsageError(cmd, "logs POD [-c CONTAINER]") - } - var err error - o.Namespace, _, err = f.DefaultNamespace() - if err != nil { - return err - } - - logOptions := &api.PodLogOptions{ - Container: containerName, - Follow: cmdutil.GetFlagBool(cmd, "follow"), - Previous: cmdutil.GetFlagBool(cmd, "previous"), - Timestamps: cmdutil.GetFlagBool(cmd, "timestamps"), - } - if sinceTime := cmdutil.GetFlagString(cmd, "since-time"); len(sinceTime) > 0 { - t, err := api.ParseRFC3339(sinceTime, unversioned.Now) - if err != nil { - return err - } - logOptions.SinceTime = &t - } - if limit := cmdutil.GetFlagInt64(cmd, "limit-bytes"); limit != 0 { - logOptions.LimitBytes = &limit - } - if tail := cmdutil.GetFlagInt64(cmd, "tail"); tail != -1 { - logOptions.TailLines = &tail - } - if sinceSeconds := cmdutil.GetFlagDuration(cmd, "since"); sinceSeconds != 0 { - // round up to the nearest second - sec := int64(math.Ceil(float64(sinceSeconds) / float64(time.Second))) - logOptions.SinceSeconds = &sec - } - o.Options = logOptions - o.LogsForObject = f.LogsForObject - o.ClientMapper = resource.ClientMapperFunc(f.ClientForMapping) - o.Out = out - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - decoder := f.Decoder(true) - if o.Object == nil { - infos, err := resource.NewBuilder(mapper, typer, o.ClientMapper, decoder). - NamespaceParam(o.Namespace).DefaultNamespace(). - ResourceNames("pods", o.ResourceArg). - SingleResourceType(). - Do().Infos() - if err != nil { - return err - } - if len(infos) != 1 { - return errors.New("expected a resource") - } - o.Object = infos[0].Object - } - - return nil -} - -func (o LogsOptions) Validate() error { - if len(o.ResourceArg) == 0 { - return errors.New("a pod must be specified") - } - logsOptions, ok := o.Options.(*api.PodLogOptions) - if !ok { - return errors.New("unexpected logs options object") - } - if errs := validation.ValidatePodLogOptions(logsOptions); len(errs) > 0 { - return errs.ToAggregate() - } - - return nil -} - -// RunLogs retrieves a pod log -func (o LogsOptions) RunLogs() (int64, error) { - req, err := o.LogsForObject(o.Object, o.Options) - if err != nil { - return 0, err - } - - readCloser, err := req.Stream() - if err != nil { - return 0, err - } - defer readCloser.Close() - - return io.Copy(o.Out, readCloser) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs_test.go deleted file mode 100644 index 9f1205f71..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/logs_test.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "io/ioutil" - "net/http" - "os" - "strings" - "testing" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestLog(t *testing.T) { - tests := []struct { - name, version, podPath, logPath, container string - pod *api.Pod - }{ - { - name: "v1 - pod log", - version: "v1", - podPath: "/namespaces/test/pods/foo", - logPath: "/api/v1/namespaces/test/pods/foo/log", - pod: testPod(), - }, - } - for _, test := range tests { - logContent := "test log content" - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - case p == test.logPath && m == "GET": - body := ioutil.NopCloser(bytes.NewBufferString(logContent)) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %#v\n%#v", test.name, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdLogs(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Run(cmd, []string{"foo"}) - - if buf.String() != logContent { - t.Errorf("%s: did not get expected log content. Got: %s", test.name, buf.String()) - } - } -} - -func testPod() *api.Pod { - return &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{ - { - Name: "bar", - }, - }, - }, - } -} - -func TestValidateLogFlags(t *testing.T) { - f, _, _ := NewAPIFactory() - - tests := []struct { - name string - flags map[string]string - expected string - }{ - { - name: "since & since-time", - flags: map[string]string{"since": "1h", "since-time": "2006-01-02T15:04:05Z"}, - expected: "at most one of `sinceTime` or `sinceSeconds` may be specified", - }, - { - name: "negative limit-bytes", - flags: map[string]string{"limit-bytes": "-100"}, - expected: "must be greater than 0", - }, - { - name: "negative tail", - flags: map[string]string{"tail": "-100"}, - expected: "must be greater than or equal to 0", - }, - } - for _, test := range tests { - cmd := NewCmdLogs(f, bytes.NewBuffer([]byte{})) - out := "" - for flag, value := range test.flags { - cmd.Flags().Set(flag, value) - } - // checkErr breaks tests in case of errors, plus we just - // need to check errors returned by the command validation - o := &LogsOptions{} - cmd.Run = func(cmd *cobra.Command, args []string) { - o.Complete(f, os.Stdout, cmd, args) - out = o.Validate().Error() - } - cmd.Run(cmd, []string{"foo"}) - - if !strings.Contains(out, test.expected) { - t.Errorf("%s: expected to find:\n\t%s\nfound:\n\t%s\n", test.name, test.expected, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/namespace.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/namespace.go deleted file mode 100644 index e50e4c078..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/namespace.go +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -// TODO remove once people have been given enough time to notice -func NewCmdNamespace(out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "namespace [namespace]", - Short: "SUPERSEDED: Set and view the current Kubernetes namespace", - Long: `SUPERSEDED: Set and view the current Kubernetes namespace scope for command line requests. - -namespace has been superseded by the context.namespace field of .kubeconfig files. See 'kubectl config set-context --help' for more details. -`, - Run: func(cmd *cobra.Command, args []string) { - util.CheckErr(fmt.Errorf("namespace has been superseded by the context.namespace field of .kubeconfig files. See 'kubectl config set-context --help' for more details.")) - }, - } - return cmd -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch.go deleted file mode 100644 index 6f892133c..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "strings" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/util/sets" - "k8s.io/kubernetes/pkg/util/yaml" -) - -var patchTypes = map[string]api.PatchType{"json": api.JSONPatchType, "merge": api.MergePatchType, "strategic": api.StrategicMergePatchType} - -// PatchOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type PatchOptions struct { - Filenames []string - Recursive bool -} - -const ( - patch_long = `Update field(s) of a resource using strategic merge patch - -JSON and YAML formats are accepted. - -Please refer to the models in https://htmlpreview.github.io/?https://github.com/kubernetes/kubernetes/blob/HEAD/docs/api-reference/v1/definitions.html to find if a field is mutable.` - patch_example = ` -# Partially update a node using strategic merge patch -kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' - -# Partially update a node identified by the type and name specified in "node.json" using strategic merge patch -kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}' - -# Update a container's image; spec.containers[*].name is required because it's a merge key -kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}' - -# Update a container's image using a json patch with positional arrays -kubectl patch pod valid-pod -type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'` -) - -func NewCmdPatch(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &PatchOptions{} - - // retrieve a list of handled resources from printer as valid args - validArgs, argAliases := []string{}, []string{} - p, err := f.Printer(nil, false, false, false, false, false, false, []string{}) - cmdutil.CheckErr(err) - if p != nil { - validArgs = p.HandledResources() - argAliases = kubectl.ResourceAliases(validArgs) - } - - cmd := &cobra.Command{ - Use: "patch (-f FILENAME | TYPE NAME) -p PATCH", - Short: "Update field(s) of a resource using strategic merge patch.", - Long: patch_long, - Example: patch_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - err := RunPatch(f, out, cmd, args, shortOutput, options) - cmdutil.CheckErr(err) - }, - ValidArgs: validArgs, - ArgAliases: argAliases, - } - cmd.Flags().StringP("patch", "p", "", "The patch to be applied to the resource JSON file.") - cmd.MarkFlagRequired("patch") - cmd.Flags().String("type", "strategic", fmt.Sprintf("The type of patch being provided; one of %v", sets.StringKeySet(patchTypes).List())) - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - usage := "Filename, directory, or URL to a file identifying the resource to update" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - return cmd -} - -func RunPatch(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, shortOutput bool, options *PatchOptions) error { - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - patchType := api.StrategicMergePatchType - patchTypeString := strings.ToLower(cmdutil.GetFlagString(cmd, "type")) - if len(patchTypeString) != 0 { - ok := false - patchType, ok = patchTypes[patchTypeString] - if !ok { - return cmdutil.UsageError(cmd, fmt.Sprintf("--type must be one of %v, not %q", sets.StringKeySet(patchTypes).List(), patchTypeString)) - } - } - - patch := cmdutil.GetFlagString(cmd, "patch") - if len(patch) == 0 { - return cmdutil.UsageError(cmd, "Must specify -p to patch") - } - patchBytes, err := yaml.ToJSON([]byte(patch)) - if err != nil { - return fmt.Errorf("unable to parse %q: %v", patch, err) - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(false, args...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - name, namespace := info.Name, info.Namespace - mapping := info.ResourceMapping() - client, err := f.ClientForMapping(mapping) - if err != nil { - return err - } - - helper := resource.NewHelper(client, mapping) - patchedObject, err := helper.Patch(namespace, name, patchType, patchBytes) - if err != nil { - return err - } - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(patchedObject, f.Command()); err == nil { - // don't return an error on failure. The patch itself succeeded, its only the hint for that change that failed - // don't bother checking for failures of this replace, because a failure to indicate the hint doesn't fail the command - // also, don't force the replacement. If the replacement fails on a resourceVersion conflict, then it means this - // record hint is likely to be invalid anyway, so avoid the bad hint - resource.NewHelper(client, mapping).Replace(namespace, name, false, patchedObject) - } - } - count++ - cmdutil.PrintSuccess(mapper, shortOutput, out, "", name, "patched") - return nil - }) - if err != nil { - return err - } - if count == 0 { - return fmt.Errorf("no objects passed to patch") - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch_test.go deleted file mode 100644 index fd22dcaf4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/patch_test.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "testing" - - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestPatchObject(t *testing.T) { - _, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/services/frontend" && (m == "PATCH" || m == "GET"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdPatch(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("patch", `{"spec":{"type":"NodePort"}}`) - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{"services/frontend"}) - - // uses the name from the file, not the response - if buf.String() != "frontend\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestPatchObjectFromFile(t *testing.T) { - _, svc, _ := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/services/frontend" && (m == "PATCH" || m == "GET"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdPatch(f, buf) - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("patch", `{"spec":{"type":"NodePort"}}`) - cmd.Flags().Set("output", "name") - cmd.Flags().Set("filename", "../../../examples/guestbook/frontend-service.yaml") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - if buf.String() != "frontend\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward.go deleted file mode 100644 index 3d705466f..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward.go +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "io" - "net/url" - "os" - "os/signal" - - "github.com/golang/glog" - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/portforward" - "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - portforward_example = ` -# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod -kubectl port-forward mypod 5000 6000 - -# Listen on port 8888 locally, forwarding to 5000 in the pod -kubectl port-forward mypod 8888:5000 - -# Listen on a random port locally, forwarding to 5000 in the pod -kubectl port-forward mypod :5000 - -# Listen on a random port locally, forwarding to 5000 in the pod -kubectl port-forward mypod 0:5000` -) - -func NewCmdPortForward(f *cmdutil.Factory, cmdOut, cmdErr io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]", - Short: "Forward one or more local ports to a pod.", - Long: "Forward one or more local ports to a pod.", - Example: portforward_example, - Run: func(cmd *cobra.Command, args []string) { - pf := &defaultPortForwarder{ - cmdOut: cmdOut, - cmdErr: cmdErr, - } - err := RunPortForward(f, cmd, args, pf) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().StringP("pod", "p", "", "Pod name") - // TODO support UID - return cmd -} - -type portForwarder interface { - ForwardPorts(method string, url *url.URL, config *restclient.Config, ports []string, stopChan <-chan struct{}) error -} - -type defaultPortForwarder struct { - cmdOut, cmdErr io.Writer -} - -func (f *defaultPortForwarder) ForwardPorts(method string, url *url.URL, config *restclient.Config, ports []string, stopChan <-chan struct{}) error { - dialer, err := remotecommand.NewExecutor(config, method, url) - if err != nil { - return err - } - fw, err := portforward.New(dialer, ports, stopChan, f.cmdOut, f.cmdErr) - if err != nil { - return err - } - return fw.ForwardPorts() -} - -func RunPortForward(f *cmdutil.Factory, cmd *cobra.Command, args []string, fw portForwarder) error { - podName := cmdutil.GetFlagString(cmd, "pod") - if len(podName) == 0 && len(args) == 0 { - return cmdutil.UsageError(cmd, "POD is required for port-forward") - } - - if len(podName) != 0 { - printDeprecationWarning("port-forward POD", "-p POD") - } else { - podName = args[0] - args = args[1:] - } - - if len(args) < 1 { - return cmdutil.UsageError(cmd, "at least 1 PORT is required for port-forward") - } - - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - - client, err := f.Client() - if err != nil { - return err - } - - pod, err := client.Pods(namespace).Get(podName) - if err != nil { - return err - } - - if pod.Status.Phase != api.PodRunning { - glog.Fatalf("Unable to execute command because pod is not running. Current status=%v", pod.Status.Phase) - } - - config, err := f.ClientConfig() - if err != nil { - return err - } - - signals := make(chan os.Signal, 1) - signal.Notify(signals, os.Interrupt) - defer signal.Stop(signals) - - stopCh := make(chan struct{}, 1) - go func() { - <-signals - close(stopCh) - }() - - req := client.RESTClient.Post(). - Resource("pods"). - Namespace(namespace). - Name(pod.Name). - SubResource("portforward") - - return fw.ForwardPorts("POST", req.URL(), config, args, stopCh) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward_test.go deleted file mode 100644 index d88ab90f4..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/portforward_test.go +++ /dev/null @@ -1,176 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "net/http" - "net/url" - "testing" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -type fakePortForwarder struct { - method string - url *url.URL - pfErr error -} - -func (f *fakePortForwarder) ForwardPorts(method string, url *url.URL, config *restclient.Config, ports []string, stopChan <-chan struct{}) error { - f.method = method - f.url = url - return f.pfErr -} - -func TestPortForward(t *testing.T) { - version := testapi.Default.GroupVersion().Version - - tests := []struct { - name, version, podPath, pfPath, container string - pod *api.Pod - pfErr bool - }{ - { - name: "pod portforward", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", - pod: execPod(), - }, - { - name: "pod portforward error", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", - pod: execPod(), - pfErr: true, - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %#v\n%#v", test.name, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - ff := &fakePortForwarder{} - if test.pfErr { - ff.pfErr = fmt.Errorf("pf error") - } - cmd := &cobra.Command{} - cmd.Flags().StringP("pod", "p", "", "Pod name") - err := RunPortForward(f, cmd, []string{"foo", ":5000", ":1000"}, ff) - - if test.pfErr && err != ff.pfErr { - t.Errorf("%s: Unexpected exec error: %v", test.name, err) - } - if !test.pfErr && err != nil { - t.Errorf("%s: Unexpected error: %v", test.name, err) - } - if test.pfErr { - continue - } - - if ff.url.Path != test.pfPath { - t.Errorf("%s: Did not get expected path for portforward request", test.name) - } - if ff.method != "POST" { - t.Errorf("%s: Did not get method for attach request: %s", test.name, ff.method) - } - - } -} - -func TestPortForwardWithPFlag(t *testing.T) { - version := testapi.Default.GroupVersion().Version - - tests := []struct { - name, version, podPath, pfPath, container string - pod *api.Pod - pfErr bool - }{ - { - name: "pod portforward", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", - pod: execPod(), - }, - { - name: "pod portforward error", - version: version, - podPath: "/api/" + version + "/namespaces/test/pods/foo", - pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", - pod: execPod(), - pfErr: true, - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == test.podPath && m == "GET": - body := objBody(codec, test.pod) - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %#v\n%#v", test.name, req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} - ff := &fakePortForwarder{} - if test.pfErr { - ff.pfErr = fmt.Errorf("pf error") - } - cmd := &cobra.Command{} - podPtr := cmd.Flags().StringP("pod", "p", "", "Pod name") - *podPtr = "foo" - err := RunPortForward(f, cmd, []string{":5000", ":1000"}, ff) - if test.pfErr && err != ff.pfErr { - t.Errorf("%s: Unexpected exec error: %v", test.name, err) - } - if !test.pfErr && ff.url.Path != test.pfPath { - t.Errorf("%s: Did not get expected path for portforward request", test.name) - } - if !test.pfErr && err != nil { - t.Errorf("%s: Unexpected error: %v", test.name, err) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/proxy.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/proxy.go deleted file mode 100644 index 77330af76..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/proxy.go +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "errors" - "fmt" - "io" - "net" - "strings" - - "github.com/golang/glog" - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - default_port = 8001 - proxy_example = `# Run a proxy to kubernetes apiserver on port 8011, serving static content from ./local/www/ -kubectl proxy --port=8011 --www=./local/www/ - -# Run a proxy to kubernetes apiserver on an arbitrary local port. -# The chosen port for the server will be output to stdout. -kubectl proxy --port=0 - -# Run a proxy to kubernetes apiserver, changing the api prefix to k8s-api -# This makes e.g. the pods api available at localhost:8011/k8s-api/v1/pods/ -kubectl proxy --api-prefix=/k8s-api` -) - -func NewCmdProxy(f *cmdutil.Factory, out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix]", - Short: "Run a proxy to the Kubernetes API server", - Long: `To proxy all of the kubernetes api and nothing else, use: - -kubectl proxy --api-prefix=/ - -To proxy only part of the kubernetes api and also some static files: - -kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/ - -The above lets you 'curl localhost:8001/api/v1/pods'. - -To proxy the entire kubernetes api at a different root, use: - -kubectl proxy --api-prefix=/custom/ - -The above lets you 'curl localhost:8001/custom/api/v1/pods' -`, - Example: proxy_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunProxy(f, out, cmd) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().StringP("www", "w", "", "Also serve static files from the given directory under the specified prefix.") - cmd.Flags().StringP("www-prefix", "P", "/static/", "Prefix to serve static files under, if static file directory is specified.") - cmd.Flags().StringP("api-prefix", "", "/", "Prefix to serve the proxied API under.") - cmd.Flags().String("accept-paths", kubectl.DefaultPathAcceptRE, "Regular expression for paths that the proxy should accept.") - cmd.Flags().String("reject-paths", kubectl.DefaultPathRejectRE, "Regular expression for paths that the proxy should reject.") - cmd.Flags().String("accept-hosts", kubectl.DefaultHostAcceptRE, "Regular expression for hosts that the proxy should accept.") - cmd.Flags().String("reject-methods", kubectl.DefaultMethodRejectRE, "Regular expression for HTTP methods that the proxy should reject.") - cmd.Flags().IntP("port", "p", default_port, "The port on which to run the proxy. Set to 0 to pick a random port.") - cmd.Flags().StringP("address", "", "127.0.0.1", "The IP address on which to serve on.") - cmd.Flags().Bool("disable-filter", false, "If true, disable request filtering in the proxy. This is dangerous, and can leave you vulnerable to XSRF attacks, when used with an accessible port.") - cmd.Flags().StringP("unix-socket", "u", "", "Unix socket on which to run the proxy.") - return cmd -} - -func RunProxy(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { - path := cmdutil.GetFlagString(cmd, "unix-socket") - port := cmdutil.GetFlagInt(cmd, "port") - address := cmdutil.GetFlagString(cmd, "address") - - if port != default_port && path != "" { - return errors.New("Don't specify both --unix-socket and --port") - } - - clientConfig, err := f.ClientConfig() - if err != nil { - return err - } - - staticPrefix := cmdutil.GetFlagString(cmd, "www-prefix") - if !strings.HasSuffix(staticPrefix, "/") { - staticPrefix += "/" - } - - apiProxyPrefix := cmdutil.GetFlagString(cmd, "api-prefix") - if !strings.HasSuffix(apiProxyPrefix, "/") { - apiProxyPrefix += "/" - } - filter := &kubectl.FilterServer{ - AcceptPaths: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-paths")), - RejectPaths: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "reject-paths")), - AcceptHosts: kubectl.MakeRegexpArrayOrDie(cmdutil.GetFlagString(cmd, "accept-hosts")), - } - if cmdutil.GetFlagBool(cmd, "disable-filter") { - if path == "" { - glog.Warning("Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious") - } - filter = nil - } - - server, err := kubectl.NewProxyServer(cmdutil.GetFlagString(cmd, "www"), apiProxyPrefix, staticPrefix, filter, clientConfig) - - // Separate listening from serving so we can report the bound port - // when it is chosen by os (eg: port == 0) - var l net.Listener - if path == "" { - l, err = server.Listen(address, port) - } else { - l, err = server.ListenUnix(path) - } - if err != nil { - glog.Fatal(err) - } - fmt.Fprintf(out, "Starting to serve on %s", l.Addr().String()) - glog.Fatal(server.ServeOnListener(l)) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace.go deleted file mode 100644 index e7157ebb3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace.go +++ /dev/null @@ -1,258 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/spf13/cobra" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" -) - -// ReplaceOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type ReplaceOptions struct { - Filenames []string - Recursive bool -} - -const ( - replace_long = `Replace a resource by filename or stdin. - -JSON and YAML formats are accepted. If replacing an existing resource, the -complete resource spec must be provided. This can be obtained by -$ kubectl get TYPE NAME -o yaml - -Please refer to the models in https://htmlpreview.github.io/?https://github.com/kubernetes/kubernetes/blob/HEAD/docs/api-reference/v1/definitions.html to find if a field is mutable.` - replace_example = `# Replace a pod using the data in pod.json. -kubectl replace -f ./pod.json - -# Replace a pod based on the JSON passed into stdin. -cat pod.json | kubectl replace -f - - -# Update a single-container pod's image version (tag) to v4 -kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - - -# Force replace, delete and then re-create the resource -kubectl replace --force -f ./pod.json` -) - -func NewCmdReplace(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &ReplaceOptions{} - - cmd := &cobra.Command{ - Use: "replace -f FILENAME", - // update is deprecated. - Aliases: []string{"update"}, - Short: "Replace a resource by filename or stdin.", - Long: replace_long, - Example: replace_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - err := RunReplace(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - } - usage := "Filename, directory, or URL to file to use to replace the resource." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmd.MarkFlagRequired("filename") - cmd.Flags().Bool("force", false, "Delete and re-create the specified resource") - cmd.Flags().Bool("cascade", false, "Only relevant during a force replace. If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController).") - cmd.Flags().Int("grace-period", -1, "Only relevant during a force replace. Period of time in seconds given to the old resource to terminate gracefully. Ignored if negative.") - cmd.Flags().Duration("timeout", 0, "Only relevant during a force replace. The length of time to wait before giving up on a delete of the old resource, zero means determine a timeout from the size of the object") - cmdutil.AddValidateFlags(cmd) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - return cmd -} - -func RunReplace(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *ReplaceOptions) error { - if len(os.Args) > 1 && os.Args[1] == "update" { - printDeprecationWarning("replace", "update") - } - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - force := cmdutil.GetFlagBool(cmd, "force") - if len(options.Filenames) == 0 { - return cmdutil.UsageError(cmd, "Must specify --filename to replace") - } - - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - if force { - return forceReplace(f, out, cmd, args, shortOutput, options) - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - Schema(schema). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - return r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { - return cmdutil.AddSourceToErr("replacing", info.Source, err) - } - - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(info.Object, f.Command()); err != nil { - return cmdutil.AddSourceToErr("replacing", info.Source, err) - } - } - - // Serialize the object with the annotation applied. - obj, err := resource.NewHelper(info.Client, info.Mapping).Replace(info.Namespace, info.Name, true, info.Object) - if err != nil { - return cmdutil.AddSourceToErr("replacing", info.Source, err) - } - - info.Refresh(obj, true) - printObjectSpecificMessage(obj, out) - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "replaced") - return nil - }) -} - -func forceReplace(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, shortOutput bool, options *ReplaceOptions) error { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - for i, filename := range options.Filenames { - if filename == "-" { - tempDir, err := ioutil.TempDir("", "kubectl_replace_") - if err != nil { - return err - } - defer os.RemoveAll(tempDir) - tempFilename := filepath.Join(tempDir, "resource.stdin") - err = cmdutil.DumpReaderToFile(os.Stdin, tempFilename) - if err != nil { - return err - } - options.Filenames[i] = tempFilename - } - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(false, args...).RequireObject(false). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - //Replace will create a resource if it doesn't exist already, so ignore not found error - ignoreNotFound := true - // By default use a reaper to delete all related resources. - if cmdutil.GetFlagBool(cmd, "cascade") { - glog.Warningf("\"cascade\" is set, kubectl will delete and re-create all resources managed by this resource (e.g. Pods created by a ReplicationController). Consider using \"kubectl rolling-update\" if you want to update a ReplicationController together with its Pods.") - err = ReapResult(r, f, out, cmdutil.GetFlagBool(cmd, "cascade"), ignoreNotFound, cmdutil.GetFlagDuration(cmd, "timeout"), cmdutil.GetFlagInt(cmd, "grace-period"), shortOutput, mapper) - } else { - err = DeleteResult(r, out, ignoreNotFound, shortOutput, mapper) - } - if err != nil { - return err - } - - r = resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - Schema(schema). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - count := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { - return err - } - - if cmdutil.ShouldRecord(cmd, info) { - if err := cmdutil.RecordChangeCause(info.Object, f.Command()); err != nil { - return cmdutil.AddSourceToErr("replacing", info.Source, err) - } - } - - obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) - if err != nil { - return err - } - - count++ - info.Refresh(obj, true) - printObjectSpecificMessage(obj, out) - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "replaced") - return nil - }) - if err != nil { - return err - } - if count == 0 { - return fmt.Errorf("no objects passed to replace") - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace_test.go deleted file mode 100644 index e511f92b8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/replace_test.go +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "net/http" - "strings" - "testing" - - "k8s.io/kubernetes/pkg/client/unversioned/fake" -) - -func TestReplaceObject(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && (m == "GET" || m == "PUT" || m == "DELETE"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdReplace(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - // uses the name from the file, not the response - if buf.String() != "replicationcontroller/rc1\n" { - t.Errorf("unexpected output: %s", buf.String()) - } - - buf.Reset() - cmd.Flags().Set("force", "true") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/redis-master\nreplicationcontroller/rc1\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestReplaceMultipleObject(t *testing.T) { - _, svc, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && (m == "GET" || m == "PUT" || m == "DELETE"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - case p == "/namespaces/test/services/frontend" && (m == "GET" || m == "PUT" || m == "DELETE"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &svc.Items[0])}, nil - case p == "/namespaces/test/services" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &svc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdReplace(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("filename", "../../../examples/guestbook/frontend-service.yaml") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/rc1\nservice/baz\n" { - t.Errorf("unexpected output: %s", buf.String()) - } - - buf.Reset() - cmd.Flags().Set("force", "true") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/redis-master\nservice/frontend\nreplicationcontroller/rc1\nservice/baz\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestReplaceDirectory(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case strings.HasPrefix(p, "/namespaces/test/replicationcontrollers/") && (m == "GET" || m == "PUT" || m == "DELETE"): - return &http.Response{StatusCode: 200, Body: objBody(codec, &rc.Items[0])}, nil - case strings.HasPrefix(p, "/namespaces/test/replicationcontrollers") && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdReplace(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy") - cmd.Flags().Set("namespace", "test") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/rc1\nreplicationcontroller/rc1\nreplicationcontroller/rc1\n" { - t.Errorf("unexpected output: %s", buf.String()) - } - - buf.Reset() - cmd.Flags().Set("force", "true") - cmd.Flags().Set("cascade", "false") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/frontend\nreplicationcontroller/redis-master\nreplicationcontroller/redis-slave\n"+ - "replicationcontroller/rc1\nreplicationcontroller/rc1\nreplicationcontroller/rc1\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} - -func TestForceReplaceObjectNotFound(t *testing.T) { - _, _, rc := testData() - - f, tf, codec := NewAPIFactory() - tf.Printer = &testPrinter{} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case p == "/namespaces/test/replicationcontrollers/redis-master" && m == "DELETE": - return &http.Response{StatusCode: 404, Body: stringBody("")}, nil - case p == "/namespaces/test/replicationcontrollers" && m == "POST": - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - tf.Namespace = "test" - buf := bytes.NewBuffer([]byte{}) - - cmd := NewCmdReplace(f, buf) - cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml") - cmd.Flags().Set("force", "true") - cmd.Flags().Set("cascade", "false") - cmd.Flags().Set("output", "name") - cmd.Run(cmd, []string{}) - - if buf.String() != "replicationcontroller/rc1\n" { - t.Errorf("unexpected output: %s", buf.String()) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate.go deleted file mode 100644 index 8f745e06d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate.go +++ /dev/null @@ -1,410 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "fmt" - "io" - "os" - "time" - - "github.com/golang/glog" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/util/intstr" -) - -// RollingUpdateOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type RollingUpdateOptions struct { - Filenames []string -} - -const ( - rollingUpdate_long = `Perform a rolling update of the given ReplicationController. - -Replaces the specified replication controller with a new replication controller by updating one pod at a time to use the -new PodTemplate. The new-controller.json must specify the same namespace as the -existing replication controller and overwrite at least one (common) label in its replicaSelector.` - rollingUpdate_example = `# Update pods of frontend-v1 using new replication controller data in frontend-v2.json. -kubectl rolling-update frontend-v1 -f frontend-v2.json - -# Update pods of frontend-v1 using JSON data passed into stdin. -cat frontend-v2.json | kubectl rolling-update frontend-v1 -f - - -# Update the pods of frontend-v1 to frontend-v2 by just changing the image, and switching the -# name of the replication controller. -kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 - -# Update the pods of frontend by just changing the image, and keeping the old name. -kubectl rolling-update frontend --image=image:v2 - -# Abort and reverse an existing rollout in progress (from frontend-v1 to frontend-v2). -kubectl rolling-update frontend-v1 frontend-v2 --rollback -` -) - -var ( - updatePeriod, _ = time.ParseDuration("1m0s") - timeout, _ = time.ParseDuration("5m0s") - pollInterval, _ = time.ParseDuration("3s") -) - -func NewCmdRollingUpdate(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &RollingUpdateOptions{} - - cmd := &cobra.Command{ - Use: "rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC)", - // rollingupdate is deprecated. - Aliases: []string{"rollingupdate"}, - Short: "Perform a rolling update of the given ReplicationController.", - Long: rollingUpdate_long, - Example: rollingUpdate_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunRollingUpdate(f, out, cmd, args, options) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().Duration("update-period", updatePeriod, `Time to wait between updating pods. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".`) - cmd.Flags().Duration("poll-interval", pollInterval, `Time delay between polling for replication controller status after the update. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".`) - cmd.Flags().Duration("timeout", timeout, `Max time to wait for a replication controller to update before giving up. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".`) - usage := "Filename or URL to file to use to create the new replication controller." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmd.MarkFlagRequired("filename") - cmd.Flags().String("image", "", "Image to use for upgrading the replication controller. Must be distinct from the existing image (either new image or new image tag). Can not be used with --filename/-f") - cmd.MarkFlagRequired("image") - cmd.Flags().String("deployment-label-key", "deployment", "The key to use to differentiate between two different controllers, default 'deployment'. Only relevant when --image is specified, ignored otherwise") - cmd.Flags().String("container", "", "Container name which will have its image upgraded. Only relevant when --image is specified, ignored otherwise. Required when using --image on a multi-container pod") - cmd.Flags().String("image-pull-policy", "", "Explicit policy for when to pull container images. Required when --image is same as existing image, ignored otherwise.") - cmd.Flags().Bool("dry-run", false, "If true, print out the changes that would be made, but don't actually make them.") - cmd.Flags().Bool("rollback", false, "If true, this is a request to abort an existing rollout that is partially rolled out. It effectively reverses current and next and runs a rollout") - cmdutil.AddValidateFlags(cmd) - cmdutil.AddPrinterFlags(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - return cmd -} - -func validateArguments(cmd *cobra.Command, filenames, args []string) error { - deploymentKey := cmdutil.GetFlagString(cmd, "deployment-label-key") - image := cmdutil.GetFlagString(cmd, "image") - rollback := cmdutil.GetFlagBool(cmd, "rollback") - - if len(deploymentKey) == 0 { - return cmdutil.UsageError(cmd, "--deployment-label-key can not be empty") - } - if len(filenames) > 1 { - return cmdutil.UsageError(cmd, "May only specify a single filename for new controller") - } - - if !rollback { - if len(filenames) == 0 && len(image) == 0 { - return cmdutil.UsageError(cmd, "Must specify --filename or --image for new controller") - } - if len(filenames) != 0 && len(image) != 0 { - return cmdutil.UsageError(cmd, "--filename and --image can not both be specified") - } - } else { - if len(filenames) != 0 || len(image) != 0 { - return cmdutil.UsageError(cmd, "Don't specify --filename or --image on rollback") - } - } - - if len(args) < 1 { - return cmdutil.UsageError(cmd, "Must specify the controller to update") - } - - return nil -} - -func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *RollingUpdateOptions) error { - if len(os.Args) > 1 && os.Args[1] == "rollingupdate" { - printDeprecationWarning("rolling-update", "rollingupdate") - } - err := validateArguments(cmd, options.Filenames, args) - if err != nil { - return err - } - - deploymentKey := cmdutil.GetFlagString(cmd, "deployment-label-key") - filename := "" - image := cmdutil.GetFlagString(cmd, "image") - pullPolicy := cmdutil.GetFlagString(cmd, "image-pull-policy") - oldName := args[0] - rollback := cmdutil.GetFlagBool(cmd, "rollback") - period := cmdutil.GetFlagDuration(cmd, "update-period") - interval := cmdutil.GetFlagDuration(cmd, "poll-interval") - timeout := cmdutil.GetFlagDuration(cmd, "timeout") - dryrun := cmdutil.GetFlagBool(cmd, "dry-run") - outputFormat := cmdutil.GetFlagString(cmd, "output") - container := cmdutil.GetFlagString(cmd, "container") - - if len(options.Filenames) > 0 { - filename = options.Filenames[0] - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - client, err := f.Client() - if err != nil { - return err - } - - var newRc *api.ReplicationController - // fetch rc - oldRc, err := client.ReplicationControllers(cmdNamespace).Get(oldName) - if err != nil { - if !errors.IsNotFound(err) || len(image) == 0 || len(args) > 1 { - return err - } - // We're in the middle of a rename, look for an RC with a source annotation of oldName - newRc, err := kubectl.FindSourceController(client, cmdNamespace, oldName) - if err != nil { - return err - } - return kubectl.Rename(client, newRc, oldName) - } - - var keepOldName bool - var replicasDefaulted bool - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - - if len(filename) != 0 { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) - if err != nil { - return err - } - - request := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - Schema(schema). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, false, filename). - Do() - obj, err := request.Object() - if err != nil { - return err - } - var ok bool - // Handle filename input from stdin. The resource builder always returns an api.List - // when creating resource(s) from a stream. - if list, ok := obj.(*api.List); ok { - if len(list.Items) > 1 { - return cmdutil.UsageError(cmd, "%s specifies multiple items", filename) - } - obj = list.Items[0] - } - newRc, ok = obj.(*api.ReplicationController) - if !ok { - if gvk, err := typer.ObjectKind(obj); err == nil { - return cmdutil.UsageError(cmd, "%s contains a %v not a ReplicationController", filename, gvk) - } - glog.V(4).Infof("Object %#v is not a ReplicationController", obj) - return cmdutil.UsageError(cmd, "%s does not specify a valid ReplicationController", filename) - } - infos, err := request.Infos() - if err != nil || len(infos) != 1 { - glog.V(2).Infof("was not able to recover adequate information to discover if .spec.replicas was defaulted") - } else { - replicasDefaulted = isReplicasDefaulted(infos[0]) - } - } - // If the --image option is specified, we need to create a new rc with at least one different selector - // than the old rc. This selector is the hash of the rc, with a suffix to provide uniqueness for - // same-image updates. - if len(image) != 0 { - codec := api.Codecs.LegacyCodec(client.APIVersion()) - keepOldName = len(args) == 1 - newName := findNewName(args, oldRc) - if newRc, err = kubectl.LoadExistingNextReplicationController(client, cmdNamespace, newName); err != nil { - return err - } - if newRc != nil { - if inProgressImage := newRc.Spec.Template.Spec.Containers[0].Image; inProgressImage != image { - return cmdutil.UsageError(cmd, "Found existing in-progress update to image (%s).\nEither continue in-progress update with --image=%s or rollback with --rollback", inProgressImage, inProgressImage) - } - fmt.Fprintf(out, "Found existing update in progress (%s), resuming.\n", newRc.Name) - } else { - config := &kubectl.NewControllerConfig{ - Namespace: cmdNamespace, - OldName: oldName, - NewName: newName, - Image: image, - Container: container, - DeploymentKey: deploymentKey, - } - if oldRc.Spec.Template.Spec.Containers[0].Image == image { - if len(pullPolicy) == 0 { - return cmdutil.UsageError(cmd, "--image-pull-policy (Always|Never|IfNotPresent) must be provided when --image is the same as existing container image") - } - config.PullPolicy = api.PullPolicy(pullPolicy) - } - newRc, err = kubectl.CreateNewControllerFromCurrentController(client, codec, config) - if err != nil { - return err - } - } - // Update the existing replication controller with pointers to the 'next' controller - // and adding the label if necessary to distinguish it from the 'next' controller. - oldHash, err := api.HashObject(oldRc, codec) - if err != nil { - return err - } - // If new image is same as old, the hash may not be distinct, so add a suffix. - oldHash += "-orig" - oldRc, err = kubectl.UpdateExistingReplicationController(client, oldRc, cmdNamespace, newRc.Name, deploymentKey, oldHash, out) - if err != nil { - return err - } - } - - if rollback { - keepOldName = len(args) == 1 - newName := findNewName(args, oldRc) - if newRc, err = kubectl.LoadExistingNextReplicationController(client, cmdNamespace, newName); err != nil { - return err - } - - if newRc == nil { - return cmdutil.UsageError(cmd, "Could not find %s to rollback.\n", newName) - } - } - - if oldName == newRc.Name { - return cmdutil.UsageError(cmd, "%s cannot have the same name as the existing ReplicationController %s", - filename, oldName) - } - - updater := kubectl.NewRollingUpdater(newRc.Namespace, client) - - // To successfully pull off a rolling update the new and old rc have to differ - // by at least one selector. Every new pod should have the selector and every - // old pod should not have the selector. - var hasLabel bool - for key, oldValue := range oldRc.Spec.Selector { - if newValue, ok := newRc.Spec.Selector[key]; ok && newValue != oldValue { - hasLabel = true - break - } - } - if !hasLabel { - return cmdutil.UsageError(cmd, "%s must specify a matching key with non-equal value in Selector for %s", - filename, oldName) - } - // TODO: handle scales during rolling update - if replicasDefaulted { - newRc.Spec.Replicas = oldRc.Spec.Replicas - } - if dryrun { - oldRcData := &bytes.Buffer{} - newRcData := &bytes.Buffer{} - if outputFormat == "" { - oldRcData.WriteString(oldRc.Name) - newRcData.WriteString(newRc.Name) - } else { - if err := f.PrintObject(cmd, mapper, oldRc, oldRcData); err != nil { - return err - } - if err := f.PrintObject(cmd, mapper, newRc, newRcData); err != nil { - return err - } - } - fmt.Fprintf(out, "Rolling from:\n%s\nTo:\n%s\n", string(oldRcData.Bytes()), string(newRcData.Bytes())) - return nil - } - updateCleanupPolicy := kubectl.DeleteRollingUpdateCleanupPolicy - if keepOldName { - updateCleanupPolicy = kubectl.RenameRollingUpdateCleanupPolicy - } - config := &kubectl.RollingUpdaterConfig{ - Out: out, - OldRc: oldRc, - NewRc: newRc, - UpdatePeriod: period, - Interval: interval, - Timeout: timeout, - CleanupPolicy: updateCleanupPolicy, - MaxUnavailable: intstr.FromInt(0), - MaxSurge: intstr.FromInt(1), - } - if rollback { - err = kubectl.AbortRollingUpdate(config) - if err != nil { - return err - } - client.ReplicationControllers(config.NewRc.Namespace).Update(config.NewRc) - } - err = updater.Update(config) - if err != nil { - return err - } - - message := "rolling updated" - if keepOldName { - newRc.Name = oldName - } else { - message = fmt.Sprintf("rolling updated to %q", newRc.Name) - } - newRc, err = client.ReplicationControllers(cmdNamespace).Get(newRc.Name) - if err != nil { - return err - } - if outputFormat != "" { - return f.PrintObject(cmd, mapper, newRc, out) - } - kind, err := api.Scheme.ObjectKind(newRc) - if err != nil { - return err - } - _, res := meta.KindToResource(kind) - cmdutil.PrintSuccess(mapper, false, out, res.Resource, oldName, message) - return nil -} - -func findNewName(args []string, oldRc *api.ReplicationController) string { - if len(args) >= 2 { - return args[1] - } - if oldRc != nil { - newName, _ := kubectl.GetNextControllerAnnotation(oldRc) - return newName - } - return "" -} - -func isReplicasDefaulted(info *resource.Info) bool { - if info == nil || info.VersionedObject == nil { - // was unable to recover versioned info - return false - } - switch t := info.VersionedObject.(type) { - case *v1.ReplicationController: - return t.Spec.Replicas == nil - } - return false -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate_test.go deleted file mode 100644 index bf2204b27..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollingupdate_test.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "testing" -) - -func TestValidateArgs(t *testing.T) { - f, _, _ := NewAPIFactory() - - tests := []struct { - flags map[string]string - filenames []string - args []string - expectErr bool - testName string - }{ - { - expectErr: true, - testName: "nothing", - }, - { - flags: map[string]string{}, - args: []string{"foo"}, - expectErr: true, - testName: "no file, no image", - }, - { - filenames: []string{"bar.yaml"}, - args: []string{"foo"}, - testName: "valid file example", - }, - { - flags: map[string]string{ - "image": "foo:v2", - }, - args: []string{"foo"}, - testName: "missing second image name", - }, - { - flags: map[string]string{ - "image": "foo:v2", - }, - args: []string{"foo", "foo-v2"}, - testName: "valid image example", - }, - { - flags: map[string]string{ - "image": "foo:v2", - }, - filenames: []string{"bar.yaml"}, - args: []string{"foo", "foo-v2"}, - expectErr: true, - testName: "both filename and image example", - }, - } - for _, test := range tests { - out := &bytes.Buffer{} - cmd := NewCmdRollingUpdate(f, out) - - if test.flags != nil { - for key, val := range test.flags { - cmd.Flags().Set(key, val) - } - } - err := validateArguments(cmd, test.filenames, test.args) - if err != nil && !test.expectErr { - t.Errorf("unexpected error: %v (%s)", err, test.testName) - } - if err == nil && test.expectErr { - t.Errorf("unexpected non-error (%s)", test.testName) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout.go deleted file mode 100644 index 93e9f2362..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 rollout - -import ( - "io" - - "github.com/spf13/cobra" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -const ( - rollout_long = `Manages a deployment using subcommands like "kubectl rollout undo deployment/abc"` - rollout_example = `# Rollback to the previous deployment -kubectl rollout undo deployment/abc` - rollout_valid_resources = `Valid resource types include: - * deployments -` -) - -func NewCmdRollout(f *cmdutil.Factory, out io.Writer) *cobra.Command { - - cmd := &cobra.Command{ - Use: "rollout SUBCOMMAND", - Short: "rollout manages a deployment", - Long: rollout_long, - Example: rollout_example, - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - // subcommands - cmd.AddCommand(NewCmdRolloutHistory(f, out)) - cmd.AddCommand(NewCmdRolloutPause(f, out)) - cmd.AddCommand(NewCmdRolloutResume(f, out)) - cmd.AddCommand(NewCmdRolloutUndo(f, out)) - - return cmd -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_history.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_history.go deleted file mode 100644 index 09fddde63..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_history.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 rollout - -import ( - "fmt" - "io" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/util/errors" - - "github.com/spf13/cobra" -) - -// HistoryOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type HistoryOptions struct { - Filenames []string - Recursive bool -} - -const ( - history_long = `View previous rollout revisions and configurations.` - history_example = `# View the rollout history of a deployment -kubectl rollout history deployment/abc - -# View the details of deployment revision 3 -kubectl rollout history deployment/abc --revision=3` -) - -func NewCmdRolloutHistory(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &HistoryOptions{} - - cmd := &cobra.Command{ - Use: "history (TYPE NAME | TYPE/NAME) [flags]", - Short: "view rollout history", - Long: history_long, - Example: history_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(RunHistory(f, cmd, out, args, options)) - }, - } - - cmd.Flags().Int64("revision", 0, "See the details, including podTemplate of the revision specified") - usage := "Filename, directory, or URL to a file identifying the resource to get from a server." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - return cmd -} - -func RunHistory(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string, options *HistoryOptions) error { - if len(args) == 0 && len(options.Filenames) == 0 { - return cmdutil.UsageError(cmd, "Required resource not specified.") - } - revisionDetail := cmdutil.GetFlagInt64(cmd, "revision") - - mapper, typer := f.Object(false) - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - infos, err := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(true, args...). - Latest(). - Flatten(). - Do(). - Infos() - if err != nil { - return err - } - - errs := []error{} - for _, info := range infos { - mapping := info.ResourceMapping() - historyViewer, err := f.HistoryViewer(mapping) - if err != nil { - errs = append(errs, err) - continue - } - historyInfo, err := historyViewer.History(info.Namespace, info.Name) - if err != nil { - errs = append(errs, err) - continue - } - - if revisionDetail > 0 { - // Print details of a specific revision - template, ok := historyInfo.RevisionToTemplate[revisionDetail] - if !ok { - return fmt.Errorf("unable to find revision %d of %s %q", revisionDetail, mapping.Resource, info.Name) - } - fmt.Fprintf(out, "%s %q revision %d\n", mapping.Resource, info.Name, revisionDetail) - kubectl.DescribePodTemplate(template, out) - } else { - // Print all revisions - formattedOutput, printErr := kubectl.PrintRolloutHistory(historyInfo, mapping.Resource, info.Name) - if printErr != nil { - errs = append(errs, printErr) - continue - } - fmt.Fprintf(out, "%s\n", formattedOutput) - } - } - - return errors.NewAggregate(errs) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_pause.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_pause.go deleted file mode 100644 index 5eed89fde..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_pause.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 rollout - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" -) - -// PauseConfig is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type PauseConfig struct { - PauseObject func(object runtime.Object) (bool, error) - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - Info *resource.Info - - Out io.Writer - Filenames []string - Recursive bool -} - -const ( - pause_long = `Mark the provided resource as paused - -Paused resources will not be reconciled by a controller. -Use \"kubectl rollout resume\" to resume a paused resource. -Currently only deployments support being paused.` - - pause_example = `# Mark the nginx deployment as paused. Any current state of -# the deployment will continue its function, new updates to the deployment will not -# have an effect as long as the deployment is paused. -kubectl rollout pause deployment/nginx` -) - -func NewCmdRolloutPause(f *cmdutil.Factory, out io.Writer) *cobra.Command { - opts := &PauseConfig{} - - cmd := &cobra.Command{ - Use: "pause RESOURCE", - Short: "Mark the provided resource as paused", - Long: pause_long, - Example: pause_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(opts.CompletePause(f, cmd, out, args)) - cmdutil.CheckErr(opts.RunPause()) - }, - } - - usage := "Filename, directory, or URL to a file identifying the resource to get from a server." - kubectl.AddJsonFilenameFlag(cmd, &opts.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &opts.Recursive) - return cmd -} - -func (o *PauseConfig) CompletePause(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string) error { - if len(args) == 0 && len(o.Filenames) == 0 { - return cmdutil.UsageError(cmd, cmd.Use) - } - - o.Mapper, o.Typer = f.Object(false) - o.PauseObject = f.PauseObject - o.Out = out - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - infos, err := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, o.Recursive, o.Filenames...). - ResourceTypeOrNameArgs(true, args...). - SingleResourceType(). - Latest(). - Do().Infos() - if err != nil { - return err - } - if len(infos) != 1 { - return fmt.Errorf("rollout pause is only supported on individual resources - %d resources were found", len(infos)) - } - o.Info = infos[0] - return nil -} - -func (o PauseConfig) RunPause() error { - isAlreadyPaused, err := o.PauseObject(o.Info.Object) - if err != nil { - return err - } - if isAlreadyPaused { - cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, "already paused") - return nil - } - cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, "paused") - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_resume.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_resume.go deleted file mode 100644 index cbdfc0dc3..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_resume.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 rollout - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" -) - -// ResumeConfig is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type ResumeConfig struct { - ResumeObject func(object runtime.Object) (bool, error) - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - Info *resource.Info - - Out io.Writer - Filenames []string - Recursive bool -} - -const ( - resume_long = `Resume a paused resource - -Paused resources will not be reconciled by a controller. By resuming a -resource, we allow it to be reconciled again. -Currently only deployments support being resumed.` - - resume_example = `# Resume an already paused deployment -kubectl rollout resume deployment/nginx` -) - -func NewCmdRolloutResume(f *cmdutil.Factory, out io.Writer) *cobra.Command { - opts := &ResumeConfig{} - - cmd := &cobra.Command{ - Use: "resume RESOURCE", - Short: "Resume a paused resource", - Long: resume_long, - Example: resume_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(opts.CompleteResume(f, cmd, out, args)) - cmdutil.CheckErr(opts.RunResume()) - }, - } - - usage := "Filename, directory, or URL to a file identifying the resource to get from a server." - kubectl.AddJsonFilenameFlag(cmd, &opts.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &opts.Recursive) - return cmd -} - -func (o *ResumeConfig) CompleteResume(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string) error { - if len(args) == 0 && len(o.Filenames) == 0 { - return cmdutil.UsageError(cmd, cmd.Use) - } - - o.Mapper, o.Typer = f.Object(false) - o.ResumeObject = f.ResumeObject - o.Out = out - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - infos, err := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, o.Recursive, o.Filenames...). - ResourceTypeOrNameArgs(true, args...). - SingleResourceType(). - Latest(). - Do().Infos() - if err != nil { - return err - } - if len(infos) != 1 { - return fmt.Errorf("rollout resume is only supported on individual resources - %d resources were found", len(infos)) - } - o.Info = infos[0] - return nil -} - -func (o ResumeConfig) RunResume() error { - isAlreadyResumed, err := o.ResumeObject(o.Info.Object) - if err != nil { - return err - } - if isAlreadyResumed { - cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, "already resumed") - return nil - } - cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, "resumed") - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_undo.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_undo.go deleted file mode 100644 index b70b003d8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/rollout/rollout_undo.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 rollout - -import ( - "fmt" - "io" - - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" - - "github.com/spf13/cobra" -) - -// UndoOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type UndoOptions struct { - Rollbacker kubectl.Rollbacker - Mapper meta.RESTMapper - Typer runtime.ObjectTyper - Info *resource.Info - ToRevision int64 - - Out io.Writer - Filenames []string - Recursive bool -} - -const ( - undo_long = `Rollback to a previous rollout.` - undo_example = `# Rollback to the previous deployment -kubectl rollout undo deployment/abc - -# Rollback to deployment revision 3 -kubectl rollout undo deployment/abc --to-revision=3` -) - -func NewCmdRolloutUndo(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &UndoOptions{} - - cmd := &cobra.Command{ - Use: "undo (TYPE NAME | TYPE/NAME) [flags]", - Short: "undoes a previous rollout", - Long: undo_long, - Example: undo_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(options.CompleteUndo(f, cmd, out, args)) - cmdutil.CheckErr(options.RunUndo()) - }, - } - - cmd.Flags().Int64("to-revision", 0, "The revision to rollback to. Default to 0 (last revision).") - usage := "Filename, directory, or URL to a file identifying the resource to get from a server." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - return cmd -} - -func (o *UndoOptions) CompleteUndo(f *cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string) error { - if len(args) == 0 && len(o.Filenames) == 0 { - return cmdutil.UsageError(cmd, "Required resource not specified.") - } - - o.ToRevision = cmdutil.GetFlagInt64(cmd, "to-revision") - o.Mapper, o.Typer = f.Object(false) - o.Out = out - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - infos, err := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, o.Recursive, o.Filenames...). - ResourceTypeOrNameArgs(true, args...). - Latest(). - Flatten(). - Do(). - Infos() - if err != nil { - return err - } - - if len(infos) != 1 { - return fmt.Errorf("rollout undo is only supported on individual resources - %d resources were found", len(infos)) - } - o.Info = infos[0] - o.Rollbacker, err = f.Rollbacker(o.Info.ResourceMapping()) - return err -} - -func (o *UndoOptions) RunUndo() error { - result, err := o.Rollbacker.Rollback(o.Info.Namespace, o.Info.Name, nil, o.ToRevision, o.Info.Object) - if err != nil { - return err - } - cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, result) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run.go deleted file mode 100644 index d1b8e4f2d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run.go +++ /dev/null @@ -1,500 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "os" - "time" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/unversioned" - batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1" - "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" - "k8s.io/kubernetes/pkg/runtime" -) - -const ( - run_long = `Create and run a particular image, possibly replicated. -Creates a deployment or job to manage the created container(s).` - run_example = `# Start a single instance of nginx. -kubectl run nginx --image=nginx - -# Start a single instance of hazelcast and let the container expose port 5701 . -kubectl run hazelcast --image=hazelcast --port=5701 - -# Start a single instance of hazelcast and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container. -kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default" - -# Start a replicated instance of nginx. -kubectl run nginx --image=nginx --replicas=5 - -# Dry run. Print the corresponding API objects without creating them. -kubectl run nginx --image=nginx --dry-run - -# Start a single instance of nginx, but overload the spec of the deployment with a partial set of values parsed from JSON. -kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' - -# Start a single instance of busybox and keep it in the foreground, don't restart it if it exits. -kubectl run -i -t busybox --image=busybox --restart=Never - -# Start the nginx container using the default command, but use custom arguments (arg1 .. argN) for that command. -kubectl run nginx --image=nginx -- ... - -# Start the nginx container using a different command and custom arguments. -kubectl run nginx --image=nginx --command -- ... - -# Start the perl container to compute π to 2000 places and print it out. -kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'` -) - -func NewCmdRun(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "run NAME --image=image [--env=\"key=value\"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]", - // run-container is deprecated - Aliases: []string{"run-container"}, - Short: "Run a particular image on the cluster.", - Long: run_long, - Example: run_example, - Run: func(cmd *cobra.Command, args []string) { - argsLenAtDash := cmd.ArgsLenAtDash() - err := Run(f, cmdIn, cmdOut, cmdErr, cmd, args, argsLenAtDash) - cmdutil.CheckErr(err) - }, - } - cmdutil.AddPrinterFlags(cmd) - addRunFlags(cmd) - cmdutil.AddApplyAnnotationFlags(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func addRunFlags(cmd *cobra.Command) { - cmd.Flags().String("generator", "", "The name of the API generator to use. Default is 'deployment/v1beta1' if --restart=Always, otherwise the default is 'job/v1'. This will happen only for cluster version at least 1.2, for olders we will fallback to 'run/v1' for --restart=Always, 'run-pod/v1' for others.") - cmd.Flags().String("image", "", "The image for the container to run.") - cmd.MarkFlagRequired("image") - cmd.Flags().IntP("replicas", "r", 1, "Number of replicas to create for this container. Default is 1.") - cmd.Flags().Bool("rm", false, "If true, delete resources created in this command for attached containers.") - cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without sending it.") - cmd.Flags().String("overrides", "", "An inline JSON override for the generated object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field.") - cmd.Flags().StringSlice("env", []string{}, "Environment variables to set in the container") - cmd.Flags().Int("port", -1, "The port that this container exposes. If --expose is true, this is also the port used by the service that is created.") - cmd.Flags().Int("hostport", -1, "The host port mapping for the container port. To demonstrate a single-machine container.") - cmd.Flags().StringP("labels", "l", "", "Labels to apply to the pod(s).") - cmd.Flags().BoolP("stdin", "i", false, "Keep stdin open on the container(s) in the pod, even if nothing is attached.") - cmd.Flags().BoolP("tty", "t", false, "Allocated a TTY for each container in the pod.") - cmd.Flags().Bool("attach", false, "If true, wait for the Pod to start running, and then attach to the Pod as if 'kubectl attach ...' were called. Default false, unless '-i/--interactive' is set, in which case the default is true.") - cmd.Flags().Bool("leave-stdin-open", false, "If the pod is started in interactive mode or with stdin, leave stdin open after the first attach completes. By default, stdin will be closed after the first attach completes.") - cmd.Flags().String("restart", "Always", "The restart policy for this Pod. Legal values [Always, OnFailure, Never]. If set to 'Always' a deployment is created for this pod, if set to OnFailure or Never, a job is created for this pod and --replicas must be 1. Default 'Always'") - cmd.Flags().Bool("command", false, "If true and extra arguments are present, use them as the 'command' field in the container, rather than the 'args' field which is the default.") - cmd.Flags().String("requests", "", "The resource requirement requests for this container. For example, 'cpu=100m,memory=256Mi'. Note that server side components may assign requests depending on the server configuration, such as limit ranges.") - cmd.Flags().String("limits", "", "The resource requirement limits for this container. For example, 'cpu=200m,memory=512Mi'. Note that server side components may assign limits depending on the server configuration, such as limit ranges.") - cmd.Flags().Bool("expose", false, "If true, a public, external service is created for the container(s) which are run") - cmd.Flags().String("service-generator", "service/v2", "The name of the generator to use for creating a service. Only used if --expose is true") - cmd.Flags().String("service-overrides", "", "An inline JSON override for the generated service object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field. Only used if --expose is true.") -} - -func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobra.Command, args []string, argsLenAtDash int) error { - if len(os.Args) > 1 && os.Args[1] == "run-container" { - printDeprecationWarning("run", "run-container") - } - - // Let kubectl run follow rules for `--`, see #13004 issue - if len(args) == 0 || argsLenAtDash == 0 { - return cmdutil.UsageError(cmd, "NAME is required for run") - } - - interactive := cmdutil.GetFlagBool(cmd, "stdin") - tty := cmdutil.GetFlagBool(cmd, "tty") - if tty && !interactive { - return cmdutil.UsageError(cmd, "-i/--stdin is required for containers with -t/--tty=true") - } - replicas := cmdutil.GetFlagInt(cmd, "replicas") - if interactive && replicas != 1 { - return cmdutil.UsageError(cmd, fmt.Sprintf("-i/--stdin requires that replicas is 1, found %d", replicas)) - } - - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - restartPolicy, err := getRestartPolicy(cmd, interactive) - if err != nil { - return err - } - if restartPolicy != api.RestartPolicyAlways && replicas != 1 { - return cmdutil.UsageError(cmd, fmt.Sprintf("--restart=%s requires that --replicas=1, found %d", restartPolicy, replicas)) - } - - generatorName := cmdutil.GetFlagString(cmd, "generator") - if len(generatorName) == 0 { - client, err := f.Client() - if err != nil { - return err - } - resourcesList, err := client.Discovery().ServerResources() - if err != nil { - // this cover the cases where old servers do not expose discovery - resourcesList = nil - } - if restartPolicy == api.RestartPolicyAlways { - if contains(resourcesList, v1beta1.SchemeGroupVersion.WithResource("deployments")) { - generatorName = "deployment/v1beta1" - } else { - generatorName = "run/v1" - } - } else { - if contains(resourcesList, batchv1.SchemeGroupVersion.WithResource("jobs")) { - generatorName = "job/v1" - } else if contains(resourcesList, v1beta1.SchemeGroupVersion.WithResource("jobs")) { - generatorName = "job/v1beta1" - } else { - generatorName = "run-pod/v1" - } - } - } - generators := f.Generators("run") - generator, found := generators[generatorName] - if !found { - return cmdutil.UsageError(cmd, fmt.Sprintf("generator %q not found.", generatorName)) - } - names := generator.ParamNames() - params := kubectl.MakeParams(cmd, names) - params["name"] = args[0] - if len(args) > 1 { - params["args"] = args[1:] - } - - params["env"] = cmdutil.GetFlagStringSlice(cmd, "env") - - obj, _, mapper, mapping, err := createGeneratedObject(f, cmd, generator, names, params, cmdutil.GetFlagString(cmd, "overrides"), namespace) - if err != nil { - return err - } - - if cmdutil.GetFlagBool(cmd, "expose") { - serviceGenerator := cmdutil.GetFlagString(cmd, "service-generator") - if len(serviceGenerator) == 0 { - return cmdutil.UsageError(cmd, fmt.Sprintf("No service generator specified")) - } - if err := generateService(f, cmd, args, serviceGenerator, params, namespace, cmdOut); err != nil { - return err - } - } - - attachFlag := cmd.Flags().Lookup("attach") - attach := cmdutil.GetFlagBool(cmd, "attach") - - if !attachFlag.Changed && interactive { - attach = true - } - - remove := cmdutil.GetFlagBool(cmd, "rm") - if !attach && remove { - return cmdutil.UsageError(cmd, "--rm should only be used for attached containers") - } - - if attach { - opts := &AttachOptions{ - In: cmdIn, - Out: cmdOut, - Err: cmdErr, - Stdin: interactive, - TTY: tty, - - Attach: &DefaultRemoteAttach{}, - } - config, err := f.ClientConfig() - if err != nil { - return err - } - opts.Config = config - - client, err := f.Client() - if err != nil { - return err - } - opts.Client = client - - attachablePod, err := f.AttachablePodForObject(obj) - if err != nil { - return err - } - err = handleAttachPod(f, client, attachablePod, opts) - if err != nil { - return err - } - - if remove { - namespace, err = mapping.MetadataAccessor.Namespace(obj) - if err != nil { - return err - } - var name string - name, err = mapping.MetadataAccessor.Name(obj) - if err != nil { - return err - } - _, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(namespace).DefaultNamespace(). - ResourceNames(mapping.Resource, name). - Flatten(). - Do() - return ReapResult(r, f, cmdOut, true, true, 0, -1, false, mapper) - } - return nil - } - - outputFormat := cmdutil.GetFlagString(cmd, "output") - if outputFormat != "" { - return f.PrintObject(cmd, mapper, obj, cmdOut) - } - cmdutil.PrintSuccess(mapper, false, cmdOut, mapping.Resource, args[0], "created") - return nil -} - -// TODO turn this into reusable method checking available resources -func contains(resourcesList map[string]*unversioned.APIResourceList, resource unversioned.GroupVersionResource) bool { - if resourcesList == nil { - return false - } - resourcesGroup, ok := resourcesList[resource.GroupVersion().String()] - if !ok { - return false - } - for _, item := range resourcesGroup.APIResources { - if resource.Resource == item.Name { - return true - } - } - return false -} - -func waitForPodRunning(c *client.Client, pod *api.Pod, out io.Writer) (status api.PodPhase, err error) { - for { - pod, err := c.Pods(pod.Namespace).Get(pod.Name) - if err != nil { - return api.PodUnknown, err - } - ready := false - if pod.Status.Phase == api.PodRunning { - ready = true - for _, status := range pod.Status.ContainerStatuses { - if !status.Ready { - ready = false - break - } - } - if ready { - return api.PodRunning, nil - } - } - if pod.Status.Phase == api.PodSucceeded || pod.Status.Phase == api.PodFailed { - return pod.Status.Phase, nil - } - fmt.Fprintf(out, "Waiting for pod %s/%s to be running, status is %s, pod ready: %v\n", pod.Namespace, pod.Name, pod.Status.Phase, ready) - time.Sleep(2 * time.Second) - continue - } -} - -func handleAttachPod(f *cmdutil.Factory, c *client.Client, pod *api.Pod, opts *AttachOptions) error { - status, err := waitForPodRunning(c, pod, opts.Out) - if err != nil { - return err - } - if status == api.PodSucceeded || status == api.PodFailed { - req, err := f.LogsForObject(pod, &api.PodLogOptions{Container: opts.GetContainerName(pod)}) - if err != nil { - return err - } - readCloser, err := req.Stream() - if err != nil { - return err - } - defer readCloser.Close() - _, err = io.Copy(opts.Out, readCloser) - return err - } - opts.Client = c - opts.PodName = pod.Name - opts.Namespace = pod.Namespace - opts.CommandName = "kubectl attach" - if err := opts.Run(); err != nil { - fmt.Fprintf(opts.Out, "Error attaching, falling back to logs: %v\n", err) - req, err := f.LogsForObject(pod, &api.PodLogOptions{Container: opts.GetContainerName(pod)}) - if err != nil { - return err - } - readCloser, err := req.Stream() - if err != nil { - return err - } - defer readCloser.Close() - _, err = io.Copy(opts.Out, readCloser) - return err - } - return nil -} - -func getRestartPolicy(cmd *cobra.Command, interactive bool) (api.RestartPolicy, error) { - restart := cmdutil.GetFlagString(cmd, "restart") - if len(restart) == 0 { - if interactive { - return api.RestartPolicyOnFailure, nil - } else { - return api.RestartPolicyAlways, nil - } - } - switch api.RestartPolicy(restart) { - case api.RestartPolicyAlways: - return api.RestartPolicyAlways, nil - case api.RestartPolicyOnFailure: - return api.RestartPolicyOnFailure, nil - case api.RestartPolicyNever: - return api.RestartPolicyNever, nil - default: - return "", cmdutil.UsageError(cmd, fmt.Sprintf("invalid restart policy: %s", restart)) - } -} - -func generateService(f *cmdutil.Factory, cmd *cobra.Command, args []string, serviceGenerator string, paramsIn map[string]interface{}, namespace string, out io.Writer) error { - generators := f.Generators("expose") - generator, found := generators[serviceGenerator] - if !found { - return fmt.Errorf("missing service generator: %s", serviceGenerator) - } - names := generator.ParamNames() - - port := cmdutil.GetFlagInt(cmd, "port") - if port < 1 { - return fmt.Errorf("--port must be a positive integer when exposing a service") - } - - params := map[string]interface{}{} - for key, value := range paramsIn { - _, isString := value.(string) - if isString { - params[key] = value - } - } - - name, found := params["name"] - if !found || len(name.(string)) == 0 { - return fmt.Errorf("name is a required parameter") - } - selector, found := params["labels"] - if !found || len(selector.(string)) == 0 { - selector = fmt.Sprintf("run=%s", name.(string)) - } - params["selector"] = selector - - if defaultName, found := params["default-name"]; !found || len(defaultName.(string)) == 0 { - params["default-name"] = name - } - - obj, _, mapper, mapping, err := createGeneratedObject(f, cmd, generator, names, params, cmdutil.GetFlagString(cmd, "service-overrides"), namespace) - if err != nil { - return err - } - - if cmdutil.GetFlagString(cmd, "output") != "" { - return f.PrintObject(cmd, mapper, obj, out) - } - cmdutil.PrintSuccess(mapper, false, out, mapping.Resource, args[0], "created") - - return nil -} - -func createGeneratedObject(f *cmdutil.Factory, cmd *cobra.Command, generator kubectl.Generator, names []kubectl.GeneratorParam, params map[string]interface{}, overrides, namespace string) (runtime.Object, string, meta.RESTMapper, *meta.RESTMapping, error) { - err := kubectl.ValidateParams(names, params) - if err != nil { - return nil, "", nil, nil, err - } - - // TODO: Validate flag usage against selected generator. More tricky since --expose was added. - obj, err := generator.Generate(params) - if err != nil { - return nil, "", nil, nil, err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - groupVersionKind, err := typer.ObjectKind(obj) - if err != nil { - return nil, "", nil, nil, err - } - - if len(overrides) > 0 { - codec := runtime.NewCodec(f.JSONEncoder(), f.Decoder(true)) - obj, err = cmdutil.Merge(codec, obj, overrides, groupVersionKind.Kind) - if err != nil { - return nil, "", nil, nil, err - } - } - - mapping, err := mapper.RESTMapping(groupVersionKind.GroupKind(), groupVersionKind.Version) - if err != nil { - return nil, "", nil, nil, err - } - client, err := f.ClientForMapping(mapping) - if err != nil { - return nil, "", nil, nil, err - } - - annotations, err := mapping.MetadataAccessor.Annotations(obj) - if err != nil { - return nil, "", nil, nil, err - } - if cmdutil.GetRecordFlag(cmd) || len(annotations[kubectl.ChangeCauseAnnotation]) > 0 { - if err := cmdutil.RecordChangeCause(obj, f.Command()); err != nil { - return nil, "", nil, nil, err - } - } - // TODO: extract this flag to a central location, when such a location exists. - if !cmdutil.GetFlagBool(cmd, "dry-run") { - resourceMapper := &resource.Mapper{ - ObjectTyper: typer, - RESTMapper: mapper, - ClientMapper: resource.ClientMapperFunc(f.ClientForMapping), - Decoder: f.Decoder(true), - } - info, err := resourceMapper.InfoForObject(obj, nil) - if err != nil { - return nil, "", nil, nil, err - } - - if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), info, f.JSONEncoder()); err != nil { - return nil, "", nil, nil, err - } - - obj, err = resource.NewHelper(client, mapping).Create(namespace, false, info.Object) - if err != nil { - return nil, "", nil, nil, err - } - } - return obj, groupVersionKind.Kind, mapper, mapping, err -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run_test.go deleted file mode 100644 index 1894deca8..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/run_test.go +++ /dev/null @@ -1,332 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "os" - "reflect" - "testing" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/client/restclient" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/intstr" -) - -func TestGetRestartPolicy(t *testing.T) { - tests := []struct { - input string - interactive bool - expected api.RestartPolicy - expectErr bool - }{ - { - input: "", - expected: api.RestartPolicyAlways, - }, - { - input: "", - interactive: true, - expected: api.RestartPolicyOnFailure, - }, - { - input: string(api.RestartPolicyAlways), - interactive: true, - expected: api.RestartPolicyAlways, - }, - { - input: string(api.RestartPolicyNever), - interactive: true, - expected: api.RestartPolicyNever, - }, - { - input: string(api.RestartPolicyAlways), - expected: api.RestartPolicyAlways, - }, - { - input: string(api.RestartPolicyNever), - expected: api.RestartPolicyNever, - }, - { - input: "foo", - expectErr: true, - }, - } - for _, test := range tests { - cmd := &cobra.Command{} - cmd.Flags().String("restart", "", "dummy restart flag") - cmd.Flags().Lookup("restart").Value.Set(test.input) - policy, err := getRestartPolicy(cmd, test.interactive) - if test.expectErr && err == nil { - t.Error("unexpected non-error") - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if !test.expectErr && policy != test.expected { - t.Errorf("expected: %s, saw: %s (%s:%v)", test.expected, policy, test.input, test.interactive) - } - } -} - -func TestGetEnv(t *testing.T) { - test := struct { - input []string - expected []string - }{ - input: []string{"a=b", "c=d"}, - expected: []string{"a=b", "c=d"}, - } - cmd := &cobra.Command{} - cmd.Flags().StringSlice("env", test.input, "") - - envStrings := cmdutil.GetFlagStringSlice(cmd, "env") - if len(envStrings) != 2 || !reflect.DeepEqual(envStrings, test.expected) { - t.Errorf("expected: %s, saw: %s", test.expected, envStrings) - } -} - -func TestRunArgsFollowDashRules(t *testing.T) { - _, _, rc := testData() - - tests := []struct { - args []string - argsLenAtDash int - expectError bool - name string - }{ - { - args: []string{}, - argsLenAtDash: -1, - expectError: true, - name: "empty", - }, - { - args: []string{"foo"}, - argsLenAtDash: -1, - expectError: false, - name: "no cmd", - }, - { - args: []string{"foo", "sleep"}, - argsLenAtDash: -1, - expectError: false, - name: "cmd no dash", - }, - { - args: []string{"foo", "sleep"}, - argsLenAtDash: 1, - expectError: false, - name: "cmd has dash", - }, - { - args: []string{"foo", "sleep"}, - argsLenAtDash: 0, - expectError: true, - name: "no name", - }, - } - for _, test := range tests { - f, tf, codec := NewAPIFactory() - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - return &http.Response{StatusCode: 201, Body: objBody(codec, &rc.Items[0])}, nil - }), - } - tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{} - cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) - cmd.Flags().Set("image", "nginx") - cmd.Flags().Set("generator", "run/v1") - err := Run(f, os.Stdin, os.Stdout, os.Stderr, cmd, test.args, test.argsLenAtDash) - if test.expectError && err == nil { - t.Errorf("unexpected non-error (%s)", test.name) - } - if !test.expectError && err != nil { - t.Errorf("unexpected error: %v (%s)", err, test.name) - } - } -} - -func TestGenerateService(t *testing.T) { - - tests := []struct { - port string - args []string - serviceGenerator string - params map[string]interface{} - expectErr bool - name string - service api.Service - expectPOST bool - }{ - { - port: "80", - args: []string{"foo"}, - serviceGenerator: "service/v2", - params: map[string]interface{}{ - "name": "foo", - }, - expectErr: false, - name: "basic", - service: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(80), - }, - }, - Selector: map[string]string{ - "run": "foo", - }, - Type: api.ServiceTypeClusterIP, - SessionAffinity: api.ServiceAffinityNone, - }, - }, - expectPOST: true, - }, - { - port: "80", - args: []string{"foo"}, - serviceGenerator: "service/v2", - params: map[string]interface{}{ - "name": "foo", - "labels": "app=bar", - }, - expectErr: false, - name: "custom labels", - service: api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - Labels: map[string]string{"app": "bar"}, - }, - Spec: api.ServiceSpec{ - Ports: []api.ServicePort{ - { - Port: 80, - Protocol: "TCP", - TargetPort: intstr.FromInt(80), - }, - }, - Selector: map[string]string{ - "app": "bar", - }, - Type: api.ServiceTypeClusterIP, - SessionAffinity: api.ServiceAffinityNone, - }, - }, - expectPOST: true, - }, - { - expectErr: true, - name: "missing port", - expectPOST: false, - }, - { - port: "80", - args: []string{"foo"}, - serviceGenerator: "service/v2", - params: map[string]interface{}{ - "name": "foo", - }, - expectErr: false, - name: "dry-run", - expectPOST: false, - }, - } - for _, test := range tests { - sawPOST := false - f, tf, codec := NewAPIFactory() - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}} - tf.Client = &fake.RESTClient{ - Codec: codec, - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case test.expectPOST && m == "POST" && p == "/namespaces/namespace/services": - sawPOST = true - body := objBody(codec, &test.service) - data, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() - } - defer req.Body.Close() - svc := &api.Service{} - if err := runtime.DecodeInto(codec, data, svc); err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() - } - // Copy things that are defaulted by the system - test.service.Annotations = svc.Annotations - - if !reflect.DeepEqual(&test.service, svc) { - t.Errorf("expected:\n%v\nsaw:\n%v\n", &test.service, svc) - } - return &http.Response{StatusCode: 200, Body: body}, nil - default: - // Ensures no GET is performed when deleting by name - t.Errorf("%s: unexpected request: %s %#v\n%#v", test.name, req.Method, req.URL, req) - return nil, fmt.Errorf("unexpected request") - } - }), - } - cmd := &cobra.Command{} - cmd.Flags().String("output", "", "") - cmd.Flags().Bool(cmdutil.ApplyAnnotationsFlag, false, "") - cmd.Flags().Bool("record", false, "Record current kubectl command in the resource annotation.") - cmdutil.AddInclude3rdPartyFlags(cmd) - addRunFlags(cmd) - - if !test.expectPOST { - cmd.Flags().Set("dry-run", "true") - } - - if len(test.port) > 0 { - cmd.Flags().Set("port", test.port) - test.params["port"] = test.port - } - - buff := &bytes.Buffer{} - err := generateService(f, cmd, test.args, test.serviceGenerator, test.params, "namespace", buff) - if test.expectErr { - if err == nil { - t.Error("unexpected non-error") - } - continue - } - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectPOST != sawPOST { - t.Errorf("expectPost: %v, sawPost: %v", test.expectPOST, sawPOST) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/scale.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/scale.go deleted file mode 100644 index bbd629a7d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/scale.go +++ /dev/null @@ -1,188 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - "os" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" -) - -// ScaleOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type ScaleOptions struct { - Filenames []string - Recursive bool -} - -const ( - scale_long = `Set a new size for a Deployment, ReplicaSet, Replication Controller, or Job. - -Scale also allows users to specify one or more preconditions for the scale action. -If --current-replicas or --resource-version is specified, it is validated before the -scale is attempted, and it is guaranteed that the precondition holds true when the -scale is sent to the server.` - scale_example = `# Scale a replicaset named 'foo' to 3. -kubectl scale --replicas=3 rs/foo - -# Scale a resource identified by type and name specified in "foo.yaml" to 3. -kubectl scale --replicas=3 -f foo.yaml - -# If the deployment named mysql's current size is 2, scale mysql to 3. -kubectl scale --current-replicas=2 --replicas=3 deployment/mysql - -# Scale multiple replication controllers. -kubectl scale --replicas=5 rc/foo rc/bar rc/baz - -# Scale job named 'cron' to 3. -kubectl scale --replicas=3 job/cron` -) - -// NewCmdScale returns a cobra command with the appropriate configuration and flags to run scale -func NewCmdScale(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &ScaleOptions{} - - cmd := &cobra.Command{ - Use: "scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)", - // resize is deprecated - Aliases: []string{"resize"}, - Short: "Set a new size for a Deployment, ReplicaSet, Replication Controller, or Job.", - Long: scale_long, - Example: scale_example, - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - err := RunScale(f, out, cmd, args, shortOutput, options) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().String("resource-version", "", "Precondition for resource version. Requires that the current resource version match this value in order to scale.") - cmd.Flags().Int("current-replicas", -1, "Precondition for current size. Requires that the current size of the resource match this value in order to scale.") - cmd.Flags().Int("replicas", -1, "The new desired number of replicas. Required.") - cmd.MarkFlagRequired("replicas") - cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a scale operation, zero means don't wait.") - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddRecordFlag(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - - usage := "Filename, directory, or URL to a file identifying the resource to set a new size" - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - return cmd -} - -// RunScale executes the scaling -func RunScale(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, shortOutput bool, options *ScaleOptions) error { - if len(os.Args) > 1 && os.Args[1] == "resize" { - printDeprecationWarning("scale", "resize") - } - - count := cmdutil.GetFlagInt(cmd, "replicas") - if count < 0 { - return cmdutil.UsageError(cmd, "--replicas=COUNT is required, and COUNT must be greater than or equal to 0") - } - - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - ResourceTypeOrNameArgs(false, args...). - Flatten(). - Do() - err = r.Err() - if err != nil { - return err - } - - infos := []*resource.Info{} - err = r.Visit(func(info *resource.Info, err error) error { - if err == nil { - infos = append(infos, info) - } - return nil - }) - - resourceVersion := cmdutil.GetFlagString(cmd, "resource-version") - if len(resourceVersion) != 0 && len(infos) > 1 { - return fmt.Errorf("cannot use --resource-version with multiple resources") - } - - counter := 0 - err = r.Visit(func(info *resource.Info, err error) error { - if err != nil { - return err - } - - mapping := info.ResourceMapping() - scaler, err := f.Scaler(mapping) - if err != nil { - return err - } - - currentSize := cmdutil.GetFlagInt(cmd, "current-replicas") - precondition := &kubectl.ScalePrecondition{Size: currentSize, ResourceVersion: resourceVersion} - retry := kubectl.NewRetryParams(kubectl.Interval, kubectl.Timeout) - - var waitForReplicas *kubectl.RetryParams - if timeout := cmdutil.GetFlagDuration(cmd, "timeout"); timeout != 0 { - waitForReplicas = kubectl.NewRetryParams(kubectl.Interval, timeout) - } - - if err := scaler.Scale(info.Namespace, info.Name, uint(count), precondition, retry, waitForReplicas); err != nil { - return err - } - if cmdutil.ShouldRecord(cmd, info) { - patchBytes, err := cmdutil.ChangeResourcePatch(info, f.Command()) - if err != nil { - return err - } - mapping := info.ResourceMapping() - client, err := f.ClientForMapping(mapping) - if err != nil { - return err - } - helper := resource.NewHelper(client, mapping) - _, err = helper.Patch(info.Namespace, info.Name, api.StrategicMergePatchType, patchBytes) - if err != nil { - return err - } - } - counter++ - cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, "scaled") - return nil - }) - if err != nil { - return err - } - if counter == 0 { - return fmt.Errorf("no objects passed to scale") - } - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/stop.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/stop.go deleted file mode 100644 index fc25be9ae..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/stop.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" -) - -// StopOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of -// referencing the cmd.Flags() -type StopOptions struct { - Filenames []string - Recursive bool -} - -const ( - stop_long = `Deprecated: Gracefully shut down a resource by name or filename. - -The stop command is deprecated, all its functionalities are covered by delete command. -See 'kubectl delete --help' for more details. - -Attempts to shut down and delete a resource that supports graceful termination. -If the resource is scalable it will be scaled to 0 before deletion.` - stop_example = `# Shut down foo. -kubectl stop replicationcontroller foo - -# Stop pods and services with label name=myLabel. -kubectl stop pods,services -l name=myLabel - -# Shut down the service defined in service.json -kubectl stop -f service.json - -# Shut down all resources in the path/to/resources directory -kubectl stop -f path/to/resources` -) - -func NewCmdStop(f *cmdutil.Factory, out io.Writer) *cobra.Command { - options := &StopOptions{} - - cmd := &cobra.Command{ - Use: "stop (-f FILENAME | TYPE (NAME | -l label | --all))", - Short: "Deprecated: Gracefully shut down a resource by name or filename.", - Long: stop_long, - Example: stop_example, - Deprecated: fmt.Sprintf("use %q instead.", "delete"), - Run: func(cmd *cobra.Command, args []string) { - cmdutil.CheckErr(cmdutil.ValidateOutputArgs(cmd)) - cmdutil.CheckErr(RunStop(f, cmd, args, out, options)) - }, - } - usage := "Filename, directory, or URL to file of resource(s) to be stopped." - kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) - cmdutil.AddRecursiveFlag(cmd, &options.Recursive) - cmd.Flags().StringP("selector", "l", "", "Selector (label query) to filter on.") - cmd.Flags().Bool("all", false, "[-all] to select all the specified resources.") - cmd.Flags().Bool("ignore-not-found", false, "Treat \"resource not found\" as a successful stop.") - cmd.Flags().Int("grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") - cmd.Flags().Duration("timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") - cmdutil.AddOutputFlagsForMutation(cmd) - cmdutil.AddInclude3rdPartyFlags(cmd) - return cmd -} - -func RunStop(f *cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer, options *StopOptions) error { - cmdNamespace, enforceNamespace, err := f.DefaultNamespace() - if err != nil { - return err - } - - mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - r := resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). - ContinueOnError(). - NamespaceParam(cmdNamespace).DefaultNamespace(). - ResourceTypeOrNameArgs(false, args...). - FilenameParam(enforceNamespace, options.Recursive, options.Filenames...). - SelectorParam(cmdutil.GetFlagString(cmd, "selector")). - SelectAllParam(cmdutil.GetFlagBool(cmd, "all")). - Flatten(). - Do() - if r.Err() != nil { - return r.Err() - } - shortOutput := cmdutil.GetFlagString(cmd, "output") == "name" - return ReapResult(r, f, out, false, cmdutil.GetFlagBool(cmd, "ignore-not-found"), cmdutil.GetFlagDuration(cmd, "timeout"), cmdutil.GetFlagInt(cmd, "grace-period"), shortOutput, mapper) -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor.go deleted file mode 100644 index 1c58d846b..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor.go +++ /dev/null @@ -1,192 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 editor - -import ( - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "github.com/golang/glog" - - "k8s.io/kubernetes/pkg/util/term" -) - -const ( - // sorry, blame Git - // TODO: on Windows rely on 'start' to launch the editor associated - // with the given file type. If we can't because of the need of - // blocking, use a script with 'ftype' and 'assoc' to detect it. - defaultEditor = "vi" - defaultShell = "/bin/bash" - windowsEditor = "notepad" - windowsShell = "cmd" -) - -type Editor struct { - Args []string - Shell bool -} - -// NewDefaultEditor creates a struct Editor that uses the OS environment to -// locate the editor program, looking at EDITOR environment variable to find -// the proper command line. If the provided editor has no spaces, or no quotes, -// it is treated as a bare command to be loaded. Otherwise, the string will -// be passed to the user's shell for execution. -func NewDefaultEditor(envs []string) Editor { - args, shell := defaultEnvEditor(envs) - return Editor{ - Args: args, - Shell: shell, - } -} - -func defaultEnvShell() []string { - shell := os.Getenv("SHELL") - if len(shell) == 0 { - shell = platformize(defaultShell, windowsShell) - } - flag := "-c" - if shell == windowsShell { - flag = "/C" - } - return []string{shell, flag} -} - -func defaultEnvEditor(envs []string) ([]string, bool) { - var editor string - for _, env := range envs { - if len(env) > 0 { - editor = os.Getenv(env) - } - if len(editor) > 0 { - break - } - } - if len(editor) == 0 { - editor = platformize(defaultEditor, windowsEditor) - } - if !strings.Contains(editor, " ") { - return []string{editor}, false - } - if !strings.ContainsAny(editor, "\"'\\") { - return strings.Split(editor, " "), false - } - // rather than parse the shell arguments ourselves, punt to the shell - shell := defaultEnvShell() - return append(shell, editor), true -} - -func (e Editor) args(path string) []string { - args := make([]string, len(e.Args)) - copy(args, e.Args) - if e.Shell { - last := args[len(args)-1] - args[len(args)-1] = fmt.Sprintf("%s %q", last, path) - } else { - args = append(args, path) - } - return args -} - -// Launch opens the described or returns an error. The TTY will be protected, and -// SIGQUIT, SIGTERM, and SIGINT will all be trapped. -func (e Editor) Launch(path string) error { - if len(e.Args) == 0 { - return fmt.Errorf("no editor defined, can't open %s", path) - } - abs, err := filepath.Abs(path) - if err != nil { - return err - } - args := e.args(abs) - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - glog.V(5).Infof("Opening file with editor %v", args) - if err := (term.TTY{In: os.Stdin, TryDev: true}).Safe(cmd.Run); err != nil { - if err, ok := err.(*exec.Error); ok { - if err.Err == exec.ErrNotFound { - return fmt.Errorf("unable to launch the editor %q", strings.Join(e.Args, " ")) - } - } - return fmt.Errorf("there was a problem with the editor %q", strings.Join(e.Args, " ")) - } - return nil -} - -// LaunchTempFile reads the provided stream into a temporary file in the given directory -// and file prefix, and then invokes Launch with the path of that file. It will return -// the contents of the file after launch, any errors that occur, and the path of the -// temporary file so the caller can clean it up as needed. -func (e Editor) LaunchTempFile(prefix, suffix string, r io.Reader) ([]byte, string, error) { - f, err := tempFile(prefix, suffix) - if err != nil { - return nil, "", err - } - defer f.Close() - path := f.Name() - if _, err := io.Copy(f, r); err != nil { - os.Remove(path) - return nil, path, err - } - // This file descriptor needs to close so the next process (Launch) can claim it. - f.Close() - if err := e.Launch(path); err != nil { - return nil, path, err - } - bytes, err := ioutil.ReadFile(path) - return bytes, path, err -} - -func tempFile(prefix, suffix string) (f *os.File, err error) { - dir := os.TempDir() - - for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+randSeq(5)+suffix) - f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - continue - } - break - } - return -} - -var letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789") - -func randSeq(n int) string { - b := make([]rune, n) - for i := range b { - b[i] = letters[rand.Intn(len(letters))] - } - return string(b) -} - -func platformize(linux, windows string) string { - if runtime.GOOS == "windows" { - return windows - } - return linux -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor_test.go deleted file mode 100644 index 9be83a042..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/editor/editor_test.go +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 editor - -import ( - "bytes" - "io/ioutil" - "os" - "reflect" - "strings" - "testing" -) - -func TestArgs(t *testing.T) { - if e, a := []string{"/bin/bash", "-c \"test\""}, (Editor{Args: []string{"/bin/bash", "-c"}, Shell: true}).args("test"); !reflect.DeepEqual(e, a) { - t.Errorf("unexpected args: %v", a) - } - if e, a := []string{"/bin/bash", "-c", "test"}, (Editor{Args: []string{"/bin/bash", "-c"}, Shell: false}).args("test"); !reflect.DeepEqual(e, a) { - t.Errorf("unexpected args: %v", a) - } - if e, a := []string{"/bin/bash", "-i -c \"test\""}, (Editor{Args: []string{"/bin/bash", "-i -c"}, Shell: true}).args("test"); !reflect.DeepEqual(e, a) { - t.Errorf("unexpected args: %v", a) - } - if e, a := []string{"/test", "test"}, (Editor{Args: []string{"/test"}}).args("test"); !reflect.DeepEqual(e, a) { - t.Errorf("unexpected args: %v", a) - } -} - -func TestEditor(t *testing.T) { - edit := Editor{Args: []string{"cat"}} - testStr := "test something\n" - contents, path, err := edit.LaunchTempFile("", "someprefix", bytes.NewBufferString(testStr)) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if _, err := os.Stat(path); err != nil { - t.Fatalf("no temp file: %s", path) - } - defer os.Remove(path) - if disk, err := ioutil.ReadFile(path); err != nil || !bytes.Equal(contents, disk) { - t.Errorf("unexpected file on disk: %v %s", err, string(disk)) - } - if !bytes.Equal(contents, []byte(testStr)) { - t.Errorf("unexpected contents: %s", string(contents)) - } - if !strings.Contains(path, "someprefix") { - t.Errorf("path not expected: %s", path) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_test.go deleted file mode 100644 index 07fb3a7fd..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory_test.go +++ /dev/null @@ -1,577 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "os" - "os/user" - "path" - "reflect" - "sort" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/validation" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - "k8s.io/kubernetes/pkg/client/unversioned/fake" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" - "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/kubectl" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/flag" - "k8s.io/kubernetes/pkg/watch" -) - -func TestNewFactoryDefaultFlagBindings(t *testing.T) { - factory := NewFactory(nil) - - if !factory.flags.HasFlags() { - t.Errorf("Expected flags, but didn't get any") - } -} - -func TestNewFactoryNoFlagBindings(t *testing.T) { - clientConfig := clientcmd.NewDefaultClientConfig(*clientcmdapi.NewConfig(), &clientcmd.ConfigOverrides{}) - factory := NewFactory(clientConfig) - - if factory.flags.HasFlags() { - t.Errorf("Expected zero flags, but got %v", factory.flags) - } -} - -func TestPortsForObject(t *testing.T) { - f := NewFactory(nil) - - pod := &api.Pod{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Ports: []api.ContainerPort{ - { - ContainerPort: 101, - }, - }, - }, - }, - }, - } - - expected := []string{"101"} - got, err := f.PortsForObject(pod) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if len(expected) != len(got) { - t.Fatalf("Ports size mismatch! Expected %d, got %d", len(expected), len(got)) - } - - sort.Strings(expected) - sort.Strings(got) - - for i, port := range got { - if port != expected[i] { - t.Fatalf("Port mismatch! Expected %s, got %s", expected[i], port) - } - } -} - -func TestLabelsForObject(t *testing.T) { - f := NewFactory(nil) - - tests := []struct { - name string - object runtime.Object - expected string - err error - }{ - { - name: "successful re-use of labels", - object: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "baz", Namespace: "test", Labels: map[string]string{"svc": "test"}}, - TypeMeta: unversioned.TypeMeta{Kind: "Service", APIVersion: "v1"}, - }, - expected: "svc=test", - err: nil, - }, - { - name: "empty labels", - object: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "test", Labels: map[string]string{}}, - TypeMeta: unversioned.TypeMeta{Kind: "Service", APIVersion: "v1"}, - }, - expected: "", - err: nil, - }, - { - name: "nil labels", - object: &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "zen", Namespace: "test", Labels: nil}, - TypeMeta: unversioned.TypeMeta{Kind: "Service", APIVersion: "v1"}, - }, - expected: "", - err: nil, - }, - } - - for _, test := range tests { - gotLabels, err := f.LabelsForObject(test.object) - if err != test.err { - t.Fatalf("%s: Error mismatch: Expected %v, got %v", test.name, test.err, err) - } - got := kubectl.MakeLabels(gotLabels) - if test.expected != got { - t.Fatalf("%s: Labels mismatch! Expected %s, got %s", test.name, test.expected, got) - } - - } -} - -func TestCanBeExposed(t *testing.T) { - factory := NewFactory(nil) - tests := []struct { - kind unversioned.GroupKind - expectErr bool - }{ - { - kind: api.Kind("ReplicationController"), - expectErr: false, - }, - { - kind: api.Kind("Node"), - expectErr: true, - }, - } - - for _, test := range tests { - err := factory.CanBeExposed(test.kind) - if test.expectErr && err == nil { - t.Error("unexpected non-error") - } - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - } -} - -func TestFlagUnderscoreRenaming(t *testing.T) { - factory := NewFactory(nil) - - factory.flags.SetNormalizeFunc(flag.WordSepNormalizeFunc) - factory.flags.Bool("valid_flag", false, "bool value") - - // In case of failure of this test check this PR: spf13/pflag#23 - if factory.flags.Lookup("valid_flag").Name != "valid-flag" { - t.Fatalf("Expected flag name to be valid-flag, got %s", factory.flags.Lookup("valid_flag").Name) - } -} - -func loadSchemaForTest() (validation.Schema, error) { - pathToSwaggerSpec := "../../../../api/swagger-spec/" + testapi.Default.GroupVersion().Version + ".json" - data, err := ioutil.ReadFile(pathToSwaggerSpec) - if err != nil { - return nil, err - } - return validation.NewSwaggerSchemaFromBytes(data) -} - -func TestRefetchSchemaWhenValidationFails(t *testing.T) { - schema, err := loadSchemaForTest() - if err != nil { - t.Errorf("Error loading schema: %v", err) - t.FailNow() - } - output, err := json.Marshal(schema) - if err != nil { - t.Errorf("Error serializing schema: %v", err) - t.FailNow() - } - requests := map[string]int{} - - c := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case strings.HasPrefix(p, "/swaggerapi") && m == "GET": - requests[p] = requests[p] + 1 - return &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewBuffer(output))}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - dir := os.TempDir() + "/schemaCache" - os.RemoveAll(dir) - - fullDir, err := substituteUserHome(dir) - if err != nil { - t.Errorf("Error getting fullDir: %v", err) - t.FailNow() - } - cacheFile := path.Join(fullDir, "foo", "bar", schemaFileName) - err = writeSchemaFile(output, fullDir, cacheFile, "foo", "bar") - if err != nil { - t.Errorf("Error building old cache schema: %v", err) - t.FailNow() - } - - obj := &extensions.Deployment{} - data, err := runtime.Encode(testapi.Extensions.Codec(), obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() - } - - // Re-get request, should use HTTP and write - if getSchemaAndValidate(c, data, "foo", "bar", dir); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if requests["/swaggerapi/foo/bar"] != 1 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo/bar"]) - } -} - -func TestValidateCachesSchema(t *testing.T) { - schema, err := loadSchemaForTest() - if err != nil { - t.Errorf("Error loading schema: %v", err) - t.FailNow() - } - output, err := json.Marshal(schema) - if err != nil { - t.Errorf("Error serializing schema: %v", err) - t.FailNow() - } - requests := map[string]int{} - - c := &fake.RESTClient{ - Codec: testapi.Default.Codec(), - Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { - switch p, m := req.URL.Path, req.Method; { - case strings.HasPrefix(p, "/swaggerapi") && m == "GET": - requests[p] = requests[p] + 1 - return &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewBuffer(output))}, nil - default: - t.Fatalf("unexpected request: %#v\n%#v", req.URL, req) - return nil, nil - } - }), - } - dir := os.TempDir() + "/schemaCache" - os.RemoveAll(dir) - - obj := &api.Pod{} - data, err := runtime.Encode(testapi.Default.Codec(), obj) - if err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() - } - - // Initial request, should use HTTP and write - if getSchemaAndValidate(c, data, "foo", "bar", dir); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if _, err := os.Stat(path.Join(dir, "foo", "bar", schemaFileName)); err != nil { - t.Errorf("unexpected missing cache file: %v", err) - } - if requests["/swaggerapi/foo/bar"] != 1 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo/bar"]) - } - - // Same version and group, should skip HTTP - if getSchemaAndValidate(c, data, "foo", "bar", dir); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if requests["/swaggerapi/foo/bar"] != 2 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo/bar"]) - } - - // Different API group, should go to HTTP and write - if getSchemaAndValidate(c, data, "foo", "baz", dir); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if _, err := os.Stat(path.Join(dir, "foo", "baz", schemaFileName)); err != nil { - t.Errorf("unexpected missing cache file: %v", err) - } - if requests["/swaggerapi/foo/baz"] != 1 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo/baz"]) - } - - // Different version, should go to HTTP and write - if getSchemaAndValidate(c, data, "foo2", "bar", dir); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if _, err := os.Stat(path.Join(dir, "foo2", "bar", schemaFileName)); err != nil { - t.Errorf("unexpected missing cache file: %v", err) - } - if requests["/swaggerapi/foo2/bar"] != 1 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo2/bar"]) - } - - // No cache dir, should go straight to HTTP and not write - if getSchemaAndValidate(c, data, "foo", "blah", ""); err != nil { - t.Errorf("unexpected error validating: %v", err) - } - if requests["/swaggerapi/foo/blah"] != 1 { - t.Errorf("expected 1 schema request, saw: %d", requests["/swaggerapi/foo/blah"]) - } - if _, err := os.Stat(path.Join(dir, "foo", "blah", schemaFileName)); err == nil || !os.IsNotExist(err) { - t.Errorf("unexpected cache file error: %v", err) - } -} - -func TestSubstitueUser(t *testing.T) { - usr, err := user.Current() - if err != nil { - t.Logf("SKIPPING TEST: unexpected error: %v", err) - return - } - tests := []struct { - input string - expected string - expectErr bool - }{ - {input: "~/foo", expected: path.Join(os.Getenv("HOME"), "foo")}, - {input: "~" + usr.Username + "/bar", expected: usr.HomeDir + "/bar"}, - {input: "/foo/bar", expected: "/foo/bar"}, - {input: "~doesntexit/bar", expectErr: true}, - } - for _, test := range tests { - output, err := substituteUserHome(test.input) - if test.expectErr { - if err == nil { - t.Error("unexpected non-error") - } - continue - } - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if output != test.expected { - t.Errorf("expected: %s, saw: %s", test.expected, output) - } - } -} - -func newPodList(count, isUnready, isUnhealthy int, labels map[string]string) *api.PodList { - pods := []api.Pod{} - for i := 0; i < count; i++ { - newPod := api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: fmt.Sprintf("pod-%d", i+1), - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, i, 0, time.UTC), - Labels: labels, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - }, - } - pods = append(pods, newPod) - } - if isUnready > -1 && isUnready < count { - pods[isUnready].Status.Conditions[0].Status = api.ConditionFalse - } - if isUnhealthy > -1 && isUnhealthy < count { - pods[isUnhealthy].Status.ContainerStatuses = []api.ContainerStatus{{RestartCount: 5}} - } - return &api.PodList{ - Items: pods, - } -} - -func TestGetFirstPod(t *testing.T) { - labelSet := map[string]string{"test": "selector"} - tests := []struct { - name string - - podList *api.PodList - watching []watch.Event - sortBy func([]*api.Pod) sort.Interface - - expected *api.Pod - expectedNum int - expectedErr bool - }{ - { - name: "kubectl logs - two ready pods", - podList: newPodList(2, -1, -1, labelSet), - sortBy: func(pods []*api.Pod) sort.Interface { return controller.ActivePods(pods) }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod-2", - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, 1, 0, time.UTC), - Labels: map[string]string{"test": "selector"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - }, - }, - expectedNum: 2, - }, - { - name: "kubectl logs - one unhealthy, one healthy", - podList: newPodList(2, -1, 1, labelSet), - sortBy: func(pods []*api.Pod) sort.Interface { return controller.ActivePods(pods) }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod-2", - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, 1, 0, time.UTC), - Labels: map[string]string{"test": "selector"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - ContainerStatuses: []api.ContainerStatus{{RestartCount: 5}}, - }, - }, - expectedNum: 2, - }, - { - name: "kubectl attach - two ready pods", - podList: newPodList(2, -1, -1, labelSet), - sortBy: func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod-1", - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, 0, 0, time.UTC), - Labels: map[string]string{"test": "selector"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - }, - }, - expectedNum: 2, - }, - { - name: "kubectl attach - wait for ready pod", - podList: newPodList(1, 1, -1, labelSet), - watching: []watch.Event{ - { - Type: watch.Modified, - Object: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod-1", - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, 0, 0, time.UTC), - Labels: map[string]string{"test": "selector"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - }, - }, - }, - }, - sortBy: func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }, - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "pod-1", - Namespace: api.NamespaceDefault, - CreationTimestamp: unversioned.Date(2016, time.April, 1, 1, 0, 0, 0, time.UTC), - Labels: map[string]string{"test": "selector"}, - }, - Status: api.PodStatus{ - Conditions: []api.PodCondition{ - { - Status: api.ConditionTrue, - Type: api.PodReady, - }, - }, - }, - }, - expectedNum: 1, - }, - } - - for i := range tests { - test := tests[i] - client := &testclient.Fake{} - client.PrependReactor("list", "pods", func(action testclient.Action) (handled bool, ret runtime.Object, err error) { - return true, test.podList, nil - }) - if len(test.watching) > 0 { - watcher := watch.NewFake() - for _, event := range test.watching { - switch event.Type { - case watch.Added: - go watcher.Add(event.Object) - case watch.Modified: - go watcher.Modify(event.Object) - } - } - client.PrependWatchReactor("pods", testclient.DefaultWatchReactor(watcher, nil)) - } - selector := labels.Set(labelSet).AsSelector() - - pod, numPods, err := GetFirstPod(client, api.NamespaceDefault, selector, 1*time.Minute, test.sortBy) - if !test.expectedErr && err != nil { - t.Errorf("%s: unexpected error: %v", test.name, err) - continue - } - if test.expectedErr && err == nil { - t.Errorf("%s: expected an error", test.name) - continue - } - if test.expectedNum != numPods { - t.Errorf("%s: expected %d pods, got %d", test.name, test.expectedNum, numPods) - continue - } - if !reflect.DeepEqual(test.expected, pod) { - t.Errorf("%s:\nexpected pod:\n%#v\ngot:\n%#v\n\n", test.name, test.expected, pod) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/helpers_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/helpers_test.go deleted file mode 100644 index 95c68070d..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/helpers_test.go +++ /dev/null @@ -1,304 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 ( - "fmt" - "io/ioutil" - "net/http" - "reflect" - "strings" - "syscall" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/errors" - "k8s.io/kubernetes/pkg/api/meta" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/util/validation/field" -) - -func TestMerge(t *testing.T) { - grace := int64(30) - tests := []struct { - obj runtime.Object - fragment string - expected runtime.Object - expectErr bool - kind string - }{ - { - kind: "Pod", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, - fragment: fmt.Sprintf(`{ "apiVersion": "%s" }`, testapi.Default.GroupVersion().String()), - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: apitesting.DeepEqualSafePodSpec(), - }, - }, - /* TODO: uncomment this test once Merge is updated to use - strategic-merge-patch. See #8449. - { - kind: "Pod", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - api.Container{ - Name: "c1", - Image: "red-image", - }, - api.Container{ - Name: "c2", - Image: "blue-image", - }, - }, - }, - }, - fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "containers": [ { "name": "c1", "image": "green-image" } ] } }`, testapi.Default.GroupVersion().String()), - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Containers: []api.Container{ - api.Container{ - Name: "c1", - Image: "green-image", - }, - api.Container{ - Name: "c2", - Image: "blue-image", - }, - }, - }, - }, - }, */ - { - kind: "Pod", - obj: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - }, - fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "volumes": [ {"name": "v1"}, {"name": "v2"} ] } }`, testapi.Default.GroupVersion().String()), - expected: &api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Spec: api.PodSpec{ - Volumes: []api.Volume{ - { - Name: "v1", - VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}, - }, - { - Name: "v2", - VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}, - }, - }, - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - TerminationGracePeriodSeconds: &grace, - SecurityContext: &api.PodSecurityContext{}, - }, - }, - }, - { - kind: "Pod", - obj: &api.Pod{}, - fragment: "invalid json", - expected: &api.Pod{}, - expectErr: true, - }, - { - kind: "Service", - obj: &api.Service{}, - fragment: `{ "apiVersion": "badVersion" }`, - expectErr: true, - }, - { - kind: "Service", - obj: &api.Service{ - Spec: api.ServiceSpec{}, - }, - fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "ports": [ { "port": 0 } ] } }`, testapi.Default.GroupVersion().String()), - expected: &api.Service{ - Spec: api.ServiceSpec{ - SessionAffinity: "None", - Type: api.ServiceTypeClusterIP, - Ports: []api.ServicePort{ - { - Protocol: api.ProtocolTCP, - Port: 0, - }, - }, - }, - }, - }, - { - kind: "Service", - obj: &api.Service{ - Spec: api.ServiceSpec{ - Selector: map[string]string{ - "version": "v1", - }, - }, - }, - fragment: fmt.Sprintf(`{ "apiVersion": "%s", "spec": { "selector": { "version": "v2" } } }`, testapi.Default.GroupVersion().String()), - expected: &api.Service{ - Spec: api.ServiceSpec{ - SessionAffinity: "None", - Type: api.ServiceTypeClusterIP, - Selector: map[string]string{ - "version": "v2", - }, - }, - }, - }, - } - - for i, test := range tests { - out, err := Merge(testapi.Default.Codec(), test.obj, test.fragment, test.kind) - if !test.expectErr { - if err != nil { - t.Errorf("testcase[%d], unexpected error: %v", i, err) - } else if !reflect.DeepEqual(out, test.expected) { - t.Errorf("\n\ntestcase[%d]\nexpected:\n%+v\nsaw:\n%+v", i, test.expected, out) - } - } - if test.expectErr && err == nil { - t.Errorf("testcase[%d], unexpected non-error", i) - } - } -} - -type fileHandler struct { - data []byte -} - -func (f *fileHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) { - if req.URL.Path == "/error" { - res.WriteHeader(http.StatusNotFound) - return - } - res.WriteHeader(http.StatusOK) - res.Write(f.data) -} - -func TestCheckInvalidErr(t *testing.T) { - tests := []struct { - err error - expected string - }{ - { - errors.NewInvalid(api.Kind("Invalid1"), "invalidation", field.ErrorList{field.Invalid(field.NewPath("field"), "single", "details")}), - `Error from server: Invalid1 "invalidation" is invalid: field: Invalid value: "single": details`, - }, - { - errors.NewInvalid(api.Kind("Invalid2"), "invalidation", field.ErrorList{field.Invalid(field.NewPath("field1"), "multi1", "details"), field.Invalid(field.NewPath("field2"), "multi2", "details")}), - `Error from server: Invalid2 "invalidation" is invalid: [field1: Invalid value: "multi1": details, field2: Invalid value: "multi2": details]`, - }, - { - errors.NewInvalid(api.Kind("Invalid3"), "invalidation", field.ErrorList{}), - `Error from server: Invalid3 "invalidation" is invalid: `, - }, - } - - var errReturned string - errHandle := func(err string) { - errReturned = err - } - - for _, test := range tests { - checkErr(test.err, errHandle) - - if errReturned != test.expected { - t.Fatalf("Got: %s, expected: %s", errReturned, test.expected) - } - } -} - -func TestCheckNoResourceMatchError(t *testing.T) { - tests := []struct { - err error - expected string - }{ - { - &meta.NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Resource: "foo"}}, - `the server doesn't have a resource type "foo"`, - }, - { - &meta.NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Version: "theversion", Resource: "foo"}}, - `the server doesn't have a resource type "foo" in version "theversion"`, - }, - { - &meta.NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Group: "thegroup", Version: "theversion", Resource: "foo"}}, - `the server doesn't have a resource type "foo" in group "thegroup" and version "theversion"`, - }, - { - &meta.NoResourceMatchError{PartialResource: unversioned.GroupVersionResource{Group: "thegroup", Resource: "foo"}}, - `the server doesn't have a resource type "foo" in group "thegroup"`, - }, - } - - var errReturned string - errHandle := func(err string) { - errReturned = err - } - - for _, test := range tests { - checkErr(test.err, errHandle) - - if errReturned != test.expected { - t.Fatalf("Got: %s, expected: %s", errReturned, test.expected) - } - } -} - -func TestDumpReaderToFile(t *testing.T) { - testString := "TEST STRING" - tempFile, err := ioutil.TempFile("", "hlpers_test_dump_") - if err != nil { - t.Errorf("unexpected error setting up a temporary file %v", err) - } - defer syscall.Unlink(tempFile.Name()) - defer tempFile.Close() - err = DumpReaderToFile(strings.NewReader(testString), tempFile.Name()) - if err != nil { - t.Errorf("error in DumpReaderToFile: %v", err) - } - data, err := ioutil.ReadFile(tempFile.Name()) - if err != nil { - t.Errorf("error when reading %s: %v", tempFile.Name(), err) - } - stringData := string(data) - if stringData != testString { - t.Fatalf("Wrong file content %s != %s", testString, stringData) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go deleted file mode 100644 index 84a76da95..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/util/jsonmerge/jsonmerge.go +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors All rights reserved. - -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 jsonmerge - -import ( - "encoding/json" - "fmt" - - "github.com/evanphx/json-patch" - "github.com/golang/glog" - - "k8s.io/kubernetes/pkg/util/strategicpatch" - "k8s.io/kubernetes/pkg/util/yaml" -) - -// Delta represents a change between two JSON documents. -type Delta struct { - original []byte - edit []byte - - preconditions []PreconditionFunc -} - -// PreconditionFunc is a test to verify that an incompatible change -// has occurred before an Apply can be successful. -type PreconditionFunc func(interface{}) (hold bool, message string) - -// AddPreconditions adds precondition checks to a change which must -// be satisfied before an Apply is considered successful. If a -// precondition returns false, the Apply is failed with -// ErrPreconditionFailed. -func (d *Delta) AddPreconditions(fns ...PreconditionFunc) { - d.preconditions = append(d.preconditions, fns...) -} - -// RequireKeyUnchanged creates a precondition function that fails -// if the provided key is present in the diff (indicating its value -// has changed). -func RequireKeyUnchanged(key string) PreconditionFunc { - return func(diff interface{}) (bool, string) { - m, ok := diff.(map[string]interface{}) - if !ok { - return true, "" - } - // the presence of key in a diff means that its value has been changed, therefore - // we should fail the precondition. - _, ok = m[key] - if ok { - return false, key + " should not be changed\n" - } else { - return true, "" - } - } -} - -// RequireKeyUnchanged creates a precondition function that fails -// if the metadata.key is present in the diff (indicating its value -// has changed). -func RequireMetadataKeyUnchanged(key string) PreconditionFunc { - return func(diff interface{}) (bool, string) { - m, ok := diff.(map[string]interface{}) - if !ok { - return true, "" - } - m1, ok := m["metadata"] - if !ok { - return true, "" - } - m2, ok := m1.(map[string]interface{}) - if !ok { - return true, "" - } - _, ok = m2[key] - if ok { - return false, "metadata." + key + " should not be changed\n" - } else { - return true, "" - } - } -} - -// TestPreconditions test if preconditions hold given the edit -func TestPreconditionsHold(edit []byte, preconditions []PreconditionFunc) (bool, string) { - diff := make(map[string]interface{}) - if err := json.Unmarshal(edit, &diff); err != nil { - return false, err.Error() - } - for _, fn := range preconditions { - if hold, msg := fn(diff); !hold { - return false, msg - } - } - return true, "" -} - -// NewDelta accepts two JSON or YAML documents and calculates the difference -// between them. It returns a Delta object which can be used to resolve -// conflicts against a third version with a common parent, or an error -// if either document is in error. -func NewDelta(from, to []byte) (*Delta, error) { - d := &Delta{} - before, err := yaml.ToJSON(from) - if err != nil { - return nil, err - } - after, err := yaml.ToJSON(to) - if err != nil { - return nil, err - } - diff, err := jsonpatch.CreateMergePatch(before, after) - if err != nil { - return nil, err - } - glog.V(6).Infof("Patch created from:\n%s\n%s\n%s", string(before), string(after), string(diff)) - d.original = before - d.edit = diff - return d, nil -} - -// Apply attempts to apply the changes described by Delta onto latest, -// returning an error if the changes cannot be applied cleanly. -// IsConflicting will be true if the changes overlap, otherwise a -// generic error will be returned. -func (d *Delta) Apply(latest []byte) ([]byte, error) { - base, err := yaml.ToJSON(latest) - if err != nil { - return nil, err - } - changes, err := jsonpatch.CreateMergePatch(d.original, base) - if err != nil { - return nil, err - } - diff1 := make(map[string]interface{}) - if err := json.Unmarshal(d.edit, &diff1); err != nil { - return nil, err - } - diff2 := make(map[string]interface{}) - if err := json.Unmarshal(changes, &diff2); err != nil { - return nil, err - } - for _, fn := range d.preconditions { - hold1, _ := fn(diff1) - hold2, _ := fn(diff2) - if !hold1 || !hold2 { - return nil, ErrPreconditionFailed - } - } - - glog.V(6).Infof("Testing for conflict between:\n%s\n%s", string(d.edit), string(changes)) - hasConflicts, err := strategicpatch.HasConflicts(diff1, diff2) - if err != nil { - return nil, err - } - if hasConflicts { - return nil, ErrConflict - } - - return jsonpatch.MergePatch(base, d.edit) -} - -// IsConflicting returns true if the provided error indicates a -// conflict exists between the original changes and the applied -// changes. -func IsConflicting(err error) bool { - return err == ErrConflict -} - -// IsPreconditionFailed returns true if the provided error indicates -// a Delta precondition did not succeed. -func IsPreconditionFailed(err error) bool { - return err == ErrPreconditionFailed -} - -var ErrPreconditionFailed = fmt.Errorf("a precondition failed") -var ErrConflict = fmt.Errorf("changes are in conflict") - -func (d *Delta) Edit() []byte { - return d.edit -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/version.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/version.go deleted file mode 100644 index beaeda7bb..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/cmd/version.go +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 cmd - -import ( - "io" - - "github.com/spf13/cobra" - - "k8s.io/kubernetes/pkg/kubectl" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -func NewCmdVersion(f *cmdutil.Factory, out io.Writer) *cobra.Command { - cmd := &cobra.Command{ - Use: "version", - Short: "Print the client and server version information.", - Run: func(cmd *cobra.Command, args []string) { - err := RunVersion(f, out, cmd) - cmdutil.CheckErr(err) - }, - } - cmd.Flags().BoolP("client", "c", false, "Client version only (no server required).") - cmd.Flags().MarkShorthandDeprecated("client", "please use --client instead.") - return cmd -} - -func RunVersion(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { - kubectl.GetClientVersion(out) - if cmdutil.GetFlagBool(cmd, "client") { - return nil - } - - client, err := f.Client() - if err != nil { - return err - } - - kubectl.GetServerVersion(out, client) - return nil -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/configmap_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/configmap_test.go deleted file mode 100644 index d4458bdd0..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/configmap_test.go +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" -) - -func TestConfigMapGenerate(t *testing.T) { - tests := []struct { - params map[string]interface{} - expected *api.ConfigMap - expectErr bool - }{ - { - params: map[string]interface{}{ - "name": "foo", - }, - expected: &api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string]string{}, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "type": "my-type", - }, - expected: &api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string]string{}, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1=value1", "key2=value2"}, - }, - expected: &api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - expectErr: false, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1value1"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-file": []string{"key1=/file=2"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-file": []string{"key1==value"}, - }, - expectErr: true, - }, - { - params: map[string]interface{}{ - "name": "foo", - "from-literal": []string{"key1==value1"}, - }, - expected: &api.ConfigMap{ - ObjectMeta: api.ObjectMeta{ - Name: "foo", - }, - Data: map[string]string{ - "key1": "=value1", - }, - }, - expectErr: false, - }, - } - generator := ConfigMapGeneratorV1{} - for _, test := range tests { - obj, err := generator.Generate(test.params) - if !test.expectErr && err != nil { - t.Errorf("unexpected error: %v", err) - } - if test.expectErr && err != nil { - continue - } - if !reflect.DeepEqual(obj.(*api.ConfigMap), test.expected) { - t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*api.ConfigMap)) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/custom_column_printer_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/custom_column_printer_test.go deleted file mode 100644 index 531881a73..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/custom_column_printer_test.go +++ /dev/null @@ -1,276 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "bytes" - "reflect" - "testing" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/runtime" -) - -func TestMassageJSONPath(t *testing.T) { - tests := []struct { - input string - expectedOutput string - expectErr bool - }{ - {input: "foo.bar", expectedOutput: "{.foo.bar}"}, - {input: "{foo.bar}", expectedOutput: "{.foo.bar}"}, - {input: ".foo.bar", expectedOutput: "{.foo.bar}"}, - {input: "{.foo.bar}", expectedOutput: "{.foo.bar}"}, - {input: "", expectedOutput: ""}, - {input: "{foo.bar", expectErr: true}, - {input: "foo.bar}", expectErr: true}, - {input: "{foo.bar}}", expectErr: true}, - {input: "{{foo.bar}", expectErr: true}, - } - for _, test := range tests { - output, err := massageJSONPath(test.input) - if err != nil && !test.expectErr { - t.Errorf("unexpected error: %v", err) - continue - } - if test.expectErr { - if err == nil { - t.Error("unexpected non-error") - } - continue - } - if output != test.expectedOutput { - t.Errorf("input: %s, expected: %s, saw: %s", test.input, test.expectedOutput, output) - } - } -} - -func TestNewColumnPrinterFromSpec(t *testing.T) { - tests := []struct { - spec string - expectedColumns []Column - expectErr bool - name string - }{ - { - spec: "", - expectErr: true, - name: "empty", - }, - { - spec: "invalid", - expectErr: true, - name: "invalid1", - }, - { - spec: "invalid=foobar", - expectErr: true, - name: "invalid2", - }, - { - spec: "invalid,foobar:blah", - expectErr: true, - name: "invalid3", - }, - { - spec: "NAME:metadata.name,API_VERSION:apiVersion", - name: "ok", - expectedColumns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - { - Header: "API_VERSION", - FieldSpec: "{.apiVersion}", - }, - }, - }, - } - for _, test := range tests { - printer, err := NewCustomColumnsPrinterFromSpec(test.spec, api.Codecs.UniversalDecoder()) - if test.expectErr { - if err == nil { - t.Errorf("[%s] unexpected non-error", test.name) - } - continue - } - if !test.expectErr && err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - - if !reflect.DeepEqual(test.expectedColumns, printer.Columns) { - t.Errorf("[%s]\nexpected:\n%v\nsaw:\n%v\n", test.name, test.expectedColumns, printer.Columns) - } - - } -} - -const exampleTemplateOne = `NAME API_VERSION -{metadata.name} {apiVersion}` - -const exampleTemplateTwo = `NAME API_VERSION - {metadata.name} {apiVersion}` - -func TestNewColumnPrinterFromTemplate(t *testing.T) { - tests := []struct { - spec string - expectedColumns []Column - expectErr bool - name string - }{ - { - spec: "", - expectErr: true, - name: "empty", - }, - { - spec: "invalid", - expectErr: true, - name: "invalid1", - }, - { - spec: "invalid=foobar", - expectErr: true, - name: "invalid2", - }, - { - spec: "invalid,foobar:blah", - expectErr: true, - name: "invalid3", - }, - { - spec: exampleTemplateOne, - name: "ok", - expectedColumns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - { - Header: "API_VERSION", - FieldSpec: "{.apiVersion}", - }, - }, - }, - { - spec: exampleTemplateTwo, - name: "ok-2", - expectedColumns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - { - Header: "API_VERSION", - FieldSpec: "{.apiVersion}", - }, - }, - }, - } - for _, test := range tests { - reader := bytes.NewBufferString(test.spec) - printer, err := NewCustomColumnsPrinterFromTemplate(reader, api.Codecs.UniversalDecoder()) - if test.expectErr { - if err == nil { - t.Errorf("[%s] unexpected non-error", test.name) - } - continue - } - if !test.expectErr && err != nil { - t.Errorf("[%s] unexpected error: %v", test.name, err) - continue - } - - if !reflect.DeepEqual(test.expectedColumns, printer.Columns) { - t.Errorf("[%s]\nexpected:\n%v\nsaw:\n%v\n", test.name, test.expectedColumns, printer.Columns) - } - - } -} - -func TestColumnPrint(t *testing.T) { - tests := []struct { - columns []Column - obj runtime.Object - expectedOutput string - }{ - { - columns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - }, - obj: &v1.Pod{ObjectMeta: v1.ObjectMeta{Name: "foo"}}, - expectedOutput: `NAME -foo -`, - }, - { - columns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - }, - obj: &v1.PodList{ - Items: []v1.Pod{ - {ObjectMeta: v1.ObjectMeta{Name: "foo"}}, - {ObjectMeta: v1.ObjectMeta{Name: "bar"}}, - }, - }, - expectedOutput: `NAME -foo -bar -`, - }, - { - columns: []Column{ - { - Header: "NAME", - FieldSpec: "{.metadata.name}", - }, - { - Header: "API_VERSION", - FieldSpec: "{.apiVersion}", - }, - }, - obj: &v1.Pod{ObjectMeta: v1.ObjectMeta{Name: "foo"}, TypeMeta: unversioned.TypeMeta{APIVersion: "baz"}}, - expectedOutput: `NAME API_VERSION -foo baz -`, - }, - } - - for _, test := range tests { - printer := &CustomColumnsPrinter{ - Columns: test.columns, - Decoder: api.Codecs.UniversalDecoder(), - } - buffer := &bytes.Buffer{} - if err := printer.PrintObj(test.obj, buffer); err != nil { - t.Errorf("unexpected error: %v", err) - } - if buffer.String() != test.expectedOutput { - t.Errorf("\nexpected:\n'%s'\nsaw\n'%s'\n", test.expectedOutput, buffer.String()) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/describe_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/describe_test.go deleted file mode 100644 index f073d3050..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/describe_test.go +++ /dev/null @@ -1,636 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "bytes" - "fmt" - "reflect" - "strings" - "testing" - "time" - - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/resource" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/apis/extensions" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - client "k8s.io/kubernetes/pkg/client/unversioned" - "k8s.io/kubernetes/pkg/client/unversioned/testclient" -) - -type describeClient struct { - T *testing.T - Namespace string - Err error - client.Interface -} - -func TestDescribePod(t *testing.T) { - fake := testclient.NewSimpleFake(&api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }) - c := &describeClient{T: t, Namespace: "foo", Interface: fake} - d := PodDescriber{c} - out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !strings.Contains(out, "bar") || !strings.Contains(out, "Status:") { - t.Errorf("unexpected out: %s", out) - } -} - -func TestDescribeService(t *testing.T) { - fake := testclient.NewSimpleFake(&api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }) - c := &describeClient{T: t, Namespace: "foo", Interface: fake} - d := ServiceDescriber{c} - out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !strings.Contains(out, "Labels:") || !strings.Contains(out, "bar") { - t.Errorf("unexpected out: %s", out) - } -} - -func TestPodDescribeResultsSorted(t *testing.T) { - // Arrange - fake := testclient.NewSimpleFake(&api.EventList{ - Items: []api.Event{ - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 1", - FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "scheduler"}, - Message: "Item 2", - FirstTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(1987, time.June, 17, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 3", - FirstTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2002, time.December, 25, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - }, - }) - c := &describeClient{T: t, Namespace: "foo", Interface: fake} - d := PodDescriber{c} - - // Act - out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - - // Assert - if err != nil { - t.Errorf("unexpected error: %v", err) - } - VerifyDatesInOrder(out, "\n" /* rowDelimiter */, "\t" /* columnDelimiter */, t) -} - -func TestDescribeContainers(t *testing.T) { - testCases := []struct { - container api.Container - status api.ContainerStatus - expectedElements []string - }{ - // Running state. - { - container: api.Container{Name: "test", Image: "image"}, - status: api.ContainerStatus{ - Name: "test", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ - StartedAt: unversioned.NewTime(time.Now()), - }, - }, - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Running", "Ready", "True", "Restart Count", "7", "Image", "image", "Started"}, - }, - // Waiting state. - { - container: api.Container{Name: "test", Image: "image"}, - status: api.ContainerStatus{ - Name: "test", - State: api.ContainerState{ - Waiting: &api.ContainerStateWaiting{ - Reason: "potato", - }, - }, - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Waiting", "Ready", "True", "Restart Count", "7", "Image", "image", "Reason", "potato"}, - }, - // Terminated state. - { - container: api.Container{Name: "test", Image: "image"}, - status: api.ContainerStatus{ - Name: "test", - State: api.ContainerState{ - Terminated: &api.ContainerStateTerminated{ - StartedAt: unversioned.NewTime(time.Now()), - FinishedAt: unversioned.NewTime(time.Now()), - Reason: "potato", - ExitCode: 2, - }, - }, - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Terminated", "Ready", "True", "Restart Count", "7", "Image", "image", "Reason", "potato", "Started", "Finished", "Exit Code", "2"}, - }, - // Last Terminated - { - container: api.Container{Name: "test", Image: "image"}, - status: api.ContainerStatus{ - Name: "test", - State: api.ContainerState{ - Running: &api.ContainerStateRunning{ - StartedAt: unversioned.NewTime(time.Now()), - }, - }, - LastTerminationState: api.ContainerState{ - Terminated: &api.ContainerStateTerminated{ - StartedAt: unversioned.NewTime(time.Now().Add(time.Second * 3)), - FinishedAt: unversioned.NewTime(time.Now()), - Reason: "crashing", - ExitCode: 3, - }, - }, - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Terminated", "Ready", "True", "Restart Count", "7", "Image", "image", "Started", "Finished", "Exit Code", "2", "crashing", "3"}, - }, - // No state defaults to waiting. - { - container: api.Container{Name: "test", Image: "image"}, - status: api.ContainerStatus{ - Name: "test", - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Waiting", "Ready", "True", "Restart Count", "7", "Image", "image"}, - }, - // Env - { - container: api.Container{Name: "test", Image: "image", Env: []api.EnvVar{{Name: "envname", Value: "xyz"}}}, - status: api.ContainerStatus{ - Name: "test", - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Waiting", "Ready", "True", "Restart Count", "7", "Image", "image", "envname", "xyz"}, - }, - // Command - { - container: api.Container{Name: "test", Image: "image", Command: []string{"sleep", "1000"}}, - status: api.ContainerStatus{ - Name: "test", - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Waiting", "Ready", "True", "Restart Count", "7", "Image", "image", "sleep", "1000"}, - }, - // Args - { - container: api.Container{Name: "test", Image: "image", Args: []string{"time", "1000"}}, - status: api.ContainerStatus{ - Name: "test", - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"test", "State", "Waiting", "Ready", "True", "Restart Count", "7", "Image", "image", "time", "1000"}, - }, - // Using limits. - { - container: api.Container{ - Name: "test", - Image: "image", - Resources: api.ResourceRequirements{ - Limits: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("1000"), - api.ResourceName(api.ResourceMemory): resource.MustParse("4G"), - api.ResourceName(api.ResourceStorage): resource.MustParse("20G"), - }, - }, - }, - status: api.ContainerStatus{ - Name: "test", - Ready: true, - RestartCount: 7, - }, - expectedElements: []string{"cpu", "1k", "memory", "4G", "storage", "20G"}, - }, - } - - for i, testCase := range testCases { - out := new(bytes.Buffer) - pod := api.Pod{ - Spec: api.PodSpec{ - Containers: []api.Container{testCase.container}, - }, - Status: api.PodStatus{ - ContainerStatuses: []api.ContainerStatus{testCase.status}, - }, - } - describeContainers(pod.Spec.Containers, pod.Status.ContainerStatuses, EnvValueRetriever(&pod), out, "") - output := out.String() - for _, expected := range testCase.expectedElements { - if !strings.Contains(output, expected) { - t.Errorf("Test case %d: expected to find %q in output: %q", i, expected, output) - } - } - } -} - -func TestDescribers(t *testing.T) { - first := &api.Event{} - second := &api.Pod{} - var third *api.Pod - testErr := fmt.Errorf("test") - d := Describers{} - d.Add( - func(e *api.Event, p *api.Pod) (string, error) { - if e != first { - t.Errorf("first argument not equal: %#v", e) - } - if p != second { - t.Errorf("second argument not equal: %#v", p) - } - return "test", testErr - }, - ) - if out, err := d.DescribeObject(first, second); out != "test" || err != testErr { - t.Errorf("unexpected result: %s %v", out, err) - } - - if out, err := d.DescribeObject(first, second, third); out != "" || err == nil { - t.Errorf("unexpected result: %s %v", out, err) - } else { - if noDescriber, ok := err.(ErrNoDescriber); ok { - if !reflect.DeepEqual(noDescriber.Types, []string{"*api.Event", "*api.Pod", "*api.Pod"}) { - t.Errorf("unexpected describer: %v", err) - } - } else { - t.Errorf("unexpected error type: %v", err) - } - } - - d.Add( - func(e *api.Event) (string, error) { - if e != first { - t.Errorf("first argument not equal: %#v", e) - } - return "simpler", testErr - }, - ) - if out, err := d.DescribeObject(first); out != "simpler" || err != testErr { - t.Errorf("unexpected result: %s %v", out, err) - } -} - -func TestDefaultDescribers(t *testing.T) { - out, err := DefaultObjectDescriber.DescribeObject(&api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) - } - - out, err = DefaultObjectDescriber.DescribeObject(&api.Service{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) - } - - out, err = DefaultObjectDescriber.DescribeObject(&api.ReplicationController{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) - } - - out, err = DefaultObjectDescriber.DescribeObject(&api.Node{ObjectMeta: api.ObjectMeta{Name: "foo"}}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) - } -} - -func TestGetPodsTotalRequests(t *testing.T) { - testCases := []struct { - pods *api.PodList - expectedReqs, expectedLimits map[api.ResourceName]resource.Quantity - }{ - { - pods: &api.PodList{ - Items: []api.Pod{ - { - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("1"), - api.ResourceName(api.ResourceMemory): resource.MustParse("300Mi"), - api.ResourceName(api.ResourceStorage): resource.MustParse("1G"), - }, - }, - }, - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("90m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("120Mi"), - api.ResourceName(api.ResourceStorage): resource.MustParse("200M"), - }, - }, - }, - }, - }, - }, - { - Spec: api.PodSpec{ - Containers: []api.Container{ - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("60m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("43Mi"), - api.ResourceName(api.ResourceStorage): resource.MustParse("500M"), - }, - }, - }, - { - Resources: api.ResourceRequirements{ - Requests: api.ResourceList{ - api.ResourceName(api.ResourceCPU): resource.MustParse("34m"), - api.ResourceName(api.ResourceMemory): resource.MustParse("83Mi"), - api.ResourceName(api.ResourceStorage): resource.MustParse("700M"), - }, - }, - }, - }, - }, - }, - }, - }, - expectedReqs: map[api.ResourceName]resource.Quantity{ - api.ResourceName(api.ResourceCPU): resource.MustParse("1.184"), - api.ResourceName(api.ResourceMemory): resource.MustParse("546Mi"), - api.ResourceName(api.ResourceStorage): resource.MustParse("2.4G"), - }, - }, - } - - for _, testCase := range testCases { - reqs, _, err := getPodsTotalRequestsAndLimits(testCase.pods) - if err != nil { - t.Errorf("Unexpected error %v", err) - } - if !reflect.DeepEqual(reqs, testCase.expectedReqs) { - t.Errorf("Expected %v, got %v", testCase.expectedReqs, reqs) - } - } -} - -func TestPersistentVolumeDescriber(t *testing.T) { - tests := map[string]*api.PersistentVolume{ - - "hostpath": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - HostPath: &api.HostPathVolumeSource{}, - }, - }, - }, - "gce": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}, - }, - }, - }, - "ebs": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - AWSElasticBlockStore: &api.AWSElasticBlockStoreVolumeSource{}, - }, - }, - }, - "nfs": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - NFS: &api.NFSVolumeSource{}, - }, - }, - }, - "iscsi": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - ISCSI: &api.ISCSIVolumeSource{}, - }, - }, - }, - "gluster": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - Glusterfs: &api.GlusterfsVolumeSource{}, - }, - }, - }, - "rbd": { - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - RBD: &api.RBDVolumeSource{}, - }, - }, - }, - } - - for name, pv := range tests { - fake := testclient.NewSimpleFake(pv) - c := PersistentVolumeDescriber{fake} - str, err := c.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - if err != nil { - t.Errorf("Unexpected error for test %s: %v", name, err) - } - if str == "" { - t.Errorf("Unexpected empty string for test %s. Expected PV Describer output", name) - } - } -} - -func TestDescribeDeployment(t *testing.T) { - fake := fake.NewSimpleClientset(&extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - Spec: extensions.DeploymentSpec{ - Template: api.PodTemplateSpec{}, - }, - }) - d := DeploymentDescriber{fake} - out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !strings.Contains(out, "bar") || !strings.Contains(out, "foo") { - t.Errorf("unexpected out: %s", out) - } -} - -func TestDescribeEvents(t *testing.T) { - - events := &api.EventList{ - Items: []api.Event{ - { - Source: api.EventSource{Component: "kubelet"}, - Message: "Item 1", - FirstTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - LastTimestamp: unversioned.NewTime(time.Date(2014, time.January, 15, 0, 0, 0, 0, time.UTC)), - Count: 1, - Type: api.EventTypeNormal, - }, - }, - } - - m := map[string]Describer{ - "DaemonSetDescriber": &DaemonSetDescriber{ - testclient.NewSimpleFake(&extensions.DaemonSet{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - "DeploymentDescriber": &DeploymentDescriber{ - fake.NewSimpleClientset(&extensions.Deployment{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - "EndpointsDescriber": &EndpointsDescriber{ - testclient.NewSimpleFake(&api.Endpoints{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - // TODO(jchaloup): add tests for: - // - HorizontalPodAutoscalerDescriber - // - IngressDescriber - // - JobDescriber - "NodeDescriber": &NodeDescriber{ - testclient.NewSimpleFake(&api.Node{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - SelfLink: "url/url/url", - }, - }, events), - }, - "PodDescriber": &PodDescriber{ - testclient.NewSimpleFake(&api.Pod{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - SelfLink: "url/url/url", - }, - }, events), - }, - "ReplicaSetDescriber": &ReplicaSetDescriber{ - testclient.NewSimpleFake(&extensions.ReplicaSet{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - "ReplicationControllerDescriber": &ReplicationControllerDescriber{ - testclient.NewSimpleFake(&api.ReplicationController{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - "Service": &ServiceDescriber{ - testclient.NewSimpleFake(&api.Service{ - ObjectMeta: api.ObjectMeta{ - Name: "bar", - Namespace: "foo", - }, - }, events), - }, - } - - for name, d := range m { - out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) - if err != nil { - t.Errorf("unexpected error for %q: %v", name, err) - } - if !strings.Contains(out, "bar") { - t.Errorf("unexpected out for %q: %s", name, out) - } - if !strings.Contains(out, "Events:") { - t.Errorf("events not found for %q when ShowEvents=true: %s", name, out) - } - - out, err = d.Describe("foo", "bar", DescriberSettings{ShowEvents: false}) - if err != nil { - t.Errorf("unexpected error for %q: %s", name, err) - } - if !strings.Contains(out, "bar") { - t.Errorf("unexpected out for %q: %s", name, out) - } - if strings.Contains(out, "Events:") { - t.Errorf("events found for %q when ShowEvents=false: %s", name, out) - } - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/generate_test.go b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/generate_test.go deleted file mode 100644 index 62823f9dc..000000000 --- a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/generate_test.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors All rights reserved. - -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 kubectl - -import ( - "reflect" - "testing" - - "github.com/spf13/cobra" -) - -type TestStruct struct { - val int -} - -func TestIsZero(t *testing.T) { - tests := []struct { - val interface{} - expectZero bool - }{ - {"", true}, - {nil, true}, - {0, true}, - {TestStruct{}, true}, - {"foo", false}, - {1, false}, - {TestStruct{val: 2}, false}, - } - - for _, test := range tests { - output := IsZero(test.val) - if output != test.expectZero { - t.Errorf("expected: %v, saw %v", test.expectZero, output) - } - } -} - -func TestValidateParams(t *testing.T) { - tests := []struct { - paramSpec []GeneratorParam - params map[string]interface{} - valid bool - }{ - { - paramSpec: []GeneratorParam{}, - params: map[string]interface{}{}, - valid: true, - }, - { - paramSpec: []GeneratorParam{ - {Name: "foo"}, - }, - params: map[string]interface{}{}, - valid: true, - }, - { - paramSpec: []GeneratorParam{ - {Name: "foo", Required: true}, - }, - params: map[string]interface{}{ - "foo": "bar", - }, - valid: true, - }, - { - paramSpec: []GeneratorParam{ - {Name: "foo", Required: true}, - }, - params: map[string]interface{}{ - "baz": "blah", - "foo": "bar", - }, - valid: true, - }, - { - paramSpec: []GeneratorParam{ - {Name: "foo", Required: true}, - {Name: "baz", Required: true}, - }, - params: map[string]interface{}{ - "baz": "blah", - "foo": "bar", - }, - valid: true, - }, - { - paramSpec: []GeneratorParam{ - {Name: "foo", Required: true}, - {Name: "baz", Required: true}, - }, - params: map[string]interface{}{ - "foo": "bar", - }, - valid: false, - }, - } - for _, test := range tests { - err := ValidateParams(test.paramSpec, test.params) - if test.valid && err != nil { - t.Errorf("unexpected error: %v", err) - } - if !test.valid && err == nil { - t.Errorf("unexpected non-error") - } - } -} - -func TestMakeParams(t *testing.T) { - cmd := &cobra.Command{} - cmd.Flags().String("foo", "bar", "") - cmd.Flags().String("baz", "", "") - cmd.Flags().Set("baz", "blah") - - paramSpec := []GeneratorParam{ - {Name: "foo", Required: true}, - {Name: "baz", Required: true}, - } - expected := map[string]interface{}{ - "foo": "bar", - "baz": "blah", - } - params := MakeParams(cmd, paramSpec) - if !reflect.DeepEqual(params, expected) { - t.Errorf("\nexpected:\n%v\nsaw:\n%v", expected, params) - } -} diff --git a/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl.test b/Godeps/_workspace/src/k8s.io/kubernetes/pkg/kubectl/kubectl.test deleted file mode 100644 index 152a3526f28a6debcd636872ffc360cc588a8235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12585712 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 z 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�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 z znHp>Cog{m8nR2i(Sh-lOw8?&QTXg1FqLyaXnnW?cN;!g+a@-T5$9(St$FuPw|B^6; z3y|j&%>Zi=O~sn|qPg`bgz@_|r({T0X?fGN)=EvXN^54;x8-%s`c|s4$1#8;i@z}< zQ_1S%Cq?Wc@M>OTRzxWcLW_6bWgHhU8@yrk3;W;K|I{h}n!^YpwkjH17G3{FG?uVS zz&4KNvL8JtHg`~L4L@7QT~@B`#<$%WW`Fyyy(L$1k$9tQ@WdmLC`0?}%(03{;CiAt z3R1ArA{j#a$2Y|r@tYL;xV)eAyiuM%UM>Kve$`jVrA>VV7S0oKO`GBe3`8L@#+g6i zQ+{Q`SVIxb2}^kg>!Tm$Gn!m5P|j28<{#EOzln1SAdO!!Kw&2yRa`Gr7n{ zTreZyty|Is#kML6OeXj+T>x)YggR#86jG1U7{`{|B35$@m1tRa7YrY*WAnm;=J$Jh zy++_BA?`H|;P{@X(NvSqEeLot*fOOS7w50R$U#I z4R%R8uxl0ePGQ)>DPp|x(2PW{pI_Pz)SVUTtG5SqDDk1*oDFJuJ5U#K+{bl(IHL`b z*%7kJi$_%l6yLE{|-97|WnL{h^=|LIste+ogN8EQ%s4v>h+dx1csFh9Y%y;Qx=pC`(%S!+78C&E7UDRP$@|Y^@9Vm(4jrMwUt7B?&d%WD2EF5 zx@=G@+rjnu%Y*{wg`iT36>6VsP}?(6RfGx?kj+F@+`nNaYUZV>CaRUl8WYum^R`SB zO$)kQ6&gyK9g@ZNG&Zo`0c(-5k6~;aawO%t3F0|;+m4>U&210ONcvBhK5Wnb#`DgJ z{ycO|yul$3=}gftyUy6{La74nN71lF{6G)^Sh4q~J=sYN`iIH$coH1rKouA0;V2xu ztFaCmn@zRK0naW(iXDf4Alr;}mfd*hnn)o33R0P0DBpv?n4LZy??3x5rvJ5uQU=-- zB687c7L7Es_>|vx&v7e3$F&z6JOAk#uOyuETxA&QWT7(%K_qPcW* zMyjLM}R=MFvEgT}ZGLi3806Mo2=Z`ft zoAW{OM_PCb9nk!S(-54N#V0i5Mj7HmQJMJ7;@sozOumN3Nv{yTsuGPrK;8wTlI)*J zFd6EfZAMtwYBTnBbp2~-owIp^&||Zmvv(Op!9f!um{x`l3-rC1{WG1&!6Q*&KaGZr zN2v`c(y6lhL8Q|d$d1MupjLl(@7A6LJF4xWc+4# zQ87KKCaD3v0q@uvF}dH{?d0IlltgHk_x!#YA^OfYE7Tvj(#du1$^_N8$uqOTj;NE! z3i~#NeRv4=Y-tWL?v@Q|Njp%FP^hE)O)iZ{hiQE&gTL{xnUq%Vo_(?qr?j1_mS4hx z2t^4Fwu&KhlbmbF+|FXLMAEv8ZT2VXoz4K%^vF-FY9+a_GIvgrveD5~~5l$dx_xH)jdonY-s;%HMDA$RFAZqg|xF=9R^`qUas>g?el@sHN>_)is3LhE`2F zV#BoRl~KuB#Ys;_rK;LeDVc=NO^hT}nDhmVx9CSHxllg-cy4{A)k(PE3go2Wke^_f zXJWdmLb2Y)y3_R&2>HCNu`(Kw)@gEx9hsB3-E4fFzRbX_ywd(QamMwQ9m(|98YDWoB_~QJT!j4;6-gdZH&3f^r&*=P*W%Ff|;EB$vdsyRnYDB_e? zF%B1naTaY9&NgN=m30C$ZP_}Roy3Rnw-~a+oAZIrDNV@NYpa;S`1g_j}B(%H=%)WJyk-iM@{ zP-UG7OeTt8q>cJtcOFe>c+{T)&X8InVr=)1a`UZ?>(35|v3K*(3$f?V(;T9MX-4W$ z1ivKv<^}!5eFqx*Hib1orDj_-!g-55cbx&&zI`V{R$=?r%#!~j`*t;EFxdX$({0(e z0kZ!<$i7V{R@T1FG#3TleM}jE#0dMd^cP70lAMi)lObJ_>{~JKXR>b@DQ5t*ZQtzp z{)2}b`zFBy7|^QB6UNZ4^2dSVnLNs9`R&BUeN-Z@(1`i{-m@R6$wMD_ID$=>ya><4 zj8Xhx#tKeTGsa70;E{xuvJr$>5m~Kf#?)Qs>uUn-5>&zl><57cMUHq6_DnVv0xFC3 zTFHgH>O0}$1a_n_d zhO=?LJ}Xr($ruU=nF1l1j)Sk4>#2*K6SH{enm8Q?JWbNSP<%0~v}5tbxR*_QG5T22 zG^~G7GVOn)f47|x=-=AbHsXsp=O|jG(HJR?L_e_-xxht*xhU|uz$&$^e+&~y+A1FZ z|HKzo|9T$UA^o#EO$1}NU)>XmFGSfSz6dMZv|$^lY}Z`fF=acjsN>3Z)mfr!JuT=! z*}mT;9ZFluwl5)p!`kIbSGJ-bf2*=xQ@Mf41}zJIN%~e5#Pb6WHu_db@q&r%ha-PH zFSX}bA8CZ$>l|eR!}=Cs$^VhQT||>?@}rxyrEg_sO9Wrv#4TBUDf z*L04?w`cp1BAHWEhllWHhYwK&EH^e`H;SJ$Icsi;Vwzd|;|Ri2(kO^yvp$U87I^4GJVosqiHV4nY#A zCqJL2XyJkSFHr|FkJe3Gth~2xyZWS#Pa6-?k}gU5)I#E9iXSsl&H!jjpOVLa`Wb$# zLA~Tbmhqn%n;0RrOX<83h{y; zb(+c2BfqRRpI$8RK9?;3Y;6ribp+@-qw}mgW-u)RLgkOT!K~pz@7Mn*Ei1SMx@~FW zHdGt1ggEiX^Ssb`fj!5x451{_%tA>}u$g!w%{&puxXoB` zG`@*^v2BuIA&I}WsPqJ>6nnTpB3f7(_tLONNA~Y&l_WdAH6mQ@eM|B2X`2FWaU3KK zRaFN&n%&4^vO%c~^Td0x8DcBrBhWs4enx6DU;hI&No6MONn!5S5t<8p*1o}9;HW$v z%&bbI31Fq=Mwx+RXfE)9UE7`uTrR+D(aFY!B+mu5bES=$Q4>#dbmvgg*Azkn1Q;4n zAwVaap(oQoAX_E(O+!KAYE!v17%GHJ7r9>FQeaFEbno;0#`naUO;!5P1W%aTamw}D zC!k!V)MqHC$Qa5gCP|db**F8`Ff57BX)WV)>XAR<^I5BrN9kFE@phR2Zd;6j5YsY+ zYbh{8n}C*Ui_Iu@Cc_^AnPKC z`IG!b5M~?^?xlpP>XDR)Pg(&B@yT7sYka~>jZfzAtfQYXy<)UgPt!IrJtkn0j{|7Z zaGyfe%wTY{MB0LOK~9>9lZGw!d&)3g-i2H)?>aqf9WZ8MMp=jV?;aT;`teIvsD%o3 z?j;6uKwTmA6KXsg)QEWC?6}T5h3G(L#ln$Y;E2^yHh8z$D-L2|Y|Fztmim zc$*GR4U*_OX|KXF2W*n;)PEKMk4(A+oqgj^F1;aSFS%J|DNEm)e@oHWWuMXVX#7E*W z;ee-rX8h3^)5*%Y>nwWK#H*cUHWe)al%bS@S4S%UkK)yZCj{~8AcF!$q%<{NEfWHV z@|_cf_rwz@Hkpe8?=4xW+*ZDm1fZ0&@rYMRm!x<#kM}dhs~IV00JIgahQ9yR+w}h= zq5}h_EB%ET^ymChYbrDB^i-)l&^?xuHw%%dJ~?GMz;?<=9YPJ8&qsKJ=CjoM9^b`f zv|-JsfTHazOCNCQ_ZPK9Qv{w`qGmZ)OXPi;-b<@y#SyZ!mS+f^g1E87yY_@s8$^nb zI}+X44}F=W{~+zCagXI>d9MiMeej+}-iygbkeF)BAJ5C}Ia11EA|<7~3unr>k5;fi zIHe2&cgs?p0Vv+jEF?Pf*UpHo#Bh;VID_|-v9&PJg$&u;N2@acJuCyz?qQ&nK2S-h zk=*d7`(rRL>V^m5hO>@^^RUVRhq-cqEv@4vB2bYrxE0~P>+JFW*n9K%yyh%^JYAwe zD=}&s%R>;vQqrlAQW{$Ipoq0CMaEd7s)BTsDN;>oq?a;95yV~^6lIDsskU0{bZpZx zmNJI>C|br6gZBG=pL0I<-e*gbjNg2Je|+=mtM}gLewOn&`#GQGj&oMYV!%AVtst59 zu5K3c52{3QFZR(nVMA5IR{kTI8wxCD244F7C~0i-Q$i~*6p6B_tOc12Hl?ilhh^)e zDBh3-;;XciQU@`3FRhbxG?Hd>YsL4s*a>eqmHcPb@F1u z93->$rj9gyxr7dc-5(dZe-BZR`yC4?gZpnI3rgyF-y?AwU6Edi-{|FStSkYh_!s&c zdOpm%J3;S$hNTL1cqzUGOW}|A6fOQy`O7H9n;1**8_xl|kK>Z(bK<;#LOlmuIZl$5 z7hR}M33#NXkvu|kk9Cht+yP17(zBcdzUN1p;jt*$AN3c1yFt(`GcwvsDH8|sooDY! z!i7k;JQ=tb1l(gQ@P*j81F0(B08dfAKZekaD}e_s%b#)sOP>A3434JTDy4kX=3>lh zFd63_3@ z4phT=Ee)srh4k}6|D@lJ|15NdZI9|_-TX+}vCq@2o8zswPd;ZBR*(mSO4KalT zHWN7}f$?`c>z{lwJXQ9{%ANC1R6Z8$Ao4Ng^D2_64z2Ky_Y?^J#T&uQA&bIO;znI& z3?JlMuqe2e{4T=twA4uE&r!yo5G3JGY#IQ6Hn8N`U$pY#_|v%nY*75N0)JInqPN0v zW_j)AjHTb5FOJ01-)sxK zalijW>U*&IY+U)r`?>C(MCW_@B)AtxNsJd}9}4?AncGfd_d`1>#B z1OS_XM!{MmIRLbh50yMj9-j}~j=>5J3}hSmPoA8I1p0(i2)Q&WI_-O|32z(JRj7i3+Gjz&MUc3Lum=xzK<5+~~21ud!%Wylg`^G6P;dnO=xm zlC^5Gc@sNKu}Fq)xhr~H9Bmxu9Uc4H;esc4Rbj#IG!h;L|OabCF z+3XNN@b8g1Cu?BJA^@1uh=4B67V70$i_(aIjyFaAsnW!AMc{mMfFcJxR zq=_6eqfi?Q*-V23cJbLFSxg2n-QNcq_y`aIi+vlluE zPq_d~v{>4892~B`hZTa|&?We-cBgCtJHy`^zEYSCYUgC@l>~$M@Shs4kOCRp6X(U2 z-FpCD0e@fsumiY&oH>#I75H0iN@KvWgIu#Yc03gEVJ;qK__tme0^px=sc5BMi6`i` z_elIG#(4}C0S{kn%)R$o`$|K8{k4J@lOy)tXoRS(jq_NUNdzMxg6v;Y2ZXW%0K!H7 zCH{R+(mjo|B}ZZJ5TDYM2_m;bjd#_GgB`IKKQS|m8&;w25Dn$+JNzy|_)n;IhW&4xFwkV_&?ccEt=hNl*(AZWtny@&HMZkcEJ{G2t3Pida*?}ghCisA@ssuk0zg+jBJ#}{HIMISVLO(r4fu}2G-3+6=7F7O4k zUUZW-3mqV*7*qbB>PiTvOk7hWYigmzBTIr{07*s)DoF^gXvT$~Z(Xs=!2*+i)b@&K zbV_yEF>v4cDm%CpGE@=%Q~hqT)83`t<;Md9jZn@m^ZZw37rKP$$SVX{Og1%; z>T=K+rZD_oJt;@@C_zq`bvtC5XpO)NQiWJ6@V6htN)ZIDYLWLW?{W@W@;_<| z*sbG8h?TdG1h0G7kZ?vB?Pf>V+u!I5f?y8T3?c&$BBitV&=E|Y&H$ui+~dXGImR%F zmZdvUg!g>k1?+vWcl+4Of8kgR0Pd_U!XQRE!a_UmMeGfuc$UOH%@)R&0vjA=MV?&U z&$4W43{80o0#e1M-nvG#XZqftlWc)~I9% zwG!iji?S1D07-2=YOd^ZYNE7tCs_of$IN zkedZfpMMy$iRH86G@KJbdyrg_r}xn6?xs*~5EvDKU4Gbw>>`@t9W42rx4Ih`dN-3c zxW*8>%6J0~@x%>`?>XY#RpX`zYqI(2h2C%+VUDRo3vz0=CR;*IWkT4LQ62ijiNf(k z>L56A;V*!KLDtv(L zHTeMBOYQ?~FUPxqmsSwqS!}9-xQNbmAikU}FPM4w>R+@jZb?kyEI7~p5$7_&0BC1E z6U6Bcd|!d4$Ru9u;LBZ{{<}4*pb8U{Ai#Ka*Cr!S40Ol&K#>}YE_5{p1T|Jr)_Wx$ z#wEhv*n<-K@AqtE{<}EHuxpj1w6IlEu#GCuKjPv-91bHyokY*9wzy~nMxP^v7g$~j z>*9n>Z1E(Pk5=@y>qK;hJu-NWG@vFlHSFMX4!Bv4IJi zY$YZXiZ328;KSINYyvq;nAR#~TB`uxgrA6!F~A@i!5b~sCbj!aYx6jjOu-RGQQ*hR z31y2VI%g_aSbR(2B%2pv^qc2jbufMEDQ%nPPyLZE#ATMY*hbF|w6Q_{RljG=DQ!LS zuaa+XPiezDO>0- z-a{F!h-tJE2|-3=Wi&E~Xg^tJyfEOO>8;@S5h9hMS!;o)-QZhiruLXLA~1`zrGoFtCr)}4KEsi|9ee{rO>YJ48wN9(@J@@@3DC8 z-&Wm>>qfQ6{j_ad`y&4DUAt)2R9rWAAGU9?w3kb`*~u?l{yDWxEXZKo$=qYdXm|K& zN;@#Pq$M+bWa(yVJK9{PR#6Og)+Nqhg+ZofQd@%K&nK`sy3CLlw27trlnRwVm5L(a zW|InKMsoD?zhzA`-J(VDfXXfp&>?ZXR2l(81*1{W)M$y)Zp=8EX)*#y9b^y(&g&j6FiSOaG#+SB&m2wh0)2!M3T7aHGRQu)EKSTd^N?T!m z{iC>B^$vXEW~>T91JS?GUh4XRNj=QJjS>JNAntA@Ytknf3*kZDBez7#Ig5$p0Eol5;OJ%DK+%&j$)!pP{ zm?@3CDHDD3V2|mw%eAi1X=({D@lAv zg_m4x-}WH;V`4RG5UKVT(#M0^VQY5&T{rV*R#Lmb1(9X@@byZd6!}NLuhiX>x9Mug zyvAkySmO^+H48Ky)_7qF-8x}R3D1w05|t?7&dQIYgsmBBoF!U;O%0!hh{3q39;p9fG&!01+YLhFVrimcL9!T*2}ALo;_11k72x zxZ8hM5A8Pl;a^iVYx~2U?Cn?Xd$S*pRCb1 zTS%iKvcRY^FO@3iZH<}cDi*3t z+&)Z&2%AQ!@+6iq=&?1nlKjDsGxoH8!hFcdCYla3d_9--}~P{SF271uItNKZ$si`Ug7ICWP=%;XDKQ zJM}gBXaK^gQsLyzoci=R%{+oBvR}%Imb|t6TXsrU9gvCAyUHHSPRidIGINA!ONTHd zuiNClmT_R&4V#QgOVBC*nTOzH1+H?Faw5=L>OZtCNn)!Qp}T5}C?_H>C^uIyj+A*s zZomQ6&yGYT{gi+g`_Gq5Vo@hZHeimDX`BWzg#sf7i)M@D0a1g0 z4RVT;Q)~^r!Co$GLsR|}qk9RQ!rrKe_L%a3l!GUci3(J$;}y?qc!j2}K@-r_qx-2&;G>S|D&8$! zh)gwgf?Tq5%HD%BaZ1jI86~x$T}{0oC#t;I$NPmXwh7E*fX0VcW^8f&vj4AbrPXU9 ztqMk{Y5Y;yS_N6!h4or(byhx^w<{XuIbq-Rs`?&@3q-vihd7Y#tFXl_qU#ZQAeFEx z-+KWhibrg7{S)%TgHnoHK=sa<2;?-_3QnzUP@@6fm}a~oS_RMI5P;~yW_VU@7H;fp zw(>c`h6`l*8F*>K&6Ss$176yJpe%hJkttb9E&(s4S^dujg_KwQMjFj~KO^Par_bt` zP`z+>YY}5evoC)T-QcYL5t+MLKZDh4SN$Wvhiv=(dl`Xu+4Ssg%O2Y5$lbyL2=U3b zZZhp*qB(F|rf2J_bUnPhXlvjK2wKDDh}IMhJ+M#LH1x(>QbR{fCGNv9;6ZnTn&mAb zH88qDe@X%F8cj7S$J0PUV`3z>gb)fp4!ukk*LmX-sSbN6L{&$LofpXONKiji4BkwE zCS-~1(0og~35)FjDKZCb9HFs2@=2=uIEIvfQz2?eg2+u+42Mv=dwc+hZrs~a&4e>5 z&D9(M;A>Y#gUBpY>~))_D)w!Ap{2B0DmAug!g%uDnS^oYe`Mt6_J#4ZEkzg`OF~`_ zF>fyTMNEJOyxjUu#%|UxjNfk|T@|^mJkH>Wsy{bdlSS(hk9*i8@SjaQ`re&B@!Syy z=JQ{x10$$dT1QsqUlNZp(ZnCJNXlsOJ{)hF#7KMMQg%gRl5I=<7t{#=z!?B%Aesqj zU?74yoRIsv=cjVtHPHSY=DrUGX5zjFbmcd>SL*NzVOfcsYeEek`hkNb9#P5s%q@9jIf#(m@alKUL%NM=Rd1gsBwEO087 z-0D<{FW|+N{L?wj4=NMTU-rU8UV(q?y%?((`{~j4nz<}!#*9K^#Qjcct|yxV3;Kb1 z>X;cBEMF-5h0I91$`|0~5xDlkuS=ys@}_DRd#35$4@(^bg?P>L=in0?G(Me5e|*xn zeeLz@ySm0dd;CiIN2tPY(ACcr<+V|~@gVTSSj=XRVIcK^TNw;%-6~2$^QH5pw9A(w z6kLoKIoCy2_FZ+lxNO6iaMq@LX!?f zvr-1FipEq$5mklruES|_ECARcy*j4>_eyPU&bigXn zA-8^pOHSe*U!MMe3*d|FZ}!6T*uPKw6giI_c#~|+QY5xuKlmrfeY?l(4--?6CF)4T|DBvYpP+qhO- z1q;y#c>dHYAc_WVw|L`q&4k*EZSf#^QL|@W?3{lXhhbtRZnG=VWj=_uX0aZU+&B;J z8S)jayX4`vqNs;?xJnk{TIY)%i1x6d>j4$fgCHnt54{(%2TnI(!Gee$$H@7pl4)a# zhhTyYNN*yZ2EBx3Ig*YE=6j$hRr1CWg~;{!x2^kW9V-`cJw<-qq~aktwRuSC`xp`y z05#bX3d_?4BruEU0Ip!>ZW*c|+j2K1>?q=VR4nu&G--1za|LO(b_w)q<+B%?6vRj_ zHwb+A!(Zj7qfUlaXErR{bHwA%WQy;q-s)aRA?F|iPk^(}t$!yyGgLZ;mAu$9iA>2e z?T(xW9LyKcp}qJZaD!+?{^Z`YMM=ps;a3=bTod=v&i6=s%}Y+=WPN%c;z{AjBuI`7 z4c!w@LwwOG{=)e;ogW?Z2}JX=_>|9U$Q2XWR>#WGw5l~vK{s5rYJ|WXki1ZoKnIPr5yoF)YvWT zyUUncps-_XwOFQlUQyEKG{BLh0!4|**xZ6AqDytm%yhJ2-&qSdH$P43sYW+C%M4Z0*Q&tG{Eh65dm#yMYx z{bx5DAG$o_ZroS1Vc55t|lHiG65tS3WaBI(xM|($xyyV}Iv`(XNin z)>W&tZhR%CQ26To$2lr4N&!vGNjN|3Ppph>`I|5OEs#lhnAM`6enL$IP||Rd9t?_S zC3RD9Fz5>MFd8qXlk5vagEx5fVy$!Zydl5eDuTf*9^^D0Z-C0z80hcx)~58N!ju_a z+TPE&Imn9*Eir}g&S$Q&_!@UeM46mIa4So}EdqhsH|Yl;3s%L7;6c!ehXVh4*@Wa$ z3k=J8s<{=cxblJ)DSw)j7ng~J2Ny#UHy|(w-=+~us1H-*8pKfeAWk6b^T9=!g??Gs zn9a#}u>s?iwTTPZMK<6y1&bsK{6`fr8{HP=h{1o&!hGVZIpzyB%`1;4@%aIiF77Eq zc1tu$34cI*)D-RHZ_BfEqNp{tQ`FKeJuA7BSA|Cc&Cx0>rJBRBYM%ec{ir$8OnPLy zW+_#1r_=>hXQ_B1*9aNC*d{w0Q%&`gn5tMHFys z%WcXuj>HReWx|xT5P4mHl7Ho+EZ8tu_zW^oZ_$NFg^!s$DXKDNZ zA1QZO+}7&XmhtyWik;954H7rRQAQILs?Y~|bDubP*o&=gt-!5tTI{n!+`{q|;`76z zu4?iJ3feb%~Lh zW;=q2?3U<*C$tp(3;h*4|LdKO`BU{1jni+Hg-MeDiu0$=zCZA%Mp4TxI_8fIJy{s~v*88k(jYg&!p@Db;phKq zgaLWCE6eVyiaIx6bvDqdzG`Mn!rKr`PEW;T)j8&?_WMW`6h=;!?Zxh^BX@5mX4i{N zd@&=A^~1>Y|0P-oxjPR>6;t_}L+6XHI#3(K_DmQLIB971O3->74>=tS%ZpFQb^MQOX&dff%lkco^4cdT#y<~3_ z%qW6&`Wj-~i)ccd*$^Ucx8gUy{yfqY2`ufxR@@`)RH5kI{VSjskFEL`<0E8^kNAgn zWEUeA?Bhv8I4oQeXBkF-rQ%+T`F8U0-38zOq&r#QO_Jg0O;$2M&cg!=ni zt5L&0_dkN>Qx z+K@h$F^P5S-}I;SFDuMn6-n}e$;tCemk=!#)8?#@;lxhAEUMps|3c>=-XIy`CkRl) zi><#y5FA@~X|$6~vvndMIU}-?@CjP(ye|nYa@vx*2FqB+;-=*~p1roy5%{~w3MwK; z!WBzKa`0{v28>WZ_<+?yxz<}I0AUe=1ZiBv2@le`h|@o1!@GEVaNQzYQqD^1;8Oxupjr`I2x-o8*i%(wM4_44u(DhsNUMyug=y?8yp@Nz_2> z?fsoEIsH#WqWF?<3ndxZLrz;toUhK~F!d)J={ht#PmwADQlP+I`a&hFSs$O_BLLzf z|0t=mi9U!1f1^CHrb)-RZ`LPIQaB<{`=W*)1CA1N;INWw%Lz>t+5|L%4VpTA>~GNU zQK3O%ki7#M{zhn6)1Z0(-vAz)DWNC#N+MoV#OG-Z1Id37b$stTz#|THP9o17XnM}w z5_9M|c1!%3-_`YEn;&)p`s}ciF#Nm!#)P8V$G?cz!EfMeJQtoFX;P%>WS%kL#eVG?gY+msT5SX-%jOec)ZHn$E?j$Ni?CD;K~Q;z#}Y-hUB)9>xfwD`sgNlb8bS_(+e9jWuY! z@$rd*t~tVEjZAfF(ZSK8Q>5r0qeTZToU|d1_M1>J=3|eU>VF};n4fdsGaUIEfadp-#Zo~isiycx0i`zOAMaPno!kx^_t3aioQ<5% z2kyI^x+w=IIYr4)tA#o7izCv$-E+dfC{I!!CEbKle!VH?O zI8{|{g_f0zek(zXs>+@_0o5@ex>!|&*q%6{IPgLbph_?pZ@oQS*-#25@4Ff<)r`2I0{@cq6JTD+-{9>~H&KD(vItqJd@vDi`In^sX4quW$QMojtw9O4Sp+uY zAMYut?!Gi~U+(TPiZ+%N+$QK}ndgodIVhx>0S|fh0Q=ff+{`KswD7hSJHvcwL9}*Z zSX+)?fPe$h5Y2Ge0?1LsIH*J;6p44Sxz#3SP@jKEV`92M+O?xmCod)n7R8rNChqvh zPQcqFDO>{(7gWX#`aMY|ZG{7n1mQU9Sl)WI14A-mGU(M3{H|ArNmJ4*_cjU3udk9A zMt0-6xlE4VxYR)hIKfGN$@UwA1{UKei}Ku4;JWebLdF83BMbbR7dgEf4uF&T27Pr$ zaFz~z7J{WBPFDDZ{n}y;=~_=|`EPo6UxjM2XvB=7XOT#{Vh}Sa%=>TBFC}B{l-f)a zE{i(7*st7o0MWA3KY9MU$N(qnh81kIfx5va>xEiifw}U68baoiyjb&d$W*0i2(51# zVx`nE4Ixr48sf~)k~9Q*BHvLHh@FKLXOvvyJ7|avXlA_F?OO&4`SB+YMFVQnNABem zvL~q;kS;NvN%9_v0>l=8Dfmm$FRi9uzF%zmr4{8Ue-twQ@t(Saf4rxw~K2LiOK-kYu}Z}Q?+fGNv?Rz~3s`-Om1IL(57c|b$5U{<+)O__DA zU$^YY4cQDA7!ri;dG84iLTxlUI(@M7P)vnbK>Gm`Hmyy5wJ^zdG_XS0t5wxyP zs9*v-;w9zz(}OPvLow&q7qWndrm>lHw0cqTvtw7NFp(?y-q6AB%W#>IO02TL=- zyfoHtS!m+#77j`FlZy|?g3xV3+!U?Zn0t2rz->ERykQxGJATggw!=iv07mE(i0(o% ztxA$|3|gpWx`Z^AP+)ep)MJfeGUY z>=C9Vyo36jGBQQ0}GBnBQ@38F)8dpMVYrEP-H;kqyo%k!nVSoKdf8-bSR^C!A> z{%`K=0twEQt@SA+s2v7m-Q7j>|9I=#b%{@yG}j!_s>fk=w}U(CmfLTq3H4i;Q1@bE zR#}?Vi*4ExdZ^#-;ylzHrzPsYhzeT}Sm?zrNe8Z;F!KGFs{XioTopeI|W( zP*WH5-KDZKK7|CL?;h_W`ZvC*Q~GY)CxO1(?*35Uk3*w4^ByB5e5)220a062Y$V(_OpPeiwhl^9OS zTTILF*)`_1*sQYik+3Um>3=!M(OY3&oszU?GLiF z{XzORNEX8&*XSV2ZIEp?$O;>zG=@P+pV2{ju}}VL4&}2?Q=3m>06hsIf$ZkGB{wC6 z#`@x7Tb<)cc}@t6J6MgPm=*l~d#;FG%FVV*7v2b#_&0?@5B;(uz(ArRffMT{4cnS zMZm2jN$Gi>N_TSgowHX@>s{m~xw1B{wY|8%8%Q9gBMu&Sz!#eMbI3vLqnpe4G&n$7qQwF@`Rgkq| zGhh6bP}pbRst~_zU1;#VAq%NEIuxA9GF9rWL$|b&=~8q{WA3I~2XV&M>cfa!{QWjF4T7H16IFg?y#{aKJ#vH4{T1F034 zgyhVj%dX7gnCwWY8MqG zZ!w)%G6XdM04R)U(x;|bcKJ_o*a0qi(taumlUPyqEcKTR!RI!RrpK6rlT*1e0J($L zxk$^44g5#oIQzGTj`J&9ILG<#_~|@jfR}5cvtqDVQi&7)d8oYC7RM zE?w)DI29L+NB$!D()!}6aJ|?!512n)L^6TAr6j75cY7}6_xeBoG?n%T+!ngo%Mj6} z&#QmNJ&}0f@Hf+NXZb@f_Sw?C@ESV^C(AxOCIh3$mVE$!f*v36;(*sV@h*(0lfdEh zF;ZONrymOaGhYL4yx1eRS|H_w$A9%uMH<-30YoL%lPkwyE&QLk(cFu@{k6gLg>2ZH zMEkT3EMEdRFw}nkI0YcLxx*mj8=rL?<&;Gw9EuvVZ^XMvUZ&wDziIIRakHStb{Wl< z2ktVuU!hoYODg!Aq=6sw7z|-wt-P5V!mi0f7)hwS{LjvZK_&Hw`$w$0d58rpOUqQ0c$g9Hm z6o^BCUwxbsS-#PY<|o}5PIk(z+{j2_-6=%@V zj_e=Ohe=5%cZ}?FUlyGGFe{bp{SHaPS$DzNYp!T86kuo2M+7q!XFJ%hS#Y-3u}L`V zo`f?ST{6yIe@UP{C(m5D=Vh%^fU`GbCZqr7?>U_LM=XO@aAG%kk@CL7+HEYJa^!Oo z*0Rd_B?`x)n^Lj%;lWw3Hp>-_Vr}S$nXuO1eg)RbGjQ74qZMoA{2Kg}wkX!3158HT z&76_(V!!ESh-;ALSOMau)0gr3|NGqlaebF2A#R!I35U27SiDP!J5b@c`o>hm%^sG9 zI2F-TUC}7wcKur>#PzjbvmkCsWfJ0|B070dIKX7YRV`yBTc(7Cs?&%FFcjSp8kiNh z(nf>_t(S6sN}F58$)eKupwIHXHgVUvR6>G|K4Q^YYs7z|o=F;d&x3n!!~k3VZ}ds>-}6I?Nzh zfj?|1i_f#*DsZJ<6X438yer+6(&o&SQlHFRsa95kwlDEtyF#&185#S8BRK8}hotpZ zdlIH)Ub#D^Ct#s46*F$H-FebH35yIJPWfmpiLZM;p!@VZx-*j((}QtN*QzGxIPIj~ z*S(yr$w_>!Zq(iMlX@l2Rd;C&r&@X?cH$)`fe(oB38%mF>1{6m@0GZVmz+edKK&J& z0k~E7Kwf(!{)R>R5&vpf@ia?T-qdXKGr~7sY~-yLWQ>>9SX2$}D`n#$?g)Z@e1;4v z^B?e>dcD~jfy|*q#Q?B8M-$-uw6l(bPK2}Xgb_-!u zT%HFPj{xfP{BIjcpmAIxF55DjA|EwzUq2FjyH6h>hVcvJoPv49v!toOW<0?oPrb74 zmt#+43Xv2DBa%X5L{e}_qz5krk-R3IB@y#?vNYKLudfACzsYkEsSh|)a$gvlgsMPk zk-$Yx3pqlBt(m9+uN3%wT9q-QMYS1|OKpoqufKLHAssZTtw)3g1|8?=E?uwe=%sbHz94nxHlM$>DiE2 zKl-8C->9Ttcs@@Kq2`7>L&Dv{Fo;`~<{q|tzYkg_e*ol4N$v0vEM?{Z-YQE%_D?1! z(C8nEio9Vu-^W_RNEMB-4 zDbJseGif``3;$lgN@C)a$?Jq?AXfggt1`Cd>_T?_xNB@wqxqxh0 zoAhPUCyi_ck})W|<*nnpWG628J;}yBz25#OTwVcDfk@)SpZxl{43WL@713k&{5Pg@ zTr@pNI>djuyIN#OVUvb_U&*-jP+g!So%Q-yU8@`Mvs^Fo|zb(Cyz!um&d zbetDettU?;jXG&&XK^aZiyatgQ4|X);BTC{#Xw548t;Q-f-8kxWa&`($6Zsb%kkBq z#GwqZBTFUaE9v^2m_T>CM?%i5+8}W#qi%ciF=KAK--Gu(68O6FI?x}M+0h>dUtY|h zyhmaLFIN0(2IxH!dA#&WR3b8;;qMf!W#z_dkp52u=_uaxZP>yP-uFn%{{~S&lK(#n z@LCA}<_z=y>b1L=lqx|EB zMck2z^4{xn)6MFRjQl2WNB&0V9_|RvW#a_JLOv#)oa&!Ag1h9ztw5^amG7w~CsE5U z&;%OH&uppyseg&o?|g#JIA%h{MV3E$!tD|eiP5(}ZI$>?%{zf0kxNY9dMxYUP} zYs|-CC!f3#mj~`K9}ruNl4P8mZh}Ud*`}y#U)*~vrXW-etNj520V7?+u<X&9Gg4i?y-L;z4XaKrf^ z4Tu^`$b^d3T3S&6z=4g5LIjP#l>OeAdqwwPx_5=lkU>X^s@)x=b^##7cGo*bf@BP} z!e5c(oW)krnnohSs3)=1!SGn(*Wa*-P!*=fyhC6#oUP4cL0Jp0-(AbEmm~FnyE?u} zjZN)m@przF;UrI6K}AW=*hDB-sBgJ)C`>NCARb}Vv(WNtk1C|B*`v5T(6jjPF_Hks z@zDS_?4@f7YR_Z-swUkQX@k_-AcjI=p`wDqQ1QI+WNzanXi<1@FBDk{P`GXS^^n*Z z{?2WpG$^V;+&>Kxo=XaPu@y(!)N3$pcw>KpDl%kwR^)%)Iz(CN#hdgcM9Q{Qc(EJ0 z$Mt24ycBu+kBZo0L=5ot{xF+zHPe#U2t{-y#Vw2{Fdr$VbFT0JwfGq_Ar(okXz3~| zEz!>Gp!7ac+P`Pl(jZ$@1t zW~OaT6+30@2hk|>FDs(1;pWB0lQF+-?(U-`Ij{%!nJX!P)hYoAnr9+aM5{mcezm21 zRImF$2~%vz&k_&{=uG9p7Ue?Zzn*hpimlYh^ZTApq6mP)lxISYbhcRH)q2Z(kRy-c z6c*0^a?Jr|;0*Y8-!{7g?zsO{O~$4p7F8KOt@$;a=)w8&u6fVajO6)eW^1yD%8G1~ zrODf5?kGiu^6OWrD}B_ps#?IA;g%ASzxL&5=W`%OUX!ko6Q%G+X|VtM&j%@&%UeLQ zl#pX*mij^?+wfn8{CiWmIj zJ-L*B{G^DVKXn@_DlhiKXtd5F0&pG|T53fBUTXvztwcea$md4zDBlnAC+r=%w)l0W z)S}jRMKCXf^F=We5S)E6wG^ICAUIXLgJ3C`%Tb?y1apPnIxxRy$Iws7V6pm~KaLlZ2ww1_CxjZj`hZNNOvlL`cj~QYW)O%Hq6KNi}=n#bVEdl3Jx<2oie!vym!RTU3C^5>CNcSs_!a$jwUi0-B<&Ls)Rtq3-JMn z3##LdAoAbhyZj~I@O6Bbm*~aSZWwQPIo=Il3tvI{&z1qg_klk+SMDcKLgAmv12m{V zyUN9F8n1=CP99J2b0hvYpZ1l>qo|t(l8r|e{mkq;)9uy`xANJD^Z3E zYA)L!ez#@@Op>}TPB9N>?ftt?uYxb@#QW04fE2 z<27u9C~;e0ugRm0hOWOKD#NzGR-?+%-&&PrVU;nu6tbE~t)ZR}HIw3QHs&7ib>Mxh zr3(Y`7w5z|y{eqtk`L3?NVFgjf_-pq84ZP$gsLwv6X(z2E`2Zd%^!yeuKe8uI7ukL zpmDG%&@3Hl9=v)2;>81S5&V>*5SKbpn-G@}2y4~>;gb6PfrP{qqZjLui=41ojbJ2R z+3vR866jVF4LveV`e2$J9nO#k`u|W4b@CuHMEnE{;-ON1?00l}>G&5%J=EXidc`s!@=`89NZI5RByUtSP zg90*-OWRT1xJ)27jjOhZ9@l$vrX$u>&GgqZWaP4Iaop}rc&OASU zW`NmRG6kF+VpGT<1Ds6njAy#SBWa8d&>Z!o(H$X$4+5EvL0j(Zi*Q@FP-@V!{Hf#U zj5p9Sh$l-6jbN|PfAQ6}&_}5s&Qc*LvPoclxb8;AE&|^3ulzx<4;zX)nen}8{?sRh zd6*(meE;dHW7F{c#*I;Y*Q3S=FZW0sQ#Jxa;2di8p|aYC`tH!iyh9r+@{VYX7mPrs zWQIczQ2diUpX!?YeR>M~ zlOIwNeZ|nM{-qz#O*jxsWazH=h?%9kczY2j}zg4`M0>IhDZ{2&&WM?X0R%zFxDkb!0$lC@CO19>c?^6V)uTZInU;; zD&mX+Oo`VYznw*a<2>qL3e=z?>7{iMVyUm=Ht*&HCljz@ALZ${DNRofE^a@r& z5)eeDne}34er~nj%^&|&t}1F-bF7wdU^ z=-i0H4st%d(4W8L6w*B!q-s0r+{_nRnsd`C50vwq+gWLzW&%h}O{_gAxs$fwTs_*ML`HeMm~+iWnC%yj1~DEGo5#_b`7gkI{*~KEd2wz;k(hHM z+DV+7eZ}mD#&+yW>CVlW*G7%4Bz8bJ(9<*-GA~1GJiF)5>aS z3+F@d(^_ZK(@OSibaXQ_46RHGhn`KdfZ)>m=FHKv87VxF?%Awf9QAAluoSF26hJWP zx8!;?Je7i1LfDgcDTXJ7yMUE|Tf9Ce-a}oIG)vo3EW<_ysK9@j8=r7~&oSBf@hXhU zFB=me&J4Zu5U~H{-mf$%|_+Y?nJv zoD01Rjs7i+0cj_EAc0wg4_1;GAtEPTmx@TXn2JaTQVK%7*b|q87Tj1Rg9TSs$s`4# z1z&YyMoc!SWX~eh&Vo0~10{PW&K`NOzdR8#wTzcRk$-dM79+ID((3Y?2}+8-5J&9F zbJH!jBbH2vWYHC;91ja#4&N$B6!|~md);Xk{1f*hW--_KE8NpPk$lQwk^3(+x594* zCC%@wBSEz@}vQm6#G3JbFY@4sK3zcx0^d#5lCDg z(VzV{v-Gupp*hvZ3id_ z>^*MjC(D!o;sSrvEJYRGQAg3Ba{*7GzwJM%`jO*iJX08N_=<})!Twz2B6|V=P(1(1 z+kD`Fy9%aam!SyVeEa~nxz{x+bbM6(`Z$$+iuQ6*s+;<8bCFzH11qKrMBn@^VT>BY zX>3%)Cc}1uZ*N3#oX`1~2~0Th$ru^Ed;heN8Cwj*CPS-tuvG}mO3tr_2KIFsb=juN zj>q7~(N_y*KNLt)YBL04Gq5U?G_boIvvwU344;ETmXC(vCV%RIY&QkP^}8pd_@3#h zDBhn1Qa0!~6g#(XrcL)c?EYTd-40{-rW*vi6^~}eZqE}sjoky;YASYXk@+k8)6%YC z_Aiy>Uy2E4=1SwalvgXC|M0&s|EcHu?|vTi%4awirVeGmk+0O*L~V~tI9iDde$oGP#@x%^51jecLU%eUsXl1nyl}0xTXAiEC``Q5NHSFkD+3`arI16jP|{&+ zD)?W4zwnQQD0bK0RG}#7QCFpO205xGa4-VqI2Z8_7MPrzzkBZ-|FCMVB%wK@w!usE zF$R3?#g<=gWAAlw>ezb#bd3G3hH&gxycdl9alu`?V{c#)=X~3ubJ>P~v-#LRpl)yM zOJuiF?7lJ^JHU>!8e$5yM ze|p!Msd2{;6*N;@(W&W`Kz5Z3wikUHFZT1Ap#CwD`ez39cMs}+KnCrVcp4YL;Qm5> z^y-T%!gzJ&IJ0*Z!dJ1{;kE_noQo77P)$@)i_KS;0Gjg*8h^MHGSXJz&9|2tX?K@5 zlSuR*l&yb_cm||hifI)6u0+s|dNp?H2ukR%zIP!U)BOC?X+IxsER}TTqRw+|fmNrievq>D(XRH_Rq{o5va(AgL+G|K(W-vcy$#-T!`tfpvIiT z!y4NLHFgYYd>lp}iCZK0BO~{PxJQRY7pu<0?F|t)whLPQ%LoU@A#@bH*u!V32;p{z zC>$_V%IdcTHNK3*FEbmz^uf#ub0Tsf(P+zP6@cEhIKTP=?TZ3bJS`_NP zAghgtHaBTH8BIXT-f)E)P!J?{!?#UfY9T&O`GGTvs4_)wqPjQ(!r`$4&*fqpFuMOY zcs}@sdO1G_`J*48zVxsV^(}9?AwOta3=3D?3=&TSiNn!E<1HP}*3t27`>Gxa?SCih zkz_pL9_Rl2X6Im^aGHaCs|f7tJ_=y3Jv4;98I3EszC6qbyy|8HI>bNbUgleHc-9#p z0>5{(45i{8I5$NVKs{hF50pDz+kt!jZ{F3s8PH9;015!-@L{;zrgYkv;-fU2gVa@U zo~zm&C0vzX|B-a#RC!Xf)FX9#E$OPwsD0BEhH7l*H_YB{YUsvxvH6@*NS zi*{gO3N|V5=g3AZn*t1D9*;`XD|_$s^c5w}V2Fm8MOZOx(Gbn{P~smveC@irNySGY zklamL3buj1aXB~`gB0y1gWQS*(gGUo#l?!Dl83W~kpSDH*lnJFs~j}Z;o&ZrMvib! z2yUvind34y6Nwh#XD4Isd}%5LbFzPQ=L1FodE+R)L8RCbtgRa=dX-!l=vD3?eV;y~ zg)3O9L;vv;s5lgBCq98c$VnBK|2WP3!MQ??*y&elKF~i&7B>-Av1M}*Dh+sjz>A#J zp2(uO#^pNGPL7;uYnZUEKz^TYOS)p$**X|MPnr~D*^$0Svej09(WTU05_tD^KFQ8_ zMeCxSP(|ROQd$bb>DBm39VreuHPM1Q z4pG%9ll&*SfDc*|I#eVT8x+XJ(UYmBUX2-@!C>VpaD~cT_Vhu(3l@EED@(ZOOh}q$ zjJ&2Jeda#_SLpOY&_)r2IC-rq-dJ|#a%w0f0k{(IORTSynVj6EF9t5qUGj@8%5WS8 z;pRkxns`}>YEwV01Q>l3(gP3`1{{k(PLns37dLeEUu5NCE#t&_>U`R8=c0VL@l!m` zWUUwX%sUpz{SK~wYCzg#3+GyNB_IHnL~H{HF6wF3Q53+ayjBUZ0VJSTCr?OrZc)4&CRP5FLubDU~ik; zR+}Hs6?A-^m5ArL2l4c?1gCj2gDcb zBnK_N0&M5S&b{4ITHxaXBY)#%Y?M<2eAW-%Ty#rK->mBKjENwLtoI$T30wD z(FnQJ7dTPgfBAuMj;xmJT;`%vtaBmnHzI7P*IA^cJbjo=@L^FBHNfRDDZbJznQDO%G;E!Lx$sPYJxi}BxYMrg=feV=9A14Pv*4*J0s89Xr#eRC;`QT%R5S7e) zqo2aW&bnxJ*n2Ds^$GoZKv?YvSU@&W;19HF&||2Zc%PFzIf>hFi9>da$eHb#rWb`< zQqPD~9!TX4XPPPxC8V8HEa%9yPl^fG8(iJFY=tN>1cFk@`{Q|A`L9{_9E3|N9*WO|vs!T7I{L1>*bWLxiM$o-`>kW&Yn`Y!&_=CgD>3za7NUX$q!?VL8LR z159a{cYyylNm;3iJQ1h=C#zj|2fM4E?PZA5u70hP{-0PHbBLOO)cmPe!iLlTyNtHn zi7VEe>Or->4vPJ=#w^FnohR@#`w z{c-xd$iLy_RQG2V3!3{g1NZs$^<-ysn%(`mgeAOKe5cSbJNHL*r$p6eh2j3xpgg!? zWsSN&d{k?^EAP@m-U|K-Jsg+oOpAil{Sk1*{dsU$s+Q7v>Oi~ki=*PkU*Ip{jEol> ze?w@=6=IOvFW)y~ixKxHORML}JWuMDZl0iY?}Nt!Q`9P91gv11ORi(2djbislmXKv z{~7Zl@BwDvholJjFN|b6Zw{5O)ErhxC&oIex@Zo!+C$ADd4S44G>6Oi3(VmPToaoC z0RPk{#2k*23()z&34!gKH>3iEDLh^*XMriE1!N5 z`**Xmf6`y6E&avq-}}z~ourB*-Ts{u+P~M=WB;BZ z*QeXR`TsNfx4*N0vd)Sk3^}fb99P(zi2Ylg#s1YQBK|Mhzj5u_zkAQ$651^q{{J`j zZ`)4Vzq5Z)`?r5aYejvUJ)T=~0V=`%U6axN4b0eL2kakPMJP2(ObZM(r&%QfeDB>| zw155o=k{;sPT0SP)&9wa_V1|B{*{M@EawSl$i@#Kf*{-)`#Jk}acKWa!)gQmN;vKL(91|9_a-Kk>B?|BZL{?|2S8uz%x_ z!*=msxv+JM_OtcLVG~`H(uGP%Ef=%>{6L*|6(onMLcA~fJmm{$-xc5SjkXukXYDy|V4%=`yH|nh&awSPW8XTvp;Y>_T?2IItQ$ zW3-kJw>0=*2DR`H3X|+$HSNzbfz-}MkqBZ+TaV~j4PO64Upyjhx8WJ5gc~3v3raDS zET}}I6BUa3;yT{o&j1-nps{|cUlJe_35ZY&*s4QmVr>nt9ig7!I_*=cia6cdNOlu+ z;rxZGLW8P3LW2EIck2Q%x0lV2Da4dS+N>@Ta_&x0rgOvGYVax5)JU>={fSl8g&Ij# z2&;(DyKst;(L6475U=Q&+KXyMYXlnnM90ZNpJyxLu{U4pwf8uN;lKqFU z9~!IkHJD0#iue<`ej4xy~Llf!x}08EacLQ-BH3@ z>TEAIWv;7su~jqcy`M&}KQO54mH1Gy#vM>1nS)qmL$`gS#nwzYC30<=Bd6utRU!{o zbCj9*ZspLfDUkS%;JddOp=JqUd-Gkd#AnQDBZ!@jE2LBY!uVC!)4XyJ?Dl8zDW7xO z;GWxu=FYauWy*NYdP)^odAw1U1#x+b?Ad}&n=p+2SXI2id8>nnPy%Eg9 zlJ9IINQHmIff4*ak^%k<8Rx>zLcdREpnnG+fX)Ve6#rg*aSl{~^ZzQ$|Em+@7(4xR z=l{v_uE77BQxN)p(?rj;n0dwa4S9C+0PcLg={jAD{QorP|4Eb4{Kt`O75?8z>i@w~ zLS%JK>dtsYKV+0NPF;eBDti$Bui75q|H*cAriGzzKDtPBPYu)EasCG_Ue^B+Y9TPV zEv&d6A7zCHHGX#BK^-c;$jVXspuF>-=7N2>r3RgjVCLDaGBppXSzen5HH%oJ5(Ka_ zc;A@rLCs(V^Pr~TKEM7g{sJ2;mNMOglApzcx@{8_OqtPavYE`8!MdC}L5x#=*YA;P zbZg|jD!=&#eICcvDi56Jd`PBh;03zzC{Z?L{}`IKU__Z1C5rY9HQ~RrE%?!ky>XPS z5Z?&1Xx#1sLXH4oQrAN~(uYm2Z#{&vo-QDuyD z?p{~{3WeJu3rE<%*-Q~9uA7B!TXH>bbUn;}LAF-kz#SaVQqXDoa?z(PK0_RJP}H1sk0&^0@VnwIl@madY-3Y zCOQR;$6!}WV{X-)Kx+F-Pi{rMF{Cy?1q@crGwwwGUWD5nKtf`Jft+xcuPaPJgX6dqY!a89gY#G>={)=nOYg-z?=$TK3Cad;H)e}1_2~;P2KV}J?n*Wg7j`WC1@9I-oDUA)juqAaJk>0JhCL7cO>0XO|B^f8A-c3D?d5jS%(zxCH zJ=L~2|F?*J66s(K(JFX=t7jVmyx2>JyIN3<43y{~`fqNFY96a4n|gw;x=G2=Dx_hJ zU(Ne<BWlRQVv(S3A|Ko`Q=cq`J`ik{WV~_0tx?NB$w)eYkc)NER&chm*T4fXo z9Eit{hY~(4=UBWBsQc19GEC|bsY*Vl?y=#NqxNDCUL1y8(w*S9b{md1I)9_p+tvP$ z$aZ-g@gdqjh@Wqeb&O>n4jv_r8JI3u#p+l}IMf*gXj3dNH2Ev>2W=q+q5BIqOYnnD zEukHoCGW54pz+6&d@@U3_H=4yq=Gn&#~ZNBa>bu>1;Z6&rAqsqDf-5;pYKw8Kg#TV zlVp=}FKZ4o$FcIuaj1v2j( zZyW0Eyi&3NlyQD;pOCS4md=_iD+`UsvT>6Q6`uU z<$p1W)6FD`>yzCia{ma-15DyPGl@S4b4>$Kop5L`q#PYsuj83b8Qe?b9+`m502aC0&Px6R_4fP#G3zu#71*i@zrYrHgKXqT5NtkEgg6oeM&{rPGZ~ru z!Y)wcu#v2kBC#?_mh*Afq;W_lp$!Is)9e zcerW;t(st=DzOi$x#7RM8u#52b9mwUM_fs9`CH^}vOI_R9qj*VbNj#cL~?}tzo^xC z0y6a^|9DR~fq!w2dpA;}cK#+I`?oBTB3=w*kWiRNYg{Ky#6CaI1PdxhLJVO<`?k)# zDC0laH(AJ}5!F1<;gVJ1b`nIf1^$=EvaI|17z(*{y^_=L%1-&$2yx+{p3H@l)?~`V z0<98JegqDXl=_2@&V$hrT_tH1_xX6m1Eh{9a#EK#imOt4Bzoe4pZOQ!SM!&>_ptm~ zIVVv@u?TOfyF;(K+#k`Ly4MbS?h07JAAhVu2cTsa0~b>Q5g-9JGqOaa ze-Hbsp#og~tH0&H#JXbs^A9fnC2OtdM#%>&DXo`~qze zc}ZecG*{w(!A`u`@2A?1Bu}Q%n0!Ipu?F}^V_0{BR{zubAnz(4xr}q`6wp{5Z-8qF z>f{lVK?}(Nn|}+|T%pUmYY#znc;{P6m*R)oK^IeU)r-QWS{@4BC_7~+DCh$oy=;am z8+a=vJ)G<8hf0X~7tahl_t#{uGuYUA92>yN?gY)H?3T%crR=~8#--?@FzNvp`4ct< zCxETNIJLU%i6ZW@bIrK##I~nB#M$lK+VXFQ|Eh(FTR+{DUzs_VF zyLAWE%LFLpRKCEZ6`E{Kz)U--K>(~Tu0u8cQBhCRTQ@f<%XxAB#D5}Sni>X@a|ET~ zv59$n#*$t7gopt8AI#9SNmH$&-;+MZ6dVYu_;wo#Y{!xp+hA8)DLH7=12vQe?7~ zA7e@hg*$SFyhbt5MaaWd3i?F7%(O`Y$h&`f_teSOm1F~ByTqpG*q_^wX|lCy{b6_q z`v15a`*-5vmJKJqrterT{W@>u7@c%|S!YjMb`9L6$(vOGV2}~Q^y;Mrpd0leS*ewKx@!1sMN4y%26gR9olszL9eZsIYWZN(Qtxoc*)&Nmk06540j$BE(k zpwo9U`>28t8&+%faX(p$Md1}AxJYzQ{|V(ZXxPuFpQuc;ifW@NTc(jTe3{|Tr$_kpLha!Ql$1O=y-sVB8mRI-xJ$-zd)zt>g>MA_8s>rG85`TxD z(2x8eR8&9mBk|yxn|2D6!nphjP*at{{6;6;JLM4^@P;ad?=_~)xtnE0DQw;=toHZo zT(#A`w3;Y|c;aDHgSUPWFF6S=#!T{;hZV0eXL;oI77vk~L~NJLq1XyLk3ljB=dX@6 zM&AnYslE9?$#pph3r2r?e=<6`75hsY>>!XYWVXxN0oMyNQwSQ%b``Kg{_lon$p2Rd z{4X4VD&;b0@IM%QUU8k!-*UPt4533P3$cX%N6;z3?5#gmKHV#>pfErEUYVuEZu$v_ zkm$-2j_8BoYJFEUDw*gAQnD_P7}OoO!X6gD z@}|lh@7x(sdC%Oi+K++7*wCsOm6y>5_eflV3m{0+_mS^))Z!fORUh%(I-=Q&y}4`Z z(hPsVPXI@vF)t}VyVqa30riJy<1ysPaZteE&XRx}@};vk^pyF$N!0%q6^%d#5Q~fVRk45@k~<{i?Vlw4 zDa-wo6Hx#PqpG4>6?!{5Rw|p75pVV8zUIbJCoD=E##H-f1Vvv(-@2G>tqjYJ%U}COu`?5%N5-?q@36 zFV8Tobw&w$iIV5H=m6v?8l>cbY7w=RJMhXt|Ma$iG_LwbObt~TkS?}HEX*iU%~=%? zC$uU>{^cS!<04UL9VyxcX}N@MSSQJGzPN~;B**jvGm_&=i2=(lTXa;iUWDJ)5pwLb z7UTen!vdrnmvN1FJ?mQ@QYvz{z)r((E7NTyx?A8l1aM%$gBBYtJ51~xty);;bu z=|ZY@;#VcsOcP+!ulRn#Nny0|#8B&w-v#@Kc zD7e%m5pApn;Z(PJx=DkxH#5ZDjdGKgS9hRQ>QYW2n#<$?!Hhp=uyRtN2y5UD?8W}Q zvS)MB-2rXX+yRBe+yNC%x&sIQAok|6Q_bFdyB&KGWn}KaD;f^YrDg!;DnRMw_n7mr zG_CYaT6(aRPWGJJgxhL^$Z??P(Al!)d@%5PA~v3;*ip6ax;X%IZn4L!d)7T@g+hAUj=+E;PwE z;c{T@=}(y8lk;$@lzqp+qeruNItf{eA9K{JPlBhGUVZB!DWP0@u>9^jz%qF;#U((T1Qc|Ne&v&mO>UeR3PF_?Y`FO1+unAW2aoGnfEA8;)yg%cjg54k>| z@XB>+jiuQL2g|B#i4TST?^@Bl7wdfpJRbEH+Ua=)X1!4OgRA#PZJ;w4#BGmr5R>R1 zEGTXkxE470uDgctX+q75Ey^_nG>X`YEyxPo3x5{i@<(?BxPN0R48R?f23(E+rx?Cx zW`N;Y5ezpQhUcq3`bL}jzQM)`L{b99YMjD+SFH9bpi!_71p1}b)*ANJDA}*fJlIQ zOeC_f+2aec<9O%BD2_*W?*xv=uvss*<9!{$al@{H;}ut?s(~9H330sdbsa&$)!LNj zn(Bz8&3#5-z4@Gubg+wdFz#T>nGfB9Mu<4((q2lh7t43OcZ2}HVeeU({Jw@L0aoO6 zf&l+`S_XA`hvYnO7a_pNsi_3m{9yt|B@Z@&w-B30~5S5Ii z&+4tSjv%Rzj^?|wJJS1=B{G^9hg$E={nAM^t~0$~i)bMmiSAwA0Ezih{_Lq1FfcdS63UD&b3kHjKv23%F76>vh2 zyw|W}8oPwFLXLFn17}(a{Jms;2+JAh1B6+~pSaB3D;xd|)JsYbtBqRNp^#YEq2Ms= zc8JXt|6tA5;SN6Y{cy2jj1E(wbLT8j0V^g0re7>X2t23SEl z;kizR<7VgTZH+;F@cFwMd2eTyB0l~)U~CC6oTJ9pB2)IfXKsXl;FX;(Js3#A+LGsF zEfgmofwWQLHtPnZ)AJM@0ZZ5su&rcmJQVnE@1c@`DxiW^*^yPI^dy;@vYa;O-=3k~ zhfGYPUJ>ibAY6aym9xK{!g`uDJY!;j(DPVdC+iH~;3P$3xctBu(A^i3EEvG|jlMEb ze?lg)OwrV_Fc=Q=Fbj&S!E5k!Yl=lTct4t)3dea(@>+3njQCyp3#S-Y<=6j{e2P%5 zhF5Id$*+G#vfwS|_pbIYq{_j#*^AEZT+b3J$87?K9waJpuowGcjRGvJB4aXD;T-7# z|0PZsd9mMBT4?;vuSly&q_Ks@C7LO}0Y^~EOewg|nnIeD3qSB5BH*%|3mKM#oBf`W z9D45LngI9urDogg7Z=vFaJNz(EZnW6Y?jL}|A)D60jz7v{=U^#gI3}-V)T+fLC}(- zq;y75T!aa#Qi^z#&>~2uFWVQ4TM#8-i%Dvf7){t}@ zPW!+asGM1QFPlIO!4hWBO#LjF!n1K!vK0ZJ$C_IN1mmN^^axh)9TKO+074%u2Tqd7 z9}7=CR_jnSAw7{vt+Q8lLNwhayZ0M)a77JUM5;8ouN(pBlXk9<-4w#@mv~1?vmS|8 zF$U7EGTR?yNk`f(!6E2GnJ{M^#Kr4kSG!q!a+r>7^?Z7jw%cBhIN5{rlOeB>=A^>) zps|Rg8N9(Cr-+p~c`nf$3!nCGLKe|96o}OQhio&0w;*$sTpv?|Z_-&x(FVbVSs20L z-SS+k;Kx1S^1JCDfp9)U@DwP%-LR|TTRtkjmBgz>FTryL zLg&c^?4E>gmzgsr6ZrP;@lNpVr(DyCg>Q7VsK&;bFg&=$_SrV7T0O|ss=^3cU2g@# zS<{*$iU-(CG8qQT`jdAu@Z_LF~cAz_!wl_l-Rs4OA5 ziczhW`w0}!Q*+nI17lR5FQe2pF)BG(!Yah}Y#eS83oq(zN1qzMb;3y2B_@nC;w$3K z&Iuo>0^qauFT|{Zz(M@#OQ+gSmzrw3>T1~{_2XG8$>|Lh`M!vk&Er@YAQxOvW4AT( z3#YADp&OJseCtbsfaw%J$CW|9o$LN}=Lp_-1Mbo4YunlbJIV#&>vpRX?N;X?7auj& zjXTPW>5b1FI0o7^POxj7!|Z(>K3jtnen_b+aKSWk{UyZn5yLm}vxh=DepV(yrNQ-^ zGq-BCva4f*ci4(tMG>PGi%%o@V)TFXOZ)4~E55W1Yi;g;PEdmrxV+z-+eQx1$EH#e zID3G^i16Fi%C_K_Z9mzL0>OJMP@CwnrrafRg@lwV;_$L9_60d`Pt>%wtyOt23D_}T z$_^)QLVwExZR@2-bfW|-7uy;|l>vAv`^Rh50;Vq?RJTL~9#r3q_VxahswKS3mJZq! zhOC`GOoq89zi?r0253eO-z1p3bz5T2n{cegF;x!%+9CmSHQ$oIJBYb^Wy_ThbDOjO zG%@!ILdi%O>S5h_gF*+0(@0VVnvx8pGAmKC5v=g;W4=9z5-l!I$@hqgk?}e(tOTN-3vK{ftxR>F2^S0Z zI@=ELAW_FU~jxeaeCS0o^}0#_m3(yBAdYyPw#>?kB45zr5Xc+XA{Tbh`hGoTg#+ zGx$co{)>){e*H`t{h}4Ay5Gj>{$71fMP4xSCv~v`xmi9F+B88PA6 zrrhPSG{S8=*4{KoW8thRdi}CbZ_Z zO;D%u5DR{vIET|j^@1*~TV+2#CXPn7T=D&~U5=KvtXq58ooe~8nd;PJTqb2}qSb;j~NQFe}Kq*b{Q5@xI`ap^-HtG@0w#K=Lg%CO@q$Zvv z6JEQYbL4^2xegy|mxr;K{p-UV1LT1oqg-*mTeU{)6Fu!QHY@*3Kwg8W6+kZ9Ua-5x z85-m&yR?*gg|V&Jz(-{-(i*HZSzGOl3X;}6lfR+k3>nS>0K`$rg>+I1bUX`H_tFcH zaGL~fiOw|T&d`Ivh^FSwln3tb7@$Wa4TA`Bg?#%=^QJ9?Yo@t`@De424}T_=9O!Yr zJrnrVDuQo#BSZSf5hJ|D!sAVEC?ZWu1jj3cr7(WUw#GjsGofnVR1@*W^X%?_%TV15 zhjEaJ-LLu7nTY9hzve;d{)ih>b-$I<{c*Z`!!@4nukK*?SF7$H7?7&_+;i>GPm=(b zCar(;zb)_B=zn{FqsJVee377RK0AmF9JD`8+E2*1r@-<>XvE`URtefER^WHZy@Xv6 zRg(w0Egv1H_EE!wXjBoOSonPdpv{ZF+)iGEDGA=W=A9I1&~2ctkPI_i!eOS0>F?klOM>Enf&6%8g(X`Cr3?zMYF8h$5;`2NLfKe^ByF^ z@Ji0662z^RfEbc`5P{ca6-JlH4`N=F5*BUUlnGo&Hq+N~x#Hv=eXZmb(5mU#oLi`% z{V`LZ-R2VywES7eV;@z}N(BY&8>9(8THR2+w80 zz&aLF(=6}dQC+Nm78;^>vBs&QBdl&d!@mB=nSqKa^+=?=8i_6};&07=h$t>Dpv~3b zOa_OD+XCeCJxrscM#A08pL=XbuYyeqBMxhUXdjcSSlCsa#l_I~~PBxZcMr zJCJg&0nKDRJnI4NRif<&6qPOjwvZ;tfcA0^$U+}xK+|79IBL`Sj5x+tUy($3wV0{cP}7 zsGkkqB78;+ZaJ=C;A{GF0>W70YoKX404EydDpP1O5vYT4T5h6To0K;mBzB%kv*E}f zCzdRb5xv&7?~*IrfnQZ!$=iHsN-uL2$OB#R6S<2&7XCTkX;H=^Ew;Q9*rF>Ym!#ES zWLZd0k2*EA<_L=r(7I2OGz)%C3G57M7RwD$AfSHE*2j1p%W!~?sOBa z+T(4GiP5S{RT}BhDs}V=hQNBp7pTkL>avBpyo^{D8azX`8A{u$-gMeNf23*q<+n`R z2df&EoZ}!hUU1d8%dT;!U1PF}i#_Yqh`MTAWY-vN*LYjS#pdr^XhuBJRb!xC<3PK{ z?yk7lM8?JN*$-a&#P?H|9=zzlSqvvxAPRUcFMZ+%smm`s%R(2ppZ9&@m*WEDoOPZZ zo;%HCYP6kcp!$PdW0E>f&Nmw}P*?$ju7)fi>h zc*?F3=0O{M;Fh1(^#xYc}5T~CK9{RgM5E?Gsqjp2Mw|;^&my0B_E`i zCKxP>VRRI~xG2%57m2uNr3WdEVUW_NXOOLil34Z?x@94*CpT$O^2goGARqW^&>#y^ z4{{FSOFl@YZ*l&j8YImU46=olFu0j)8&}Z;prka0K}w&Sa*&z!AYT|4G{~IPgPf6i zkXbSuoQJ9gnXN7}iL9!S|7gCo>J;)4wt>P7fl*TYf>C-((7?vSOWf+#(n~7(4$eGH4u=e|oT4Vxb zv_zC9&@qb*EIIHT%mYT0;FI40ivNJ~WF)LKoCQ2)=Tz<8)N8M%R$29RSZ+jYsYDO} zv5sa0$_&1M>4mtGBO9&3TQLweTUUjthN|U>RcGsSsdZJJar3bC`jiyVt7)7+SVfBnoYJ@(+1L8A-ovAy$6F0PSh_kySggiSe|D zDSn!_VJ$rErS7IGnaxwmf69^4^TkOtaVm1l7}LOq(cd8~(cVuK*)Dm#yrG3q2MZON z8x81XPVNb2^l^zmDNA3nlgZgKkuNjW}=*vI=F_l zJn{udkk{g3trYh2F47eWGNZ=ib26_kO%ry zzsfeJ*}0{LeN=R|R3^&cF+ccS71gMARTL!JRZ-y3Rk;lx9;W?Mnk+9*);z{d1V==k zPDqBCB9NK=LO2#)o;gIF9Ru1j1N7uUTv$k)$v8jm7Bq&pIj;Flrqs-pZ+-n&AijD& z?L_#@iMb4A?dLM&3Bpw_L%!S#U*fl2@d3xKr$671~^dS}Ysu3fI}?Mj5o#oqq@VluxV zV**TH2z`qf5yAe6S}J()FqdF|6Mfi%{W%s`v_M&G^W*|*XNfp92~AU#jSvgZ$b)7)UBkHUmee<(zG?`lfn=1~EcutBQuddg6Q^0NJ_MC~hWQ^6F!bU| zu{>~b<$kW<#KOlPp`kf95t`Szh7cS0ie*DH2RRisG}W!y(o!H$^{l%naoHpRs3r}R zaKG7Z%k`1I3aDoaHBgHsPl;3!LJUwq{UL4xwR<8^ilqaAibIEX4yf^5IKuhgdugB! zNd&5n4aWu^k!J&SN+M7a(vyb+m}IfU#$VOu~W z_6UN0(}3$iZ&ElnXsj2?f{8q|F_XS9GUV&b*aw0yY%^4*TsbCr1lHmbDF;(*p>^=@ z)aJvPhaCR#C6o9o8Ri58+EEqedWDAf(p+sKd@gBEq@FPmGSC4`&ij7RCW3CKTxI); zkq{mH(=p0Eu+RIJrGefz4YTcoQ{~MlW(kAVun*7x^6bcO#y)712W=me5)-2K(S_It zbL3~*2ZujT5$Qg!VJ3gmTMK63-mwot#EaiPkk?`#JWYI>m16t+U9mbLvq}Z6u!-e5 zK-&j%|3iW4whvT!j0{?8Ie{^Www655K6rlvE8$=q%8t5&%_0a6g!0pHNepGG zMzwvQAkp@L0*Cg&Rn5viD5iZ-h0gfrwiQ%P#N>2TiiPWxO)y37G1;xx z2ltWS3szDb?K@SU*uA}su~P6+L_R^c@_;c?Z&gNO|5VPw1kz3RO(ZF zKdI0prURH8&@KPm3BMZVJ}egtmp_^SGb<3ytL17A^-$ljpt_s^Xuz=Re+0vV*ZHVc z*Pi5^$LoRFEx>yy4f|&&9U70?6Q>5a$*~@gWabXi{-fVP`&jsTf1}lCl<2aK4{o=n z6&_YfzN%Jj?_=7=m=$U;*{vVBpU=;!u1whFf<{eAhgr*WXqxvFhR=m-1CI6+QO835o@q8 z<$)IFvrj@=yLenLp@OApX~ww>7ag?GQ@{GkNK91m}PkcM|^fWVc`^3w63B|M2)2m!A2*oeu zrB8ex_4FULQg9P5q4<&N>5sTL_Od#!c+@+vlli?h=uk{?@+@>|m0b099q3Xe8b;-o zQ;||d;-5T<;!>q9s6TII9lR>w>0+6+QYAVl5-mO9Hx+i8^{Kz!PdH-E8=!hxpD9pLm-E|tNe}a z-`4(y%npd(VlXKGD1Ipl|6hZPppT#*8y9 zzZV&^At%yfz04|;+Y^b+)|8$Axx6QIx3vWk%I|>@1Wa}T1%~r1dDgkD(VZpX0fw21 zwh$`%n#x!lPW!}(ECCy4^bmwro~&Q#qr%0Bm2WXbi-EZaY?-ob5fRtVWrr}$$|V%? zE(4bMA3wImVl}_^$h>YUi_}5a$kOygCKsZSLiGM>WW%eGx;G*lUS?wzy&^R&5U6H{ zA;n2u!r{v%PD3x|hM$N5h%+V+kQw+;$p_&Ea8H%=tBn}L6?)-sJZ8N$>;Nhb>zhHM zKSJ^?2D38wwu+X#1}*14|6`ba-sD%WLs;Olwax7! zNun-prvT|yFEVuX0dp*M!N^X?De?RO#@7EtJ- zn$(b{lCX3IkwJbQ@g4Yi$d9BZmNYrZBg+1@$CSXv6;M0F)j+@=a^fKEO>|f$AX=CG zz@`i;b!vSw`go4KdPC_`@(dV&?OQ~NF z=v0`%qoo|9=24YctZAh>v-*Fd0E14m%U!?_kc*dvUTBEM?n>@RkA+A7+dIOVvLqus z)D(4(@Zq&VBfMF^O)|n66+t6(Lw+xfS{LN7tqfYN17t5fmPdu~qaagaMj>LnsJG~- z47r-u;vXE%7JX4aWi=X0xnA$m4FBafjg=Ui7ko7~5oUK3NYw?hVQ@}iznJjgJ+uDC z2;h4w1j(U^Tv~(4>PSg2uBuP5g@+btK)VQP>LBuG?YV+3f=n`F49V=&ngGrj9Sv~u ziccwzwcimN_(X)9{E3dnfzA`>c^^B}VNy$bP|HO(X7|j-7|A93%8v>S!W}zLb`*W;F$~S zs$c9(JL^NX0Y@y09-pi}#RiWrflsa(jV=o?lk^i#kHuZA#YJ8Am(TuW$yY<-^fyNO zV}mFni@Clc5qFUs4K)XE-Gq>kJ)Ug$FBR@zvI0lS2ox(z&l!P5UUL@-=_0sNm+6;n3T*7H=3kB94hLJ$I>8?><&oS zA>kBR?kZvpLmbV<qvL|YXsb0x$;Y%`{ z_b)#()7^|?x&9>)+AG|kEDbDjk`&>BAnYH}rienzajz0)J3g1h95|(YgdAAjrtf0 z7TKCbV&P*=zU2BvtTGnd?Ww0?&$ajOE^sJ*pC^~PrrcT50c!!KIr1Q38Q6>Rz`T*S zKV{4H3Yh2-Sw+z!vhiOIRy6DKu*d-G?&55Q{G@&q9y9J$b%fWX8AcKH2t*HyjRH7J zIA$GF-Y<7%^&Xp?4ZT2TbZK|?C_ig@{Xxf|M%3OEAA(lKo3TXZxi zLR=iJZ0M*i6F2~D{2_=nt@)-WQTl}6s!!fi{zmi^F+GV9AwBJuyeGH@ogP!E=}C+d z>1mE^Xfm`;z+UM_^i*kj65B?4Iw^TiSZ?p+n5tVFNLtMlVkJpupMD&`6sZWV8w!G> z?iH{@f$3un<(Bj@QTosvY)TleUu_o~!D6xSKfhFgJL{PF1kF8fU3K-`{b*P6>pX1n zrznvNfOpMZEDq@D3h{)+0eN7!J=+ab-A9p{1&Cf8jVXLIrtr~v3bVtMQ!Zc{ixJ3i zbM_V6)41&;j>d(AlyAk#wWqXA>STh%p5Dvt-XCA) z;u%kScJILx-BY^V-t8&B)b4%%bb1e-{2lGx76VJ{-kSGUe|iL5y`4Ev=6gH%l+q|%0=#RbDG8-_>U zPXiB9byL6~c9$02Gi@05Oa}(3x+!1~lTyPl!-nC3rOENoE_tQNq_CA6MKaCq?I7vR zmZ7SIQ6vp^v3@KT3tzZgE0W(OEhB9im7IZACK4-Cs>>JM9K4k|{Q-K9e;bw<2-cvqgEZbtnSGDcugWU3OxX-TMXU z^qxYIbf9-zkyP5fe<>?C?TkHzBI!WywjwFFdoN3;_Y{hx1HIddq|EO9YgrX(XY45y zN!q<9Dw0wgfQ#D)pgl#>0T|qhq{N2d3)$VC5(!!dr4UjnXSFl?s$1QPq}Ybx+;m__ ztw=h62e%@L*f4w~8=%_3Luy6R0T|qhq|k<8WC|GC5iQlNsT4_~6;WV!XvxlcEw){S zj5^7;OU`9UoL}`{txleJjsoAUP7);%4C#I1hTP##EFs>rf&a!Q(zq|!zmg~Y9pmfMiDy^mGN`nObe$X&!Oafo}j5K38ac!~#p#+vjAQnE?zu0_oC8P1e;tn6dOfxj2^p`Zc%3*)6hq8o3h8I+HuIcBqER8TmX}JL-Mlw)WP> zFEbS6s;WJpR=!qnntXI*O$!DE%UCv&hvC4<3(~00TLObgQ_HB={`M59@klsaO{i=2-ZEuXS?hBa#xO8K_t~)7kdX-jlbq2NJ<@8tJ2Y0k$xI z+JxP(MCf1#AJ>!zNwLCmAAuz`rK*0&A%uCTi>ZO{y%ZjqDK`bYu@1dY9U@UkriKxQ z#Ci?W3|?`%AfK@V$ZRypmg$Cn*qoCyCa*z~8GH}8UD2c$L$EF3*rlzVdgg$?9Ho!VmYH6F5AZ?!z=mN{uqPYRg%B?a)1 zWnHm=jm*w%z#_2hu~75t1wO_GpFiLK9SZ^1AXmV}Lk_zTaPg35t*zqjJuF`cu$XHy zW~|BLnST^c<>nsc_&c|8uE?Cct1w#lk#cV1l*3I~$s~KR5*wCx#E^cL_jq2epVdBb zV8E0YCIEW%vnq#;(0m@UV%%8n(~`#OkZOl}DS$LHh>9kC#3I=l4^jocWLx8&UAw{F zwuN0aT8SWQAKR^4khmt>6-CX|-^IM0>iJC6l0zel*)afa(AcQNGyjO0Dszv4@^_7y zrC=CLp_?zaF~dp*Gpt0+$U8Kgp?OE%<2j4ZnD^Ph1m^uV|E9)jlt;objeVoKT!mrJ zV|QR!LMk^Ua)YvlVTDHx!wUBb2gJgQ&5^h0z|2K#;J|Fpvl?nP0oOi1Po&8Ou6|^^ zV7?4%zw~-Adu1_bi@0N5Vqmp?$g)mjFW$K!M@epVATrcrsUZ4}ED}wb@iL+#mR|&!N5AuN7bKM8>*0j}= z5_mw#8L{AkJF|$Xw>fyblED;zwJ~B^c3ukZN(4=Sf{prcBxo@>5`=XC zN2iW+;bvYLk^`iX&rH7Qb`ZND`cHsNAVL2|1e!y zF}Q8J-r2^xeNVHE_qs`Bd2DxxU(bxXSoozS`jp;S_^(kW!*Z6y!nbZ=Y82ZwqR3e@ z-40^@8qTNOQ|HejKYqi}cI{ld_O^Cy3kh7NHb1*#?hkj}Z|S;kMH-YTqjv-!i$tQj zqeJn9Jj4>$v0tj|&db&H^kuk);{W_mr`3W3)ZYb>Xx}|>1}8wS&CTX?)carW()qQ5 zZJqmRtzV1+po{QXNkVEEI6q`v`?~sFCUP;bF#Q&!E-76mVI7^gEZ&T6l!7(`Bn(-F zPHoHxyz%FphTTP4bP-w;*7*)-+H%#2Yu0h@UuNk#1Xp?%xEH==!)~TJWh;1#?Cma6g@%FG1@m=8b<_ijYoTM- zz(#AP1LsNVz=2}aXE5wUjY6ok$uslABx9SJV|#uVn1YBu1^Jn-K&6m|v%&gUw!Z6H z5SU3bCzw=`AE{GPvV~)i`uF3pCkm=8c7VQ&9Ixe$J0cr@EKcCohw9&#UcYa&DV;Q3nC=O zlDMKGj47>T`dVoroJm_*Dx*-aOtDAwvg}@Wn4-E>$|Y@OwX2mXyOkPuD=F3~;GaIM zJ@exGNDYxr(4cH77GAcQ9b(8MYij`{OB6QYU_8rjs3kK4W|4kYGX|CspJAU`XqA7w zC*1r)FF!w{LkzFpOAsbdKsL+nc~6Mpn@Kvv@Q@S~SgA{6;j0?;C~lNr#66UKthS5& zwsr^=*2(_o%uxd_6V6ob%L6P`(+dz_crs*?mJc#!JY-pi=z8U@dS^@Pqtup=469c_ zk^S9G3&u>-f-W}Aegs!|$hKC=au3IcM-K9dUo@T`o=(X1ATcrRLB2>|5sf&5{F^k= zdqof1Grm~Lj6xKP0!0n`IKETEmLrq&0RY%x15%hnYZyVeM#F^4Y$4ivp40G~bp7DN z;5TeM7gmtKK?85$K;%J9!GT!vxC$JQ85ls|Yj&a-8OJv8Ii^!@V*^KqynzGZO>f{p zT7h8=-MPv-aW(=6`2-dG{k{$ylsDQ)!^yg_{V&E7KgT|Jm{SsI(!a>YTta_x&a9H}ag zkwU>$vTd`UtV$lZpX`QbSZTI8F_w5&JaaEpF+BaNXZt;U)u{Gp6ePq9x>MlL)8FO_ zdit6YkOymsGyG9DgwQwt^Z`xtg(JeRm(qV#-!lQUtU##C1W;9pq$=k#oRl11hgjnd zjnr}Yq#fR7OKI(qOA+zN|ND2BN1g$Hy9|AbzpX03u90Rj0%<^heZU2O2Hx|J@Mr0J z4ZnO675keL;b#THKTWQx65*f0XH1s}Ai#9F|54>{^HCi-vL6fhz6`8zUa!AEhtn4o z(*E|k*;J^903OY-hRI&Y4)Vby*)<=|bG4{oXN%uo706k}S5D4dd$Uz9cZsk3NyF(t zM53>p4re`g8GPj-&Msf^m0uBGxx?p&t`XuuzCs~|h*5r*lF}+e9w-u*;?tv?Q;4qieGczK@jtj5Ns3u#n`uL`DJJctqAZ2HuZF0d(xgvqTRw-90Z0sCFs4pHRFSNmOi@pJ(L zAvKt3-@2UZGO_T?owPzc=XO>Ue*RURH#$mvQgbs1L+Sy9b$E8w;drZ0U8wI%Wo)07 z5)0om!8_uA?ZZ|RMy$?LC^toIhycvabAv|QTfa>*;&%^D7;z7Eo&wY_hO2Z_RTk;j z3)2z*RJw35MwXwbs~6Rfc%U;0_x3g3VSK-Ll3_ezin@nU@j}or&em^}3?sAMVLZ<7 zYbM!{em|F!V&OxFYs2@J+Z4c%PNTRxJsdKCGD3i1hOAwZjp?1g>EXM_)Y2R@rbqSL zBx5>ka1d!=>e!@tl^^Z&P~{!2>BPeOEzxfIf?L@NIa7|oy^U3317E-2K5_Qlncz@y z*~{e{pd9fcb*iR0R@UzDNR|K+r;ya>IGai~n-d&k0JiG2N~bo&l+Kf1xXJ2rS!oix z&TcG@bSgJRAoSTc=dYD1C2e=e`uq`Ow`>S_MKjkJFQ z^j@q5MdM8b)D{%mvPx{=!h3B&@%TeVP^{t-yT@HJazLL|UI%BCvp*J|Z#p<`=gZi%5Ab#*A?Ah_YOk zL43Nx%Q?^QrXa_FAWjgzsac~$*_EcKn{$5uI*4<=(r=S+&eHwZ1#O`KQI;>7#_q$q z=I;XN>?|$H#?-Si8ODgRM-i5R<+t_p1W^`auttfpX+1rn>>pQoN4?PI)>vDW#b=K(0N4J@+-Z=SPvW8qleTm zo-sw;!zc|L#__3#v2(k_Sj#9<5>fWJ`ZDh^CumVN{YC|_Ez0^DKy906pJZeD^a?$E z_m~z3+C0xXHct>~jvWw08u#4YnPb8fa*MK0)pvFeU8F_X8+B~O7G<9@x)U3?^F6jG z`|Lg=%H~Rxigt&QXIi@0W=aD~BnXQ{o5u(|EqRo%pyauRPyr)uVR49VjP|lJpiltA zgV?clmh!f+P}9#NEPml4ON__7*vD)l2ZxP8PKoCPkE#&DYtYLy%?d<}k<(#~<;%ko zX5AG;hQu>t_{^6WZiPz5PUT}1Ef;5GK3fKI+@xyIg@gujQhpkwAVYbJ7)a&i4jinOs|k4VKqrRs?jK7^xkEUrJjMcD zQYCeY2)%O%XqMG{KPv$(f(|>BcbLSA2Jbf!=P7yuE~-%-%2SZ&P@amvF_d@ASqSCD z2JYX)Xacifm?EiCV8${cJ{CcR?=Mh{1x@o<3xSJ;5C3Km$`fA3cw!p&(KDgUbdi4j zrHC^e5V%Ph@~D$-ee=@}a^8E6ApR;2D%LEqT1fOVoPxwwBYZ81DJSsG6F4&myie8f zM1yvK6$sIdD+#m%5fJP^lx3YcgS?LO?}-Yu5tTSQxd?Ya1+=sE)%ipP;w$8T!LNyu zMQ1A1^vg}%%TKaY;~`_kg^0$kSm%$%rbEJ-Gu5f-g=DFGIX!m6OZKd*zY!561VtGw zvCpKs1tFy;5K>vO$OL?F@;c*82k;V#k7m@V*B+pCDEPM!Ji~USftFp;sp|ldN04b)2%X)M>HkaQ`=w|E1Jt{xOXIzD0Aj2=ictPaEPw-i5p-ilg*+4A( zkBhwHUa*62+=@68Oi}l^7Yzv_&Xf9Wl5u|~E`~jBH*u<4^MxN1Xms6O0_)lfy|C`& zhgH#Ni7D!a^{}UcXtalZn*`Q_6Jd4J$OWqx`)*RrpXMS}^+Gkib}7~%(-YPP=B9Pr z9iZ3%g@vC+d$F+H_CAVjK9SSuKc=V~3%8FBqSz$;HVGE;#q+Q!wz+FMRkxOk_)MVK zk~@WB#~A<&FIpFE=Yv&IY!_414eQIZf++U1ewzf=+FjX&4QnFBY*Lsr2+MV5K``fOLps;onB+Pq@8tH5=FdW(l{eh~`Cx z!BX-vrpj{RX%*U28`N?{?sMA0BT*5^HX7~uvO(=H0w0fiRx2fZgz-`=qDOY89d|Q~ z7wk?e03cUrKnO#Lwj&yKVR|jw2+&|N^Mf!6>#pvwXtBq*AI1=mK_8@&Lvv~{& zDjfVAT|3))|0}mo_*V`V718fYV&>-K1&qNH>Xg~WN97!QKUA32XJ71-Li26UBmM<``ayw z2P1S0oMfD9gvkas?Sn63cszIovi9KBc(ezv21O6P_C&aU*sC-HqendAMMVo}}c! z4@>m}7)$460?FA{>w?WuZ!9JwCTgBi^^2TDE8LPZ_~*`Fq7S6RiU}Cj>V*ZB;KzU+ zHkeA6!|8oA=^QePeMKZ-w!Q>+ilWODWtq1&7y%zJXnFwEz?Vc^*Ub`OOGvD~aO z{6u$0M?n;W8kNKZQBs~c`2z@=VUUlEtQ7(BHMp{grGk>?+~xBAAqf+)AL@h?hb*47 zE&j=z{4Q!AJ)|}BrdM$jSw!Xt4F!_N;<2bMH+L8(Sdn~qCKk@h;+SC)IU?0scIak+ z6cT_kx&^iQ0I;AbIIETdssR9c*M8pChqX$2i>1r5eoprst)miRVMNFfq zHmR;90-hBMYpLJ_Bkr$JQo4b~Mc{nIJKx6@OQpG~Iu)>9`RB3lwKKK-6LXHb&#)pV zQr?KB(lIzyo$@9juICP%)^Ob@79QYgQ3ghQSU(p9wrC6Uq^%BAt-kvY2hJHpm$W(~ zS*tmbx|FcK7bQ5ebJqw~4l+40cd%ugPyO&nVFOG*dk30AfL0M@QcbIfa{Z8JoqO!> z8;W3+C{8y_uK1gr8A3^NE~f|iK8siIJ9qRSg6Nmd>Bz|K`A3m<7Zz+kSWLxnpB~f<|fbF`XCUWpzowf(Ui4ki zAg9Rak`7X=NRMgY8e~Lqj(l*TYf>C-*PSa{EOv}Yb3 zLrnuIt8BY$E_25Q_IZlI3?8_S#Wrdk75Szp!3((nn&r}Oy|(ON@yIihXAqDr;k}7} z*%DWWVzpS$E`!viPeWBukPzzXqQ<1w;GNe3l1DK)VYuWK?X~Z zfQ)8+trFfxX0trw)EGS%=EyTXHzaHl-ubbk0X@tSod42#ByMRR#=`5~(y8Gjo@$C- z$iSn~d5oq-g6(aM9@rbe=nV>RL)j^;@t4>~G@2(}7Ge1`T9YsLFrC41n`chmRv!Dp zaw8MQ1`as4C{z@KTV161kJQc>=WOlBtX)omc)IG5dHrA56*dpDy_7x9VEsC$#}BZn z!`tH>6;6*8S9*KfEc5yg*bPo4BI#4~Htt||Px%2o4RH6wZ7Xvyj#d!h!5@dC>EQ1j zDH3bC02PYF*cmVA)?19=0w@wU%ON5NnPg*4lH{DmVq%Q<9DkgCiU9J*V||D z{pdzxL=>5R4y=JKgIGkxX1mMV9!>fu37&*L))`T)r8-kpm+W~HkvR`AYOh`$ICnuCg;BrktB~bZ*zkr02)A>CJ)2-{jvs?x|2sowu-O8WbkSs z#pHpxL}|hJ+$y3)#=%(`H71_KN_09G zfX%k05LKV^uYJTsPSsM~YNCV$zv#u}L7>Ms!___m?jbbx7 zdc(8e&;s02q#^H&qEev*2Gv%e-%}oSh1W8 z6TJp~G;5y+UyPIL;9x*sAopB0h=r$4KM^RLz*xQ*ch+tDaZ}w?RT1+ghn+8x77=7) z&rA6*WZt-w$&1pLFelr?3_?R>#=e)jH1S@XcrYS3$#Aiu3|+W{_?UW30H$ z%NW7CcGZCEwYJa^Oyuv}7DR-b3OYg7m&XfPuXMGjV1^lB4GnIweX?G~R=p}o$QtkG zUxG@9tUVC#i+}25{n@*A&DzQ~{H<$YoHk zjlg#zN?&FrkHV5HP%);8U=+o|AKYRn&BkS}{X-ykYy_!71EC0Zi?N9dm1(eIoKW|m zbDa;?Y4;csy^QU_YSl+bV3|>y-Z|Fpf9->D*=r^k?F<0RKMGo6fijjDfK;r)r4^{p zM|>8yu0Jn6`xgs7YgQJ})+=F2-jvEsEPUcu!!b!{3)zdhz+jdagF23AT{|uTNDLji zita$o{DM|C=~^#S^lbb~%Kk4sU2hz?;0&@aeMYng%Mf7)wQ=+e5x-ohQO;9_HKc+? zWmN<;P^I!%s-_q1AVW3Y6$`$t9i@h}3u}}*rZDr_voe^YTq{OuEd0>n#{$9qbFB|Y zx&XctLCpiM%u^i`_B)< zEp7f-`1cpg?08G>2h3jaf^lDB3K!AdyP}kwT%eiIR zA7AW9?D*Zd52W9+6I0T!pVpVwLnSV>rKaE2S9X+sr%Mel{kCw^?}A;`o_1?zHy}yq z_sbO?`dtP*xey#gzYi3DfM)-iO?Ow(Z?KKv?exyZAo|_#d_wa9^qc&S-TWD@=1)RJ zc9mt#9;EQ=G~XWmVvrzQAlK)g6@iYQL9Q+rQ&#)fA`~CthWgmRdE*!)6yx@ju{3TI zzslIC*OAmRD`ir)DA@3gQ?)O9{|K7}YICc=O_4>yQjtYmp=TfAdoR^x$4S`fj z_x!-`C()Q+Lu3A*FiI1egCxmT5!5j(?1`w<>ix+gt?KmxkyyB9dki-#&%0cp7;~E* z@^z=Ri=Ihib=eV8){UNJS?!|daTHPL*^ylv^wc;9jVXK*ML%68z}@sujiN7xvj#g9 z6rIVYVgpxQYon;1Ea7d^LDTN6&?z+CqaYb}s~-B90*RnD85fm|(Pj6yp*CDJ6^n}P zaM5UP;TJAieJKZRdRYK=4i!#87K9n5>xeUm@(inm(MX$hD(ll;4yd7U!%ask zvE6;p%ghgJ(u^Y}c2dTvQ{5bJiyq~1(oIT?9CL{-8b99`FLy) zMz(N`PnEh-2)3yF@r>^!3K*MuLl=4N@vn1Ew#q_TD$JU6)Igr0r6+4VTEG z%44)s*@~-VPx|0D@1f}{Q_)VlPy^K7u8OSaC|yK`&M4j2doVf_KJ{r=^ix~-u;&)4 zx7jX(8vH&>2Cwv#BG#EX8{X2UqIO?EKNtok1IHZ^ZDDQMzc?CDaBE{JP$WC-h7&A@ zkeio!3AvWs>=Dd{FeZ33RTI+WG#G*|5u34t1YJ=k1f5!&oS-Fg>WQ!2_6d43+x8Q5 zD~>TXxX0a{Bj`@K47=)Sg3uMGNWyfPe6I)X-uZL$*SL+kSM{G0GkreCu7EL-(V*5#5^4Yu0X+Ik~wv8U*5} z$t(dn(B}-fhgd;RGjBM_S<&MH;-V5Kh?rSBQL5LfoE6NXGJ1;96A>(L%dCA`PmmC1 z3?$vBqZFn1s6qk-tnJHR3zT%R@ZA1N(Q)QVH?mPyhp|6n7<J(UHz^#o2n0*C=vnEt5_Vme7RH;T|Sk+BkUa^!$2(;%N21^UIB&*OTWdgbEFmy z*wmIC*srFE#m0P-73r};;ulSN!Ru6vLofBCxY$837%XW)pTIa|N#^7#nFW27wZ$ni zMP7`hHDI!I>1#ZDnu4+cKbxhUieuCoA%ZHANX@*Qgy{NL@b?*R!IC3aBx_nC`V$9Y z1J$oXWDa2_`icl%=(J@ZW`={9Yp7~4jTJ%k*BHO2M}BeeSw!|%QJz}Q0)+P$1H`sV2pxZf=P zHY4#kdA-&Zk>AU8zpaYSzr+Ix!3IipYg8KPj`?BOpas;1{2hI|Vgo)Z`FoJC0TWBe z4RS#>C4W5zN-X?mb7EZr(K7yz`0)`fH5(jNDg;|;&SXQ2UV_b%{er%B+h>Na&PhhF z>9=-HX^z_&1l!RQi(lXh;34mevG^&j?e}qRxbGQX@7i78oA*8AyJ3?(^vx_Cjlu2c zeVvH?6_1REXk*anaJ>mJJ3gG7??dq)xbHp`Ka-a}@&9w}!f#gF?{DP=T+`RJ_5NmV zz3&qr%}Xf$E;rxziQmhMV!rsX>Q$JRQ2ZvfE&mK&bb&tV)koN(59o{4PJQyNJKh`{ zmfNO-U3V5B*!2a1U2{+(5a_6$f&E(1i*fN9Ra@FMJLmlnu(YVnefktl+Ha+C;Lfy6Fj^)%#6AN1z%&?X&{wSKIDl21khWKE$U7dY@O zr^E%03nH%XJLK>?4=TR-(7`&sSt^2tYb7FjaLu5E!BqkRxMuS?dWp>x<%TJs4A01+ zQkUTYxJs1d9|5g0_Yf2<@(#+8KOL1JSMyr<;v(ffvx*63pjq-8`C_SDq5gS|g)cV8 z(!o8i;;ZPTC`QLr8QILww~B!% za$EDc)<2d;g-veNtR}YtSd)9Xvn_hOP1uDF{pE#`diLDwNin*@xXJg@y*Ph@|!Ymu=O5cOeBC-3(-%QNNF^L(M z^iv<2$#)|iai0z#y@5@qi}Zh+bK??_Ub|B#kp7~q)g(uH=Hs11dY=(Qy2&)#8K)Ob z6Ydz0YxTWjqgnJ!`oHO7tKOV9mw>Gi*`2`FEvK_ma%_G2Z0E4`{%|+8_EnLl%b3a* zoi4J{p3Kv8$b22)tQ?7oE4XVt9^Ft1g=KQl23A6o%U_#aP|19Zd^H> zHJ0Ik-uM084(|RWX?0Aqj4{5WgQjHsBCQ(ouOGX7}andgp zmeG;v<@zDV8hBbFek5FSF1)BnG?vH78l5Z%i%wS_m2%M3GRSJpg~d*IzDiXOng1sVG zX_(NCt+n!GR&-MppXuN@xkQ3k=7e24CwLC}3kgkfAYfC1fDPg~@=Zzvy1ve=KSkm> z+H#HV%v^>Q75fp8DTLE8$IAp3&0z{Kn&YD@l{p@0@m9|-MJ<}+C(+}C8_383yu3SA z0^eMO1y)q!=j)iN7Yk2YXeXn5bB418rTTv3SALa6Bq1F%E(gr@jK5FM77gC0GRpA9 zAUb*%t2D7b>hg+mXFqYdvtRMBxSsJ_U0)b*`3J*tTeNd&{Y!PHQra!Q${6XZ5 zxqLv}FGorKk+(%c`;At4Ek^6BvdH4iJ6BAB&pxvm2zn)v!haj1*$yT?9HmR~o6FY! zE1TlFSB^DEu;dOus1|AKGgZwP`c=|C4gJe;5+7;aCU2CXucnh?z72Ey%%|GahQ0z- z8~Oq-Eb4sgxgs*3_;rrTgE94Dy~~)I!cI{LB3}E1>7Z^>25R|?DFu}NiUaI@jk?1x zab~P^C-(jpnclgoswct3K!)KV5V@@RSaBoEm68CK>hrxsJ5M#DYcOnpeMbnWq}_ zN-C=fwxn-I5wdkrYJ}{vn_B*Ln>h;F)QmIYI5JKJ85HqH?QJNjqkHeyd6 z(01Q){_1iYABM;s{grYYUF*))cat|qT|1)`;sVB}-Ufmdk8;}*O@|VXieZ_ih`ZAq zT$jLq=Wf+ebl-P;YII+|sB`@H)v*TM=?q;y`sy!6pE2m^x|n}RIe5mA2( z8%`IG!!HOD^}B4*QM`?k?On-LVpFtpczfvRG)35PG`P|o_1SwG?lD1Bmk9fT^WLzK z*a+oTzl@F|f3s7In{rmVjHa^d3 z;23GZDN}I`elHNE!0D$748{;LM2&mevDg3Tek?-TFidKFiZdX4Ry!EHntX9EU@fiba?>BW&4Q{lbFIp2w8-ozrF**BcFvq`X% zr5IX@*b|@xHXOBx9HeCBaJY!iH*-d)D2|EA>J^+U;t#E9zr0GIgtGZuOsoFU5b&Va-2 zYc`A=8JXNN?tH!j81N6S0ZT(~fKG)r$10Y@8bh{@g;}kYJA%}5^qFi09!~27J1E&3 z;4e3(N`p0W3VN)WU)kDVon&qeqn)3CEYx-I1^#N#{Iw&I#`VC}Y&{msBA`&cxOTnBNoX%pxz(9tnxii?InP~ZB z6!`Aytg+&XvxFt0C6WqQMAl|V5CU=yYmr@WZ^t?uo~28Opo2^n7;@PpY0i%jJJz+I z_oLk8Fk2&a$aoYJ1TmT{tMz9^H^4~d1+@SmnHLe77L-SXX8s{6Lc>QjeO_0}3$_dR z#{SmcOg>_8v*c`R~YUew{uw}M&9TgUl1&Z?I_Iq{PfH}K?iH{n;G&6^`#ce+=U4VvkxzQ z;#tt0iSxzM^X2rN^n95{3cJ?Nv58EbIDq%yh+2s>$h}%NhtBGKXq_DdU&9#%dV}$c z7$7&BI2p#mA$gN`CGn8eG=r^CgW_H>7X>|efEBZ?=gNNBVA7g0YvU{p)RhN_eI$Bu zQAMeao^^;Iz^iUS}P^01qP~x7V;T@;M=D)7n5dYbkNjUzl zXMAs3H$CGxYuBD&+o}mxjhTg+JnL>vxLCON+CPKCNjH2S;Cd4W{bcPgfRb_0cVVFd zOCJ4Y?4#5F;I@w-uxFqo1orQPD6og-;`V#q0(**k$jh_!%94cspbBDUo~^RBKz@v| zIM}J{&(WXC-dMJSwl_*LpAA1TaXiz`E3$F_fZT63t~XS3Nvm}Mc9mytwXpY%c-_Og zuz2T?^s;~cU(v8D?rDFkN6zx;O z1h5Numu-!B32@^34-OOo{M+pS8ORe{%F$ z0GJ=q$Yw&VLPGdu{TAYkU*k1DK^9_WWm$(38cZ_%5se-b?z5gdb^Qiw-h=BmEbRTk z-^PbF6BbsJz{mf{a}<9Mlo^>5nfzfzKg#jK$dJRv^^DZ*9$-#`f`ydB6`%o5?Eo3@ zMo1=i&>X^0+@V9A2Mw3Uwz(e!%8sDs@TKULQh-(fuVBS&Jx9Ip4ec)Y@;V1!<2K!d zzx>X@w=PS=Cp56>oA0J?0dY@47s?H&nJ@G`$j}#)9wbw=1OZ1DC|E#lZNgxhqBdxm zM_RVA8U5#_=h&`*r?B(zEX(XB`b9cNzoFd)UvcN)Yuvh<@K@3~_}2C7CiqG_2j8gf zg0HM|@HO|<_=D@?(hvAFqN5)ooa>Yy#c~7rQ6Tc;&o21^ov-9a4%#UvEW_zC+P*S; z_(Ez0=nF#44gGmn6>yuHgijLtUU|E2 z%l6?bWku4jOm09FcvN(y0GDWU5Q>2vrPpa`)b&cP*GoykGSTa3&I`}ju7<~_$5X?z zY>O_&k56x>hNsBDlb0~x67+SUkO}ls6A$#lCx2iOz5rglR|$gwTby$B8-js4CbdjjmZkVspfNXy$O}c^$-+B>>YZO zjo5$Q`Mt8&CWI$gZ*~ZtQ3jqan(u*n(?v2beirv^pPv<(K(A7wnYyw2{NVxJ1)ook zrsuEMZ`Mut^Xb*};9J>4!0L1m((=z2hq{S=K0TZs{RVUwd_KLL z9(?s1e(Roinom!s2j9x|-2|UcZ>I-eQFp=T)8pyE*Yvx_UkZKRo&IqDu7D?4ufrZ` z-#@Qk*LnWx4u5#%+V;Za=;k57-gj2~DpKKtjlF2;{fZ>NT5sDUSizAnT# z#2@Sef4KQqjgL*yzfUh?O10yU4>kRFk$pVUr-xJ1qiIbS^M_CGriQ0~SHt7ev#H^! z|D}uZM&#S-s8hA?- zsCg_E0jPQMVTxP%gswpCQ4CTunMyuWDXZ@47%Qx4UzNe%u{e!Y?!T%PdG%Y*NEAm~ z4QU%Uf~^#&;EXI?a5+QSN0PqCylLcEw1H(+F`LS*SM<)nA4zn}s;2ss~~> zC9S**$sJZdu1EHbHv!Z;-u^#0^a)&_A?_t#eOv^I2Oq__frl$G+``I)X}oNE!k>{B z3qSR%+H#ZQl(lxL$6$aTL(d(U8^Z6l$cH1;60j`Xd?m!eKMuSxoY#!>A)SJE!S{e$ z&TE!jE(JPLKJeuZzA&px$oS#2Gl2d<1LzYtfG77>o0Z%HI4i0Kpqf?m?|}}An90CH z%b2e|mP;SC^3^(ic6SYbuX}}TfHTW#ULgxz{7nPFM3M$_enDy35Ii5b06^zXyQ`zR zU3D4~>tG=TAIW{C2>en|RQC?Qmz&R>#)ZcXdGo4LSL0l9v9{m=0kQDB-Bhy*`{1Aa zA_fVIhAg;h&%`Q{wF016dGQ}m87G|q+E(jDYz)R{qUNZ}lj`!QT)=8;KphvobUya# z4)NE-XaIkeH3jk4t-tvBYi^w)4-?yJ)`uz%GQ3JgMczLnZ5UQI?;uu@RAjBqSueSh zc~iJpCGuf&R|bN^e`-7{SLyL!DoQ321Q9bCE6#J|k+8R5?}-CdZjE%97pXIa2QXnA zUlD)=17by@Ko(GfEj~b{0A&+8MqG02%>=LLG}RTiql)?S!dGPA0}IN4D4}jb=}7dz zNc047sH9j!E>%XN+sWJ;^3u5TC~E)#GorbAhkqcAn0$_Zz|j;s_$S-C6yb4`X<9LW za-)MN#&=;k_`ogA*=#xZ!VN(eDLiSxK3Sn|;3V~>vLZBKc^a=vvHib4` zUyxtG3j9Yh)hl|(@2buW8CLv0;P-#krT+c>sOxth{Z|Ihugu!%WMW(A11t=k66*N; z;5l}YGsldTfEt`**-2{1tjuxxKw(|u%l+G*l?^6~{B-x83-9=vR_O7$=jT<_1)lkt zSvx}B8V<;uEQeC3IZqcLjBdCfvvxCS$rcAIMI4-(h1oBH3Cli|60gbYtMK}SY@Q7} z`DwmTQeb-s1}y}@4I(RKZ-*8Z+17AZhZPfT*;8>Dj3IF033-m-IUSl3ua1I6_0l+S zZF-XD2L!s!h?Im0kSh;Ew%p`MA4r*fRT6SPWhH5;g!f2pWODNL)LHI7FTK{qHN6TG z*3%=lg#nKA`Ww(Kj=}L*ZGc95_B($4W-LXk%Z>`Y@TzMaudual^A&IU^zi^Q9#Fuozmm_duLra{zcPeT?Ael$q=w8d*^Oh{ z?RtJ)zscrTk)`QX#_{Rx4!;sUXMR;GeqSbUo%!{mjDn{JYCTwLOWBAmWg&SfWk(}S z&lIF`BEHh*%Sp1~ELxVu<3;){)Vs={|H|-)nIF1<%475P#>q>F4jhRffM|?6~=RAQD-u%T81L4e24$2NnTQMmr5z zzd`(6^raq;hrhLbCY39KE0Y6o}pb0k57-LhNtO0jh__y(;H9f%6#trn-ZR2y$P4y6_;u!zr6n4uH~PO zu3xWvN5c~wPmsv66Hl1CQ;K+kTJQ11qU-y&A6ZVd-ZRR;SLTX${Q`yHk9U0_Z=HD8 z3w%a+35r~;Du8qKssc!+R~2-;YaGJzCZLd6TO%#;a2zghS0KELFvV5SFgoIflY62^ z;nk^(Bc~tbTD^OEQ7!~|@56snywR>*RkUj}C)(w=HwL`j5qf^RW4rW}h!V6|0aaO+ z)mLhCK0Z|cmWEGTTN0U%CDK#k^%dh?>v!j-8%2NoYln^%SbE3$9X}W*>vzZLxTPxy zm1OyDGD3@E6_&mB+~POepTEkiggsY|ae+~>(CNezuemfJo_PJILGi>TSE_a494Cry zHIGs8L@u71Q=Ro%FU%gj9}%pn?N{Mh@I6<8Pxb{H%Scnikj=;20j+nu%iaj)r{wYU zyR(CND*1XLoJpZF}S`H(CvA^CwRFZy^D z`Jq;RF!?T-lP};i&fW&Y{hej7`l`j^w6Ki!f~bPWRLT}YqC zwjlc8T*NM!KfCnZSo*A7PJ^ALqv8{e$Dra9>DleixUlTRCnWuc@d=&OhHzGr{S8?a$ihi4 z1+5&hc$<_dvT!ygK2hHqG~bMp?u@=t=lvn`7!G$vHYYB;F!(}@R_yW?66!a~o>(@| z&{yx5FrcdWW_&O4EN7Ru3&n%;$M$f5U1D>BgT#@LT5 zTMWECk*z|&iFGBbvlABrk zn6RU*50T#J?AkE;a2&)XXMm1j<=Zi=0y~CHSc^|+^olk?p*mH3HhX(BtI`F^|K}q z_@Ctu_U{UKg7YAtp4-nKtbeBS{B=S%hG&3*CxyN)H1tvvuLJ%tSekK;6#j72gBl;3 zqJN)WZomHlrvDW7@ka5hPY=L4bRFM zT?~&;kEVualz}IO{`AMU!2Id^!^o9MfB)Lz`!s$w1w6revqSIDh~8r*{+ne0nuK_!c*6_)_S%?(~O;b_F~>y<3pBKiqUr zH_^|hhts29-|m9Xr92P7l7tcXbndKE0hDd;_`*KA#>>55D?o8h+b9Vc!KqMVLI!>V+}kh^m#J<*&Y7y;yc>s|Bdo5a=dw8E@K0Jo7dhL+STy* z^muA`nr`o6{P^^CYIyn^cv9%=Lf}=-1L^{QxN)k+$EN7trTl~}{_yGD)bOmkwTt2L>DkoqjO}W8e0nuCJj-tBV*L2@Xli(h3_L0H zXLtI;%?%nqn*yF-z1bmucz}VYi{^Vr{o%%&HGZ%j@7}+aS^J3=x)~X~k)S^V#MYy4 z{v4FEo>}_<%i+5Mf#=rdz7<%jLQb6sJd^qRcYscO(c*(!WK}>W?5MRS?axF z_Nf!HOQzQz6s_?cOg6b+e^0ncNA4NZ@$ZvI9E~nVK-jz1s^v8gQpXt(IPK;l;vz3n*Q>oVoj3dF zXS=fs>}?v$(VdmYqgX0&6btryc#n|A(GFA4Tkz(iN^Upm89xITT}~kd72JQMTMl3F zCQoiK#0-461Tc@y&4^#~Evah%wO{_5j+H;m@|DkGZ|o>rZW7_y_xp~O-+864e2!^9 zFQENz60gCLc@*?4y&@5Ggh#zU$enxl&dizb zJm$HP< z!H>T_1wkre*gp`_RmvYs(94tBo-&6^R8h^f**qQLXnc!;yB^L7>d*o~AV-9u-jjz5jXzZu8kuC&O zv4%O$hwoF5IEW>I@BQxA z3g411lfySR!%^CF+f~~A5nbW?;I&=Gx8Jl~k1vjd0m1N3Zf{5q-wXfP6@2sEuNA&2 z8bjKpPlHU)m?lQhbx9@s1{VATh~29)#~1z0G1-?MQ_XsD8{AD&|c z6+@TMTUI-c^ljFWO*~2VU)H$xfR*~A?AC(PEAqn&baAWEsv3%kEB1kZAcM-;<)ewf zxvDcs3_QjHp;I;Bz7ztRbqUdrL8|A-OHK7$c>vXR;qQ@X*gx@!0x7Az+YBX*h%*{( zy0CxFhYADxi|I-}GOXH7K(wAoga_~c*U^Z$9K5ja#cUChf_CQ;*$8a;3vwfX(rhdu zP^J8X)Qh<0QT7|vyPsy+f1j)JwuZcn{ZxWY*(u~2oKp%8Swx}19-u3bwQ~^YW5JZx zN>4kmC&N8jeew499CoX=2LU6e{jG2{8082l=tJTnjb#!*c`z##)ltod+%1M%rJ@y^ zDc&#TtAvG+GGPNPoKMO~&K2DrU3|-~w?}iPYkU8zdc!}bPcCkIzxRWR3ptKNRVHZf zxBkxgTG^u&c5?QprH5mWe*K|qkAjGp?>bN9C)J9ftYHXCMc z@BTK;lQq3%dcP<`>Q8rno14)^Z+e9*|JVCPmERPP-!#HIgWo?+-(G$%o)pDzL+VeL z-@))th~L#!@%U{vo!rs;!R=nZz5HHP8O3iy>Q9&7_lJH${BF2WzV?(Oa*Mr3k z`YO9Ip2l}zKAH#IzY+B5{TpSMe)G<|e`9Zn5xsw-k{VY&UXZdSw}<1$GhFuh z>f9EA2p&6Toee%gs9G&|qgPHYqMQIkB`0uq#X*<6^|{t?aIsIKUG2%JGR~%uAE+(& zNkQCk*|wnB7*a_M_J{mRZO8uxZ>gKAt?8O0+xnKhrBunS{!fryrlB zJ=vc9Ay-Y%^qT#54XH|=cK!bR5B%LT%nqYUS#EEkvm_KXOn@q5ue-_QUdd91I4DrU z0~e-)byqo>u6Pv9pS9!T@h5|@c5{EpMEtpI!S?cJkfGP`$B_EJ;?I_6cPf8|mB-_c zaZ0+QKMD8$Y}wxZRU5`>dW}6cq$>Wb)cWeR$DfF>IrbRzX?y&Ve607__1fb&NE;(C#5xUHss`Pk@eStYsC{Ld$6mL7-W2ktEX0%k`0~pBjcdPxpSKs^ zrZG|YMv$6lKj|d#ZF_u&;=BGDO)p%DIPEiKXy|gHFFDixabAMZL$rxz1 zS^|7vAV&fy9dbNeO*icK5+QT1XnS6LwZjQN3iMdPta}rg!{GXHXi;)Y_~Cs!tQ?- z18%5H6C2pi876%0Rd<-M2cjz}TV!?GZLCpIYzXkF1Aa6wP0Ww=SMD-?oU^C^1;jW+ znV#4c#gB+-Wh3+;P7Wc-!6dx4)ybjz*nb^#YhH9a<(m;*p?mRZ(dc4YnR9g}-$j2< zjAzpoyA03aWm>+o^t7%hJY%NGY?R@X2rHLBzTa@aRvftD_2fA4avz5S@2_;_`$$Ar z99T0lngcP@&?5N3My<$qmINZ~&Ds|e^P^v><_D~W$KF_p$IC1d8lWuXn!NKQ5cZ$3 zP)qS2^bD#f)YTaY0Va@P-&W^X6ouh2uNe&YW_=Fnmf=K>B6TyTnm#nb&=*oc&&OaFFqT#V>S-|gXs107C_b0F@_{;q#I zF+T>3-evr_!ti5`o;KAPKPqY*gp=UMx$f7BAN#+O96!ds)$UMev}mK zIDQm8m6#t57wheA1}CHD}LOyA~}BKXE+w>wdJmUoQvp6 zKUSQ$(m`olB-?Ai;#l%(dLZPbR6O`}aFjJZ^+X_t|4G2byz zA^~^)*;Ude{ z(5jwR@DQeNnPippBH0`Pa`iKD=c^TPB+sJfjN$6&`D#p0QHMZIESU|R)K_cI+hz7~ z$>qAfD$&!#IZc zb?)41tOi|;mlQU%+Gi`yQ&>lFGOnJRTVc5s-$xjLv%*frSJVUN4|*nE z``>Lm3NPS~hxHLA8TPzmAm4bz4De<(FFW{!6?|W2Y6A+;bhuT!4Krd+1oc*^3jfas zup^V5lU;Urck0Ax2k-DY@excGvG1s)Hjm<*Y`umqVoo+Yb_eO%&oH{P^^|PRB1W|` zNBAUjpw0AiPRU+)htu)bf;OpyL@ksa1?naF^@=jrE0d7hnJz-MsM;@#0?1WHK}-$ZFU)Cd}6X4#J*8k(h0 zrZtFzRSfrHw9g7R$s=aYKR^APNM*V+Y?P@a(5G94=16^Nk?&_` zuaJA4whYc1hqLKlxJXhYjDc#Lj7wO+ez#X=*K3(T|`^(&0Wuf9^m?#*9J z#IN1I+g^T+wluwlUxw7562JDlZ>RBV^l9<<)qf}P>#}dQmtW1NM)Av#`cvZ9wP;2- z!`nMnznVw7{OZU*DFFB4)wr-Rc^uqmt70#~x$DkA1%evEtsKMt_dY=l8!qR$dX5Vk z_Rn~~NZtnAxAr~nql|s6u=0D<6xl=VS4+2{zQC+lm^auZwB>1l#1vVk1uf@ozeO5x zMca>6BRVf%lp_)AY(y4x><4iQ`pw7j3VPY1*n<9v`z%Ej6svexCkD~`a;ub>D+b}y z!W`?#uYjtYod%pk0Xq!8kZlFJdYBlxM3p^m`A_M*`~{2{$D@iY_Qdz&6nk6A*>U*$ z$lBOq|7~q-u@ALRDBDi{u0Of+@^z8F!S~`6bnmzYy=`G^L0@?{wxAyVwq45-?*RV7 zpI>9v{|*NTY_HBEBfb8-xNRPPo^Ba0`t$V4c+t&M?wwi18{=EUgPw^m;X#kWc%c>6 z+Z}}mpD-q(A69fTbeL*goB!(o_q1Ve&DX;gEtKjvXC?jE`I7Nx>6zolz(oAnF@3$Te$b7~Cha>nM79#9 zE+apw;Qufq<#qINAMyCOuDydinDyZQI!Vg|*&QJd;)#3Y!Nv!?C=VM|5D}vKFQjPz z-+!Ha7$Y1&1Lmls{)D>4yCO*yN0EMRL_)qvTMpe#pDkA6&YRHvHcg{UFr5;ki{g8?CpC0MZ*c5+t(7L zEcHjJ1XyiQ>Xqi8{g0|_H0v(*Uu^v-ZvRDerN)HhijZ$(@4g?lefF+N**g$aK;tKE z+Sm>S*XUi2K}X84a5p@7=C95IqVDDg{tKsQ8HN^MY@{0d2l(p3G=H@iED6~A{oEta zb5JhV?@=I`4!JIy%=h+lMHxycqCASWuLG00t$&9?+;x+ggSj?#-z#X^w%=r)!m*{W zzu(K+WcECj=~8$+CbRm2?J$|9tKeFX`4q9uqNGW$iV5UMKys($M{V6&tM)3g8Y_5@s~U6g3o5Y@=PT9VBh35w%OcHt`snL9gM*WPVS?uIBZwyC zQ@I>P_@$r_bAhEhS~__m9EJtiH4_denA*l}C231;imSv-QvwO<`7;8Yd4Ha}7(B&Dok4zOu_mRz%vT5g`Q6A_# zpHw;SFX)FgsE7*LZCzfN+86g(mvi~ zj(^O@j}WkrFyLmv_VN(|R&+r4dT78n2fId$&Dj zJm|Tm8W^K`9!Kz&_6vNL()t+`gATThWz2kmD?&eveZA@EWbNxZNd%NYKPdjZ$fg## zH)(&L<2)XxyELK2edFv1i~H`MA`}A3RA8AF*f?U)b%Q$7XXIO~pmr)cHmLK`I}~ef zBHcBE`X(wAdtnK=o7kZG>S_oggjn4Z8`b|_$Q0R&9m2}mO(~TpTj_HIo`I}7t%HP@L*ePukaB(78BO${1D+VS*09 z&S)EI?4cM^IuiE%=OeYS{}0P_{e00-rXJ;~es;!AsGrUF?f1XZ^0SHLdh2JgdY<~3 zqpG|pKLwsJM^(*xXN(snNaCw{yGif)rN?h&<1cIoR)c6XR#{XYJgbVv4E8qZ3TL(& z??nY90AXqhXY0QO)q+%X1^8+5g)0#u@OA-_F^a4AcIA zXmJPrzrwIFMS+~bblmh>?KZbn(fWa?fuNK+=w$s$Q0!XLOkr9(+?)=g9s z&!pU;KcFC?KX4bSVY~7?3T2Yxx4yc&bSYcpuH|19Ic5y^{&ShMThCOUYlXtfcGipS zRMk)Av5`Z&-0+X$NH8gi)G!&`2R0Nzm{y9j4C}tgvE4^awah&aSS?=x+e*R7!e=5u z0TalPfasuUPc7}^%nyqC3@PNs`M!78zW-ag^L4;VgjTi0P3GaWjm7 zv)|xKge8#Y zZ}or*6ht9D``1Yz{>5rXp40Aj<+%iL72-ekjYd2fdCnA_hoMmw0hAJLT-|NBHI$ei zgMO*`Q4nEYEVq-zR0>GHR5C*P7Re1z7F11!K%V>-_K&O9g8M>lT;LvBy+M2zC@!E2$#_R51 zb&l7B!YI53-_sdhTV8i$uCdXTxo_?^c-^sEXLtpKwcv4%;lC?i&C?R&wd#;vqwhx# z()xbJ5piMk)kW1`hsY)YlsZ;0()E)--_zZ%m7p%W%K)FC{(5kpBde7&U0I!pxJp)c z&oJ1VQ#6v%_eA{YSCg0@!+ySN_)&Mb=Et*xlHT^hb~HcArzGY_b70r-C9%G9Yo6-ana9ZC!Pi_L(W@OcGn0C%#7_}gcf|PuO`C>5)=>jt#7~C( zGQ2&?(s47BB(djDd~ftrq}U5LkPkcbe1UgQM6bjYfgxsIM7 z3JrRKR^aBe_Y<8jK%OKe-=|C!nQ`S?^=~vEpzTc{!vDtXUw3_H0f>=~1WN)azf_X; zM%4A}2!l7qPBJudve1Iop=&MUvy$Q%5A`*>Lj3i`J*U*hpIRN%SpJpL$~7=?reA=UvMq6X>OnU&iXCgWp-pbL&;A z8#aJ$*vcKRPs8?!#~))vcC@{F?vm~0Ps82`^(n&M?GpZ6vUB;%GX2(=R%$-SsDS?tcG+483N5X+x^Ae?Qgz{=Y>xx{;5ay5E0;C!@;$!G8Y@zIgJ4 zd2>5Oo+fPB-t~NIch~e9c`~H_wB_mHU+f}z8s^F9e<4r9`p1(ebI3<`>iA=m~ zD^CsmqU6bt`qP%D^U>|UOYGBn^k{(mV?O&Rgz$u!D#w0*j5yVtL;?;T~I45>eDd3y3dm(4p>o{Bsf z{V(iOQLlLN)O#n{rz5`F-ukX7JxZPosXuLbx@N#GlBcadb2Iv1$kW!Inm@reuVBw1C{Vq<=-Ji1 zz36Axy}g)ah;9aZ3cAak>fvxUX)!PF(##_CL6qpTeJZ6j&AEdX=MI)}?w|^(cW77F z%DqqIBrKT&`0ft=C0UH!f5Q=|0NkgD|cr+7Zo)96xnc=*3Q zpQ$-T<0sQHV`p-P{TFXI0YfMlA(Z|mnWTqMi5eik^c$)RS2Ti)WgHUBQlcz_H&{4Y zz>?;$FZFo6u0Xn52O+u30_|@yE;`S=Te($G`X_V7cnxa_3a=I1TZTb0?DyW~Se{H} zFXw=Wv#H9%Bo9OxIzyM})L|#MPrr>%@&@;6rZO9uOA#FsI zAz1CTSgkBU<`vjWEC1^$zp_I8m#?mZ`<=dmHw*;N)X8(kH{-Evb9k@ifg<@Eec>nM z38%!@&tnKMVgaQPtC!U0zu=p;KSW!>jD?v4ao+h?*1#8dwtVGo+(;sIr4@XK*yU;S z!Np@iOo%7$7)cVKWeu9b2urRMMygnv336Je-Xt(o&B@KCgqo7n6{NV~ESL|LgJr{u zYCj9g!tr951>~g)iSg9izO_Pwr@RhG@;|F;RV=OM*x}$ZzJ#n~B7C(DXW0|a^mN2O zZH4@I$xmj5h5ruy$c)&{5P??&Yrw!_BRvo!nZjr` z9VDL8!wcczv_m}R*l)^FpQF^yV|kP>pv_$jz~maHZor`c<5^$P@-@iNH<{$j*IzNb z$b_-jL`jWaCMTi;LQ1&|WiGxVRe2l;witzhVhM!(C;IiQn5n=m@OZWs_kp8q`PmOQxWl zKcrM02=VFhDy2*>qz(DEtWuAXw8RSgub=MB&wA)%T0KI7{Rzv>{FC?BX@8=%7v$ee zx?k*B^XBpw^G8>3h!hH>uR{@du^6@rN_dS4hyAD6#_YPQB%v(s)+Cws zx(%d8@85tmuPsc`m|$><y>{EdgY&9xIA?ksb2~_RtPq*B9M33 zU>J1!d?AG<2Jc`hY0&XQiIeqtBwfTsK=qcx3id;7aB;lapi@%*Zk8TF=rdAkh$!bn zAYkA93I#Z-dNGS7&Eht*K-kEv=zuGyv=POeB0`_T+OI;(Emw|l zBFUW}3S*4%r>~j6#5e62vFB#*lx9^WaIXal`CLX(%A$pt`odgWMsiA6laSSVHT2Hj56h-u>v_5QrslJ({odI7A_!qAaVR5WN+=4&l#a=a zM#ZaP02gF0lQS`HABd`Z?Ftkjl>Q!X__#to0Q4w{*C7dAmsyzK>btW+;-8G|B9~9B zE(|V_>iBvq)W-^42R<@i{K+Un3Z?u5+ed=%2Z+NvvV!o0@E#S&MWO(-jG#0?5rQzu z;zMl&Ymiq_XgHF9XHYnBbx{yu)-J&wZDG477KHoy${q)#*<8{1EdI{;GsFkbR8w3l zi4>X;5wHNFnK~IOR07#63t+Fi>Onwh;c`LgDc&4NV=F#*Hz5l}Da*13wif2U?7MRg z614JP_f2EUg~69)De|pW2#SW|?*LV)gIAe@SB1ih$pEte@v_8d0Ehx(Ik+brBo31A zfr}4$?kdgUlE7pu^+hWlxq^vk=+z~FUZ=)lc|`LFoy{39ZftJ63mqcFI_3IVjT2sXki z;2tNLgFpiZ}>Vsb-E@l<3|Cjnv zeGBi}UXR7f*lp0I47vyoCq)X^pFtczf;iP$|6wSJp5x4m6CdjTf6G8gDE%Scyv7Au zp+47D4L?V8bCDxJ&BYs{lMpIQFx5L>2C>_@!2?hrWfl;2<&2u3w2Kolg0zM7|(b~?IW!% zq6VNu-5p05RpBh3WHPvFDPV#Dt!E#E17)zE_9;SxNAUw>f@}vD>u{ER*>L6YNV=%f zgwH^*%v2!0y2qKIY~%}rQoA|TH|^Jwh4y$WZ?i&3_!X=D6)X6q)eZ}^Ii)hqs%-%- z+ChZ`%QlnJ^&)#s(pCM#zVs)=W@>C_JtW;1{pYvZSa)!V22rGy;JsJuTQ1q*5lXgyBa9{g)*lrHMe=0nDX>JNooF1;7Wp z46gn`dFS|wh9jt1?yH-@@+do^8#x79q({>NL7wepTqBQ95RHFA=|fA+gmu4uulMjX z&e_yuHAt5J@TOawX2bY*=(Ve6!{*CPv*D3{>SjaR0@G#~5B?*1jQ=v=3$5QBt9BHV z9F>oH@0bOp%WxRgI@*6@Mu1)4tA`*0%$*;e#1B@u{~KE_Njc}b40{@c=Aw(N`W9b( zBY%lXrh@Nk)8PB($4To{^D7dZsuLU{>*kdQt`pu{K6_>^k*GY$3hgugd8$(X3A~{^ zP8lEoIj%t|BAXgSR2%KjxK~Q;vNF`Bw`9S0ED{SNJt*2@!*D4REDd_}Ih_kpJtF`^ zhcu-QqU!@|SOC9VOCC)b#IM+hAEa3tJE+U-d6%**WKdh|$XwExO2VF;XAMgE_*&y09pNb@uwi>6_oYM+_URIp=A5ZK+#2P^cL zl&oVGm6JuynnkCXoGgcuy-7)~{pS?QAxhHvE&5XoAs;o`dz&bRqQ~9eTk8;Rw7=x8 zCLa1*Px5?n0K%j?y8c|;ru8d8_sZfY3>2F{i3!BMQ6FP>!`zfAE(t&QJm@#t4G=kq z@sQ8iF(?K^`b)$$6=%j#u>G}CWZ1oWD)oc>Ilq2ExdkZbap-^6CZ&Tvf&*GrUKFv8 zOz>eHCDVQq9HlgR6O_{!kRT4W=)diImEfO|Ao0%Asfw}~24i}afBmzpY}gqV^4mIG z(rDLn&zD;4LEv!ESC^)9hcIiqDc%A!MZ5*B`9~3wwtN>gPQ56x;GP~c8n!MK0Pzgssja25jFIzXl8)&pIF$9@UZpLd9 zK3hJ?i~c0t^U1pu;-0O4?m&LG+FE|mG^s{=qKZX1PLmJ&<3CD=a|vX?3Oe%j0db%> z*fT}xB7c3-{0d=N{jCy~8Z1fIauVXt5eZgKw5FzI&(-fCce-YU+JpV}Y+1YS&7(3; zG5ncrL^R?TZI5PyxsNT`L&=)P5exp`;@Me}d#$2$KUW}9d7FEIH-{2=jRg1Nk>`c*BK zvww~!8X72!RPNHIV~=+2vK+U;6`fy$$qzOtUVZ^jd1I8|q^;;sh>b?EC272(^BZ9D z+fICC;$JuLZTj!7#dna&uRHi2)OCCpf27M-f*Sntt*4@zK+EA?-F=-wFAr?|2mA4S zb#F=ywqZJGL z7n;~%Z)_CC#D-;bVvp5hNyb8oR}EVLMJjQO_Up#z%+!I_d>Cb9bws#o*qi|9Rhpw{_zD>eCs?t%++@*FlmZ$srzLY)&uT$-X*hv)> zz5X~>?S==T6T^&4+vQ)=TC?MqrNKAPKEb*M%!Q>3@DF58TFh)&T*mePVgG5d>10Qz zb5){r_EqVe^vdbc^sN0Vik`N=CZOjv*lEyn-|I2unjM|a*NM`ZuF~;6eSS1OMbYWp znkbzURXV4AgMIHJaZZa)r#4YK-*H`k*#G?3G3hM+G76u=6Q%RGO6R6E=SI_08J*5O z^Aq4a2I;(%e!yvyQhJDZiD<@^&#muk`9#IzH4~L_*C##q3*GS$^|5DtQUO9PU5*>iK zfdPiy(F2PhO2$koK?+*qI6rN$r`Kzz%zt{XEBIcP-6_6VK+1z}bzuAO-MUuO=f(FZ zRw$uJe0_EM%3Fi6uYRkh1a(WNIDdP%i?grp1;zwBi>;tjEB%4*q;)BL7Ben8|5x5F zyZ+1Sw@jAaF8QS@vl|^-CdQ3=WOP(NqOxz-*%Yq~nd<3mYGRv_&KFJKVN>B$d0GVL zBFxEfDmL0zAF&?j+4_>H2SBG>t~`6j?`OOV(4F!7u>aE)dc#ZjcGRB~JH1*70@~XC z&3`nSj$iGeDc`pjh5BFp6kdkXuaTR73~%T+V%wCnh*Y<$h)EGTw&vh9J5w?6`h_n{ zcY)&-#f5Ub-BdglhK3Y|3Q=?DIX=0Zd$htA{+tmJs6C&&4-e?&Tllk@EhqTukLEMd zD3y`tgXBpMPKsMm0lN1vr3(3vl_IcahSp8ypG*>2!{ni2Xy8Sx3+UOS*V+H}=wTeg29ma|r6R$B?#thP)q+&u*gZxbmXLpGUu=^;5>0Bilz1z{x4{hmC^B z-+;o@bLqH1!NUIOpIo9)um?!JPZtY4O;s}T7#UI0YqbB%4Oe6+D(qi$iAu=+f(_NM zf1ZA3KhVdjY5MRmr)fHz!hkNJ5;Cw9pYQgP!;K>zGTeYgE}&V492Aii91+Rf`+^Wolf=fi<+X;fB{ZcH{HVyTVx6FgRch}kRh zrJu8XiOH<`o>&HHoU5H!Crd1QsN5RutIQ9e&~ru0$FP5C`4I0J^&9w2D}t^;X-IRM z;S~F&bMZt!Ge*9)zU{bVgzUr-nqPZ!u^~;|!`Hfx46vYK4!>E!uR5Mh?n;~gn zX{B;(YoJsql|!xmDH)95O;A>TiIZ@sBqkjo)JsodAldpwI~wOncEE!8vwf>H<}>K&o|>=9@O3^1S>dp_Y?LrqAIE z40B=}2%!<79wUNy-rUPKt%APg2RBBd{GWlF0B)+b>QMy__U^sU+H1Ky=gl>fS+!N%S&F^z%)7j=u^O3Sm-#p-ady zsmM@C-0dV$gV2c3$r+l4%!%WoBlmM6_haNqr^pWPd5F|cB4G@zwmoxFz^YxEIl{N_ zG2A8-7^{_TLoC?Hx%^nMh}esGsePV=?I!a|Hj1-PP;aL@Zx5pFJXF1{aNe?- zwf9hOFII0;S|{@5R&4j`>uZmcmnd1Zy!890mUj`A5_}<|QfdOq7@~TB8d2i$tLpDr zeu@Y_YmN?nTHbRHevf*#U`%ja+L-01^h$-dR1P2X^B~8-(SKYpljG&+AvhZSv6MNy zb{caqhb7dVQi8|kFFLGT`opL%Q9?ZhaKxJ^$A2&d5Ph$pu`WA{BFFp@4tT;jo^Y-w zoacnmg)8x3H6nF<{%NW>=;0C_*JEb$`L(FInn{L%oMiHcAHw`O>c+eq?Wrd~?WQhc z0Wb^zaI7Gjy5au+_<(gvmVFL*sJlD2V#{XKBnOR!nh?EXapoh5LZ=+`1-~sH4)Y>+ z;nJApshRkaLu$yjhQEaR=bx&2TUvc}w=g}J8Dt52iGgJK1fOo=r-+w9GS%kosH5!Z z1^m8Op$1_M!rcX-8WpDlLa0d$w-5#UmBF%cngn_SKoz^e2aDL08$v)5 zOj)zuS$=jltvyRDo5`bmD88Bc(*O98PVo!1E!M?Ht`d)45_8iJ=wfKn+tRcB27&^h z2L#2!1tMIya_t$X@H2LZ0haJ)=_xbY#oyhWV3Zgh`@zn0j^vLPl-H;gVUgo z+ot>&6z#o+D~xg!Ml=)T8;5EHCrne$Q0$uKHdXV?dD8hSSBqX`?7sC zUY%Nuu>XkPaTi0VNZ7x$WT?m>h7o~6gg3JKm)mG(gfWD zzsBJlP%I@rnDsU7$#ept(Bq^p2T1)*Xt6r@9?K=jVTvEQ%h@)V(K#2vA~YokcTp-l zuG!i1`0GG)xo%Fm?L1K1`o7^jmL5pVYO<)3zNgGEhHFa5E@wW(4;8gQU*SU2OT7)3+kdo0E#5D)a=(VyNc^PRI0Oe0bn*I867?KD_Io5 zSD;?9g9^(h$RVKL=g1v4RHB-kz#0@p)V5SUppmdq@2d$k0H{p9FQ?UN&aRLLZO13e z1Lr=VyeQpbEqrv~8oDHW#^nO3RRZzJh z*AyWX6~F!E((l?qX6Do_&yN~E(N~X=VHCxG{472D2jZk6YP+mrlEMF4NL_>M$}}}B z(?LVYSN9y^BhDh+YPY2N>JL@Vi+Q^)Ex*lIzYl_z@2RHj1qh6(-O>}=SRqD$uOZwt z2z*wehWGkeL=L~xm7t-G=SHCY!;SV$b?(Wehp)anrsr?>JEq4P<(i&{hR2$oGHExC zCJ*D9o-8kAfNe6DHnYxTnVe+9u3Wv`<{U2Zj zTj;BM1Er*iT|p{167`z(u=Q|gf2+1l>}Vt3=l|O`?GN~{NO$Y;J_kSWzD6RVCe`J*+3IA*n}!reoFP=z<>Lx7}DUmvmw5R{ii z-q@GUf!HExROeFB$+*O8R{Kjd_lqQd9WU%3{@asLKGvvj(ooNrUtdM{UXJVlN-G?0 z(kRdh-_^#RLw)cjq=?Cxvpz)}L>81Fz==`9rYit&uh`0e0c~wW+$1@@Z4CrfKg3&u z`6`_qapD%hSQUXdGMGKPSsHRN;T`$Fnz?rFq0%-UC^vLC9*X9qt3Rs0as4uta43jAE|xX(9hY7v7Yb zK$!_tn80KSg#G8p5iH`|esZR3#7`dTv5vXQx$X6s$B5S;exz!$rEX9A1*viI4A*7z z>=td3W-rz4btMK$MOi#@kQc+9*%^M5=lR}Y1m05%dGVV$D#*INENx8fw!M8b-hm&5 zP$p)`i;bxWVC6-Y2-UPtS?%CkvyN=yeeGI4efHTFF?!IM4CDe!-y|sTbWn)G`}W`3}KNq8Sw7LzJ8x&y=U)}fcVW=EcCt-buQHP9)hgl(` z3c#MKfX-8Gr0_zkLhD9)K<{Hwv$8RQ1EE=ek-y>_$R;PqBtbtDY<&)DhPs5U-XM`_eyk{#`1reG6a0grXB*1T+@o#kWPz(qV-P8pTZ# z(*WaPzwm3?3~4oqKPhr0Q!IEeQ7|pr4n(Gm_>fBKa4o*TZ@i-EZ(gkFFC|T7q(8di ztZl8&lu`ekHenP;9kx9G^4>+pu=~q{&3#)euzyARWhR$gH(Um9S9fiRr!TgzWi52z^BJ{c>mRDgv@WEMc9XaXg%+tQuSTJE%a z71UXj6LD|@4559%6Z#Yq)~$6nY5p820bw)Rp2?K=kd6cc@wrz4Ywwf;zxb$`asm zI+dIREaHnwxJEKEODSdS!KN@2c-M-7p+|$E92mr(3`Wkhw_rjNNrVcTbvk-Ff~xCu zr~6!H&;i;~DEr)>k>%0)Q~tDLUmcA{pcKgoG6mFm<`3e~BC*%%0f9``{3tl}Sqd)g z9oPyi#Yg;Ni7%x`DN8{?9tQ1xNSQQ1jl9I>CD!Wk10t;zX&~HY`Kwrz@@#kdvH3mA z8vAa_E58{k>vvOS;e}d-8eQJ%Mc(q337H^9*$k8>s=O>98Wby2So%ynl;ECak2!*r zB{4lY#$IiGO6Oldm`Y9liV&6AmL8R(_+y?_@nQe|7~T*rg#C{XcZIvpuROvHi6LFD z{mv0?N(|D=;SVr5u%JjXm-*p-wB!o|1S<`b{x2yG4GGF*d5pX84qQY6Kc-9?XkAs# z7>BXNTKi+_q&+YKo57byTfxI64|{!<7?zLahFqfY-@4FS{#g70c1-!FyX7zNl>dl0 z<^Qdx{AEu0D-xHV-<2xyo)Uuu1f8z07;Yeeq>@D9Kl=$1@5+sM%N32s`X?QEga(OF zsA?BnDrF3d9Utg!ZFo^XOvN6{DOid8B%a4CAKni$cVVMyTi|82VD=^F3EU%}4z!kR z%P5$cV}%A5%q&ZV&4qV6 zN~AIvVgH~yhuKR`beZiR7ov<;V~BV%t+K>HZ|%4m{$VS$L%Ai zUoAI{dTD2W>^2i~6|VBt$(L?|y&Nc*Cr)Zw8b{DZQ*z$fg4j!oDjU z848__x{u1h2`!t;tFMWW7!fxlQwkv9H28m*>d-!Gm`i)xz*yS7P7GAt(&6a|yUN4=zXG;4Dy(k0STb%NT;+24-rSb4kJEE+yf4`S-@;7orANWLY z5x2L{i^ig>D;n>nzji9$7eUi$Q0P))*NP00@b=q%v!1{UO86dZKMfoc9E)wIAjF>s zv6#{K)YweC$@VQAyJx}7vA@K9FWe6m`OfgjH*CbF3|GFf3=xm9@}1F|;=TIpqDLy|T^H9`UGd6=dHI?jBhL$hkYxWv7@-e77@8(EY{OpG8x$?mI z6BR-D+i+U23`NFQ%_0@j4F?E*s#>K!6*264-c;-q&uB8HEevmwGUj4+x0bc>{| za3!X3ah$r0Y~V%-uTONwow6T40pv;_y}tx0Gn{GPb`LWJ=i8dhEbberwIfqn_rTpg zFq6WIuJBgQ9c#hDVtH!Dld!6O5a9xYIIH;J+m!6uix#O=VM5vL4r0?p*76Fi?%m z5t@#~AlGlXH8Q4AB$pd*Hno0%OjEVEh|hWai2 zj|W9CtgIUhdtki7u-wO7h7}=YCG&SQx(wTZRlksE&9HUq$zj+JO3X1P@G|j$P!$8a zXNHed*!@Fh^zfy$`9#LWvy#dvhgA^GZI94cnAIFAb5qMlM)bEwd%t)DA1LL6)lx;qD(EJ z>mvK-n;;NK0y3(l5D)PDn$&;_YYF}w;G3BAuxF3XHwdfpNC4S+4V=ylR7Bv_qWy>a z9?^KUkWNJ0h&wNaH>se6*LlLW2?H-J4>k2?w57g5$DgousZ=LlC3_cjzZv zhSfr?utpdbL{j|@!p~kQoVu(9F&rN+fq{~l0Il)q< z6Tr`v!D^JX6gH9<%U$LP7kk1bp0MQ!7nm^SmXJ6=bx{jPTa_6&Ny4I}O2d#v3qBJV z5hjehBH*XtzH=55CeSIo^Ud^03_+p=dPt(&gJ)!5t<7=x1WWMmJj;Ase-cB0_PCfB z%Ukdh65{rDO=<=-<4*6TlNVt_@(Swnax5n+ZA(D*YNQ~kAcakm8YRKRp)lYF8PF5^ z_Tn&P7}EAlocIX)M$C=Smm(~}L1rywGV3J$CN(knswOpj3mC`+)MUUGbNx7(F>Gw% zzF&J3j!b0UVhhPdhY)7PhX5fG8q8FZUt@tWcDP)N8lrU@{@8Wu#oY*l8uyBjw~bog zX8b|RTO&T?SUAx#Q)f7?A&dixEFv#5pD6Mg@&;CM!CY0|N@vsJD+Y=s05pU}Gc}=&3+jz`98d$rB%br|c5muG7&o?H`Wk zcUlyQLu6GeD0pj&y(924_#nv^#)aVBhBFDYF5;wcX*9 zv<{@3vcG!qiinykUuyhx&|HYtXPgTG4Fj9uuwlI=rX{VoF<`kPTD{mO5YQt_)fiaB z9Pp*~^Qp`VWV=^%`l}w4^lR7W5!5n%DCkN6s1;ZudZYFD41p{blh2UAon_BMpP{nb zpb+&ix?d?nrKAE)0_oI7r>zj-<`4hN=+9{+g8dQ1h|@9V;!arC;m)fgh&dyzfIqHL z--$rXX9V^@)xFb$(nQ<(IzmQR%GtW!6u9*$8`6eqzG_=t&4$s{&wvS-{D&7f*n z!rJ!Ks#7UnU@J!lVF&mJ&et(1SDp@!AALs(##(}SMLt{Y7@^id)a{G-3jAu3yRNa^ z>6Yif*W0hj%tPWle1))Xra*vDPv}M-MAb9b^2-TCi+I4sLad`FT)rvu{h6y1Uy|n( zOF6AvYmVp(oXcvk^U@`pcccXz$xbHaHA1Y?@RRpiL4xkDf((_J`ZBmq1@WUc$#Wo89>&I&!(E6=P(xB*p+KNkogsH+AH0U~<=?Q0f!U0dXqxYSr zNrN!!KFJC7qaFm^`#Pr+=h1Ap6DNI7PbZE=!Z_ch^MnHs_O;+neIxkIwE=99A){XWIZu8<$Z+sWjCnZQ7 z%r%24&^#zZB`pl6F@$C8n}+%pg2LmT&VX!P0@2d-E0y0&uhdF|{kCgm$#Hnl0ko@S zEV{@))lGHK5@Y*?`P``{=C_TcDBQo_AJszt#aq8Ki!zmP%H#)`)nZ%=*ZRz5T+pUW zj`7E}XAt&pyw+?CU^J3#%5vILnMFYkhIMKpN!O30B)Rzzc|Mzbs1kghr}L#+P~PH+ zexse*)8#^={WZJ_!xPh2oW_2Tv|k{#6mfO!-)$C^@7a30@pE1MRsKiwecC^$pb&}B z!sd!FgOE8)3Kxl*D`EUAaWsOd_+z*_~ zIaDVd=?-JR0|0jG<78~)5C0%C;r_=yq`3MCb~@HeZJYTEToSmZ{_DBtzh#4R7BuRwe@`^Q2QvID*~+AY|MMH02Ae^0rf;;Mo4u>YH@9s3wO$hD6j z_w(4tTxB00mAzhcD@(`*jXBgCMf*igHU~*Ic9z_*+e`>j*l6dQ-;Jmqg4ZVeBdexQ zzl$dCe3!h>4s^*oH4b@wIw9|wc3?zk0kpS&LFq%&Y^@K)6si)}wmIH21fu#3>x6nl zo^lG9a?5$#BjiQ(##bw2zGf#6c!pw;m7U0weF%JfSE^-=2Vey;b@Ac1=@LnO0AWR{ zY5mTCzyy?OTb7ulS2eBbz2vqW^eU3PzwoQwk5$%S>(CWT_Ti+b5Ew zNw04uN4fh}vio>KWn>JKH}48{_f51t8gNfC_@9Pc0#k+qr>*%4eLQy;`+;voVZY+q zq_7_{E)n*Jd?VOLmv7kJx_sNw9-EAP8{#q@>=zxafPBZa$CP|8zH0~Mzfbq`A7=80 zV-?#Q;%SefZcxXwK`9`!+He|ChxJrP_o#haa>P!e?5IiTRf)yF;^!ojO)JEQf)pvG zK~&F%r_uarYSj4beEOz#jXpHgoc`ZgAd>Crxlkn9`xdQG4Aafw#qfL;l<*=GHvPYk zb)o-vA2=0WELAqD3QN%c`$2?eZD0SdlHaX&YW@^Ze#%rq(F4H%UZ7i2?s>A645S5i z5;B26G3_F}Pu;5l8;ijLsn8h8V<=!hey}PgTx{v&aQZi{(jS*XcnZ8W%#|PT$Fzqo zB$4C~c|ksO)ZU5fitDbrw;vV$jAGH~B(CON3S;^Vr95uC04ieoQg!oTqeNltfFi;v zXYGK{D28(FC1`~Z50qUuJ5cBXz5!@Wx*u7MQIUS>!)1Y%N*`^B+eeF(F_JOyJu;g# zA+qvxbsw#Ab4e3^5g!+yK_PV>Q&qDFDdTeSRQ&E2*8H}J<4pCDVA^QHD0L0OB!c9qJSGtcK*^VtIgv;&_>G-2UNp>bca&QnzYVR>H2v1E~O_SS8ZgftFwj z`3^ymMv-YOBk{>hGt2(&NR^kMn8#dm`9lFiqL%hD`9j;LJlc*LrV3}g@*E~>k^dzw z|M&FpKgGj;VP%&6@%5@Thz!lv1-cERm9|71`Dp%C&-ChRF=!C}m8d{kwsbdvYArI5 z&P?-776W#hE(qQ4l*%(mJDaYR7do`>=Ar$XcDlFHv7jrdEPJ3!JJCUAB64b(Q#8G+ zW_anp!=#Rzwfn0vT+B^d9G?)DQGhOn(-4;v!)8jqlcZT=q>51_UbVlz= zp;ucbXaVOlMNoeF`3~?O_*}||#-Y5u+(WsTsTkm+@ouX3(jSZWIi1me_^;yPJ$sZx z^*|5R^;=`{F7#5}8Q$yby!6J(_azbZ#u4vZWyMB}eEj!3hu)iacTs+8ODw(jk4u1Z zG`_tyLo87=7(6k2YPAlOg>gkbLa(RsPuGO zfq}`O6;%kw4_S)>tREM!v-$6ELdu<`AE9M!v4Pq8f)YbSdhglnm=o&>hk81c+8EK>M4Vt zvdEbxplthPQU>k46nNY+ekNCR`qd_VS&C7?Z(JxLK9Eu6EtD#6Vb$_D-U91=;7lAV z#7{sk7^ppuiAi0KKN(1@OjUiLTao+vVfX;=#W@f+0bD`T;}Ln!iqv5MyGsMb4g;R- z<1%26O&$gmFpDhvt!q1EK(V*E7lU_s&34L{Ac!)>$k%@cvant?kCLz9XFJ7vdpEau zM}F@q9y}%SuXN{kfR8cqHTgp=UuO$43FWK$c3s|hOL0()82-N)m;W#@ivMLE{*Q{_ ze;jdrJ*NZy%llaVpXC7bWQGgS9^ZKYGW@^B!~aM-*a`n{(|CwKT|;i-itw$0N~zHb zk?0J2;WDB^vkrd1gh9ah2=-`i6mrZKWDU|Xjx>I+Fv(12Jj_>=WMW+LnWRAQZHPz# zD#i+uITcF+jVPmfiGMg!?)0}Q}lbKamUD$L0mj=YTV;R4&tZub`gK@n^?rJ zy4pe9Z274@a78}OQUR?o`nI*YYw}mLGCyxA`{mW=<6dH%hdxM7f^h9Is z84eo9^m5U-3oTc|FI`Xt3}xBpU*(`dvj_Zh_ygoJ&az)pl z!y@P}<1vt_z!1A7M0S<{%fKN+31t@i-jhz+| zotvN~n*QpW6XT!W5&cdj-X}i!H(Cz<86NVl-WZF2j+gu{;=g!uV*1bQl>XDD+dc;V zzn$jLZ}o8Df9Q)?`pYi&z~4psx89`b7yoVysRgnbxJw|)zq?In?TUZbWYRBSy0Q9& z&Vcyx>G1ckgX4q=(v?9><}u?Uh+Psg1CL8gUQ}0E+!S9doa-z#L<^}Fp0FF5fwzVzOJg$ zctFlL=@6ZJjVJ~$hUciDZUrspTPc>bg8s@!)e6Fhqx@1DRZDQlp+-KVkU<7=@F0?y z%YYr$J-~T1SinMej?+ySr=b|t5T<8#Mb8lNi!;7;&qxKZOH_CQxtP8&K+EDs9~+B+Byu=n??G6oz+ zqSS4tvF~&8$xZ?LdkQ%AGfx4vBQf}5r-0FZlB&6)`MYYO!{3g^kKh(lYCY@|6%frv zsDdTS;;-U$$CL6$WP-Gpi#1FzLdx$M?i4a-tINf@R!bz zzhdn-)iN%>9Q%FU&-g`5{q|;oLx0&8m;Pn8hknhZnI#VWUGDE4VCYZMewRO$y#40D zSYrD<;Q)nBwEaF+-pAPQ=TCAl8HHsC#&XU7)PqTZh>u-)p$C&L*zbN7UVg^v-{Bqc z6Y{G4#ryYXp}ZXlQTn&(M5h?x&2BMTKk*bpv-Zyyc#09(PKmF7Mb{^ze*rxTq0MJk z_3uz!LbsNwAuJL4x0hSUd7Ioqrg;mg^>4-bP9eLjf1@XO`Be%sq&C!yOUoX@7bst} zy>!|2nT+nm=-+uKI83s?cj+JTaV(QET>7KOB%|H?82iyQJ~931Y3qdk!{XC_&oGDn z91s0<|Ba>J!WP=ZC_vRIWe8O~&3$b1B!>RA<;lp~ak>;q$(zT;k&$BM+58P7eafkc z5VPi?PBDjn=d$UyA9;$Y#q5gnoMLt?X3_S2>$qgfckK3;?@gKHMW-#Ie5;Ok%6G-L zZu$QHpV;zEJ+~X>8(_-Ufxm%H(YW$QDbe;WD3m9#cNuOOe*2AEhRq*(%AoDt-_LQ% zket6U`ntsW!=2OO>A#2mm$8LSoC^5ddHXivs5p4T7iAd>c_i%9AFv4~`!!DEsSnU!K3SMkNytKXMcIdzK3zz<<*T&L6rKpSa4>0u0cuHK+ zM0;&FT?(z9BBIc{Omd+@9BzgtGZgTutZ1oG*7}t)-1;IEB?65-~CvBX5JQ*8IYrS^nXxs+{xIkCCuCZyme!FTh#uJa65P*QxeP z_kG`P55Ffh#csxW1uL|7HU%z&D#gVE-=9R{24F6NdhtLmTR~a&>Y1Py z`-2{(SCya%m;qo@?Bmi{5S7+P1tu;0YL8b@-Zn3BPFckzV)HWWbJTAyxWB#b{B{g} zdnvtiWtAN8t>>mQuW0=naFxa*7hB5(tonB=`^(M?R{qeco>uS>_AwPOA_JBL0CL`t z&#nBnDoz4hc~Z>e{jh)Ev$(~yENV2Hdf?N5ejD&?_0ezZw_F*+G-daYLD}{@ud<2h zz>9&90@aGF#Tk*&^pC!>6Z#{m^~a;O?96!7?)i%%DT9~V%eKT&`?J^D<;3WWnVdgI z5($!XMbq1SMVIIue_|YT7Zt^$x5sbQTQ9wj{}4fM?Y6#^`(aT`-%9KRyKO>c-ytnC z!Cs--EHl~QkS>8}`q!6siT*#I5QqLvcgLguKl-hg{tcTW>5oP?R-TJGqpvf0-ZCr> z#iz!lxZ>Ve#D_&vjAiI{a8(!Nx#4n+FYKta!(dg^BFx`{A5=nhbgw83O|bo&KYT03 zL%Ph+aMKYgujP^F84`n5hAMmbG;bx1n%2t>v>R${PQ4p~xO0!#G*vbL2b z&}f#FUFfa#qvfahGPiur<_5l}_QxFeoH6-rm3^@4set|jHecXgm)NBdmL}qL5Uc$> zkf4;AELVmVdmKEAVHeILKwdCC$HBuivmaGO^&ST=QFlkwh~wZjX(W=z!MiXdJ`Uc6 zBpQ#VOI{_aWFS4?Cgl?^~EtkQc!#4^Am3=4$u&V~iM`rhxQF z5H>F{-@oy2d>B2Lq+!TECB;>t`9_z5MwiAJocJNHXuL*W(g9vqiu{nFBvRvbpx~uv zzj$ngNAo8zhHEQ^{jNiV9nJqW3DZ|JeTy&F^jRdMSS<#A4Sau-6W>Vm=wVvCZZg5Nb#&vVy2zK}kjW zT2jxVq{7q~b5n)gwU=OPRBXg8dO#~e29_ghdyj`)28sc~ex0>gT>=J{(Lz~EgDGu~ zL#Q9{yy@AR50+u=?Eu9&mKr3xHYUCG<{MH|45M+dWz6qmCwhL5#k^i7I@o$ultMt>iExT5LGB3}=+##4<`l zhA-VZA$4PW`=o%#EBLK;tpy8HtnZ;e@T2Vde{bThIihD=aSqAO;|F#*e_%*o_R!e; zijZjz4>Zdyf^MPR6O(I!$yK$uRIbIg&*TbO9tCMfuEos9{_Y)VS;s|-S1M0| zqUC+uW#Iy#E(JHp{!N#o^V}`7xU;I@jsV}lJ@NBbOuQ2H49Ho|@Y#htED!&1mSgleK}DE^ z%1#(=g*2CUpfeA5j1l9VLX*2z5J~JtQiI!4d-9X)tFUj7n}TAuC@8ScmVx4G49i;i zfZ`Gcc*0sjD0Yj5V)Ad!aQCs&P>e!9eDY9$oNhyb85|u$F&-QE0*WzmQ&6NwL6Po4 zac)lyMIi&7LXjQ|MgM(brJ@jB`pH89a=Hx#M#(#d;>y1X6qm?NLD4G;3hZ)cq@nmL-G%~lUOI;2!Y2fZV!0_OdPYHkzAgjB5vdvq zS*zD66g^|1_}8AXP#lGUfaIY7Io*ar+DIMQiXxna4Fwq~H>-UK?QFxWA5h0R8$&63 zY%C9O6)P0ijvEW~9ZrWvs$Zy^t!^Kx+rQ-oTYZGD{t-e8TaCIif9aHCdBPgbpv-^K zS38}*ga;gkV>)WKeeKV9wpDZetkbtJ1~lZvnQ1o?f?0X)*6F!&BFF3#`Ge`$&z ze|)w3spv-{%+t1{G&)gQ46g`ddgLHy=9jJ9k zWHZMhF~6!ez6i({EKgzZ%ff;06fXHNvv9Y~IDC$VzLZSFX>s`*C!U2p54&LYd5R^? zeupN%{x1UfZR&QY+)&yZe+dFn(!)`X+=+YQZ~jgFtmQ8Pf|S+(U>ovz>;Aae-##w! zH>lgE>b6eZ-jSPBv-SVR_CQKudWgb&D?~Yve8oq@wIRM~Z%6*T%KP)Nz8O#P8Ry4M zdqlp&X)!OM;RQk8=$jVCtHR(Lg~68{$ZxFDY2zg6A%$qSu+rRY4aE6-XxgC;`C1>Y z7xs@FdLvIkvO#sP8;?V@HuNU*;89klM02j>*c^qbJ|NnN@dr3m9Admi-40f893Z#W z)ja?5IrYm^azkE6`er>!ds(|}h_7BYiWf&jVbvg6I#_+qM}yTdRbJ0PfzUnAppV$= z4m^X)6ulQJdf^m7DzBi{V+T&JC-PMyPh_zIPkSOf&bdRe+|VoleyVPbaub;9@4_iq zN|4eV%gZwwYg^L9@)qT{_@-Tevs+G+#Y+mF>L>w)f-! zZT_K`=8sb!KaDQ;PA#uMLoW^FbQ_yJ5@GWO&WMI^t&|%b)a~bm?El-5rN2_;cZs@< zQrXsSJE{t(iBGBoq1)9=-$a7<@t>ry@5>DmaI~);d+0y{c0|to6XiTk<$Sft`Apxe zcY2A69>bFF2-tmz@^5=oO8#HDq2#Cg>YL?zwosJU(THay`^xJO*{|VC%KlCAbsX6j zi5F>y7QpK$ln<2xQ1*wP5$kpQ9o_8-W#3oVLy~dZPv1eg6m`9Yuy>78zL7vF(O~LW zDOa2xOIUVigjK>oI!cMAQ@52eHIY)DFi*I3tlXGk?Q-x44aWDy#JpV?Y$+VL$rzz6 zZc`DWREhRG%+6%~$>S$gQ;Y-ge>|{2$vSPy_IPtW5|Mw~BSQX7aw7?oe(qa%1giZj zr1HPTt^BW6mH(xz{5RpyXjr1*D)RAiYu$*m1MDLt45>ZSSN{PI6OigmN$s6zBgIJV zM82fdj#VwFSc@GkwMyJvsXhGsSmEf6PWn!y_E~|2Qrk=F6IW_`iPXMf)am7p)Cq8* z6=S3pzM7(`%v2>$jEW^}0(#pM5=Nx9Xz`|J+ z6kk2}h*k1RU&K*0$ZEG$O&x&HfiLm~PQQlKt(2RW=+CHX?2!0S>0Bor60m$Dcszl0 z^{T#^85qEKHrCc15=+rho{&|(x@}+WFfGLt$d0|DH82M#`9IX{6}cr;)@#xJfTv!H zn|+3gHCx@n>NZ_&t;1M=+HDv6X6?pqt=etHzIxScpkl=JLZ^{XA*YK^jc*l)oT@}1MlP+u|o1Y^nNE4 zk_dg?o(?=r((YJ5p8CB2G+%BCiUb{aKAKwUOD|<}JJFXo9eDTcQ52&u_gv5wD7L2q z51qOlL(x1}pm9&ivLKOoptNR>A)La7YoG{bnhpxAlp;nWhH{*UYwH+3pz_~ zts_5&1*ui9s@1JZ-6qHlX65p(8NwqYsz5ZyyIlp!-isYI$zK1h6k~h4`D?V&)^PI-cV}9O25~;1&kh zsyQXJQk}H25qk*ZK;E+p!vk=(;^9`X70&jJ`FKoar&V4n_d$L+UUXbpaJPl|Al z5aLJ*FZOq~NJxcOc*3hqIJ8)gZ|U;}Fv*%7OdQ{zjPY%BA){Tub1h^X2?M^lGRnP8 zzNzNSsdntne;kZeQK+{SIvYdOdR7*Osb2FnJkJjinAV@4ASE2s!}&QpJP3a>#C_wR zOgm&bH$uooDEw!M$L-Ie{JIV9Bj|Au!@(Rx<%-$494jI zVkZy5VaIR_?*J$+D5m%9OPnx&jtrk*Gug>UGICI{m(F9h4!8>iA;pwbQbd;2)& zRUfAj@~7xW!tM-m-6N?7d$;~SbKe3VRdM~F7#`u}jn78Q)>We>3K|qOQP8NUcWcmC zQR4%RVr>+(2nnJMkgywMO;%8`^??<&t=7_tl~SnqYeIm4PY@p{iYT?-HJ~U}B8d5a zzh`Fdz556RAD_>EKaiPw?>x?&bLPyMGiPR&pt<;^ZSF{^;8j$%tXFjt0Y6v(r%w+0JN!6=p~dP6 zDN2j&7dBM#Sbto2J0|a3fmtyU*Eog5fQg6(sY$OEAp1Hi+z70M7QXzF`oWbYv~7bO zU1K-5WkI*qP5ihtx;_#0m!c`TZc`TL)v{n&!bNS<Kiwx0$yY!W8< zx=CMRsX{I%`V8V~kk^>yok2NzU2mGQ3*O@$M=r?96kUoNhH%RfsX~)BU=x;%ZlO`T zV25xKsWSYW??{zMPd4R;qzaBnhP#o|QU;Bnb$O7Ga~DrNky=V719SPA>KuT7*VzXA z)T@{@!zK{ml^$uJe%0=11^@J3o>fR$v_f#UShJ4mqdwN@J?<*I;}tu0C3n(&i$m)F z4~&HDCxjLyFca?ddc$tsoCQ~+-ZX0zIHm9_3NI@Jho&Z7Z8yikcVG7&|CkLT;d*#g zK|3m-)fyFG;`}oEi^vpJj!G15hL>c}y5lIO!zzY2Imu#yMq|M%xWP&gn&J;YBtd#? zV{e3^38H2#d$VHX8ua?ic6MpM+f9_6aj4FzXpFACljt-lwhi; zF$6BoyGSH2gsuX_5U^1baBf21hldq!m396&OO%ZBRdB8ZXh-V!e&zAn-wLB1{NdPF zWhZ+D6H~fYG6HSkbg(Oy65#2`3r1*OfyZj?j)7K07Ng{?gQW8I7%Or&^J9FqZ5e^h zX}ZqnoA4f0!GB1ODF7yQKNGz1%tIV^U40zusV=CkLB&;lD3`abBd)N`#yt&I0|)oA z5;!~e`=BRA!G`W1GC-no0!|1j6cb1)6guHF1$fnQs#S8mc;+}<-m}8)Q2r!Y9Du=g z(N*G&=v<0xvay*3NXTq^)%hAXc0-x|LIrISurB#|-6 zY#Vx!P#r@i*`L2o^(iPPbNC${=v=!MQ&^DatZbxjmR&}WDU;EISE}#fuX|bHtEi#I z`uFj7%Ppa8i9L8rr#)CDeba9Kls!0O%45*NdQG;ld@B`dF z+8r-zD0Tu0btO*!W7Gs}6G9B@Wn4ny<}RX|#!o=U5J=`{)n})DgsY7RAA!seDQ@Q9#fqVYQ_j#5jmG| zhnsqX%}T5pw;qM3n7;B$c=#&38T1vnxC8~;(f0*lwu35_gcy+-0tc!rD(+$@$D16% z3UQY~W+ae~!0A9`za;cKi_4-`G*t z;v0Kgwqia`3&~nRXVOmYEY#(rDMSf9Pr-wlx>5rkiU>FBFy)0}13-RuKiwYH12KJZ zegYkEmk46B(PD$0xvG7@k~9L?Bfxg%rxcwMHBB|`#QP>DfsZ8Rvqb0Tt?(Oy zxDRpEJ<*O1L06Q?7UZV$DKFAPu zIH5(|Yqs9_;bp7sP;^shTU;hmJ9^vAJ5RR@+CtIykRb<~b3+C1mPS7cEs9Q8ztZRi zmAW)@qusotyPILHJ$l^`3}tq~JHw;#(x}q%$U5x!GSkIuz&?Ugb$e(xAkCUl#C^`; z_MciaM)#K3PplaQDt3TX|0Xm6qO?*Y*oqt^B=EWcR7v@$WW2+#x;tEi?r?aq8GZ~) z)ueWZn{khw$Cfg|>#Q3P!&04L(bxc7v#h#9g+L|)5_d^t52vj1m|e1c7iRAor^gHF zOM^~4(IXTFdk`uVT^-7dhnl|@LWK%I7$~rclU@;+F&AG!Wwcu$E^HWDj;bv+2a9L_@5d zuC#;09N38D4Q+!nA6&MiYG5A1LG^su+W}Qm!-TH%qH5_vk8xoyfG+SxY39pdTHs>` zI2|)_jK}D#!9u46Mr29@KtG1id$x@Q{^dT#hDW*S577Nob{g;E&VrrIdm1cS}VG^bW z;HpGosw@rD!=M0fRt{O80bfwN!TK<5Ng;ES@CBQyynllzRXq)6AcZyZJtQI9BC|#v z-IK0R=5Z(NySwQM3qMivq*CkS(iO&#E9YzI4YlX00i5Rfb`VYO91XVzptZ>8)DEH@ ztztj3A~N2h2-SbNlOm!2&ei>Q45!kVUV9MR(U#8o6Z&eIbgG2Dye;lFpo`rKETQE! zfby#mXxLAx4&*RZm4m-OtD@$4kX65!-Y|H!BH}T^cM-Kk#PnDy9;QrDK(tOM6F3Ye zBxl#!I9HLLvLm6HInvCO7AgiaV3^KsK+!rEnn`gP|KI=6js(HMx!ZpSdELP`1{h(@ z3618>r0x*d$^q2_NsPac8OzZDAp1}81e+<#2>#}HGi8IzABHy!TR?cX*#+=pfIXcc zp5=mQm{KEo1Dd60$!ge00`c}Q2%;F&JsB_d=~(~01w>O|avz17v@Cv#ct9sh+J6*& zM}%$qJW+lmNLtv-AwQt;d@G*g4v+{4A$74*BCRx{0{2nNvw{3e;#na=qzDC9{6%rO zO%i@YW&3eyf#3aze;j~Mk$Z0{YX4+;*5#d3+YB3>ajBskY*uPqkDn*LE$tW(mSe2b zt}g8dP2okU5IxUu0F++%1V0B<>VvJw{p!O{tq3j!?1*<$AA;5l@xMk7mJ%Scun$!C zXdHpl5no3ylyLhYR{cLHcOie<1;wy*Aw>V>Y?`mtOd2wopGU0)y!T5&|HOk6XsGpA zt=NH{gDHp7;YAw`?+8|%4;>^w!_>fSaXdw#@_hK`U|w zrr_~@Y|T)bdaN0r5b&XNgS6^L;%_Mw5?ZzbV;5IJA>Y~83ZKpvxO-|#xu+H*R}SAI z94nb3`jT>2A*Z%Kk)JY~(#=or8R&7DYLO@-B1_!)>3g5DJE(Fz6@YKZoP>ME&G3)M$HgF)%BNwg$sq}Mm%m5b<} z&lyBt%4{y8)s@+^^0tuUFub=j4DZacrsgAEsI`gKQBt5*YD>WUbiC>W^SJ}Mfca6I z73Nva_rSb@%*Fi9(-SeTO8@aNf5fN2{KOiu;TI-&k1a6^HX|(aZN!N z*mmwGifviW_h4H>=o1*{3{7NPRr-&|wl~v}=9b%(zz_=7Ux8P~s$>6fRO|b9AJx)J zpA5mpTv)JxlkYEm9z3cGWc4 z^Sw&z&qRDUm%VX7NT_Z{F81MBGY%tVqe;3gty%q#NXvb@pV(jYUvebZ*`SbNY#8A> zes~J5n6i{EW2RX~aW(djlxa?ghc_5KVpnrS+VAxcb=11=Pq#iFcXYsTJ=>bWtr2=T zVFl49r`_mTZ-H7*paJ#6!#&J333}7$YXd*(%z!FI!@dKn0q)M0{2C{&o))% z@VEakul=3ss{{YjS^K4E(|$*{U&`^?Kjn3Q`>EVHFP)Uwe#vQ6)bMgZn!cT>Q!RxT zul<;}a^b>?rP99}+b=ZoxBpPD{hiZ)V`uH}3jH5h<8MFI7qtJx#P$nR9{mC7ccnk% z1lr%*if#4yf0y(RdhPF={vUSM{;tsfk+uHzEBX)SQksYzJ-JApr+fz{h~J5+KN^2s zLgR%(opk<>4)Ge_De((&Z((|!t1HBx`j)@(()nLKAx-0xH~`Mrd&U9r7)~?5K;Zzt zR;*TzHb^s2Z2g(nVjsD8KTsUKVfOGK z)&z0MyYBJg>uJXpg#t598JX(McSSB4 zBjVE=2&v3S>K|u3Nddw1UM;d*mA*2?VP0jzKCbc92zWiYK2s{&Tc$rH_-haCEAjIw zV~27VvQ_^O&?QLu%Tw|@+C_@JdS?Pc`l{IuOeGoBIKiO_^C=8Te&mYzkl<%HkE}_H zt33ig{629dAlKiD_zw@78NW1dxiApT-StgqFmwrI+fd{^Va8wYvPvD5J&xbFLm2m9vX^jzBP zJZ13TSl09g7%c}pWuOZ~fhSWohziz;0Q-~*w$H;xkBTDXd@9kaxgHjLV??3}^Wb+n z!-9aY83lb;Qk-0{$0fPh(n(J ziHDm`Ipo{5o#93RGq~wwy0EGxg+m@bCJ{G#t}J-C*(Ha(^mdmxt4JH6gx z`#pOBR7jn@f~#4MJfKEOHi0_)Exfq4qubdH2igtihyW}>Dsh&yB@#PvjU1M*0E71^ z&8qX51ipkhvPdQmbjXPXo=9`B{`hx0gQ~<2m7NIHNP+4SEJ&Rr4zFbb4d`92!5WeZ z)*OLEgY~35D6n$Ufc3778R?K!<_8NdmVRXYTZn!MnCqN;pGPTNpfp&2lq38Tu(iq$ z)>*``G5>ymvTyX6q964)~-> z0K&<-4wUB%riXcC3qOZjK*#=YujIkEG7chE$ykmv?MM>OO;~6WmbeLRm2hNYLf}x9 zhzLhklvu734o*xs)+9tkC!DAf_VFi_(y$UL*pqbdDwakN%0k@y$trT$CiX)<1o^;@ z2=7YvRUDifUyFVm?GZmk1+#a`QwJvKc7v_EW+bl`mGH-oJY7YB+`x-C)h4-vHs&=k zp?FrHhpmtY#dEVId142xe4B83i~sOuksP{j#sa^Z!>b+=g+OCott1lnd*jx~IxrHe zUX0^IanjhYOY9ijHo3=*PTt?hh^N;s4Nk-+mVlFS~Aw+xmL8ljub zyrf&wSb#Sb@(JKrcQrE+W7FtjU@iC=Ah+t*@U3ttn^nwaS<~p#Y%O5Zs*WPq5M|t5 zg?+zk6c0oA2flet#VfEoD%e7oZge90keOrPoxcOE>?aT)?3Va|6g=h|LI_-^-Uwn>5$cg{Pe5qjR-Y!f0!aYAYJX1A+mzDQ`jOwJ!$GGmJc1pUm5ic5*+>JZd~>lY@{y zM7QWDU$^_>8BiwqxS7U))bAY9RcvUsr&;WM5CV4~`sP z-0{V?n7G?+b~Mvws0hwGkE1jgv55s*wn1>28;GFRyS%{Kvz0p$5}=PpWD~rNP0O;o@w&Jg?srN7fbzk8a-?wv{3{Ql_VQi2KYneG8Kv6+1WC&ms!WCc&*#L|V z2^^61uC&EUNx^QmT<2pNiLpzDSfo4nSh8D?izHGKU0oKi=bd0>f2FEH(?AEgpL%j9uYzcujH*~*f zbTy7E!*Lo_=L_J{OppN~+QCeu1K;A2`AC;`{j9JzTY4=i$({`TbRIspK*#*}-$R8^ zh<-E0yK`>Cjn#Nfd|a}Q_bgzTX$wa);>V%Cm@pM3GFeenR|6#Z8HmDq8r z29KeHEEX6zL$gREqjMJNu3OOwi(GbaS{7;P0*m}ivigZNjk#i#!Bk?o94lTVyWxUm z2LYy7;BO@Xn*k3e$fKcLG$%@QAMazLLB9BB7{{Q$ zk3{GCRL(Zt-q(u#M`BC*5*rlnaz&pN`4gg)Qy7MoK;#gjhveBZh6sx*{SjH4^k)$d zwfZ5Sh2F0pr1!H1W-M~vnZgP%M*D{7S<){dKcz#mpOb|_mb62t>4<<5TFQyDL~B5<7<)lY_h(V5hjvs+Uu= zAz7;~B2^>C{!zp7lRHTzG1-_mmUsrkO=RfeUon!xmL6pVUL!b}*-mD$T<5$P z3z_Azm@v{z@CIpIfRll)g5EM@(|?N zABIwnHeA@9oUTw}I34F6yOqf~2MMDA{aG+mGwHN?Vb)m#zo^ft@ zPHBxo71Nm&_B0mNrdsl|dF?U3O!)N&(J?*@v&mWv2;T#xhW`y~{BRg|&b)v#!T9x% zPY&<9#j z1fmJ#3PdaR5=I+}#fFCJm&>ll6|}~su<{Cl1xu?8 zft{Je4wp(I%2vfi6s+RYXa6*OQh5nKc%;dI1(=V+nR()G%FF z2X$4iNpLd(PWV{0o~CJSYo_tHV~NsW3;7m!bC;A*N~ap^gM0gtwI>>E$yGm|2K)No zT@5xq&eLFD9%(e#vtHSy279MZT|LVe|AxkYt?~Yg<`{3*d^fhtfCvXq)eLyc*3KDl zH?!t*`uTC{GGJF`&3)2mO_()z!hoy#rmeLrv*!CGtA8T)!_1lkSN?b`^2|J!MV62C zSmdcI42uL`@>t}%&6=HuZ5fzER6<>JVz}IhM{I}~Lw8hSY*-$ypT)?DLm8_NhgAG0 zH?~14I_$X(fqD9I3m)S=;TnmXa>k7t&h?5`+Sc(jl5Sz}Cr>$mjaH*<2sQ~t5G>ZG z#vqjEh?egWJ+IYr9_AOU|3;iq-X16|9f|BLTL>Po(K7yc2uj-xk}zPV8-b zl`)J?MJV5lR3*OnT3>vFFTTPTU*(J2zId65hgs7yI`oHkVmIV-D%Rhse~Mxp!`LKZ z@+R(F^Due6eiTeTFC%b!rZsgev$VFdXq-Kz#=wjD4hFr}Wr(m6v3%p0lGSRh2jkQ+ zk_3298KW3YGZxF zXo%vu%HKH_*fH1rO1!8oc*rg_%vWawLDLil0}X>xtfD1pvQQ|3d@!6&6yiXAAwkq| z4y&xh$*UJW1JWA3a21hYv^&L@Vh~NT9af*sF^z<@qiO;`Ldsz0Wcte^99=2zOqM4N z)#a&%V(@gHndibsi+tz6p}#5cF}Y;5qgM`*qy2aQn2uxhrGhmHp&-(QT_>EQmeP2d z-nNboTuU*q8k0|R6kbLAH+Tys%U+bgWSRO=n5-O0oO6ds_nE1Js0yY^0LH>j{O+8- zg?D0i{tnVByc64oe?`QFcVZ(jSERs{-G!qcT9{DTEd3~zwei{xth8BE4`-Iv<@gKa z=ex3Wa5?1- zL&f#;wY-_{a(ynomqu5zV~{=NWHz8)qK0|qDs9u_`>dxr<$InWse0Nhm+w_i(=sdz z1GTg7Swe(9D(I$yoo9-C#-2by?rHx_K<>%lbS>$_YItCgfu;^sT%~jDFo=w(`ZCJMjF}QO>s}L)6*qDPwb5pvE!kV1R!## zxJxL{5fKulOubmk2OPpVR|_L0ba)CNB@)9`0=JpG&ey$ht|qGzJv7!<7pdT8B01LZ6sx{Y zpykIN*0kU80avV;k8%~CbdZbiCDghUejqI2_O`=V!N$x0ZUbzBV!MZT`HgV8;XrwP;N4y}J{QpuDBqB+DDuMHdPDLY)PKr&^s|0a}3RRhk)l;Mx5ZUu;1y ziJyXds-4?ZMThB%wqxvjN@Ok1RholXd_N?Ex_K~kq-0Rrx2HO^v% z;t}#NVnSnFdODeJWt_{jrcL5QM~gZ{)|z^)|J&uhZ^hOf=kO6K=L$5CKhX>shIjOu zbc_3>?oz#mC}v7?p{iVa7VBT2Y8rP&^7nU`)_gC%^-zC#z?~FDRa944Gb4c}swU7E zYZy-Uegy6ZB#SDYo&bA9nE^N`!5Mvu^u_&E&`*N+zWkD@UTrUy1Y0Gr>$cMlY|W5; z5p~;%wQA_Xf&UbeL#cuXK9H!Gn*#6YIMi7843p@?pugd{dBhhUgy)2B@E|?{WFCGg z@pGfi2VwhP^DGz*P5rfUFihYP4~W@5Ans2CM7JLVh);M3LEUzqpkdYjj!khpV%<*K zMXM&mCnYDtIr}ZPnSNJjQIL%=ZIzy9+S*CaLzfafp{q>h`C5IgyT-ESSm60dFsZ4z zo9fDH?#7-RAC4rfJ+rMAFp8BnawV+S@xcmebwb7vnpW$!b40Rc97>$mZ6|T98JpOi zy6rq9qk1&ydaO(0^%7Mien-dsB>vMwZ0>iU>H|DlO#@KhDCevN{_NHJCttmfrK$JW z?^^Gns$QC&ta@(Px9fHaO6oaoh>W`Hza}>A1H?pHL7J`NThXyF)-RTaH0O%DzA?fd z+BHTN^y+r9I>RS{H@+vIY#;>SlN$2LA=X_s&pU_(-Z-OkJ~;wOG@m#lPhw|}59cCB zro;_zL_UF4GX6CW8mQZ@jyJeW@U)%qTag#>*?g&gjmdcRY@@&fWxX7U;F}9hu3#=Y z*g61Jd~~hIzZBHntf_xytaTapI*ZdEhkCqjkY^e0!*OW9dJ@=;`UVwDY9~}+Sb?oW zH3~IqONUknkp4*mAij}v_4$}EK09mX0A#Q%*qFBn zrsw2ZjeE0>Sm26^&U;SVM@Uk)UG25Kjhs@qU2V2qz{2XbtKGKA0|S$o4nN=r1semy zrGzOK_`}tmgFP5Yyn#UgRs+LNReQLrHFY>+D-F~WR((%oH~Eo0#AKLYiq)ty5< z8A&{-1?LLtUovmq_8dYz<4^dD2YM7*^>^^WHzG@t$gl8L@yye&vKdrNu+SQ$N2D5+ z>Az@3FCzdvzePy1S^*z!(2d(j_3+n2tk`A|D_XRRdP}929A!;=0WopmhI)I4q?@G= zOK!%VYP*DlXK@h0+pb;cSvPEs~Gi#)H?j1;l6F59))Y zIRZq^*@#Al+k;kQ2xG0xj%v0{%IEBTqCf)|VX1q$HG`ZxXk{$~Y_`5Z3`fbZr&V!< zPM?y6kt@eJBOB%XkZSCc0@$AEu$5SacAhv+BqnZ3JJMW@R=cxMuJkSDmA=hrTt++} zgW8~#@k2Sb9U(d5MhqibQIOo9Tjnwv^N&alj2~i-MLqFnd(OoJ(|K^k7f9dM^c?f zezUP1eX3CnD3~R3KrzekRlR|bt25)z${7f{EI?k3&ZUJpN-g*}wbUa}YC(Cs+?1p6dM2 z{lnd3edzmWF?uj5!j>mu{oXX!y*~XxD%Q8H7pzC-Bw&4#eiW>~jwH^00|e`RRnT1m z^g?fcfx0i}rImXBL=iVIlu!`cFq~vf+RxoW1D+`dz_|1SAD~h$qnKc9s$6u_+9b*% z)WqtGDWx!>8Z3$dCR2({bDv0MsMj|TVWvixwN$MvkhNxdwN7o5F6Y&CX8O7|y_s59 zW!k!`XR)17ZB@bI`~tIZ^>yhB-nuxoU@L9GRfj1Iz*WW>&ccmWTjsS1moL%+id%D6 zS&d@a07FbE!pn^6^q6nYtooQ-Q}sbw!nAjray~w1>D+9MR~tTbtA_H9L-e<2O*q6g zqmHP4RtihRw==y!#5oo*s!vdvx=lD7nYxK>W(2O{h6tC8n7jI_aV{_!d*ISYq={e1 zgvG1I9}de6jPjK4XIN8n@D{Pltvh<~dq7){fS`P$8zu28P$6e{7OahrDb4j?gV=abyy3IE}1?i?{qHyRqc0x{X4RN4w%J@9+JFukUF78Cj<-8`RF~AgxpYv$8thy<{olte>-Xf z+*Mez6w&o{M$L(K-Pai}Jb3D)0o*l%d)JoWIuE!-e}e82 z$E>lyggehiH^ve@eVS!`evDwdsKxmU_8$YWBP2-0=a{8}Pi!fI_tyyQkNt|`C0A8A ziQPXe3q!H~J<&g~$qp=6IPN<9Exz?C`}r5ub&`GU;!kS^`4Ry_MEU~w(O>np7Q}gXP54v1qbHbZTv%L5mW(^z#_c_6%*ZH|j4k`u3r+Dw zjI=llj*v!QEdgJ-KaZbc*x3c0P48d3t_67D{xvFf;wC7eTBf4an4N<^#;Nm5918MG zro*UtKf*7poCEfI{&Ix-;A&FHw@bk>=oJu7)bdB;Mi^^B0dC`E@3kVic&^=!)qD#P zB*}!OG)g^3*Q$r7%NkN8`-$(gcc3<2fJ*(IFhG}Dh0q^Qm3#s}%F#cf_-baVxC{ygj}lEz#w5>a;- z5gx%I@)M&bj{8%lorWT@%d1(tJ7u$<05gzP%I|Ro60>quuvi(fSx`fQ^E3WSHz~a- zaw52K!!gEbtAG$rOh618E^-e5%T&%FBo;Vy!w>-km^kS?&mZd^l*T6KI5Yob{IQ-i zE_lD>fI%EahQa9w6zZP!+~v~3Ie?EpR{o@k3tRNYnOSOW!`!C$c_00z(3<)OhycYt zuba16%eaegffk5$tr$Cp$^L(e8>lV0)YBDPNI%ikMGyC8u7m;uF3OoDd-tq}rn|FX z59r=@e`j3w#mLbYJ;`>!+BW?y6u-cPUlK@#ue&=>3&+sqx*v>P0{`SKcuDm7q)eDGrGPUO~QjBxQk?6 zwrC)iV9u=gVt~@FAr2PdlWgq9q@M>$xnuSN_`uVY5*9A0JOE~)DZ2vrb(J8PL(P%0 z;j)IpA2NJb4B!suSYl8N@HOhf${osb8Q|mjd%ysn{I)X&$PxHF2FT?zXfVeRon67i zV}Z}7Y6e)bVmAz+3f2rDr3wSg`7ntAK0fL@F+l#iE&~ib*JFSOP?}_DO7H|iniz}OlJ-Y`aI`_WLNK}zTqDoDonT9MN(fuYK3!Go4NpwW( zZb+mG)+CZrg+x0yB#~&?k>80#_3yYOdhl$IL|+|YNc2A})Qig1mLQwa3yYg49Zf4* z_zarSa-;t0BYW5K(zYu3d#ZKe11>#nS#TV0r53l5}STN zEJ;GTt&z^9BK|~9sVIlxx2I^N&s(+|q^p88(xp^E`tK( zM`twzzNlBayKG3GC&{_M0QZ!IlBWjB$&vREutY_PDt3_CQa-xk#TmSSzFvGBaemFb zbe&6qAasWFnUu|eHg;m}Ut#6*?OUL3Vwj@PuO$^Zf5q*r9%|VQQ>cP9Q%I@86yx7ZVv2tq_MMnw$D1xw;gZ6U!jA${1mIX1E9)1-n+Njm(u}GcBj>Ku7z4`lc=9W9e;oxyqF#0p>WDWX6MV+Jc~(H#c3k zF+Cw^zVPf_or%Y>#5=mY>b?=R1Odv`8r&m3-Na*of8DO>aCg&g=%5PLbeJf$P>sLg z9p>}VVcsF%i4LEyap}qRyEj93#0gmHdDFi8j7Faa0!9N*JY;VOo7;oq#2i#yr zhPmr~v@GBWb5~*zF-(c+xD*TA`P(z35a)yE6+6iM7N!q(e)}3qcC%zVi{4V{fH9mp zZAU9nnVa@OrezcP2ZK@I-sa1N-LjoJ$tO-W0GU(gs_WgPz%LJYigmx@WwuF-foK%1 zOE&-HIQO{K;%m^YvI;(r#OOt0Th{cb07}bTl&&|pz1vKSF9&;=_+f|xX#GpZ_q)$% z{wQHwcG>Ki)k=_yYtf6GCm0S+gdT z5D?8b=o+q?I`Mt31pqPB7RW(I5w?6gdIKoYSEE)l+7P5=vZIi!99SuFvGTsb%2TH8 z3{%=a&uxD!@b4EjzX4o;MJN^E6kBJ?xJvHAhoH0HQDhoGj;DO2%0>tzv42DfeL15!Jfd=3zxHUf%5?MLU@iNK-ffwDF;Z&d6-f`Jw zphHm8!SI|%&xTua?7DB)W0bGj&yGRErU{~8i#;@d-;9h~dpf^h&8uJ$eKH3hT4A?A z$RFb?eDPJj_*!3lgNZ}ynTNO?CFJl`kT`*d7?m`}QtX`n<+nmikxuB1Jl7P~sdDDP zM2z}!8RAuEb_pJ&COj;Gu*`I(KxcuWhYfc1|}xbVhY=YoB{BG&4g ztojMW1`eVugC)GRnYh_%|An1r^sb>%L{})*bbHEj!h#7;9}(K+V=bZKDcCC`zNR$c`u&0$3#G zRRU;cI~y>EuW+3i44IR!0Ecc~tR)uAk257X+(PsTVbVv@S)8KD>ar@;5?vlzBH~wo zmzvNLbUXN~OF62%pT`DZ_X1^@fm6gr4fy}HRqb$gF<3xL{m3H7p-hK(V{vk;JVRib zV3wk-s&)E1-dE`N0wtO%_y$6&dgF#=P;@^G@yy?()2%>Al&q3x9Dc@UfLSi@aS9B= zna(%Zp#s^*Tl|!k2XdTnx#C1D_(=p9 zD^a~ncrR@iYx|sCjP6VglwJ_2g`^%7CG^5FDF&hr0$5fnxx9o$7A!^KU1DWidP*I? z`WyJnS{KF#2SYwYQ7%PMa(g!YS=v*#sTLnOMW;cK{cIjW{unp&Ui3vsfl0h)0^Lcl z%ZY$A8StVP(eLQ%6FHpB&6_DnVB3~ZA7_Y0qvhl^EHz<4Qmw*Op!r|{)=9%T>jRN$ z5vZltyTnxs#Pq7u<;yS%F1VjrI5LPeT^>fD^FDtdVUapzWGdx?jYu`xqiO!1v7L#< z%CwfTSfF46PR~^%X_?V-%1M9{d0QcQeV4Sh(+F4oZf-}{;g4;DkI7P`2=ogu8#;35|2+v-ko4n5wRds_@^$ z6eziE^Nq%LD>Obab+9PNse~eN{O=sTN6!@;7B3lxbC}RACGnef0k$e_w+rCGq>d?U zu`^$^qqxZaWu5^_yv-OzWxErWF`zq-_hKjW@n39M-WI+1_p2wsgdbt3Q!Jy8=Avv= z`xs(@`|2(-G^sE&sq}h`+dE=`W5#Hj?DcmaO-fvvSdk~Bx%!+Yp-ZJg-G&zxU67a^ zxuN?}`xv^MOS<5_ngz=MA^1U;m6E}EATGLq)9_mq0%@N-G1|DlD88}4&zHFryt>e% z;Bz^Kf{U=7i9DOzcBi2r{k^GwG^fmeG8M>Rdr>#dsb=W)_h3RwrUOq>4??VvF&pJP zF*uMelK9q&{72(RvSd38^pX&mRgMS26bKz$_$6AI>%;9F<_r6#Ly`GL;TtDq z$e6-GnbV;$Zc@NkO3=EOHmT{*SXbejs1&}i3j%~pzFTD#yj3_I8n#9$eE5P9i%`@p zB{#Wh-&&*oHyEUj@J)*7a)Q*U^6{lVXnF7H+X{9|)%)&isF&)tDc+G{+&^p=c#IOL zxOvJx_*1%l^*dDlnzU z|Hq|$!Y3UsVwQ5uS)6|C=sW&kT(^{CXF`!038_JbZWt-Nl-uG=>n@!cB_@|QTa_0J zj5-bFpp}>y@9a7LAor4Bagsn;YW9e-PI1d3fQn<$^{XwSi4is=C^!l#97#j;pXB=c ztNO#6Y$ClvPS~^}_p#(yz?uq}uqqg-mzwBV;yZ9Gjue|ul@wLSz%WuKh7p{J-cVj* z7r!{=SVU|@CLdupRF(l7z>bK*=Q38leK2I;6nR#DHa5m>i~(*-!x$8AR2tqGi$p-pMUY2uIpP?b4n;VFkadKY zVpeu`M%$t!ROO$dKrA6Mpd?}xF~}M55Q6U1HU~}m;C;Q#mA*EbpT@S$5|rL|5{n>8 z-JXpa@k_?%ra2m)QkiW>`{$vmGSrmKIw8~n0vIqi)7eLMYr1nve1)*lu!)?6)!a0GGG6R0aRtjXoQ`$(7Zk*Uj*ws%%uqbV;) zbfRj(Z=u0&k>J-kN&8OZ+I7u|7d*r08rrsj+|=A=E_kNyQShGsf@deREgp*cFL>sh zrvz>6eEzNU`Axsq?JXyK6&k)u1K(Ib{V^|Rq9ET*WK1w=GbT6y(_<4Gtw}&zgcG z5OB&6W{u!(JKTX)yEhRFb-c(MZQG%lWbQU4cwE5#w#&F!b#;SE`( z(RDoaI=m4siU=U=Z^JA9U4Uyt+lYZuj6=;kQ| z_-J>?30_+>eMH{rxDy6m*F)(rY=ys}eGv|0nE7GZ;p?Ck-pDtx{(Y8bjTcWcc8-`s>qwYw|B_0Dksa4tNFck zNswh>8Z=!(OtxrclQ`!hFaW5Dn^-!b+0YUbbk@M_h9u6X(hk$RX~!MhJg@AOU$Bfl zD;_pS=Q1FTB?sY3aC!#TuM*JoTNWy48mKD8=m7lPdOPc^8jC}#f=p5Him5rRyNYTm z6>iumnI3IQY^wA3Te#pYY9#F8OoN9Y@#M#SG^?%A+18H5m_E)N31B7c2|?_9Xr3OV z&G2=VWRe7&tJ?O^k~6IgE4-XVLnSZEV#KtS7dvn+K-RcJHU$X9WZ!gGnusA+(=8U5 zKApST_Olz#LlaGVw~)%Utg`s?Nm-CC9D)^Eh5#*8#qkFjXrepvInI`=Ac{ek5-Q4e z{3+Nz(bk*U)~~h^0l+<6;6NSC3*-ALLfsUfjI>UjByw(7X-z|g_tn{}iuX-!>kc_W zPntbUtntf&EWL9^H5LY}j}dIKkOtw_o8cVE{EAtt5}5TrF0-y-4C7mCb80P}*$zVs zJ?XZ^9WAwV`;t6ma~Q`Mmg|Hy2tmPK$d$pNZBPm@dVY$11+e~4>j_km8XYS%9@`-s zWT#rJf7bG>o4mJoa6h@~X_<_*rooT8t47;KeE8WD$XBv(_QzDnMTd5}hr%$7P8&|8 zJQ4Eo*MS27b)^gSt>;NUJtHli6QK3kXgQwdI%gO-;v2C5iH`T2GZ|;}qT?MU0ho~& zCOS8$m;0KRNAl$e^Yjn0;yEhGXa7@dt1h^@7)xuu@j&VO-`vCTu9W5%>fo5o)_Mq2>7k@HobZFtrYG=hu*!|#gLKen3YyiP_h_&zqtsX}Ma`hOs8}}d{ zx7qPZY4Q5;7h#j@V7UxwSz*caV?v7($^v`5WjBA873x@ms%q}zR$fcz+?P3*XB|sc z!<3>X4;x4hmPR@I>9#ckYZ+}Z{E=Vsc-mjLk6m3gjf9SFqouaGKdP~dza8HX)f~S( z3pKzH-{LI9!L;b@NHJlvPGK{JA8-uz0Q?QRc{7l(xi^l*6uk%+KBcr#C0%Vd$Ftg= za;}iV4Y*)DZIRRq)M6r{bJ-OQG!#M;eRkHHM>>6u-3Mo^i6)AIzCKuKqL|HW4K4H% zppQBN)J`PWff)|^W*f994#{@(OFYxRccu9EBJu_zFQBdijzV4Vc|*KhIgFdta&`=u ztO(DGcWQV7Lw8nwd%_W!et7!(;qel9@F0N;&+{4O=eG9)25jqT0N6QLwWu-~EEk?r z4LlcbuHJlP$JMhvcrxQaQGp*MFO2~y^Gke38Xr`178ag^F=}^Ey%SA^$|Wc81?7R# z1S3lqXd~7jumA-5mwr+MOg(`YQfuD2VKXTSuT?w`i!RG-i>|HP!B^Pf*3mprkr^rr z#7UtZ+A#rd!4Na)V~o7rnV^jZFYlM!UpC#P_1_Y%3ss;Yl_D0w24!}^D*J{e7Ehw;!68w;Q0d#T-BdH3BNSvf!a2pu#AcpsMq*9Q34Zb*lXYr-JRt zXG~hQ>oR)D!Ub0E+(8QXqY7fy6nRY|v|3awiY!P~VQwU0LR5iOWHea61h26$&<%o+ zYX_sW{Sn}RZ9MRcob?A$0>B^xKCnrQGOArqqAVy^qBCLzNYusf(y?4lO&MQiH)?ze zLxQw2pD9t8k_iscbPiAb0jPkge;(bH%HXb)?Hos-(Hsm&iOq+`QO;IWuoabT1#OLm zfFPNk{Z;+YKl2G5715wX(3tGdB4Z5@X-*NH6I!(S+V&NTdyFoY87YK3O>GwMf4!lD zb`r?bXK+5gUGR2j(aOvB&e&cz_al>(dJd9qMUK5-kYa4~SJ&B@-y+l8yO38hRi1hG z@4`1dt1>ASqc`mX%^UZ!Gq>7N7_wTB;UAnQFvH1@+;U*W)`Na!YFTAxuCQ0bXyic1 zARFsi%i%T?Rt@I7iC{ug!Q1E0xck#D*cI$d9IYvIN7uv5BPXMpPLs`Ya_TB$fMRQt z3{ZIG8K5xp(_>6J1C$cx$^a$H$P|Hn-gGQLjTIIcH`c8WD702o!WQw|7$lA2O+hmZaFgyKf&y^|9ah^X=G} zhcoO^w9UU`7rzag6Sj1!WMIS~5AQ2jqs>qG+`oE>WNq&!8h+Rwg+-cA+Fo`ZX%ltq zehCDy`WuN_G8NQc;ja7uBCg5m6nrMTxxZxotcmLWk;77Qna*WVM1*ObOX2isH}uUT z&)WaW*mn1=*r18-`~t|=(EYY05#I-dWlkMqvMK^$%5;l97Z~Hee9~(IL5U!#*Ry{WzTo25ig#Ho>R4-90_s*ER zzw9Wr{)zW+xKQvls=-ROfYY8HIgR2hHZXKQHPCjRHT*}r;VR6-}H$9yT3t>TwpBZxU3` zS4Ve(a%m}4x0JMR!6kDWp@v0!%Du*RbVweiI1mJI401l#i%bv&SY+{L`k1dcoJEL) zhyB`Bkv;phxDaLtSpvQ9bh|gYfLg{DSCkR}0D3?Hlt?TvC!}3bZk^GIo5iEdfo@bG z{fn_m#&VpC|E&Bvr27}4W6%DyN{N^%oP0_bp{}qqkVs_FGDKE}eNm7Eeq8pL>xA-7 zzf+Kc;u8C;QHug#@C^#&+_ss*|k04_Odx(@vBo?^L)@Urmk?WLq zpr%_bg>;%H>DAVLYQYYlqqsLu zLZiAugw)FyoKJdunWDnnyjrFaLg<@_)6wGPb2Kgf(CDLuZAV>Ngryiy!v;A#4IB5r z%AS3#2t&p0-qL0$BED}ZN;Q*A%O-+pi3MsYIdfcWAJNCdb{$Gk594#J;P$Cm05(~UHOt*Ocox7p;9Og7Fmhz;g{$Q-d?nmSj(GsyV`-B&1N5|}^=DG7q~i!9 zj&E{XfLx*&UWS8-ZpyHmKgzaywW)92t!e9_|HAgwU4P4Qzjd>wJ*U3mI3&rJ>wd#A z_4li9IHq2{1>J9ZS<|Z3Hym^)-}2pWIA{A8{MNBde=6iB;p!9co@bgge^eyN52me8 z?qScirpmp|TnXUeF4=Z;rybr*e=K!F2VNv#0no`cRO%3Y)lxvUn8RLpnLq_37#skm zhxkRo)cjG7fr!V01ES`Sa(lH!FGnS?5%P#wS)2ke;muGw;5nLjOf3Akg@K^9>_pMW zNYU7kN^)og4scVJEkrtN8ds(8HQ&(1`u94u2ubIQ@Q$U`$3TNRsLTVCh=y>rAHv9?t!)cU|Cd{ zCqMdSM_Zk74SXNQbL?FMr=hggv$7==)ntLVmOztFEp>lYDn>lm2T+{6D@PWQe-#n|Bq*IsL9SB5O@QPSh+y(vu2ZDF z5dfIDriw2xhL41a8VkfPx&ASx{;_0I4jcS2&QXXz#^*>(#VK3)T zdYc#|hf!=a(htWTnsXGoQtT1N(VEl(%yfrKB(W3k&c)af!`c^*U*PqC!BUnfOU9U6 z6Yn5HUo19qk}3>)^Tle-HHWKwY#i%Beq*`Q3$Sze1y=o;eKtL|-gd1Iqe`nM2RIsdgW+(TrB7xoY=r zi3HwL1E97U>K0u1J9jv{elKr0Tk@e9&YDJ=;p|?cb6>JMd&+=`ntv;Z!0E&VevG?d zqCMyoii;;|F81^@oY(XV5Gh8wfViL(+{D(CzCil#OQ0Uc27sjIrSnh?i4Gr3kMIg% zTFb)&x{60_a003p0eKv$lr8X~qoS|F0|87^hX3FR^gjLxI&aSg8p2B}T$kz<(kAsM zx&I8fRk!~~?mvUy{Qmu?cT)e^VDGN~981ywqd!3Z*{`On{U?5k?mtbnd)j|~FFWjg z{pX|if4Kg$&n&n99NAHvp*T4fn2IV?@2$Oj&->4&s_)%@F1w)9{T!C&V>GP z`_BX1n%`Of;V24;2YU$Dduxt0CmzD5y?gMl&|7@w)-RwOi=9=(G=?_V&oTY?)?Z;c zfjt`Q1v~TtZJV9B9`<-ym@9ajHB5Q}?xynG@k-l66uUL(>Rka zFSH-9x53gNW^Gvcv94e}{l0c2FaEmbXH3q7L7i}kor&Af)<`PU3UwgJ!3f}@(CCu3 z4HCArJq;0(EI&4l)AYw!;*GPNjYWDgN2_0(*m|G8Ue6%Ma5|@~7-bNg_0M{?UI;qs zg1;ySSs-SUHwL|cBbl)JjwL@6#@RW>_2!KpfKx#G11y*wX zBqdiZ;X^Jp5Fs_Pn~HK-(SP8^L5GY=Iz?9qm(VjhScSB}M+nJLqS#0VBr{=60ICNu=Upw7R#*zaww_w$q z?!oXcFGc^KNK29sP&)yS-i-S)+xS+P0a3K{`HYi~{0Iftip_p4nUWf;;u2_SN+BGc zO+KhG6Di06=VO9jjPyOQIh^8%ahqRYk30g zk&CuyoNqB19kPNM5mqu}{~jw5Om3&ZAdV$oNG|A1cn=xQ-M`x70B@iLK>K#&A`6*m zpsN6{GGh|#u!of~hLjL~>llUq<@%HnC$$~|!C!KFUb^W=Z;xCl1D*h~;3f`)L6UNR zk~9(R$XsU^@0fI&9UYtpxY5Zuc=_6Q+k0JTUsCQJ+;1S*IkhXf6>j*Kpkg%FAqFcf{ zI;t*yVA~F~YScPxhsX>?g?Rbq<6wSV!;g@MfV=PvI3eTcWQ?#?vX>ydHIwi2SxbTR zmBN-m>)Kx4wl><*_7vXw{ifj2=5+2iwUaUr{8(KLi;;i0M>bgdSBJDeR;U1j|B6uf z>yE0k><2>IzLxbI4|enMF#U0j(F{g?Dl$SfBz`=mIDqs+JxD*#OJkekLHmZ4f+&pj zd}`hh6bBdkP`4PYZIe6J@H{&R+2S?hA<3HUQR_wUV&S_*y`X5L*TCtp3uRX2*sC}A zo~ySE`s(aK>$rC%A9kHvd(*gs*camt54E;HoVCX_73^6Uzm|jFYFHMzuO$;>$mw=3Iyu;@owoZ@`q!8nb^n4v!ClGS2SduJ zETz^4AqH|d0sch@FW^FSDB^#@v{WQ(Eb!CYE=QCK#-IqaB=G{S~;p7WU@YwusN_%FT@+$!5=`RfvFr5ii z)XZzxdAG}+p~#7_Tf)iy0S-Bv8kV6m}RSJv&K2}*ap+BFqox5d8Nb8ri zC|@Qa&gCmPVj3IhpN(ZBgetLG8)VQk{w+F<`7)1jT#v_~XZ&d2m;XXZ#H*zU2tR+x z<5mA(Y5vaV*jmCQjMx$Z9t+t*X9CtBsc2%5CQ~;28fGyFybx&A@JDx7X^G)?*=t+I zBCrz_cU>g7-&NQNo_CdKHD(?S=gRhBr|J^B;p&po;&oGoBVr>md6+0Wr`Qdk7&pr_ zRDxhKf8fbt@H?~?RAT*Iw1;1Vcyw=T_%%o~23>-MM>E=%;7uW6wjx)M{TeRFN0o)8 z4Hp!Zf*2r^%Qk2aVgsZ;Zbj>4F?HD2+l|8u_TxFxnt) zv_hO)&G`LYz(j;q2m+nu%Y`Si+MacuQ_-GncR2GTieW3h6HMnksvm2}G(+;7)dbjR ztl8q-A9-BfT?K&80l+r{?{DBLIV%iN%*MGukM9D|$!yhdvru^Qk#@uRAl5mc?m40; zPv~bi6nO05wBuY_%peolux%scbJTfPzD0Y)Dbk%+x^<-cl(X z1|yxEzlHmbZqslfz&!)tUMS#N(|(2mhFJ@Ko?QxyLIaKo zYd9mfv>_D4yB7GjTH&uy((utu!O~2uaE;^{XjWtcOLvPpLl@P8x7GqID{(@wmOZKF zY-&MPIaYil`M$2q_#`%Sg#xEr$hRG8MbgD$0!4j~=X4EZ( z$i*Io^9mt_iUzGLEnYe4IFTI3l{Nqc6dIo(=!O5ip$y6~2|4s-Y|4Qegyc1=A+2)g z6VvuGcwru)^2tm1Pp#Gd1|MGoqSJqhQ>5jQJPtYx*D|DCWECU$ak9j6ge?ZirbdDb zbFaMBUk72V9}U)_3pEB!T;K7T72{?$PBF{fGGr&v2O^koUO>Zn=s+A_wC^s(%Pein z*hyyqncNk>YK5O*7Tvcnx}r;yUG9{EU`IJCn={iULPm@!monVhLH_ZXicQXDUsmdepkrRHcTI&stDwU)xQh<_j$Frnuk=>lL! z>Y)!#rS2v(CsXv@+7q^Z(m7D?E4@QsnW-c}4of^#c_Bu(e zeF6Qh#TzlIz$Got2!T|tDq2y4y-+NKmKn*~dg89Ku3YSEq}RS!B(ISCa_Sj5IDPZ= z%h68WMUbmPuTY7tz=FKyPrS;+kVxyL2Y{@YEl}i;|Fq1Bn?- zH%OelJvMOfdsDAU>V1oMNud>q_d`ygu#gPQoQN0s;w2`Y+!~5D=l`&!lQ8)^G+M(< zVEmlwa|j%Z#uETkMO)KuLZx!UPX?xA_+m{PVcr~HCDSo$+NtKv3024ABCWy4!NSte z{X_-;aV#jqAIm2vuxxSx#sV@3>@$mHJOBPsRit<^itaGI-pLjvSnQl!5>1$F4{5Ptbi@CbUn*B8( zKHV+kKVPMlQxzIqnS!E_u~LZA*Yr$Lx@-M0(s8CS=u*cCghwe`96=K55^Mek+%Jaf z>o~lEk2tbIc4D-`byWhia=>OsZxpv|4nGxYMu2HYY#-7RGGHwK*eth6vcdRN41A%i z#Gb$OXlcMQ23=_Y3KTfd6>T20y9K3}7B92HzsyF(TCX1Ez@`TV@Krt=l~d%P+plHV z%ZQ${6ad4%HvsQ(`Ah+T8?x({;BnCAlIhgBeQ@kAOoM}=LC|D)VADb-YXNQgR_p?n zhf_)&Nr`vwSW^efJB&lZ9yp{FTMuza={s^rX%Fox0KzC?#7Q6Ii=?e$%T3=y?{I!9 zfVf?xQ@s8QM`0MeMxkV)bTtaT5KDILu#ZvZY6Mz4%~;o(dMUEyI)@t28ucu99bu2>MU zI)vd11A<~{Oce*=E6yXxq%&~w)*23!_Z=lw{g%O=RrMZb2B0IWD&_5(%kdnF4M5>H zVahZbbDg!5PN&IIgZ79oJ^C4?8j@JyTD%_~>y~l0wIJh+T5hSh7H@>pacggTLK$Zy zmQg{B7PnjB!&1uVX3FTD%0WY@ozm1*|21fbX=)t;hEo|PS`R1Ub*;PxsmU3fmtkEH zM%YOgfDJ#oO0yyQf?})@>==fts9{0c&XJ6qI$rJsq% zR}De`TCFQBhTO#%{63b|*qnu^(2ha?aN=r3?x9o;cjKU_<)@MQWHt_V@}*rrv&Qg>rw$t_1Ao(n*KOeklz=#$P^F)_`T2k!Ebo~?UWX~X_` zu%ls6sU$KhVMCjAJ!dx~Ov>92v+hBZ?Lav>Pof{S0Q zx&W5Y5Ou*fLY#{6w0VCHNvw=Otfl5bb|~t&{4ri@;zrlyxi*m_Q4IHTV-EpK&5=@9 z<_yPHFfMG|oUpKTvrTC?#hc-yeVLIQ>W{*;m?l88GGC{p zO;@v;T03xPj;|VxZIU41`50Wt)h9fvJL%t1|8*f%!6vU%vgT7!$UsV2cXkD)>+Z z>s0W%3IeK(hJGUs69IZL1JIbQ<&Wq|JHOHJ42I_GOjl*qso-`Mj90-J75q{H2)gD?zL~~T=!?! z(&X3~oE$7^Nyd~jIt1lF2jpU1jyeuWPJaRm1}Rw~Si~e^Ea2wwBt1n7FRg^3A1+f6 zzPcm`^_lx%=~7P-v=6r|28uz?IUZ_7DTOu-jaVhrh(wD@shy*BOqcCk{!pqW4haN^ z#6G8ITUdHz2P4|$25rCt(Sts^KN=>B>Y^9Xq=`~IPl1GLe34N_|#{WgE zGzs<@x#&jOX9kC~eP&^nBJ>7?{E-28e4dGK@x?oP@8*RxZ(@0r^oXyJIOW5a4-nXL+g{pefLYygmEJnWfK z0U@Ii6jy|=zB#!$p`)YsidB31yD|9v9bneL7%zS`cm8}OuDVT$*Q$I${ zRi9)s3S>#%Z}~IIJv?6Z3(8vcRqy)*pag=zxb#5-*YX`g!6(vekmp%~>zPh~hyK?s zB~#F6X8kW+m+`HuVEmNPJ{GtD)yg343?HDHlpDvk23HWDKwAmwm?O}ljj?`zxR_Ve zWIJ=8`qErcGn|LT!~(Zps#Ph@)(>P3L~hnKPdFl%9ofzC=sZ9 z70MT*e0{?4i{$ohuWFp=IZF?_t$9AU)pqwx-@LIh)k>L8xooyVqORNV{RN5l4Yx7hxoC zg@Eg@^0gAhB%L8nyT!5*is0Nt3+-@6Uu)_|*i(m#ZNww!lfJ6hzHYI2f%T$Q;ywU- z*4(^yDRfp|w!jSr6}TbPV@IPP77j14F9C6mHFY0T^tage2xP*uAfDqEE!dr-i^-P| zM@2{o#Obg|zb|A+`5&`!{5P(z1$oAT>XD0$0xh)TO!69D8v{uR5$8#9Kegv-YLB75 zI!jRxLKE=7XerH;Y3P;I@gP{7vIo`7Y%O7cN}|ZEc?JWaBD;v@8j^jnx{+Fo<`rN8 zEAneH0`AZFV)(Abj3?}Jo%{PMwhfY<@;wnVOI-yCXqA-FwjFfPT-3rJJ8RIyV}VDq zwd9y^{_Z8mL_#VZ6kViNKjb*)Ri>33jekumIS7b!D~5X{IW|IL@kx$9T;ocPMK5`h z;{a5vB*%WZu#Nahl^lxEIWoE~(#6gs&}UZObj@A&Ywnuqa@T}?Oy|qo%ZmJg;Ku^* zUwU2&)#m4|lFU`q8^|xQ6N^qtz5ljJ5^=-^Hdp8e+<*JiEqM#xq7&U0fCdj&3M5T%rEwx^#riw}tE80L5P!Pcj;2YvEmr@=N6E5xo9RZFqr{ zcwJkYTyb(UuL2(DYnTxRcXR8$R^#hA_I2vQi>AT~T~`&ZVsLN;Waw&@ zt_%M6)&i^X6jhgkt3cIN;M9c|YUoMjKTYby6br8c*IStEAY54Kzx5ESaUthE3|xn( zx(;#b!V9>TA_Pr^L0k!!()g`f<3l&=_j$M~Om4(XsKR7j7~7#mmJAG){$Mq}gVz9J zpw+mNcQ8_sFR^1MQ8CbIa$tFMaXHebqn~2|NEjYZ1KBsyHZYvIGMu?IRJzz|yak`j z=7w#upZ{WXC8Gud5S7%7>}I9v39P7o1TjklsdEbhay=Zbd#lW}gqd~{jy@pMEaB+I zFh`4U*dB*VU0Dwf1@c(GXaNjdfb|8U-NOhjG{4=4s6t{a;tudwVbKMLW3=kA4?CMj zzIEM%8T439G1NwFr1+fK9@CYYtGnxr?x?vz>q96uhA=AM7j<=_<`(1R-DKa_sJSUA zYHpfVa{*lWN23um_t^g;Q>(eTCwH#q7V7MfLR?Tr16T1)eN;bS(iQ<1iPq3dUajjsa_ zR}JTCa}|P9hI2~BFgOrCfnMPin3=`OI1th-&9NeCYSDb1=J8@&RYxET?C@>M2O>Ch zeMJ!93l&fkK>Jf5I97ID-&sVQc712y-fC{{#n$H*u4P$T5D^{>6LD3NUXS?%NIG2K zY>f2JMtQu)1{&vco*}v(J5)iq0q`m~k^#q&#ET`^vX&yFI*tIQG|`&oPR`cvXYnd7 z@p8;3ph*ao$OBW=7@9`Ads~gOIoZH=mq52*OAofYx6>|Oxaw@Ipn8FBaY137JiCr; z1D`P>sRROr7E&Ox8Txnw@#6l3Z1r&IGOPIPaMY392WTjcJNyH1rDmvLRmq9k=KF0HZ z|49$V3>OELLMTWZGZaZ9u47rkXK2~^Xp4WmZ<9M|b@Y$N0w&B$op3_u8rL|Ms&1`u zrDD;zdye9#X&SfkFGk}gIhF)Ou)r($Ql7y<1gd8m_|Mp%#p763o$YAg+BR1MubO2v z@T>b64V>m!0(!-#DiS4X4}F6W=rkhf=yC6oq&gxsN8k@bgg{>q*(9ps=u^$PYcwfr zc}|U;d^pPkJ-!zHM^KAwoiX7E&c1=Yyl*p+=jQB56p;Og!0L&<2w>Y6-6f&vQR?!b zT)E-lvpT$PKeb2ZD|Z#+Irvm(zY`3CX#^coBt@ZZBUn& zeRZO`w8#ZkPqHmxLcYa)=7bTcAMmvbZdYF|P?uiaZuu+h&TUUtU)`iGOXVUhBV*QSIgN%r$Jmi< zY%kTyuIkcPU2@cAxLmq}v3p436}JnjmZ(cmf4o(A4_?)q7=iil9$))Wn(zH7eK=-2 z?BAI(95MuXm|>2U{WZkf z*cja|QlIUwE?20p8ioI~bp+nW>Sams4F4OD_ zX1EC)86GrRRHb-a3zL(IV(8A8Ue5Y!nUG(Uq{LvgrO zDI4)&{r0OS;0P(n*3J(iqrKW$@9-u{U8YK9j7}>Bxyh)( z>imt_wSz-ZGcbz(`pqlSC!=pWk%J?R1qT7Oe|EmJFC;3^Ipj=)IceolrbL1*TWivtISdy6}z=lYLnynx4ZxxqFf*e>Z(7_1d z6TO8Anj>`6P-*Si!ZeQ8S#u17_=wzr2zJ%!6vt7VtcA}`5IRG}q!)-ehi9H;qm?9L z83wUj{^#_%rH>-u8zrZM@ruzI!`hzIgNL)IEFIuEjA!e(HptcNXQ!v{FtDw{dw_=+ zv)sh<=YFBpWbANuLI;W}LQzByRUXf+`~o_%fmd*u3}vS1hoF6tOcCjkas{aT$Q?>M z+FZ;QhQv`7qB#GEPFt=z`BozYoZ4}+qx3SKa+TgF)TWf)xjQQW^Ezf5=lBxf2rJIN zz_=w<-z+cE`Ub1W@;{wclfnFrJlwx4_gS^Q!1R?^kAlVTR^P?F+VMKmzI4=g+w2d2 zhbiDNHf{n`XYZGae*1QP$}u>QN-CcJ#8&b%6cg17{}UAg6p}ZZh6Cz&{_usVHqbsL zwVr5K^&F$>8Mbd4JlK*D^kFDY!*fPg^?bu=pLl-0rT4i4D+EXx`{|-;Hq6R@Q@;f+N<2Sd zQUtiec`9$PQU10~8mRv>zWK`!ROeonx2IxLfuuf8+~VRK3RUC0OyPXxsnW-hho^?8 z?bU-*aMjCGPa5r(q8@vEJ3-7vUWv$tY|wxwbVynwrpD%wxQMR1LTcx3BMel`_yG)I zq!-0k&DV%6Lj8+-l~1k7$P#8G9n4=UKmT~3=4U7>S$PM3qkPu)%?NoWYo2>Z7rY&`hrU8n>MSy@*AtoasYK~pKTXsVLz z#A&!lFH`$hU)Tx$4;K7mM#zi*sh4$%O&T8jrPklSllrZuC`uEjB}y>im;^Fvu41b} zwrYQUrE1GVW?7t^RKD0PzX;{&RdKa`E%8-Gd=(HKWkie*;pZ3*h#JjHbg>)GUuu8C zzv={EieEA9=f&3rmu{C|sii#pS}b2k1g%^AO2&cZ0@6aUy|{%3m}LiaxgeuGHZlNT z!hQDglPrzCkHa zC%H00Eo9WY^#iRWC6WlGm zKlT4K{edz|?))H~Wu5nmXD!x?cKutUTmbSkw!%lGS1e}3)PpFH3G+`losKP%>UzdtyR zUiD{UPx|xYzCG&C`P)beuMYva37zXppB>Y=Z|l>^{W&5O`)%wjO&`b(Xk_TK0;E|~ z+gVqbAuoTa^eOIHf8y!srt$o`k$(Nj+CRNN15^3~&%Cc}xB-5{fVg&d40XJHfXun< z^*TF{3jdh=9?|2KEd(ls9`m&xOV(}&j7x|As(D5mDD8&5)V$j5@#~!F6lDxVr@gB% zul`SkzqP-HzYG1Q)HL*U1?!;B@#weBKl=3Oliw-WlY2Dh+4LUG{D0!K=bGLrdL5BWufwpYnH@v# z+`%g|o?(~JJ0RTHrB3DN^Syi2pW&N*s5ST;KWhD_D!o5nJeAy^6#jd)=loaPGx+11 zeBiG;+YkQx4@rlAVAt?p*mL;D?A0Uuzw(0*{PRcn!GFTmbo+AElU?Hf%etP+e_oH^ z-^maDjc576zexKyUhnL&C%T0Hrk=z9`JO$3fA~fp{15hp{{Zh&1?{hVF((=R6z}pv zfnP$A{@!J}{V47k{PFL7;IBK=5C2);rSs3g6!=s0(dj>5AC20hNA!5^JD>i{KEtm+ zuUYD?m!B?pJeeLT`shOGk7sbSeS0`__a4E&6!8ak4^HF+;OgbYNPU*Jm8B2N zxxGsD-#-uP{$L#DiBDk9LO0$rmZ$*z>UiZeL<4W|$L3_4*N$3-UP`|5A>lq@KN1f6 zIGu#6{$@H0w-up^5osipuEE*m6rJgAwd!u6CTj^iVXz{`{`Bt0f~<8ROqMhdS_Uf- zznG1C=Pwl>?^zljWl8u5Iru>1AvZd6?0TOr7oF()6W0W zr+=YS{Q7sM=4x;Mwmz)-XY^ws_BM>28c^|>Uh_|803YL(l;KKt$C^&*b4<_RzxN9t z_@|Wn!T;JG>a7?4Fg@KKPkk_%->}i)p*)o)c4Ck+ zYuEP1#Ojb?BpWq^1Z}fB-f_4s-M?PmcRTQdPG$VQvv~AAem&a3w@2%>AMWMA1rHcH z`9=WpHFdfj0Z7#cpZD2L|C05=@D3mP3_i(^K3Q4|dVBN5Uz6zreUL5mLHrEMeo{|d zcPP}kJ}B-P{PE9x;IA9z2mb-Dr}Njq6!-^u;(yU)$?%(F+-*IL>vU$BhuzZRfunZR z^ytj~82vzgOL3_1rrNNg*lcloTw^sY;nVpWhWd5>lH1ceKj?nLipp4(CmAdI50j`U zxJ(}zC+UW&2EnKNPY>IYmG33f(($p&tS<49)$+f-Xde?Doxv0LM@i$3=0{Ap!=ou9ufz4JNuna*#=zj*eKKg+); z&iRG3-f?C+m`UVo3t*8T0wf8U-z68p%fpLbraD3~nd zRi)|uES{61&~;97GO%kMM)D%oolp4ok=C>U+F!vidNp z$J$Eo@ly#oZE|&J;Z}XxBu{Vm9&3f;C~YS3FWiCx>ZlT&<){4+9NnYI9 zSNH3$3jDqr=>JvCWo)O!?~5Og_l2%TGC0fpzIa)_@JyQcB=Su&`Fm$F-7)7tz?_i? zdhWU5Az!BPcl~CKU&LFT{LW@c#ZS%etd_SXztd_yjnCc8@%$sg^3IZvrhZbB)7(~4 zGR8A!c&3??Pr6oK^AHmpMZ?wSFY*QAb48)3T4_;2+CdN`&lF3ywMbyX(k@JDFeX(w z4c4lf!BVFpc4c65mDoXwPoF<*@pV_{(i6^-Z$Zr^nNe(elwE&liuHk z7bstY3$SATQuW({jjnz}k_qzJA>0K46j#H3?DX^patU|_`;p=7%C_v#v;Vs2)@Mh5 ziPPV$$JcNpUQh(lEadAA!9pZ#n~NN5stBnC--eWmIOAA~uAU7q(wj*aAc|Li9~n>Q zwq$ph)93_b?mmflADEM%Es`orS5Abu<7~Af(cBUk+iVH8V_Uoai}BR=QfuJS+Tis& zvx(A`^=|+z$WrD184RSaiT3VT+!;PvzxTrjxY5POB^n>t&ux477z&dkXQmmH6tE%} zB?DI}R~uqW6a!v~wE!i5N{W9Lhq|+G@H}>M{DPb|U2hlNTyq zy^8RoG!r)QA5;som+)Vn{Srdv1gA`+e81y zR`!(s-0>9hfK_-ns&~m^p?2xl6RX0}mvC}z1}rBA4C3ctm%)u9B|y7=Wji_Ewb=e( zB(|`w4qzETZ4n-L?%Ixg*ar`NcnBLGAVZ6Acx?TwBpK@6(K;lW*)biRNyXooZ~XA5 z(%KnDgg)t^{B(uCFOKR=rF2(*7HrV)R%-b%pep&fUDFHlBkKq$Cc^i!qDOg?j-9U- z9XLUWkowJ$j&mp-5CtV2Ac>X^xKCO-%9M0GiU7DH69ws<&jpMiMjhF{l1i_S2Ui!7sY@hPztN)UsZ~C+-n!HYGx&B<9G0a+>Pp+&i3J2%iZ% zy?4(G{5!(o4t7Q8Dqzu1gk6Bshr3gQV%&4Dmjz9!{uHFa@uNB#APtwLDg0D@wctxX zc}VhqdZ@3|GC%DC9N*-3a`pU8Q9efA;)j7)$wY}%W zmGcgpDmnK4QTZa(-lwcj!)fZ>v-fW!gzeDuctTR<(3GJPP16If_p$RO)OKCjd0C&9 zDeKcf?|~=|tG}~L_EdT=U#IEqcb;-Q|G6jivft?&m1Mz%f!`R4=ICXGHH5!}UJ$G> zT_M~B?FqYLRU;lzP_lM9^q<@d!6}(a+mA}SxIQ*p;1&Tne7pD&| zVGUaa0)&m6Uq!eO^eE!MiC&%kr05Ek;>hYs%uE|XgUgsz1Qfw#F5(94-nwc^B}ii* zfJ}7t3%`ds@&BG1xJP&hcXr2nhR>eI!>uL^aw%mhM}XN-{cDkZ z4+hL&-~gBYa4|f>MGLpR)KFhol2Ma|eHoHItht_57I9pIe*w^>KmO&~fBaD$OBLku z`Xf`m$rl2lo;(O+{{cKvGhj!M_^nz~xbAo-`75jWd=DYc@Z2M**&)zAsRT-;&vIMi zr-V$5U3D5{}5okfaBH^I#Vp-Al$kNQ{+mVklDGbs0$5Usb0$#jRi;(m2O{1?l7RkshlhYF%P=yeIyN z5xTe$vV*-eOvOj;r!M`({5Tx^g~kWI-ez9{h}rI7QN``s+BKLY-Q9z*{@;gme>pgf zbXP6+C*3C_NV;hI!p&L4Wi?RyQ8w;sFNiLTByu7z;fO_p$_gzQx%Su}G*Au(f8`dl z6vA4O?=380&|;Hts-4;yNxwX75au1$r{e3qkJI##mUz(uAX31d4Y)wc01lI??K{o> zTLp}HM2>+MKiR?XBfzkI9@GORQ&gL-s+mF)-)Z*OBjrqm%5r)GV8W3jL(Ofq7sk#- z)fsw&8`*E*M0Pe{R6RcZqkI~)^YN+rYIoKErr&$p>(lH#3`o=LzUI~-Xzn!odv3Hs zhz&-rcDXEZiswET_kh*&mx`~}|7v{I@%)b|EGfKQhqINEee;fhcZqWA*aGkQEC1~OyYG8+Cbey@UyM4GIED2C zg+=yq5qMeM$dSk)(y%#x{XAGoH=RU%qk}z(cJl1@BDu@MRzp!XISE zD*2!1u&`JEp$SX9s1;~*MQGb%y2AKOzCip_YIDvGV*{Pz;)Z~#6XPkfg#+2k?QIPP zSviD9dZJ;hc3>PUFxvg3nxyYUqKfQ)5<`&}>I`#q*oJc+hR6IWqsQ91KjOJR4)-KS zDu1;6NApLB=Ax2CcvB@efE!ol`n2v|-BTl5kwLicfve3JlUfc=^+x&210JW&URC>L)R@1A( zB@^gX&CNq70Qv{J8wpmSMDV=wRzQ+MoD_N+BuC3K{CSN0 z&0$SyuU}x^0aA{Y6476!Pr8I44gsl`$~IUniv$2hlFtCSF9&&WBqPp66bCPf+*QV( zu0~mqd(pTXLa}Q=0|`~|hQqZe>Q(}cGSOV^AA}UQ;jnwiRz29i7Nce6?#IrT%;b)m z{q^(NfCM@`6vL+?5n!MyR$UDeS2!eo+&*)Nka%+$FK$cN%$a%)VO3zAdPyV$dwj-S zY3+E|u*84x(w;9>K)4^q)1bD*ZEnd#f7}B@&R;6Ow0@xZCC|QQhD&HPE2CRY1`J1p zPwvCcn=(10jg|0mR;YBv_`{k1OZh#Rr`Sx|O45$+7fK>4$p1oKyS<|VH>2ZCdIR>} zfQ_vQ@2Mh24sP-4BkaFs>%+~ze;+_||Fs$Xc8S{Fi(RzW-Gx5H^Cz6cQ8g6Pz25@h zc>bmO8J2g$XUb^*73desYc-c)det7!FL5T(ELIsi9K`z_WYi*eghHjO$AdF){3Igo zzx8ymz}rE!weB=~WC$95(hG#G-R_SKdm+J@9T-ULCwUK6^Lx_7?t`AeTz_n*-^eBZ zx4gKAT%HD~XIe)AvzJBE zcszoAd!{l>kPbEiwyOgSEqaqCZs^!RxD^;J+SCgq%9slt}t zLCxvHwB#)i4-97SC&g&AAiFqr7zPbz4v+Vx;vFXeEK`WBiD#ju|}b?om^jPpQ~HYp`59+XEK-&Vzn zSuB2NXvr{v7uNu92DOEeL=Y}rio;fcYpZFC)IBm7j{RP1*)b|ARsem=^E!&crE9Io zt1PCKZp!wQ+uBfF{S&IXSu7X791-i}cJUms$w>lSd89p1 zzHJfl)UpQZjq?7zVlMlY|B~Yvvcdjh|DZ&XdvNef@u1hZ$Kn`9@c1*>223GSF=6_G z2(H*|Tk)|d>0uciuOhBE5>4CZ9<3xe@gvo0cH$LW>|yF=Y}zkj zr9i$T&0MwPzyL&VvuAZkBqj(mGV$Cf2eBAyUcsA5n^Cx}=7QupYNQYS*a!K(ir>S3 z!DqG72e-Kz=|jLiR`mfZdX-Pr;q3z`^!KI6a_|`|*XE^-l}~uif2{n^VIEzP*c*@$ zFXk^5KgDnP)5mK16F#xu|ALAwi5e1t62hTCn>`x47ekQ+F+j^GqX9lWrTh>gxgT_G zz&@U36@qGfi5#$V5xnn=$n!MP64#?s=AJTQI)`g&|H7+v|H=p!1kIuUT9kI^kNYxv z7B){Nc+k~_xE2c4%jy}!ID3gh7ci0vKMltF_xEt=QlganBiI2f6sH@T9DX`rDCq*X z^&(VFV}%)%_8Z~GdBMWbrodLNy*tv|#Mr4k&lX^*@XUNe!xLaX;by>znyp5Z&{pa69ph7eV;AL*G35ud zessX$hihnxfP85<6n$4Lb{tzS(+h?Xnn*r~zv%D*7+CQ^3Esci&*g(6#RvCeZ!teU z*jvU_v}(70N^GZq@d4in4_w2xfkUyU3w(;s#5?SxN2h z2erjU=7MB}U_4BI!Tv>&fB!e6tgCYPWt&^%ruUZ&VRi!3ilZ!R1|vaxH5#2}uZI@` z;$u@c&3K=7ykj`-I**7};(nUFD5Z2_4^NQ@%ov+Wli!xtG(QB{$vmN#qj2}bR{+2p z<4@(Mu=yT5oE(9lVCZcJK5-Cj;;JcSk3(5|71Tp&C41>gatRae5wH7LDUsBYAK^zu zm%CAd_%1SZDR)tOgpl6p;LcLi3wKQ)dnB|ddhMo_I`R&uWuzJo)|P@P%d~Q`k9toD zp0GC9Q}cXHIa>o^shfBEj%5Iq;)^lFwIO(({ju)55Wv0+N$E)t{M&HAV}|~_c!>Kh z$YkEn^W5Kv`&4?(TuFLkf8eJEtG$Bz;r?N{&#KLAw~MhoGWQ9-1Ftge<8rW1@QxU& z+K1!6#l0rtZIcDYZn=)#y!Rf5vqt!0^ik(!f%gv;sCtd58`HzTn-xiLGj5e%pC zW-i1>K$$AFqbnwezyn2zk05%6t3NlTiN;RKw?m2eluxD4f>%f%U`{9zjDEcei#y#)gn);%XF)`u~1I5E(f31 zzStfM1)_CU4`H3S z$K*r%(CBN?w^n^gxYYKuUBfpfR+fXWYQxdhx?jh7zmqvWFgL;<1A$vF1!xqH55Apal!x|8U4)=*CrH-*LIAKlHWqFVr({Z3Ta9~@d3l=WF1+EnrMZRWu~1QH0G6q22n|q^ zPB7#KPeFZ)7>LL;o{dP|3 zdC=3-+wz2J(ldW9LVY_}H*+H@-1VwGleHowJ!4M>R#|Z@f4aU8;(nUG&$|>ls{muM z!@Ac(^J&bnP<8kB)Sc(4yI*SEukYCn=zG@|vtDMTW!ksxE?+3K-I<65+%K~13%m2h zj#l$j+8NzWjy<3|U+rYwyrUBTzSmX*yM5et1NNu=x&dilt9cJkyFvSj?tGQ&wo_o= z)SWMOvYH=bKnMLRk5yKNR(+&nGrz~t88O!lss_)Fp`BYR@{$L!T9nR@0Sp}YAt?aD1LY@!8M5M;kfp*|K3L`$bFs~jm2 z23=jj%+pZCa9K~EkAqh}D!7!Itq8&r%&==Lx8wfsvs`A!YWx2V(5lD6N!4gtF-oYX zP~U;6^`8y(al3RE>ZbiQ)WM&HYfMD{e5j`=^C?W$HLh0_XsCC^Dc|4~4jMgn_)9e~ z>B27KANP3AQeFu$8R7F#oER7O%Y7X*K1GvG5Lj zyGrYu@svAG2|2?6jP_&@nV#0SG2X>E1)uSYcz#wSX`F(JQ^qN>!iIyC!5^wYN+<*h zV!XxgVf%;_?|2uhr9ty52f%6vK#W~DNGV$@gOoCyo<~fAgNNdln8X-h7B0?^Wgdqt z4C{L0O`wk%kG}O!&v+EXXv4Ss!|e;|4uI+L=8}bAogNP|PsOy}6u&{{!9J8j_c|YB zzWanryh;Z*z>+2&u#_~&JQ@epF|trZWS0=x7$uls1wK=Q%wdy~h=+<(i09_22JO0k zcVmz#jD?2 zzn`B>-=*@Y(094M_0Sh?W{>GR8q;*X^i?}UBui$O^xgb;&**#JE#0B-B{%hezBAt6 zK7FmG2Z1J%w`&^D#8ggL%MKJ@8$NsNg;JeDO<-E$=RS*N19cBpjA_+xdj zEP5(lG9FkEOW=@jMARqdmdEy157E&DU>cGWLq?L)Fpd329xXpZy$_nHoYOh71P@*5 z6fydJ6fAemZ}3zcRpGP(6HWsk2JM46 zG0zDzINp#;7{mmscEN>BpY@Osco-HxEqnSoil3Yn&0esOKU5K!hi z9{Yxma;tNX88td3DTubY)#d-rbw4Mi3Q#-dFK_OG|3w*&g>ky1K8gQPahiTp;L|?M zct`Pn6;)<6RpwYmGSDwKh-Ni)pmp*;I;1194f00xunEl2Ox^u9tDCEMe<*mL>JD)l za0aIoM&KSsaGI;JTLxwfeYx$!pTKSLM|#F>>zca5ZQozl18zHHO?S9$BXHj>ZaefXDqLkr zA<<+DFdUhf2LP9W*@l+Gn-;f`DN~`?MEtA8u!i#`hS@fU;NsUo$(DW_f@*C*!SR=C zW@}g=EQa0Nqh|%8OHpgZsYw2r6jJ#bLD zVmbw{Lz@QmN+zguKG8 z8~=7sHcEeC4oX1ZcJ1FH=+R^UHij8HU;kE?tR&eh@d!H~zwGm%%kday=-~kjawp@L z8*b`?bkclATx!N0%!n)=4Ghd_GO`6s-f3_`%HQ z_iokv&_+`G&act_l1(sa+M9(soq`{MU)22F&PzA7-!y;0T_QcKPOjyORBv z>4gna%8Y(}r{H`2)#VB}ZJH}&paiQV3ow#KwU5Cz9iwdeSLY|n}u!Y|y60`R;uSDwwEB00#FLo@UT_4Jc+^!OmZtku8d z+23*vI-+~mb)k)6%vm?4JbEYOp1Ocq}}@?uWx$_(UZl2Ed5TI(;B8dTL z1Aliyql zRj|yh(mrSs)dhw+u)w%^y`?59tU zBpA&Y9*U0!6d(d#0d77Jq&Y9MI=({X3iQ3GRSMLnKt;fAVVQ`#w7%m5?2W>u!}`y~ z55|WZH9uWOAn30M6F}3DpR9SrAq#3;W}3s!T6)MeBvx`ZW|Oo@nd>SUkEFwO9%@9Lg#=YHjQM2qR=Evf3oH3 zEGl<_2t>4+c9QCtF{_vNqrS1MtImWAsDlPTt!~bo$mNo^9c^qb@*>ze_*}=^gKWB* z|9R4tzN)1Vsctft7KmfcE%*(ndy}y_ps7lK$tvUhR}1F=lL7mprDUcQr^`bNS26?) zfgE?@NNUU4AXuVhJxMAvnK)XcHI5z0KmzUOREc}_5}mmyhZnM+1WYW z;EB8*5u9fi^L>!%C*_-Em-a)Df(ir7&EK+-=u3dI5mdPlm(vB zL<_74MQtFquIXY{8zWp5B1v>Zz+IA|vkCi=fa$EsgB>tSms!mhciJ>^g_NA&Ly?n> z>^1v$D1Cq(d?9#6FariphJb7jo1r223kt>dW$T}i+=j)efq(=W|E9(A!*&Fh(}#Y7 zi$R`}+S>)19!l-F<9~w0MqWXa)me!!Y%I2G5pFzOE=bV*Ei8^<$`eI|jp{o>o>Eoc z^>~W~^Uz$|QGRL<5bYCL&9Zi<8*IdVf)pDKX(SuX73GW}4%lcbkpHnD{{j&4G_cW0 zP`oZ1Ig0lg780kZw7qsLmZqZkNl+D686_)Rw-I_;m?vV23-i1LuQHW=Yc3SLcg{Ey zjuNJ6S_Xf{%QP6+$YMvPSmh#IJX63|R8KsML>c>$3=#wr1^3#2mRoyLaDw2^XrfYSXdRb*&a(65HO!e|qbs4HI$EwSb>T;O66v+jE;V;Qv&e!(x zC~Wy6_HrpoaK-vcxt@$%hK*ShgV+FYEnd*WWdWr2Ee>s4p%&zy9t_2<#vWEHtjL3u z?RfvMnYj-}0O}!k9k3$T22fU&g9eAWsG;uX$QR3`BbTYqKETms*1WwMHY25RC|(KA z;$Ad{_4G()#AL$dhgphzoOx+!ht-_VFG*q24#pb{00R!iQGqo(MNDWCKQeY5ez+Vz zw5lm!`0I1f4Q5fyXRmN=lj}m{6!5Kh4aj$x#kZLVRqFZr0Vb*O#`9p_cAad@n~GnG zg(J6$amyoM1$O?`-%7Mf8gjM*5ZfkxrH+Tf2?Bh^TB-U@i5E{+PLr`i;wh?RN~qPK zJ!c`eNYK52_aN|Md?hv;UUY-NZ=2yA`=PpKieL=mxL#Hhy#%^nz?{i9k@2TNll06@ z-^{ZM7SiM*RfB_lvJ8~z8eHfuw7kZ~qg%KGveooFA0jW7g`&rpbn8FME4C)XQvpmn zDoYkZb>ibzo%KTJ2p}n9Nvfz9ihJ6W;jfTIHphozr$8B;0Fqw;KM13#gMb-A6&(QX zX_YC6OQTn0X{OFJOl@av;n@#ZD)Su2D;!gqF$@P$(cX!pabcXhjC-BLP65*|v>GR) z<}d~!Bz$!^%Fzg?bD}2*7u1EKD2Grt79L^0bhs>67YI$o5sF=b2RgzJ|BGE<(!Apc z15MfyuA~hO*b$UT6-48TypA2!AFyxxQ97XKQGNs0B(=P~uN1NOlnWsD>H{^tD8_y= z9h{#8QIR)+q_TtQQpzABVKwz4k3@3}5kEr>3Q$NLrA&8d_4DiyUqxlGVKq@>W599S zKh%KZU_Ia{0!_vgUVLfv@+{nqLUN2Al-KMusdxCN2Dr{){W6d> zymQY2g-yIy1J&ceHzP6Q$ARj8;2SQPD&bH?xCRh{%LpL|V6Xd%GO7pCFhAT_GqdA) zL&;k~w*T8fla1#u3fVfCYM}qz{>0t!;+sG>Xk4wuBawQ^ETn&Rh5yBR4cpPIwm*V6TZ>xw$9r4d zLPzM33lYk$6Uk;^45$w{#o6%psQpS&f-E1;?+BRX__tlp{$lvoG1F*%9!F!BelL18 zGqDvaRaOJjVl@+Sj0%AJh=6$h!jdx73dF7XGb^I)lu(sI+#x7&;pkMv0cTWAhJ}bY z7!`#$j%B0$jH*pS+#Knm58|%mB721hg}7XFPX&m6GU5^;2XR~TUBo@v+aRv;I)B7v zUlM!hdFFz znKf_khRqFDV;a)KhiRl=bYCY(|LpSrHPSaeor3hccKF#yuQ}O4dbGcb^kY#oIX7s3 zbge(qW8WkpeJS%fX8^&N06Y)}h!{g&Bfhg^$Vc)KVp%{*tZ)taPSQ2Hc+nq}D_4Y) zP{>RFt`zctV#whSY4FVVMBv}!!R)vD50pcCLhOg zR7?<;GSLS1eo_-nCp|oG@T-qhiiP2^Q=z$3a<;0}nU2Jg@yL5rrt$t*0tJJFdeK>E z8GFe;Kod=ehRwUw%F=~dgekH)3$ZdZB?#kF8K2tt8^!}`dBrnTH=n8NI<+4@{U)#Z- zt;A-}O_8UQvwyZc6%KXesdO(_p4MdAM%~K1W z;3S^FOODE8D&&3d#3~Hc&8t7*9w>fh%TR^lId`*3`i)O=KtD-pvtL%1@pAEu*LD1V zs`jrSX4v!8nzt_*>I_6n;Qk^@kLNN}sXYMrJTV8qpeVOSEKS@fzk=(yg(rT!aWC3C zj7_*X?Sz|52Xq0Pln%$ zWKl1@x@fV;L8X#|!(dJwKJ>x@DDVwGh%g;~ApvG}^-s9niSCfNhK~35YuH3(;#~2y zFAl|W55zWd+d>LIW8xY=V<`u9WaZQl%@4AN6Lm>!NRSHQ#^ZHFLsZZ#%CPLla0a$l zD+d^>tq9_c5bWX&Ap}jWdFN-q7>(ai?|FICLMaxzE*L6ZVl~Qcnz3sFp#e+6(U-X% z5?%n8LAGNVWOgWXLkRnC!_bwLV-rrG584(xWtydw;n*1%OTzSrqh~qh7H)mr>}Da^qbe^8|UW9)hnFdd=Zb=9@A9 zM(_G4DszK2YTAH36WciO6+qByk|QsSZO3?Xsqv}r21|dkNwf6(cWRc#geG;Xiu%_V z201>?1FQwR+Iz`#hEQBni2V%MgM6E^|A{5Xn38--T}H`;d%?jO19zs;KjzZEQxbpc zN8-1;PvVE=`)dN_(M{z87KJfR8L&hK_{mf*$6g;KbU2DdDH0~R283R0HCD;@aDpT< z5ao?SXo-zolUGjHaq4ea5Hr==5D(|14dZ2d;$3;XcnuQjlo~0;3yz6kIamf_1h(fL ztMIZ(X7|}-_s4zMmaWrws2aeQSR*<)TK}^;F}!9H((w4bNRP*WZaIvsy^S?Q5$sy#aJMlRp>`-i<0_d&B#wJyp%XI6orapjO)RV8Z2@P1^-X-k4T-Yn2^nkGe9q_R(wx*uJnh>{+EG|>y zUP{d{o;jw1jhyX(ajOi)>Pqk-)Z-XxTugD2IU!IgvmhL8<8z3TTNTRONXk`&1}qgb z!VS@WyxK&CIqgLC$MVpgoa)3~f!${$L&B^RYPd>IbV?9o6s1=p!6F2xz>NXxu`pQ0 z699hvQ3ilT&2eTFl~(XDK^RXoE&qiHDqpAaA-2s`Jm}|LdwKBaN5O+BQ=c!u7Pmo; zIzF+Ne=6GfMRj>zU7l8#IqLE^xfmxX)8iw(2)9SL(ETq-9;fK}iMyJ$Jj&1>gXN&` z#SfX>R&u6nG)8x3!fujF)mm7@pC`S*((U#k(mcf|1Fz|ZGqHclsKS$-n3UCY5N%S_ z8JP6tqp_aVuJzpdH>J1089J`{PA?e_Ju^$G#*<|@gu%><1zMjOfuoA6qVj@C#I<`%A%s|wRliWrqCkG8Sl`SO#VZK5pcu)Y>2PO=Q& z$B2`fwDFaw`Dd$178xBmvsd0p7HLU|mKj{B`XFG7m6PfYgU}ty7^cfP&OUWEWvoRf znzcH~Yi$Ic!e(YE%vFzq&_5~S*e%5cr;9cw7XW8#S%)IIZU8iZuF$b72yUMJ?89Wa z7GYjWc%||c7zk|IOp3>u;ZqD(OKB*VSUNaUdAA}_Y5NKxZhfAk>RH|rZTwrj9{ zHV2~`U>cU5p@0Qaj9{W)UOi>p=@pnMzT2+-kBl>O4n!Lni4D-T2&2vBMZfw#-e)AX zdbH_-yw6IE;wY2ZjU)wS*zG)yr$(!52{$?{;^OdHduRZ%4UxJt0%Es%Pa}3oGl7P+ zHS*h}B6>L(VzH$R``2eOhX*<&mAnY>FoCC43%!|g)zv3$e17)>#H9WOBv8WZCr&j- zJ1nwRV9_k1dX^?iW2Iu?KC!!twvGkB+1tb>X8lHE!roxGg7=w;{XDM{+)g2$zj2** zW50|NQV!rVPzn%u$0Kp7n^y_NiUR0e~dEU2Bhn3q~Q%xKYkA zh*dy(%N*0vzzWd2vAjw^uL?GrsENS4IA_lJU#584giBF7e-g| z9%YaHu3C48(R9Jcncb z#L{r-nu&+w&WZ#8M0vb_V+^NPwW|6{*I1Fy^4RGy%^51E7*P*?SdVceH2c*52HBD6 zg@e(S#0Hk*g`p_@Sin=l-+%@wvuz>Pd&1VH}?0)RUuvr1kr!uMdS za*piP7vvO$vK2;DzY9)w{so!0hhj}JqGZRa%aQ7GlU&M6H(Sj^P*QmCAl#6AL?1V8 zgd?J4Kp1m3yj6_p!6A46T(Tbfx`nlmKwLd(xwx7ym1H9FV$h9p4E{91cA7g$#aV!(v@5! zUa=ks1lc2uZQ8aiNxaP1{Kr^CYxU*8U>j1z&}g{yU8{L_DXm-AXk-jH@-1Z}-hWdP zEBd2x^v*6Cd&F{!c&tr|6YY3e-DkN&G0)Q}8Wq1OG%;0^=ph;n`a&LbCGLe&WiNP3 zA!;k*%QQ-FTk%=M2I8KPZ#aC67b8PZMbT+OB5Uw69M5@qcuZ}|IJjfnMN)dcU+I}? zrLE>#7G(W(@&z*x4-LnLmq_*Jt9O`m#=Bu9!_j1%`GvAciNM!VMa56D9jMBB$)-#u zf6O#L(voQb;&8OW2#|pA2AwcTg4C95nN0F%uZ?4G*YIKc-uqPX4v7yYse(J?JBFIT z-Zt?Jc3vy^M)qYJhw*i?Q)5D~i#du@Rb5{R({Vt^bP685b*TCQ)=tB8*$Jw;HBzk$ zTXhm_626P~?~u>*0AF(Tmh-dtl?7(lxtGYs#{Py-=(OI)b|U5p<^ayS_B47Kf6 zDP7~!O^kJ`y&Y}YQ^ND5r`*sc<-23= z8vm#UoA81$ikALO*Y?eP-l~Q~=$CLel$2sN<@r!gHR$HZ?FpVYY4^oqWm+~^F^Vx< zB6w+PbF|WpR`U@^#G%jc=fxu!<>I!@ie#yz9V{JCdS(iI0Q*lE6FE~MYXxkC+1>9T zq3ueuc8C&$)(Y5n%KVV)_A~6o@zGMXIT}sTdg;l_%sg+rffbbgU^R~8O%kkHXAamz z2WG%V4tmU%w3v%srnjV3^u$1(cu*vf*sDP-=*hXu-R$%AxerAlju}PoVI3<#!Oth| z>Io>Xpw4vz%1`l8v>!ayHS(Pa96fRe>AFC@HCZTXfl(U>n*<2Ka?!;S`W9oEUh#60#_@8z;EO}n0a()Qi3u;LNJ!e}eQKBvr=g(C~G zJjZ-(m`nS&aH7O}r7fftpnhh*B?>n0cJ^6^8fnawYYV|dioGg4%PAa{!n#^$Y~g8q zEO6q>Ia1OwGy~Z&pjv3DkkX}NYLC?Qm+`}{EyD9TE&{tzwHp`P9mfv-WF4S7$nn9A zxBb#O;2}?VYcch~saUCv442-CiEfN6F$DMIpLcZN>$?dGjzHo9I(>V}H+I`AVm_Xc zi&6FqvB=qeNM0olry2T8mHJ4Pf@VJsnw>s-CGc-T9O38(9J`eWNoL|y3v$j(73z?v z3o}@UCVG9TRKLVEc+jbifzt#8^|xzTZRw|Ke3+v8!_iIQ=vU#W9gcQ{2W*h|Ck177 zmP_aE3JRJ*{F8_J{CubU&Rf+u&?f9)@ha(yo`Qs~AWUH>L5e~c=76G*8na{ArvmR2 z_mZrII7u989%8cw@1U(t@TT>jm^}Sev z3r#7MSP`9+SyC2ZG4@{CFsgcv`~p>NPmhx>GF$*V5WC#P{Z2u1iz7#*y-~1~3z z&hqtQ%#l7mKFOGa8)z7eJx7YA&o1-Xu1Oy&-P0z$P9C&Lr?5!)Mw#?muzgP`CaXVm z8m22GL%b&aB{93s9Pwj(G$wt%AljJpw_-|28cN@1~$p07jGS?C<@1AzV4;)Nt^D!M68yYE{jD%TN!p_u#cu%fg_53lo-X6sql9>nk*{c3YY}#!` zcFU;tC*mY=vF42)Ykrcl=7V0>*1YIyk`AJhxQN!gT)wfteo?G>hg?jh)wJeCrqY1N zd04LI#@>5PSNi%@rc%zD*$=4N?v)EBPAX+RXBa6#VUx-fU6VK$DS-BMs^~a%c~&mq z2laPxC^_G={vyfugZ2o@tk15sH#&1i*gy_rk&rug1n+qQW+pS${7}uWNX$IeD^xW% zMZDp}RSDO+>ck*uK4cSNZlVA;gL%WHYpNIYMM~Q3g)b0c9ryEd=g);V?(PS?i1d5T6+J|-1N{=FmYuWMm1pi&0PDI}AnoS6dFd#oR} zI3o-5@qx}#+2}rqoaysrII~iNIc^;AqPO#3C>ZrlE=s>;Crlz$){j?C!1|D`I1dYNg8ZQRIYW7z)124fv?As$!M)eIl z&^iL#u^KDa9=1m>QjS{%I4~4MYgp^`H=q~modHuFCPjG=0paEg27obDyDGHpB>^l) zayU3&2+x5;fm>85^B!<3_*}YWA`)HT{~}2&9EEX%J2pcKiW8-BmH}tbJ^|jH;ZXqv zO~e3I>C5AGhbxD+`41pQEAkQzR6ZF3y8Q!|2}1|v9EfT&68rO)JJqY~#AGU*De|Nz zZJS?U>#@4Q+{J-wff~8j43vak;Z5Od)e|FSIBo`}=!ejNucWs~zulnDn!!+DjZBk< z5vm6tOko|-Hc7b*mo8$TSCWSd82oRLA9K-nNxpSDuD!eRCU3`?q#mmn%x?c$_6&%Q zEkd`!sCcO|CNpZY$(kwbXMcr-%9x`0OfG0r{#^Z_^4D80NY-arwS62d)vh(%5Th1u zJStTsP{U!KS!uYWZ`s?tcDui{t{w=0+dlM@*^lX90>Sl;(@?^iH&?L^xL!B|dTN%u z=TyDbe7-0TC6m@v<~Nl!aP2@d%A|q^J{?OHP-Qe$wKaJU`F;R-7{bKe=6|FHaN^67 zA#Vg~VxtnM3P+%s#Mfhz4SDWf{8PHR)buT|O% zoYW0L_)uNmk&96ezlC~WJo-l}hO6Z#vQy2uWZ4n|Z#BJ396D)lvgMEAkMlKj&~c7I z5tNIg4y6k@C4@&vImOTz2JD9w6sM@AaWyzF14d4Cb-DKMlWf+en}~pVrr65xw`MXx(G3?!| zWK?F4;{9*IxO-?6o`|VfM_HZfj?t_u2PYS4NTqeHmZWJ#FEnkBn#i6bZjkr`B~Q!g zB8uP+?u$eR#1S#UCvgFso<9$N!phqLRvUiEv0S~#dp61g

  • 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%0DrxcaJcp_ri)R4Y^n!!QO&%b>?`^5Q%mFeD$FKm% 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